@dssp/project 0.0.36 → 1.0.0-alpha.1

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 (100) hide show
  1. package/dist-client/pages/project/project-schedule.js +31 -22
  2. package/dist-client/pages/project/project-schedule.js.map +1 -1
  3. package/dist-client/tsconfig.tsbuildinfo +1 -1
  4. package/dist-server/tsconfig.tsbuildinfo +1 -1
  5. package/package.json +11 -11
  6. package/client/bootstrap.ts +0 -0
  7. package/client/index.ts +0 -0
  8. package/client/pages/lib/select2-component.ts +0 -175
  9. package/client/pages/lib/waether.ts +0 -159
  10. package/client/pages/project/component/project-update-header.ts +0 -88
  11. package/client/pages/project/popup/popup-plan-upload.ts +0 -138
  12. package/client/pages/project/popup/popup-project-create.ts +0 -147
  13. package/client/pages/project/popup/popup-schedule-upload.ts +0 -102
  14. package/client/pages/project/project-completed-list.ts +0 -281
  15. package/client/pages/project/project-detail.ts +0 -738
  16. package/client/pages/project/project-list.ts +0 -418
  17. package/client/pages/project/project-plan-management.ts +0 -476
  18. package/client/pages/project/project-schedule-list.ts +0 -294
  19. package/client/pages/project/project-schedule.ts +0 -393
  20. package/client/pages/project/project-setting-list.ts +0 -393
  21. package/client/pages/project/project-update.ts +0 -876
  22. package/client/pages/resource/construction-detail-type-popup.ts +0 -201
  23. package/client/pages/resource/construction-type-management.ts +0 -212
  24. package/client/pages/resource/inspection-drawing-type-management.ts +0 -245
  25. package/client/pages/resource/inspection-part-popup.ts +0 -201
  26. package/client/pages/resource/resource-importer.ts +0 -97
  27. package/client/pages/resource/resource-list-page.ts +0 -356
  28. package/client/pages/resource/worker-type-management.ts +0 -192
  29. package/client/pages/task/task-importer.ts +0 -94
  30. package/client/pages/task/task-list-page.ts +0 -340
  31. package/client/pages/task-resource/task-resource-importer.ts +0 -97
  32. package/client/pages/task-resource/task-resource-list-page.ts +0 -356
  33. package/client/route.ts +0 -55
  34. package/client/tsconfig.json +0 -11
  35. package/server/controllers/export-tasks.ts +0 -40
  36. package/server/controllers/import-task.ts +0 -134
  37. package/server/controllers/index.ts +0 -0
  38. package/server/controllers/parse-excel.ts +0 -86
  39. package/server/controllers/types.ts +0 -20
  40. package/server/index.ts +0 -4
  41. package/server/middlewares/index.ts +0 -3
  42. package/server/migrations/1723861466413-seed-roles.ts +0 -128
  43. package/server/migrations/1723861466414-seed-codes.ts +0 -157
  44. package/server/migrations/1723861476419-seed-resources.ts +0 -62
  45. package/server/migrations/1723861478420-seed-/bsample-project.ts +0 -87
  46. package/server/migrations/1723861478421-seed-/bsample-tasks.ts +0 -194
  47. package/server/migrations/index.ts +0 -9
  48. package/server/routes.ts +0 -108
  49. package/server/service/construction-detail-type/construction-detail-type-mutation.ts +0 -57
  50. package/server/service/construction-detail-type/construction-detail-type-query.ts +0 -31
  51. package/server/service/construction-detail-type/construction-detail-type-type.ts +0 -26
  52. package/server/service/construction-detail-type/construction-detail-type.ts +0 -52
  53. package/server/service/construction-detail-type/index.ts +0 -6
  54. package/server/service/construction-type/construction-type-mutation.ts +0 -66
  55. package/server/service/construction-type/construction-type-query.ts +0 -56
  56. package/server/service/construction-type/construction-type-type.ts +0 -26
  57. package/server/service/construction-type/construction-type.ts +0 -74
  58. package/server/service/construction-type/index.ts +0 -6
  59. package/server/service/index.ts +0 -56
  60. package/server/service/inspection-drawing-type/index.ts +0 -6
  61. package/server/service/inspection-drawing-type/inspection-drawing-type-mutation.ts +0 -69
  62. package/server/service/inspection-drawing-type/inspection-drawing-type-query.ts +0 -55
  63. package/server/service/inspection-drawing-type/inspection-drawing-type-type.ts +0 -23
  64. package/server/service/inspection-drawing-type/inspection-drawing-type.ts +0 -68
  65. package/server/service/inspection-part/index.ts +0 -6
  66. package/server/service/inspection-part/inspection-part-mutation.ts +0 -52
  67. package/server/service/inspection-part/inspection-part-query.ts +0 -41
  68. package/server/service/inspection-part/inspection-part-type.ts +0 -26
  69. package/server/service/inspection-part/inspection-part.ts +0 -51
  70. package/server/service/manager/index.ts +0 -6
  71. package/server/service/manager/manager-mutation.ts +0 -42
  72. package/server/service/manager/manager-query.ts +0 -28
  73. package/server/service/manager/manager-type.ts +0 -40
  74. package/server/service/manager/manager.ts +0 -29
  75. package/server/service/project/index.ts +0 -6
  76. package/server/service/project/project-mutation.ts +0 -255
  77. package/server/service/project/project-query.ts +0 -105
  78. package/server/service/project/project-type.ts +0 -72
  79. package/server/service/project/project.ts +0 -134
  80. package/server/service/resource/index.ts +0 -7
  81. package/server/service/resource/resource-mutation.ts +0 -137
  82. package/server/service/resource/resource-query.ts +0 -50
  83. package/server/service/resource/resource-type.ts +0 -41
  84. package/server/service/resource/resource.ts +0 -82
  85. package/server/service/task/index.ts +0 -6
  86. package/server/service/task/task-mutation.ts +0 -135
  87. package/server/service/task/task-query.ts +0 -169
  88. package/server/service/task/task-type.ts +0 -75
  89. package/server/service/task/task.ts +0 -130
  90. package/server/service/task-resource/index.ts +0 -7
  91. package/server/service/task-resource/task-resource-mutation.ts +0 -140
  92. package/server/service/task-resource/task-resource-query.ts +0 -36
  93. package/server/service/task-resource/task-resource-type.ts +0 -41
  94. package/server/service/task-resource/task-resource.ts +0 -51
  95. package/server/service/worker-type/index.ts +0 -6
  96. package/server/service/worker-type/worker-type-mutation.ts +0 -66
  97. package/server/service/worker-type/worker-type-query.ts +0 -47
  98. package/server/service/worker-type/worker-type-type.ts +0 -26
  99. package/server/service/worker-type/worker-type.ts +0 -68
  100. package/server/tsconfig.json +0 -10
