import { ModelRef, onBeforeMount, ref, watch } from 'vue' import { KettalQTableColumn, KettalVisibleColumn } from '@/types/KTable' export default function usePrepareTableColumns (visibleColumns: ModelRef, props: { rows: any[], columns: KettalQTableColumn[], }) { const localColumns = ref([]) const localVisibleColumns = ref([]) watch(() => visibleColumns.value, () => { prepareVisibleAndOrderColumns() }, { deep: true } ) onBeforeMount(() => { if (!Array.isArray(props.rows)) { console.error('Receiving props.rows as ', props.rows) throw new Error('Rows must be an array.') } prepareVisibleAndOrderColumns() }) function prepareVisibleAndOrderColumns () { // For some reason, sometimes visibleColumns did not update so it threw an error when doing the localColumns mapping if (visibleColumns.value === undefined || visibleColumns.value.length === 0 || !(Array.isArray(visibleColumns.value) && visibleColumns.value.every((value: unknown) => { const obj = value as KettalVisibleColumn return typeof obj.name === 'string' && typeof obj.isVisible === 'boolean' })) ) { // visibleColumns = columns.map((column) => { return { name: column.name, isVisible: true } }) while (visibleColumns.value.length > 0) { visibleColumns.value.pop() } props.columns.map((column) => { return { name: column.name, isVisible: true } }).forEach((column) => { visibleColumns.value.push(column) }) } localVisibleColumns.value = visibleColumns.value.filter((value: unknown) => { const column = value as KettalVisibleColumn return column.isVisible }).map((value: unknown) => { const column = value as KettalQTableColumn return column.name }) const aux = visibleColumns.value.map((value: KettalVisibleColumn) => { const column = props.columns.find((col) => col.name === value.name) as KettalQTableColumn if (column) { return column } else { console.error('Column "' + value.name + '" in Visible Columns not found in Columns') return null } }) localColumns.value = aux.filter((value) => value !== null) as KettalQTableColumn[] } return { localColumns, localVisibleColumns, prepareVisibleAndOrderColumns } }