@dssp/supervision 1.0.0-alpha.4 → 1.0.0-alpha.7

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 (91) hide show
  1. package/dist-client/pages/building-inspection/building-inspection-list.js +2 -1
  2. package/dist-client/pages/building-inspection/building-inspection-list.js.map +1 -1
  3. package/dist-client/pages/building-inspection/component/inspection-event-provider.js +3 -3
  4. package/dist-client/pages/building-inspection/component/inspection-event-provider.js.map +1 -1
  5. package/dist-client/pages/building-inspection/inspection-create-popup.js +5 -4
  6. package/dist-client/pages/building-inspection/inspection-create-popup.js.map +1 -1
  7. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.d.ts +46 -0
  8. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js +930 -0
  9. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js.map +1 -0
  10. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.d.ts +2 -0
  11. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js +734 -0
  12. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js.map +1 -0
  13. package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.d.ts +1 -0
  14. package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.js +304 -0
  15. package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.js.map +1 -0
  16. package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.d.ts +15 -0
  17. package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.js +430 -0
  18. package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.js.map +1 -0
  19. package/dist-client/pages/checklist/checklist-view.d.ts +2 -0
  20. package/dist-client/pages/checklist/checklist-view.js +286 -185
  21. package/dist-client/pages/checklist/checklist-view.js.map +1 -1
  22. package/dist-client/pages/checklist-template/checklist-template-item.js +8 -3
  23. package/dist-client/pages/checklist-template/checklist-template-item.js.map +1 -1
  24. package/dist-client/pages/checklist-template/checklist-template-list.js +1 -1
  25. package/dist-client/pages/checklist-template/checklist-template-list.js.map +1 -1
  26. package/dist-client/route.d.ts +1 -1
  27. package/dist-client/route.js +3 -0
  28. package/dist-client/route.js.map +1 -1
  29. package/dist-client/stt/speech-to-text.d.ts +36 -0
  30. package/dist-client/stt/speech-to-text.js +89 -0
  31. package/dist-client/stt/speech-to-text.js.map +1 -0
  32. package/dist-client/stt/stt-utils.d.ts +28 -0
  33. package/dist-client/stt/stt-utils.js +146 -0
  34. package/dist-client/stt/stt-utils.js.map +1 -0
  35. package/dist-client/tsconfig.tsbuildinfo +1 -1
  36. package/dist-server/service/action-plan/index.d.ts +0 -1
  37. package/dist-server/service/action-plan/index.js +1 -2
  38. package/dist-server/service/action-plan/index.js.map +1 -1
  39. package/dist-server/service/building-inspection/building-inspection-mutation.d.ts +1 -0
  40. package/dist-server/service/building-inspection/building-inspection-mutation.js +83 -10
  41. package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
  42. package/dist-server/service/building-inspection/building-inspection-query.d.ts +2 -1
  43. package/dist-server/service/building-inspection/building-inspection-query.js +31 -2
  44. package/dist-server/service/building-inspection/building-inspection-query.js.map +1 -1
  45. package/dist-server/service/building-inspection/building-inspection-type.d.ts +5 -2
  46. package/dist-server/service/building-inspection/building-inspection-type.js +16 -4
  47. package/dist-server/service/building-inspection/building-inspection-type.js.map +1 -1
  48. package/dist-server/service/building-inspection/building-inspection.d.ts +9 -0
  49. package/dist-server/service/building-inspection/building-inspection.js +40 -2
  50. package/dist-server/service/building-inspection/building-inspection.js.map +1 -1
  51. package/dist-server/service/building-inspection/index.d.ts +2 -4
  52. package/dist-server/service/building-inspection/index.js +2 -4
  53. package/dist-server/service/building-inspection/index.js.map +1 -1
  54. package/dist-server/service/checklist/checklist-history.d.ts +8 -0
  55. package/dist-server/service/checklist/checklist-history.js +36 -0
  56. package/dist-server/service/checklist/checklist-history.js.map +1 -1
  57. package/dist-server/service/checklist/checklist.d.ts +10 -0
  58. package/dist-server/service/checklist/checklist.js +45 -3
  59. package/dist-server/service/checklist/checklist.js.map +1 -1
  60. package/dist-server/service/checklist/index.d.ts +0 -2
  61. package/dist-server/service/checklist/index.js +1 -3
  62. package/dist-server/service/checklist/index.js.map +1 -1
  63. package/dist-server/service/checklist-item-comment/index.d.ts +0 -2
  64. package/dist-server/service/checklist-item-comment/index.js +1 -3
  65. package/dist-server/service/checklist-item-comment/index.js.map +1 -1
  66. package/dist-server/service/checklist-template-item/checklist-template-item.js +2 -4
  67. package/dist-server/service/checklist-template-item/checklist-template-item.js.map +1 -1
  68. package/dist-server/service/index.d.ts +0 -1
  69. package/dist-server/service/index.js +1 -11
  70. package/dist-server/service/index.js.map +1 -1
  71. package/dist-server/service/issue/index.d.ts +0 -1
  72. package/dist-server/service/issue/index.js +1 -2
  73. package/dist-server/service/issue/index.js.map +1 -1
  74. package/dist-server/service/project-report/index.d.ts +0 -1
  75. package/dist-server/service/project-report/index.js +1 -2
  76. package/dist-server/service/project-report/index.js.map +1 -1
  77. package/dist-server/service/supervisor/index.d.ts +0 -1
  78. package/dist-server/service/supervisor/index.js +1 -2
  79. package/dist-server/service/supervisor/index.js.map +1 -1
  80. package/dist-server/tsconfig.tsbuildinfo +1 -1
  81. package/package.json +13 -13
  82. package/things-factory.config.js +3 -1
  83. package/dist-server/service/building-inspection/event-subscriber.d.ts +0 -7
  84. package/dist-server/service/building-inspection/event-subscriber.js +0 -21
  85. package/dist-server/service/building-inspection/event-subscriber.js.map +0 -1
  86. package/dist-server/service/checklist/event-subscriber.d.ts +0 -7
  87. package/dist-server/service/checklist/event-subscriber.js +0 -21
  88. package/dist-server/service/checklist/event-subscriber.js.map +0 -1
  89. package/dist-server/service/checklist-item-comment/event-subscriber.d.ts +0 -7
  90. package/dist-server/service/checklist-item-comment/event-subscriber.js +0 -21
  91. package/dist-server/service/checklist-item-comment/event-subscriber.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/fab/fab.js';
