@dssp/dkpi 1.0.0-alpha.40 → 1.0.0-alpha.47

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.
Files changed (92) hide show
  1. package/dist-client/components/{pagenation.d.ts → sv-pagenation-control.d.ts} +1 -1
  2. package/dist-client/components/{pagenation.js → sv-pagenation-control.js} +10 -10
  3. package/dist-client/components/sv-pagenation-control.js.map +1 -0
  4. package/dist-client/icons/menu-icons.d.ts +6 -0
  5. package/dist-client/icons/menu-icons.js +42 -0
  6. package/dist-client/icons/menu-icons.js.map +1 -1
  7. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +58 -0
  8. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +731 -0
  9. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
  10. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
  11. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +76 -0
  12. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
  13. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +69 -0
  14. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +385 -0
  15. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
  16. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
  17. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +174 -0
  18. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
  19. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +41 -0
  20. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +191 -0
  21. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
  22. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
  23. package/dist-client/pages/kpi-value/kpi-value-importer.js +93 -0
  24. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
  25. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +72 -0
  26. package/dist-client/pages/kpi-value/kpi-value-list-page.js +465 -0
  27. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
  28. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +12 -0
  29. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +274 -0
  30. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -0
  31. package/dist-client/pages/project-complete-tabs/pc-tab2-final.d.ts +11 -0
  32. package/dist-client/pages/project-complete-tabs/pc-tab2-final.js +277 -0
  33. package/dist-client/pages/project-complete-tabs/pc-tab2-final.js.map +1 -0
  34. package/dist-client/pages/project-complete-tabs/pc-tab3-rating.d.ts +10 -0
  35. package/dist-client/pages/project-complete-tabs/pc-tab3-rating.js +230 -0
  36. package/dist-client/pages/project-complete-tabs/pc-tab3-rating.js.map +1 -0
  37. package/dist-client/pages/project-complete-tabs/pc-tab4-upload.d.ts +13 -0
  38. package/dist-client/pages/project-complete-tabs/pc-tab4-upload.js +217 -0
  39. package/dist-client/pages/project-complete-tabs/pc-tab4-upload.js.map +1 -0
  40. package/dist-client/pages/sv-project-complete.d.ts +26 -0
  41. package/dist-client/pages/sv-project-complete.js +299 -0
  42. package/dist-client/pages/sv-project-complete.js.map +1 -0
  43. package/dist-client/pages/sv-project-completed-list.d.ts +1 -1
  44. package/dist-client/pages/sv-project-completed-list.js +189 -168
  45. package/dist-client/pages/sv-project-completed-list.js.map +1 -1
  46. package/dist-client/pages/sv-project-detail.d.ts +13 -0
  47. package/dist-client/pages/sv-project-detail.js +486 -0
  48. package/dist-client/pages/sv-project-detail.js.map +1 -0
  49. package/dist-client/pages/sv-project-list.d.ts +6 -1
  50. package/dist-client/pages/sv-project-list.js +201 -186
  51. package/dist-client/pages/sv-project-list.js.map +1 -1
  52. package/dist-client/route.d.ts +1 -1
  53. package/dist-client/route.js +15 -0
  54. package/dist-client/route.js.map +1 -1
  55. package/dist-client/shared/complete-api.d.ts +3 -0
  56. package/dist-client/shared/complete-api.js +83 -0
  57. package/dist-client/shared/complete-api.js.map +1 -0
  58. package/dist-client/shared/func.d.ts +2 -0
  59. package/dist-client/shared/func.js +22 -0
  60. package/dist-client/shared/func.js.map +1 -0
  61. package/dist-client/tsconfig.tsbuildinfo +1 -1
  62. package/dist-client/viewparts/menu-tools.js +1 -0
  63. package/dist-client/viewparts/menu-tools.js.map +1 -1
  64. package/dist-server/index.d.ts +1 -0
  65. package/dist-server/index.js +1 -0
  66. package/dist-server/index.js.map +1 -1
  67. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +10 -0
  68. package/dist-server/scripts/propagate-parent-kpi-values.js +440 -0
  69. package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -0
  70. package/dist-server/service/index.d.ts +6 -0
  71. package/dist-server/service/index.js +21 -0
  72. package/dist-server/service/index.js.map +1 -0
  73. package/dist-server/service/kpi-metric-value/index.d.ts +4 -0
  74. package/dist-server/service/kpi-metric-value/index.js +8 -0
  75. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  76. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +7 -0
  77. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +104 -0
  78. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  79. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +7 -0
  80. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +47 -0
  81. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  82. package/dist-server/service/kpi-value/index.d.ts +3 -0
  83. package/dist-server/service/kpi-value/index.js +7 -0
  84. package/dist-server/service/kpi-value/index.js.map +1 -0
  85. package/dist-server/service/kpi-value/kpi-value-query.d.ts +7 -0
  86. package/dist-server/service/kpi-value/kpi-value-query.js +47 -0
  87. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  88. package/dist-server/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +7 -3
  90. package/schema.graphql +2122 -14
  91. package/things-factory.config.js +3 -1
  92. package/dist-client/components/pagenation.js.map +0 -1
