@dssp/project 1.0.0-alpha.9 → 1.0.0-alpha.92

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 (159) hide show
  1. package/dist-client/index.d.ts +1 -0
  2. package/dist-client/index.js +1 -1
  3. package/dist-client/index.js.map +1 -1
  4. package/dist-client/pages/lib/chatbot-widget.d.ts +53 -0
  5. package/dist-client/pages/lib/chatbot-widget.js +631 -0
  6. package/dist-client/pages/lib/chatbot-widget.js.map +1 -0
  7. package/dist-client/pages/lib/select2-component.d.ts +1 -1
  8. package/dist-client/pages/lib/select2-component.js +35 -35
  9. package/dist-client/pages/lib/select2-component.js.map +1 -1
  10. package/dist-client/pages/project/component/pagenation.d.ts +18 -0
  11. package/dist-client/pages/project/component/pagenation.js +142 -0
  12. package/dist-client/pages/project/component/pagenation.js.map +1 -0
  13. package/dist-client/pages/project/component/project-update-header.js +26 -3
  14. package/dist-client/pages/project/component/project-update-header.js.map +1 -1
  15. package/dist-client/pages/project/popup/checklist/{attachment-list-popup.js → task-checklist-attachment-list-popup.js} +16 -17
  16. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.js.map +1 -0
  17. package/dist-client/pages/project/popup/checklist/{comment-list-popup.js → task-checklist-comment-list-popup.js} +19 -20
  18. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.js.map +1 -0
  19. package/dist-client/pages/project/popup/checklist/{schedule-checklist-create-popup.d.ts → task-checklist-create-popup.d.ts} +0 -1
  20. package/dist-client/pages/project/popup/checklist/{schedule-checklist-create-popup.js → task-checklist-create-popup.js} +40 -42
  21. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.js.map +1 -0
  22. package/dist-client/pages/project/popup/checklist/{schedule-checklist-view.d.ts → task-checklist-view.d.ts} +2 -7
  23. package/dist-client/pages/project/popup/checklist/{schedule-checklist-view.js → task-checklist-view.js} +137 -32
  24. package/dist-client/pages/project/popup/checklist/task-checklist-view.js.map +1 -0
  25. package/dist-client/pages/project/popup/popup-plan-export.js +8 -2
  26. package/dist-client/pages/project/popup/popup-plan-export.js.map +1 -1
  27. package/dist-client/pages/project/popup/{popup-schedule-upload.d.ts → popup-task-upload.d.ts} +1 -1
  28. package/dist-client/pages/project/popup/{popup-schedule-upload.js → popup-task-upload.js} +9 -9
  29. package/dist-client/pages/project/popup/popup-task-upload.js.map +1 -0
  30. package/dist-client/pages/project/project-completed-list.d.ts +5 -0
  31. package/dist-client/pages/project/project-completed-list.js +32 -3
  32. package/dist-client/pages/project/project-completed-list.js.map +1 -1
  33. package/dist-client/pages/project/project-detail.d.ts +6 -0
  34. package/dist-client/pages/project/project-detail.js +225 -89
  35. package/dist-client/pages/project/project-detail.js.map +1 -1
  36. package/dist-client/pages/project/project-list.d.ts +57 -0
  37. package/dist-client/pages/project/project-list.js +80 -9
  38. package/dist-client/pages/project/project-list.js.map +1 -1
  39. package/dist-client/pages/project/project-plan-management.js +6 -1
  40. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  41. package/dist-client/pages/project/project-setting-list.d.ts +7 -0
  42. package/dist-client/pages/project/project-setting-list.js +61 -7
  43. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  44. package/dist-client/pages/project/{project-schedule-list.d.ts → project-task-list.d.ts} +2 -2
  45. package/dist-client/pages/project/{project-schedule-list.js → project-task-list.js} +11 -11
  46. package/dist-client/pages/project/project-task-list.js.map +1 -0
  47. package/dist-client/pages/project/{project-schedule.d.ts → project-task.d.ts} +17 -6
  48. package/dist-client/pages/project/project-task.js +692 -0
  49. package/dist-client/pages/project/project-task.js.map +1 -0
  50. package/dist-client/pages/project/project-update.d.ts +34 -0
  51. package/dist-client/pages/project/project-update.js +508 -35
  52. package/dist-client/pages/project/project-update.js.map +1 -1
  53. package/dist-client/pages/resource/construction-type-management.js +14 -0
  54. package/dist-client/pages/resource/construction-type-management.js.map +1 -1
  55. package/dist-client/pages/resource/resource-list-page.d.ts +1 -2
  56. package/dist-client/pages/resource/resource-list-page.js +1 -2
  57. package/dist-client/pages/resource/resource-list-page.js.map +1 -1
  58. package/dist-client/pages/task/task-list-page.d.ts +1 -2
  59. package/dist-client/pages/task/task-list-page.js +1 -2
  60. package/dist-client/pages/task/task-list-page.js.map +1 -1
  61. package/dist-client/pages/task-resource/task-resource-list-page.d.ts +1 -2
  62. package/dist-client/pages/task-resource/task-resource-list-page.js +1 -2
  63. package/dist-client/pages/task-resource/task-resource-list-page.js.map +1 -1
  64. package/dist-client/route.d.ts +1 -1
  65. package/dist-client/route.js +4 -4
  66. package/dist-client/route.js.map +1 -1
  67. package/dist-client/shared/domain-context.d.ts +18 -0
  68. package/dist-client/shared/domain-context.js +28 -0
  69. package/dist-client/shared/domain-context.js.map +1 -0
  70. package/dist-client/tsconfig.tsbuildinfo +1 -1
  71. package/dist-client/viewparts/domain-switch.d.ts +19 -0
  72. package/dist-client/viewparts/domain-switch.js +270 -0
  73. package/dist-client/viewparts/domain-switch.js.map +1 -0
  74. package/dist-server/controllers/parse-excel.js.map +1 -1
  75. package/dist-server/migrations/1723861466414-seed-codes.js +1 -1
  76. package/dist-server/migrations/1723861466414-seed-codes.js.map +1 -1
  77. package/dist-server/service/construction-type/construction-type-query.d.ts +2 -2
  78. package/dist-server/service/construction-type/construction-type-query.js +5 -10
  79. package/dist-server/service/construction-type/construction-type-query.js.map +1 -1
  80. package/dist-server/service/construction-type/construction-type-type.d.ts +1 -0
  81. package/dist-server/service/construction-type/construction-type-type.js +4 -0
  82. package/dist-server/service/construction-type/construction-type-type.js.map +1 -1
  83. package/dist-server/service/construction-type/construction-type.d.ts +1 -0
  84. package/dist-server/service/construction-type/construction-type.js +5 -0
  85. package/dist-server/service/construction-type/construction-type.js.map +1 -1
  86. package/dist-server/service/index.d.ts +2 -2
  87. package/dist-server/service/index.js +5 -2
  88. package/dist-server/service/index.js.map +1 -1
  89. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.d.ts +2 -2
  90. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js +5 -10
  91. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js.map +1 -1
  92. package/dist-server/service/manager/manager-query.d.ts +1 -1
  93. package/dist-server/service/manager/manager-query.js +2 -6
  94. package/dist-server/service/manager/manager-query.js.map +1 -1
  95. package/dist-server/service/project/issue-project-code.d.ts +7 -0
  96. package/dist-server/service/project/issue-project-code.js +27 -0
  97. package/dist-server/service/project/issue-project-code.js.map +1 -0
  98. package/dist-server/service/project/project-mutation.d.ts +2 -0
  99. package/dist-server/service/project/project-mutation.js +124 -11
  100. package/dist-server/service/project/project-mutation.js.map +1 -1
  101. package/dist-server/service/project/project-query.d.ts +13 -2
  102. package/dist-server/service/project/project-query.js +153 -13
  103. package/dist-server/service/project/project-query.js.map +1 -1
  104. package/dist-server/service/project/project-type.d.ts +13 -2
  105. package/dist-server/service/project/project-type.js +44 -2
  106. package/dist-server/service/project/project-type.js.map +1 -1
  107. package/dist-server/service/project/project.d.ts +23 -0
  108. package/dist-server/service/project/project.js +89 -2
  109. package/dist-server/service/project/project.js.map +1 -1
  110. package/dist-server/service/resource/resource-mutation.js +5 -6
  111. package/dist-server/service/resource/resource-mutation.js.map +1 -1
  112. package/dist-server/service/resource/resource-query.d.ts +2 -2
  113. package/dist-server/service/resource/resource-query.js +5 -10
  114. package/dist-server/service/resource/resource-query.js.map +1 -1
  115. package/dist-server/service/task/task-query.d.ts +2 -0
  116. package/dist-server/service/task/task-query.js +11 -0
  117. package/dist-server/service/task/task-query.js.map +1 -1
  118. package/dist-server/service/task/task.d.ts +2 -0
  119. package/dist-server/service/task/task.js +6 -0
  120. package/dist-server/service/task/task.js.map +1 -1
  121. package/dist-server/service/task-checklist-binding/index.d.ts +5 -0
  122. package/dist-server/service/task-checklist-binding/index.js +9 -0
  123. package/dist-server/service/task-checklist-binding/index.js.map +1 -0
  124. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.d.ts +5 -0
  125. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js +188 -0
  126. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js.map +1 -0
  127. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.d.ts +8 -0
  128. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js +61 -0
  129. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js.map +1 -0
  130. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.d.ts +15 -0
  131. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js +57 -0
  132. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js.map +1 -0
  133. package/dist-server/service/task-checklist-binding/task-checklist-binding.d.ts +22 -0
  134. package/dist-server/service/task-checklist-binding/task-checklist-binding.js +106 -0
  135. package/dist-server/service/task-checklist-binding/task-checklist-binding.js.map +1 -0
  136. package/dist-server/service/task-resource/task-resource-query.d.ts +2 -2
  137. package/dist-server/service/task-resource/task-resource-query.js +4 -9
  138. package/dist-server/service/task-resource/task-resource-query.js.map +1 -1
  139. package/dist-server/service/worker-type/worker-type-query.d.ts +2 -2
  140. package/dist-server/service/worker-type/worker-type-query.js +5 -10
  141. package/dist-server/service/worker-type/worker-type-query.js.map +1 -1
  142. package/dist-server/tsconfig.tsbuildinfo +1 -1
  143. package/package.json +15 -13
  144. package/things-factory.config.js +3 -3
  145. package/translations/en.json +10 -9
  146. package/translations/ja.json +15 -1
  147. package/translations/ko.json +3 -0
  148. package/translations/ms.json +15 -1
  149. package/translations/zh.json +15 -1
  150. package/dist-client/pages/project/popup/checklist/attachment-list-popup.js.map +0 -1
  151. package/dist-client/pages/project/popup/checklist/comment-list-popup.js.map +0 -1
  152. package/dist-client/pages/project/popup/checklist/schedule-checklist-create-popup.js.map +0 -1
  153. package/dist-client/pages/project/popup/checklist/schedule-checklist-view.js.map +0 -1
  154. package/dist-client/pages/project/popup/popup-schedule-upload.js.map +0 -1
  155. package/dist-client/pages/project/project-schedule-list.js.map +0 -1
  156. package/dist-client/pages/project/project-schedule.js +0 -422
  157. package/dist-client/pages/project/project-schedule.js.map +0 -1
  158. /package/dist-client/pages/project/popup/checklist/{attachment-list-popup.d.ts → task-checklist-attachment-list-popup.d.ts} +0 -0
  159. /package/dist-client/pages/project/popup/checklist/{comment-list-popup.d.ts → task-checklist-comment-list-popup.d.ts} +0 -0