2
3
  import '@material/web/icon/icon.js';
3
4
  import gql from 'graphql-tag';
4
5
  import { client } from '@operato/graphql';
@@ -12,6 +13,8 @@ import { connect } from 'pwa-helpers/connect-mixin.js';
12
13
  import { openPopup } from '@operato/layout';
13
14
  import './comment-list-popup';
14
15
  import './attachment-list-popup';
16
+ import '../../stt/speech-to-text';
17
+ import { parseSpeechCommand } from '../../stt/stt-utils';
15
18
  let ChecklistView = class ChecklistView extends connect(store)(LitElement) {
16
19
  constructor() {
17
20
  super(...arguments);
@@ -25,9 +28,55 @@ let ChecklistView = class ChecklistView extends connect(store)(LitElement) {
25
28
  overallSupervisoryEmails: []
26
29
  };
27
30
  this.status = BuildingInspectionStatus.WAIT;
31
+ this.isListening = false;
32
+ this._onToggleSTT = () => {
33
+ const stt = this.renderRoot.querySelector('#stt');
34
+ if (!this.isListening) {
35
+ stt === null || stt === void 0 ? void 0 : stt.startListening();
36
+ }
37
+ else {
38
+ stt === null || stt === void 0 ? void 0 : stt.stopListening();
39
+ }
40
+ // isListening은 stt-status 이벤트에서 갱신됨
41
+ };
42
+ }
43
+ firstUpdated() {
44
+ const stt = this.renderRoot.querySelector('#stt');
45
+ if (stt) {
46
+ stt.addEventListener('stt-result', (e) => {
47
+ var _a, _b;
48
+ const text = e.detail.finalTranscript;
49
+ const parsed = parseSpeechCommand(text, ((_b = (_a = this.checklist) === null || _a === void 0 ? void 0 : _a.checklistItems) === null || _b === void 0 ? void 0 : _b.length) || 20);
50
+ this._applySpeechCommand(parsed);
51
+ });
52
+ stt.addEventListener('stt-status', (e) => {
53
+ // 음성 인식 상태에 따라 버튼 상태 갱신
54
+ const status = e.detail.status;
55
+ if (status && status.includes('Listening'))
56
+ this.isListening = true;
57
+ if (status && (status.includes('종료') || status.includes('Stopped')))
58
+ this.isListening = false;
59
+ this.requestUpdate();
60
+ });
61
+ }
62
+ }
63
+ /**
64
+ * 음성 명령 해석 결과를 체크리스트에 반영
65
+ */
66
+ _applySpeechCommand(parsed) {
67
+ // 합격/불합격 처리 예시 (시공자 기준)
68
+ if (parsed.rowIds && parsed.isPass !== null) {
69
+ this.checklist.checklistItems = this.checklist.checklistItems.map((item, idx) => parsed.rowIds.includes(idx + 1) ? Object.assign(Object.assign({}, item), { constructionConfirmStatus: parsed.isPass ? 'T' : 'F' }) : item);
70
+ this.requestUpdate();
71
+ }
72
+ // 조치사항 처리 예시
73
+ if (parsed.rowIds && parsed.actionText) {
74
+ this.checklist.checklistItems = this.checklist.checklistItems.map((item, idx) => parsed.rowIds.includes(idx + 1) ? Object.assign(Object.assign({}, item), { action: parsed.actionText }) : item);
75
+ this.requestUpdate();
76
+ }
28
77
  }
29
78
  render() {
30
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
79
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
31
80
  const today = this._getDate(new Date());
32
81
  // 시공자 스탭 여부
33
82
  const isConstructorStep = this.status == BuildingInspectionStatus.WAIT ||
@@ -73,199 +122,205 @@ let ChecklistView = class ChecklistView extends connect(store)(LitElement) {
73
122
  });
74
123
  const processedItems = this.drawChecklistItems(((_j = this.checklist) === null || _j === void 0 ? void 0 : _j.checklistItems) || []);
75
124
  return html `
76
- <div wrapper>
77
- <div name bold>${this.checklist.name}</div>
125
+ <speech-to-text id="stt"></speech-to-text>
126
+ <div title-row>
127
+ <div name>${this.checklist.name}</div>
128
+ <md-fab
129
+ class="stt-fab"
130
+ ?active=${this.isListening}
131
+ @click=${this._onToggleSTT}
132
+ ?disabled=${false}
133
+ style="position:absolute;top:0;right:0;z-index:10;"
134
+ .label=${this.isListening ? '음성 인식 중지' : '음성 인식 시작'}
135
+ >
136
+ <md-icon slot="icon">mic</md-icon>
137
+ </md-fab>
138
+ </div>
139
+ <table header>
140
+ <tr>
141
+ <th>공종</th>
142
+ <td>${this.checklist.constructionType}</td>
143
+ <th>문서 번호</th>
144
+ <td>${this.checklist.documentNo}</td>
145
+ </tr>
146
+ <tr>
147
+ <th>세부 공종</th>
148
+ <td>${this.checklist.constructionDetailType}</td>
149
+ <th>위치 및 부위</th>
150
+ <td>${this.checklist.location}</td>
151
+ </tr>
152
+ <tr>
153
+ <th>검측 부위</th>
154
+ <td>${((_l = (_k = this.checklist) === null || _k === void 0 ? void 0 : _k.inspectionParts) === null || _l === void 0 ? void 0 : _l.join(', ')) || ''}</td>
155
+ <th>검측 상태</th>
156
+ <td>${BUILDING_INSPECTION_STATUS_DISPLAY[this.status]}</td>
157
+ </tr>
158
+ </table>
78
159
 
79
- <table header>
160
+ <table body>
161
+ <thead>
80
162
  <tr>
81
- <th>공종</th>
82
- <td>${this.checklist.constructionType}</td>
83
- <th>문서 번호</th>
84
- <td>${this.checklist.documentNo}</td>
163
+ <th colspan="2" rowspan="3" type>구분</th>
164
+ <th rowspan="3" inspection-name>검사항목</th>
165
+ <th rowspan="3" criteria>검사기준</th>
166
+ <th colspan="4" result>검사결과</th>
167
+ <th rowspan="3" small>첨부자료</th>
168
+ <th rowspan="3" small>조치사항</th>
85
169
  </tr>
86
170
  <tr>
87
- <th>세부 공종</th>
88
- <td>${this.checklist.constructionDetailType}</td>
89
- <th>위치 및 부위</th>
90
- <td>${this.checklist.location}</td>
171
+ <th colspan="2">시공자</th>
172
+ <th colspan="2">감리자</th>
91
173
  </tr>
92
174
  <tr>
93
- <th>검측 부위</th>
94
- <td>${((_l = (_k = this.checklist) === null || _k === void 0 ? void 0 : _k.inspectionParts) === null || _l === void 0 ? void 0 : _l.join(', ')) || ''}</td>
95
- <th>검측 상태</th>
96
- <td>${BUILDING_INSPECTION_STATUS_DISPLAY[(_o = (_m = this.checklist) === null || _m === void 0 ? void 0 : _m.buildingInspection) === null || _o === void 0 ? void 0 : _o.status]}</td>
175
+ <th>적합</th>
176
+ <th>부적합</th>
177
+ <th>적합</th>
178
+ <th>부적합</th>
97
179
  </tr>
98
- </table>
99
-
100
- <table body>
101
- <thead>
102
- <tr>
103
- <th colspan="2" rowspan="3" type>구분</th>
104
- <th rowspan="3" inspection-name>검사항목</th>
105
- <th rowspan="3" criteria>검사기준</th>
106
- <th colspan="4" result>검사결과</th>
107
- <th rowspan="3" small>첨부자료</th>
108
- <th rowspan="3" small>조치사항</th>
109
- </tr>
110
- <tr>
111
- <th colspan="2">시공자</th>
112
- <th colspan="2">감리자</th>
113
- </tr>
114
- <tr>
115
- <th>적합</th>
116
- <th>부적합</th>
117
- <th>적합</th>
118
- <th>부적합</th>
119
- </tr>
120
- </thead>
121
- <tbody>
122
- ${processedItems.map(({ item, showMainTypeCell, mainTypeRowspan, showDetailTypeCell, detailTypeRowspan }, idx) => {
180
+ </thead>
181
+ <tbody>
182
+ ${processedItems.map(({ item, showMainTypeCell, mainTypeRowspan, showDetailTypeCell, detailTypeRowspan }, idx) => {
123
183
  return html ` <tr>
124
- ${showMainTypeCell
184
+ ${showMainTypeCell
125
185
  ? html `<td main-type bold rowspan="${mainTypeRowspan}">${CHECKLIST_MAIN_TYPE_LIST[item.mainType]}</td>`
126
186
  : ''}
127
- ${showDetailTypeCell ? html ` <td bold rowspan="${detailTypeRowspan}">${item.detailType}</td> ` : ''}
128
-
129
- <td>${idx + 1}. ${item.name}</td>
130
- <td>${item.inspctionCriteria}</td>
131
- <td radio>
132
- <md-radio
133
- item-id=${item.id}
134
- item-name="constructionConfirmStatus"
135
- name=${'radio-construction-' + item.id}
136
- value="T"
137
- .checked=${item.constructionConfirmStatus === 'T'}
138
- ?disabled=${!isConstructorStep || !havePermissionByStatus}
139
- @change=${this._onChangeConfirmStatus}
140
- ></md-radio>
141
- </td>
142
- <td radio>
143
- <md-radio
144
- item-id=${item.id}
145
- item-name="constructionConfirmStatus"
146
- name=${'radio-construction-' + item.id}
147
- value="F"
148
- .checked=${item.constructionConfirmStatus === 'F'}
149
- ?disabled=${!isConstructorStep || !havePermissionByStatus}
150
- @change=${this._onChangeConfirmStatus}
151
- ></md-radio>
152
- </td>
153
- <td radio>
154
- <md-radio
155
- item-id=${item.id}
156
- item-name="supervisoryConfirmStatus"
157
- name=${'radio-supervisory-' + item.id}
158
- value="T"
159
- .checked=${item.supervisoryConfirmStatus === 'T'}
160
- ?disabled=${!isSupervisoryStep || !havePermissionByStatus}
161
- @change=${this._onChangeConfirmStatus}
162
- ></md-radio>
163
- </td>
164
- <td radio>
165
- <md-radio
166
- item-id=${item.id}
167
- item-name="supervisoryConfirmStatus"
168
- name=${'radio-supervisory-' + item.id}
169
- value="F"
170
- .checked=${item.supervisoryConfirmStatus === 'F'}
171
- ?disabled=${!isSupervisoryStep || !havePermissionByStatus}
172
- @change=${this._onChangeConfirmStatus}
173
- ></md-radio>
174
- </td>
175
- <td
176
- attachment
177
- ?disabled=${this.status == BuildingInspectionStatus.PASS}
178
- @click=${() => this._onClickAttachment(item.id)}
179
- >
180
- <md-icon slot="icon">attach_file</md-icon>
181
- <span>${(item === null || item === void 0 ? void 0 : item.checklistItemAttachmentCount) || ''}</span>
182
- </td>
183
- <td
184
- comment
185
- ?disabled=${this.status == BuildingInspectionStatus.PASS}
186
- @click=${() => this._onClickComment(item.id)}
187
- >
188
- <md-icon slot="icon">chat</md-icon>
189
- <span>${(item === null || item === void 0 ? void 0 : item.checklistItemCommentCount) || ''}</span>
190
- </td>
191
- </tr>`;
192
- })}
193
- </tbody>
194
- </table>
187
+ ${showDetailTypeCell ? html ` <td bold rowspan="${detailTypeRowspan}">${item.detailType}</td> ` : ''}
195
188
 
196
- <table tail>
197
- <tbody>
198
- <tr first>
199
- <th rowspan="2">시공자 점검일</th>
200
- <td rowspan="2">
201
- ${this.mode == "VIEWER" /* ChecklistMode.VIEWER */ ? today : this._getDate(this.checklist.constructionInspectionDate)}
189
+ <td>${idx + 1}. ${item.name}</td>
190
+ <td>${item.inspctionCriteria}</td>
191
+ <td radio>
192
+ <md-radio
193
+ item-id=${item.id}
194
+ item-name="constructionConfirmStatus"
195
+ name=${'radio-construction-' + item.id}
196
+ value="T"
197
+ .checked=${item.constructionConfirmStatus === 'T'}
198
+ ?disabled=${!isConstructorStep || !havePermissionByStatus}
199
+ @change=${this._onChangeConfirmStatus}
200
+ ></md-radio>
202
201
  </td>
203
- <th>공종별 시공 관리자</th>
204
- <td>
205
- <span sign-text>(인)</span>
206
- <ox-input-signature
207
- .value=${this.checklist.taskConstructorSignature}
208
- name="taskConstructorSignature"
209
- @change=${this._onChangeSignature}
210
- ?disabled=${(this.status != BuildingInspectionStatus.WAIT && this.status != BuildingInspectionStatus.FAIL) ||
211
- !isTaskConstructor}
212
- >
213
- </ox-input-signature>
202
+ <td radio>
203
+ <md-radio
204
+ item-id=${item.id}
205
+ item-name="constructionConfirmStatus"
206
+ name=${'radio-construction-' + item.id}
207
+ value="F"
208
+ .checked=${item.constructionConfirmStatus === 'F'}
209
+ ?disabled=${!isConstructorStep || !havePermissionByStatus}
210
+ @change=${this._onChangeConfirmStatus}
211
+ ></md-radio>
214
212
  </td>
215
- </tr>
216
- <tr>
217
- <th>총괄 시공 책임자</th>
218
- <td>
219
- <span sign-text>(인)</span>
220
- <ox-input-signature
221
- .value=${this.checklist.overallConstructorSignature}
222
- name="overallConstructorSignature"
223
- @change=${this._onChangeSignature}
224
- ?disabled=${this.status != BuildingInspectionStatus.OVERALL_WAIT || !isOverallConstructor}
225
- >
226
- </ox-input-signature>
213
+ <td radio>
214
+ <md-radio
215
+ item-id=${item.id}
216
+ item-name="supervisoryConfirmStatus"
217
+ name=${'radio-supervisory-' + item.id}
218
+ value="T"
219
+ .checked=${item.supervisoryConfirmStatus === 'T'}
220
+ ?disabled=${!isSupervisoryStep || !havePermissionByStatus}
221
+ @change=${this._onChangeConfirmStatus}
222
+ ></md-radio>
227
223
  </td>
228
- </tr>
229
- <tr>
230
- <th rowspan="2">감리자 점검일</th>
231
- <td rowspan="2">
232
- ${this.mode == "VIEWER" /* ChecklistMode.VIEWER */ ? today : this._getDate(this.checklist.supervisorInspectionDate)}
224
+ <td radio>
225
+ <md-radio
226
+ item-id=${item.id}
227
+ item-name="supervisoryConfirmStatus"
228
+ name=${'radio-supervisory-' + item.id}
229
+ value="F"
230
+ .checked=${item.supervisoryConfirmStatus === 'F'}
231
+ ?disabled=${!isSupervisoryStep || !havePermissionByStatus}
232
+ @change=${this._onChangeConfirmStatus}
233
+ ></md-radio>
233
234
  </td>
234
- <th>공종별 감리 책임자</th>
235
- <td>
236
- <span sign-text>(인)</span>
237
- <ox-input-signature
238
- .value=${this.checklist.taskSupervisorySignature}
239
- name="taskSupervisorySignature"
240
- @change=${this._onChangeSignature}
241
- ?disabled=${this.status != BuildingInspectionStatus.REQUEST || !isTaskSupervisory}
242
- >
243
- </ox-input-signature>
235
+ <td
236
+ attachment
237
+ ?disabled=${this.status == BuildingInspectionStatus.PASS}
238
+ @click=${() => this._onClickAttachment(item.id)}
239
+ >
240
+ <md-icon slot="icon">attach_file</md-icon>
241
+ <span>${(item === null || item === void 0 ? void 0 : item.checklistItemAttachmentCount) || ''}</span>
244
242
  </td>
245
- </tr>
246
- <tr>
247
- <th>총괄 감리 책임자</th>
248
- <td>
249
- <span sign-text>(인)</span>
250
- <ox-input-signature
251
- .value=${this.checklist.overallSupervisorySignature}
252
- name="overallSupervisorySignature"
253
- @change=${this._onChangeSignature}
254
- ?disabled=${this.status != BuildingInspectionStatus.OVERALL_REQUEST || !isOverallSupervisory}
255
- >
256
- </ox-input-signature>
243
+ <td comment ?disabled=${this.status == BuildingInspectionStatus.PASS} @click=${() => this._onClickComment(item.id)}>
244
+ <md-icon slot="icon">chat</md-icon>
245
+ <span>${(item === null || item === void 0 ? void 0 : item.checklistItemCommentCount) || ''}</span>
257
246
  </td>
258
- </tr>
259
- </tbody>
260
- </table>
247
+ </tr>`;
248
+ })}
249
+ </tbody>
250
+ </table>
251
+
252
+ <table tail>
253
+ <tbody>
254
+ <tr first>
255
+ <th rowspan="2">시공자 점검일</th>
256
+ <td rowspan="2">
257
+ ${this.mode == "VIEWER" /* ChecklistMode.VIEWER */ ? today : this._getDate(this.checklist.constructionInspectionDate)}
258
+ </td>
259
+ <th>공종별 시공 관리자</th>
260
+ <td>
261
+ <span sign-text>(인)</span>
262
+ <ox-input-signature
263
+ .value=${this.checklist.taskConstructorSignature}
264
+ name="taskConstructorSignature"
265
+ @change=${this._onChangeSignature}
266
+ ?disabled=${(this.status != BuildingInspectionStatus.WAIT && this.status != BuildingInspectionStatus.FAIL) ||
267
+ !isTaskConstructor}
268
+ >
269
+ </ox-input-signature>
270
+ </td>
271
+ </tr>
272
+ <tr>
273
+ <th>총괄 시공 책임자</th>
274
+ <td>
275
+ <span sign-text>(인)</span>
276
+ <ox-input-signature
277
+ .value=${this.checklist.overallConstructorSignature}
278
+ name="overallConstructorSignature"
279
+ @change=${this._onChangeSignature}
280
+ ?disabled=${this.status != BuildingInspectionStatus.OVERALL_WAIT || !isOverallConstructor}
281
+ >
282
+ </ox-input-signature>
283
+ </td>
284
+ </tr>
285
+ <tr>
286
+ <th rowspan="2">감리자 점검일</th>
287
+ <td rowspan="2">
288
+ ${this.mode == "VIEWER" /* ChecklistMode.VIEWER */ ? today : this._getDate(this.checklist.supervisorInspectionDate)}
289
+ </td>
290
+ <th>공종별 감리 책임자</th>
291
+ <td>
292
+ <span sign-text>(인)</span>
293
+ <ox-input-signature
294
+ .value=${this.checklist.taskSupervisorySignature}
295
+ name="taskSupervisorySignature"
296
+ @change=${this._onChangeSignature}
297
+ ?disabled=${this.status != BuildingInspectionStatus.REQUEST || !isTaskSupervisory}
298
+ >
299
+ </ox-input-signature>
300
+ </td>
301
+ </tr>
302
+ <tr>
303
+ <th>총괄 감리 책임자</th>
304
+ <td>
305
+ <span sign-text>(인)</span>
306
+ <ox-input-signature
307
+ .value=${this.checklist.overallSupervisorySignature}
308
+ name="overallSupervisorySignature"
309
+ @change=${this._onChangeSignature}
310
+ ?disabled=${this.status != BuildingInspectionStatus.OVERALL_REQUEST || !isOverallSupervisory}
311
+ >
312
+ </ox-input-signature>
313
+ </td>
314
+ </tr>
315
+ </tbody>
316
+ </table>
261
317
 
