@dssp/supervision 0.0.35 → 0.0.36

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 (36) hide show
  1. package/client/pages/building-inspection/building-inspection-detail-checklist.ts +9 -5
  2. package/client/pages/building-inspection/building-inspection-list.ts +10 -9
  3. package/client/pages/building-inspection/component/building-inspection-detail-header.ts +11 -5
  4. package/client/pages/checklist/attachment-list-popup.ts +20 -2
  5. package/client/pages/checklist/checklist-view.ts +34 -23
  6. package/client/pages/checklist/comment-list-popup.ts +12 -3
  7. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.js +9 -5
  8. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.js.map +1 -1
  9. package/dist-client/pages/building-inspection/building-inspection-list.js +10 -9
  10. package/dist-client/pages/building-inspection/building-inspection-list.js.map +1 -1
  11. package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js +11 -5
  12. package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js.map +1 -1
  13. package/dist-client/pages/checklist/attachment-list-popup.js +22 -2
  14. package/dist-client/pages/checklist/attachment-list-popup.js.map +1 -1
  15. package/dist-client/pages/checklist/checklist-view.js +32 -18
  16. package/dist-client/pages/checklist/checklist-view.js.map +1 -1
  17. package/dist-client/pages/checklist/comment-list-popup copy.d.ts +2 -0
  18. package/dist-client/pages/checklist/comment-list-popup copy.js +344 -0
  19. package/dist-client/pages/checklist/comment-list-popup copy.js.map +1 -0
  20. package/dist-client/pages/checklist/comment-list-popup.js +16 -3
  21. package/dist-client/pages/checklist/comment-list-popup.js.map +1 -1
  22. package/dist-client/route.d.ts +1 -1
  23. package/dist-client/tsconfig.tsbuildinfo +1 -1
  24. package/dist-server/service/building-inspection/building-inspection-mutation.js +9 -1
  25. package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
  26. package/dist-server/service/checklist-item/checklist-item-query.d.ts +2 -0
  27. package/dist-server/service/checklist-item/checklist-item-query.js +15 -0
  28. package/dist-server/service/checklist-item/checklist-item-query.js.map +1 -1
  29. package/dist-server/service/checklist-item-comment/checklist-item-comment-mutation.js +19 -1
  30. package/dist-server/service/checklist-item-comment/checklist-item-comment-mutation.js.map +1 -1
  31. package/dist-server/service/index.d.ts +1 -1
  32. package/dist-server/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +5 -5
  34. package/server/service/building-inspection/building-inspection-mutation.ts +13 -1
  35. package/server/service/checklist-item/checklist-item-query.ts +11 -0
  36. package/server/service/checklist-item-comment/checklist-item-comment-mutation.ts +21 -1
@@ -17,6 +17,7 @@ import { verifyBiometric } from '@things-factory/auth-base/client'
17
17
  import './component/building-inspection-detail-header'
18
18
  import '../checklist/checklist-view'
19
19
  import { ChecklistMode } from '../checklist/checklist-view'
20
+ import { BuildingInspectionStatus } from './building-inspection-list'
20
21
 
21
22
  @customElement('building-inspection-detail-checklist')
22
23
  export class BuildingInspectionDetailChecklist extends PageView {
@@ -26,11 +27,11 @@ export class BuildingInspectionDetailChecklist extends PageView {
26
27
  css`
27
28
  :host {
28
29
  display: grid;
29
- grid-template-rows: 75px auto;
30
+ grid-template-rows: 55px auto;
30
31
  color: #4e5055;
31
32
 
32
33
  width: 100%;
33
- background-color: #f7f7f7;
34
+ background-color: var(--md-sys-color-background, #f6f6f6);
34
35
  overflow-y: auto;
35
36
 
36
37
  --grid-record-emphasized-background-color: red;
@@ -80,7 +81,7 @@ export class BuildingInspectionDetailChecklist extends PageView {
80
81
 
81
82
  <div body>
82
83
  ${keyed(
83
- this.buildingInspection.id,
84
+ new Date(),
84
85
  html`
85
86
  <checklist-view
86
87
  .mode=${ChecklistMode.EDITOR}
@@ -92,7 +93,10 @@ export class BuildingInspectionDetailChecklist extends PageView {
92
93
  )}
93
94
 
94
95
  <div button-container>
95
- <md-elevated-button @click=${this._onClickModifyChecklist}>
96
+ <md-elevated-button
97
+ ?disabled=${this.buildingInspection.status == BuildingInspectionStatus.PASS}
98
+ @click=${this._onClickModifyChecklist}
99
+ >
96
100
  <md-icon slot="icon">assignment</md-icon>등록
97
101
  </md-elevated-button>
98
102
  </div>
@@ -245,7 +249,7 @@ export class BuildingInspectionDetailChecklist extends PageView {
245
249
  })
246
250
 
