@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,476 +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, state } from 'lit/decorators.js'
11
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
12
- import { client } from '@operato/graphql'
13
- import { notify } from '@operato/layout'
14
- import { openPopup } from '@operato/layout'
15
-
16
- import gql from 'graphql-tag'
17
- import { Building, BuildingLevel, Project } from './project-list'
18
- import './popup/popup-plan-upload'
19
- import './component/project-update-header'
20
-
21
- @customElement('project-plan-management')
22
- export class ProjectPlanManagement extends ScopedElementsMixin(PageView) {
23
- static styles = [
24
- css`
25
- :host {
26
- display: grid;
27
- grid-template-rows: 55px auto;
28
- color: #4e5055;
29
-
30
- background-color: var(--md-sys-color-background, #f6f6f6);
31
- overflow: hidden;
32
- overflow-y: auto;
33
-
34
- --grid-record-emphasized-background-color: red;
35
- --grid-record-emphasized-color: yellow;
36
- }
37
-
38
- md-outlined-text-field {
39
- width: 100%;
40
-
41
- --md-outlined-text-field-container-shape: 5px;
42
- --md-outlined-text-field-outline-color: rgba(51,51,51,.20);
43
- --md-outlined-text-field-focus-outline-color: #1f7fd9;
44
- --md-outlined-text-field-focus-outline-width: 1px;
45
- --md-sys-color-primary: #586878;
46
- --md-outlined-text-field-input-text-size: 14px;
47
- --md-outlined-field-bottom-space: 3px;
48
- --md-outlined-field-top-space: 3px;
49
- --md-outlined-field-leading-space: var(--spacing-medium, 8px);
50
- --md-outlined-field-trailing-space: var(--spacing-medium, 8px);
51
- }
52
-
53
- ox-input-image {
54
- width: 100px;
55
- height: 100px;
56
- }
57
-
58
- *[bold] {
59
- font-weight: bold;
60
- }
61
-
62
- div[body] {
63
- display: grid;
64
- grid-template-rows: 205px 1fr 60px;
65
- margin: var(--spacing-large, 12px);
66
- margin-top:0;
67
- gap: var(--spacing-medium, 8px);
68
-
69
- & > div {
70
- display: grid;
71
- grid-template-rows: 25px auto;
72
- padding: var(--spacing-large, 12px);
73
- background-color: var(--md-sys-color-on-primary);
74
- border: 1px solid #cccccc80;
75
- border-radius: 5px;
76
- gap: var(--spacing-medium, 8px);
77
-
78
- h3 {
79
- color: #2e79be;
80
- font-size: 16px;
81
- margin: 0px;
82
- text-wrap: nowrap;
83
- }
84
- }
85
-
86
- & > div[building-container] > div {
87
- display: flex;
88
- gap: var(--spacing-medium, 8px);
89
- overflow-x: auto;
90
- overflow-y: hidden;
91
-
92
- ox-input-file {
93
- height: 100px;
94
- }
95
-
96
- span[building] {
97
- width: 125px;
98
- text-align: center;
99
-
100
- div {
101
- color: #586878;
102
- margin-top:var(--spacing-small, 4px);
103
- font-size: 14px;
104
- }
105
- }
106
- }
107
-
108
- & > div[floor-container] {
109
- div[floor-title] {
110
- display: flex;
111
- justify-content: space-between;
112
- height: fit-content;
113
- gap: var(--spacing-huge, 24px);
114
- overflow: hidden;
115
-
116
- span[building-button] {
117
- display: flex;
118
- margin-left: auto;
119
- gap: var(--spacing-small, 4px);
120
- overflow-x: auto;
121
- overflow-y: hidden;
122
-
123
- md-filled-button {
124
- --md-filled-button-container-color: #0595e5;
125
- --md-filled-button-container-height: 30px;
126
- --md-filled-button-trailing-space: var(--spacing-medium, 8px);
127
- --md-filled-button-leading-space: var(--spacing-medium, 8px);
128
- }
129
- md-outlined-button {
130
- --md-outlined-button-container-height: 30px;
131
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
132
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
133
- --md-sys-color-outline: rgba(51,51,51,.20);
134
- }
135
- }
136
- }
137
-
138
- div[floor-plan] {
139
- overflow-y: auto;
140
- margin-top: var(--spacing-medium, 8px);
141
-
142
- & > span {
143
- display: inline-block;
144
- text-align: center;
145
- margin-right:var(--spacing-medium, 8px);
146
- margin-bottom:var(--spacing-medium, 8px);
147
- cursor: pointer;
148
-
149
- & > [name='building-plan'] {
150
- width: 150px;
151
- height: 100px;
152
- display: flex;
153
- flex-direction: column;
154
- justify-content: center;
155
- border: 1px solid rgba(51,51,51,.1);
156
- box-shadow: 1px 1px 1px #0000001a;
157
- align-items: center;
158
- border-radius: 5px;
159
- font-size: 13px;
160
-
161
- md-icon {
162
- margin-bottom: var(--spacing-small, 4px);
163
- }
164
- }
165
-
166
- & > div[floor-name] {
167
- margin-top: var(--spacing-small, 4px);
168
- font-size:14px;
169
-
170
- &[no-data] {
171
- color: #f16154;
172
- font-weight: bold;
173
- }
174
- }
175
- }
176
- }
177
- }
178
-
179
- & > div[plan-scale-container] {
180
- display: flex;
181
-
182
- & > div {
183
- display: flex;
184
- align-items: center;
185
- gap: var(--spacing-medium, 8px);
186
- margin-left: var(--spacing-medium, 8px);
187
-
188
- md-outlined-text-field {
189
- width: 100px;
190
- --md-outlined-text-container-height: 30px;
191
- }
192
- }
193
- }
194
- }
195
- `
196
- ]
197
-
198
- get context() {
199
- return {
200
- title: '도면 관리'
201
- }
202
- }
203
-
204
- private defaultProject = {
205
- name: '',
206
- buildingComplex: {
207
- address: '',
208
- area: 0,
209
- constructionCompany: '',
210
- clientCompany: '',
211
- supervisoryCompany: '',
212
- designCompany: '',
213
- constructionType: '',
214
- buildings: []
215
- }
216
- }
217
- @state() projectId: string = ''
218
- @state() project: Project = { ...this.defaultProject }
219
- @state() selectedBuildingIdx: number = 0
220
-
221
- render() {
222
- return html`
223
- <project-update-header .projectId=${this.project.id || ''} title="도면 관리" @custom-click=${this._saveProject}>
224
- </project-update-header>
225
-
226
- <div body>
227
- <div building-container>
228
- <h3>동별 도면(BIM)</h3>
229
- <div>
230
- ${this.project.buildingComplex?.buildings?.map((building, idx) => {
231
- return html`
232
- <span building>
233
- <ox-input-file
234
- name="building-drawing"
235
- .value=${building?.drawing || undefined}
236
- label=" "
237
- description="동 도면 업로드"
238
- idx=${idx}
239
- @change=${this._onCreateAttachment.bind(this)}
240
- ></ox-input-file>
241
- <div>${building.name}</div>
242
- </span>
243
- `
244
- })}
245
- </div>
246
- </div>
247
-
248
- <div floor-container>
249
- <div floor-title>
250
- <h3>${this.project.buildingComplex?.buildings?.[this.selectedBuildingIdx]?.name} 층별 도면(PDF)</h3>
251
- <span building-button>
252
- ${this.project.buildingComplex.buildings?.map((building, idx) => {
253
- return this.project.buildingComplex?.buildings?.[this.selectedBuildingIdx]?.id === building.id
254
- ? html`
255
- <md-filled-button @click=${() => this._onClickBuildingChange(idx)}> ${building.name} </md-filled-button>
256
- `
257
- : html`
258
- <md-outlined-button @click=${() => this._onClickBuildingChange(idx)}> ${building.name} </md-outlined-button>
259
- `
260
- })}
261
- </span>
262
- </div>
263
-
264
- <div floor-plan>
265
- ${this.project.buildingComplex?.buildings?.[this.selectedBuildingIdx]?.buildingLevels?.map((buildingLevel, idx) => {
266
- return buildingLevel.mainDrawingThumbnail
267
- ? html`
268
- <span plan>
269
- <img
270
- name="building-plan"
271
- .src=${buildingLevel.mainDrawingThumbnail}
272
- idx=${idx}
273
- @click=${this._onClickImage}
274
- />
275
- <div floor-name>${buildingLevel.floor}층</div>
276
- </span>
277
- `
278
- : html`
279
- <span plan>
280
- <a name="building-plan" idx=${idx} @click=${this._onClickImage}>
281
- <md-icon slot="icon">image</md-icon>
282
- <div bold>도면 파일</div>
283
- <div>업로드</div>
284
- </a>
285
- <div floor-name no-data>${buildingLevel.floor}층</div>
286
- </span>
287
- `
288
- })}
289
- </div>
290
- </div>
291
-
292
- <div plan-scale-container>
293
- <h3>도면 축척 설정</h3>
294
- <div>
295
- <span>가로</span>
296
- <md-outlined-text-field
297
- type="text"
298
- name="planXScale"
299
- numeric
300
- .value=${this.project.buildingComplex.planXScale?.toString() || ''}
301
- @input=${this._onInputChange}
302
- suffix-text="mm"
303
- >
304
- </md-outlined-text-field>
305
- <span>X</span>
306
- <span>세로</span>
307
- <md-outlined-text-field
308
- type="text"
309
- name="planYScale"
310
- numeric
311
- .value=${this.project.buildingComplex.planYScale?.toString() || ''}
312
- @input=${this._onInputChange}
313
- suffix-text="mm"
314
- >
315
- </md-outlined-text-field>
316
- </div>
317
- </div>
318
- </div>
319
- `
320
- }
321
-
322
- async pageInitialized(lifecycle: PageLifecycle) {}
323
-
324
- async pageUpdated(changes: any, lifecycle: PageLifecycle) {
325
- if (this.active) {
326
- this.projectId = lifecycle.resourceId || ''
327
- await this.initProject(this.projectId)
328
- }
329
- }
330
-
331
- async initProject(projectId: string = '') {
332
- const response = await client.query({
333
- query: gql`
334
- query Project($id: String!) {
335
- project(id: $id) {
336
- id
337
- name
338
- buildingComplex {
339
- id
340
- planXScale
341
- planYScale
342
- buildings {
343
- id
344
- name
345
- drawing {
346
- id
347
- name
348
- }
349
- buildingLevels {
350
- id
351
- floor
352
- mainDrawing {
353
- id
354
- name
355
- }
356
- elevationDrawing {
357
- id
358
- name
359
- }
360
- rebarDistributionDrawing {
361
- id
362
- name
363
- }
364
- mainDrawingThumbnail
365
- elevationDrawingThumbnail
366
- rebarDistributionDrawingThumbnail
367
- }
368
- }
369
- }
370
- }
371
- }
372
- `,
373
- variables: {
374
- id: projectId
375
- }
376
- })
377
-
378
- this.project = response.data?.project
379
- }
380
-
381
- private async _saveProject() {
382
- // 첨부 파일 필드 제거 (첨부 파일은 {filename}Upload 로 전송)
383
- for (let buildingKey in this.project.buildingComplex.buildings) {
384
- const building = this.project.buildingComplex.buildings[buildingKey]
385
- delete this.project.buildingComplex.buildings[buildingKey].drawing
386
-
387
- for (let levelKey in building.buildingLevels) {
388
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].mainDrawing
389
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].mainDrawingImage
390
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].mainDrawingThumbnail
391
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].elevationDrawing
392
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].elevationDrawingThumbnail
393
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].rebarDistributionDrawing
394
- delete this.project.buildingComplex.buildings[buildingKey].buildingLevels[levelKey].rebarDistributionDrawingThumbnail
395
- }
396
- }
397
-
398
- const response = await client.mutate({
399
- mutation: gql`
400
- mutation UpdateProjectPlan($project: ProjectPatch!) {
401
- updateProjectPlan(project: $project) {
402
- id
403
- }
404
- }
405
- `,
406
- variables: {
407
- project: this.project
408
- },
409
- context: {
410
- hasUpload: true
411
- }
412
- })
413
-
414
- if (!response.errors) {
415
- notify({ message: '저장에 성공하였습니다.' })
416
-
417
- // 데이터 다시 조회
418
- this.initProject(this.project.id)
419
- }
420
- }
421
-
422
- // Input 요소의 값이 변경될 때 호출되는 콜백 함수
423
- private _onInputChange(event: InputEvent, idx: number) {
424
- const target = event.target as HTMLInputElement
425
- let inputVal: any = target.value
426
- this.project.buildingComplex![target.name] = Number(inputVal.replace(/\D/g, ''))
427
- }
428
-
429
- // 이미지 업로드
430
- async _onCreateAttachment(e: CustomEvent) {
431
- const target = e.target as HTMLInputElement
432
- const file = e.detail[0] || null
433
- const idx = Number(target.getAttribute('idx')) || 0
434
-
435
- this.project.buildingComplex!.buildings![idx].drawingUpload = file
436
-
437
- // re rendering
438
- this.project = { ...this.project }
439
- }
440
-
441
- _onClickBuildingChange(idx: number) {
442
- this.selectedBuildingIdx = idx
443
- }
444
-
445
- _onClickImage(e) {
446
- const target = e.currentTarget as HTMLInputElement
447
- const idx = Number(target.getAttribute('idx')) || 0
448
- const buildingLevel = this.project.buildingComplex!.buildings![this.selectedBuildingIdx].buildingLevels![idx]
449
- const title = buildingLevel.floor?.toString() + '층' || ''
450
-
451
- // 팝업 오픈
452
- this._openPopup(title, buildingLevel, idx)
453
- }
454
-
455
- private _openPopup(title: string, buildingLevel: BuildingLevel, selectedIdx: number) {
456
- openPopup(
457
- html`<popup-plan-upload
458
- .buildingLevel=${buildingLevel}
459
- .selectedIdx=${selectedIdx}
460
- @file_change=${this._onChangeAdditionalDrawing.bind(this)}
461
- ></popup-plan-upload>`,
462
- {
463
- backdrop: true,
464
- size: 'medium',
465
- title: `${title} 도면 관리`
466
- }
467
- )
468
- }
469
-
470
- private _onChangeAdditionalDrawing(e) {
471
- const idx = e.detail?.selectedIdx || null
472
- const buildingLevel: BuildingLevel = e.detail?.buildingLevel || {}
473
-
474
- this.project.buildingComplex!.buildings![this.selectedBuildingIdx]!.buildingLevels![idx] = { ...buildingLevel }
475
- }
476
- }