@@ -1,17 +1,21 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@material/web/icon/icon.js';
3
- import '../components/pagenation';
4
- import { PageView } from '@operato/shell';
3
+ import { navigate, PageView } from '@operato/shell';
5
4
  import { css, html } from 'lit';
6
5
  import { customElement, state } from 'lit/decorators.js';
7
6
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
8
7
  import { client } from '@operato/graphql';
9
8
  import gql from 'graphql-tag';
9
+ import '../components/sv-pagenation-control';
10
10
  export var ProjectState;
11
11
  (function (ProjectState) {
12
12
  ProjectState["ONGOING"] = "10";
13
13
  ProjectState["COMPLETED"] = "20";
14
14
  })(ProjectState || (ProjectState = {}));
15
+ export const PROJECT_STATE = {
16
+ [ProjectState.ONGOING]: '진행중',
17
+ [ProjectState.COMPLETED]: '완료'
18
+ };
15
19
  export var BuildingInspectionStatus;
16
20
  (function (BuildingInspectionStatus) {
17
21
  BuildingInspectionStatus["WAIT"] = "WAIT";
@@ -56,83 +60,64 @@ let SvProjectListPage = class SvProjectListPage extends ScopedElementsMixin(Page
56
60
  var _a;
57
61
  return html `
58
62
  <div header>
59
- <md-filled-text-field
60
- name="projectName"
61
- type="search"
62
- label="프로젝트명"
63
- .value=${this.projectName}
64
- @input=${this._onInputChange}
65
- @keypress=${this._onKeypress}
66
- >
67
- <md-icon slot="leading-icon">search</md-icon>
68
- </md-filled-text-field>
63
+ <div search>
64
+ <md-icon>manage_search</md-icon>
65
+ <input
66
+ type="search"
67
+ name="projectName"
68
+ placeholder="프로젝트명"
69
+ .value=${this.projectName}
70
+ @input=${this._onInputChange}
71
+ @keypress=${this._onKeypress}
72
+ />
73
+ </div>
69
74
 
70
- <strong>총 ${this.projectCount}개</strong>
75
+ <span class="spacer"></span>
76
+ <div count>총 ${this.projectCount}건</div>
71
77
  </div>
72
78
 
73
- <div body>
74
- ${(_a = this.projectList) === null || _a === void 0 ? void 0 : _a.map((project) => {
75
- var _a, _b, _c, _d;
79
+ <div table>
80
+ <div table-header>
81
+ <div col></div>
82
+ <div col>현장상태</div>
83
+ <div col>현장정보</div>
84
+ <div col>기타정보</div>
85
+ <div col>입력요청</div>
86
+ <div col>종합KPI</div>
87
+ </div>
88
+ <div table-body>
89
+ ${(_a = this.projectList) === null || _a === void 0 ? void 0 : _a.map((project) => {
90
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
91
+ const areaText = `연면적 : ${((_b = (_a = project === null || project === void 0 ? void 0 : project.buildingComplex) === null || _a === void 0 ? void 0 : _a.area) === null || _b === void 0 ? void 0 : _b.toLocaleString()) || '-'} ㎡`;
92
+ const costText = `공사비 : ${((_d = (_c = project === null || project === void 0 ? void 0 : project.buildingComplex) === null || _c === void 0 ? void 0 : _c.constructionCost) === null || _d === void 0 ? void 0 : _d.toLocaleString()) || '-'} 원`;
93
+ const householdCountText = `세대수 : ${((_f = (_e = project === null || project === void 0 ? void 0 : project.buildingComplex) === null || _e === void 0 ? void 0 : _e.householdCount) === null || _f === void 0 ? void 0 : _f.toLocaleString()) || '-'} 세대`;
76
94
  return html `
77
- <div project-container>
78
- <a href=${`kpi-dashboard?projectId=${project.id}`}>
79
- <img
80
- ?no-image=${!((_a = project.mainPhoto) === null || _a === void 0 ? void 0 : _a.fullpath)}
81
- project-img
82
- src=${((_b = project.mainPhoto) === null || _b === void 0 ? void 0 : _b.fullpath) || '/assets/images/no-image.png'}
83
- />
84
-
85
- <span project-info>
86
- <div name>${project.name}</div>
87
- <div content>${project.buildingComplex.address}</div>
88
- <div content>면적: ${((_d = (_c = project.buildingComplex) === null || _c === void 0 ? void 0 : _c.area) === null || _d === void 0 ? void 0 : _d.toLocaleString()) || ''}㎡</div>
89
- <div content>착공~준공: ${project.startDate} ~ ${project.endDate}</div>
90
- <div content>발주처: <strong>${project.buildingComplex.clientCompany}</strong></div>
91
- </span>
92
-
93
- <span project-state>
94
- <div progress>
95
- <md-linear-progress buffer="100" max="100" value=${project.totalProgress || 0}> </md-linear-progress>
96
- <span>전체</span>
97
- <span>${project.totalProgress || 0}%</span>
98
- </div>
99
- <div progress>
100
- <md-linear-progress buffer="100" max="100" value=${project.weeklyProgress || 0}> </md-linear-progress>
101
- <span>주간</span>
102
- <span>${project.weeklyProgress || 0}%</span>
103
- </div>
104
- <div progress>
105
- <md-linear-progress buffer="100" max="100" value=${project.kpi || 0}> </md-linear-progress>
106
- <span>KPI</span>
107
- <span>${project.kpi || 0}%</span>
108
- </div>
109
- <div progress>
110
- <md-linear-progress buffer="100" max="100" value=${project.inspPassRate || 0}> </md-linear-progress>
111
- <span>Inspection Passing Rate</span>
112
- <span>${project.inspPassRate || 0}%</span>
113
- </div>
114
- <div progress>
115
- <md-linear-progress buffer="100" max="100" value=${project.robotProgressRate || 0}> </md-linear-progress>
116
- <span>Robot Progress</span>
117
- <span>${project.robotProgressRate || 0}%</span>
118
- </div>
119
- <div progress>
120
- <md-linear-progress buffer="100" max="100" value=${project.structuralSafetyRate || 0}> </md-linear-progress>
121
- <span>Structural safety</span>
122
- <span>${project.structuralSafetyRate || 0}%</span>
123
- </div>
124
- </span>
125
- </a>
126
- </div>
127
- `;
95
+ <div tr @click=${() => navigate(`project-detail/${project.id}`)}>
96
+ <div td-pics>
97
+ <img pic src=${((_g = project.mainPhoto) === null || _g === void 0 ? void 0 : _g.fullpath) || '/assets/images/no-image.png'} alt="${project.name}" />
98
+ </div>
99
+ <div td-status>${PROJECT_STATE[project.state]}</div>
100
+ <div td-info>
101
+ <div class="name">${project.name}</div>
102
+ <div class="sub">주소 : ${((_h = project.buildingComplex) === null || _h === void 0 ? void 0 : _h.address) || ''}</div>
103
+ <div class="sub">착공~준공 : ${project.startDate} ~ ${project.endDate}</div>
104
+ </div>
105
+ <div td-etc>${areaText + '\n' + costText + '\n' + householdCountText}</div>
106
+ <div td-request>KPI입력 요청 -</div>
107
+ <div td-kpi>
108
+ <span class="kpi-value">${(_j = project.kpi) !== null && _j !== void 0 ? _j : 0}</span>
109
+ </div>
110
+ </div>
111
+ `;
128
112
  })}