262
- <div footer>
263
- <div>
264
- - 검사결과는 1차, 2차로 구분 재검측시 2차에 기록하고 검사기준도 검사결과와 비교될 수 있도록 시방서 또는 도면 등에 있는
265
- 수치를 작성하며, 수치가 없는 검사항목은 시방서 또는 설계도서에 있는 내용과 검사한 내용으로 작성함
266
- </div>
267
- <div>- 검사항목 및 검사기준은 각 공종별로 감리원과 협의하여 작성할 것</div>
318
+ <div footer>
319
+ <div>
320
+ - 검사결과는 1차, 2차로 구분 재검측시 2차에 기록하고 검사기준도 검사결과와 비교될 수 있도록 시방서 또는 도면 등에 있는
321
+ 수치를 작성하며, 수치가 없는 검사항목은 시방서 또는 설계도서에 있는 내용과 검사한 내용으로 작성함
268
322
  </div>
323
+ <div>- 검사항목 및 검사기준은 각 공종별로 감리원과 협의하여 작성할 것</div>
269
324
  </div>
270
325
  `;
271
326
  }
@@ -332,11 +387,7 @@ let ChecklistView = class ChecklistView extends connect(store)(LitElement) {
332
387
  .status=${this.status}
333
388
  @change-comment=${this._refreshItem.bind(this)}
334
389
  ></comment-list-popup>
335
- `, {
336
- backdrop: true,
337
- size: 'medium',
338
- title: '조치 사항'
339
- });
390
+ `, { backdrop: true, size: 'medium', title: '조치 사항' });
340
391
  }
341
392
  _onClickAttachment(checklistItemId) {
342
393
  openPopup(html `