@@ -1,5 +1,4 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import '@material/web/fab/fab.js';
3
2
  import '@material/web/icon/icon.js';
4
3
  import gql from 'graphql-tag';
5
4
  import { client } from '@operato/graphql';
@@ -7,11 +6,10 @@ import { css, html, LitElement } from 'lit';
7
6
  import { customElement, property } from 'lit/decorators.js';
8
7
  import { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles';
9
8
  import '@operato/input/ox-input-signature.js';
10
- import { store } from '@operato/shell';
11
- import { connect } from 'pwa-helpers/connect-mixin.js';
9
+ import { store, connect } from '@operato/shell';
12
10
  import { openPopup } from '@operato/layout';
13
- import './comment-list-popup';
14
- import './attachment-list-popup';
11
+ import './task-checklist-comment-list-popup';
12
+ import './task-checklist-attachment-list-popup';
15
13
  export var ChecklistTypeMainType;
16
14
  (function (ChecklistTypeMainType) {
17
15
  ChecklistTypeMainType["BASIC"] = "10";
@@ -31,19 +29,14 @@ export var BuildingInspectionStatus;
31
29
  BuildingInspectionStatus["FAIL"] = "FAIL";
32
30
  })(BuildingInspectionStatus || (BuildingInspectionStatus = {}));
33
31
  export const BUILDING_INSPECTION_STATUS_DISPLAY = {
34
- [BuildingInspectionStatus.WAIT]: '검측 대기',
35
- [BuildingInspectionStatus.OVERALL_WAIT]: '검측 대기',
36
- [BuildingInspectionStatus.REQUEST]: '검측 요청',
37
- [BuildingInspectionStatus.OVERALL_REQUEST]: '검측 요청',
38
- [BuildingInspectionStatus.PASS]: '합격',
39
- [BuildingInspectionStatus.FAIL]: '불합격'
32
+ [BuildingInspectionStatus.WAIT]: '작업 완료',
33
+ [BuildingInspectionStatus.OVERALL_WAIT]: '작업 완료',
34
+ [BuildingInspectionStatus.REQUEST]: '감리 대기',
35
+ [BuildingInspectionStatus.OVERALL_REQUEST]: '감리 대기',
36
+ [BuildingInspectionStatus.PASS]: '검측 완료',
37
+ [BuildingInspectionStatus.FAIL]: '조치 필요'
40
38
  };
41
- export var ChecklistReferenceType;
42
- (function (ChecklistReferenceType) {
43
- ChecklistReferenceType["INSPECTION"] = "INSPECTION";
44
- ChecklistReferenceType["SCHEDULE"] = "SCHEDULE"; // 공정표
45
- })(ChecklistReferenceType || (ChecklistReferenceType = {}));
46
- let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(LitElement) {
39
+ let TaskChecklistView = class TaskChecklistView extends connect(store)(LitElement) {
47
40
  constructor() {
48
41
  super(...arguments);
49
42
  this.mode = "VIEWER" /* ChecklistMode.VIEWER */;
@@ -56,6 +49,11 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
56
49
  overallSupervisoryEmails: []
57
50
  };
58
51
  this.status = BuildingInspectionStatus.WAIT;
52
+ this._kcsDetail = null;
53
+ this._hideKcsDetail = () => {
54
+ this._kcsDetail = null;
55
+ this.requestUpdate();
56
+ };
59
57
  }
60
58
  render() {
61
59
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
@@ -127,7 +125,8 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
127
125
  <tr>
128
126
  <th colspan="2" rowspan="3" type>구분</th>
129
127
  <th rowspan="3" inspection-name>검사항목</th>
130
- <th rowspan="3" criteria>검사기준</th>
128
+ <th rowspan="3" criteria>KCS 시방서 기준</th>
129
+ <th rowspan="3" criteria>현장 시방서 기준</th>
131
130
  <th colspan="4" result>검사결과</th>
132
131
  <th rowspan="3" small>첨부자료</th>
133
132
  <th rowspan="3" small>조치사항</th>
@@ -145,6 +144,8 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
145
144
  </thead>
146
145
  <tbody>
147
146
  ${processedItems.map(({ item, showMainTypeCell, mainTypeRowspan, showDetailTypeCell, detailTypeRowspan }, idx) => {
147
+ const kcs = this._parseKcs(item.kcsCriteria);
148
+ const hasKcs = !!kcs;
148
149
  return html ` <tr>
149
150
  ${showMainTypeCell
150
151
  ? html `<td main-type bold rowspan="${mainTypeRowspan}">${CHECKLIST_MAIN_TYPE_LIST[item.mainType]}</td>`
@@ -152,7 +153,15 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
152
153
  ${showDetailTypeCell ? html ` <td bold rowspan="${detailTypeRowspan}">${item.detailType}</td> ` : ''}
153
154
 
154
155
  <td>${idx + 1}. ${item.name}</td>
155
- <td>${item.inspctionCriteria}</td>
156
+ <td
157
+ kcs-criteria
158
+ ?has-kcs=${hasKcs}
159
+ @click=${hasKcs ? () => this._showKcsDetail(kcs) : null}
160
+ >
161
+ ${(kcs === null || kcs === void 0 ? void 0 : kcs.file_label) || ''}
162
+ ${hasKcs ? html `<md-icon style="font-size:14px;vertical-align:middle;color:#2e79be;">search</md-icon>` : ''}
163
+ </td>
164
+ <td site-spec-criteria>${item.siteSpecCriteria || ''}</td>
156
165
  <td radio>
157
166
  <md-radio
158
167
  item-id=${item.id}
@@ -287,8 +296,42 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
287
296
  </div>
288
297
  <div>- 검사항목 및 검사기준은 각 공종별로 감리원과 협의하여 작성할 것</div>
289
298
  </div>
299
+
300
+ ${this._kcsDetail ? html `
301
+ <div kcs-detail-backdrop @click=${(e) => { if (e.target === e.currentTarget)
302
+ this._hideKcsDetail(); }}>
303
+ <div kcs-detail-popup>
304
+ <div kcs-detail-header>
305
+ <span>KCS 시방서 기준</span>
306
+ <md-icon @click=${this._hideKcsDetail}>close</md-icon>
307
+ </div>
308
+ ${this._kcsDetail.file_label ? html `<div kcs-detail-label>${this._kcsDetail.file_label}</div>` : ''}
309
+ ${this._kcsDetail.clause_no || this._kcsDetail.clause_title
310
+ ? html `<div kcs-detail-clause>${[this._kcsDetail.clause_no, this._kcsDetail.clause_title].filter(Boolean).join(' ')}</div>`
311
+ : ''}
312
+ <div kcs-detail-text>${this._kcsDetail.text || ''}</div>
313
+ </div>
314
+ </div>
315
+ ` : ''}
290
316
  `;
291
317
  }
318
+ // KCS 기준 JSON 문자열을 오브젝트로 파싱
319
+ _parseKcs(kcsCriteria) {
320
+ if (!kcsCriteria)
321
+ return null;
322
+ try {
323
+ const obj = JSON.parse(kcsCriteria);
324
+ return obj && (obj.file_label || obj.text) ? obj : null;
325
+ }
326
+ catch (_a) {
327
+ return null;
328
+ }
329
+ }
330
+ // KCS 기준 상세(text)를 작은 팝업으로 표시
331
+ _showKcsDetail(kcs) {
332
+ this._kcsDetail = kcs;
333
+ this.requestUpdate();
334
+ }
292
335
  _onChangeConfirmStatus(e) {
293
336
  var _a, _b;
294
337
  const target = e.target;
@@ -347,20 +390,20 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
347
390
  }
348
391
  _onClickComment(checklistItemId) {
349
392
  openPopup(html `
350
- <comment-list-popup
393
+ <task-checklist-comment-list-popup
351
394
  .checklistItemId=${checklistItemId}
352
395
  .status=${this.status}
353
396
  @change-comment=${this._refreshItem.bind(this)}
354
- ></comment-list-popup>
397
+ ></task-checklist-comment-list-popup>
355
398
  `, { backdrop: true, size: 'medium', title: '조치 사항' });
356
399
  }
357
400
  _onClickAttachment(checklistItemId) {
358
401
  openPopup(html `
359
- <attachment-list-popup
402
+ <task-checklist-attachment-list-popup
360
403
  .checklistItemId=${checklistItemId}
361
404
  .status=${this.status}
362
405
  @change-attachment=${this._refreshItem.bind(this)}
363
- ></attachment-list-popup>
406
+ ></task-checklist-attachment-list-popup>
364
407
  `, { backdrop: true, size: 'medium', title: '첨부 자료' });
365
408
  }
366
409
  async _refreshItem(e) {
@@ -387,7 +430,7 @@ let ScheduleChecklistView = class ScheduleChecklistView extends connect(store)(L
387
430
  this.requestUpdate();
388
431
  }
389
432
  };
390
- ScheduleChecklistView.styles = [
433
+ TaskChecklistView.styles = [
391
434
  ButtonContainerStyles,
392
435
  ScrollbarStyles,
393
436
  css `
@@ -603,25 +646,87 @@ ScheduleChecklistView.styles = [
603
646
  color: #d32f2f;
604
647
  animation: pulse 1s infinite;
605
648
  }
649
+
650
+ /* KCS 시방서 기준 셀 (클릭 시 상세 팝업) */
651
+ td[kcs-criteria][has-kcs] {
652
+ cursor: pointer;
653
+ color: #2e79be;
654
+ }
655
+ td[kcs-criteria][has-kcs]:hover {
656
+ background-color: #f0f7ff !important;
657
+ }
658
+ td[site-spec-criteria] {
659
+ white-space: pre-wrap;
660
+ }
661
+
662
+ /* KCS 시방서 기준 상세 팝업 */
663
+ div[kcs-detail-backdrop] {
664
+ position: fixed;
665
+ inset: 0;
666
+ background: rgba(0, 0, 0, 0.4);
667
+ z-index: 1100;
668
+ display: flex;
669
+ align-items: center;
670
+ justify-content: center;
671
+ }
672
+ div[kcs-detail-popup] {
673
+ background: #fff;
674
+ border-radius: 8px;
675
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
676
+ width: 480px;
677
+ max-width: 90vw;
678
+ max-height: 70vh;
679
+ overflow-y: auto;
680
+ padding: 16px 18px;
681
+ color: #333;
682
+ }
683
+ div[kcs-detail-header] {
684
+ display: flex;
685
+ align-items: center;
686
+ justify-content: space-between;
687
+ font-weight: bold;
688
+ font-size: 16px;
689
+ color: #2e79be;
690
+ margin-bottom: 10px;
691
+ }
692
+ div[kcs-detail-header] md-icon {
693
+ cursor: pointer;
694
+ color: #888;
695
+ }
696
+ div[kcs-detail-label] {
697
+ font-weight: bold;
698
+ font-size: 14px;
699
+ margin-bottom: 6px;
700
+ }
701
+ div[kcs-detail-clause] {
702
+ font-size: 13px;
703
+ color: #666;
704
+ margin-bottom: 8px;
705
+ }
706
+ div[kcs-detail-text] {
707
+ font-size: 14px;
708
+ line-height: 1.6;
709
+ white-space: pre-wrap;
710
+ }
606
711
  `
607
712
  ];
608
713
  __decorate([
609
714
  property({ type: String }),
610
715
  __metadata("design:type", String)
611
- ], ScheduleChecklistView.prototype, "mode", void 0);
716
+ ], TaskChecklistView.prototype, "mode", void 0);
612
717
  __decorate([
613
718
  property({ type: Object }),
614
719
  __metadata("design:type", Object)
615
- ], ScheduleChecklistView.prototype, "checklist", void 0);
720
+ ], TaskChecklistView.prototype, "checklist", void 0);
616
721
  __decorate([
617
722
  property({ type: Object }),
618
723
  __metadata("design:type", Object)
619
- ], ScheduleChecklistView.prototype, "buildingComplex", void 0);
724
+ ], TaskChecklistView.prototype, "buildingComplex", void 0);
620
725
  __decorate([
621
726
  property({ type: String }),
622
727
  __metadata("design:type", String)
623
- ], ScheduleChecklistView.prototype, "status", void 0);
624
- ScheduleChecklistView = __decorate([
625
- customElement('schedule-checklist-view')
626
- ], ScheduleChecklistView);
627
- //# sourceMappingURL=schedule-checklist-view.js.map
728
+ ], TaskChecklistView.prototype, "status", void 0);
729
+ TaskChecklistView = __decorate([
730
+ customElement('task-checklist-view')
731
+ ], TaskChecklistView);
732
+ //# sourceMappingURL=task-checklist-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-checklist-view.js","sourceRoot":"","sources":["../../../../../client/pages/project/popup/checklist/task-checklist-view.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\nimport '@operato/input/ox-input-signature.js'\nimport { store, connect } from '@operato/shell'\nimport { openPopup } from '@operato/layout'\nimport './task-checklist-comment-list-popup'\nimport './task-checklist-attachment-list-popup'\n\nexport const enum ChecklistMode {\n VIEWER = 'VIEWER',\n EDITOR = 'EDITOR'\n}\nexport enum ChecklistTypeMainType {\n BASIC = '10',\n NON_BASIC = '20'\n}\nexport const CHECKLIST_MAIN_TYPE_LIST = {\n [ChecklistTypeMainType.BASIC]: '기본 업무',\n [ChecklistTypeMainType.NON_BASIC]: '기본 외 업무'\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_DISPLAY = {\n [BuildingInspectionStatus.WAIT]: '작업 완료',\n [BuildingInspectionStatus.OVERALL_WAIT]: '작업 완료',\n [BuildingInspectionStatus.REQUEST]: '감리 대기',\n [BuildingInspectionStatus.OVERALL_REQUEST]: '감리 대기',\n [BuildingInspectionStatus.PASS]: '검측 완료',\n [BuildingInspectionStatus.FAIL]: '조치 필요'\n}\n\n@customElement('task-checklist-view')\nclass TaskChecklistView extends connect(store)(LitElement) {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex: 1;\n flex-direction: column;\n padding: var(--spacing-large, 12px);\n padding-top: 0;\n font-size: 14px;\n min-width: 800px;\n }\n\n [bold] {\n font-weight: bold;\n }\n\n div[name] {\n display: flex;\n color: #586878;\n font-size: 24px;\n align-items: center;\n justify-content: center;\n }\n\n table {\n width: 100%;\n font-size: 15px;\n color: #586878;\n text-align: left;\n border-collapse: collapse;\n td,\n th {\n border: 1px rgba(51, 51, 51, 0.2) solid;\n padding-inline: var(--spacing-medium, 8px);\n vertical-align: middle;\n }\n th {\n background-color: #efefef;\n font-weight: bold;\n }\n td {\n height: 33px;\n background-color: var(--md-sys-color-on-primary);\n &[radio] {\n text-align: center;\n width: 50px;\n }\n }\n }\n\n table[header] {\n margin-top: var(--spacing-small, 4px);\n\n td {\n min-width: 180px;\n border-left: none;\n }\n th {\n width: 110px;\n border-right: none;\n }\n }\n\n table[body] {\n border: 2px solid var(--md-sys-color-on-primary-container);\n border-bottom: none;\n margin-top: var(--spacing-medium, 8px);\n\n th {\n text-align: center;\n\n &[type] {\n min-width: 150px;\n }\n &[inspection-name] {\n min-width: 250px;\n }\n &[result] {\n width: 270px;\n }\n &[criteria] {\n width: 90px;\n }\n &[small] {\n width: 60px;\n }\n }\n td {\n &[main-type] {\n width: 50px;\n text-align: center;\n word-break: keep-all;\n }\n\n &[attachment] {\n text-align: center;\n cursor: pointer;\n\n * {\n vertical-align: middle;\n }\n }\n &[comment] {\n cursor: pointer;\n text-align: center;\n\n * {\n vertical-align: middle;\n }\n }\n &[disabled] * {\n opacity: 0.6;\n }\n }\n }\n\n table[tail] {\n border: 2px solid var(--md-sys-color-on-primary-container);\n border-top: none;\n margin-top: -1px;\n\n td {\n width: 25%;\n border-left: none;\n text-align: center;\n position: relative;\n background-color: var(--md-sys-color-on-primary);\n font-size: 14px;\n }\n th {\n width: 25%;\n border-right: none;\n }\n\n span[sign-text] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n pointer-events: none;\n }\n ox-input-signature {\n margin: var(--spacing-medium, 8px);\n\n &[disabled] {\n background: #eee;\n }\n }\n }\n\n div[footer] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-tiny, 2px);\n font-size: 12px;\n margin-top: var(--spacing-medium, 8px);\n color: #586878;\n text-indent: -9px;\n padding-left: var(--spacing-medium, 8px);\n }\n\n .stt-float-btns {\n position: absolute;\n top: 0;\n right: 0;\n display: flex;\n gap: 8px;\n z-index: 10;\n }\n .stt-float-btns button {\n background: #fff;\n border: 1px solid #ccc;\n border-radius: 50%;\n width: 38px;\n height: 38px;\n font-size: 18px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n .stt-float-btns button:hover {\n background: #f2f2f2;\n }\n div[title-row] {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 8px;\n }\n div[name] {\n color: #586878;\n font-size: 24px;\n font-weight: bold;\n flex: 1;\n text-align: center;\n }\n\n @keyframes pulse {\n 0% {\n filter: drop-shadow(0 0 0 #d32f2f);\n }\n 70% {\n filter: drop-shadow(0 0 8px #d32f2f);\n }\n 100% {\n filter: drop-shadow(0 0 0 #d32f2f);\n }\n }\n .stt-fab[active] md-icon {\n color: #d32f2f;\n animation: pulse 1s infinite;\n }\n\n /* KCS 시방서 기준 셀 (클릭 시 상세 팝업) */\n td[kcs-criteria][has-kcs] {\n cursor: pointer;\n color: #2e79be;\n }\n td[kcs-criteria][has-kcs]:hover {\n background-color: #f0f7ff !important;\n }\n td[site-spec-criteria] {\n white-space: pre-wrap;\n }\n\n /* KCS 시방서 기준 상세 팝업 */\n div[kcs-detail-backdrop] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1100;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n div[kcs-detail-popup] {\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);\n width: 480px;\n max-width: 90vw;\n max-height: 70vh;\n overflow-y: auto;\n padding: 16px 18px;\n color: #333;\n }\n div[kcs-detail-header] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-weight: bold;\n font-size: 16px;\n color: #2e79be;\n margin-bottom: 10px;\n }\n div[kcs-detail-header] md-icon {\n cursor: pointer;\n color: #888;\n }\n div[kcs-detail-label] {\n font-weight: bold;\n font-size: 14px;\n margin-bottom: 6px;\n }\n div[kcs-detail-clause] {\n font-size: 13px;\n color: #666;\n margin-bottom: 8px;\n }\n div[kcs-detail-text] {\n font-size: 14px;\n line-height: 1.6;\n white-space: pre-wrap;\n }\n `\n ]\n\n @property({ type: String }) mode: ChecklistMode = ChecklistMode.VIEWER\n @property({ type: Object }) checklist: any = {}\n @property({ type: Object }) buildingComplex = {\n id: '',\n taskConstructorEmails: [] as string[],\n overallConstructorEmails: [] as string[],\n taskSupervisoryEmails: [] as string[],\n overallSupervisoryEmails: [] as string[]\n }\n @property({ type: String }) status: BuildingInspectionStatus = BuildingInspectionStatus.WAIT\n\n render() {\n const today = this._getDate(new Date())\n\n // 시공자 스탭 여부\n const isConstructorStep =\n this.status == BuildingInspectionStatus.WAIT ||\n this.status == BuildingInspectionStatus.OVERALL_WAIT ||\n this.status == BuildingInspectionStatus.FAIL\n\n // 감리자 스탭 여부\n const isSupervisoryStep =\n this.status == BuildingInspectionStatus.REQUEST || this.status == BuildingInspectionStatus.OVERALL_REQUEST\n\n // 현재 스탭에 해당하는 계정인지 체크 (편집모드만)\n let havePermissionByStatus: boolean = false\n let isTaskConstructor: boolean = false\n let isOverallConstructor: boolean = false\n let isTaskSupervisory: boolean = false\n let isOverallSupervisory: boolean = false\n\n if (this.mode == ChecklistMode.EDITOR && this.status) {\n const email = (store.getState() as any).auth?.user?.email\n // 현재 유저가 \"공종별 시공 관리자\" 인지 체크\n isTaskConstructor = this.buildingComplex.taskConstructorEmails?.includes(email) || false\n // 현재 유저가 \"총괄 시공 책임자\" 인지 체크\n isOverallConstructor = this.buildingComplex.overallConstructorEmails?.includes(email) || false\n // 현재 유저가 \"공종별 감리 책임자\" 인지 체크\n isTaskSupervisory = this.buildingComplex.taskSupervisoryEmails?.includes(email) || false\n // 현재 유저가 \"총괄 감리 책임자\" 인지 체크\n isOverallSupervisory = this.buildingComplex.overallSupervisoryEmails?.includes(email) || false\n // 스탭이 시공자 스탭일때에 내가 시공자 권한이 있는지 체크\n havePermissionByStatus = isConstructorStep\n ? isTaskConstructor || isOverallConstructor\n : isTaskSupervisory || isOverallSupervisory\n }\n\n // 체크리스트 아이템 정렬\n this.checklist?.checklistItems?.sort((a, b) => {\n // 1순위: mainType 오름차순\n if (a.mainType < b.mainType) return -1\n if (a.mainType > b.mainType) return 1\n\n // 2순위: detailType 오름차순\n if (a.detailType < b.detailType) return -1\n if (a.detailType > b.detailType) return 1\n\n // 3순위: sequence 오름차순\n return a.sequence - b.sequence\n })\n\n const processedItems = this.drawChecklistItems(this.checklist?.checklistItems || [])\n\n return html`\n <div title-row>\n <div name>${this.checklist.name}</div>\n </div>\n <table header>\n <tr>\n <th>공종</th>\n <td>${this.checklist.constructionType}</td>\n <th>문서 번호</th>\n <td>${this.checklist.documentNo}</td>\n </tr>\n <tr>\n <th>세부 공종</th>\n <td>${this.checklist.constructionDetailType}</td>\n <th>검측 상태</th>\n <td>${BUILDING_INSPECTION_STATUS_DISPLAY[this.status]}</td>\n </tr>\n </table>\n\n <table body>\n <thead>\n <tr>\n <th colspan=\"2\" rowspan=\"3\" type>구분</th>\n <th rowspan=\"3\" inspection-name>검사항목</th>\n <th rowspan=\"3\" criteria>KCS 시방서 기준</th>\n <th rowspan=\"3\" criteria>현장 시방서 기준</th>\n <th colspan=\"4\" result>검사결과</th>\n <th rowspan=\"3\" small>첨부자료</th>\n <th rowspan=\"3\" small>조치사항</th>\n </tr>\n <tr>\n <th colspan=\"2\">시공자</th>\n <th colspan=\"2\">감리자</th>\n </tr>\n <tr>\n <th>적합</th>\n <th>부적합</th>\n <th>적합</th>\n <th>부적합</th>\n </tr>\n </thead>\n <tbody>\n ${processedItems.map(({ item, showMainTypeCell, mainTypeRowspan, showDetailTypeCell, detailTypeRowspan }, idx) => {\n const kcs = this._parseKcs(item.kcsCriteria)\n const hasKcs = !!kcs\n return html` <tr>\n ${showMainTypeCell\n ? html`<td main-type bold rowspan=\"${mainTypeRowspan}\">${CHECKLIST_MAIN_TYPE_LIST[item.mainType]}</td>`\n : ''}\n ${showDetailTypeCell ? html` <td bold rowspan=\"${detailTypeRowspan}\">${item.detailType}</td> ` : ''}\n\n <td>${idx + 1}. ${item.name}</td>\n <td\n kcs-criteria\n ?has-kcs=${hasKcs}\n @click=${hasKcs ? () => this._showKcsDetail(kcs) : null}\n >\n ${kcs?.file_label || ''}\n ${hasKcs ? html`<md-icon style=\"font-size:14px;vertical-align:middle;color:#2e79be;\">search</md-icon>` : ''}\n </td>\n <td site-spec-criteria>${item.siteSpecCriteria || ''}</td>\n <td radio>\n <md-radio\n item-id=${item.id}\n item-name=\"constructionConfirmStatus\"\n name=${'radio-construction-' + item.id}\n value=\"T\"\n .checked=${item.constructionConfirmStatus === 'T'}\n ?disabled=${!isConstructorStep || !havePermissionByStatus}\n @change=${this._onChangeConfirmStatus}\n ></md-radio>\n </td>\n <td radio>\n <md-radio\n item-id=${item.id}\n item-name=\"constructionConfirmStatus\"\n name=${'radio-construction-' + item.id}\n value=\"F\"\n .checked=${item.constructionConfirmStatus === 'F'}\n ?disabled=${!isConstructorStep || !havePermissionByStatus}\n @change=${this._onChangeConfirmStatus}\n ></md-radio>\n </td>\n <td radio>\n <md-radio\n item-id=${item.id}\n item-name=\"supervisoryConfirmStatus\"\n name=${'radio-supervisory-' + item.id}\n value=\"T\"\n .checked=${item.supervisoryConfirmStatus === 'T'}\n ?disabled=${!isSupervisoryStep || !havePermissionByStatus}\n @change=${this._onChangeConfirmStatus}\n ></md-radio>\n </td>\n <td radio>\n <md-radio\n item-id=${item.id}\n item-name=\"supervisoryConfirmStatus\"\n name=${'radio-supervisory-' + item.id}\n value=\"F\"\n .checked=${item.supervisoryConfirmStatus === 'F'}\n ?disabled=${!isSupervisoryStep || !havePermissionByStatus}\n @change=${this._onChangeConfirmStatus}\n ></md-radio>\n </td>\n <td\n attachment\n ?disabled=${this.status == BuildingInspectionStatus.PASS}\n @click=${() => this._onClickAttachment(item.id)}\n >\n <md-icon slot=\"icon\">attach_file</md-icon>\n <span>${item?.checklistItemAttachmentCount || ''}</span>\n </td>\n <td comment ?disabled=${this.status == BuildingInspectionStatus.PASS} @click=${() => this._onClickComment(item.id)}>\n <md-icon slot=\"icon\">chat</md-icon>\n <span>${item?.checklistItemCommentCount || ''}</span>\n </td>\n </tr>`\n })}\n </tbody>\n </table>\n\n <table tail>\n <tbody>\n <tr first>\n <th rowspan=\"2\">시공자 점검일</th>\n <td rowspan=\"2\">\n ${this.mode == ChecklistMode.VIEWER ? today : this._getDate(this.checklist.constructionInspectionDate)}\n </td>\n <th>공종별 시공 관리자</th>\n <td>\n <span sign-text>(인)</span>\n <ox-input-signature\n .value=${this.checklist.taskConstructorSignature}\n name=\"taskConstructorSignature\"\n @change=${this._onChangeSignature}\n ?disabled=${(this.status != BuildingInspectionStatus.WAIT && this.status != BuildingInspectionStatus.FAIL) ||\n !isTaskConstructor}\n >\n </ox-input-signature>\n </td>\n </tr>\n <tr>\n <th>총괄 시공 책임자</th>\n <td>\n <span sign-text>(인)</span>\n <ox-input-signature\n .value=${this.checklist.overallConstructorSignature}\n name=\"overallConstructorSignature\"\n @change=${this._onChangeSignature}\n ?disabled=${this.status != BuildingInspectionStatus.OVERALL_WAIT || !isOverallConstructor}\n >\n </ox-input-signature>\n </td>\n </tr>\n <tr>\n <th rowspan=\"2\">감리자 점검일</th>\n <td rowspan=\"2\">\n ${this.mode == ChecklistMode.VIEWER ? today : this._getDate(this.checklist.supervisorInspectionDate)}\n </td>\n <th>공종별 감리 책임자</th>\n <td>\n <span sign-text>(인)</span>\n <ox-input-signature\n .value=${this.checklist.taskSupervisorySignature}\n name=\"taskSupervisorySignature\"\n @change=${this._onChangeSignature}\n ?disabled=${this.status != BuildingInspectionStatus.REQUEST || !isTaskSupervisory}\n >\n </ox-input-signature>\n </td>\n </tr>\n <tr>\n <th>총괄 감리 책임자</th>\n <td>\n <span sign-text>(인)</span>\n <ox-input-signature\n .value=${this.checklist.overallSupervisorySignature}\n name=\"overallSupervisorySignature\"\n @change=${this._onChangeSignature}\n ?disabled=${this.status != BuildingInspectionStatus.OVERALL_REQUEST || !isOverallSupervisory}\n >\n </ox-input-signature>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div footer>\n <div>\n - 검사결과는 1차, 2차로 구분 재검측시 2차에 기록하고 검사기준도 검사결과와 비교될 수 있도록 시방서 또는 도면 등에 있는\n 수치를 작성하며, 수치가 없는 검사항목은 시방서 또는 설계도서에 있는 내용과 검사한 내용으로 작성함\n </div>\n <div>- 검사항목 및 검사기준은 각 공종별로 감리원과 협의하여 작성할 것</div>\n </div>\n\n ${this._kcsDetail ? html`\n <div kcs-detail-backdrop @click=${(e: Event) => { if (e.target === e.currentTarget) this._hideKcsDetail() }}>\n <div kcs-detail-popup>\n <div kcs-detail-header>\n <span>KCS 시방서 기준</span>\n <md-icon @click=${this._hideKcsDetail}>close</md-icon>\n </div>\n ${this._kcsDetail.file_label ? html`<div kcs-detail-label>${this._kcsDetail.file_label}</div>` : ''}\n ${this._kcsDetail.clause_no || this._kcsDetail.clause_title\n ? html`<div kcs-detail-clause>${[this._kcsDetail.clause_no, this._kcsDetail.clause_title].filter(Boolean).join(' ')}</div>`\n : ''}\n <div kcs-detail-text>${this._kcsDetail.text || ''}</div>\n </div>\n </div>\n ` : ''}\n `\n }\n\n private _kcsDetail: any = null\n\n // KCS 기준 JSON 문자열을 오브젝트로 파싱\n private _parseKcs(kcsCriteria?: string): any {\n if (!kcsCriteria) return null\n try {\n const obj = JSON.parse(kcsCriteria)\n return obj && (obj.file_label || obj.text) ? obj : null\n } catch {\n return null\n }\n }\n\n // KCS 기준 상세(text)를 작은 팝업으로 표시\n private _showKcsDetail(kcs: any) {\n this._kcsDetail = kcs\n this.requestUpdate()\n }\n\n private _hideKcsDetail = () => {\n this._kcsDetail = null\n this.requestUpdate()\n }\n\n private _onChangeConfirmStatus(e: Event) {\n const target = e.target as HTMLInputElement\n const itemId = target.getAttribute('item-id')\n const name = target.getAttribute('item-name') || ''\n const value = target.value\n\n this.checklist.checklistItems = this.checklist?.checklistItems?.map(item =>\n item.id == itemId ? { ...item, [name]: value } : item\n )\n }\n\n private _onChangeSignature(e: Event) {\n const target = e.target as HTMLInputElement\n\n this.checklist[target.name] = target.value\n }\n\n private _getDate(date) {\n if (!date) return ' 년 월 일'\n\n const _date = new Date(date) || new Date()\n return _date.toLocaleDateString('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n }\n\n private drawChecklistItems(checklistItems) {\n const mainTypeRowspans = {}\n const detailTypeRowspans = {}\n let previousMainType = null\n let previousDetailType = null\n\n return checklistItems.map((item, index) => {\n const mainType = item.mainType\n const detailType = item.detailType\n\n // mainType이 변경되면 rowspan을 계산\n if (mainType !== previousMainType) {\n mainTypeRowspans[mainType] = checklistItems.filter(i => i.mainType === mainType).length\n previousDetailType = null // detailType 초기화\n }\n\n // detailType이 변경되면 rowspan을 계산\n if (detailType !== previousDetailType) {\n detailTypeRowspans[`${mainType}-${detailType}`] = checklistItems.filter(\n i => i.mainType === mainType && i.detailType === detailType\n ).length\n }\n\n const showMainTypeCell = mainType !== previousMainType\n const showDetailTypeCell = detailType !== previousDetailType\n\n const mainTypeRowspan = mainTypeRowspans[mainType]\n const detailTypeRowspan = detailTypeRowspans[`${mainType}-${detailType}`]\n\n // 이전 값을 업데이트\n previousMainType = mainType\n previousDetailType = detailType\n\n return {\n item,\n showMainTypeCell,\n mainTypeRowspan,\n showDetailTypeCell,\n detailTypeRowspan\n }\n })\n }\n\n private _onClickComment(checklistItemId: string) {\n openPopup(\n html`\n <task-checklist-comment-list-popup\n .checklistItemId=${checklistItemId}\n .status=${this.status}\n @change-comment=${this._refreshItem.bind(this)}\n ></task-checklist-comment-list-popup>\n `,\n { backdrop: true, size: 'medium', title: '조치 사항' }\n )\n }\n\n private _onClickAttachment(checklistItemId: string) {\n openPopup(\n html`\n <task-checklist-attachment-list-popup\n .checklistItemId=${checklistItemId}\n .status=${this.status}\n @change-attachment=${this._refreshItem.bind(this)}\n ></task-checklist-attachment-list-popup>\n `,\n { backdrop: true, size: 'medium', title: '첨부 자료' }\n )\n }\n\n private async _refreshItem(e) {\n const { checklistItemId } = e.detail\n const response = await client.query({\n query: gql`\n query ChecklistItem($checklistItemId: String!) {\n checklistItem(id: $checklistItemId) {\n id\n checklistItemCommentCount\n checklistItemAttachmentCount\n }\n }\n `,\n variables: {\n checklistItemId: checklistItemId\n }\n })\n\n const checklistItem = response.data?.checklistItem || []\n this.checklist.checklistItems = this.checklist.checklistItems.map(item => {\n return item.id != checklistItemId ? item : { ...item, ...checklistItem }\n })\n\n this.requestUpdate()\n }\n}\n"]}
@@ -36,7 +36,10 @@ let PopupPlanExport = class PopupPlanExport extends LitElement {
36
36
  <input
37
37
  type="checkbox"
38
38
  .checked=${this.selectedFileIds.includes(file.id)}
39
- @click=${(e) => e.stopPropagation()}
39
+ @click=${(e) => {
40
+ e.stopPropagation();
41
+ this._onFileItemClick(file.id);
42
+ }}
40
43
  />
41
44
  <div file-info>
42
45
  <md-icon>description</md-icon>
@@ -55,7 +58,10 @@ let PopupPlanExport = class PopupPlanExport extends LitElement {
55
58
  <input
56
59
  type="checkbox"
57
60
  .checked=${this.selectedFileIds.includes(file.id)}
58
- @click=${(e) => e.stopPropagation()}
61
+ @click=${(e) => {
62
+ e.stopPropagation();
63
+ this._onFileItemClick(file.id);
64
+ }}
59
65
  />
60
66
  <div file-info>
61
67
  <md-icon>attachment</md-icon>
@@ -1 +1 @@
1
- {"version":3,"file":"popup-plan-export.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-plan-export.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BuildingLevel } from '../project-list'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\n\ninterface FileItem {\n id: string\n name?: string\n type: string\n}\n\n@customElement('popup-plan-export')\nexport class PopupPlanExport extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n max-height: 80vh;\n }\n\n div[body] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n\n div[file-list-container] {\n display: flex;\n flex-direction: column;\n gap: 15px;\n background-color: #f7f7f7;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n\n div[file-item] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: #fff;\n border-radius: 6px;\n border: 1px solid #ddd;\n cursor: pointer;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n input[type='checkbox'] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n div[file-info] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n\n md-icon {\n --md-icon-size: 24px;\n color: #666;\n }\n\n span[file-name] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n span[file-type] {\n font-size: 12px;\n color: #666;\n background-color: #f0f0f0;\n padding: 2px 6px;\n border-radius: 4px;\n }\n }\n }\n\n div[section-title] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n margin-top: 10px;\n margin-bottom: 5px;\n border-bottom: 2px solid #ddd;\n padding-bottom: 5px;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #eee;\n }\n }\n `\n ]\n\n @property({ type: Object }) private buildingLevel: BuildingLevel = {}\n @state() private selectedFileIds: string[] = []\n\n render() {\n const { mainDrawing, elevationDrawing, rebarDistributionDrawing, etcDrawings } = this.buildingLevel\n\n // 메인 도면 파일들\n const mainFiles: FileItem[] = []\n if (mainDrawing?.id) {\n mainFiles.push({ id: mainDrawing.id, name: mainDrawing.name, type: '평면도' })\n }\n if (elevationDrawing?.id) {\n mainFiles.push({ id: elevationDrawing.id, name: elevationDrawing.name, type: '입면도' })\n }\n if (rebarDistributionDrawing?.id) {\n mainFiles.push({ id: rebarDistributionDrawing.id, name: rebarDistributionDrawing.name, type: '철근배근도' })\n }\n\n // 기타 도면 파일들\n const etcFiles: FileItem[] = etcDrawings?.map(drawing => ({ id: drawing.id!, name: drawing.name, type: '기타 도면' })) || []\n\n return html`\n <div body>\n <div file-list-container>\n ${mainFiles.length > 0\n ? html`\n <div section-title>주요 도면</div>\n ${mainFiles.map(\n file => html`\n <div file-item @click=${() => this._onFileItemClick(file.id)}>\n <input\n type=\"checkbox\"\n .checked=${this.selectedFileIds.includes(file.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n <div file-info>\n <md-icon>description</md-icon>\n <span file-name>${file.name || ''}</span>\n <span file-type>${file.type}</span>\n </div>\n </div>\n `\n )}\n `\n : ''}\n ${etcFiles.length > 0\n ? html`\n <div section-title>기타 도면</div>\n ${etcFiles.map(\n file => html`\n <div file-item @click=${() => this._onFileItemClick(file.id)}>\n <input\n type=\"checkbox\"\n .checked=${this.selectedFileIds.includes(file.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n <div file-info>\n <md-icon>attachment</md-icon>\n <span file-name>${file.name || ''}</span>\n <span file-type>${file.type}</span>\n </div>\n </div>\n `\n )}\n `\n : ''}\n ${mainFiles.length === 0 && etcFiles.length === 0\n ? html` <div style=\"text-align: center; color: #666; padding: 40px;\">내보낼 도면 파일이 없습니다.</div> `\n : ''}\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}> <md-icon slot=\"icon\">cancel</md-icon>취소 </md-outlined-button>\n <md-filled-button @click=${this._exportFiles} .disabled=${this.selectedFileIds.length === 0}>\n <md-icon slot=\"icon\">download</md-icon>내보내기 (${this.selectedFileIds.length})\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private _onFileItemClick(fileId: string) {\n if (this.selectedFileIds.includes(fileId)) {\n this.selectedFileIds = this.selectedFileIds.filter(id => id !== fileId)\n } else {\n this.selectedFileIds = [...this.selectedFileIds, fileId]\n }\n }\n\n private async _exportFiles() {\n if (this.selectedFileIds.length === 0) {\n notify({ message: '내보낼 파일을 선택해주세요.', level: 'warn' })\n return\n }\n\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation DownloadPlanFiles($fileIds: [String!]!) {\n downloadPlanFiles(fileIds: $fileIds)\n }\n `,\n variables: {\n fileIds: this.selectedFileIds\n }\n })\n\n if (response.data?.downloadPlanFiles) {\n // 서버에서 ZIP 파일 다운로드 URL을 반환하는 경우\n const link = document.createElement('a')\n link.href = response.data.downloadPlanFiles\n link.download = `${this.buildingLevel!.building!.name} ${this.buildingLevel!.floorDisplayName}층 도면.zip`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n notify({ message: `${this.selectedFileIds.length}개 파일이 ZIP으로 압축되어 다운로드 되었습니다.` })\n this._close()\n }\n } catch (error) {\n console.error('파일 내보내기 중 오류 발생:', error)\n notify({ message: '파일 내보내기 중 오류가 발생했습니다.', level: 'error' })\n }\n }\n\n private _close() {\n history.back()\n }\n}\n"]}
1
+ {"version":3,"file":"popup-plan-export.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-plan-export.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BuildingLevel } from '../project-list'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\n\ninterface FileItem {\n id: string\n name?: string\n type: string\n}\n\n@customElement('popup-plan-export')\nexport class PopupPlanExport extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n max-height: 80vh;\n }\n\n div[body] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n\n div[file-list-container] {\n display: flex;\n flex-direction: column;\n gap: 15px;\n background-color: #f7f7f7;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n\n div[file-item] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: #fff;\n border-radius: 6px;\n border: 1px solid #ddd;\n cursor: pointer;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n input[type='checkbox'] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n div[file-info] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n\n md-icon {\n --md-icon-size: 24px;\n color: #666;\n }\n\n span[file-name] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n span[file-type] {\n font-size: 12px;\n color: #666;\n background-color: #f0f0f0;\n padding: 2px 6px;\n border-radius: 4px;\n }\n }\n }\n\n div[section-title] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n margin-top: 10px;\n margin-bottom: 5px;\n border-bottom: 2px solid #ddd;\n padding-bottom: 5px;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #eee;\n }\n }\n `\n ]\n\n @property({ type: Object }) private buildingLevel: BuildingLevel = {}\n @state() private selectedFileIds: string[] = []\n\n render() {\n const { mainDrawing, elevationDrawing, rebarDistributionDrawing, etcDrawings } = this.buildingLevel\n\n // 메인 도면 파일들\n const mainFiles: FileItem[] = []\n if (mainDrawing?.id) {\n mainFiles.push({ id: mainDrawing.id, name: mainDrawing.name, type: '평면도' })\n }\n if (elevationDrawing?.id) {\n mainFiles.push({ id: elevationDrawing.id, name: elevationDrawing.name, type: '입면도' })\n }\n if (rebarDistributionDrawing?.id) {\n mainFiles.push({ id: rebarDistributionDrawing.id, name: rebarDistributionDrawing.name, type: '철근배근도' })\n }\n\n // 기타 도면 파일들\n const etcFiles: FileItem[] = etcDrawings?.map(drawing => ({ id: drawing.id!, name: drawing.name, type: '기타 도면' })) || []\n\n return html`\n <div body>\n <div file-list-container>\n ${mainFiles.length > 0\n ? html`\n <div section-title>주요 도면</div>\n ${mainFiles.map(\n file => html`\n <div file-item @click=${() => this._onFileItemClick(file.id)}>\n <input\n type=\"checkbox\"\n .checked=${this.selectedFileIds.includes(file.id)}\n @click=${(e: Event) => {\n e.stopPropagation()\n this._onFileItemClick(file.id)\n }}\n />\n <div file-info>\n <md-icon>description</md-icon>\n <span file-name>${file.name || ''}</span>\n <span file-type>${file.type}</span>\n </div>\n </div>\n `\n )}\n `\n : ''}\n ${etcFiles.length > 0\n ? html`\n <div section-title>기타 도면</div>\n ${etcFiles.map(\n file => html`\n <div file-item @click=${() => this._onFileItemClick(file.id)}>\n <input\n type=\"checkbox\"\n .checked=${this.selectedFileIds.includes(file.id)}\n @click=${(e: Event) => {\n e.stopPropagation()\n this._onFileItemClick(file.id)\n }}\n />\n <div file-info>\n <md-icon>attachment</md-icon>\n <span file-name>${file.name || ''}</span>\n <span file-type>${file.type}</span>\n </div>\n </div>\n `\n )}\n `\n : ''}\n ${mainFiles.length === 0 && etcFiles.length === 0\n ? html` <div style=\"text-align: center; color: #666; padding: 40px;\">내보낼 도면 파일이 없습니다.</div> `\n : ''}\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}> <md-icon slot=\"icon\">cancel</md-icon>취소 </md-outlined-button>\n <md-filled-button @click=${this._exportFiles} .disabled=${this.selectedFileIds.length === 0}>\n <md-icon slot=\"icon\">download</md-icon>내보내기 (${this.selectedFileIds.length})\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private _onFileItemClick(fileId: string) {\n if (this.selectedFileIds.includes(fileId)) {\n this.selectedFileIds = this.selectedFileIds.filter(id => id !== fileId)\n } else {\n this.selectedFileIds = [...this.selectedFileIds, fileId]\n }\n }\n\n private async _exportFiles() {\n if (this.selectedFileIds.length === 0) {\n notify({ message: '내보낼 파일을 선택해주세요.', level: 'warn' })\n return\n }\n\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation DownloadPlanFiles($fileIds: [String!]!) {\n downloadPlanFiles(fileIds: $fileIds)\n }\n `,\n variables: {\n fileIds: this.selectedFileIds\n }\n })\n\n if (response.data?.downloadPlanFiles) {\n // 서버에서 ZIP 파일 다운로드 URL을 반환하는 경우\n const link = document.createElement('a')\n link.href = response.data.downloadPlanFiles\n link.download = `${this.buildingLevel!.building!.name} ${this.buildingLevel!.floorDisplayName}층 도면.zip`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n notify({ message: `${this.selectedFileIds.length}개 파일이 ZIP으로 압축되어 다운로드 되었습니다.` })\n this._close()\n }\n } catch (error) {\n console.error('파일 내보내기 중 오류 발생:', error)\n notify({ message: '파일 내보내기 중 오류가 발생했습니다.', level: 'error' })\n }\n }\n\n private _close() {\n history.back()\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { LitElement } from 'lit';
2
- export declare class PopupScheduleUpload extends LitElement {
2
+ export declare class PopupTaskUpload extends LitElement {
3
3
  static styles: import("lit").CSSResult[];
4
4
  private scheduleTable;
5
5
  private projectId;
@@ -4,7 +4,7 @@ import { customElement, property } from 'lit/decorators.js';
4
4
  import { client } from '@operato/graphql';
5
5
  import { notify } from '@operato/layout';
6
6
  import gql from 'graphql-tag';
7
- let PopupScheduleUpload = class PopupScheduleUpload extends LitElement {
7
+ let PopupTaskUpload = class PopupTaskUpload extends LitElement {
8
8
  render() {
9
9
  var _a, _b;
10
10
  const icon = this.scheduleTable ? '' : 'upload';
@@ -54,7 +54,7 @@ let PopupScheduleUpload = class PopupScheduleUpload extends LitElement {
54
54
  }
55
55
  }
56
56
  };
57
- PopupScheduleUpload.styles = [
57
+ PopupTaskUpload.styles = [
58
58
  css `
59
59
  :host {
60
60
  display: flex;
@@ -93,13 +93,13 @@ PopupScheduleUpload.styles = [
93
93
  __decorate([
94
94
  property({ type: Object }),
95
95
  __metadata("design:type", Object)
96
- ], PopupScheduleUpload.prototype, "scheduleTable", void 0);
96
+ ], PopupTaskUpload.prototype, "scheduleTable", void 0);
97
97
  __decorate([
98
98
  property({ type: String }),
99
99
  __metadata("design:type", Object)
100
- ], PopupScheduleUpload.prototype, "projectId", void 0);
101
- PopupScheduleUpload = __decorate([
102
- customElement('popup-schedule-upload')
103
- ], PopupScheduleUpload);
104
- export { PopupScheduleUpload };
105
- //# sourceMappingURL=popup-schedule-upload.js.map
100
+ ], PopupTaskUpload.prototype, "projectId", void 0);
101
+ PopupTaskUpload = __decorate([
102
+ customElement('popup-task-upload')
103
+ ], PopupTaskUpload);
104
+ export { PopupTaskUpload };
105
+ //# sourceMappingURL=popup-task-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-task-upload.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-task-upload.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,GAAG,MAAM,aAAa,CAAA;AAItB,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;IAyC7C,MAAM;;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC/C,MAAM,WAAW,GAAG,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,EAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QAE9D,OAAO,IAAI,CAAA;;;;mBAII,IAAI;oBACH,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,KAAI,EAAE;0BACxB,WAAW;sBACf,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;uCAKlB,IAAI,CAAC,MAAM;;;KAG7C,CAAA;IACH,CAAC;IAEO,MAAM;QACZ,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,mBAAmB,CAAC,CAAc;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAEhC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;OAIZ;YACD,SAAS,EAAE;gBACT,KAAK,EAAE;oBACL,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,aAAa,EAAE,IAAI;iBACpB;aACF;YACD,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;YACtC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;;AA3FM,sBAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCF;CACF,AAnCY,CAmCZ;AAEmC;IAAnC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDAA8C;AACrC;IAAnC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAsC;AAvCtD,eAAe;IAD3B,aAAa,CAAC,mBAAmB,CAAC;GACtB,eAAe,CA6F3B","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { Attachment } from '@things-factory/attachment-base'\n\n@customElement('popup-task-upload')\nexport class PopupTaskUpload extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n }\n\n div[body] {\n flex: 1;\n\n div[input-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 25px;\n background-color: #f7f7f7;\n padding: 35px 27px 27px 27px;\n\n ox-input-file {\n height: 100px;\n width: 120px;\n line-height: 100%;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 20px;\n }\n }\n `\n ]\n\n @property({ type: Object }) private scheduleTable: Attachment | undefined\n @property({ type: String }) private projectId: string | undefined\n\n render() {\n const icon = this.scheduleTable ? '' : 'upload'\n const description = this.scheduleTable?.name ? ' ' : '공정표 업로드'\n\n return html`\n <div body>\n <div input-container>\n <ox-input-file\n icon=${icon}\n label=${this.scheduleTable?.name || ''}\n description=${description}\n @change=${this._onChangeAttachment.bind(this)}\n ></ox-input-file>\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}><md-icon slot=\"icon\">cancel</md-icon>취소</md-outlined-button>\n </div>\n </div>\n `\n }\n\n private _close() {\n history.back()\n }\n\n // 공정표 업로드\n async _onChangeAttachment(e: CustomEvent) {\n const file = e.detail[0] || null\n\n const response = await client.mutate({\n mutation: gql`\n mutation UploadProjectScheduleTable($param: UploadProjectScheduleTable!) {\n uploadProjectScheduleTable(param: $param)\n }\n `,\n variables: {\n param: {\n projectId: this.projectId,\n scheduleTable: file\n }\n },\n context: {\n hasUpload: true\n }\n })\n\n if (!response.errors) {\n notify({ message: '공정표가 업로드 되었습니다.' })\n this.dispatchEvent(new CustomEvent('uploaded'))\n }\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import '@material/web/icon/icon.js';
2
2
  import { PageView } from '@operato/shell';
3
+ import './component/pagenation';
3
4
  declare const ProjectCompletedListPage_base: typeof PageView & import("@open-wc/dedupe-mixin").Constructor<import("@open-wc/scoped-elements/types/src/types").ScopedElementsHost>;
4
5
  export declare class ProjectCompletedListPage extends ProjectCompletedListPage_base {
5
6
  static styles: import("lit").CSSResult[];
@@ -9,10 +10,14 @@ export declare class ProjectCompletedListPage extends ProjectCompletedListPage_b
9
10
  private projectName;
10
11
  private projectList;
11
12
  private projectCount;
13
+ private currentPage;
14
+ private readonly pageLimit;
15
+ get totalPages(): number;
12
16
  render(): import("lit-html").TemplateResult<1>;
13
17
  pageUpdated(changes: any, lifecycle: any): Promise<void>;
14
18
  getProjectList(): Promise<void>;
15
19
  private _onInputChange;
16
20
  private _onKeypress;
21
+ private _changePage;
17
22
  }
18
23
  export {};
@@ -7,18 +7,24 @@ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
7
7
  import { client } from '@operato/graphql';
8
8
  import gql from 'graphql-tag';
9
9
  import { ProjectState } from './project-list';
10
+ import './component/pagenation';
10
11
  let ProjectCompletedListPage = class ProjectCompletedListPage extends ScopedElementsMixin(PageView) {
11
12
  constructor() {
12
13
  super(...arguments);
13
14
  this.projectName = '';
14
15
  this.projectList = [];
15
16
  this.projectCount = 0;
17
+ this.currentPage = 1;
18
+ this.pageLimit = 20;
16
19
  }
17
20
  get context() {
18
21
  return {
19
22
  title: '완료 프로젝트'
20
23
  };
21
24
  }
25
+ get totalPages() {
26
+ return Math.max(1, Math.ceil((this.projectCount || 0) / this.pageLimit));
27
+ }
22
28
  render() {
23
29
  var _a;
24
30
  return html `
@@ -74,6 +80,12 @@ let ProjectCompletedListPage = class ProjectCompletedListPage extends ScopedElem
74
80
  `;
75
81
  })}
76
82
  </div>
83
+ <pagenation-control
84
+ .currentPage=${this.currentPage}
85
+ .totalItems=${this.projectCount}
86
+ .pageLimit=${this.pageLimit}
87
+ @page-change=${(e) => this._changePage(e.detail.page)}
88
+ ></pagenation-control>
77
89
  `;
78
90
  }
79
91
  async pageUpdated(changes, lifecycle) {
@@ -85,8 +97,8 @@ let ProjectCompletedListPage = class ProjectCompletedListPage extends ScopedElem
85
97
  var _a, _b;
86
98
  const response = await client.query({
87
99
  query: gql `
88
- query Projects($filters: [Filter!]) {
89
- projects(filters: $filters) {
100
+ query Projects($filters: [Filter!], $sortings: [Sorting!], $pagination: Pagination) {
101
+ projects(filters: $filters, sortings: $sortings, pagination: $pagination) {
90
102
  items {
91
103
  id
92
104
  name
@@ -127,7 +139,9 @@ let ProjectCompletedListPage = class ProjectCompletedListPage extends ScopedElem
127
139
  operator: 'eq',
128
140
  value: ProjectState.COMPLETED
129
141
  }
130
- ]
142
+ ],
143
+ sortings: [{ name: 'createdAt', desc: true }],
144
+ pagination: { page: this.currentPage, limit: this.pageLimit }
131
145
  }
132
146
  });
133
147
  this.projectList = ((_a = response.data.projects) === null || _a === void 0 ? void 0 : _a.items) || [];
@@ -137,10 +151,21 @@ let ProjectCompletedListPage = class ProjectCompletedListPage extends ScopedElem
137
151
  _onInputChange(event) {
138
152
  const target = event.target;
139
153
  this[target.name] = target.value;
154
+ if (target.name === 'projectName') {
155
+ this.currentPage = 1;
156
+ }
140
157
  }
141
158
  // 검색창에서 엔터입력시 검색
142
159
  _onKeypress(event) {
143
160
  if (event.code === 'Enter') {
161
+ this.currentPage = 1;
162
+ this.getProjectList();
163
+ }
164
+ }
165
+ _changePage(page) {
166
+ const nextPage = Math.min(Math.max(1, page), this.totalPages);
167
+ if (nextPage !== this.currentPage) {
168
+ this.currentPage = nextPage;
144
169
  this.getProjectList();
145
170
  }
146
171
  }
@@ -286,6 +311,10 @@ __decorate([
286
311
  state(),
287
312
  __metadata("design:type", Number)
288
313
  ], ProjectCompletedListPage.prototype, "projectCount", void 0);
314
+ __decorate([
315
+ state(),
316
+ __metadata("design:type", Number)
317
+ ], ProjectCompletedListPage.prototype, "currentPage", void 0);
289
318
  ProjectCompletedListPage = __decorate([
290
319
  customElement('project-completed-list')
291
320
  ], ProjectCompletedListPage);