vue-gantt-3
Version:
A gantt component for Vue 3
1 lines • 10.3 kB
Source Map (JSON)
{"version":3,"file":"TableView.vue.mjs","sources":["../../../../src/components/tableView/TableView.vue"],"sourcesContent":["<template>\n <div ref=\"tableViewRef\" class=\"vg-table-view\">\n <div v-show=\"showSecondLevel && showFirstLevel\" class=\"first-level-header\" :style=\"{height: headerHeight + 1 + 'px'}\"></div>\n <ag-grid-vue\n class=\"ag-theme-alpine ag-theme-mgantttheme\"\n :gridOptions=\"gridOptions\"\n :getRowId=\"getTableRowId\"\n :columnDefs=\"columnDefs\"\n :rowData=\"rowData\"\n :defaultColDef=\"defaultCol\"\n :rowHeight=\"rowHeight\"\n :headerHeight=\"headerHeight\"\n :rowBuffer=\"rowBuffer\"\n :suppressNoRowsOverlay=\"true\"\n :rowSelection=\"rowSelection\"\n :alwaysShowHorizontalScroll=\"true\"\n :suppressRowHoverHighlight=\"true\"\n :suppressCellFocus=\"true\"\n :suppressRowClickSelection=\"true\"\n :processRowPostCreate=\"processRowPostCreate\"\n :domLayout=\"domLayout\"\n @grid-ready=\"onGridReady\"\n @viewport-changed=\"onViewPortChanged\"\n @cell-double-clicked=\"onCellDoubleClicked\"\n @selection-changed=\"onSelectionChanged\"\n @cell-context-menu=\"onCellContextMenu\"\n >\n </ag-grid-vue>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { AgGridVue } from \"ag-grid-vue3\";\nimport type { GridApi, IRowNode, GridReadyEvent, ViewportChangedEvent, CellDoubleClickedEvent,\n SelectionChangedEvent, CellContextMenuEvent, ProcessRowParams } from \"ag-grid-community\";\nimport \"ag-grid-community/styles/ag-grid.css\";\nimport \"ag-grid-community/styles/ag-theme-alpine.css\";\nimport { ref, inject, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport type { RowData, ColDef, DefaultColDef, GanttRowNode } from '@/types';\nimport { useTableColumns } from './useTableColumn';\nimport { useTableRow } from './useTableRow';\nimport { useTableScroll } from './useTableScroll';\n\nexport interface Props {\n getRowId: (rowData: RowData) => string,\n columns: ColDef[],\n rows: RowData[],\n rowNodeMap: Map<string, GanttRowNode>,\n defaultCol?: DefaultColDef,\n rowHeight: number,\n headerHeight: number,\n rowBuffer: number,\n rowSelection: 'single' | 'multiple' | 'none',\n getEmptyRows?: (count: number) => RowData[],\n\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<{\n (e: 'viewPortChanged', data: RowData[]): void,\n (e: 'cellDoubleClicked', rowData: RowData | undefined, columnData?: ColDef): void,\n (e: 'selectionChanged', data: SelectionChangedEvent<RowData>): void,\n (e: 'cellContextMenu', data: CellContextMenuEvent<RowData>): void,\n (e: 'triggerGanttViewScroll', options: ScrollToOptions): void,\n}>();\n\nconst tableViewRef = ref<HTMLDivElement>();\nconst tableRef = ref<GridApi<RowData>>();\nconst tableBodyView = ref<HTMLDivElement | null>(null);\nconst tableBodyVerticalScrollViewport = ref<HTMLDivElement | null>(null);\nconst selectedRowIds = inject('selectedRowIds') as Ref<Set<string>>;\nconst showSecondLevel = inject('showSecondLevel') as Ref<boolean>;\nconst showFirstLevel = inject('showFirstLevel') as Ref<boolean>;\nconst domLayout = ref('normal');\n\nconst gridOptions = {\n rowClass: 'vg-row',\n doesExternalFilterPass,\n isExternalFilterPresent,\n};\n\nconst onGridReady = (params: GridReadyEvent<RowData>) => {\n tableRef.value = params.api;\n tableBodyView.value = tableViewRef.value!.querySelector('.ag-body-viewport');\n tableBodyView.value?.addEventListener('wheel', bodyWheel, { passive: false });\n tableBodyVerticalScrollViewport.value = tableViewRef.value!.querySelector('.ag-body-vertical-scroll-viewport');\n tableBodyVerticalScrollViewport.value?.addEventListener('scroll', verticalScrollViewportScroll);\n};\n\nconst emitTriggerGanttViewScroll = (options: ScrollToOptions) => {\n emit('triggerGanttViewScroll', options);\n};\n\nwatch(selectedRowIds, () => {\n setTableRowSelected();\n}, { deep: true });\n\nconst setTableRowSelected = () => {\n tableRef.value?.deselectAll();\n const rowNodes: IRowNode<RowData>[] = [];\n const rowIds = [...selectedRowIds.value];\n rowIds.forEach(id => {\n const rowNode = tableRef.value?.getRowNode(id);\n rowNode && rowNodes.push(rowNode);\n });\n tableRef.value?.setNodesSelected({ nodes: rowNodes, newValue: true });\n};\n\nconst onViewPortChanged = (data: ViewportChangedEvent<RowData>) => {\n const firstRow = data.firstRow;\n const lastRow = data.lastRow;\n\n emit('viewPortChanged', visibleRowDataList.value.slice(firstRow, lastRow + 1));\n};\n\nconst onCellDoubleClicked = (data: CellDoubleClickedEvent<Omit<RowData, 'children'>>) => {\n emit('cellDoubleClicked', data.data, data.colDef as ColDef);\n};\n\nconst onSelectionChanged = (data: SelectionChangedEvent<RowData>) => {\n emit('selectionChanged', data);\n};\n\nconst onCellContextMenu = (data: CellContextMenuEvent<RowData>) => {\n emit('cellContextMenu', data);\n};\n\nconst processRowPostCreate = (data: ProcessRowParams<RowData>) => {\n if (!data.node.data?.isEmpty) {\n data.eRow.setAttribute('data-row-id', data.node.id as string);\n }\n};\n\nfunction isExternalFilterPresent () {\n return true;\n}\n\nfunction doesExternalFilterPass (node: IRowNode<RowData>) {\n const currentRowNode = getRowNode(node.data);\n return !currentRowNode?.hide;\n}\n\nconst onFilterChanged = () => {\n handleEmptyRowChanged();\n tableRef.value?.onFilterChanged();\n};\n\nconst refreshCells = (rowIds: string[], force = false) => {\n const rowNodes: IRowNode<RowData>[] = [];\n rowIds.forEach(id => {\n const rowNode = tableRef.value?.getRowNode(id);\n rowNode && rowNodes.push(rowNode);\n });\n if (rowNodes.length) {\n tableRef.value?.refreshCells({ rowNodes: rowNodes, force });\n }\n\n};\n\nconst getFirstDisplayedRow = () => {\n return tableRef.value?.getFirstDisplayedRow();\n};\n\nconst getLastDisplayedRow = () => {\n return tableRef.value?.getLastDisplayedRow();\n};\n\nconst {\n rowData,\n getTableRowId,\n getRowNode,\n handleEmptyRowChanged,\n visibleRowDataList\n} = useTableRow({\n props,\n setTableRowSelected,\n rowClass: gridOptions.rowClass,\n tableRef,\n tableBodyView,\n tableBodyVerticalScrollViewport\n});\n\nconst { columnDefs } = useTableColumns({ props, getRowNode });\n\nconst {\n scrollTo,\n bodyWheel,\n verticalScrollViewportScroll\n} = useTableScroll({\n tableBodyView,\n tableBodyVerticalScrollViewport,\n emitTriggerGanttViewScroll\n});\n\ndefineExpose({\n scrollTo,\n refreshCells,\n onFilterChanged,\n handleEmptyRowChanged,\n getFirstDisplayedRow,\n getLastDisplayedRow\n});\n\n</script>\n<style lang=\"scss\">\n.vg-table-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n .first-level-header {\n background: #F3F3F4;\n border-bottom: 1px solid #D0D0D0;\n }\n .ag-theme-mgantttheme {\n flex: 1;\n height: 100%;\n overflow: hidden;\n --ag-borders: none,\n --ag-odd-row-background-color: #fff;\n --ag-border-color: #e9e9e9;\n --ag-row-border-color: #e9e9e9;\n --ag-cell-horizontal-border: 1px solid #e9e9e9;\n --ag-header-column-resize-handle-height: 100%;\n --ag-header-column-resize-handle-width: 1px;\n --ag-header-column-resize-handle-color: #e9e9e9;\n --ag-header-background-color: #fff;\n --ag-cell-horizontal-padding: 9px;\n --ag-selected-row-background-color: #0078d7;\n --ag-odd-row-background-color: #fff;\n .ag-row {\n .ag-cell:last-of-type {\n // --ag-cell-horizontal-border: 1px solid transparent;\n }\n }\n .ag-header {\n --ag-borders-critical: 1px solid;\n }\n .ag-row-last.no-bottom-border-row {\n border-bottom: 0;\n }\n .ag-header-row {\n .ag-header-cell:last-of-type {\n\n }\n }\n }\n}\n</style>"],"names":["_a"],"mappings":"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"}