@@ -345,11 +396,7 @@ let ChecklistView = class ChecklistView extends connect(store)(LitElement) {
345
396
  .status=${this.status}
346
397
  @change-attachment=${this._refreshItem.bind(this)}
347
398
  ></attachment-list-popup>
348
- `, {
349
- backdrop: true,
350
- size: 'medium',
351
- title: '첨부 자료'
352
- });
399
+ `, { backdrop: true, size: 'medium', title: '첨부 자료' });
353
400
  }
354
401
  async _refreshItem(e) {
355
402
  var _a;
@@ -536,6 +583,60 @@ ChecklistView.styles = [
536
583
  text-indent: -9px;
537
584
  padding-left: var(--spacing-medium, 8px);
538
585
  }
586
+
587
+ .stt-float-btns {
588
+ position: absolute;
589
+ top: 0;
590
+ right: 0;
591
+ display: flex;
592
+ gap: 8px;
593
+ z-index: 10;
594
+ }
595
+ .stt-float-btns button {
596
+ background: #fff;
597
+ border: 1px solid #ccc;
598
+ border-radius: 50%;
599
+ width: 38px;
600
+ height: 38px;
601
+ font-size: 18px;
602
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
603
+ cursor: pointer;
604
+ transition: background 0.2s;
605
+ outline: none;
606
+ }
607
+ .stt-float-btns button:hover {
608
+ background: #f2f2f2;
609
+ }
610
+ div[title-row] {
611
+ position: relative;
612
+ display: flex;
613
+ align-items: center;
614
+ justify-content: center;
615
+ margin-bottom: 8px;
616
+ }
617
+ div[name] {
618
+ color: #586878;
619
+ font-size: 24px;
620
+ font-weight: bold;
621
+ flex: 1;
622
+ text-align: center;
623
+ }
624
+
625
+ @keyframes pulse {
626
+ 0% {
627
+ filter: drop-shadow(0 0 0 #d32f2f);
628
+ }
629
+ 70% {
630
+ filter: drop-shadow(0 0 8px #d32f2f);
631
+ }
632
+ 100% {
633
+ filter: drop-shadow(0 0 0 #d32f2f);
634
+ }
635
+ }
636
+ .stt-fab[active] md-icon {
637
+ color: #d32f2f;
638
+ animation: pulse 1s infinite;
639
+ }
539
640
  `
540
641
  ];
541
642
  __decorate([