@dssp/project 1.0.0-alpha.0 → 1.0.0-alpha.2

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 (98) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-server/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +11 -11
  4. package/client/bootstrap.ts +0 -0
  5. package/client/index.ts +0 -0
  6. package/client/pages/lib/select2-component.ts +0 -175
  7. package/client/pages/lib/waether.ts +0 -159
  8. package/client/pages/project/component/project-update-header.ts +0 -88
  9. package/client/pages/project/popup/popup-plan-upload.ts +0 -138
  10. package/client/pages/project/popup/popup-project-create.ts +0 -147
  11. package/client/pages/project/popup/popup-schedule-upload.ts +0 -102
  12. package/client/pages/project/project-completed-list.ts +0 -281
  13. package/client/pages/project/project-detail.ts +0 -738
  14. package/client/pages/project/project-list.ts +0 -418
  15. package/client/pages/project/project-plan-management.ts +0 -476
  16. package/client/pages/project/project-schedule-list.ts +0 -294
  17. package/client/pages/project/project-schedule.ts +0 -393
  18. package/client/pages/project/project-setting-list.ts +0 -393
  19. package/client/pages/project/project-update.ts +0 -876
  20. package/client/pages/resource/construction-detail-type-popup.ts +0 -201
  21. package/client/pages/resource/construction-type-management.ts +0 -212
  22. package/client/pages/resource/inspection-drawing-type-management.ts +0 -245
  23. package/client/pages/resource/inspection-part-popup.ts +0 -201
  24. package/client/pages/resource/resource-importer.ts +0 -97
  25. package/client/pages/resource/resource-list-page.ts +0 -356
  26. package/client/pages/resource/worker-type-management.ts +0 -192
  27. package/client/pages/task/task-importer.ts +0 -94
  28. package/client/pages/task/task-list-page.ts +0 -340
  29. package/client/pages/task-resource/task-resource-importer.ts +0 -97
  30. package/client/pages/task-resource/task-resource-list-page.ts +0 -356
  31. package/client/route.ts +0 -55
  32. package/client/tsconfig.json +0 -11
  33. package/server/controllers/export-tasks.ts +0 -40
  34. package/server/controllers/import-task.ts +0 -134
  35. package/server/controllers/index.ts +0 -0
  36. package/server/controllers/parse-excel.ts +0 -86
  37. package/server/controllers/types.ts +0 -20
  38. package/server/index.ts +0 -4
  39. package/server/middlewares/index.ts +0 -3
  40. package/server/migrations/1723861466413-seed-roles.ts +0 -128
  41. package/server/migrations/1723861466414-seed-codes.ts +0 -157
  42. package/server/migrations/1723861476419-seed-resources.ts +0 -62
  43. package/server/migrations/1723861478420-seed-/bsample-project.ts +0 -87
  44. package/server/migrations/1723861478421-seed-/bsample-tasks.ts +0 -194
  45. package/server/migrations/index.ts +0 -9
  46. package/server/routes.ts +0 -108
  47. package/server/service/construction-detail-type/construction-detail-type-mutation.ts +0 -57
  48. package/server/service/construction-detail-type/construction-detail-type-query.ts +0 -31
  49. package/server/service/construction-detail-type/construction-detail-type-type.ts +0 -26
  50. package/server/service/construction-detail-type/construction-detail-type.ts +0 -52
  51. package/server/service/construction-detail-type/index.ts +0 -6
  52. package/server/service/construction-type/construction-type-mutation.ts +0 -66
  53. package/server/service/construction-type/construction-type-query.ts +0 -56
  54. package/server/service/construction-type/construction-type-type.ts +0 -26
  55. package/server/service/construction-type/construction-type.ts +0 -74
  56. package/server/service/construction-type/index.ts +0 -6
  57. package/server/service/index.ts +0 -56
  58. package/server/service/inspection-drawing-type/index.ts +0 -6
  59. package/server/service/inspection-drawing-type/inspection-drawing-type-mutation.ts +0 -69
  60. package/server/service/inspection-drawing-type/inspection-drawing-type-query.ts +0 -55
  61. package/server/service/inspection-drawing-type/inspection-drawing-type-type.ts +0 -23
  62. package/server/service/inspection-drawing-type/inspection-drawing-type.ts +0 -68
  63. package/server/service/inspection-part/index.ts +0 -6
  64. package/server/service/inspection-part/inspection-part-mutation.ts +0 -52
  65. package/server/service/inspection-part/inspection-part-query.ts +0 -41
  66. package/server/service/inspection-part/inspection-part-type.ts +0 -26
  67. package/server/service/inspection-part/inspection-part.ts +0 -51
  68. package/server/service/manager/index.ts +0 -6
  69. package/server/service/manager/manager-mutation.ts +0 -42
  70. package/server/service/manager/manager-query.ts +0 -28
  71. package/server/service/manager/manager-type.ts +0 -40
  72. package/server/service/manager/manager.ts +0 -29
  73. package/server/service/project/index.ts +0 -6
  74. package/server/service/project/project-mutation.ts +0 -255
  75. package/server/service/project/project-query.ts +0 -105
  76. package/server/service/project/project-type.ts +0 -72
  77. package/server/service/project/project.ts +0 -134
  78. package/server/service/resource/index.ts +0 -7
  79. package/server/service/resource/resource-mutation.ts +0 -137
  80. package/server/service/resource/resource-query.ts +0 -50
  81. package/server/service/resource/resource-type.ts +0 -41
  82. package/server/service/resource/resource.ts +0 -82
  83. package/server/service/task/index.ts +0 -6
  84. package/server/service/task/task-mutation.ts +0 -135
  85. package/server/service/task/task-query.ts +0 -169
  86. package/server/service/task/task-type.ts +0 -75
  87. package/server/service/task/task.ts +0 -130
  88. package/server/service/task-resource/index.ts +0 -7
  89. package/server/service/task-resource/task-resource-mutation.ts +0 -140
  90. package/server/service/task-resource/task-resource-query.ts +0 -36
  91. package/server/service/task-resource/task-resource-type.ts +0 -41
  92. package/server/service/task-resource/task-resource.ts +0 -51
  93. package/server/service/worker-type/index.ts +0 -6
  94. package/server/service/worker-type/worker-type-mutation.ts +0 -66
  95. package/server/service/worker-type/worker-type-query.ts +0 -47
  96. package/server/service/worker-type/worker-type-type.ts +0 -26
  97. package/server/service/worker-type/worker-type.ts +0 -68
  98. 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
- }