import { Ref, ref } from 'vue'; import { QTableColumn } from 'quasar'; import columnsHelper from 'src/helpers/columnsHelper'; import type { Table } from '../stores/main/models'; interface Params { selectedTable: Ref; } export function useColumnRowManagement({ selectedTable }: Params) { const showRenameColumnDialog: Ref = ref(false); const renameColumnValue: Ref = ref(''); const renameColumnTarget: Ref = ref(null); function addRow(row: Record, position: 'before' | 'after') { if (!selectedTable.value) return; const rows: Record[] = selectedTable.value.source.rows; const index = rows.indexOf(row); const emptyRow = selectedTable.value.source.columns.reduce( (obj: Record, col: QTableColumn) => ({ ...obj, [col.field as string]: '', }), {} ); const insertAt = position === 'after' ? index + 1 : index; rows.splice(insertAt, 0, emptyRow); } function deleteRow(row: Record) { if (!selectedTable.value) return; const rows: Record[] = selectedTable.value.source.rows; const index = rows.indexOf(row); if (index !== -1) rows.splice(index, 1); } function addColumn(colName: string, position: 'before' | 'after') { if (!selectedTable.value) return; const columns: QTableColumn[] = selectedTable.value.source.columns; const index = columns.findIndex((c: QTableColumn) => c.name === colName); const count = columns.length + 1; const [newCol] = columnsHelper([`Column ${count}`]); let suffix = 1; while (columns.some((c: QTableColumn) => c.name === newCol.name)) { newCol.name = `${newCol.name}_${suffix}`; newCol.field = newCol.name; suffix++; } const insertAt = position === 'after' ? index + 1 : index; columns.splice(insertAt, 0, newCol); selectedTable.value.source.rows.forEach((row: Record) => { row[newCol.field as string] = ''; }); selectedTable.value.settings.columns.visibleColumns.splice( insertAt, 0, newCol.name ); } function deleteColumn(colName: string) { if (!selectedTable.value) return; const columns: QTableColumn[] = selectedTable.value.source.columns; const index = columns.findIndex((c: QTableColumn) => c.name === colName); if (index === -1) return; const [removed] = columns.splice(index, 1); selectedTable.value.source.rows.forEach((row: Record) => { delete row[removed.field as string]; }); const vcList: string[] = selectedTable.value.settings.columns.visibleColumns; const vcIndex = vcList.indexOf(colName); if (vcIndex !== -1) vcList.splice(vcIndex, 1); } function openRenameColumn(col: QTableColumn) { renameColumnTarget.value = col; renameColumnValue.value = col.label; showRenameColumnDialog.value = true; } // Look the column up by name: the index a header cell knows is its *visual* // position (q-table's visible cols, or the group tree's leaf order), which // drifts from the source order as soon as columns are hidden or grouped. function confirmRenameColumn() { if ( !renameColumnTarget.value || !renameColumnValue.value.trim() || !selectedTable.value ) { return; } const target = selectedTable.value.source.columns.find( (c: QTableColumn) => c.name === renameColumnTarget.value?.name ); if (!target) return; target.label = renameColumnValue.value.trim(); showRenameColumnDialog.value = false; } return { showRenameColumnDialog, renameColumnValue, addRow, deleteRow, addColumn, deleteColumn, openRenameColumn, confirmRenameColumn, }; }