@axboot-mcp/mcp-server 1.0.0
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/CLAUDE.md +119 -0
- package/MCP_TOOL_PLAN.md +710 -0
- package/MCP_USAGE.md +914 -0
- package/README.md +168 -0
- package/REPOSITORY_CONVENTIONS.md +250 -0
- package/SEARCH_PARAMS_MCP_TOOL_COMPLETE_PLAN.md +646 -0
- package/SEARCH_PARAMS_PLAN.md +2570 -0
- package/STORE_PATTERNS.md +1178 -0
- package/debug-dto.js +72 -0
- package/generate-banner-store.js +62 -0
- package/generation-plan.json +2176 -0
- package/generation-results.json +1817 -0
- package/package.json +45 -0
- package/scripts/batch-generate-all.js +159 -0
- package/scripts/batch-generate-mcp.js +329 -0
- package/scripts/batch-generate-stores-v2.js +272 -0
- package/scripts/batch-generate-stores.js +179 -0
- package/scripts/batch-plan.json +3810 -0
- package/scripts/batch-process.py +90 -0
- package/scripts/batch-regenerate.js +356 -0
- package/scripts/direct-generate.js +227 -0
- package/scripts/execute-batches.js +1911 -0
- package/scripts/generate-all-stores.js +144 -0
- package/scripts/generate-stores-mcp.js +161 -0
- package/scripts/generate-stores-v2.js +450 -0
- package/scripts/generate-stores-v3.js +412 -0
- package/scripts/generate-stores-v4.js +521 -0
- package/scripts/generate-stores.js +382 -0
- package/scripts/repos-to-process.json +1899 -0
- package/src/config/nh-layout-patterns.ts +166 -0
- package/src/docs/HOOK_GENERATION_PLAN.md +2226 -0
- package/src/docs/NH_STORE_PATTERNS.md +297 -0
- package/src/docs/README.md +216 -0
- package/src/docs/index.ts +28 -0
- package/src/docs/loader.ts +568 -0
- package/src/docs/patterns.json +419 -0
- package/src/docs/practical-examples.md +732 -0
- package/src/docs/quick-start.md +257 -0
- package/src/docs/requirements-analysis-guide.md +364 -0
- package/src/docs/rules.json +321 -0
- package/src/docs/store-pattern-analysis.md +664 -0
- package/src/docs/store-patterns-rules.md +1168 -0
- package/src/docs/store-patterns-usage-guide.md +1835 -0
- package/src/docs/troubleshooting.md +544 -0
- package/src/docs/type-selection-guide.md +572 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/AntD-/354/273/264/355/217/254/353/204/214/355/212/270-/354/202/254/354/232/251/353/262/225.md +1515 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/DataGrid-/354/202/254/354/232/251/353/262/225.md +866 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/FormItem-/354/202/254/354/232/251/353/262/225.md +903 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/FormModal-/354/202/254/354/232/251/353/262/225.md +1155 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/MCP-/353/260/224/354/235/264/353/270/214/354/275/224/353/224/251-/352/260/200/354/235/264/353/223/234.md +1133 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/MSW-Mock-/353/215/260/354/235/264/355/204/260-/354/202/254/354/232/251/353/262/225.md +579 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/Search-/354/273/264/355/217/254/353/204/214/355/212/270-/354/202/254/354/232/251/353/262/225.md +738 -0
- package/src/docs//354/202/254/354/232/251/353/262/225/Store-/355/214/250/355/204/264-/354/202/254/354/232/251/353/262/225.md +1135 -0
- package/src/docs//354/202/254/354/232/251/353/262/225//355/231/224/353/251/264/352/265/254/354/204/261-/355/203/200/354/236/205/353/263/204-/352/260/234/353/260/234/354/210/234/354/204/234.md +1805 -0
- package/src/docs//354/202/254/354/232/251/353/262/225//355/231/224/353/251/264/355/203/200/354/236/205/353/263/204-/352/260/234/353/260/234-/355/224/204/353/241/254/355/224/204/355/212/270-/352/260/200/354/235/264/353/223/234.md +946 -0
- package/src/docs//354/202/254/354/232/251/353/262/225//355/231/225/354/236/245/355/231/224/353/251/264/355/203/200/354/236/205/353/263/204-/354/203/201/354/204/270-/355/224/204/353/241/254/355/224/204/355/212/270/352/260/200/354/235/264/353/223/234.md +2422 -0
- package/src/features/store-features.ts +232 -0
- package/src/handlers/analyze-requirements.ts +403 -0
- package/src/handlers/analyze.ts +1373 -0
- package/src/handlers/generate-from-requirements.ts +250 -0
- package/src/handlers/generate-hook.ts +950 -0
- package/src/handlers/generate-interactive.ts +840 -0
- package/src/handlers/generate-listdatagrid.ts +521 -0
- package/src/handlers/generate-multi-stores.ts +577 -0
- package/src/handlers/generate-requirements-from-layout.ts +160 -0
- package/src/handlers/generate-search-params.ts +717 -0
- package/src/handlers/generate.ts +911 -0
- package/src/handlers/list-templates.ts +104 -0
- package/src/handlers/scan-metadata.ts +485 -0
- package/src/handlers/suggest-layout.ts +326 -0
- package/src/index.ts +959 -0
- package/src/prompts/search-params.md +793 -0
- package/src/templates/index.ts +107 -0
- package/src/templates/unified.ts +462 -0
- package/store-generation-error-patterns.md +225 -0
- package/test/useAgentStore.ts +136 -0
- package/test-server.js +78 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
{
|
|
2
|
+
"requiredImports": [
|
|
3
|
+
{ "from": "@axboot/datagrid", "types": ["AXDGDataItem", "AXDGPage", "AXDGSortParam"] },
|
|
4
|
+
{ "from": "@core/stores/pageStoreActions", "types": ["pageStoreActions"] },
|
|
5
|
+
{ "from": "@core/stores/types", "types": ["PageStoreActions", "StoreActions"] },
|
|
6
|
+
{ "from": "@core/utils/object", "types": ["deleteEmptyValue"] },
|
|
7
|
+
{ "from": "@types", "types": ["ProgramFn"] },
|
|
8
|
+
{ "from": "zustand", "types": ["create"] },
|
|
9
|
+
{ "from": "zustand/middleware", "types": ["subscribeWithSelector"] },
|
|
10
|
+
{ "from": "zustand/shallow", "types": ["shallow"] },
|
|
11
|
+
{ "from": "stores", "types": ["getTabStoreListener"] }
|
|
12
|
+
],
|
|
13
|
+
"interfaceRules": {
|
|
14
|
+
"listRequest": {
|
|
15
|
+
"mustExtend": true,
|
|
16
|
+
"description": "Repository Request 타입을 확장해야 함",
|
|
17
|
+
"validPattern": "interface ListRequest extends PostXXXListRequest { ... }",
|
|
18
|
+
"invalidPattern": "interface ListRequest { ... }"
|
|
19
|
+
},
|
|
20
|
+
"dtoItem": {
|
|
21
|
+
"mustExtend": true,
|
|
22
|
+
"description": "Repository Response 타입을 확장해야 함",
|
|
23
|
+
"validPattern": "interface DtoItem extends XXXRes {}",
|
|
24
|
+
"invalidPattern": "interface DtoItem { ... }"
|
|
25
|
+
},
|
|
26
|
+
"saveRequest": {
|
|
27
|
+
"mustExtend": true,
|
|
28
|
+
"description": "Repository Save Request 타입을 확장해야 함",
|
|
29
|
+
"validPattern": "interface SaveRequest extends PostXXXSaveRequest {}"
|
|
30
|
+
},
|
|
31
|
+
"metadata": {
|
|
32
|
+
"firstField": "programFn",
|
|
33
|
+
"description": "programFn은 항상 첫 번째 필드여야 함",
|
|
34
|
+
"fieldOrder": ["programFn", "listRequestValue", "listColWidths", "listSortParams", "listSelectedRowKey", "checkedRowKeys", "listCheckedKeys", "saveRequestValue", "detail", "selectedItem", "saveRequestValues", "formActive", "flexGrow", "expandedKeys", "activeTabKey"]
|
|
35
|
+
},
|
|
36
|
+
"states": {
|
|
37
|
+
"mustExtend": "MetaData",
|
|
38
|
+
"description": "States는 MetaData를 확장해야 함",
|
|
39
|
+
"validPattern": "interface States extends MetaData { ... }",
|
|
40
|
+
"invalidPattern": "interface States { ... }"
|
|
41
|
+
},
|
|
42
|
+
"actions": {
|
|
43
|
+
"mustExtend": "PageStoreActions<States>",
|
|
44
|
+
"description": "Actions는 PageStoreActions를 확장해야 함",
|
|
45
|
+
"validPattern": "interface Actions extends PageStoreActions<States> { ... }",
|
|
46
|
+
"invalidPattern": "interface Actions { ... }"
|
|
47
|
+
},
|
|
48
|
+
"storeExport": {
|
|
49
|
+
"mustExtend": ["States", "Actions", "PageStoreActions<States>"],
|
|
50
|
+
"validPattern": "export interface xxxStore extends States, Actions, PageStoreActions<States> {}"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"namingRules": {
|
|
54
|
+
"storeInterface": {
|
|
55
|
+
"pattern": "[lowerCamelCase] + 'Store'",
|
|
56
|
+
"valid": ["memberListStore", "productMasterStore", "orderClaimReturnStore", "kdhFinancialHighlightsStore"],
|
|
57
|
+
"invalid": ["MemberListStore", "member_list_store", "Memberliststore"]
|
|
58
|
+
},
|
|
59
|
+
"hook": {
|
|
60
|
+
"pattern": "'use' + [PascalCase] + 'Store'",
|
|
61
|
+
"valid": ["useMemberListStore", "useProductMasterStore", "useOrderClaimReturnStore", "useKdhFinancialHighlightsStore"],
|
|
62
|
+
"invalid": ["usememberListStore", "useMemberlistStore", "memberListStore", "MemberListStore"]
|
|
63
|
+
},
|
|
64
|
+
"actions": {
|
|
65
|
+
"setRequestValue": "set[Target]RequestValue",
|
|
66
|
+
"setData": "set[Target]",
|
|
67
|
+
"setColWidths": "setListColWidths (plural)",
|
|
68
|
+
"setSpinning": "set[Target]Spinning",
|
|
69
|
+
"setSortParams": "setListSortParams (plural)",
|
|
70
|
+
"setChecked": "setChecked[Target]s (plural)",
|
|
71
|
+
"setSelected": "set[Target]Selected",
|
|
72
|
+
"callApi": "call[Target]Api",
|
|
73
|
+
"changePage": "change[Target]Page",
|
|
74
|
+
"setFormActive": "setFormActive, cancelFormActive",
|
|
75
|
+
"setModalOpen": "setModalOpen"
|
|
76
|
+
},
|
|
77
|
+
"states": {
|
|
78
|
+
"requestValue": "[target]RequestValue (singular)",
|
|
79
|
+
"data": "[target]Data (singular)",
|
|
80
|
+
"page": "[target]Page (singular)",
|
|
81
|
+
"spinning": "[target]Spinning (singular)",
|
|
82
|
+
"loading": "[target]Loading (singular)",
|
|
83
|
+
"sortParams": "[target]SortParams (plural)",
|
|
84
|
+
"colWidths": "listColWidths (plural)",
|
|
85
|
+
"selectedRowKey": "listSelectedRowKey (singular)",
|
|
86
|
+
"checkedKeys": "checkedRowKeys (plural)",
|
|
87
|
+
"checkedIndexes": "listCheckedIndexes (plural)",
|
|
88
|
+
"expandedKeys": "expandedKeys (plural)",
|
|
89
|
+
"selectedItem": "selectedItem (singular)"
|
|
90
|
+
},
|
|
91
|
+
"constants": {
|
|
92
|
+
"initialState": "createState",
|
|
93
|
+
"actions": "createActions"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"fieldOrder": {
|
|
97
|
+
"metadata": {
|
|
98
|
+
"groups": [
|
|
99
|
+
{ "name": "system", "fields": ["programFn"] },
|
|
100
|
+
{ "name": "list", "fields": ["listRequestValue", "listColWidths", "listSortParams"] },
|
|
101
|
+
{ "name": "selection", "fields": ["listSelectedRowKey", "listCheckedIndexes", "checkedRowKeys", "listCheckedKeys"] },
|
|
102
|
+
{ "name": "form", "fields": ["saveRequestValue", "detail", "selectedItem", "saveRequestValues"] },
|
|
103
|
+
{ "name": "layout", "fields": ["formActive", "flexGrow"] },
|
|
104
|
+
{ "name": "tree", "fields": ["expandedKeys"] },
|
|
105
|
+
{ "name": "tab", "fields": ["activeTabKey"] }
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"states": {
|
|
109
|
+
"groups": [
|
|
110
|
+
{ "name": "system", "fields": ["routePath"] },
|
|
111
|
+
{ "name": "loading", "fields": ["listSpinning", "excelSpinning", "saveSpinning", "deleteSpinning", "detailSpinning", "detailLoading", "updateSpinning", "copySpinning", "treeSpinning", "summarySpinning", "list01Spinning", "list02Spinning", "spinning"] },
|
|
112
|
+
{ "name": "data", "fields": ["listData", "listPage", "selectedItem", "detail", "list01Data", "list01Page", "list02Data", "list02Page", "treeData", "summaryData"] },
|
|
113
|
+
{ "name": "ui", "fields": ["modalOpen", "formActive", "isDirty", "isFormDirty"] },
|
|
114
|
+
{ "name": "fixed", "fields": ["bbsNo", "cntntsBbsKncd", "reprtTpcd", "langKncd"] }
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
"actions": {
|
|
118
|
+
"groups": [
|
|
119
|
+
{ "name": "setter", "fields": ["setListRequestValue", "setListColWidths", "setListSpinning", "setListSortParams", "setExcelSpinning", "setSaveRequestValue", "setSelectedItem", "setCheckedRowKeys", "setListSelectedRowKey", "setListCheckedIndexes", "setSaveSpinning", "setFlexGrow", "setTreeData", "setExpandedKeys", "setSaveRequestValues", "setCategorySearch", "setIsDirty", "setRequestValue", "setRequest01Value", "setRequest02Value", "setActiveTabKey", "setList01SortParams", "setList02SortParams", "setDetail", "setModalOpen", "setFormValues", "setActiveTabId", "setMdiaClcd", "setDspySortArray", "setSelectedSctnTpcd"] },
|
|
120
|
+
{ "name": "api", "fields": ["callListApi", "callExcelDownloadApi", "callSaveApi", "callDeleteApi", "callTreeApi", "callTreeSaveApi", "callSummaryApi", "callList01Api", "callList02Api", "callChangeStatusApi", "callDataCopyApi", "callDetailApi", "callConfirmApi", "deleteSctnBanner"] },
|
|
121
|
+
{ "name": "page", "fields": ["changeListPage", "changeList01Page", "changeList02Page"] },
|
|
122
|
+
{ "name": "form", "fields": ["cancelFormActive", "setFormActive"] }
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"fileStructure": [
|
|
126
|
+
"imports",
|
|
127
|
+
"interface ListRequest",
|
|
128
|
+
"interface DtoItem",
|
|
129
|
+
"interface SaveRequest (optional)",
|
|
130
|
+
"interface RemoveRequest (optional)",
|
|
131
|
+
"interface MetaData",
|
|
132
|
+
"interface States",
|
|
133
|
+
"interface Actions",
|
|
134
|
+
"const createState",
|
|
135
|
+
"const createActions",
|
|
136
|
+
"export interface xxxStore",
|
|
137
|
+
"export const useXXXStore",
|
|
138
|
+
"useXXXStore.subscribe"
|
|
139
|
+
],
|
|
140
|
+
"createActions": [
|
|
141
|
+
"...pageStoreActions(set, get, { createState })",
|
|
142
|
+
"syncMetadata",
|
|
143
|
+
"onMountApp",
|
|
144
|
+
"setters (alphabetical or grouped)",
|
|
145
|
+
"api calls",
|
|
146
|
+
"page changes",
|
|
147
|
+
"other actions"
|
|
148
|
+
]
|
|
149
|
+
},
|
|
150
|
+
"implementationRules": {
|
|
151
|
+
"callListApi": {
|
|
152
|
+
"mustHave": [
|
|
153
|
+
"duplicateCallPrevention: if (get().listSpinning) return;",
|
|
154
|
+
"spinningSet: set({ listSpinning: true });",
|
|
155
|
+
"tryBlock: try { ... }",
|
|
156
|
+
"paramMerge: const apiParam = { ...get().listRequestValue, ...request };",
|
|
157
|
+
"deleteEmptyValue: await XXXService.postXXXList(deleteEmptyValue({ ...apiParam }));",
|
|
158
|
+
"stateUpdate: set({ listRequestValue: apiParam, listData: ..., listPage: ... });",
|
|
159
|
+
"finallyBlock: finally { set({ listSpinning: false }); }"
|
|
160
|
+
],
|
|
161
|
+
"template": "callListApi: async (request) => {\n if (get().listSpinning) return;\n set({ listSpinning: true });\n\n try {\n const apiParam: ListRequest = { ...get().listRequestValue, ...request };\n const response = await XXXService.postXXXList(\n deleteEmptyValue({ ...apiParam })\n );\n\n set({\n listRequestValue: apiParam,\n listData: response.ds.map((values) => ({ values })),\n listPage: {\n currentPage: response.page.pageNumber ?? 1,\n pageSize: response.page.pageSize ?? 0,\n totalPages: response.page.pageCount ?? 0,\n totalElements: response.page?.totalCount,\n },\n });\n\n return response;\n } finally {\n set({ listSpinning: false });\n }\n},"
|
|
162
|
+
},
|
|
163
|
+
"pageStoreActions": {
|
|
164
|
+
"position": "last",
|
|
165
|
+
"description": "pageStoreActions는 항상 마지막에 위치해야 함",
|
|
166
|
+
"valid": "const createActions = (set, get) => ({ ...otherActions, ...pageStoreActions(set, get, { createState }) });",
|
|
167
|
+
"invalid": "const createActions = (set, get) => ({ ...pageStoreActions(set, get, { createState }), ...otherActions });"
|
|
168
|
+
},
|
|
169
|
+
"subscribe": {
|
|
170
|
+
"position": "afterStoreCreation",
|
|
171
|
+
"description": "subscribe는 항상 Store 생성 후에 위치해야 함",
|
|
172
|
+
"selectorPattern": "MetaData의 모든 필드를 포함해야 함",
|
|
173
|
+
"equalityFn": "shallow",
|
|
174
|
+
"valid": "useXXXStore.subscribe(\n (s): Record<keyof MetaData, any> => ({ ...allMetadataFields... }),\n getTabStoreListener<MetaData>(createState.routePath),\n { equalityFn: shallow },\n);"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"forbiddenPatterns": [
|
|
178
|
+
{
|
|
179
|
+
"name": "StatesDoesNotExtendMetaData",
|
|
180
|
+
"description": "States가 MetaData를 확장하지 않음",
|
|
181
|
+
"invalid": "interface States { routePath?: string; listSpinning: boolean; }",
|
|
182
|
+
"fix": "interface States extends MetaData { routePath?: string; listSpinning: boolean; }"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"name": "PageStoreActionsWrongPosition",
|
|
186
|
+
"description": "pageStoreActions가 잘못된 위치에 배치됨",
|
|
187
|
+
"invalid": "const createActions = (set, get) => ({ ...pageStoreActions(set, get, { createState }), syncMetadata: ... });",
|
|
188
|
+
"fix": "const createActions = (set, get) => ({ syncMetadata: ..., ...pageStoreActions(set, get, { createState }) });"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"name": "MissingListRequestValueUpdate",
|
|
192
|
+
"description": "callListApi에서 listRequestValue를 업데이트하지 않음",
|
|
193
|
+
"invalid": "set({ listData: response.ds.map((values) => ({ values })), listPage: { ... } });",
|
|
194
|
+
"fix": "set({ listRequestValue: apiParam, listData: response.ds.map((values) => ({ values })), listPage: { ... } });"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"name": "MissingDeleteEmptyValue",
|
|
198
|
+
"description": "deleteEmptyValue 미사용",
|
|
199
|
+
"invalid": "await XXXService.postXXXList(apiParam);",
|
|
200
|
+
"fix": "await XXXService.postXXXList(deleteEmptyValue(apiParam));"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"name": "UsingUndefinedStateField",
|
|
204
|
+
"description": "States에 없는 필드를 Actions에서 사용",
|
|
205
|
+
"invalid": "interface States { listSpinning: boolean; } // setSelectedItem uses selectedItem which is not defined",
|
|
206
|
+
"fix": "interface States { listSpinning: boolean; selectedItem?: DtoItem; }"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"name": "MissingShallowEqualityFn",
|
|
210
|
+
"description": "shallow equalityFn 누락",
|
|
211
|
+
"invalid": "useXXXStore.subscribe((s) => ({ ... }), getTabStoreListener<MetaData>(createState.routePath));",
|
|
212
|
+
"fix": "useXXXStore.subscribe((s) => ({ ... }), getTabStoreListener<MetaData>(createState.routePath), { equalityFn: shallow });"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "SubscribeSelectorMetaDataMismatch",
|
|
216
|
+
"description": "Subscribe selector와 MetaData 불일치",
|
|
217
|
+
"invalid": "// MetaData has 4 fields but subscribe only has 2",
|
|
218
|
+
"fix": "subscribe selector must include all MetaData fields"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"name": "MissingSpinningRelease",
|
|
222
|
+
"description": "Spinning 해제 누락",
|
|
223
|
+
"invalid": "callListApi: async (request) => { set({ listSpinning: true }); const response = await ...; set({ listData: ... }); }",
|
|
224
|
+
"fix": "callListApi: async (request) => { set({ listSpinning: true }); try { const response = await ...; set({ listData: ... }); } finally { set({ listSpinning: false }); } }"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"name": "MissingDuplicateCallPrevention",
|
|
228
|
+
"description": "중복 호출 방지 누락",
|
|
229
|
+
"invalid": "callListApi: async (request) => { set({ listSpinning: true }); ... }",
|
|
230
|
+
"fix": "callListApi: async (request) => { if (get().listSpinning) return; set({ listSpinning: true }); ... }"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"name": "ActionsNotExtendingPageStoreActions",
|
|
234
|
+
"description": "Actions가 PageStoreActions를 확장하지 않음",
|
|
235
|
+
"invalid": "interface Actions { setListRequestValue: ...; }",
|
|
236
|
+
"fix": "interface Actions extends PageStoreActions<States> { setListRequestValue: ...; }"
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
"dependencies": {
|
|
240
|
+
"fieldGroups": {
|
|
241
|
+
"basicList": ["listRequestValue", "listColWidths", "listSortParams", "listSpinning", "listData", "listPage", "callListApi", "changeListPage"],
|
|
242
|
+
"excel": ["excelSpinning", "setExcelSpinning", "callExcelDownloadApi"],
|
|
243
|
+
"detailForm": ["saveRequestValue", "selectedItem", "setSelectedItem", "setSaveRequestValue"],
|
|
244
|
+
"singleSelection": ["listSelectedRowKey", "setListSelectedRowKey"],
|
|
245
|
+
"multiSelectionCheckbox": ["checkedRowKeys", "setCheckedRowKeys"],
|
|
246
|
+
"multiSelectionIndex": ["listCheckedIndexes", "setListCheckedIndexes"],
|
|
247
|
+
"crudSave": ["saveSpinning", "setSaveSpinning", "saveRequestValue", "callSaveApi"],
|
|
248
|
+
"crudDelete": ["deleteSpinning", "callDeleteApi"],
|
|
249
|
+
"crudForm": ["formActive", "setFormActive", "cancelFormActive"],
|
|
250
|
+
"modal": ["modalOpen", "setModalOpen"],
|
|
251
|
+
"tree": ["treeSpinning", "treeData", "expandedKeys", "callTreeApi"],
|
|
252
|
+
"dashboard": ["summaryRequestValue", "summaryData", "callSummaryApi"]
|
|
253
|
+
},
|
|
254
|
+
"actionDependencies": {
|
|
255
|
+
"callExcelDownloadApi": ["excelSpinning", "setExcelSpinning"],
|
|
256
|
+
"setSelectedItem": ["selectedItem", "detailLoading"],
|
|
257
|
+
"callSaveApi": ["saveSpinning", "saveRequestValue"],
|
|
258
|
+
"callDeleteApi": ["deleteSpinning"],
|
|
259
|
+
"setListSelectedRowKey": ["listSelectedRowKey"],
|
|
260
|
+
"setCheckedRowKeys": ["checkedRowKeys"],
|
|
261
|
+
"setExpandedKeys": ["expandedKeys"],
|
|
262
|
+
"changeListPage": ["callListApi"],
|
|
263
|
+
"setFormActive": ["formActive"]
|
|
264
|
+
},
|
|
265
|
+
"mutuallyExclusive": [
|
|
266
|
+
{
|
|
267
|
+
"group": "dataSource",
|
|
268
|
+
"fields": ["listData", "treeData"],
|
|
269
|
+
"description": "listData와 treeData는 함께 사용할 수 없음"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"group": "spinning",
|
|
273
|
+
"fields": ["listSpinning", "treeSpinning"],
|
|
274
|
+
"description": "listSpinning과 treeSpinning은 함께 사용할 수 없음"
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
},
|
|
278
|
+
"checklist": {
|
|
279
|
+
"interface": [
|
|
280
|
+
"ListRequest가 Repository Request를 확장함",
|
|
281
|
+
"DtoItem가 Repository Response를 확장함",
|
|
282
|
+
"SaveRequest가 Repository Save Request를 확장함 (필요시)",
|
|
283
|
+
"MetaData에 필요한 필드가 모두 포함됨",
|
|
284
|
+
"States가 MetaData를 확장함",
|
|
285
|
+
"Actions가 PageStoreActions<States>를 확장함"
|
|
286
|
+
],
|
|
287
|
+
"createState": [
|
|
288
|
+
"listRequestValue에 pageNumber, pageSize 초기값 포함",
|
|
289
|
+
"listColWidths가 빈 배열로 초기화됨",
|
|
290
|
+
"listSortParams가 빈 배열로 초기화됨",
|
|
291
|
+
"listSpinning이 false로 초기화됨",
|
|
292
|
+
"listData가 빈 배열로 초기화됨",
|
|
293
|
+
"listPage가 빈 페이지 상태로 초기화됨",
|
|
294
|
+
"고정값이 필요한 경우 상수로 선언되고 포함됨"
|
|
295
|
+
],
|
|
296
|
+
"createActions": [
|
|
297
|
+
"syncMetadata가 구현됨",
|
|
298
|
+
"onMountApp가 구현됨",
|
|
299
|
+
"setListRequestValue가 구현됨",
|
|
300
|
+
"setListColWidths가 구현됨",
|
|
301
|
+
"setListSpinning가 구현됨",
|
|
302
|
+
"setListSortParams가 구현됨",
|
|
303
|
+
"callListApi가 구현됨 (중복 호출 방지, try-finally 포함)",
|
|
304
|
+
"changeListPage가 구현됨",
|
|
305
|
+
"callListApi에서 deleteEmptyValue 사용됨",
|
|
306
|
+
"callListApi에서 listRequestValue 업데이트됨",
|
|
307
|
+
"추가 기능의 액션들이 모두 구현됨",
|
|
308
|
+
"...pageStoreActions(set, get, { createState })가 마지막에 있음"
|
|
309
|
+
],
|
|
310
|
+
"storeExport": [
|
|
311
|
+
"xxxStore 인터페이스가 States, Actions, PageStoreActions<States>를 모두 확장함",
|
|
312
|
+
"useXXXStore가 subscribeWithSelector로 생성됨"
|
|
313
|
+
],
|
|
314
|
+
"subscribe": [
|
|
315
|
+
"subscribe가 Store 생성 후에 위치함",
|
|
316
|
+
"Selector가 MetaData의 모든 필드를 포함함",
|
|
317
|
+
"getTabStoreListener<MetaData>가 사용됨",
|
|
318
|
+
"{ equalityFn: shallow }가 포함됨"
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
}
|