@dssp/dkpi 1.0.0-alpha.12 → 1.0.0-alpha.13

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.
@@ -0,0 +1,339 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import { PageView } from '@operato/shell';
4
+ import { css, html } from 'lit';
5
+ import { customElement, state } from 'lit/decorators.js';
6
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
7
+ import { client } from '@operato/graphql';
8
+ import gql from 'graphql-tag';
9
+ export var ProjectState;
10
+ (function (ProjectState) {
11
+ ProjectState["ONGOING"] = "10";
12
+ ProjectState["COMPLETED"] = "20";
13
+ })(ProjectState || (ProjectState = {}));
14
+ export var BuildingInspectionStatus;
15
+ (function (BuildingInspectionStatus) {
16
+ BuildingInspectionStatus["WAIT"] = "WAIT";
17
+ BuildingInspectionStatus["OVERALL_WAIT"] = "OVERALL_WAIT";
18
+ BuildingInspectionStatus["REQUEST"] = "REQUEST";
19
+ BuildingInspectionStatus["OVERALL_REQUEST"] = "OVERALL_REQUEST";
20
+ BuildingInspectionStatus["PASS"] = "PASS";
21
+ BuildingInspectionStatus["FAIL"] = "FAIL";
22
+ })(BuildingInspectionStatus || (BuildingInspectionStatus = {}));
23
+ export const BUILDING_INSPECTION_STATUS = {
24
+ [BuildingInspectionStatus.WAIT]: '검측 대기',
25
+ [BuildingInspectionStatus.OVERALL_WAIT]: '검측 대기',
26
+ [BuildingInspectionStatus.REQUEST]: '검측 요청',
27
+ [BuildingInspectionStatus.OVERALL_REQUEST]: '검측 요청',
28
+ [BuildingInspectionStatus.PASS]: '합격',
29
+ [BuildingInspectionStatus.FAIL]: '불합격'
30
+ };
31
+ export var ProjectType;
32
+ (function (ProjectType) {
33
+ ProjectType["DSSP"] = "DSSP";
34
+ ProjectType["DCSP"] = "DCSP";
35
+ ProjectType["DKPI"] = "DKPI";
36
+ })(ProjectType || (ProjectType = {}));
37
+ let SvProjectListPage = class SvProjectListPage extends ScopedElementsMixin(PageView) {
38
+ constructor() {
39
+ super(...arguments);
40
+ this.projectName = '';
41
+ this.projectList = [];
42
+ this.projectCount = 0;
43
+ }
44
+ get context() {
45
+ return {
46
+ title: '진행중 프로젝트'
47
+ };
48
+ }
49
+ render() {
50
+ var _a;
51
+ return html `
52
+ <div header>
53
+ <md-filled-text-field
54
+ name="projectName"
55
+ type="search"
56
+ label="프로젝트명"
57
+ .value=${this.projectName}
58
+ @input=${this._onInputChange}
59
+ @keypress=${this._onKeypress}
60
+ >
61
+ <md-icon slot="leading-icon">search</md-icon>
62
+ </md-filled-text-field>
63
+
64
+ <strong>총 ${this.projectCount}개</strong>
65
+ </div>
66
+
67
+ <div body>
68
+ ${(_a = this.projectList) === null || _a === void 0 ? void 0 : _a.map((project) => {
69
+ var _a, _b, _c, _d;
70
+ return html `
71
+ <div project-container>
72
+ <a href=${`kpi-dashboard?projectId=${project.id}`}>
73
+ <img
74
+ ?no-image=${!((_a = project.mainPhoto) === null || _a === void 0 ? void 0 : _a.fullpath)}
75
+ project-img
76
+ src=${((_b = project.mainPhoto) === null || _b === void 0 ? void 0 : _b.fullpath) || '/assets/images/no-image.png'}
77
+ />
78
+
79
+ <span project-info>
80
+ <div name>${project.name}</div>
81
+ <div content>${project.buildingComplex.address}</div>
82
+ <div content>면적: ${((_d = (_c = project.buildingComplex) === null || _c === void 0 ? void 0 : _c.area) === null || _d === void 0 ? void 0 : _d.toLocaleString()) || ''}㎡</div>
83
+ <div content>착공~준공: ${project.startDate} ~ ${project.endDate}</div>
84
+ <div content>발주처: <strong>${project.buildingComplex.clientCompany}</strong></div>
85
+ </span>
86
+
87
+ <span project-state>
88
+ <div progress>
89
+ <md-linear-progress buffer="100" max="100" value=${project.totalProgress || 0}> </md-linear-progress>
90
+ <span>전체</span>
91
+ <span>${project.totalProgress || 0}%</span>
92
+ </div>
93
+ <div progress>
94
+ <md-linear-progress buffer="100" max="100" value=${project.weeklyProgress || 0}> </md-linear-progress>
95
+ <span>주간</span>
96
+ <span>${project.weeklyProgress || 0}%</span>
97
+ </div>
98
+ <div progress>
99
+ <md-linear-progress buffer="100" max="100" value=${project.kpi || 0}> </md-linear-progress>
100
+ <span>KPI</span>
101
+ <span>${project.kpi || 0}%</span>
102
+ </div>
103
+ <div progress>
104
+ <md-linear-progress buffer="100" max="100" value=${project.inspPassRate || 0}> </md-linear-progress>
105
+ <span>Inspection Passing Rate</span>
106
+ <span>${project.inspPassRate || 0}%</span>
107
+ </div>
108
+ <div progress>
109
+ <md-linear-progress buffer="100" max="100" value=${project.robotProgressRate || 0}> </md-linear-progress>
110
+ <span>Robot Progress</span>
111
+ <span>${project.robotProgressRate || 0}%</span>
112
+ </div>
113
+ <div progress>
114
+ <md-linear-progress buffer="100" max="100" value=${project.structuralSafetyRate || 0}> </md-linear-progress>
115
+ <span>Structural safety</span>
116
+ <span>${project.structuralSafetyRate || 0}%</span>
117
+ </div>
118
+ </span>
119
+ </a>
120
+ </div>
121
+ `;
122
+ })}
123
+ </div>
124
+ `;
125
+ }
126
+ async pageUpdated(changes, lifecycle) {
127
+ if (this.active) {
128
+ this.getProjectList();
129
+ }
130
+ }
131
+ async getProjectList() {
132
+ var _a, _b;
133
+ const response = await client.query({
134
+ query: gql `
135
+ query Projects($filters: [Filter!]) {
136
+ projects(filters: $filters) {
137
+ items {
138
+ id
139
+ name
140
+ startDate
141
+ endDate
142
+ mainPhoto {
143
+ fullpath
144
+ }
145
+ totalProgress
146
+ weeklyProgress
147
+ kpi
148
+ inspPassRate
149
+ robotProgressRate
150
+ structuralSafetyRate
151
+ buildingComplex {
152
+ address
153
+ area
154
+ clientCompany
155
+ }
156
+ }
157
+ total
158
+ }
159
+ }
160
+ `,
161
+ variables: {
162
+ filters: [
163
+ {
164
+ name: 'name',
165
+ operator: 'search',
166
+ value: `%${this.projectName}%`
167
+ },
168
+ {
169
+ name: 'state',
170
+ operator: 'eq',
171
+ value: ProjectState.ONGOING
172
+ }
173
+ ],
174
+ sortings: [{ name: 'createdAt', desc: true }]
175
+ }
176
+ });
177
+ this.projectList = ((_a = response.data.projects) === null || _a === void 0 ? void 0 : _a.items) || [];
178
+ this.projectCount = ((_b = response.data.projects) === null || _b === void 0 ? void 0 : _b.total) || 0;
179
+ }
180
+ // Input 요소의 값이 변경될 때 호출되는 콜백 함수
181
+ _onInputChange(event) {
182
+ const target = event.target;
183
+ this[target.name] = target.value;
184
+ }
185
+ // 검색창에서 엔터입력시 검색
186
+ _onKeypress(event) {
187
+ if (event.code === 'Enter') {
188
+ this.getProjectList();
189
+ }
190
+ }
191
+ };
192
+ SvProjectListPage.styles = [
193
+ css `
194
+ :host {
195
+ display: flex;
196
+ flex-direction: column;
197
+ overflow-y: auto;
198
+
199
+ width: 100%;
200
+ height: 100%;
201
+ background-color: var(--md-sys-color-background, #f6f6f6);
202
+
203
+ --grid-record-emphasized-background-color: red;
204
+ --grid-record-emphasized-color: yellow;
205
+ }
206
+
207
+ div[header] {
208
+ display: flex;
209
+ align-items: center;
210
+ background-color: #2ea4df1a;
211
+ border: 1px solid #2ea4df33;
212
+ margin: var(--spacing-large, 12px);
213
+ margin-bottom: var(--spacing-small, 5px);
214
+ padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
215
+ border-radius: var(--md-sys-shape-corner-small, 5px);
216
+
217
+ md-filled-text-field[type='search'] {
218
+ --md-filled-text-field-container-shape: 0px;
219
+ --md-sys-color-primary: #2e79be;
220
+ --md-sys-color-surface-container-highest: transparent;
221
+ --md-filled-text-field-label-text-color: #999999;
222
+ }
223
+ strong {
224
+ flex: 1;
225
+ padding-right: var(--spacing-medium, 8px);
226
+ text-align: right;
227
+ }
228
+
229
+ md-elevated-button[add-project] {
230
+ font-weight: bold;
231
+ font-size: 16px;
232
+ margin-left: 17px;
233
+ padding: 13px 20px;
234
+
235
+ --md-sys-color-surface-container-low: #24be7b;
236
+ --md-sys-color-primary: #ffffff;
237
+ --md-elevated-button-container-shape: 7px;
238
+ }
239
+ }
240
+
241
+ div[body] {
242
+ div[project-container] {
243
+ height: 140px;
244
+ margin: var(--spacing-large, 12px);
245
+ background-color: var(--md-sys-color-on-primary);
246
+ border: 1px solid #cccccc80;
247
+ border-radius: var(--md-sys-shape-corner-small, 5px);
248
+ overflow: hidden;
249
+
250
+ & > a {
251
+ display: flex;
252
+ gap: 0 var(--spacing-large, 12px);
253
+ width: 100%;
254
+ height: 100%;
255
+ text-decoration: none;
256
+ color: #000;
257
+ }
258
+
259
+ img[project-img] {
260
+ width: 240px;
261
+ background-color: #cccccc80;
262
+ }
263
+ img[project-img][no-image] {
264
+ object-fit: contain;
265
+ opacity: 0.5;
266
+ }
267
+
268
+ span[project-info] {
269
+ flex: 0.55;
270
+ padding: var(--spacing-small, 4px);
271
+ font-size: 14px;
272
+
273
+ white-space: nowrap;
274
+ overflow: hidden;
275
+ text-overflow: ellipsis;
276
+
277
+ div[name] {
278
+ color: #2e79be;
279
+ font-weight: bold;
280
+ font-size: 18px;
281
+ margin: var(--spacing-small, 4px);
282
+ }
283
+ }
284
+
285
+ span[project-state] {
286
+ flex: 0.45;
287
+ padding: var(--spacing-medium, 8px);
288
+
289
+ & > div {
290
+ margin: var(--spacing-tiny, 2px);
291
+ }
292
+
293
+ div[progress] {
294
+ position: relative;
295
+
296
+ md-linear-progress {
297
+ --md-linear-progress-track-height: 18px;
298
+ --md-linear-progress-active-indicator-height: 18px;
299
+ --md-linear-progress-track-shape: 5px;
300
+ --md-sys-color-primary: #0595e526;
301
+ --md-sys-color-surface-container-highest: #0595e52a;
302
+ }
303
+
304
+ span {
305
+ position: absolute;
306
+ top: 0;
307
+ left: var(--spacing-large, 12px);
308
+ font-size: 12px;
309
+ font-weight: bold;
310
+ color: #2e79be;
311
+
312
+ &:last-child {
313
+ left: unset;
314
+ right: var(--spacing-large, 12px);
315
+ }
316
+ }
317
+ }
318
+ }
319
+ }
320
+ }
321
+ `
322
+ ];
323
+ __decorate([
324
+ state(),
325
+ __metadata("design:type", String)
326
+ ], SvProjectListPage.prototype, "projectName", void 0);
327
+ __decorate([
328
+ state(),
329
+ __metadata("design:type", Array)
330
+ ], SvProjectListPage.prototype, "projectList", void 0);
331
+ __decorate([
332
+ state(),
333
+ __metadata("design:type", Number)
334
+ ], SvProjectListPage.prototype, "projectCount", void 0);
335
+ SvProjectListPage = __decorate([
336
+ customElement('sv-project-list')
337
+ ], SvProjectListPage);
338
+ export { SvProjectListPage };
339
+ //# sourceMappingURL=sv-project-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sv-project-list.js","sourceRoot":"","sources":["../../client/pages/sv-project-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport gql from 'graphql-tag'\nimport { Attachment } from '@things-factory/attachment-base'\nimport type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\n\nexport enum ProjectState {\n 'ONGOING' = '10',\n 'COMPLETED' = '20'\n}\nexport enum BuildingInspectionStatus {\n WAIT = 'WAIT',\n OVERALL_WAIT = 'OVERALL_WAIT',\n REQUEST = 'REQUEST',\n OVERALL_REQUEST = 'OVERALL_REQUEST',\n PASS = 'PASS',\n FAIL = 'FAIL'\n}\nexport const BUILDING_INSPECTION_STATUS = {\n [BuildingInspectionStatus.WAIT]: '검측 대기',\n [BuildingInspectionStatus.OVERALL_WAIT]: '검측 대기',\n [BuildingInspectionStatus.REQUEST]: '검측 요청',\n [BuildingInspectionStatus.OVERALL_REQUEST]: '검측 요청',\n [BuildingInspectionStatus.PASS]: '합격',\n [BuildingInspectionStatus.FAIL]: '불합격'\n}\n\nexport enum ProjectType {\n DSSP = 'DSSP',\n DCSP = 'DCSP',\n DKPI = 'DKPI'\n}\n\nexport interface Project {\n id?: string\n name: string\n startDate?: string\n endDate?: string\n mainPhoto?: Attachment\n mainPhotoUpload?: FileUpload\n totalProgress?: number\n weeklyProgress?: number\n kpi?: number\n inspPassRate?: number\n robotProgressRate?: number\n structuralSafetyRate?: number\n robotCount?: number\n scheduleTable?: Attachment\n buildingComplex: BuildingComplex\n projectType?: ProjectType\n}\nexport interface BuildingComplex {\n id?: string\n address?: string\n latitude?: number\n longitude?: number\n area?: number\n constructionCompany?: string\n clientCompany?: string\n designCompany?: string\n supervisoryCompany?: string\n drawing?: Attachment\n drawingUpload?: FileUpload\n constructionType?: string\n constructionCost?: number\n etc?: string\n householdCount?: number\n buildingCount?: number\n notice?: string\n planXScale?: number\n planYScale?: number\n overallConstructorEmails?: string[]\n taskConstructorEmails?: string[]\n overallSupervisoryEmails?: string[]\n taskSupervisoryEmails?: string[]\n buildings?: Building[]\n}\nexport interface Building {\n id?: string\n name: string | undefined\n floorCount: number | undefined\n hasBasement?: boolean\n basementFloorCount?: number\n drawing?: Attachment\n drawingUpload?: FileUpload\n buildingLevels?: BuildingLevel[]\n}\n\nexport interface BuildingLevel {\n id?: string\n floor?: number\n floorDisplayName?: string\n mainDrawing?: Attachment\n mainDrawingImage?: string\n mainDrawingThumbnail?: string\n mainDrawingUpload?: FileUpload\n elevationDrawing?: Attachment\n elevationDrawingThumbnail?: string\n elevationDrawingUpload?: FileUpload\n rebarDistributionDrawing?: Attachment\n rebarDistributionDrawingThumbnail?: string\n rebarDistributionDrawingUpload?: FileUpload\n etcDrawings?: Attachment[]\n etcDrawingsUpload?: FileUpload[]\n building?: Building\n buildingInspections?: BuildingInspection[]\n}\n\nexport interface BuildingInspection {\n id?: string\n attatchments?: Attachment[]\n // buildingInspectionAttachments?: BuildingInspectionAttachment[]\n status?: BuildingInspectionStatus\n requestDate?: Date\n buildingLevel?: BuildingLevel\n checklist?: Checklist\n createdAt?: Date\n updatedAt?: Date\n deletedAt?: Date\n}\n\nexport interface Checklist {\n id: string\n name?: string\n documentNo?: string\n constructionType?: string\n constructionDetailType?: string\n location?: string\n constructionInspectorDate?: Date\n supervisorInspectorDate?: Date\n overallConstructorSignature?: string\n taskConstructorSignature?: string\n overallSupervisorySignature?: string\n taskSupervisorySignature?: string\n inspectionParts?: string[]\n // checklistItems?: ChecklistItem[]\n}\n\n@customElement('sv-project-list')\nexport class SvProjectListPage extends ScopedElementsMixin(PageView) {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n\n width: 100%;\n height: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n div[header] {\n display: flex;\n align-items: center;\n background-color: #2ea4df1a;\n border: 1px solid #2ea4df33;\n margin: var(--spacing-large, 12px);\n margin-bottom: var(--spacing-small, 5px);\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n border-radius: var(--md-sys-shape-corner-small, 5px);\n\n md-filled-text-field[type='search'] {\n --md-filled-text-field-container-shape: 0px;\n --md-sys-color-primary: #2e79be;\n --md-sys-color-surface-container-highest: transparent;\n --md-filled-text-field-label-text-color: #999999;\n }\n strong {\n flex: 1;\n padding-right: var(--spacing-medium, 8px);\n text-align: right;\n }\n\n md-elevated-button[add-project] {\n font-weight: bold;\n font-size: 16px;\n margin-left: 17px;\n padding: 13px 20px;\n\n --md-sys-color-surface-container-low: #24be7b;\n --md-sys-color-primary: #ffffff;\n --md-elevated-button-container-shape: 7px;\n }\n }\n\n div[body] {\n div[project-container] {\n height: 140px;\n margin: var(--spacing-large, 12px);\n background-color: var(--md-sys-color-on-primary);\n border: 1px solid #cccccc80;\n border-radius: var(--md-sys-shape-corner-small, 5px);\n overflow: hidden;\n\n & > a {\n display: flex;\n gap: 0 var(--spacing-large, 12px);\n width: 100%;\n height: 100%;\n text-decoration: none;\n color: #000;\n }\n\n img[project-img] {\n width: 240px;\n background-color: #cccccc80;\n }\n img[project-img][no-image] {\n object-fit: contain;\n opacity: 0.5;\n }\n\n span[project-info] {\n flex: 0.55;\n padding: var(--spacing-small, 4px);\n font-size: 14px;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n div[name] {\n color: #2e79be;\n font-weight: bold;\n font-size: 18px;\n margin: var(--spacing-small, 4px);\n }\n }\n\n span[project-state] {\n flex: 0.45;\n padding: var(--spacing-medium, 8px);\n\n & > div {\n margin: var(--spacing-tiny, 2px);\n }\n\n div[progress] {\n position: relative;\n\n md-linear-progress {\n --md-linear-progress-track-height: 18px;\n --md-linear-progress-active-indicator-height: 18px;\n --md-linear-progress-track-shape: 5px;\n --md-sys-color-primary: #0595e526;\n --md-sys-color-surface-container-highest: #0595e52a;\n }\n\n span {\n position: absolute;\n top: 0;\n left: var(--spacing-large, 12px);\n font-size: 12px;\n font-weight: bold;\n color: #2e79be;\n\n &:last-child {\n left: unset;\n right: var(--spacing-large, 12px);\n }\n }\n }\n }\n }\n }\n `\n ]\n\n get context() {\n return {\n title: '진행중 프로젝트'\n }\n }\n\n @state() private projectName: string = ''\n @state() private projectList: Project[] = []\n @state() private projectCount: number = 0\n\n render() {\n return html`\n <div header>\n <md-filled-text-field\n name=\"projectName\"\n type=\"search\"\n label=\"프로젝트명\"\n .value=${this.projectName}\n @input=${this._onInputChange}\n @keypress=${this._onKeypress}\n >\n <md-icon slot=\"leading-icon\">search</md-icon>\n </md-filled-text-field>\n\n <strong>총 ${this.projectCount}개</strong>\n </div>\n\n <div body>\n ${this.projectList?.map((project: Project) => {\n return html`\n <div project-container>\n <a href=${`kpi-dashboard?projectId=${project.id}`}>\n <img\n ?no-image=${!project.mainPhoto?.fullpath}\n project-img\n src=${project.mainPhoto?.fullpath || '/assets/images/no-image.png'}\n />\n\n <span project-info>\n <div name>${project.name}</div>\n <div content>${project.buildingComplex.address}</div>\n <div content>면적: ${project.buildingComplex?.area?.toLocaleString() || ''}㎡</div>\n <div content>착공~준공: ${project.startDate} ~ ${project.endDate}</div>\n <div content>발주처: <strong>${project.buildingComplex.clientCompany}</strong></div>\n </span>\n\n <span project-state>\n <div progress>\n <md-linear-progress buffer=\"100\" max=\"100\" value=${project.totalProgress || 0}> </md-linear-progress>\n <span>전체</span>\n <span>${project.totalProgress || 0}%</span>\n </div>\n <div progress>\n <md-linear-progress buffer=\"100\" max=\"100\" value=${project.weeklyProgress || 0}> </md-linear-progress>\n <span>주간</span>\n <span>${project.weeklyProgress || 0}%</span>\n </div>\n <div progress>\n <md-linear-progress buffer=\"100\" max=\"100\" value=${project.kpi || 0}> </md-linear-progress>\n <span>KPI</span>\n <span>${project.kpi || 0}%</span>\n </div>\n <div progress>\n <md-linear-progress buffer=\"100\" max=\"100\" value=${project.inspPassRate || 0}> </md-linear-progress>\n <span>Inspection Passing Rate</span>\n <span>${project.inspPassRate || 0}%</span>\n </div>\n <div progress>\n <md-linear-progress buffer=\"100\" max=\"100\" value=${project.robotProgressRate || 0}> </md-linear-progress>\n <span>Robot Progress</span>\n <span>${project.robotProgressRate || 0}%</span>\n </div>\n <div progress>\n <md-linear-progress buffer=\"100\" max=\"100\" value=${project.structuralSafetyRate || 0}> </md-linear-progress>\n <span>Structural safety</span>\n <span>${project.structuralSafetyRate || 0}%</span>\n </div>\n </span>\n </a>\n </div>\n `\n })}\n </div>\n `\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (this.active) {\n this.getProjectList()\n }\n }\n\n async getProjectList() {\n const response = await client.query({\n query: gql`\n query Projects($filters: [Filter!]) {\n projects(filters: $filters) {\n items {\n id\n name\n startDate\n endDate\n mainPhoto {\n fullpath\n }\n totalProgress\n weeklyProgress\n kpi\n inspPassRate\n robotProgressRate\n structuralSafetyRate\n buildingComplex {\n address\n area\n clientCompany\n }\n }\n total\n }\n }\n `,\n variables: {\n filters: [\n {\n name: 'name',\n operator: 'search',\n value: `%${this.projectName}%`\n },\n {\n name: 'state',\n operator: 'eq',\n value: ProjectState.ONGOING\n }\n ],\n sortings: [{ name: 'createdAt', desc: true }]\n }\n })\n\n this.projectList = response.data.projects?.items || []\n this.projectCount = response.data.projects?.total || 0\n }\n\n // Input 요소의 값이 변경될 때 호출되는 콜백 함수\n private _onInputChange(event: InputEvent) {\n const target = event.target as HTMLInputElement\n this[target.name] = target.value\n }\n\n // 검색창에서 엔터입력시 검색\n private _onKeypress(event: KeyboardEvent) {\n if (event.code === 'Enter') {\n this.getProjectList()\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- export default function route(page: string): "/dashboard" | "users" | undefined;
1
+ export default function route(page: string): "project-list" | "project-completed-list" | "users" | "/dashboard" | undefined;
@@ -5,6 +5,12 @@ export default function route(page) {
5
5
  case 'users':
6
6
  import('./pages/sv-user-management');
7
7
  return page;
8
+ case 'project-list':
9
+ import('./pages/sv-project-list');
10
+ return page;
11
+ case 'project-completed-list':
12
+ import('./pages/sv-project-completed-list');
13
+ return page;
8
14
  }
9
15
  }
10
16
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,EAAE;YACL,OAAO,YAAY,CAAA;QAErB,KAAK,OAAO;YACV,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case '':\n return '/dashboard'\n\n case 'users':\n import('./pages/sv-user-management')\n return page\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,EAAE;YACL,OAAO,YAAY,CAAA;QAErB,KAAK,OAAO;YACV,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,yBAAyB,CAAC,CAAA;YACjC,OAAO,IAAI,CAAA;QAEb,KAAK,wBAAwB;YAC3B,MAAM,CAAC,mCAAmC,CAAC,CAAA;YAC3C,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case '':\n return '/dashboard'\n\n case 'users':\n import('./pages/sv-user-management')\n return page\n\n case 'project-list':\n import('./pages/sv-project-list')\n return page\n\n case 'project-completed-list':\n import('./pages/sv-project-completed-list')\n return page\n }\n}\n"]}