@vmscloud/moz-ui-grid-vue 0.1.41 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -13
- package/dist/MozGrid.vue.d.ts +5 -0
- package/dist/chunks/{index-BDQ0HlwR.js → index-2qnzL9Zm.js} +183 -32
- package/dist/chunks/index-BLDAzbGv.cjs +14 -0
- package/dist/compat/MozGridVue.vue.d.ts +33 -3
- package/dist/compat/MozPivotVue.vue.d.ts +33 -3
- package/dist/excel/ClientExcelUploadPopup.d.ts +48 -0
- package/dist/excel/ClientExcelUploadPopup.vue.d.ts +5 -0
- package/dist/excel/icons.d.ts +3 -0
- package/dist/{legacy/composables → excel}/useClientExcelExport.d.ts +2 -2
- package/dist/{legacy/composables → excel}/useClientExcelStore.d.ts +1 -1
- package/dist/index.cjs +76 -25
- package/dist/index.d.ts +27 -9
- package/dist/index.js +700 -89163
- package/dist/locale/index.d.ts +49 -0
- package/dist/{legacy/store → store}/index.d.ts +28 -28
- package/dist/store.cjs +1 -1
- package/dist/store.js +4 -4
- package/dist/stories/FieldId.stories.d.ts +1 -1
- package/dist/stories/FooterAggregateDiagnosis.stories.d.ts +17 -0
- package/dist/stories/FooterAggregatePivot.stories.d.ts +37 -0
- package/dist/stories/MergedCellCopy.stories.d.ts +58 -0
- package/dist/stories/Pivot900Rows.stories.d.ts +40 -0
- package/dist/stories/PivotReactiveProxy.stories.d.ts +118 -0
- package/dist/stories/PivotSettingsPermissions.stories.d.ts +6 -0
- package/dist/stories/RowGroupAggregates.stories.d.ts +57 -0
- package/dist/stories/RowGroupDisabled.stories.d.ts +9 -0
- package/dist/stories/SummaryFooter.stories.d.ts +7 -0
- package/dist/{legacy/stories → stories}/_helpers/localDataLoader.d.ts +1 -1
- package/dist/{legacy/stories → stories}/_helpers/sampleData.d.ts +11 -11
- package/dist/style.css +1 -1
- package/dist/types/injection-keys.d.ts +2 -5
- package/dist/types/modules.d.ts +87 -0
- package/dist/{legacy/types → types}/pivot-props.d.ts +1 -1
- package/dist/{legacy/types → types}/props.d.ts +12 -3
- package/dist/{legacy/types → types}/toolbar.d.ts +1 -1
- package/dist/utils/excel/ExcelImportUtil.cjs +1 -1
- package/dist/utils/excel/ExcelImportUtil.js +1 -1
- package/dist/utils/excel/ExcelQueueManager.cjs +1 -1
- package/dist/utils/excel/ExcelQueueManager.js +1 -1
- package/dist/utils/excel/ExcelTaskRunner.cjs +1 -1
- package/dist/{legacy/utils → utils}/excel/ExcelTaskRunner.d.ts +1 -1
- package/dist/utils/excel/ExcelTaskRunner.js +1 -1
- package/dist/utils/excel/ExcelTimeoutManager.cjs +1 -1
- package/dist/utils/excel/ExcelTimeoutManager.js +2 -4
- package/dist/{legacy/utils → utils}/index.d.ts +1 -1
- package/dist/utils/toast.d.ts +12 -0
- package/docs/manual/examples.md +2 -2
- package/docs/manual/reference.md +120 -5
- package/docs/manual/reference_vue.md +24 -29
- package/package.json +6 -7
- package/dist/chunks/index-D5KJLBGW.cjs +0 -14
- package/dist/legacy/components/common/Dragging.d.ts +0 -17
- package/dist/legacy/components/common/Dragging.vue.d.ts +0 -49
- package/dist/legacy/components/common/custom-cell/FormulaEngine.d.ts +0 -256
- package/dist/legacy/components/common/custom-cell/FormulaInput.vue.d.ts +0 -33
- package/dist/legacy/components/common/custom-cell/GridCustomCell.vue.d.ts +0 -23
- package/dist/legacy/components/common/custom-cell/useFormulaAutocomplete.d.ts +0 -44
- package/dist/legacy/components/common/excel/ClientExcelUploadPopup.vue.d.ts +0 -201
- package/dist/legacy/components/common/excel/assets/IconDropZone.vue.d.ts +0 -2
- package/dist/legacy/components/common/excel/assets/IconFileUpload.vue.d.ts +0 -2
- package/dist/legacy/components/common/filter/GridFilter.vue.d.ts +0 -23
- package/dist/legacy/components/common/footer/GridFooter.vue.d.ts +0 -29
- package/dist/legacy/components/common/sort/GridSort.vue.d.ts +0 -23
- package/dist/legacy/components/common/toolbar/GridSearchInput.vue.d.ts +0 -33
- package/dist/legacy/components/grid/MozGridVue.vue.d.ts +0 -2041
- package/dist/legacy/components/grid/MozGridVueCore.vue.d.ts +0 -118
- package/dist/legacy/components/grid/bulk-editor/GridBulkEditor.vue.d.ts +0 -10
- package/dist/legacy/components/grid/column-settings/AlignPicker.vue.d.ts +0 -10
- package/dist/legacy/components/grid/column-settings/ColorSwatchPicker.vue.d.ts +0 -11
- package/dist/legacy/components/grid/column-settings/ColumnListItem.vue.d.ts +0 -17
- package/dist/legacy/components/grid/column-settings/ColumnOptionsPanel.vue.d.ts +0 -32
- package/dist/legacy/components/grid/column-settings/FontSizePicker.vue.d.ts +0 -10
- package/dist/legacy/components/grid/column-settings/FontStyleToggles.vue.d.ts +0 -15
- package/dist/legacy/components/grid/column-settings/MaskPresetPicker.vue.d.ts +0 -14
- package/dist/legacy/components/grid/context-menu/GridContextMenu.vue.d.ts +0 -208
- package/dist/legacy/components/grid/group-panel/GroupPanel.vue.d.ts +0 -18
- package/dist/legacy/components/grid/toolbar/ColumnPicker.vue.d.ts +0 -17
- package/dist/legacy/components/grid/toolbar/ColumnSettings.vue.d.ts +0 -30
- package/dist/legacy/components/grid/toolbar/GridOptionModal.vue.d.ts +0 -211
- package/dist/legacy/components/grid/toolbar/GridToolBox.vue.d.ts +0 -69
- package/dist/legacy/components/pivot/MozPivotVue.vue.d.ts +0 -1868
- package/dist/legacy/components/pivot/PivotContextMenu.vue.d.ts +0 -634
- package/dist/legacy/components/pivot/PivotFieldChip.vue.d.ts +0 -16
- package/dist/legacy/components/pivot/PivotFieldDropZone.vue.d.ts +0 -26
- package/dist/legacy/components/pivot/PivotFieldPanel.vue.d.ts +0 -28
- package/dist/legacy/components/pivot/PivotOptionModal.vue.d.ts +0 -534
- package/dist/legacy/components/pivot/PivotToolBox.vue.d.ts +0 -79
- package/dist/legacy/components/pivot/chart/EChart.vue.d.ts +0 -13
- package/dist/legacy/components/pivot/chart/MozPivotChart.types.d.ts +0 -16
- package/dist/legacy/components/pivot/chart/MozPivotChart.vue.d.ts +0 -14
- package/dist/legacy/components/pivot/chart/PivotChartDetail.vue.d.ts +0 -13
- package/dist/legacy/components/pivot/chart/PivotChartMini.vue.d.ts +0 -18
- package/dist/legacy/components/pivot/chart/PivotChartMultiple.vue.d.ts +0 -18
- package/dist/legacy/components/pivot/chart/PivotChartToolbar.vue.d.ts +0 -38
- package/dist/legacy/components/pivot/chart/chartUtils.d.ts +0 -45
- package/dist/legacy/components/pivot/chart/useChartData.d.ts +0 -35
- package/dist/legacy/composables/useCellTooltip.d.ts +0 -8
- package/dist/legacy/composables/useColumnFormatter.d.ts +0 -45
- package/dist/legacy/composables/useColumnSettings.d.ts +0 -35
- package/dist/legacy/composables/useContextMenu.d.ts +0 -71
- package/dist/legacy/composables/useGridBulkEditor.d.ts +0 -36
- package/dist/legacy/composables/useGridChanges.d.ts +0 -28
- package/dist/legacy/composables/useGridColumns.d.ts +0 -37
- package/dist/legacy/composables/useGridCustomCell.d.ts +0 -34
- package/dist/legacy/composables/useGridEvents.d.ts +0 -14
- package/dist/legacy/composables/useGridFilter.d.ts +0 -38
- package/dist/legacy/composables/useGridInstance.d.ts +0 -16
- package/dist/legacy/composables/useGridSelect.d.ts +0 -18
- package/dist/legacy/composables/useGridSelection.d.ts +0 -18
- package/dist/legacy/composables/useGridSort.d.ts +0 -38
- package/dist/legacy/composables/useGridUndoRedo.d.ts +0 -28
- package/dist/legacy/composables/useGridValidation.d.ts +0 -28
- package/dist/legacy/composables/useMaskPresets.d.ts +0 -38
- package/dist/legacy/composables/useSearchHighlight.d.ts +0 -12
- package/dist/legacy/icons/IconAdd.vue.d.ts +0 -11
- package/dist/legacy/icons/IconArrowDownWithTail.vue.d.ts +0 -11
- package/dist/legacy/icons/IconArrowLeft.vue.d.ts +0 -11
- package/dist/legacy/icons/IconArrowLeftWithTail.vue.d.ts +0 -11
- package/dist/legacy/icons/IconArrowRight.vue.d.ts +0 -11
- package/dist/legacy/icons/IconArrowUpCenter.vue.d.ts +0 -11
- package/dist/legacy/icons/IconArrowUpWithTail.vue.d.ts +0 -11
- package/dist/legacy/icons/IconChart.vue.d.ts +0 -11
- package/dist/legacy/icons/IconClose.vue.d.ts +0 -13
- package/dist/legacy/icons/IconColorPicker.vue.d.ts +0 -11
- package/dist/legacy/icons/IconCustomCell.vue.d.ts +0 -11
- package/dist/legacy/icons/IconDecide.vue.d.ts +0 -11
- package/dist/legacy/icons/IconDownload.vue.d.ts +0 -11
- package/dist/legacy/icons/IconDragHandler.vue.d.ts +0 -11
- package/dist/legacy/icons/IconFilter.vue.d.ts +0 -11
- package/dist/legacy/icons/IconInfoFilled.vue.d.ts +0 -11
- package/dist/legacy/icons/IconRedo.vue.d.ts +0 -9
- package/dist/legacy/icons/IconReset.vue.d.ts +0 -9
- package/dist/legacy/icons/IconResetGridToolbar.vue.d.ts +0 -11
- package/dist/legacy/icons/IconSearch.vue.d.ts +0 -11
- package/dist/legacy/icons/IconSetting.vue.d.ts +0 -11
- package/dist/legacy/icons/IconSettingFilled.vue.d.ts +0 -11
- package/dist/legacy/icons/IconSort.vue.d.ts +0 -11
- package/dist/legacy/icons/IconToastWarning.vue.d.ts +0 -11
- package/dist/legacy/icons/IconUndo.vue.d.ts +0 -9
- package/dist/legacy/icons/index.d.ts +0 -25
- package/dist/legacy/index.d.ts +0 -69
- package/dist/legacy/shared/colorPresets.d.ts +0 -36
- package/dist/legacy/stories/Autofit.stories.d.ts +0 -9
- package/dist/legacy/stories/CRUD.stories.d.ts +0 -9
- package/dist/legacy/stories/CellAttributes.stories.d.ts +0 -19
- package/dist/legacy/stories/CellMask.stories.d.ts +0 -19
- package/dist/legacy/stories/ClientExcel.stories.d.ts +0 -8
- package/dist/legacy/stories/Clipboard.stories.d.ts +0 -12
- package/dist/legacy/stories/ColumnVisibility.stories.d.ts +0 -12
- package/dist/legacy/stories/ColumnWidths.stories.d.ts +0 -11
- package/dist/legacy/stories/CustomSortFilter.stories.d.ts +0 -7
- package/dist/legacy/stories/DynamicRowHeight.stories.d.ts +0 -13
- package/dist/legacy/stories/Editors.stories.d.ts +0 -9
- package/dist/legacy/stories/EmptyState.stories.d.ts +0 -10
- package/dist/legacy/stories/FormatRow.stories.d.ts +0 -20
- package/dist/legacy/stories/Grouping.stories.d.ts +0 -14
- package/dist/legacy/stories/HeaderGroup.stories.d.ts +0 -11
- package/dist/legacy/stories/LargeData.stories.d.ts +0 -19
- package/dist/legacy/stories/MasterDetail.stories.d.ts +0 -17
- package/dist/legacy/stories/Merge.stories.d.ts +0 -10
- package/dist/legacy/stories/MultiRow.stories.d.ts +0 -12
- package/dist/legacy/stories/MultiRowCrud.stories.d.ts +0 -11
- package/dist/legacy/stories/MultiRowGroup.stories.d.ts +0 -11
- package/dist/legacy/stories/Pinning.stories.d.ts +0 -44
- package/dist/legacy/stories/Pivot.stories.d.ts +0 -23
- package/dist/legacy/stories/PivotAdvanced.stories.d.ts +0 -20
- package/dist/legacy/stories/PivotChart.stories.d.ts +0 -23
- package/dist/legacy/stories/PivotNonNumeric.stories.d.ts +0 -27
- package/dist/legacy/stories/Preset.stories.d.ts +0 -11
- package/dist/legacy/stories/ReactiveAPI.stories.d.ts +0 -8
- package/dist/legacy/stories/ReactiveSafety.stories.d.ts +0 -28
- package/dist/legacy/stories/Repro.stories.d.ts +0 -36
- package/dist/legacy/stories/RowAPI.stories.d.ts +0 -12
- package/dist/legacy/stories/SelectionModes.stories.d.ts +0 -35
- package/dist/legacy/stories/Streaming.stories.d.ts +0 -12
- package/dist/legacy/stories/Tree.stories.d.ts +0 -13
- package/dist/legacy/stories/WorkerMode.stories.d.ts +0 -15
- package/dist/legacy/utils/dialog/dialog.d.ts +0 -19
- /package/dist/{legacy/store → store}/UploadRefreshRegistry.d.ts +0 -0
- /package/dist/{legacy/store → store}/excelStore.d.ts +0 -0
- /package/dist/{legacy/stores → stores}/index.d.ts +0 -0
- /package/dist/{legacy/stores → stores}/projectInfo/projectInfo.contract.d.ts +0 -0
- /package/dist/{legacy/types → types}/FileParameter.d.ts +0 -0
- /package/dist/{legacy/types → types}/StreamingParameter.d.ts +0 -0
- /package/dist/{legacy/types → types}/excel.types.d.ts +0 -0
- /package/dist/{legacy/types → types}/index.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/async/debounce.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/crypto/crypto.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/excel/ExcelGuard.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/excel/ExcelImportUtil.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/excel/ExcelQueueManager.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/excel/ExcelTimeoutManager.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/file.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/http/rest.d.ts +0 -0
- /package/dist/{legacy/utils → utils}/id/generator.d.ts +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* grid-vue 자체 locale — 엑셀 업로드 팝업·엑셀 스토어·타임아웃 매니저가 쓰는 `Grid.*` 문자열 부분집합.
|
|
3
|
+
*
|
|
4
|
+
* 원본: 레거시 UI 컴포넌트 패키지(GitHub Packages 전용)의 `src/shared/locale/{ko,en,ja,zh}.ts` 중 `Grid` 절.
|
|
5
|
+
* 그 패키지의 `useMozLocale`(Symbol inject) 을 더 이상 쓰지 않기 위해
|
|
6
|
+
* 필요한 키만 복제했다(ITSM-2026-002564). 원본 사전에 없던 키(clientExcelImport, importMode*,
|
|
7
|
+
* conflict*, clientExcelImportProgress)는 옛 SFC 의 한국어 리터럴을 ko 로 두고 나머지 언어를 새로 채웠다.
|
|
8
|
+
*
|
|
9
|
+
* 언어 선택은 `MozGrid` 의 `locale` prop 이 결정한다(wrapper 의 GridChrome 과 같은 create-time 단일 값).
|
|
10
|
+
* 모듈 수준 단일 사전이며 기본은 ko.
|
|
11
|
+
*/
|
|
12
|
+
export type GridVueLocaleCode = 'ko' | 'en' | 'ja' | 'zh';
|
|
13
|
+
export interface GridVueLocaleMessages {
|
|
14
|
+
clientExcelImport: string;
|
|
15
|
+
clientExcelImportProgress: string;
|
|
16
|
+
importMode: string;
|
|
17
|
+
importModeReplace: string;
|
|
18
|
+
importModeAppend: string;
|
|
19
|
+
importModeUpsert: string;
|
|
20
|
+
conflictStrategy: string;
|
|
21
|
+
conflictError: string;
|
|
22
|
+
conflictSkip: string;
|
|
23
|
+
conflictUpdate: string;
|
|
24
|
+
excelInvalidExcel: string;
|
|
25
|
+
overwriteSelected: string;
|
|
26
|
+
dropHerePrefix: string;
|
|
27
|
+
dropHereMiddle: string;
|
|
28
|
+
dropHereSuffix: string;
|
|
29
|
+
click: string;
|
|
30
|
+
drag: string;
|
|
31
|
+
check: string;
|
|
32
|
+
cancel: string;
|
|
33
|
+
alreadyExcelProgress: string;
|
|
34
|
+
downloadFail: string;
|
|
35
|
+
toastSaveSuccess: string;
|
|
36
|
+
toastSaveError: string;
|
|
37
|
+
requestTimedOut: string;
|
|
38
|
+
}
|
|
39
|
+
export declare const koKR: GridVueLocaleMessages;
|
|
40
|
+
export declare const enUS: GridVueLocaleMessages;
|
|
41
|
+
export declare const jaJP: GridVueLocaleMessages;
|
|
42
|
+
export declare const zhCN: GridVueLocaleMessages;
|
|
43
|
+
/** `'en-US'`, `'ja'`, `'zh-CN'` 같은 코드를 지원 언어로 정규화. 모르는 값은 ko. */
|
|
44
|
+
export declare function normalizeGridVueLocale(locale: string | undefined | null): GridVueLocaleCode;
|
|
45
|
+
/** 현재 언어를 바꾼다. `MozGrid` 가 `locale` prop 으로 호출한다. undefined 는 ko. */
|
|
46
|
+
export declare function setGridVueLocale(locale?: string | null): GridVueLocaleCode;
|
|
47
|
+
export declare function getGridVueLocaleCode(): GridVueLocaleCode;
|
|
48
|
+
/** 현재 언어의 문자열 사전. */
|
|
49
|
+
export declare function getGridVueLocale(): GridVueLocaleMessages;
|
|
@@ -8,9 +8,9 @@ export declare const useExcelStore: import('pinia').StoreDefinition<"excelPopup"
|
|
|
8
8
|
showPopup: import('vue').Ref<boolean, boolean>;
|
|
9
9
|
isOverwrite: import('vue').Ref<boolean, boolean>;
|
|
10
10
|
exportFormat: import('vue').Ref<import('./excelStore').ExcelFormat, import('./excelStore').ExcelFormat>;
|
|
11
|
-
excelInfo: import('vue').Ref<import('
|
|
12
|
-
excelAPI: import('vue').Ref<import('
|
|
13
|
-
file: import('vue').Ref<import('
|
|
11
|
+
excelInfo: import('vue').Ref<import('..').IExcelInfo, import('..').IExcelInfo>;
|
|
12
|
+
excelAPI: import('vue').Ref<import('..').IExcelAPI, import('..').IExcelAPI>;
|
|
13
|
+
file: import('vue').Ref<import('..').FileParameter | null, import('..').FileParameter | null>;
|
|
14
14
|
excelFileMap: Map<string, string>;
|
|
15
15
|
downloadInfo: import('vue').Ref<{
|
|
16
16
|
current?: number | undefined;
|
|
@@ -29,14 +29,14 @@ export declare const useExcelStore: import('pinia').StoreDefinition<"excelPopup"
|
|
|
29
29
|
fileName?: string | undefined;
|
|
30
30
|
notiDatetime?: string | undefined;
|
|
31
31
|
} | null>;
|
|
32
|
-
initialize: (info?: import('
|
|
33
|
-
setInfo: (info: import('
|
|
32
|
+
initialize: (info?: import('..').IExcelInfo, api?: import('..').IExcelAPI) => void;
|
|
33
|
+
setInfo: (info: import('..').IExcelInfo) => void;
|
|
34
34
|
newExcelInfo: (gridKeys: string[], flexGrid: any) => {
|
|
35
|
-
keyColumns: import('
|
|
36
|
-
columnLayout: import('
|
|
37
|
-
columnMap: import('
|
|
35
|
+
keyColumns: import('..').IExcelInfo["keyColumns"];
|
|
36
|
+
columnLayout: import('..').IExcelInfo["columnLayout"];
|
|
37
|
+
columnMap: import('..').IExcelInfo["columnMap"];
|
|
38
38
|
};
|
|
39
|
-
setAPI: (api: import('
|
|
39
|
+
setAPI: (api: import('..').IExcelAPI) => void;
|
|
40
40
|
newExcelApi: (apiKey: string, flexGrid: any, sampleData: Record<string, string>[], fileName: string, refreshCB: () => void, excelUpload: (param?: any, method?: "post") => Promise<any>, autoTransaction: (config: {
|
|
41
41
|
url: string;
|
|
42
42
|
param?: any;
|
|
@@ -68,13 +68,13 @@ export declare const useExcelStore: import('pinia').StoreDefinition<"excelPopup"
|
|
|
68
68
|
registerRefresh: (apiKey: string, cb: () => void) => void;
|
|
69
69
|
unregisterRefresh: (apiKey: string) => void;
|
|
70
70
|
triggerRefreshBySession: (sessionId: string) => boolean;
|
|
71
|
-
}, "file" | "
|
|
71
|
+
}, "file" | "targetTable" | "showPopup" | "isOverwrite" | "exportFormat" | "excelInfo" | "excelAPI" | "excelFileMap" | "downloadInfo">, Pick<{
|
|
72
72
|
showPopup: import('vue').Ref<boolean, boolean>;
|
|
73
73
|
isOverwrite: import('vue').Ref<boolean, boolean>;
|
|
74
74
|
exportFormat: import('vue').Ref<import('./excelStore').ExcelFormat, import('./excelStore').ExcelFormat>;
|
|
75
|
-
excelInfo: import('vue').Ref<import('
|
|
76
|
-
excelAPI: import('vue').Ref<import('
|
|
77
|
-
file: import('vue').Ref<import('
|
|
75
|
+
excelInfo: import('vue').Ref<import('..').IExcelInfo, import('..').IExcelInfo>;
|
|
76
|
+
excelAPI: import('vue').Ref<import('..').IExcelAPI, import('..').IExcelAPI>;
|
|
77
|
+
file: import('vue').Ref<import('..').FileParameter | null, import('..').FileParameter | null>;
|
|
78
78
|
excelFileMap: Map<string, string>;
|
|
79
79
|
downloadInfo: import('vue').Ref<{
|
|
80
80
|
current?: number | undefined;
|
|
@@ -93,14 +93,14 @@ export declare const useExcelStore: import('pinia').StoreDefinition<"excelPopup"
|
|
|
93
93
|
fileName?: string | undefined;
|
|
94
94
|
notiDatetime?: string | undefined;
|
|
95
95
|
} | null>;
|
|
96
|
-
initialize: (info?: import('
|
|
97
|
-
setInfo: (info: import('
|
|
96
|
+
initialize: (info?: import('..').IExcelInfo, api?: import('..').IExcelAPI) => void;
|
|
97
|
+
setInfo: (info: import('..').IExcelInfo) => void;
|
|
98
98
|
newExcelInfo: (gridKeys: string[], flexGrid: any) => {
|
|
99
|
-
keyColumns: import('
|
|
100
|
-
columnLayout: import('
|
|
101
|
-
columnMap: import('
|
|
99
|
+
keyColumns: import('..').IExcelInfo["keyColumns"];
|
|
100
|
+
columnLayout: import('..').IExcelInfo["columnLayout"];
|
|
101
|
+
columnMap: import('..').IExcelInfo["columnMap"];
|
|
102
102
|
};
|
|
103
|
-
setAPI: (api: import('
|
|
103
|
+
setAPI: (api: import('..').IExcelAPI) => void;
|
|
104
104
|
newExcelApi: (apiKey: string, flexGrid: any, sampleData: Record<string, string>[], fileName: string, refreshCB: () => void, excelUpload: (param?: any, method?: "post") => Promise<any>, autoTransaction: (config: {
|
|
105
105
|
url: string;
|
|
106
106
|
param?: any;
|
|
@@ -136,9 +136,9 @@ export declare const useExcelStore: import('pinia').StoreDefinition<"excelPopup"
|
|
|
136
136
|
showPopup: import('vue').Ref<boolean, boolean>;
|
|
137
137
|
isOverwrite: import('vue').Ref<boolean, boolean>;
|
|
138
138
|
exportFormat: import('vue').Ref<import('./excelStore').ExcelFormat, import('./excelStore').ExcelFormat>;
|
|
139
|
-
excelInfo: import('vue').Ref<import('
|
|
140
|
-
excelAPI: import('vue').Ref<import('
|
|
141
|
-
file: import('vue').Ref<import('
|
|
139
|
+
excelInfo: import('vue').Ref<import('..').IExcelInfo, import('..').IExcelInfo>;
|
|
140
|
+
excelAPI: import('vue').Ref<import('..').IExcelAPI, import('..').IExcelAPI>;
|
|
141
|
+
file: import('vue').Ref<import('..').FileParameter | null, import('..').FileParameter | null>;
|
|
142
142
|
excelFileMap: Map<string, string>;
|
|
143
143
|
downloadInfo: import('vue').Ref<{
|
|
144
144
|
current?: number | undefined;
|
|
@@ -157,14 +157,14 @@ export declare const useExcelStore: import('pinia').StoreDefinition<"excelPopup"
|
|
|
157
157
|
fileName?: string | undefined;
|
|
158
158
|
notiDatetime?: string | undefined;
|
|
159
159
|
} | null>;
|
|
160
|
-
initialize: (info?: import('
|
|
161
|
-
setInfo: (info: import('
|
|
160
|
+
initialize: (info?: import('..').IExcelInfo, api?: import('..').IExcelAPI) => void;
|
|
161
|
+
setInfo: (info: import('..').IExcelInfo) => void;
|
|
162
162
|
newExcelInfo: (gridKeys: string[], flexGrid: any) => {
|
|
163
|
-
keyColumns: import('
|
|
164
|
-
columnLayout: import('
|
|
165
|
-
columnMap: import('
|
|
163
|
+
keyColumns: import('..').IExcelInfo["keyColumns"];
|
|
164
|
+
columnLayout: import('..').IExcelInfo["columnLayout"];
|
|
165
|
+
columnMap: import('..').IExcelInfo["columnMap"];
|
|
166
166
|
};
|
|
167
|
-
setAPI: (api: import('
|
|
167
|
+
setAPI: (api: import('..').IExcelAPI) => void;
|
|
168
168
|
newExcelApi: (apiKey: string, flexGrid: any, sampleData: Record<string, string>[], fileName: string, refreshCB: () => void, excelUpload: (param?: any, method?: "post") => Promise<any>, autoTransaction: (config: {
|
|
169
169
|
url: string;
|
|
170
170
|
param?: any;
|
package/dist/store.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("pinia");const e=require("./chunks/index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("pinia");const e=require("./chunks/index-BLDAzbGv.cjs");exports.dataTypeToString=e.dataTypeToString,exports.useExcelDownloadStore=e.useExcelDownloadStore,exports.useExcelStore=e.useExcelStore,exports.useExcelUploadStore=e.useExcelUploadStore;
|
package/dist/store.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "pinia";
|
|
2
|
-
import {
|
|
2
|
+
import { h, u, c, d } from "./chunks/index-2qnzL9Zm.js";
|
|
3
3
|
export {
|
|
4
|
-
|
|
4
|
+
h as dataTypeToString,
|
|
5
5
|
u as useExcelDownloadStore,
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
c as useExcelStore,
|
|
7
|
+
d as useExcelUploadStore
|
|
8
8
|
};
|
|
@@ -50,7 +50,7 @@ export declare const Flat: Story;
|
|
|
50
50
|
/**
|
|
51
51
|
* ## 행 그룹 — 그룹 컬럼과 소계가 `id` 로 지목된다
|
|
52
52
|
*
|
|
53
|
-
* `rowGroup.columns` 와 `
|
|
53
|
+
* `rowGroup.columns` 와 `aggregates[].column` 은 **컬럼 식별자**로 지정한다.
|
|
54
54
|
* 소계는 `amount_krw` 하나에만 걸어 두었다.
|
|
55
55
|
*
|
|
56
56
|
* ### 확인할 것
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
/**
|
|
4
|
+
* [진단용] ITSM-2026-002455 — Ctrl+Space 푸터 값 vs 드래그 선택 푸터 값 불일치.
|
|
5
|
+
*
|
|
6
|
+
* 필터가 걸린 상태에서 같은 컬럼을 Ctrl+Space 로 고를 때와 드래그로 고를 때
|
|
7
|
+
* wrapper 푸터(평균/개수/최소/최대/합계)의 값이 달라지는지 확인한다.
|
|
8
|
+
*
|
|
9
|
+
* 데이터: salary = 100..500 (5행). dept 가 Y 인 2행(200, 400)을 필터로 제외하면
|
|
10
|
+
* 화면에는 100 / 300 / 500 세 행만 남는다.
|
|
11
|
+
*
|
|
12
|
+
* 기대(화면 기준): 합계 900, 개수 3, 평균 300
|
|
13
|
+
*/
|
|
14
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
15
|
+
export default meta;
|
|
16
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
17
|
+
export declare const CtrlSpaceVsDrag: Story;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
/**
|
|
4
|
+
* 선택 방식과 무관하게 푸터 집계가 같아야 한다 — ITSM-2026-002455.
|
|
5
|
+
*
|
|
6
|
+
* ## 제보
|
|
7
|
+
*
|
|
8
|
+
* 피벗 그리드(스마트리포트)에서 값 컬럼을 **Ctrl+Space** 로 고른 뒤 푸터를 보면
|
|
9
|
+
* `개수: 1`, 최소·최대·합계가 전부 평균과 같은 값으로 나왔다. 같은 컬럼을
|
|
10
|
+
* **드래그**로 고르면 `개수: 25`, 합계 39,955.76 처럼 정상으로 보였다.
|
|
11
|
+
*
|
|
12
|
+
* ## 원인 (요약)
|
|
13
|
+
*
|
|
14
|
+
* `selectionAggregates()` 는 "선택 영역 집계" 하나의 계약인데, 선택 방식마다 서로 다른
|
|
15
|
+
* 의미의 값을 같은 타입에 담아 돌려주고 있었다.
|
|
16
|
+
*
|
|
17
|
+
* | 경로 | 읽던 소스 | 증상 |
|
|
18
|
+
* |---|---|---|
|
|
19
|
+
* | 피벗 Ctrl+Space | 컬럼 총합계 스칼라 1개 | `개수: 1`, min=max=sum=avg |
|
|
20
|
+
* | 플랫 Ctrl+Space | 소스 배열(필터 무시) | 필터로 숨긴 행이 합산 |
|
|
21
|
+
* | Ctrl+A | 위와 같은 분기 | 동일 |
|
|
22
|
+
* | 드래그 | 뷰포트에 fetch 된 행만 | 화면 밖 선택 행 누락 |
|
|
23
|
+
*
|
|
24
|
+
* 지금은 네 경로 모두 **선택된 셀들의 집계**로 통일돼 있다. 컬럼 전체 선택은 여전히
|
|
25
|
+
* 셀을 순회하지 않는다(엔진 집계 사용) — 최적화는 유지된다.
|
|
26
|
+
*
|
|
27
|
+
* ## 확인 방법
|
|
28
|
+
*
|
|
29
|
+
* 1. 값 컬럼(`이익`)을 **드래그**로 전부 선택 → 푸터의 개수·합계를 기억한다.
|
|
30
|
+
* 2. 같은 컬럼의 셀 하나를 클릭한 뒤 **Ctrl+Space** → 푸터가 **같은 값**이어야 한다.
|
|
31
|
+
* 3. `필터 적용` 을 누르고 1~2 를 반복 → 숨긴 행이 합산되지 않아야 한다.
|
|
32
|
+
* 4. `현재 집계 측정` 은 푸터가 읽는 값과 내부 상태를 함께 찍는다.
|
|
33
|
+
*/
|
|
34
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
35
|
+
export default meta;
|
|
36
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
37
|
+
export declare const PivotCtrlSpaceVsDrag: Story;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
/**
|
|
4
|
+
* 플랫 그리드 병합 셀 복사 — ITSM-2026-002315.
|
|
5
|
+
*
|
|
6
|
+
* ## 무엇을 확인하는 스토리인가
|
|
7
|
+
*
|
|
8
|
+
* 병합된 셀을 복사하면 블록 하나가 **자기 크기(rowSpan × colSpan)만큼 반복 출력**되던
|
|
9
|
+
* 결함을 눈으로 재확인하기 위한 것이다. 세로 2행 병합을 고르면 같은 값이 두 줄,
|
|
10
|
+
* 두 열이 같은 범위로 병합돼 있으면 블록이 통째로 두 번 나왔다.
|
|
11
|
+
*
|
|
12
|
+
* ## 고친 뒤의 규칙 — Excel / Google Sheets / Handsontable 과 동일
|
|
13
|
+
*
|
|
14
|
+
* 병합 블록은 **앵커(좌상단)에서 한 번만** 값을 내고, 나머지 멤버 자리는 빈 칸으로 둔다.
|
|
15
|
+
* Handsontable 문서 표현으로는 "keeps only the upper-left value ... and clears other values".
|
|
16
|
+
* 선택 격자의 행 × 열 모양 자체는 그대로 유지되므로 Excel 에 붙여넣으면 화면에서 보던
|
|
17
|
+
* 레이아웃이 그대로 재현된다.
|
|
18
|
+
*
|
|
19
|
+
* ## 조작 방법
|
|
20
|
+
*
|
|
21
|
+
* 1. `부서` / `팀` 열의 병합된 셀을 포함해 범위를 드래그한다.
|
|
22
|
+
* (병합 셀을 건드리면 선택은 항상 블록 전체로 확장된다 — Excel 과 같은 동작.)
|
|
23
|
+
* 2. `복사 결과 보기` 를 누른다. 클립보드로 나가는 TSV 원문이 아래 상자에 뜬다.
|
|
24
|
+
* 탭은 `→`, 줄바꿈은 `↵` 로 치환해 경계를 눈으로 셀 수 있게 했다.
|
|
25
|
+
* 3. 병합 블록이 걸친 행 수만큼 값이 반복되지 않고 **첫 행에만** 있는 것을 확인한다.
|
|
26
|
+
*
|
|
27
|
+
* `Ctrl+C` 도 같은 경로를 쓴다. 버튼은 클립보드 권한 없이도 결과를 볼 수 있게 한 것뿐이다.
|
|
28
|
+
*
|
|
29
|
+
* ## 데이터 구성
|
|
30
|
+
*
|
|
31
|
+
* 병합 경계를 눈으로 세기 쉽도록 고정값이며, **열마다 병합 단위가 다르게** 짰다.
|
|
32
|
+
*
|
|
33
|
+
* | 행 | 부서 | 팀 | 이름 |
|
|
34
|
+
* |---|---|---|---|
|
|
35
|
+
* | 0 | Engineering (3행 병합) | Frontend (2행 병합) | 김철수 |
|
|
36
|
+
* | 1 | 〃 | 〃 | 이영희 |
|
|
37
|
+
* | 2 | 〃 | Backend | 박민수 |
|
|
38
|
+
* | 3 | Design (2행 병합) | UI (2행 병합) | 정수진 |
|
|
39
|
+
* | 4 | 〃 | 〃 | 최동현 |
|
|
40
|
+
*
|
|
41
|
+
* 전체(0~4행 × 4열)를 선택해 복사하면 기대 결과는 이렇다 —
|
|
42
|
+
* 병합된 자리가 빈 칸이고, 비병합 열(`이름`·`급여`)은 행마다 값이 그대로 나온다.
|
|
43
|
+
*
|
|
44
|
+
* ```
|
|
45
|
+
* Engineering → Frontend → 김철수 → 52000 ↵
|
|
46
|
+
* → → 이영희 → 61000 ↵
|
|
47
|
+
* → Backend → 박민수 → 58000 ↵
|
|
48
|
+
* Design → UI → 정수진 → 47000 ↵
|
|
49
|
+
* → → 최동현 → 49000
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
53
|
+
export default meta;
|
|
54
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
55
|
+
/**
|
|
56
|
+
* 세로 병합 · 열마다 다른 병합 단위 — 앵커에서만 값이 나오는지 확인한다.
|
|
57
|
+
*/
|
|
58
|
+
export declare const FlatMergedCopy: Story;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
/**
|
|
4
|
+
* 900행 피벗 — 표시 행이 뷰포트보다 훨씬 긴 피벗 그리드.
|
|
5
|
+
*
|
|
6
|
+
* ## 왜 이 크기인가
|
|
7
|
+
*
|
|
8
|
+
* 기존 피벗 스토리는 행이 한 화면에 다 들어오거나(`Grid/MozGrid > Basic`) 반대로
|
|
9
|
+
* 수십만~5백만 행이라(`Large Pivot`, `Performance/LargeData`) 성능 측정용에 가깝다.
|
|
10
|
+
* 그 사이가 비어 있어서, **"가상 스크롤이 실제로 돌지만 눈으로 전수 확인은 가능한"**
|
|
11
|
+
* 크기의 피벗을 따로 둔다.
|
|
12
|
+
*
|
|
13
|
+
* 이 크기에서만 드러나는 것들이 있다.
|
|
14
|
+
*
|
|
15
|
+
* - 화면에 렌더된 행과 실제 표시 행 수가 크게 벌어진다 → 뷰포트 밖 행을 읽어야 하는
|
|
16
|
+
* 기능(선택 집계·복사·내보내기)이 화면에 보이는 것만 처리하고 있지 않은지.
|
|
17
|
+
* - 행 헤더 병합(지점)이 스크롤 경계를 여러 번 가로지른다 → 스크롤 중 병합 셀 렌더/선택.
|
|
18
|
+
* - 스크롤을 한참 내린 뒤의 N번째 행에서 재현되는 결함. 첫 화면만 보면 놓친다.
|
|
19
|
+
*
|
|
20
|
+
* ## 구성
|
|
21
|
+
*
|
|
22
|
+
* | | |
|
|
23
|
+
* |---|---|
|
|
24
|
+
* | 원본 행 | 3,600 (지점 300 × 제품 3 × 분기 4) |
|
|
25
|
+
* | 피벗 표시 행 | **900** (지점 × 제품) |
|
|
26
|
+
* | 값 컬럼 | 4 (분기별 매출 합계) |
|
|
27
|
+
*
|
|
28
|
+
* 값은 난수가 아니라 인덱스로 만든 고정값이다 — 스토리를 다시 열어도 같은 숫자가
|
|
29
|
+
* 나와야 "이 셀이 이 값이어야 한다"를 근거로 말할 수 있다.
|
|
30
|
+
*/
|
|
31
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
32
|
+
export default meta;
|
|
33
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
34
|
+
/**
|
|
35
|
+
* 지점 × 제품 = 900행, 분기 4열.
|
|
36
|
+
*
|
|
37
|
+
* 스크롤을 끝까지 내리면 `지점 300 / 전자` 가 마지막 행이다. 지점 열은 제품 3행마다
|
|
38
|
+
* 세로 병합되므로, 스크롤 경계에서 병합 셀이 끊기지 않는지도 함께 보인다.
|
|
39
|
+
*/
|
|
40
|
+
export declare const Rows900: Story;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
/**
|
|
3
|
+
* 피벗 lazy proxy × 외부 deep-reactive 충돌 (ITSM-2026-002533)
|
|
4
|
+
*
|
|
5
|
+
* ✅ **이 결함은 수정되었다.** 이 스토리는 이제 **회귀 감시용**이다 — 모든 버튼이 초록(정상)
|
|
6
|
+
* 이어야 한다. 하나라도 빨강(❌)이 나오면 `createLazyPivotRow` 의 보호가 되돌아간 것이다.
|
|
7
|
+
*
|
|
8
|
+
* 수정 커밋 기준 실측(Storybook 실브라우저): ①②③ 및 래퍼 경유 A~D 전부 `region 5/5`,
|
|
9
|
+
* `product 25/25` 정상. 수정 전에는 ②·C·D 에서 `0/25`(전부 빈 셀)였다.
|
|
10
|
+
*
|
|
11
|
+
* ---
|
|
12
|
+
* ### 증상 (수정 전)
|
|
13
|
+
*
|
|
14
|
+
* 피벗 모드에서 **행 필드(rowHeader) 셀만** 비어 보이고 값 셀은 정상. 가로로 스크롤하면
|
|
15
|
+
* 그제서야 값이 나타난다.
|
|
16
|
+
*
|
|
17
|
+
* ### 원인
|
|
18
|
+
*
|
|
19
|
+
* `createLazyPivotRow`(moz-ui-grid-core `processor/pivotUtils.ts`)의 `get` trap 종단이
|
|
20
|
+
* 모르는 키를 **무조건 `pivotRow.values` 에게 되물었다**:
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* return values[prop]; // ← 수정 전: 선언하지 않은 키까지 위임
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* grid 가 Vue deep reactive 안에 들어가면 `pivotRow.values` 도 reactive proxy 가 된다.
|
|
27
|
+
* 그 상태에서 Vue 가 행 객체에게 내부 예약 키를 물으면 lazy proxy 가 `values` 의 답을
|
|
28
|
+
* 그대로 돌려준다:
|
|
29
|
+
*
|
|
30
|
+
* ```
|
|
31
|
+
* lazyRow['__v_isReactive'] → values['__v_isReactive'] → true (거짓 자백)
|
|
32
|
+
* lazyRow['__v_raw'] → values['__v_raw'] → values 원본
|
|
33
|
+
* ⇒ Vue 는 "이 행은 이미 reactive 고 원본은 values 다" 라 판단해 행을 values 로 교체
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* `values` 에는 **rowHeaders(=행 필드)와 `__nodeId` 가 없다.** 그래서 그 컬럼만
|
|
37
|
+
* `undefined` 가 되어 빈 셀이 된다. 값 컬럼은 `values` 안에 있으니 멀쩡했다 — 이것이
|
|
38
|
+
* "행 필드만 비는" 이유다.
|
|
39
|
+
*
|
|
40
|
+
* **가로 스크롤에서 살아나던 이유**: 행 필드는 `pinned:'left'` 라 최초 1회 칠해진 뒤
|
|
41
|
+
* `Row.renderCells` 의 Fast-Path(`meta.value === value`)에 걸려 재렌더를 건너뛴다. 가로
|
|
42
|
+
* 스크롤은 `renderedLeft`/`renderedWidth` 를 바꿔 그 조건을 깨므로 다시 칠해졌다.
|
|
43
|
+
*
|
|
44
|
+
* ### 수정 (core)
|
|
45
|
+
*
|
|
46
|
+
* ```ts
|
|
47
|
+
* if (Object.prototype.hasOwnProperty.call(values, prop)) return values[prop];
|
|
48
|
+
* return undefined; // 선언한 키 집합 밖은 스스로 undefined 로 답한다
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* `ownKeys` trap 이 `Object.keys`(own+enumerable) 기준이라 이 술어와 정확히 동치다.
|
|
52
|
+
* **특정 프레임워크의 마커 이름에 의존하지 않으므로** Vue·MobX·Solid 어디서도 안전하다.
|
|
53
|
+
* 같은 커밋에서 `set`/`deleteProperty` trap 부재로 기존 키 덮어쓰기가 유실되던 별개
|
|
54
|
+
* 결함도 함께 고쳤다.
|
|
55
|
+
*
|
|
56
|
+
* ### 소비처 영향: 없음
|
|
57
|
+
*
|
|
58
|
+
* 공개 API·설정·타입 변경 없음. 소비처가 고칠 것은 없다. 다만 grid 인스턴스를 deep
|
|
59
|
+
* reactive 에 보관하는 것은 여전히 권장되지 않는다(행마다 불필요한 reactive 변환 비용).
|
|
60
|
+
* `shallowRef`/`markRaw` 사용을 권한다.
|
|
61
|
+
*
|
|
62
|
+
* ⚠️ **콘솔 경고는 신뢰할 수 없었다.** 구 `warnReactiveWrapOnce` 는 `receiver !== proxy` 로
|
|
63
|
+
* 감지했는데, 행 객체가 이미 `values` 로 치환된 뒤에는 lazy proxy 를 아예 거치지 않아
|
|
64
|
+
* 경고가 **한 번도 안 뜬 채** 증상이 났다. 이 수정에서 해당 감지 로직은 제거되었다
|
|
65
|
+
* (보호가 구조적으로 보장되므로 경고 자체가 불필요해졌다).
|
|
66
|
+
*
|
|
67
|
+
* ---
|
|
68
|
+
* ### 사용법 (회귀 감시)
|
|
69
|
+
* 1. `[① raw 인스턴스로 생성]` — 정상이어야 한다.
|
|
70
|
+
* 2. `[② reactive(grid) 로 생성]` — **정상이어야 한다** (수정 전 재현 지점).
|
|
71
|
+
* 3. `[③ 가로 스크롤 흔들기]` — 정상 유지.
|
|
72
|
+
*/
|
|
73
|
+
declare const meta: Meta;
|
|
74
|
+
export default meta;
|
|
75
|
+
type Story = StoryObj;
|
|
76
|
+
export declare const RowFieldCellsGoBlank: Story;
|
|
77
|
+
/**
|
|
78
|
+
* **소비처 실제 패턴 재현** — 스마트리포트 `SmartReportComponentMozPivot.vue`
|
|
79
|
+
*
|
|
80
|
+
* 실측으로 확인한 재현 조건은 `reactive(grid)` 를 직접 부르는 것이 아니라,
|
|
81
|
+
* **`@ready` 로 받은 인스턴스를 deep `ref` 에 보관하고 그 참조로 API 를 부르는 것**이다.
|
|
82
|
+
*
|
|
83
|
+
* ```ts
|
|
84
|
+
* // plugin-systems/smart-report/.../SmartReportComponentMozPivot.vue:433
|
|
85
|
+
* const gridInstance = ref<any>(null); // ← deep ref (shallowRef 아님)
|
|
86
|
+
* const onReady = (grid: any) => { gridInstance.value = grid; };
|
|
87
|
+
* // 이후 ConfigManager/pivotConfigModule 등이 gridInstance.value 로 API 호출
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* `ref()` 는 대입되는 객체를 `reactive()` 로 변환하므로 `gridInstance.value` 는 프록시다.
|
|
91
|
+
* 같은 파일이 `mozGridRef` 도 `ref` 로 잡고 `defineExpose` 로 외부에 노출하므로
|
|
92
|
+
* 상위 컴포넌트(DataInterface/ConfigManager)에서도 같은 프록시 경로를 탄다.
|
|
93
|
+
*
|
|
94
|
+
* ### [사실] 실측 — 수정 전 코드 기준 (jsdom, 30행 피벗)
|
|
95
|
+
*
|
|
96
|
+
* | 보관 방식 | `isReactive` | 초기 렌더 | `api.refresh()` 후 |
|
|
97
|
+
* |---|---|---|---|
|
|
98
|
+
* | `shallowRef(grid)` | false | region 3/3, product 15/15 | **3/3, 15/15** 정상 |
|
|
99
|
+
* | **`ref(grid)`** (스마트리포트) | **true** | region 3/3, product 15/15 | **0/3, 0/15** ❌ |
|
|
100
|
+
*
|
|
101
|
+
* **초기 렌더는 정상이고 재렌더에서 무너진다** — 제보의 "메뉴 진입 시 데이터가 표현되지
|
|
102
|
+
* 않는다" 및 "가로 스크롤하면 나온다" 와 일치한다.
|
|
103
|
+
*
|
|
104
|
+
* 레포의 다른 스토리들이 이 결함을 못 잡았던 이유도 여기 있다 — 전부 `shallowRef` 를
|
|
105
|
+
* 쓴다(`grep 'coreConfig = ' src/stories/` 기준 전건). 소비처만 `ref` 였다.
|
|
106
|
+
*
|
|
107
|
+
* ### 수정 후
|
|
108
|
+
*
|
|
109
|
+
* 두 방식 모두 `region 3/3, product 15/15` 정상. 소비처가 코드를 고칠 필요는 없다.
|
|
110
|
+
* 다만 `shallowRef` 가 여전히 권장된다 — 행마다 불필요한 reactive 변환 비용이 없다.
|
|
111
|
+
*
|
|
112
|
+
* ### 사용법 (회귀 감시)
|
|
113
|
+
* 1. `[A] ref 에 보관만` — 정상.
|
|
114
|
+
* 2. `[B] rx.loadData + rx.refresh` — 정상.
|
|
115
|
+
* 3. `[C] rx.refresh() 단독` — **정상이어야 한다** (수정 전 재현 지점).
|
|
116
|
+
* 4. `[D] rx.sort()` — **정상이어야 한다** (수정 전 재현 지점).
|
|
117
|
+
*/
|
|
118
|
+
export declare const ViaMozGridWrapper: Story;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
/**
|
|
4
|
+
* 행 그룹 집계 — `rowGroupConfig.aggregates` 와 레벨별 `scope` (ITSM-2026-002417).
|
|
5
|
+
*
|
|
6
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
* 설정 모양
|
|
8
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
* ```ts
|
|
10
|
+
* rowGroupConfig: {
|
|
11
|
+
* columns: ['department', 'team'],
|
|
12
|
+
* aggregates: [
|
|
13
|
+
* { column: 'salary', func: 'sum', scope: ['department'] },
|
|
14
|
+
* { column: 'salary', func: 'avg', scope: ['department', 'team'] },
|
|
15
|
+
* { column: 'id', func: 'count' },
|
|
16
|
+
* ],
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* - **항목 하나 = 그룹행의 한 자리.** 같은 컬럼에 함수가 여럿 필요하면 항목을 여럿 둔다.
|
|
21
|
+
* - `func` 는 **항상 명시**한다. (구 `subtotals` 는 컬럼 id 만 담고 함수를 필드의
|
|
22
|
+
* `aggregate` 에서 빌려왔는데, 없으면 조용히 `'sum'` 으로 떨어져 문자열 컬럼에
|
|
23
|
+
* 이상한 값이 나왔다.)
|
|
24
|
+
* - `scope` 는 **그룹 컬럼 id 경로**다. 배열 인덱스가 아니라 경로인 이유는 사용자가
|
|
25
|
+
* 그룹 기준을 재정렬해도 설정이 컬럼을 따라가야 하기 때문이다. 생략하면 전 레벨.
|
|
26
|
+
*
|
|
27
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
28
|
+
* 확인할 것
|
|
29
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
30
|
+
* 1. **부서(1단계) 그룹행** — `급여 (Sum)` 과 `ID (Count)` 가 보인다. `Avg` 는 없다.
|
|
31
|
+
* 2. **팀(2단계) 그룹행** — `급여 (Avg)` 와 `ID (Count)` 가 보인다. `Sum` 은 없다.
|
|
32
|
+
* → `scope` 가 표시 위치만 고르는 게 아니라 **집계 단위**를 정한다.
|
|
33
|
+
* 같은 `salary` 라도 부서 레벨은 부서별 합계, 팀 레벨은 팀별 평균이다.
|
|
34
|
+
* 3. **`scope` 없는 항목**(`id` 의 `count`)은 두 레벨 **모두**에 나타난다.
|
|
35
|
+
* 4. 그룹을 접었다 펴도 각 레벨의 집계가 그대로 유지된다.
|
|
36
|
+
*/
|
|
37
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
38
|
+
export default meta;
|
|
39
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
40
|
+
/** 부서 → 팀 2단 그룹. 레벨마다 다른 집계를 건다. */
|
|
41
|
+
export declare const LevelScopedAggregates: Story;
|
|
42
|
+
/**
|
|
43
|
+
* 초기 접힘 상태 — `defaultExpandLevel` / `defaultCollapsed`.
|
|
44
|
+
*
|
|
45
|
+
* `TreeConfig` 의 같은 이름 옵션과 대칭이다. 통합 전에는 선언만 있고 **읽는 코드가 0건**인
|
|
46
|
+
* 죽은 옵션이었다(트리에서는 동작해서 되는 줄 알기 쉬웠다).
|
|
47
|
+
*
|
|
48
|
+
* ### 확인할 것
|
|
49
|
+
* 1. 처음 렌더에서 **부서 + 팀 그룹행까지** 펼쳐져 보인다(`defaultExpandLevel: 1`).
|
|
50
|
+
* 팀 아래 데이터 행은 접혀 있다.
|
|
51
|
+
* 2. 팀을 펼치면 사원 데이터 행이 나온다.
|
|
52
|
+
* 3. 펼친 뒤 정렬·필터를 걸어도 **사용자가 펼친 상태가 유지된다**
|
|
53
|
+
* (초기 상태는 첫 렌더/설정 변경 시에만 적용된다).
|
|
54
|
+
*
|
|
55
|
+
* `defaultExpandLevel: 0` 이면 부서만, `defaultCollapsed: true` 면 전 레벨이 접힌다(이쪽이 우선).
|
|
56
|
+
*/
|
|
57
|
+
export declare const InitiallyCollapsed: Story;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
6
|
+
/** 기존 story ID(grid-rowgroupdisabled--disabled)를 유지한다. */
|
|
7
|
+
export declare const Disabled: Story;
|
|
8
|
+
export declare const LayoutDisabled: Story;
|
|
9
|
+
export declare const FormatDisabled: Story;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import { default as MozGrid } from '../MozGrid.vue';
|
|
3
|
+
declare const meta: Meta<typeof MozGrid>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MozGrid>;
|
|
6
|
+
/** 기본 OFF. 컬럼 옵션 → 집계 → Footer 표시를 켜서 확인한다. */
|
|
7
|
+
export declare const DefaultOff: Story;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataLoader } from '
|
|
1
|
+
import { DataLoader } from '../../../../moz-ui-grid-core/src/index.ts';
|
|
2
2
|
/** DataLoader.fetchData()가 반환하는 데이터 행 타입 */
|
|
3
3
|
type DataRow = Record<string, any>;
|
|
4
4
|
export default class LocalDataLoader extends DataLoader {
|
|
@@ -41,25 +41,25 @@ export declare function generateTreeData(): ({
|
|
|
41
41
|
department: string;
|
|
42
42
|
salary: number;
|
|
43
43
|
})[];
|
|
44
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* 피벗 스토리용 사용 가능한 필드 정의 — **원본 컬럼 목록(카탈로그)**.
|
|
46
|
+
*
|
|
47
|
+
* 🚨 여기에는 배치 결과를 넣지 않는다. `{ field:'sales', aggregate:'sum', header:'매출 합계' }`
|
|
48
|
+
* 같은 항목은 "매출을 합계로 **배치한** 결과"이지 원본에 있는 컬럼이 아니다. 카탈로그에
|
|
49
|
+
* 섞이면 좌측 소스 필드 목록에 같은 field 가 여러 번 나오는데, 카탈로그 항목에는 배치 id 가
|
|
50
|
+
* 없어(그건 배치의 정체성이다) 그 항목들을 서로 구분할 수 없다.
|
|
51
|
+
* 집계 배치는 스토리의 `valueFields` 에 선언한다(예: MozGrid.stories 의 LargePivot).
|
|
52
|
+
*
|
|
53
|
+
* 항목은 `generateSalesData` 가 만드는 키와 1:1 이다.
|
|
54
|
+
*/
|
|
45
55
|
export declare const salesAvailableFields: ({
|
|
46
56
|
field: string;
|
|
47
57
|
header: string;
|
|
48
58
|
dataType: "number";
|
|
49
|
-
aggregate?: undefined;
|
|
50
|
-
width?: undefined;
|
|
51
59
|
} | {
|
|
52
60
|
field: string;
|
|
53
61
|
header: string;
|
|
54
62
|
dataType: "string";
|
|
55
|
-
aggregate?: undefined;
|
|
56
|
-
width?: undefined;
|
|
57
|
-
} | {
|
|
58
|
-
field: string;
|
|
59
|
-
aggregate: string;
|
|
60
|
-
header: string;
|
|
61
|
-
width: number;
|
|
62
|
-
dataType: "number";
|
|
63
63
|
})[];
|
|
64
64
|
export declare function generateSalesData(count?: number): {
|
|
65
65
|
id: number;
|