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