ป้ายกำกับ: checkbox

Tabulator: form.rowSelectionTabulator: form.rowSelection

ตัว UI ที่ใช้กันบ่อย ๆ คือ table list ในฟอร์มที่จะมี checkbox ให้ selected เลือกข้อมูลในแถวที่ต้องการ จะแถวเดียว หรือหลายเรคคอร์ด select all, deselect all เขียนกับ Tabulator ได้เหมือนกัน แล้วเอาที่เลือกไว้ไปใช้ต่อ
Tabulator/form.rowSelection.html

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Tabulator: form.rowSelection</title>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/tabulator/6.3.1/css/tabulator.min.css" rel="stylesheet" />
</head>

<body>
 <form id="formA" method="post">
 <label>Date From: <input name="date_from" type="date"></label>
 <label>Date To: <input name="date_to" type="date"></label>
 <div id="tabulator-table"></div>
 <button type="submit">Submit</button>
 </form>
 <button type="button" id="show-local-storage">View Local Storage</button>

 <script src="https://cdnjs.cloudflare.com/ajax/libs/tabulator/6.3.1/js/tabulator.min.js"></script>

 <script src="../assets/javascript.form.helper.js"></script>

 <script src="assets/Tabulator.helper.form.rowSelection.js"></script>

 <script>
 document.addEventListener ('DOMContentLoaded', () => {
 const form = document.querySelector ('#formA') ;

 // Tabulator row selection name
 const tableRowSelectName = 'items';

 // tabulator table instance
 const table = new Tabulator ("#tabulator-table", {
 ajaxURL: "../assets/ISO-4217.json",
 ajaxConfig: "GET",
 selectable: true,
 columns: [
 {
 cellClick: (e, cell) => cell.getRow () .toggleSelect () ,
 formatter: "rowSelection",
 headerClick: (e, column) => {
 const tableInstance = column.getTable () ;
 const allRows = tableInstance.getRows () ;
 const allSelected = allRows.every (row => row.isSelected ()) ;
 if (allSelected) {
 allRows.forEach (row => row.deselect ()) ;
 } else {
 allRows.forEach (row => row.select ()) ;
 }
 },
 headerSort: false,
 hozAlign: "center",
 titleFormatter: "rowSelection",
 width: 80
 },
 { field: "code", title: "Code", width: 80 },
 { field: "currency", title: "Currency" },
 { field: "digits", title: "Digits", width: 80 },
 { field: "numeric", title: "Numeric", width: 80 },
 { field: "locations", title: "Locations" }
 ],
 layout: "fitColumns",
 pagination: true,
 paginationMode: "local",
 paginationSize: 10,
 }) ;

 // tabulator event listeners for saving form data
 table.on ("cellEdited", () => {
 TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) ;
 }) ;

 table.on ("pageLoaded", () => {
 // When the page loads, we get the up-to-date selected data
 TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) ;
 }) ;

 table.on ("rowAdded", () => {
 TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) ;
 }) ;

 table.on ("rowSelectionChanged", () => {
 TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) ;
 }) ;

 // form event for input changes
 form.addEventListener ('input', () => {
 TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) ;
 }) ;

 // form event form submission
 form.addEventListener ('submit', event => {
 event.preventDefault () ;
 TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) ;
 }) ;

 // for debugging
 document.getElementById ('show-local-storage') .addEventListener ('click', () => {
 const savedData = localStorage.getItem ('forms') ;
 if (savedData) {
 alert ('form_data\n' + savedData) ;
 } else {
 alert ('No form_data found in localStorage') ;
 }
 }) ;
 }) ;
 </script>
</body>

</html>

และทำตัว helper ที่ใช้ซ้ำ ๆ ไว้ที่
Tabulator/assets/Tabulator.helper.form.rowSelection.js

// function to cache form data to localStorage
function TabulatorCacheDataToLocalStorage (form, table, tableRowSelectName) {
 const currentLocalStorage = JSON.parse (localStorage.getItem ('forms') || '{}') ;
 const formData = new FormData (form) ;
 const collectedData = formDataCollected (form) ;
 const dynamicKeys = [];

 // Get the definitive list of selected items from Tabulator
 const selectedTabulatorItems = table.getSelectedData () .map (row => row.code) ;

 // Set the Tabulator items directly. Do not merge.
 collectedData[tableRowSelectName] = selectedTabulatorItems;
 if (!dynamicKeys.includes (tableRowSelectName)) {
 dynamicKeys.push (tableRowSelectName) ;
 }

 // Update the dynamic key list
 collectedData['_inputDynamic'] = dynamicKeys;

 // Merge the collected data into localStorage
 for (const [key, value] of Object.entries (collectedData)) {
 // For dynamic arrays, check if the key is 'items'.
 if (Array.isArray (value) && key === tableRowSelectName) {
 currentLocalStorage[key] = value; // Replace the old array with the new one
 } else if (Array.isArray (value)) {
 // Merge other dynamic arrays
 currentLocalStorage[key] = mergeArraysUnique (currentLocalStorage[key], value) ;
 } else {
 currentLocalStorage[key] = value;
 }
 }

 // Clean up dynamic arrays that are no longer in the form
 const previouslyDynamicKeys = currentLocalStorage['_inputDynamic'] || [];
 for (const key of previouslyDynamicKeys) {
 if (!collectedData[key] || (Array.isArray (collectedData[key]) && collectedData[key].length === 0)) {
 delete currentLocalStorage[key];
 }
 }
 currentLocalStorage['_inputDynamic'] = dynamicKeys;

 localStorage.setItem ('forms', JSON.stringify (currentLocalStorage)) ;
 console.log ('Form data cached:', currentLocalStorage) ;
}

สาเหตุที่ data จะต้องถูกเก็บไว้ใน Local storage เพราะเวลาที่เปลี่ยน pagination ตัว input จะหายไป โดน render ทับ