247
251
  if (!response.errors) {
248
- notify({ message: '검측요청서를 등록하였습니다.' })
252
+ notify({ message: '검측 요청서를 등록하였습니다.' })
249
253
  this.initBuildingInspection(this.buildingInspection.id)
250
254
  } else {
251
255
  notify({ message: response.errors?.[0]?.message || '검측 요청서 등록에 실패하였습니다.', level: 'error' })
@@ -73,7 +73,7 @@ export class BuildingInspectionList extends ScopedElementsMixin(PageView) {
73
73
  --md-outlined-button-container-height: 30px;
74
74
  --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
75
75
  --md-outlined-button-leading-space: var(--spacing-medium, 8px);
76
- --md-sys-color-outline: rgba(51,51,51,.20);
76
+ --md-sys-color-outline: rgba(51, 51, 51, 0.2);
77
77
  }
78
78
 
79
79
  *[bold] {
@@ -83,20 +83,20 @@ export class BuildingInspectionList extends ScopedElementsMixin(PageView) {
83
83
  div[header] {
84
84
  display: flex;
85
85
  margin: 0px var(--spacing-large, 12px);
86
- margin-bottom:var(--spacing-small, 5px);
86
+ margin-bottom: var(--spacing-small, 5px);
87
87
  }
88
88
 
89
89
  div[header] h2 {
90
90
  flex: 0.5;
91
91
  color: #3f71a0;
92
- font-size:18px;
92
+ font-size: 18px;
93
93
  }
94
94
 
95
95
  div[body] {
96
96
  display: flex;
97
97
  flex-direction: column;
98
98
  margin: var(--spacing-large, 12px);
99
- margin-top:0;
99
+ margin-top: 0;
100
100
  gap: var(--spacing-medium, 8px);
101
101
  min-height: fit-content;
102
102
  overflow-x: hidden;
@@ -157,10 +157,10 @@ export class BuildingInspectionList extends ScopedElementsMixin(PageView) {
157
157
  align-items: center;
158
158
  justify-content: center;
159
159
 
160
- span::before{
160
+ span::before {
161
161
  display: inline-block;
162
162
  position: relative;
163
- content: "";
163
+ content: '';
164
164
  width: 10px;
165
165
  height: 10px;
166
166
  border-radius: 6px;
@@ -168,7 +168,7 @@ export class BuildingInspectionList extends ScopedElementsMixin(PageView) {
168
168
  margin-right: 2px;
169
169
  }
170
170
 
171
- span[status='wait']::before{
171
+ span[status='wait']::before {
172
172
  background-color: #4e5055;
173
173
  }
174
174
  span[status='request']::before {
@@ -188,10 +188,10 @@ export class BuildingInspectionList extends ScopedElementsMixin(PageView) {
188
188
  flex-direction: row;
189
189
  text-align: right;
190
190
  gap: var(--spacing-small, 4px);
191
- padding-right:var(--spacing-large, 12px);
191
+ padding-right: var(--spacing-large, 12px);
192
192
  border-right: 2px dotted #ccc;
193
193
  max-width: 100%;
194
- line-height:1.3;
194
+ line-height: 1.3;
195
195
 
196
196
  md-icon {
197
197
  width: 40px;
@@ -311,6 +311,7 @@ export class BuildingInspectionList extends ScopedElementsMixin(PageView) {
311
311
  .mode=${'monthly'}
312
312
  .eventProvider=${this.calendarData}
313
313
  @select-date=${(e: CustomEvent) => {
314
+ // TODO 선택된 날짜의 검측데이터만 그리드에 보여야함
314
315
  console.log('select-date', e.detail)
315
316
  }}
316
317
  >
@@ -45,6 +45,7 @@ class BuildingInspectionDetailHeader extends LitElement {
45
45
 
46
46
  md-elevated-button {
47
47
  margin-left: var(--spacing-small, 4px);
48
+ letter-spacing: -1px;
48
49
 
49
50
  --md-elevated-button-container-height: 32px;
50
51
  --md-elevated-button-label-text-size: 16px;
@@ -58,9 +59,14 @@ class BuildingInspectionDetailHeader extends LitElement {
58
59
  --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
59
60
  --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
60
61
  --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
62
+ --_leading-space:var(--spacing-tiny, 2px);
61
63
 
62
64
  --_with-leading-icon-leading-space: var(--spacing-medium, 8px);
63
65
  --_with-leading-icon-trailing-space: var(--spacing-medium, 8px);
66
+
67
+ md-icon{
68
+ margin-right: -2px;
69
+ }
64
70
  }
65
71
  `
66
72
  ]
@@ -82,33 +88,33 @@ class BuildingInspectionDetailHeader extends LitElement {
82
88
  ?disabled=${path.includes('building-inspection-list/')}
83
89
  href=${`building-inspection-list/${this.buildingLevelId}`}
84
90
  >
85
- <md-icon slot="icon">assignment</md-icon>검측 리스트
91
+ <md-icon slot="icon">list_alt</md-icon>검측 리스트
86
92
  </md-elevated-button>
87
93
  <md-elevated-button
88
94
  ?disabled=${path.includes('building-inspection-detail-drawing/')}
89
95
  href=${`building-inspection-detail-drawing/${this.buildingInspectionId}`}
90
96
  >
91
- <md-icon slot="icon">assignment</md-icon>검측도면
97
+ <md-icon slot="icon">fact_check</md-icon>검측도면
92
98
  </md-elevated-button>
93
99
  <md-elevated-button
94
100
  ?disabled=${path.includes('building-inspection-detail-checklist/')}
95
101
  href=${`building-inspection-detail-checklist/${this.buildingInspectionId}`}
96
102
  >
97
- <md-icon slot="icon">description</md-icon>검측 체크리스트
103
+ <md-icon slot="icon">task</md-icon>검측 체크리스트
98
104
  </md-elevated-button>
99
105
  <md-elevated-button
100
106
  ?disabled=${path.includes('building-inspection-detail-camera/')}
101
107
  href=${`building-inspection-detail-camera/${this.buildingInspectionId}`}
102
108
  disabled
103
109
  >
104
- <md-icon slot="icon">description</md-icon>사진촬영
110
+ <md-icon slot="icon">photo_camera</md-icon>사진촬영
105
111
  </md-elevated-button>
106
112
  <md-elevated-button
107
113
  ?disabled=${path.includes('building-inspection-detail-history/')}
108
114
  href=${`building-inspection-detail-history/${this.buildingInspectionId}`}
109
115
  disabled
110
116
  >
111
- <md-icon slot="icon">description</md-icon>감리이력
117
+ <md-icon slot="icon">pending_actions</md-icon>감리이력
112
118
  </md-elevated-button>
113
119
  </div>
114
120
  </div>
@@ -10,6 +10,7 @@ import { connect } from 'pwa-helpers/connect-mixin.js'
10
10
  import { OxPrompt } from '@operato/popup/ox-prompt.js'
11
11
  import { openPopup } from '@operato/layout'
12
12
  import './file-preview-popup'
13
+ import { BuildingInspectionStatus } from '../building-inspection/building-inspection-list'
13
14
 
14
15
  @customElement('attachment-list-popup')
15
16
  class AttachmentListPopup extends connect(store)(LitElement) {
@@ -95,6 +96,7 @@ class AttachmentListPopup extends connect(store)(LitElement) {
95
96
  ]
96
97
 
97
98
  @property({ type: String }) checklistItemId: string = ''
99
+ @property({ type: String }) status: BuildingInspectionStatus = BuildingInspectionStatus.WAIT
98
100
 
99
101
  @state() item: any = { count: 0 }
100
102
  @state() checklistItemAttachments: any = []
@@ -115,7 +117,7 @@ class AttachmentListPopup extends connect(store)(LitElement) {
115
117
  <span creator><md-icon slot="icon">account_circle</md-icon> ${attachment.creator.name}</span>
116
118
  <span createdAt>
117
119
  <md-icon slot="icon">schedule</md-icon> ${this._formatDate(attachment.createdAt)}
118
- ${attachment.creator.email === this.user.email
120
+ ${attachment.creator.email === this.user.email && this.status != BuildingInspectionStatus.PASS
119
121
  ? html` <md-icon delete slot="icon" @click=${() => this._deleteAttachment(attachment.id)}>delete</md-icon>`
120
122
  : ''}
121
123
  <a button-download href=${attachment.fullpath} download=${attachment.name}>
@@ -129,7 +131,13 @@ class AttachmentListPopup extends connect(store)(LitElement) {
129
131
  })}
130
132
  </div>
131
133
 
132
- <ox-input-file accept="*/*" multiple="true" hide-filelist @change=${this.onCreateAttachment.bind(this)}></ox-input-file>
134
+ <ox-input-file
135
+ accept="*/*"
136
+ multiple="true"
137
+ hide-filelist
138
+ ?disabled=${this.status == BuildingInspectionStatus.PASS}
139
+ @change=${this.onCreateAttachment.bind(this)}
140
+ ></ox-input-file>
133
141
 
134
142
  <div button-container>
135
143
  <md-elevated-button @click=${this._close}> <md-icon slot="icon">cancel</md-icon>취소 </md-elevated-button>
@@ -177,6 +185,11 @@ class AttachmentListPopup extends connect(store)(LitElement) {
177
185
  }
178
186
 
179
187
  private async _deleteAttachment(attachmentId: string) {
188
+ if (this.status == BuildingInspectionStatus.PASS) {
189
+ notify({ message: '완료 상태인 검측정보를 변경할 수 없습니다.', level: 'error' })
190
+ return
191
+ }
192
+
180
193
  if (
181
194
  await OxPrompt.open({
182
195
  title: '첨부 자료를 삭제',
@@ -213,6 +226,11 @@ class AttachmentListPopup extends connect(store)(LitElement) {
213
226
 
214
227
  // 파일 변경 시 파일을 저장할 핸들러
215
228
  private async onCreateAttachment(e: CustomEvent) {
229
+ if (this.status == BuildingInspectionStatus.PASS) {
230
+ notify({ message: '완료 상태인 검측정보를 변경할 수 없습니다.', level: 'error' })
231
+ return
232
+ }
233
+
216
234
  const files = e.detail
217
235
 
218
236
  await this._createAttachments(files)
@@ -30,11 +30,10 @@ class ChecklistView extends connect(store)(LitElement) {
30
30
  :host {
31
31
  display: flex;
32
32
  flex-direction: column;
33
+ padding: var(--spacing-large, 12px);
34
+ padding-top: 0;
33
35
  font-size: 14px;
34
- padding: 20px;
35
36
  min-width: 800px;
36
-
37
- background-color: var(--md-sys-color-surface);
38
37
  }
39
38
 
40
39
  [bold] {
@@ -45,7 +44,6 @@ class ChecklistView extends connect(store)(LitElement) {
45
44
  display: flex;
46
45
  color: #586878;
47
46
  font-size: 24px;
48
- font-weight: bold;
49
47
  align-items: center;
50
48
  justify-content: center;
51
49
  }
@@ -58,8 +56,8 @@ class ChecklistView extends connect(store)(LitElement) {
58
56
  border-collapse: collapse;
59
57
  td,
60
58
  th {
61
- border: 1px #999999 solid;
62
- padding-inline: 8px;
59
+ border: 1px rgba(51, 51, 51, 0.2) solid;
60
+ padding-inline: var(--spacing-medium, 8px);
63
61
  vertical-align: middle;
64
62
  }
65
63
  th {
@@ -67,16 +65,17 @@ class ChecklistView extends connect(store)(LitElement) {
67
65
  font-weight: bold;
68
66
  }
69
67
  td {
70
- height: 35px;
68
+ height: 33px;
69
+ background-color: var(--md-sys-color-on-primary);
71
70
  &[radio] {
72
71
  text-align: center;
73
- width: 55px;
72
+ width: 50px;
74
73
  }
75
74
  }
76
75
  }
77
76
 
78
77
  table[header] {
79
- margin-top: 5px;
78
+ margin-top: var(--spacing-small, 4px);
80
79
 
81
80
  td {
82
81
  min-width: 180px;
@@ -89,9 +88,9 @@ class ChecklistView extends connect(store)(LitElement) {
89
88
  }
90
89
 
91
90
  table[body] {
92
- border: 2px solid #999999;
91
+ border: 2px solid var(--md-sys-color-on-primary-container);
93
92
  border-bottom: none;
94
- margin-top: 10px;
93
+ margin-top: var(--spacing-medium, 8px);
95
94
 
96
95
  th {
97
96
  text-align: center;
@@ -135,22 +134,24 @@ class ChecklistView extends connect(store)(LitElement) {
135
134
  vertical-align: middle;
136
135
  }
137
136
  }
137
+ &[disabled] * {
138
+ opacity: 0.6;
139
+ }
138
140
  }
139
141
  }
140
142
 
141
143
  table[tail] {
142
- border: 2px solid #999999;
144
+ border: 2px solid var(--md-sys-color-on-primary-container);
143
145
  border-top: none;
144
146
  margin-top: -1px;
145
147
 
146
- tr[first] td {
147
- border-top: none;
148
- }
149
148
  td {
150
149
  width: 25%;
151
150
  border-left: none;
152
151
  text-align: center;
153
152
  position: relative;
153
+ background-color: var(--md-sys-color-on-primary);
154
+ font-size: 14px;
154
155
  }
155
156
  th {
156
157
  width: 25%;
@@ -165,7 +166,7 @@ class ChecklistView extends connect(store)(LitElement) {
165
166
  pointer-events: none;
166
167
  }
167
168
  ox-input-signature {
168
- margin: 10px;
169
+ margin: var(--spacing-medium, 8px);
169
170
 
170
171
  &[disabled] {
171
172
  background: #eee;
@@ -176,12 +177,12 @@ class ChecklistView extends connect(store)(LitElement) {
176
177
  div[footer] {
177
178
  display: flex;
178
179
  flex-direction: column;
179
- gap: 3px;
180
+ gap: var(--spacing-tiny, 2px);
180
181
  font-size: 12px;
181
- margin-top: 10px;
182
+ margin-top: var(--spacing-medium, 8px);
182
183
  color: #586878;
183
184
  text-indent: -9px;
184
- padding-left: 9px;
185
+ padding-left: var(--spacing-medium, 8px);
185
186
  }
186
187
  `
187
188
  ]
@@ -251,7 +252,7 @@ class ChecklistView extends connect(store)(LitElement) {
251
252
 
252
253
  return html`
253
254
  <div wrapper>
254
- <div name>${this.checklist.name}</div>
255
+ <div name bold>${this.checklist.name}</div>
255
256
 
256
257
  <table header>
257
258
  <tr>
@@ -303,7 +304,7 @@ class ChecklistView extends connect(store)(LitElement) {
303
304
  : ''}
304
305
  ${showDetailTypeCell ? html` <td bold rowspan="${detailTypeRowspan}">${item.detailType}</td> ` : ''}
305
306
 
306
- <td bold>${idx + 1}. ${item.name}</td>
307
+ <td>${idx + 1}. ${item.name}</td>
307
308
  <td>${item.inspctionCriteria}</td>
308
309
  <td radio>
309
310
  <md-radio
@@ -349,11 +350,19 @@ class ChecklistView extends connect(store)(LitElement) {
349
350
  @change=${this._onChangeConfirmStatus}
350
351
  ></md-radio>
351
352
  </td>
352
- <td attachment @click=${() => this._onClickAttachment(item.id)}>
353
+ <td
354
+ attachment
355
+ ?disabled=${this.status == BuildingInspectionStatus.PASS}
356
+ @click=${() => this._onClickAttachment(item.id)}
357
+ >
353
358
  <md-icon slot="icon">attach_file</md-icon>
354
359
  <span>${item?.checklistItemAttachmentCount || ''}</span>
355
360
  </td>
356
- <td comment @click=${() => this._onClickComment(item.id)}>
361
+ <td
362
+ comment
363
+ ?disabled=${this.status == BuildingInspectionStatus.PASS}
364
+ @click=${() => this._onClickComment(item.id)}
365
+ >
357
366
  <md-icon slot="icon">chat</md-icon>
358
367
  <span>${item?.checklistItemCommentCount || ''}</span>
359
368
  </td>
@@ -516,6 +525,7 @@ class ChecklistView extends connect(store)(LitElement) {
516
525
  html`
517
526
  <comment-list-popup
518
527
  .checklistItemId=${checklistItemId}
528
+ .status=${this.status}
519
529
  @change-comment=${this._refreshItem.bind(this)}
520
530
  ></comment-list-popup>
521
531
  `,
@@ -532,6 +542,7 @@ class ChecklistView extends connect(store)(LitElement) {
532
542
  html`
533
543
  <attachment-list-popup
534
544
  .checklistItemId=${checklistItemId}
545
+ .status=${this.status}
535
546
  @change-attachment=${this._refreshItem.bind(this)}
536
547
  ></attachment-list-popup>
537
548
  `,
@@ -8,6 +8,7 @@ import { notify } from '@operato/layout'
8
8
  import { store, User } from '@operato/shell'
9
9
  import { connect } from 'pwa-helpers/connect-mixin.js'
10
10
  import { OxPrompt } from '@operato/popup/ox-prompt.js'
11
+ import { BuildingInspectionStatus } from '../building-inspection/building-inspection-list'
11
12
 
12
13
  @customElement('comment-list-popup')
13
14
  class CommentListPopup extends connect(store)(LitElement) {
@@ -39,6 +40,7 @@ class CommentListPopup extends connect(store)(LitElement) {
39
40
  div[comment-row] {
40
41
  display: flex;
41
42
  flex-direction: column;
43
+ padding-right: 10px;
42
44
 
43
45
  div[creator-container] {
44
46
  display: flex;
@@ -104,6 +106,7 @@ class CommentListPopup extends connect(store)(LitElement) {
104
106
  ]
105
107
 
106
108
  @property({ type: String }) checklistItemId: string = ''
109
+ @property({ type: String }) status: BuildingInspectionStatus = BuildingInspectionStatus.WAIT
107
110
 
108
111
  @state() item: any = { count: 0 }
109
112
  @state() checklistItemComments: any = []
@@ -129,7 +132,7 @@ class CommentListPopup extends connect(store)(LitElement) {
129
132
  <span creator><md-icon slot="icon">account_circle</md-icon> ${comment.creator.name}</span>
130
133
  <span createdAt>
131
134
  <md-icon slot="icon">schedule</md-icon> ${this._formatDate(comment.createdAt)}
132
- ${comment.creator.email === this.user.email
135
+ ${comment.creator.email === this.user.email && this.status != BuildingInspectionStatus.PASS
133
136
  ? html` <md-icon delete slot="icon" @click=${() => this._deleteComment(comment.id)}>delete</md-icon>`
134
137
  : ''}
135
138
  </span>
@@ -140,10 +143,16 @@ class CommentListPopup extends connect(store)(LitElement) {
140
143
  })}
141
144
  </div>
142
145
 
143
- <textarea .value=${this.comment || ''} @input=${this._onInputChange}></textarea>
146
+ <textarea
147
+ .value=${this.comment || ''}
148
+ ?disabled=${this.status == BuildingInspectionStatus.PASS}
149
+ @input=${this._onInputChange}
150
+ ></textarea>
144
151
 
145
152
  <div button-container>
146
- <md-elevated-button blue @click=${this._createComment}> <md-icon slot="icon">task</md-icon>저장 </md-elevated-button>
153
+ <md-elevated-button blue ?disabled=${this.status == BuildingInspectionStatus.PASS} @click=${this._createComment}>
154
+ <md-icon slot="icon">task</md-icon>저장
155
+ </md-elevated-button>
147
156
  <md-elevated-button @click=${this._close}> <md-icon slot="icon">cancel</md-icon>취소 </md-elevated-button>
148
157
  </div>
149
158
  </div>
@@ -12,6 +12,7 @@ import gql from 'graphql-tag';
12
12
  import { verifyBiometric } from '@things-factory/auth-base/client';
13
13
  import './component/building-inspection-detail-header';
14
14
  import '../checklist/checklist-view';
15
+ import { BuildingInspectionStatus } from './building-inspection-list';
15
16
  let BuildingInspectionDetailChecklist = class BuildingInspectionDetailChecklist extends PageView {
16
17
  constructor() {
17
18
  super(...arguments);
@@ -35,7 +36,7 @@ let BuildingInspectionDetailChecklist = class BuildingInspectionDetailChecklist
35
36
  ></building-inspection-detail-header>
36
37
 
37
38
  <div body>
38
- ${keyed(this.buildingInspection.id, html `
39
+ ${keyed(new Date(), html `
39
40
  <checklist-view
40
41
  .mode=${"EDITOR" /* ChecklistMode.EDITOR */}
41
42
  status=${this.buildingInspection.status}
@@ -45,7 +46,10 @@ let BuildingInspectionDetailChecklist = class BuildingInspectionDetailChecklist
45
46
  `)}
46
47
 
47
48
  <div button-container>
48
- <md-elevated-button @click=${this._onClickModifyChecklist}>
49
+ <md-elevated-button
50
+ ?disabled=${this.buildingInspection.status == BuildingInspectionStatus.PASS}
51
+ @click=${this._onClickModifyChecklist}
52
+ >
49
53
  <md-icon slot="icon">assignment</md-icon>등록
50
54
  </md-elevated-button>
51
55
  </div>
@@ -192,7 +196,7 @@ let BuildingInspectionDetailChecklist = class BuildingInspectionDetailChecklist
192
196
  }
193
197
  });
194
198
  if (!response.errors) {
195
- notify({ message: '검측요청서를 등록하였습니다.' });
199
+ notify({ message: '검측 요청서를 등록하였습니다.' });
196
200
  this.initBuildingInspection(this.buildingInspection.id);
197
201
  }
198
202
  else {
@@ -206,11 +210,11 @@ BuildingInspectionDetailChecklist.styles = [
206
210
  css `
207
211
  :host {
208
212
  display: grid;
209
- grid-template-rows: 75px auto;
213
+ grid-template-rows: 55px auto;
210
214
  color: #4e5055;
211
215
 
212
216
  width: 100%;
213
- background-color: #f7f7f7;
217
+ background-color: var(--md-sys-color-background, #f6f6f6);
214
218
  overflow-y: auto;
215
219
 
216
220
  --grid-record-emphasized-background-color: red;
@@ -1 +1 @@
1
- {"version":3,"file":"building-inspection-detail-checklist.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-checklist.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/data-grist'\n\nimport { CommonGristStyles, CommonButtonStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { openPopup } from '@operato/layout'\n\nimport { verifyBiometric } from '@things-factory/auth-base/client'\n\nimport './component/building-inspection-detail-header'\nimport '../checklist/checklist-view'\nimport { ChecklistMode } from '../checklist/checklist-view'\n\n@customElement('building-inspection-detail-checklist')\nexport class BuildingInspectionDetailChecklist extends PageView {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: #f7f7f7;\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[body] {\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n\n div[button-container] {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n gap: 10px;\n margin-right: 50px;\n margin-bottom: 15px;\n }\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n\n get context() {\n return {\n title: '검측 관리 상세 - 검측 체크리스트'\n }\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n ></building-inspection-detail-header>\n\n <div body>\n ${keyed(\n this.buildingInspection.id,\n html`\n <checklist-view\n .mode=${ChecklistMode.EDITOR}\n status=${this.buildingInspection.status}\n .checklist=${this.buildingInspection.checklist || {}}\n .buildingComplex=${this.buildingInspection?.buildingLevel?.building?.buildingComplex || {}}\n ></checklist-view>\n `\n )}\n\n <div button-container>\n <md-elevated-button @click=${this._onClickModifyChecklist}>\n <md-icon slot=\"icon\">assignment</md-icon>등록\n </md-elevated-button>\n </div>\n </div>\n `\n }\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n const buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(buildingInspectionId)\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n requestDate\n checklist {\n id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n documentNo\n constructionInspectionDate\n supervisorInspectionDate\n overallConstructorSignature\n taskConstructorSignature\n overallSupervisorySignature\n taskSupervisorySignature\n buildingInspection {\n status\n }\n checklistItems {\n id\n name\n sequence\n mainType\n detailType\n inspctionCriteria\n constructionConfirmStatus\n supervisoryConfirmStatus\n checklistItemCommentCount\n checklistItemAttachmentCount\n }\n }\n buildingLevel {\n id\n floor\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n building {\n id\n name\n buildingComplex {\n id\n overallConstructorEmails\n taskConstructorEmails\n overallSupervisoryEmails\n taskSupervisoryEmails\n }\n }\n }\n }\n }\n `,\n variables: {\n buildingInspectionId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: {\n buildingComplexId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n private _onClickModifyChecklist() {\n this.validateChecklist(this.buildingInspection.checklist)\n }\n\n private async validateChecklist(checklist: any) {\n try {\n const result = await verifyBiometric()\n if (result.verified) {\n console.log('Verification successful. Proceeding with sensitive action.')\n } else {\n notify({ message: 'Verification failed:' + result.message })\n return\n }\n } catch (error) {\n notify({ message: 'Error during biometric verification:' + error })\n return\n }\n\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateBuildingInspectionChecklist($buildingInspection: UpdateBuildingInspectionSubmitType!) {\n updateBuildingInspectionChecklist(buildingInspection: $buildingInspection)\n }\n `,\n variables: {\n buildingInspection: {\n id: this.buildingInspection.id,\n checklist: {\n id: checklist.id,\n overallConstructorSignature: checklist.overallConstructorSignature,\n taskConstructorSignature: checklist.taskConstructorSignature,\n overallSupervisorySignature: checklist.overallSupervisorySignature,\n taskSupervisorySignature: checklist.taskSupervisorySignature\n },\n checklistItem: checklist.checklistItems.map(item => ({\n id: item.id,\n constructionConfirmStatus: item.constructionConfirmStatus,\n supervisoryConfirmStatus: item.supervisoryConfirmStatus\n }))\n }\n }\n })\n\n if (!response.errors) {\n notify({ message: '검측요청서를 등록하였습니다.' })\n this.initBuildingInspection(this.buildingInspection.id)\n } else {\n notify({ message: response.errors?.[0]?.message || '검측 요청서 등록에 실패하였습니다.', level: 'error' })\n }\n }\n}\n"]}
1
+ {"version":3,"file":"building-inspection-detail-checklist.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-checklist.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/data-grist'\n\nimport { CommonGristStyles, CommonButtonStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { openPopup } from '@operato/layout'\n\nimport { verifyBiometric } from '@things-factory/auth-base/client'\n\nimport './component/building-inspection-detail-header'\nimport '../checklist/checklist-view'\nimport { ChecklistMode } from '../checklist/checklist-view'\nimport { BuildingInspectionStatus } from './building-inspection-list'\n\n@customElement('building-inspection-detail-checklist')\nexport class BuildingInspectionDetailChecklist extends PageView {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 55px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[body] {\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n\n div[button-container] {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n gap: 10px;\n margin-right: 50px;\n margin-bottom: 15px;\n }\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n\n get context() {\n return {\n title: '검측 관리 상세 - 검측 체크리스트'\n }\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n ></building-inspection-detail-header>\n\n <div body>\n ${keyed(\n new Date(),\n html`\n <checklist-view\n .mode=${ChecklistMode.EDITOR}\n status=${this.buildingInspection.status}\n .checklist=${this.buildingInspection.checklist || {}}\n .buildingComplex=${this.buildingInspection?.buildingLevel?.building?.buildingComplex || {}}\n ></checklist-view>\n `\n )}\n\n <div button-container>\n <md-elevated-button\n ?disabled=${this.buildingInspection.status == BuildingInspectionStatus.PASS}\n @click=${this._onClickModifyChecklist}\n >\n <md-icon slot=\"icon\">assignment</md-icon>등록\n </md-elevated-button>\n </div>\n </div>\n `\n }\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n const buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(buildingInspectionId)\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n requestDate\n checklist {\n id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n documentNo\n constructionInspectionDate\n supervisorInspectionDate\n overallConstructorSignature\n taskConstructorSignature\n overallSupervisorySignature\n taskSupervisorySignature\n buildingInspection {\n status\n }\n checklistItems {\n id\n name\n sequence\n mainType\n detailType\n inspctionCriteria\n constructionConfirmStatus\n supervisoryConfirmStatus\n checklistItemCommentCount\n checklistItemAttachmentCount\n }\n }\n buildingLevel {\n id\n floor\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n building {\n id\n name\n buildingComplex {\n id\n overallConstructorEmails\n taskConstructorEmails\n overallSupervisoryEmails\n taskSupervisoryEmails\n }\n }\n }\n }\n }\n `,\n variables: {\n buildingInspectionId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: {\n buildingComplexId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n private _onClickModifyChecklist() {\n this.validateChecklist(this.buildingInspection.checklist)\n }\n\n private async validateChecklist(checklist: any) {\n try {\n const result = await verifyBiometric()\n if (result.verified) {\n console.log('Verification successful. Proceeding with sensitive action.')\n } else {\n notify({ message: 'Verification failed:' + result.message })\n return\n }\n } catch (error) {\n notify({ message: 'Error during biometric verification:' + error })\n return\n }\n\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateBuildingInspectionChecklist($buildingInspection: UpdateBuildingInspectionSubmitType!) {\n updateBuildingInspectionChecklist(buildingInspection: $buildingInspection)\n }\n `,\n variables: {\n buildingInspection: {\n id: this.buildingInspection.id,\n checklist: {\n id: checklist.id,\n overallConstructorSignature: checklist.overallConstructorSignature,\n taskConstructorSignature: checklist.taskConstructorSignature,\n overallSupervisorySignature: checklist.overallSupervisorySignature,\n taskSupervisorySignature: checklist.taskSupervisorySignature\n },\n checklistItem: checklist.checklistItems.map(item => ({\n id: item.id,\n constructionConfirmStatus: item.constructionConfirmStatus,\n supervisoryConfirmStatus: item.supervisoryConfirmStatus\n }))\n }\n }\n })\n\n if (!response.errors) {\n notify({ message: '검측 요청서를 등록하였습니다.' })\n this.initBuildingInspection(this.buildingInspection.id)\n } else {\n notify({ message: response.errors?.[0]?.message || '검측 요청서 등록에 실패하였습니다.', level: 'error' })\n }\n }\n}\n"]}
@@ -115,6 +115,7 @@ let BuildingInspectionList = class BuildingInspectionList extends ScopedElements
115
115
  .mode=${'monthly'}
116
116
  .eventProvider=${this.calendarData}
117
117
  @select-date=${(e) => {
118
+ // TODO 선택된 날짜의 검측데이터만 그리드에 보여야함
118
119
  console.log('select-date', e.detail);
119
120
  }}
120
121
  >
@@ -374,7 +375,7 @@ BuildingInspectionList.styles = [
374
375
  --md-outlined-button-container-height: 30px;
375
376
  --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
376
377
  --md-outlined-button-leading-space: var(--spacing-medium, 8px);
377
- --md-sys-color-outline: rgba(51,51,51,.20);
378
+ --md-sys-color-outline: rgba(51, 51, 51, 0.2);
378
379
  }
379
380
 
380
381
  *[bold] {
@@ -384,20 +385,20 @@ BuildingInspectionList.styles = [
384
385
  div[header] {
385
386
  display: flex;
386
387
  margin: 0px var(--spacing-large, 12px);
387
- margin-bottom:var(--spacing-small, 5px);
388
+ margin-bottom: var(--spacing-small, 5px);
388
389
  }
389
390
 
390
391
  div[header] h2 {
391
392
  flex: 0.5;
392
393
  color: #3f71a0;
393
- font-size:18px;
394
+ font-size: 18px;
394
395
  }
395
396
 
396
397
  div[body] {
397
398
  display: flex;
398
399
  flex-direction: column;
399
400
  margin: var(--spacing-large, 12px);
400
- margin-top:0;
401
+ margin-top: 0;
401
402
  gap: var(--spacing-medium, 8px);
402
403
  min-height: fit-content;
403
404
  overflow-x: hidden;
@@ -458,10 +459,10 @@ BuildingInspectionList.styles = [
458
459
  align-items: center;
459
460
  justify-content: center;
460
461
 
461
- span::before{
462
+ span::before {
462
463
  display: inline-block;
463
464
  position: relative;
464
- content: "";
465
+ content: '';
465
466
  width: 10px;
466
467
  height: 10px;
467
468
  border-radius: 6px;
@@ -469,7 +470,7 @@ BuildingInspectionList.styles = [
469
470
  margin-right: 2px;
470
471
  }
471
472
 
472
- span[status='wait']::before{
473
+ span[status='wait']::before {
473
474
  background-color: #4e5055;
474
475
  }
475
476
  span[status='request']::before {
@@ -489,10 +490,10 @@ BuildingInspectionList.styles = [
489
490
  flex-direction: row;
490
491
  text-align: right;
491
492
  gap: var(--spacing-small, 4px);
492
- padding-right:var(--spacing-large, 12px);
493
+ padding-right: var(--spacing-large, 12px);
493
494
  border-right: 2px dotted #ccc;
494
495
  max-width: 100%;
495
- line-height:1.3;
496
+ line-height: 1.3;
496
497
 
497
498
  md-icon {
498
499
  width: 40px;