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,
};
}