@dssp/project 1.0.0-alpha.9 → 1.0.0-y.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) 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} +15 -15
  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} +18 -18
  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} +35 -38
  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} +16 -22
  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.js +50 -20
  34. package/dist-client/pages/project/project-detail.js.map +1 -1
  35. package/dist-client/pages/project/project-list.d.ts +41 -0
  36. package/dist-client/pages/project/project-list.js +66 -3
  37. package/dist-client/pages/project/project-list.js.map +1 -1
  38. package/dist-client/pages/project/project-setting-list.d.ts +5 -0
  39. package/dist-client/pages/project/project-setting-list.js +32 -3
  40. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  41. package/dist-client/pages/project/{project-schedule-list.d.ts → project-task-list.d.ts} +2 -2
  42. package/dist-client/pages/project/{project-schedule-list.js → project-task-list.js} +11 -11
  43. package/dist-client/pages/project/project-task-list.js.map +1 -0
  44. package/dist-client/pages/project/{project-schedule.d.ts → project-task.d.ts} +17 -6
  45. package/dist-client/pages/project/project-task.js +686 -0
  46. package/dist-client/pages/project/project-task.js.map +1 -0
  47. package/dist-client/pages/project/project-update.js +221 -28
  48. package/dist-client/pages/project/project-update.js.map +1 -1
  49. package/dist-client/route.d.ts +1 -1
  50. package/dist-client/route.js +4 -4
  51. package/dist-client/route.js.map +1 -1
  52. package/dist-client/tsconfig.tsbuildinfo +1 -1
  53. package/dist-server/controllers/parse-excel.js.map +1 -1
  54. package/dist-server/service/index.d.ts +2 -2
  55. package/dist-server/service/index.js +5 -2
  56. package/dist-server/service/index.js.map +1 -1
  57. package/dist-server/service/project/project-mutation.js +5 -1
  58. package/dist-server/service/project/project-mutation.js.map +1 -1
  59. package/dist-server/service/project/project-query.d.ts +3 -0
  60. package/dist-server/service/project/project-query.js +48 -0
  61. package/dist-server/service/project/project-query.js.map +1 -1
  62. package/dist-server/service/project/project-type.d.ts +5 -0
  63. package/dist-server/service/project/project-type.js +19 -1
  64. package/dist-server/service/project/project-type.js.map +1 -1
  65. package/dist-server/service/project/project.d.ts +9 -0
  66. package/dist-server/service/project/project.js +31 -1
  67. package/dist-server/service/project/project.js.map +1 -1
  68. package/dist-server/service/task/task-query.d.ts +2 -0
  69. package/dist-server/service/task/task-query.js +11 -0
  70. package/dist-server/service/task/task-query.js.map +1 -1
  71. package/dist-server/service/task/task.d.ts +2 -0
  72. package/dist-server/service/task/task.js +6 -0
  73. package/dist-server/service/task/task.js.map +1 -1
  74. package/dist-server/service/task-checklist-binding/index.d.ts +5 -0
  75. package/dist-server/service/task-checklist-binding/index.js +9 -0
  76. package/dist-server/service/task-checklist-binding/index.js.map +1 -0
  77. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.d.ts +5 -0
  78. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js +186 -0
  79. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js.map +1 -0
  80. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.d.ts +8 -0
  81. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js +61 -0
  82. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js.map +1 -0
  83. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.d.ts +15 -0
  84. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js +57 -0
  85. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js.map +1 -0
  86. package/dist-server/service/task-checklist-binding/task-checklist-binding.d.ts +22 -0
  87. package/dist-server/service/task-checklist-binding/task-checklist-binding.js +106 -0
  88. package/dist-server/service/task-checklist-binding/task-checklist-binding.js.map +1 -0
  89. package/dist-server/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +5 -3
  91. package/things-factory.config.js +3 -3
  92. package/translations/en.json +10 -9
  93. package/translations/ja.json +15 -1
  94. package/translations/ko.json +3 -0
  95. package/translations/ms.json +15 -1
  96. package/translations/zh.json +15 -1
  97. package/dist-client/pages/project/popup/checklist/attachment-list-popup.js.map +0 -1
  98. package/dist-client/pages/project/popup/checklist/comment-list-popup.js.map +0 -1
  99. package/dist-client/pages/project/popup/checklist/schedule-checklist-create-popup.js.map +0 -1
  100. package/dist-client/pages/project/popup/checklist/schedule-checklist-view.js.map +0 -1
  101. package/dist-client/pages/project/popup/popup-schedule-upload.js.map +0 -1
  102. package/dist-client/pages/project/project-schedule-list.js.map +0 -1
  103. package/dist-client/pages/project/project-schedule.js +0 -422
  104. package/dist-client/pages/project/project-schedule.js.map +0 -1
  105. /package/dist-client/pages/project/popup/checklist/{attachment-list-popup.d.ts → task-checklist-attachment-list-popup.d.ts} +0 -0
  106. /package/dist-client/pages/project/popup/checklist/{comment-list-popup.d.ts → task-checklist-comment-list-popup.d.ts} +0 -0