@@ -1,294 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
-
3
- import { PageView } from '@operato/shell'
4
- import { css, html } from 'lit'
5
- import { customElement, state } from 'lit/decorators.js'
6
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
7
- import { client } from '@operato/graphql'
8
- import gql from 'graphql-tag'
9
- import { Project } from './project-list'
10
-
11
- @customElement('project-schedule-list')
12
- export class ProjectScheduleListPage extends ScopedElementsMixin(PageView) {
13
- static styles = [
14
- css`
15
- :host {
16
- display: flex;
17
- flex-direction: column;
18
- overflow-y: auto;
19
-
20
- width: 100%;
21
- height: 100%;
22
- background-color: #f7f7f7;
23
-
24
- --grid-record-emphasized-background-color: red;
25
- --grid-record-emphasized-color: yellow;
26
- }
27
-
28
- div[header] {
29
- display: flex;
30
- height: 100px;
31
- align-items: center;
32
- background-color: #2ea4df1a;
33
- border: 1px solid #2ea4df33;
34
- margin: 15px 23px;
35
- font-size: 18px;
36
- padding: 7px;
37
- border-radius: 5px;
38
-
39
- md-filled-text-field[type='search'] {
40
- margin-left: 5px;
41
- margin-right: 26px;
42
-
43
- --md-filled-text-field-container-shape: 0px;
44
- --md-sys-color-primary: #006a6a;
45
- --md-sys-color-surface-container-highest: transparent;
46
- --md-filled-text-field-label-text-color: #999999;
47
- --md-filled-text-field-input-text-color: #4e5055;
48
- }
49
-
50
- md-elevated-button[add-project] {
51
- font-weight: bold;
52
- font-size: 16px;
53
- margin-left: 17px;
54
- padding: 13px 20px;
55
-
56
- --md-sys-color-surface-container-low: #24be7b;
57
- --md-sys-color-primary: #ffffff;
58
- --md-elevated-button-container-shape: 7px;
59
- }
60
- }
61
-
62
- div[body] {
63
- div[project-container] {
64
- height: 140px;
65
- margin: 17px 23px;
66
- background-color: #ffffff;
67
- border: 1px solid #cccccc80;
68
- border-radius: 5px;
69
-
70
- & > a {
71
- display: flex;
72
- width: 100%;
73
- height: 100%;
74
- text-decoration: none;
75
- color: #000;
76
- }
77
-
78
- img[project-img] {
79
- width: 285px;
80
- background-color: #cccccc80;
81
- }
82
- img[project-img][no-image] {
83
- object-fit: contain;
84
- opacity: 0.5;
85
- }
86
-
87
- span[project-info] {
88
- flex: 0.45;
89
- padding: 6px 15px;
90
- font-size: 16px;
91
-
92
- white-space: nowrap;
93
- overflow: hidden;
94
- text-overflow: ellipsis;
95
-
96
- div[name] {
97
- color: #2e79be;
98
- font-weight: bold;
99
- font-size: 19px;
100
- margin-bottom: 2px;
101
- }
102
- }
103
-
104
- span[project-state] {
105
- flex: 0.55;
106
- padding: 10px 20px;
107
-
108
- & > div {
109
- margin-bottom: 3px;
110
- }
111
-
112
- div[progress] {
113
- position: relative;
114
-
115
- md-linear-progress {
116
- --md-linear-progress-track-height: 18px;
117
- --md-linear-progress-active-indicator-height: 18px;
118
- --md-linear-progress-track-shape: 5px;
119
- --md-sys-color-primary: #0595e51a;
120
- --md-sys-color-surface-container-highest: #0595e533;
121
- }
122
-
123
- span {
124
- position: absolute;
125
- top: 0;
126
- left: 12px;
127
- font-size: 12px;
128
- font-weight: bold;
129
- color: #2e79be;
130
-
131
- &:last-child {
132
- left: unset;
133
- right: 12px;
134
- }
135
- }
136
- }
137
- }
138
- }
139
- }
140
- `
141
- ]
142
-
143
- get context() {
144
- return {
145
- title: '진행중 프로젝트'
146
- }
147
- }
148
-
149
- @state() private projectName: string = ''
150
- @state() private projectList: Project[] = []
151
- @state() private projectCount: number = 0
152
-
153
- render() {
154
- return html`
155
- <div header>
156
- <label>프로젝트 이름</label>
157
- <md-filled-text-field
158
- name="projectName"
159
- type="search"
160
- label="프로젝트 이름"
161
- .value=${this.projectName}
162
- @input=${this._onInputChange}
163
- @keypress=${this._onKeypress}
164
- >
165
- <md-icon slot="leading-icon">search</md-icon>
166
- </md-filled-text-field>
167
-
168
- <strong>총 ${this.projectCount}개</strong>
169
- </div>
170
-
171
- <div body>
172
- ${this.projectList?.map((project: Project) => {
173
- return html`
174
- <div project-container>
175
- <a href=${`project-schedule/${project.id}`}>
176
- <img
177
- ?no-image=${!project.mainPhoto?.fullpath}
178
- project-img
179
- src=${project.mainPhoto?.fullpath || '/assets/images/no-image.png'}
180
- />
181
-
182
- <span project-info>
183
- <div name>${project.name}</div>
184
- <div content>${project.buildingComplex.address}</div>
185
- <div content>면적: ${project.buildingComplex?.area?.toLocaleString() || ''}㎡</div>
186
- <div content>착공~준공: ${project.startDate}~${project.endDate}</div>
187
- <div content>발주처: <strong>${project.buildingComplex.clientCompany}</strong></div>
188
- </span>
189
-
190
- <span project-state>
191
- <div progress>
192
- <md-linear-progress buffer="100" max="100" value=${project.totalProgress || 0}> </md-linear-progress>
193
- <span>전체</span>
194
- <span>${project.totalProgress || 0}%</span>
195
- </div>
196
- <div progress>
197
- <md-linear-progress buffer="100" max="100" value=${project.weeklyProgress || 0}> </md-linear-progress>
198
- <span>주간</span>
199
- <span>${project.weeklyProgress || 0}%</span>
200
- </div>
201
- <div progress>
202
- <md-linear-progress buffer="100" max="100" value=${project.kpi || 0}> </md-linear-progress>
203
- <span>KPI</span>
204
- <span>${project.kpi || 0}%</span>
205
- </div>
206
- <div progress>
207
- <md-linear-progress buffer="100" max="100" value=${project.inspPassRate || 0}> </md-linear-progress>
208
- <span>Inspection Passing Rate</span>
209
- <span>${project.inspPassRate || 0}%</span>
210
- </div>
211
- <div progress>
212
- <md-linear-progress buffer="100" max="100" value=${project.robotProgressRate || 0}> </md-linear-progress>
213
- <span>Robot Progress</span>
214
- <span>${project.robotProgressRate || 0}%</span>
215
- </div>
216
- <div progress>
217
- <md-linear-progress buffer="100" max="100" value=${project.structuralSafetyRate || 0}> </md-linear-progress>
218
- <span>Structural safety</span>
219
- <span>${project.structuralSafetyRate || 0}%</span>
220
- </div>
221
- </span>
222
- </a>
223
- </div>
224
- `
225
- })}
226
- </div>
227
- `
228
- }
229
-
230
- async pageUpdated(changes: any, lifecycle: any) {
231
- if (this.active) {
232
- this.getProjectList()
233
- }
234
- }
235
-
236
- async getProjectList() {
237
- const response = await client.query({
238
- query: gql`
239
- query Projects($filters: [Filter!]) {
240
- projects(filters: $filters) {
241
- items {
242
- id
243
- name
244
- startDate
245
- endDate
246
- mainPhoto {
247
- fullpath
248
- }
249
- totalProgress
250
- weeklyProgress
251
- kpi
252
- inspPassRate
253
- robotProgressRate
254
- structuralSafetyRate
255
- buildingComplex {
256
- address
257
- area
258
- clientCompany
259
- }
260
- }
261
- total
262
- }
263
- }
264
- `,
265
- variables: {
266
- filters: this.projectName
267
- ? [
268
- {
269
- name: 'name',
270
- operator: 'search',
271
- value: `%${this.projectName}%`
272
- }
273
- ]
274
- : []
275
- }
276
- })
277
-
278
- this.projectList = response.data.projects?.items || []
279
- this.projectCount = response.data.projects?.total || 0
280
- }
281
-
282
- // Input 요소의 값이 변경될 때 호출되는 콜백 함수
283
- private _onInputChange(event: InputEvent) {
284
- const target = event.target as HTMLInputElement
285
- this[target.name] = target.value
286
- }
287
-
288
- // 검색창에서 엔터입력시 검색
289
- private _onKeypress(event: KeyboardEvent) {
290
- if (event.code === 'Enter') {
291
- this.getProjectList()
292
- }
293
- }
294
- }
@@ -1,393 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import '@material/web/button/elevated-button.js'
3
- import '@material/web/textfield/outlined-text-field.js'
4
- import '@material/web/button/filled-button.js'
5
- import '@material/web/button/outlined-button.js'
6
-
7
- import { PageView } from '@operato/shell'
8
- import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'
9
- import { css, html } from 'lit'
10
- import { customElement, query, state } from 'lit/decorators.js'
11
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
12
- import { client } from '@operato/graphql'
13
- import { i18next } from '@operato/i18n'
14
- import { openPopup } from '@operato/layout'
15
- import gql from 'graphql-tag'
16
- import { Project } from './project-list'
17
- import { keyed } from 'lit/directives/keyed.js'
18
- import { ScrollbarStyles } from '@operato/styles'
19
- import '@operato/gantt/ox-gantt.js'
20
- import './popup/popup-schedule-upload'
21
-
22
- const TaskFragment = gql`
23
- fragment TaskFragment on Task {
24
- type
25
- title: name
26
- id: code
27
- duration
28
- startDate
29
- endDate
30
- dependsOn
31
- progress
32
- style
33
- resources {
34
- type
35
- allocated
36
- }
37
- }
38
- `
39
-
40
- @customElement('project-schedule')
41
- export class ProjectSchedule extends ScopedElementsMixin(PageView) {
42
- static styles = [
43
- ScrollbarStyles,
44
- css`
45
- :host {
46
- display: flex;
47
- flex-direction: column;
48
-
49
- color: #4e5055;
50
-
51
- width: 100%;
52
- background-color: var(--md-sys-color-background, #f6f6f6);
53
- overflow-y: auto;
54
-
55
- --grid-record-emphasized-background-color: red;
56
- --grid-record-emphasized-color: yellow;
57
- }
58
-
59
- *[bold] {
60
- font-weight: bold;
61
- }
62
-
63
- div[header] {
64
- display: flex;
65
- margin: 0px var(--spacing-large, 12px);
66
-
67
- h2 {
68
- flex: 0.5;
69
- color: #3f71a0;
70
- font-size:18px;
71
- }
72
-
73
- div[button-container] {
74
- display: flex;
75
- align-items: center;
76
- justify-content: end;
77
- flex: 0.5;
78
-
79
- md-elevated-button {
80
- margin: 0px margin-left: var(--spacing-small, 4px);
81
-
82
- --md-elevated-button-container-height: 32px;
83
- --md-elevated-button-label-text-size: 16px;
84
- --md-elevated-button-container-color: #0595e5;
85
-
86
- --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
87
- --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
88
- --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
89
- --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
90
- --md-elevated-button-icon-color: var(--md-sys-color-on-primary);
91
- --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
92
- --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
93
- --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
94
- }
95
- }
96
- }
97
-
98
- div[body] {
99
- flex: 1;
100
-
101
- display: flex;
102
- flex-direction: column;
103
- margin: var(--spacing-large, 12px);
104
- margin-top:0;
105
- gap: var(--spacing-medium, 8px);
106
- overflow: hidden;
107
-
108
- h3 {
109
- color: #2e79be;
110
- font-size: 16px;
111
- margin: 0px;
112
- }
113
-
114
- & > div {
115
- display: flex;
116
- border-radius: 5px;
117
- }
118
-
119
- ox-gantt {
120
- flex: 1;
121
- box-sizing: border-box;
122
- overflow: hidden;
123
-
124
- background-color: var(--md-sys-color-primary-container);
125
- color: var(--md-sys-color-on-primary-container);
126
- }
127
-
128
- div[select-container] {
129
- gap: var(--spacing-medium, 8px);
130
-
131
- div[date] {
132
- display: flex;
133
- align-items: center;
134
- justify-content: space-between;
135
- background-color: #2ea4df1a;
136
- border: 1px solid #2ea4df33;
137
- border-radius: 5px;
138
- gap: var(--spacing-medium, 8px);
139
- padding: 12px 36px 12px 15px;
140
-
141
- span[name] {
142
- font-size: 16px;
143
- font-weight: bold;
144
- }
145
-
146
- input[type="date"] {
147
- border:1px solid rgba(51,51,51,.20);
148
- padding:var(--spacing-small, 4px) var(--spacing-medium, 8px);
149
- border-radius: 5px;
150
- }
151
- }
152
-
153
- div[construction-list-container] {
154
- flex: 1;
155
- display: flex;
156
- border-radius: 5px;
157
- border: 1px solid #cccccc80;
158
- background-color: #fff;
159
- padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
160
- gap: var(--spacing-medium, 8px);
161
- overflow-x: auto;
162
-
163
- md-outlined-button {
164
- --md-outlined-button-container-height: 30px;
165
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
166
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
167
- --md-outlined-button-label-text-color: #586878;
168
- --md-sys-color-outline: rgba(51,51,51,.20);
169
- box-shadow: 1px 1px 1px #0000001a;
170
- padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
171
- font-weight: 700;
172
- }
173
- }
174
- }
175
- }
176
- `
177
- ]
178
-
179
- get context() {
180
- return {
181
- title: '공정표'
182
- }
183
- }
184
-
185
- private defaultProject = {
186
- name: '',
187
- buildingComplex: {
188
- address: '',
189
- area: 0,
190
- constructionCompany: '',
191
- clientCompany: '',
192
- supervisoryCompany: '',
193
- designCompany: '',
194
- constructionType: '',
195
- buildings: []
196
- }
197
- }
198
- @state() projectId: string = ''
199
- @state() project: Project = { ...this.defaultProject }
200
- @state() selectedBuildingIdx: number = 0
201
- @state() tasks
202
- @state() constructionTypeList = []
203
-
204
- @state() private fromDate = '2024-01-01'
205
- @state() private toDate = '2026-12-31'
206
-
207
- @query('input[name="startDate"]') inputStartDate!: HTMLInputElement
208
- @query('input[name="endDate"]') inputEndDate!: HTMLInputElement
209
-
210
- private timeScale = 'week-day'
211
- private extendGridLines = false
212
-
213
- private columnConfigProvider = function () {
214
- return [
215
- { name: 'title', label: i18next.t('label.gantt-task-title') || 'title', visible: true, width: 150, order: 1 },
216
- {
217
- name: 'startDate',
218
- label: i18next.t('label.gantt-task-start-date') || 'start date',
219
- visible: true,
220
- width: 100,
221
- order: 2
222
- },
223
- {
224
- name: 'resources',
225
- label: i18next.t('label.gantt-task-resources') || 'resources',
226
- visible: true,
227
- width: 100,
228
- order: 3
229
- },
230
- {
231
- name: 'duration',
232
- label: i18next.t('label.gantt-task-duration') || 'duration',
233
- visible: true,
234
- width: 30,
235
- order: 4
236
- }
237
- ]
238
- }
239
-
240
- render() {
241
- return html`
242
- <div header>
243
- <h2>${this.project.name}</h2>
244
- <div button-container>
245
- <md-elevated-button @click=${this._openUploadSchedulePopup}>
246
- <md-icon slot="icon">event_note</md-icon>공정표 관리
247
- </md-elevated-button>
248
- </div>
249
- </div>
250
-
251
- <div body>
252
- <ox-gantt
253
- from-date=${new Date(this.fromDate).toISOString().split('T')[0]}
254
- to-date=${new Date(this.toDate).toISOString().split('T')[0]}
255
- .timeScale=${this.timeScale}
256
- .tasks=${this.tasks}
257
- @date-range-selected=${this.onRangeSelected}
258
- @task-clicked=${(e: CustomEvent) => {
259
- console.log('task-clicked', e.detail)
260
- }}
261
- ?extend-grid-lines=${this.extendGridLines}
262
- .columnConfigProvider=${this.columnConfigProvider}
263
- .colorProvider=${task => {
264
- return task.style || 'gray'
265
- }}
266
- >
267
- </ox-gantt>
268
- <div select-container>
269
- <div date>
270
- <span name>기간선택</span>
271
- <div @change=${() => this.onChangePeriodRange()}>
272
- <input type="date" name="startDate" project .value=${this.project.startDate || ''} max="9999-12-31" />
273
- ~
274
- <input type="date" name="endDate" project .value=${this.project.endDate || ''} max="9999-12-31" />
275
- </div>
276
- </div>
277
- <div construction-list-container>
278
- ${this.constructionTypeList?.map(
279
- (constructionType: any) =>
280
- html` <md-outlined-button id=${constructionType.id}>${constructionType.title}</md-outlined-button>`
281
- )}
282
- </div>
283
- </div>
284
- </div>
285
- `
286
- }
287
-
288
- async pageInitialized(lifecycle: PageLifecycle) {}
289
-
290
- async pageUpdated(changes: any, lifecycle: PageLifecycle) {
291
- if (this.active) {
292
- this.projectId = lifecycle.resourceId || ''
293
- await this.initProject(this.projectId)
294
- }
295
- }
296
-
297
- async initProject(projectId: string = '') {
298
- const response = await client.query({
299
- query: gql`
300
- query Project($id: String!, $sortings: [Sorting!]) {
301
- project(id: $id) {
302
- id
303
- name
304
- startDate
305
- endDate
306
- rootTasks {
307
- ...TaskFragment
308
- children(sortings: $sortings) {
309
- ...TaskFragment
310
- children(sortings: $sortings) {
311
- ...TaskFragment
312
- }
313
- }
314
- }
315
- scheduleTable {
316
- id
317
- name
318
- }
319
- buildingComplex {
320
- id
321
- planXScale
322
- planYScale
323
- buildings {
324
- id
325
- name
326
- drawing {
327
- id
328
- name
329
- }
330
- buildingLevels {
331
- id
332
- floor
333
- mainDrawing {
334
- id
335
- name
336
- }
337
- }
338
- }
339
- }
340
- }
341
- }
342
-
343
- ${TaskFragment}
344
- `,
345
- variables: {
346
- id: projectId,
347
- sortings: [{ name: 'startDate' }]
348
- }
349
- })
350
-
351
- this.project = response.data?.project
352
- this.tasks = response.data?.project.rootTasks
353
-
354
- if (this.project) {
355
- this.fromDate = this.project.startDate || '2024-01-01' /* TODO default: start date of this year - 3 */
356
- this.toDate = this.project.endDate || '2026-12-31' /* TODO defaule: end date of this year + 3 */
357
- }
358
-
359
- console.log('init project : ', this.project)
360
- }
361
-
362
- onChangePeriodRange() {
363
- this.fromDate = this.inputStartDate.value
364
- this.toDate = this.inputEndDate.value
365
- }
366
-
367
- onRangeSelected(e: CustomEvent) {
368
- const selectedFromDate = new Date(e.detail.start + 'T00:00:00.000Z')
369
- const selectedToDate = new Date(e.detail.end + 'T23:59:59.000Z')
370
-
371
- this.constructionTypeList = this.tasks.filter(constuction => {
372
- const constuctionStartDate = new Date(constuction.startDate)
373
- const constuctionEndDate = new Date(constuction.endDate)
374
-
375
- return constuctionStartDate <= selectedToDate && constuctionEndDate >= selectedFromDate
376
- })
377
- }
378
-
379
- private _openUploadSchedulePopup() {
380
- openPopup(
381
- html`<popup-schedule-upload
382
- .projectId=${this.projectId}
383
- .scheduleTable=${this.project?.scheduleTable}
384
- @uploaded=${() => this.initProject(this.projectId)}
385
- ></popup-schedule-upload>`,
386
- {
387
- backdrop: true,
388
- size: 'medium',
389
- title: `공정표 업로드`
390
- }
391
- )
392
- }
393
- }