From eed41dc12484624342e91af4910315318f81ecfb Mon Sep 17 00:00:00 2001 From: Seungwoo321 Date: Thu, 20 Mar 2025 19:30:15 +0900 Subject: [PATCH 01/12] feat: add table renderer and composables --- .../pivottable-ui/VPivottableUi.vue | 3 ++ src/components/pivottable/VPivottable.vue | 41 +++++------------ src/components/pivottable/VPivottableBody.vue | 2 +- .../pivottable/VPivottableHeader.vue | 2 +- .../pivottable/renderer/TableRenderer.vue | 45 +++++++++++++++++++ src/components/pivottable/renderer/index.js | 45 +++++++++++++++++++ src/composables/useAggregators.js | 11 +++++ src/composables/usePivotData.js | 38 ++++++++++++++++ src/composables/useSorting.js | 11 +++++ src/composables/useTableRenderers.js | 19 ++++++++ src/composables/useValueFormatting.js | 11 +++++ vite.config.js | 19 +++++++- 12 files changed, 212 insertions(+), 35 deletions(-) create mode 100644 src/components/pivottable/renderer/TableRenderer.vue create mode 100644 src/components/pivottable/renderer/index.js create mode 100644 src/composables/useAggregators.js create mode 100644 src/composables/usePivotData.js create mode 100644 src/composables/useSorting.js create mode 100644 src/composables/useTableRenderers.js create mode 100644 src/composables/useValueFormatting.js diff --git a/src/components/pivottable-ui/VPivottableUi.vue b/src/components/pivottable-ui/VPivottableUi.vue index 58a2db0..ea153ea 100644 --- a/src/components/pivottable-ui/VPivottableUi.vue +++ b/src/components/pivottable-ui/VPivottableUi.vue @@ -6,6 +6,8 @@ - - - -
+ diff --git a/src/components/pivottable/VPivottableBody.vue b/src/components/pivottable/VPivottableBody.vue index 1563a78..17aade4 100644 --- a/src/components/pivottable/VPivottableBody.vue +++ b/src/components/pivottable/VPivottableBody.vue @@ -18,7 +18,7 @@ + + diff --git a/src/components/pivottable/renderer/index.js b/src/components/pivottable/renderer/index.js new file mode 100644 index 0000000..e489f5b --- /dev/null +++ b/src/components/pivottable/renderer/index.js @@ -0,0 +1,45 @@ +import { defineComponent, h } from 'vue' +import TableRenderer from './TableRenderer.vue' +import { defaultProps } from '@/helper' + +export default { + Table: defineComponent({ + name: 'vue-table', + setup (props) { + return () => h(TableRenderer, { + ...defaultProps, + ...props + }) + } + }), + 'Table Heatmap': defineComponent({ + name: 'vue-table-heatmap', + setup (props) { + return () => h(TableRenderer, { + ...defaultProps, + ...props, + heatmapMode: 'full' + }) + } + }), + 'Table Col Heatmap': defineComponent({ + name: 'vue-table-col-heatmap', + setup (props) { + return () => h(TableRenderer, { + ...defaultProps, + ...props, + heatmapMode: 'col' + }) + } + }), + 'Table Row Heatmap': defineComponent({ + name: 'vue-table-row-heatmap', + setup (props) { + return () => h(TableRenderer, { + ...defaultProps, + ...props, + heatmapMode: 'row' + }) + } + }) +} diff --git a/src/composables/useAggregators.js b/src/composables/useAggregators.js new file mode 100644 index 0000000..8f3e4bc --- /dev/null +++ b/src/composables/useAggregators.js @@ -0,0 +1,11 @@ +// 집계 함수들을 Vue3 반응형으로 래핑 +import { ref, computed } from 'vue' +import { aggregators, aggregatorTemplates } from '../helper/utilities.js' + +export function useAggregators (options) { + // 집계 함수 선택 및 관리 + + return { + // 집계 함수와 관련 메서드 + } +} diff --git a/src/composables/usePivotData.js b/src/composables/usePivotData.js new file mode 100644 index 0000000..7c8a307 --- /dev/null +++ b/src/composables/usePivotData.js @@ -0,0 +1,38 @@ +import { inject, provide, ref, computed } from 'vue' +import { PivotData } from '@/helper/utilities.js' + +const pivotDataKey = Symbol('pivotData') + +export function providePivotData (props) { + const pivotData = ref(null) + const error = ref(null) + try { + pivotData.value = new PivotData(props) + } catch (error) { + if (console && console.error(error.stack)) { + error.value = 'An error occurred computing the PivotTable results.' + } + } + + const rowKeys = computed(() => pivotData.value?.getRowKeys() || []) + const colKeys = computed(() => pivotData.value?.getColKeys() || []) + const colAttrs = computed(() => pivotData.value?.props.cols || []) + const rowAttrs = computed(() => pivotData.value?.props.rows || []) + + const getAggregator = (rowKey, colKey) => pivotData.value?.getAggregator(rowKey, colKey) + const grandTotalAggregator = () => pivotData.value.getAggregator([], []) + provide(pivotDataKey, { + pivotData, + rowKeys, + colKeys, + colAttrs, + rowAttrs, + getAggregator, + grandTotalAggregator, + error + }) +} + +export function usePivotData () { + return inject(pivotDataKey) +} diff --git a/src/composables/useSorting.js b/src/composables/useSorting.js new file mode 100644 index 0000000..a6bc0d2 --- /dev/null +++ b/src/composables/useSorting.js @@ -0,0 +1,11 @@ +// 정렬 관련 유틸리티를 Vue3 반응형으로 래핑 +import { ref, computed } from 'vue' +import { naturalSort, getSort, sortAs } from '../helper/utilities.js' + +export function useSorting (options) { + // 정렬 방향, 정렬 필드 등 관리 + + return { + // 노출할 상태와 메서드 + } +} diff --git a/src/composables/useTableRenderers.js b/src/composables/useTableRenderers.js new file mode 100644 index 0000000..e0eb881 --- /dev/null +++ b/src/composables/useTableRenderers.js @@ -0,0 +1,19 @@ +// composables/useTableRenderer.js +import { ref, computed } from 'vue' +import { redColorScaleGenerator } from '../helper/utilities.js' + +export function useTableRenderer (options) { + // 기존 redColorScaleGenerator 및 관련 함수 래핑 + + // 히트맵 로직 + const getColorScaleGenerator = (values) => { + return options.tableColorScaleGenerator || redColorScaleGenerator(values) + } + + // 기타 렌더러 관련 함수 + + return { + getColorScaleGenerator + // 기타 필요한 함수 및 상태 + } +} diff --git a/src/composables/useValueFormatting.js b/src/composables/useValueFormatting.js new file mode 100644 index 0000000..7d110cf --- /dev/null +++ b/src/composables/useValueFormatting.js @@ -0,0 +1,11 @@ +// 값 포맷팅 기능을 Vue3 반응형으로 래핑 +import { ref, computed } from 'vue' +import { numberFormat } from '../helper/utilities.js' + +export function useValueFormatting (options) { + // 포맷팅 옵션 관리 + + return { + // 포맷팅 함수와 옵션 + } +} diff --git a/vite.config.js b/vite.config.js index 85ce67a..9965a0b 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,7 +1,22 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' - +import { fileURLToPath, URL } from 'node:url' // https://vite.dev/config/ export default defineConfig({ - plugins: [vue()] + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + extensions: [ + '.mjs', + '.js', + '.json', + '.jsx', + '.ts', + '.tsx', + '.vue', + '.mts' + ] + } }) From c9acbf78e7ebda37324b5b062b26d143c62d251f Mon Sep 17 00:00:00 2001 From: Seungwoo321 Date: Mon, 31 Mar 2025 14:19:06 +0900 Subject: [PATCH 02/12] feat: update ui --- src/components/pivottable-ui/VPivottableUi.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/pivottable-ui/VPivottableUi.vue b/src/components/pivottable-ui/VPivottableUi.vue index ea153ea..9047cd0 100644 --- a/src/components/pivottable-ui/VPivottableUi.vue +++ b/src/components/pivottable-ui/VPivottableUi.vue @@ -253,7 +253,8 @@ const onValSlice = (e, i) => newProps.value.vals.splice(i, 1, e.target.value) const pivotData = new PivotData(newProps.value) watch(() => props.data, (value) => { - state.value.unusedOrder = props.unusedAttrs + // TODO + state.value.unusedOrder = props.unusedAttrs // unusedAttrs 없음 materializeInput(value) }, { immediate: false From 429ea177d73c181a1e44a9f062f7153b2f43701b Mon Sep 17 00:00:00 2001 From: Seungwoo321 Date: Tue, 8 Apr 2025 10:51:36 +0900 Subject: [PATCH 03/12] fix --- src/components/pivottable-ui/VPivottableUi.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/pivottable-ui/VPivottableUi.vue b/src/components/pivottable-ui/VPivottableUi.vue index 58a2db0..348118e 100644 --- a/src/components/pivottable-ui/VPivottableUi.vue +++ b/src/components/pivottable-ui/VPivottableUi.vue @@ -4,8 +4,9 @@ props.renderers || Renderer) const { newProps, setProps, propUpdater } = usePropsData(props) const rowAttrs = computed(() => { return newProps.value.rows.filter( From ee8e9b1ca7f3712d16795ce6ecde7236db43a20e Mon Sep 17 00:00:00 2001 From: Seungwoo321 Date: Thu, 10 Apr 2025 15:53:44 +0900 Subject: [PATCH 04/12] WIP --- src/App.vue | 6 - .../pivottable-ui/VDragAndDropCell.vue | 4 +- .../pivottable-ui/VPivottableUi.vue | 223 +++++++++--------- .../pivottable/renderer/TableRenderer.vue | 4 +- src/composables/index.js | 2 +- src/composables/propData.js | 16 -- src/composables/usePropsState.js | 73 ++++++ src/helper/defaultProps.js | 71 ++---- 8 files changed, 212 insertions(+), 187 deletions(-) delete mode 100644 src/composables/propData.js create mode 100644 src/composables/usePropsState.js diff --git a/src/App.vue b/src/App.vue index 8be2336..a9abe61 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,15 +1,9 @@