113
+ </div>
129
114
  </div>
130
- <pagenation-control
115
+ <sv-pagenation-control
131
116
  .currentPage=${this.currentPage}
132
117
  .totalItems=${this.projectCount}
133
118
  .pageLimit=${this.pageLimit}
134
119
  @page-change=${(e) => this._changePage(e.detail.page)}
135
- ></pagenation-control>
120
+ ></sv-pagenation-control>
136
121
  `;
137
122
  }
138
123
  async pageUpdated(changes, lifecycle) {
@@ -149,6 +134,7 @@ let SvProjectListPage = class SvProjectListPage extends ScopedElementsMixin(Page
149
134
  items {
150
135
  id
151
136
  name
137
+ state
152
138
  startDate
153
139
  endDate
154
140
  mainPhoto {
@@ -164,6 +150,8 @@ let SvProjectListPage = class SvProjectListPage extends ScopedElementsMixin(Page
164
150
  address
165
151
  area
166
152
  clientCompany
153
+ constructionCost
154
+ householdCount
167
155
  }
168
156
  }
169
157
  total
@@ -172,16 +160,8 @@ let SvProjectListPage = class SvProjectListPage extends ScopedElementsMixin(Page
172
160
  `,
173
161
  variables: {
174
162
  filters: [
175
- {
176
- name: 'name',
177
- operator: 'search',
178
- value: `%${this.projectName}%`
179
- },
180
- {
181
- name: 'state',
182
- operator: 'eq',
183
- value: ProjectState.ONGOING
184
- }
163
+ { name: 'name', operator: 'search', value: `%${this.projectName}%` },
164
+ { name: 'state', operator: 'eq', value: ProjectState.ONGOING }
185
165
  ],
186
166
  sortings: [{ name: 'createdAt', desc: true }],
187
167
  pagination: { page: this.currentPage, limit: this.pageLimit }
@@ -228,119 +208,154 @@ SvProjectListPage.styles = [
228
208
  --grid-record-emphasized-color: yellow;
229
209
  }
230
210
 
211
+ /* Material Symbols Outlined (stroke style) */
212
+ md-icon {
213
+ font-variation-settings:
214
+ 'FILL' 0,
215
+ 'wght' 400,
216
+ 'GRAD' 0,
217
+ 'opsz' 24;
218
+ }
219
+
220
+ /* Search bar (Figma: content > search bar) */
231
221
  div[header] {
232
222
  display: flex;
233
223
  align-items: center;
234
- background-color: #2ea4df1a;
235
- border: 1px solid #2ea4df33;
224
+ gap: 10px;
236
225
  margin: var(--spacing-large, 12px);
237
- margin-bottom: var(--spacing-small, 5px);
238
- padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
239
- border-radius: var(--md-sys-shape-corner-small, 5px);
240
-
241
- md-filled-text-field[type='search'] {
242
- --md-filled-text-field-container-shape: 0px;
243
- --md-sys-color-primary: #2e79be;
244
- --md-sys-color-surface-container-highest: transparent;
245
- --md-filled-text-field-label-text-color: #999999;
246
- }
247
- strong {
248
- flex: 1;
249
- padding-right: var(--spacing-medium, 8px);
250
- text-align: right;
251
- }
252
-
253
- md-elevated-button[add-project] {
254
- font-weight: bold;
255
- font-size: 16px;
256
- margin-left: 17px;
257
- padding: 13px 20px;
258
-
259
- --md-sys-color-surface-container-low: #24be7b;
260
- --md-sys-color-primary: #ffffff;
261
- --md-elevated-button-container-shape: 7px;
262
- }
226
+ margin-bottom: 0;
227
+ padding: 5px 11px;
228
+ border-radius: 7px;
229
+ background-color: rgba(46, 164, 223, 0.1);
230
+ border: 1px solid rgba(46, 164, 223, 0.3);
231
+ }
232
+ div[header] div[search] {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 6px;
236
+ min-width: 186px;
237
+ }
238
+ div[header] div[search] md-icon {
239
+ color: #212529;
240
+ }
241
+ div[header] div[search] input[type='search'] {
242
+ border: none;
243
+ outline: none;
244
+ background: transparent;
245
+ font-size: 16px;
246
+ color: #212529;
247
+ padding: 2px 0;
248
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
249
+ }
250
+ div[header] .spacer {
251
+ flex: 1;
252
+ }
253
+ div[header] div[count] {
254
+ font-size: 16px;
255
+ color: #000000;
256
+ margin-right: 6px;
257
+ }
258
+ div[header] md-icon[view] {
259
+ color: #35618e;
260
+ cursor: pointer;
261
+ }
262
+ div[header] md-icon[add] {
263
+ color: #4cbb49;
264
+ cursor: pointer;
263
265
  }
264
266
 
265
- div[body] {
266
- div[project-container] {
267
- height: 140px;
268
- margin: var(--spacing-large, 12px);
269
- background-color: var(--md-sys-color-on-primary);
270
- border: 1px solid #cccccc80;
271
- border-radius: var(--md-sys-shape-corner-small, 5px);
272
- overflow: hidden;
273
-
274
- & > a {
275
- display: flex;
276
- gap: 0 var(--spacing-large, 12px);
277
- width: 100%;
278
- height: 100%;
279
- text-decoration: none;
280
- color: #000;
281
- }
282
-
283
- img[project-img] {
284
- width: 240px;
285
- background-color: #cccccc80;
286
- }
287
- img[project-img][no-image] {
288
- object-fit: contain;
289
- opacity: 0.5;
290
- }
291
-
292
- span[project-info] {
293
- flex: 0.55;
294
- padding: var(--spacing-small, 4px);
295
- font-size: 14px;
296
-
297
- white-space: nowrap;
298
- overflow: hidden;
299
- text-overflow: ellipsis;
300
-
301
- div[name] {
302
- color: #2e79be;
303
- font-weight: bold;
304
- font-size: 18px;
305
- margin: var(--spacing-small, 4px);
306
- }
307
- }
308
-
309
- span[project-state] {
310
- flex: 0.45;
311
- padding: var(--spacing-medium, 8px);
312
-
313
- & > div {
314
- margin: var(--spacing-tiny, 2px);
315
- }
316
-
317
- div[progress] {
318
- position: relative;
319
-
320
- md-linear-progress {
321
- --md-linear-progress-track-height: 18px;
322
- --md-linear-progress-active-indicator-height: 18px;
323
- --md-linear-progress-track-shape: 5px;
324
- --md-sys-color-primary: #0595e526;
325
- --md-sys-color-surface-container-highest: #0595e52a;
326
- }
327
-
328
- span {
329
- position: absolute;
330
- top: 0;
331
- left: var(--spacing-large, 12px);
332
- font-size: 12px;
333
- font-weight: bold;
334
- color: #2e79be;
335
-
336
- &:last-child {
337
- left: unset;
338
- right: var(--spacing-large, 12px);
339
- }
340
- }
341
- }
342
- }
343
- }
267
+ /* Table (Figma: content > table) */
268
+ div[table] {
269
+ margin: var(--spacing-large, 12px);
270
+ border: 1px solid rgba(0, 0, 0, 0.15);
271
+ border-top: 2px solid #0c4da2;
272
+ border-radius: var(--md-sys-shape-corner-small, 5px);
273
+ overflow: hidden;
274
+ background: #ffffff;
275
+ min-height: fit-content;
276
+ }
277
+ div[table-header] {
278
+ display: grid;
279
+ grid-template-columns: 150px 80px 1fr 220px 150px 100px;
280
+ align-items: center;
281
+ justify-items: center;
282
+ height: 35px;
283
+ background: #f3f3fa;
284
+ padding: 0 25px;
285
+ column-gap: 30px;
286
+ }
287
+ div[table-header] div[col] {
288
+ font-size: 16px;
289
+ color: #212529;
290
+ line-height: 1.875em;
291
+ }
292
+ div[table-body] {
293
+ display: block;
294
+ }
295
+ div[tr] {
296
+ display: grid;
297
+ grid-template-columns: 150px 80px 1fr 220px 150px 100px;
298
+ align-items: center;
299
+ justify-items: center;
300
+ column-gap: 30px;
301
+ padding: 12px 25px;
302
+ background: #ffffff;
303
+ border-top: 1px solid rgba(0, 0, 0, 0.15);
304
+ cursor: pointer;
305
+ }
306
+ /* 좌측 정렬 요구사항 */
307
+ div[td-info],
308
+ div[td-etc] {
309
+ justify-self: start;
310
+ text-align: left;
311
+ }
312
+ div[td-pics] img[pic] {
313
+ width: 150px;
314
+ height: 90px;
315
+ object-fit: cover;
316
+ background: #e5e7eb;
317
+ border-radius: 2px;
318
+ }
319
+ div[td-status] {
320
+ font-weight: 700;
321
+ font-size: 16px;
322
+ color: #4cbb49;
323
+ line-height: 1;
324
+ }
325
+ div[td-info] {
326
+ display: flex;
327
+ flex-direction: column;
328
+ gap: 4px;
329
+ }
330
+ div[td-info] .name {
331
+ font-weight: 700;
332
+ font-size: 14px;
333
+ color: #000000;
334
+ }
335
+ div[td-info] .sub {
336
+ font-size: 14px;
337
+ color: #000000;
338
+ line-height: 1.7;
339
+ }
340
+ div[td-etc] {
341
+ font-size: 16px;
342
+ color: #212529;
343
+ white-space: pre-line;
344
+ }
345
+ div[td-request] {
346
+ font-weight: 700;
347
+ font-size: 16px;
348
+ color: #35618e;
349
+ white-space: pre-line;
350
+ }
351
+ div[td-kpi] {
352
+ display: flex;
353
+ justify-content: flex-end;
354
+ }
355
+ div[td-kpi] .kpi-value {
356
+ font-weight: 700;
357
+ font-size: 22px;
358
+ color: #35618e;
344
359
  }
345
360
  `
346
361
  ];
@@ -1 +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'\nimport '../components/pagenation'\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 @state() private currentPage: number = 1\n\n private readonly pageLimit: number = 20\n\n get totalPages(): number {\n return Math.max(1, Math.ceil((this.projectCount || 0) / this.pageLimit))\n }\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 <pagenation-control\n .currentPage=${this.currentPage}\n .totalItems=${this.projectCount}\n .pageLimit=${this.pageLimit}\n @page-change=${(e: CustomEvent) => this._changePage(e.detail.page)}\n ></pagenation-control>\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!], $sortings: [Sorting!], $pagination: Pagination) {\n projects(filters: $filters, sortings: $sortings, pagination: $pagination) {\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 pagination: { page: this.currentPage, limit: this.pageLimit }\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 if (target.name === 'projectName') {\n this.currentPage = 1\n }\n }\n\n // 검색창에서 엔터입력시 검색\n private _onKeypress(event: KeyboardEvent) {\n if (event.code === 'Enter') {\n this.currentPage = 1\n this.getProjectList()\n }\n }\n\n private _changePage(page: number) {\n const nextPage = Math.min(Math.max(1, page), this.totalPages)\n if (nextPage !== this.currentPage) {\n this.currentPage = nextPage\n this.getProjectList()\n }\n }\n}\n"]}
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 { navigate, 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'\nimport '../components/sv-pagenation-control'\n\nexport enum ProjectState {\n 'ONGOING' = '10',\n 'COMPLETED' = '20'\n}\nexport const PROJECT_STATE = {\n [ProjectState.ONGOING]: '진행중',\n [ProjectState.COMPLETED]: '완료'\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 state: ProjectState\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 /* Material Symbols Outlined (stroke style) */\n md-icon {\n font-variation-settings:\n 'FILL' 0,\n 'wght' 400,\n 'GRAD' 0,\n 'opsz' 24;\n }\n\n /* Search bar (Figma: content > search bar) */\n div[header] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: var(--spacing-large, 12px);\n margin-bottom: 0;\n padding: 5px 11px;\n border-radius: 7px;\n background-color: rgba(46, 164, 223, 0.1);\n border: 1px solid rgba(46, 164, 223, 0.3);\n }\n div[header] div[search] {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 186px;\n }\n div[header] div[search] md-icon {\n color: #212529;\n }\n div[header] div[search] input[type='search'] {\n border: none;\n outline: none;\n background: transparent;\n font-size: 16px;\n color: #212529;\n padding: 2px 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n }\n div[header] .spacer {\n flex: 1;\n }\n div[header] div[count] {\n font-size: 16px;\n color: #000000;\n margin-right: 6px;\n }\n div[header] md-icon[view] {\n color: #35618e;\n cursor: pointer;\n }\n div[header] md-icon[add] {\n color: #4cbb49;\n cursor: pointer;\n }\n\n /* Table (Figma: content > table) */\n div[table] {\n margin: var(--spacing-large, 12px);\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-top: 2px solid #0c4da2;\n border-radius: var(--md-sys-shape-corner-small, 5px);\n overflow: hidden;\n background: #ffffff;\n min-height: fit-content;\n }\n div[table-header] {\n display: grid;\n grid-template-columns: 150px 80px 1fr 220px 150px 100px;\n align-items: center;\n justify-items: center;\n height: 35px;\n background: #f3f3fa;\n padding: 0 25px;\n column-gap: 30px;\n }\n div[table-header] div[col] {\n font-size: 16px;\n color: #212529;\n line-height: 1.875em;\n }\n div[table-body] {\n display: block;\n }\n div[tr] {\n display: grid;\n grid-template-columns: 150px 80px 1fr 220px 150px 100px;\n align-items: center;\n justify-items: center;\n column-gap: 30px;\n padding: 12px 25px;\n background: #ffffff;\n border-top: 1px solid rgba(0, 0, 0, 0.15);\n cursor: pointer;\n }\n /* 좌측 정렬 요구사항 */\n div[td-info],\n div[td-etc] {\n justify-self: start;\n text-align: left;\n }\n div[td-pics] img[pic] {\n width: 150px;\n height: 90px;\n object-fit: cover;\n background: #e5e7eb;\n border-radius: 2px;\n }\n div[td-status] {\n font-weight: 700;\n font-size: 16px;\n color: #4cbb49;\n line-height: 1;\n }\n div[td-info] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n div[td-info] .name {\n font-weight: 700;\n font-size: 14px;\n color: #000000;\n }\n div[td-info] .sub {\n font-size: 14px;\n color: #000000;\n line-height: 1.7;\n }\n div[td-etc] {\n font-size: 16px;\n color: #212529;\n white-space: pre-line;\n }\n div[td-request] {\n font-weight: 700;\n font-size: 16px;\n color: #35618e;\n white-space: pre-line;\n }\n div[td-kpi] {\n display: flex;\n justify-content: flex-end;\n }\n div[td-kpi] .kpi-value {\n font-weight: 700;\n font-size: 22px;\n color: #35618e;\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 @state() private currentPage: number = 1\n\n private readonly pageLimit: number = 20\n\n get totalPages(): number {\n return Math.max(1, Math.ceil((this.projectCount || 0) / this.pageLimit))\n }\n\n render() {\n return html`\n <div header>\n <div search>\n <md-icon>manage_search</md-icon>\n <input\n type=\"search\"\n name=\"projectName\"\n placeholder=\"프로젝트명\"\n .value=${this.projectName}\n @input=${this._onInputChange}\n @keypress=${this._onKeypress}\n />\n </div>\n\n <span class=\"spacer\"></span>\n <div count>총 ${this.projectCount}건</div>\n </div>\n\n <div table>\n <div table-header>\n <div col></div>\n <div col>현장상태</div>\n <div col>현장정보</div>\n <div col>기타정보</div>\n <div col>입력요청</div>\n <div col>종합KPI</div>\n </div>\n <div table-body>\n ${this.projectList?.map((project: Project) => {\n const areaText = `연면적 : ${project?.buildingComplex?.area?.toLocaleString() || '-'} ㎡`\n const costText = `공사비 : ${project?.buildingComplex?.constructionCost?.toLocaleString() || '-'} 원`\n const householdCountText = `세대수 : ${project?.buildingComplex?.householdCount?.toLocaleString() || '-'} 세대`\n\n return html`\n <div tr @click=${() => navigate(`project-detail/${project.id}`)}>\n <div td-pics>\n <img pic src=${project.mainPhoto?.fullpath || '/assets/images/no-image.png'} alt=\"${project.name}\" />\n </div>\n <div td-status>${PROJECT_STATE[project.state]}</div>\n <div td-info>\n <div class=\"name\">${project.name}</div>\n <div class=\"sub\">주소 : ${project.buildingComplex?.address || ''}</div>\n <div class=\"sub\">착공~준공 : ${project.startDate} ~ ${project.endDate}</div>\n </div>\n <div td-etc>${areaText + '\\n' + costText + '\\n' + householdCountText}</div>\n <div td-request>KPI입력 요청 -</div>\n <div td-kpi>\n <span class=\"kpi-value\">${project.kpi ?? 0}</span>\n </div>\n </div>\n `\n })}\n </div>\n </div>\n <sv-pagenation-control\n .currentPage=${this.currentPage}\n .totalItems=${this.projectCount}\n .pageLimit=${this.pageLimit}\n @page-change=${(e: CustomEvent) => this._changePage(e.detail.page)}\n ></sv-pagenation-control>\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!], $sortings: [Sorting!], $pagination: Pagination) {\n projects(filters: $filters, sortings: $sortings, pagination: $pagination) {\n items {\n id\n name\n state\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 constructionCost\n householdCount\n }\n }\n total\n }\n }\n `,\n variables: {\n filters: [\n { name: 'name', operator: 'search', value: `%${this.projectName}%` },\n { name: 'state', operator: 'eq', value: ProjectState.ONGOING }\n ],\n sortings: [{ name: 'createdAt', desc: true }],\n pagination: { page: this.currentPage, limit: this.pageLimit }\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 if (target.name === 'projectName') {\n this.currentPage = 1\n }\n }\n\n // 검색창에서 엔터입력시 검색\n private _onKeypress(event: KeyboardEvent) {\n if (event.code === 'Enter') {\n this.currentPage = 1\n this.getProjectList()\n }\n }\n\n private _changePage(page: number) {\n const nextPage = Math.min(Math.max(1, page), this.totalPages)\n if (nextPage !== this.currentPage) {\n this.currentPage = nextPage\n this.getProjectList()\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- export default function route(page: string): "project-list" | "project-completed-list" | "users" | "/kpi-dashboard-map" | undefined;
1
+ export default function route(page: string): "project-list" | "project-completed-list" | "kpi-value-list" | "kpi-metric-value-list" | "kpi-metric-value-manual-entry" | "users" | "/kpi-dashboard-map" | "project-detail" | "project-complete" | undefined;
@@ -11,6 +11,21 @@ export default function route(page) {
11
11
  case 'project-completed-list':
12
12
  import('./pages/sv-project-completed-list');
13
13
  return page;
14
+ case 'project-detail':
15
+ import('./pages/sv-project-detail');
16
+ return page;
17
+ case 'project-complete':
18
+ import('./pages/sv-project-complete');
19
+ return page;
20
+ case 'kpi-value-list':
21
+ import('./pages/kpi-value/kpi-value-list-page');
22
+ return page;
23
+ case 'kpi-metric-value-list':
24
+ import('./pages/kpi-metric-value/kpi-metric-value-list-page');
25
+ return page;
26
+ case 'kpi-metric-value-manual-entry':
27
+ import('./pages/kpi-metric-value/kpi-metric-value-manual-entry-page');
28
+ return page;
14
29
  }
15
30
  }
16
31
  //# 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,oBAAoB,CAAA;QAE7B,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 '/kpi-dashboard-map'\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"]}
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,oBAAoB,CAAA;QAE7B,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;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,2BAA2B,CAAC,CAAA;YACnC,OAAO,IAAI,CAAA;QAEb,KAAK,kBAAkB;YACrB,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,uCAAuC,CAAC,CAAA;YAC/C,OAAO,IAAI,CAAA;QAEb,KAAK,uBAAuB;YAC1B,MAAM,CAAC,qDAAqD,CAAC,CAAA;YAC7D,OAAO,IAAI,CAAA;QAEb,KAAK,+BAA+B;YAClC,MAAM,CAAC,6DAA6D,CAAC,CAAA;YACrE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case '':\n return '/kpi-dashboard-map'\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 case 'project-detail':\n import('./pages/sv-project-detail')\n return page\n\n case 'project-complete':\n import('./pages/sv-project-complete')\n return page\n\n case 'kpi-value-list':\n import('./pages/kpi-value/kpi-value-list-page')\n return page\n\n case 'kpi-metric-value-list':\n import('./pages/kpi-metric-value/kpi-metric-value-list-page')\n return page\n\n case 'kpi-metric-value-manual-entry':\n import('./pages/kpi-metric-value/kpi-metric-value-manual-entry-page')\n return page\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare const getProject: (projectId: string) => Promise<import("@apollo/client").InteropApolloQueryResult<any>>;
2
+ export declare const updateProjectCompleteStep1: (project: any) => Promise<import("@apollo/client").InteropMutateResult<any>>;
3
+ export declare const getKpiCategories: () => Promise<import("@apollo/client").InteropApolloQueryResult<any>>;