@@ -1,422 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import '@material/web/icon/icon.js';
3
- import '@material/web/button/elevated-button.js';
4
- import '@material/web/textfield/outlined-text-field.js';
5
- import '@material/web/button/filled-button.js';
6
- import '@material/web/button/outlined-button.js';
7
- import { PageView } from '@operato/shell';
8
- import { css, html } from 'lit';
9
- import { customElement, query, state } from 'lit/decorators.js';
10
- import { ScopedElementsMixin } from '@open-wc/scoped-elements';
11
- import { client } from '@operato/graphql';
12
- import { i18next } from '@operato/i18n';
13
- import { openPopup } from '@operato/layout';
14
- import gql from 'graphql-tag';
15
- import { ScrollbarStyles } from '@operato/styles';
16
- import '@operato/gantt/ox-gantt.js';
17
- import './popup/popup-schedule-upload';
18
- import './popup/checklist/schedule-checklist-create-popup';
19
- const TaskFragment = gql `
20
- fragment TaskFragment on Task {
21
- type
22
- title: name
23
- id: code
24
- duration
25
- startDate
26
- endDate
27
- dependsOn
28
- progress
29
- style
30
- resources {
31
- type
32
- allocated
33
- }
34
- }
35
- `;
36
- let ProjectSchedule = class ProjectSchedule extends ScopedElementsMixin(PageView) {
37
- constructor() {
38
- super(...arguments);
39
- this.defaultProject = {
40
- name: '',
41
- buildingComplex: {
42
- address: '',
43
- area: 0,
44
- constructionCompany: '',
45
- clientCompany: '',
46
- supervisoryCompany: '',
47
- designCompany: '',
48
- constructionType: '',
49
- buildings: []
50
- }
51
- };
52
- this.projectId = '';
53
- this.project = Object.assign({}, this.defaultProject);
54
- this.selectedBuildingIdx = 0;
55
- this.constructionTypeList = [];
56
- this.fromDate = '2024-01-01';
57
- this.toDate = '2026-12-31';
58
- this.timeScale = 'week-day';
59
- this.extendGridLines = false;
60
- this.columnConfigProvider = function () {
61
- return [
62
- { name: 'title', label: i18next.t('label.gantt-task-title') || 'title', visible: true, width: 150, order: 1 },
63
- {
64
- name: 'startDate',
65
- label: i18next.t('label.gantt-task-start-date') || 'start date',
66
- visible: true,
67
- width: 100,
68
- order: 2
69
- },
70
- {
71
- name: 'resources',
72
- label: i18next.t('label.gantt-task-resources') || 'resources',
73
- visible: true,
74
- width: 100,
75
- order: 3
76
- },
77
- {
78
- name: 'duration',
79
- label: i18next.t('label.gantt-task-duration') || 'duration',
80
- visible: true,
81
- width: 30,
82
- order: 4
83
- }
84
- ];
85
- };
86
- }
87
- get context() {
88
- return {
89
- title: '공정표'
90
- };
91
- }
92
- render() {
93
- var _a;
94
- return html `
95
- <div header>
96
- <h2>${this.project.name}</h2>
97
- <div button-container>
98
- <md-elevated-button @click=${this._openUploadSchedulePopup}>
99
- <md-icon slot="icon">event_note</md-icon>공정표 관리
100
- </md-elevated-button>
101
- </div>
102
- </div>
103
-
104
- <div body>
105
- <ox-gantt
106
- from-date=${new Date(this.fromDate).toISOString().split('T')[0]}
107
- to-date=${new Date(this.toDate).toISOString().split('T')[0]}
108
- .timeScale=${this.timeScale}
109
- .tasks=${this.tasks}
110
- @date-range-selected=${this.onRangeSelected}
111
- @task-clicked=${(e) => {
112
- console.log('task-clicked', e.detail);
113
- }}
114
- ?extend-grid-lines=${this.extendGridLines}
115
- .columnConfigProvider=${this.columnConfigProvider}
116
- .colorProvider=${task => {
117
- return task.style || 'gray';
118
- }}
119
- >
120
- </ox-gantt>
121
- <div select-container>
122
- <div date>
123
- <span name>기간선택</span>
124
- <div @change=${() => this.onChangePeriodRange()}>
125
- <input type="date" name="startDate" project .value=${this.project.startDate || ''} max="9999-12-31" />
126
- ~
127
- <input type="date" name="endDate" project .value=${this.project.endDate || ''} max="9999-12-31" />
128
- </div>
129
- </div>
130
- <div construction-list-container>
131
- ${(_a = this.constructionTypeList) === null || _a === void 0 ? void 0 : _a.map((constructionType) => html ` <md-outlined-button id=${constructionType.id} @click=${() => this.onConstructionTypeClick(constructionType)}
132
- >${constructionType.title}</md-outlined-button
133
- >`)}
134
- </div>
135
- </div>
136
- </div>
137
- `;
138
- }
139
- async pageInitialized(lifecycle) { }
140
- async pageUpdated(changes, lifecycle) {
141
- if (this.active) {
142
- this.projectId = lifecycle.resourceId || '';
143
- await this.initProject(this.projectId);
144
- }
145
- }
146
- async initProject(projectId = '') {
147
- var _a, _b;
148
- const response = await client.query({
149
- query: gql `
150
- query Project($id: String!, $sortings: [Sorting!]) {
151
- project(id: $id) {
152
- id
153
- name
154
- startDate
155
- endDate
156
- rootTasks {
157
- ...TaskFragment
158
- children(sortings: $sortings) {
159
- ...TaskFragment
160
- children(sortings: $sortings) {
161
- ...TaskFragment
162
- }
163
- }
164
- }
165
- scheduleTable {
166
- id
167
- name
168
- }
169
- buildingComplex {
170
- id
171
- planXScale
172
- planYScale
173
- buildings {
174
- id
175
- name
176
- drawing {
177
- id
178
- name
179
- }
180
- buildingLevels {
181
- id
182
- floor
183
- mainDrawing {
184
- id
185
- name
186
- }
187
- }
188
- }
189
- }
190
- }
191
- }
192
-
193
- ${TaskFragment}
194
- `,
195
- variables: {
196
- id: projectId,
197
- sortings: [{ name: 'startDate' }]
198
- }
199
- });
200
- this.project = (_a = response.data) === null || _a === void 0 ? void 0 : _a.project;
201
- this.tasks = (_b = response.data) === null || _b === void 0 ? void 0 : _b.project.rootTasks;
202
- if (this.project) {
203
- this.fromDate = this.project.startDate || '2024-01-01'; /* TODO default: start date of this year - 3 */
204
- this.toDate = this.project.endDate || '2026-12-31'; /* TODO defaule: end date of this year + 3 */
205
- }
206
- console.log('init project : ', this.project);
207
- }
208
- onChangePeriodRange() {
209
- this.fromDate = this.inputStartDate.value;
210
- this.toDate = this.inputEndDate.value;
211
- }
212
- onRangeSelected(e) {
213
- const selectedFromDate = new Date(e.detail.start + 'T00:00:00.000Z');
214
- const selectedToDate = new Date(e.detail.end + 'T23:59:59.000Z');
215
- this.constructionTypeList = this.tasks.filter(constuction => {
216
- const constuctionStartDate = new Date(constuction.startDate);
217
- const constuctionEndDate = new Date(constuction.endDate);
218
- return constuctionStartDate <= selectedToDate && constuctionEndDate >= selectedFromDate;
219
- });
220
- }
221
- _openUploadSchedulePopup() {
222
- var _a;
223
- openPopup(html `<popup-schedule-upload
224
- .projectId=${this.projectId}
225
- .scheduleTable=${(_a = this.project) === null || _a === void 0 ? void 0 : _a.scheduleTable}
226
- @uploaded=${() => this.initProject(this.projectId)}
227
- ></popup-schedule-upload>`, {
228
- backdrop: true,
229
- size: 'medium',
230
- title: `공정표 업로드`
231
- });
232
- }
233
- onConstructionTypeClick(constructionType) {
234
- openPopup(html `<schedule-checklist-create-popup
235
- .projectId=${this.projectId}
236
- .taskCode=${constructionType.id}
237
- @requestRefresh="${() => this.initProject(this.projectId)}"
238
- ></schedule-checklist-create-popup>`, {
239
- backdrop: true,
240
- size: 'large',
241
- title: `체크리스트 생성`
242
- });
243
- console.log('constructionType', constructionType);
244
- }
245
- };
246
- ProjectSchedule.styles = [
247
- ScrollbarStyles,
248
- css `
249
- :host {
250
- display: flex;
251
- flex-direction: column;
252
-
253
- color: #4e5055;
254
-
255
- width: 100%;
256
- background-color: var(--md-sys-color-background, #f6f6f6);
257
- overflow-y: auto;
258
-
259
- --grid-record-emphasized-background-color: red;
260
- --grid-record-emphasized-color: yellow;
261
- }
262
-
263
- *[bold] {
264
- font-weight: bold;
265
- }
266
-
267
- div[header] {
268
- display: flex;
269
- margin: 0px var(--spacing-large, 12px);
270
-
271
- h2 {
272
- flex: 0.5;
273
- color: #3f71a0;
274
- font-size:18px;
275
- }
276
-
277
- div[button-container] {
278
- display: flex;
279
- align-items: center;
280
- justify-content: end;
281
- flex: 0.5;
282
-
283
- md-elevated-button {
284
- margin: 0px margin-left: var(--spacing-small, 4px);
285
-
286
- --md-elevated-button-container-height: 32px;
287
- --md-elevated-button-label-text-size: 16px;
288
- --md-elevated-button-container-color: #0595e5;
289
-
290
- --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
291
- --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
292
- --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
293
- --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
294
- --md-elevated-button-icon-color: var(--md-sys-color-on-primary);
295
- --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
296
- --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
297
- --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
298
- }
299
- }
300
- }
301
-
302
- div[body] {
303
- flex: 1;
304
-
305
- display: flex;
306
- flex-direction: column;
307
- margin: var(--spacing-large, 12px);
308
- margin-top:0;
309
- gap: var(--spacing-medium, 8px);
310
- overflow: hidden;
311
-
312
- h3 {
313
- color: #2e79be;
314
- font-size: 16px;
315
- margin: 0px;
316
- }
317
-
318
- & > div {
319
- display: flex;
320
- border-radius: 5px;
321
- }
322
-
323
- ox-gantt {
324
- flex: 1;
325
- box-sizing: border-box;
326
- overflow: hidden;
327
-
328
- background-color: var(--md-sys-color-primary-container);
329
- color: var(--md-sys-color-on-primary-container);
330
- }
331
-
332
- div[select-container] {
333
- gap: var(--spacing-medium, 8px);
334
-
335
- div[date] {
336
- display: flex;
337
- align-items: center;
338
- justify-content: space-between;
339
- background-color: #2ea4df1a;
340
- border: 1px solid #2ea4df33;
341
- border-radius: 5px;
342
- gap: var(--spacing-medium, 8px);
343
- padding: 12px 36px 12px 15px;
344
-
345
- span[name] {
346
- font-size: 16px;
347
- font-weight: bold;
348
- }
349
-
350
- input[type="date"] {
351
- border:1px solid rgba(51,51,51,.20);
352
- padding:var(--spacing-small, 4px) var(--spacing-medium, 8px);
353
- border-radius: 5px;
354
- }
355
- }
356
-
357
- div[construction-list-container] {
358
- flex: 1;
359
- display: flex;
360
- border-radius: 5px;
361
- border: 1px solid #cccccc80;
362
- background-color: #fff;
363
- padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
364
- gap: var(--spacing-medium, 8px);
365
- overflow-x: auto;
366
-
367
- md-outlined-button {
368
- --md-outlined-button-container-height: 30px;
369
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
370
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
371
- --md-outlined-button-label-text-color: #586878;
372
- --md-sys-color-outline: rgba(51,51,51,.20);
373
- box-shadow: 1px 1px 1px #0000001a;
374
- padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
375
- font-weight: 700;
376
- }
377
- }
378
- }
379
- }
380
- `
381
- ];
382
- __decorate([
383
- state(),
384
- __metadata("design:type", String)
385
- ], ProjectSchedule.prototype, "projectId", void 0);
386
- __decorate([
387
- state(),
388
- __metadata("design:type", Object)
389
- ], ProjectSchedule.prototype, "project", void 0);
390
- __decorate([
391
- state(),
392
- __metadata("design:type", Number)
393
- ], ProjectSchedule.prototype, "selectedBuildingIdx", void 0);
394
- __decorate([
395
- state(),
396
- __metadata("design:type", Object)
397
- ], ProjectSchedule.prototype, "tasks", void 0);
398
- __decorate([
399
- state(),
400
- __metadata("design:type", Object)
401
- ], ProjectSchedule.prototype, "constructionTypeList", void 0);
402
- __decorate([
403
- state(),
404
- __metadata("design:type", Object)
405
- ], ProjectSchedule.prototype, "fromDate", void 0);
406
- __decorate([
407
- state(),
408
- __metadata("design:type", Object)
409
- ], ProjectSchedule.prototype, "toDate", void 0);
410
- __decorate([
411
- query('input[name="startDate"]'),
412
- __metadata("design:type", HTMLInputElement)
413
- ], ProjectSchedule.prototype, "inputStartDate", void 0);
414
- __decorate([
415
- query('input[name="endDate"]'),
416
- __metadata("design:type", HTMLInputElement)
417
- ], ProjectSchedule.prototype, "inputEndDate", void 0);
418
- ProjectSchedule = __decorate([
419
- customElement('project-schedule')
420
- ], ProjectSchedule);
421
- export { ProjectSchedule };
422
- //# sourceMappingURL=project-schedule.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-schedule.js","sourceRoot":"","sources":["../../../client/pages/project/project-schedule.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/textfield/outlined-text-field.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\n\nimport { PageView } from '@operato/shell'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { Project } from './project-list'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { ScrollbarStyles } from '@operato/styles'\nimport '@operato/gantt/ox-gantt.js'\nimport './popup/popup-schedule-upload'\nimport './popup/checklist/schedule-checklist-create-popup'\n\nconst TaskFragment = gql`\n fragment TaskFragment on Task {\n type\n title: name\n id: code\n duration\n startDate\n endDate\n dependsOn\n progress\n style\n resources {\n type\n allocated\n }\n }\n`\n\n@customElement('project-schedule')\nexport class ProjectSchedule extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n color: #4e5055;\n\n width: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px var(--spacing-large, 12px);\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n font-size:18px;\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n\n md-elevated-button {\n margin: 0px margin-left: var(--spacing-small, 4px);\n\n --md-elevated-button-container-height: 32px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);\n }\n }\n }\n\n div[body] {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n margin: var(--spacing-large, 12px);\n margin-top:0;\n gap: var(--spacing-medium, 8px);\n overflow: hidden;\n\n h3 {\n color: #2e79be;\n font-size: 16px;\n margin: 0px;\n }\n\n & > div {\n display: flex;\n border-radius: 5px;\n }\n\n ox-gantt {\n flex: 1;\n box-sizing: border-box;\n overflow: hidden;\n\n background-color: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n div[select-container] {\n gap: var(--spacing-medium, 8px);\n\n div[date] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background-color: #2ea4df1a;\n border: 1px solid #2ea4df33;\n border-radius: 5px;\n gap: var(--spacing-medium, 8px);\n padding: 12px 36px 12px 15px;\n\n span[name] {\n font-size: 16px;\n font-weight: bold;\n }\n\n input[type=\"date\"] {\n border:1px solid rgba(51,51,51,.20);\n padding:var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-radius: 5px;\n }\n }\n\n div[construction-list-container] {\n flex: 1;\n display: flex;\n border-radius: 5px;\n border: 1px solid #cccccc80;\n background-color: #fff;\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n gap: var(--spacing-medium, 8px);\n overflow-x: auto;\n\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: var(--spacing-medium, 8px);\n --md-outlined-button-leading-space: var(--spacing-medium, 8px);\n --md-outlined-button-label-text-color: #586878;\n --md-sys-color-outline: rgba(51,51,51,.20);\n box-shadow: 1px 1px 1px #0000001a;\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n font-weight: 700;\n }\n }\n }\n }\n `\n ]\n\n get context() {\n return {\n title: '공정표'\n }\n }\n\n private defaultProject = {\n name: '',\n buildingComplex: {\n address: '',\n area: 0,\n constructionCompany: '',\n clientCompany: '',\n supervisoryCompany: '',\n designCompany: '',\n constructionType: '',\n buildings: []\n }\n }\n @state() projectId: string = ''\n @state() project: Project = { ...this.defaultProject }\n @state() selectedBuildingIdx: number = 0\n @state() tasks\n @state() constructionTypeList = []\n\n @state() private fromDate = '2024-01-01'\n @state() private toDate = '2026-12-31'\n\n @query('input[name=\"startDate\"]') inputStartDate!: HTMLInputElement\n @query('input[name=\"endDate\"]') inputEndDate!: HTMLInputElement\n\n private timeScale = 'week-day'\n private extendGridLines = false\n\n private columnConfigProvider = function () {\n return [\n { name: 'title', label: i18next.t('label.gantt-task-title') || 'title', visible: true, width: 150, order: 1 },\n {\n name: 'startDate',\n label: i18next.t('label.gantt-task-start-date') || 'start date',\n visible: true,\n width: 100,\n order: 2\n },\n {\n name: 'resources',\n label: i18next.t('label.gantt-task-resources') || 'resources',\n visible: true,\n width: 100,\n order: 3\n },\n {\n name: 'duration',\n label: i18next.t('label.gantt-task-duration') || 'duration',\n visible: true,\n width: 30,\n order: 4\n }\n ]\n }\n\n render() {\n return html`\n <div header>\n <h2>${this.project.name}</h2>\n <div button-container>\n <md-elevated-button @click=${this._openUploadSchedulePopup}>\n <md-icon slot=\"icon\">event_note</md-icon>공정표 관리\n </md-elevated-button>\n </div>\n </div>\n\n <div body>\n <ox-gantt\n from-date=${new Date(this.fromDate).toISOString().split('T')[0]}\n to-date=${new Date(this.toDate).toISOString().split('T')[0]}\n .timeScale=${this.timeScale}\n .tasks=${this.tasks}\n @date-range-selected=${this.onRangeSelected}\n @task-clicked=${(e: CustomEvent) => {\n console.log('task-clicked', e.detail)\n }}\n ?extend-grid-lines=${this.extendGridLines}\n .columnConfigProvider=${this.columnConfigProvider}\n .colorProvider=${task => {\n return task.style || 'gray'\n }}\n >\n </ox-gantt>\n <div select-container>\n <div date>\n <span name>기간선택</span>\n <div @change=${() => this.onChangePeriodRange()}>\n <input type=\"date\" name=\"startDate\" project .value=${this.project.startDate || ''} max=\"9999-12-31\" />\n ~\n <input type=\"date\" name=\"endDate\" project .value=${this.project.endDate || ''} max=\"9999-12-31\" />\n </div>\n </div>\n <div construction-list-container>\n ${this.constructionTypeList?.map(\n (constructionType: any) =>\n html` <md-outlined-button id=${constructionType.id} @click=${() => this.onConstructionTypeClick(constructionType)}\n >${constructionType.title}</md-outlined-button\n >`\n )}\n </div>\n </div>\n </div>\n `\n }\n\n async pageInitialized(lifecycle: PageLifecycle) {}\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.projectId = lifecycle.resourceId || ''\n await this.initProject(this.projectId)\n }\n }\n\n async initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!, $sortings: [Sorting!]) {\n project(id: $id) {\n id\n name\n startDate\n endDate\n rootTasks {\n ...TaskFragment\n children(sortings: $sortings) {\n ...TaskFragment\n children(sortings: $sortings) {\n ...TaskFragment\n }\n }\n }\n scheduleTable {\n id\n name\n }\n buildingComplex {\n id\n planXScale\n planYScale\n buildings {\n id\n name\n drawing {\n id\n name\n }\n buildingLevels {\n id\n floor\n mainDrawing {\n id\n name\n }\n }\n }\n }\n }\n }\n\n ${TaskFragment}\n `,\n variables: {\n id: projectId,\n sortings: [{ name: 'startDate' }]\n }\n })\n\n this.project = response.data?.project\n this.tasks = response.data?.project.rootTasks\n\n if (this.project) {\n this.fromDate = this.project.startDate || '2024-01-01' /* TODO default: start date of this year - 3 */\n this.toDate = this.project.endDate || '2026-12-31' /* TODO defaule: end date of this year + 3 */\n }\n\n console.log('init project : ', this.project)\n }\n\n onChangePeriodRange() {\n this.fromDate = this.inputStartDate.value\n this.toDate = this.inputEndDate.value\n }\n\n onRangeSelected(e: CustomEvent) {\n const selectedFromDate = new Date(e.detail.start + 'T00:00:00.000Z')\n const selectedToDate = new Date(e.detail.end + 'T23:59:59.000Z')\n\n this.constructionTypeList = this.tasks.filter(constuction => {\n const constuctionStartDate = new Date(constuction.startDate)\n const constuctionEndDate = new Date(constuction.endDate)\n\n return constuctionStartDate <= selectedToDate && constuctionEndDate >= selectedFromDate\n })\n }\n\n private _openUploadSchedulePopup() {\n openPopup(\n html`<popup-schedule-upload\n .projectId=${this.projectId}\n .scheduleTable=${this.project?.scheduleTable}\n @uploaded=${() => this.initProject(this.projectId)}\n ></popup-schedule-upload>`,\n {\n backdrop: true,\n size: 'medium',\n title: `공정표 업로드`\n }\n )\n }\n\n private onConstructionTypeClick(constructionType: any) {\n openPopup(\n html`<schedule-checklist-create-popup\n .projectId=${this.projectId}\n .taskCode=${constructionType.id}\n @requestRefresh=\"${() => this.initProject(this.projectId)}\"\n ></schedule-checklist-create-popup>`,\n {\n backdrop: true,\n size: 'large',\n title: `체크리스트 생성`\n }\n )\n\n console.log('constructionType', constructionType)\n }\n}\n"]}