@dssp/supervision 1.0.0-alpha.23 → 1.0.0-alpha.25

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 (57) hide show
  1. package/dist-client/graphql/building-inspection.js +17 -0
  2. package/dist-client/graphql/building-inspection.js.map +1 -1
  3. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.d.ts +4 -0
  4. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.js +50 -3
  5. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.js.map +1 -1
  6. package/dist-client/pages/building-inspection/building-inspection-list.d.ts +4 -0
  7. package/dist-client/pages/building-inspection/building-inspection-list.js +22 -2
  8. package/dist-client/pages/building-inspection/building-inspection-list.js.map +1 -1
  9. package/dist-client/pages/building-inspection/component/image-preview-popup.d.ts +15 -0
  10. package/dist-client/pages/building-inspection/component/image-preview-popup.js +351 -0
  11. package/dist-client/pages/building-inspection/component/image-preview-popup.js.map +1 -0
  12. package/dist-client/pages/building-inspection/component/inspection-document/inspection-request-document.d.ts +21 -0
  13. package/dist-client/pages/building-inspection/component/inspection-document/inspection-request-document.js +473 -0
  14. package/dist-client/pages/building-inspection/component/inspection-document/inspection-request-document.js.map +1 -0
  15. package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.d.ts +27 -0
  16. package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js +401 -0
  17. package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js.map +1 -0
  18. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js +4 -0
  19. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js.map +1 -1
  20. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js +6 -1
  21. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js.map +1 -1
  22. package/dist-client/pages/checklist/attachment-list-popup.d.ts +1 -0
  23. package/dist-client/pages/checklist/attachment-list-popup.js +250 -68
  24. package/dist-client/pages/checklist/attachment-list-popup.js.map +1 -1
  25. package/dist-client/pages/checklist/checklist-view.d.ts +5 -0
  26. package/dist-client/pages/checklist/checklist-view.js +54 -13
  27. package/dist-client/pages/checklist/checklist-view.js.map +1 -1
  28. package/dist-client/pages/checklist/file-preview-popup.js +0 -1
  29. package/dist-client/pages/checklist/file-preview-popup.js.map +1 -1
  30. package/dist-client/pages/checklist/inspection-info-popup.d.ts +3 -0
  31. package/dist-client/pages/checklist/inspection-info-popup.js +144 -23
  32. package/dist-client/pages/checklist/inspection-info-popup.js.map +1 -1
  33. package/dist-client/pages/checklist/inspection-tab-popup.d.ts +1 -0
  34. package/dist-client/pages/checklist/inspection-tab-popup.js +8 -1
  35. package/dist-client/pages/checklist/inspection-tab-popup.js.map +1 -1
  36. package/dist-client/route.d.ts +1 -1
  37. package/dist-client/tsconfig.tsbuildinfo +1 -1
  38. package/dist-server/service/building-inspection/building-inspection-history.d.ts +1 -0
  39. package/dist-server/service/building-inspection/building-inspection-history.js +5 -0
  40. package/dist-server/service/building-inspection/building-inspection-history.js.map +1 -1
  41. package/dist-server/service/building-inspection/building-inspection-mutation.js +9 -3
  42. package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
  43. package/dist-server/service/building-inspection/building-inspection-type.d.ts +1 -0
  44. package/dist-server/service/building-inspection/building-inspection-type.js +4 -0
  45. package/dist-server/service/building-inspection/building-inspection-type.js.map +1 -1
  46. package/dist-server/service/building-inspection/building-inspection.js +1 -1
  47. package/dist-server/service/building-inspection/building-inspection.js.map +1 -1
  48. package/dist-server/service/building-inspection/index.d.ts +1 -1
  49. package/dist-server/service/checklist/checklist-query.d.ts +4 -0
  50. package/dist-server/service/checklist/checklist-query.js +52 -0
  51. package/dist-server/service/checklist/checklist-query.js.map +1 -1
  52. package/dist-server/service/checklist-item/checklist-item-query.d.ts +1 -1
  53. package/dist-server/service/checklist-item/checklist-item-query.js +5 -3
  54. package/dist-server/service/checklist-item/checklist-item-query.js.map +1 -1
  55. package/dist-server/service/index.d.ts +1 -1
  56. package/dist-server/tsconfig.tsbuildinfo +1 -1
  57. package/package.json +2 -2
@@ -0,0 +1,473 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/button/elevated-button.js';
3
+ import '@material/web/icon/icon.js';
4
+ import { css, html, LitElement } from 'lit';
5
+ import { customElement, property } from 'lit/decorators.js';
6
+ import { ScrollbarStyles } from '@operato/styles';
7
+ import { openPopup } from '@operato/layout';
8
+ import './photo-album-popup';
9
+ export var InspectionMode;
10
+ (function (InspectionMode) {
11
+ InspectionMode["EDIT"] = "EDIT";
12
+ InspectionMode["VIEW"] = "VIEW";
13
+ })(InspectionMode || (InspectionMode = {}));
14
+ let InspectionRequestDocument = class InspectionRequestDocument extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.checklist = {};
18
+ this.buildingInspection = {};
19
+ this.mode = InspectionMode.VIEW;
20
+ }
21
+ render() {
22
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
23
+ const today = this._formatDate(new Date());
24
+ const requestDate = this._formatDate(new Date(this.buildingInspection.requestDate));
25
+ return html `
26
+ <div class="document-main-title">검측요청결과 통보내용</div>
27
+
28
+ <div class="document-container">
29
+ <div class="document-header">
30
+ <div class="document-title">검측요청서</div>
31
+ </div>
32
+
33
+ <div class="document-body">
34
+ <div class="date-section">${today}</div>
35
+
36
+ <div class="request-info">
37
+ <div class="recipient-section">
38
+ <div class="recipient-item">
39
+ <span class="recipient-label">번호:</span>
40
+ <span>${((_a = this.checklist) === null || _a === void 0 ? void 0 : _a.documentNo) || ''}</span>
41
+ </div>
42
+ <div class="recipient-item">
43
+ <span class="recipient-label">받음:</span>
44
+ <span>${(_e = (_d = (_c = (_b = this.buildingInspection) === null || _b === void 0 ? void 0 : _b.buildingLevel) === null || _c === void 0 ? void 0 : _c.building) === null || _d === void 0 ? void 0 : _d.buildingComplex) === null || _e === void 0 ? void 0 : _e.supervisoryCompany}</span>
45
+ </div>
46
+ </div>
47
+
48
+ <div style="margin: 15px 0;">다음과 같은 세부공종에 대하여 검측요청 하오니 검사 후 승인하여 주시 기 바랍니다.</div>
49
+
50
+ <table class="request-table">
51
+ <tr>
52
+ <th>위치 및 공종</th>
53
+ <td>${(((_f = this.checklist) === null || _f === void 0 ? void 0 : _f.location) || '') + ' - ' + (((_g = this.checklist) === null || _g === void 0 ? void 0 : _g.constructionType) || '')}</td>
54
+ </tr>
55
+ <tr>
56
+ <th>검측 부위</th>
57
+ <td>${((_j = (_h = this.checklist) === null || _h === void 0 ? void 0 : _h.inspectionParts) === null || _j === void 0 ? void 0 : _j.join(', ')) || ''}</td>
58
+ </tr>
59
+ <tr>
60
+ <th>검측 요구일시</th>
61
+ <td>${requestDate}</td>
62
+ </tr>
63
+ <tr>
64
+ <th>검측 사항</th>
65
+ <td>
66
+ ${this.mode === InspectionMode.EDIT
67
+ ? html `
68
+ <input
69
+ type="text"
70
+ name="memo"
71
+ class="inspection-memo-input"
72
+ .value=${((_k = this.buildingInspection) === null || _k === void 0 ? void 0 : _k.memo) || ''}
73
+ @input=${this._onInspectionMemoChange}
74
+ placeholder="검측사항을 입력하세요."
75
+ />
76
+ `
77
+ : html ` <div class="inspection-memo-text">${(_l = this.buildingInspection) === null || _l === void 0 ? void 0 : _l.memo}</div> `}
78
+ </td>
79
+ </tr>
80
+ </table>
81
+ </div>
82
+
83
+ <div class="attachment-section">
84
+ <div class="attachment-title">
85
+ <md-icon class="attachment-icon">attach_file</md-icon>
86
+ 첨부자료
87
+ </div>
88
+ <div class="attachment-list">
89
+ <div
90
+ class="attachment-item ${this.mode === InspectionMode.EDIT ? 'disabled' : ''}"
91
+ @click=${this.mode === InspectionMode.VIEW ? this._onChecklistClick : null}
92
+ >
93
+ <md-icon class="attachment-icon">assignment</md-icon>
94
+ 시공자 검측 체크리스트
95
+ </div>
96
+ <div class="attachment-item" @click=${this._onPhotoAlbumClick}>
97
+ <md-icon class="attachment-icon">photo_library</md-icon>
98
+ 사진대지
99
+ </div>
100
+ <div class="attachment-item" @click=${this._onParticipantListClick}>
101
+ <md-icon class="attachment-icon">people</md-icon>
102
+ 공사 참여자 실명부
103
+ </div>
104
+ </div>
105
+ </div>
106
+
107
+ <div class="signature-section">
108
+ <div class="signature-box">
109
+ <div class="signature-title">공종별 시공 관리자</div>
110
+ <div class="signature-name">${((_o = (_m = this.checklist) === null || _m === void 0 ? void 0 : _m.taskConstructor) === null || _o === void 0 ? void 0 : _o.name) || ''}</div>
111
+ <div class="signature-container">
112
+ <img class="signature-image" src="${((_p = this.checklist) === null || _p === void 0 ? void 0 : _p.taskConstructorSignature) || ''}" alt="서명" />
113
+ </div>
114
+ </div>
115
+ <div class="signature-box">
116
+ <div class="signature-title">총괄 시공 책임자</div>
117
+ <div class="signature-name">${((_r = (_q = this.checklist) === null || _q === void 0 ? void 0 : _q.overallConstructor) === null || _r === void 0 ? void 0 : _r.name) || ''}</div>
118
+ <div class="signature-container">
119
+ <img class="signature-image" src="${((_s = this.checklist) === null || _s === void 0 ? void 0 : _s.overallConstructorSignature) || ''}" alt="서명" />
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+ <div class="button-container">
125
+ <md-elevated-button @click=${this._onConfirm}> 확인 </md-elevated-button>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ `;
130
+ }
131
+ _formatDate(date) {
132
+ return `${date.getFullYear()}. ${String(date.getMonth() + 1).padStart(2, '0')}. ${String(date.getDate()).padStart(2, '0')}.`;
133
+ }
134
+ _onInspectionMemoChange(e) {
135
+ const target = e.target;
136
+ this.buildingInspection = Object.assign(Object.assign({}, this.buildingInspection), { memo: target.value });
137
+ // 부모 컴포넌트에 변경사항 전달
138
+ this.dispatchEvent(new CustomEvent('inspection-memo-change', {
139
+ detail: { memo: target.value },
140
+ bubbles: true
141
+ }));
142
+ }
143
+ // 체크리스트 팝업 열기
144
+ _onChecklistClick() {
145
+ // TODO: 체크리스트 팝업 구현
146
+ console.log('체크리스트 클릭');
147
+ }
148
+ // 사진대지 팝업 열기
149
+ _onPhotoAlbumClick() {
150
+ var _a;
151
+ openPopup(html ` <photo-album-popup .checklistId=${((_a = this.checklist) === null || _a === void 0 ? void 0 : _a.id) || ''}></photo-album-popup> `, {
152
+ backdrop: true,
153
+ size: 'large',
154
+ title: '사진대지'
155
+ });
156
+ }
157
+ // 참여자 실명부 팝업 열기
158
+ _onParticipantListClick() {
159
+ // TODO: 참여자 실명부 팝업 구현
160
+ console.log('참여자 실명부 클릭');
161
+ }
162
+ // 확인 버튼
163
+ _onConfirm() {
164
+ this.dispatchEvent(new CustomEvent('popup-close', { bubbles: true }));
165
+ history.back();
166
+ }
167
+ };
168
+ InspectionRequestDocument.styles = [
169
+ ScrollbarStyles,
170
+ css `
171
+ :host {
172
+ display: block;
173
+ padding: 20px;
174
+ font-family: 'Noto Sans KR', sans-serif;
175
+ line-height: 1.4;
176
+ overflow-y: auto;
177
+ }
178
+
179
+ .document-container {
180
+ max-width: 800px;
181
+ margin: 0 auto;
182
+ background: white;
183
+ border: 2px solid #333;
184
+ }
185
+
186
+ .document-header {
187
+ text-align: center;
188
+ padding: 15px;
189
+ border-bottom: 1px solid #333;
190
+ }
191
+
192
+ .document-title {
193
+ font-size: 18px;
194
+ font-weight: bold;
195
+ margin-bottom: 10px;
196
+ }
197
+
198
+ .document-main-title {
199
+ font-size: 20px;
200
+ font-weight: bold;
201
+ text-align: center;
202
+ margin-bottom: 20px;
203
+ background-color: var(--md-sys-color-primary);
204
+ color: white;
205
+ padding: 10px;
206
+ }
207
+
208
+ .document-body {
209
+ padding: 20px;
210
+ }
211
+
212
+ .request-info {
213
+ margin-bottom: 20px;
214
+ }
215
+
216
+ .request-table {
217
+ width: 100%;
218
+ border-collapse: collapse;
219
+ margin-bottom: 20px;
220
+ }
221
+
222
+ .request-table th,
223
+ .request-table td {
224
+ border: 1px solid #333;
225
+ padding: 8px;
226
+ text-align: left;
227
+ }
228
+
229
+ .request-table th {
230
+ background-color: #f5f5f5;
231
+ font-weight: bold;
232
+ width: 120px;
233
+ }
234
+
235
+ .inspection-items {
236
+ margin: 20px 0;
237
+ }
238
+
239
+ .inspection-items textarea {
240
+ width: 100%;
241
+ min-height: 100px;
242
+ border: 1px solid #ddd;
243
+ padding: 10px;
244
+ font-family: inherit;
245
+ resize: vertical;
246
+ }
247
+
248
+ .signature-section {
249
+ display: flex;
250
+ justify-content: space-around;
251
+ margin-top: 30px;
252
+ padding: 20px;
253
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
254
+ border-radius: 10px;
255
+ border: 2px solid #e1e8ed;
256
+ }
257
+
258
+ .signature-box {
259
+ text-align: center;
260
+ width: 220px;
261
+ background: white;
262
+ border-radius: 8px;
263
+ padding: 20px;
264
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
265
+ border: 1px solid #d1d9e6;
266
+ }
267
+
268
+ .signature-title {
269
+ font-weight: bold;
270
+ margin-bottom: 15px;
271
+ color: #2c3e50;
272
+ font-size: 16px;
273
+ border-bottom: 2px solid #3498db;
274
+ padding-bottom: 5px;
275
+ }
276
+
277
+ .signature-name {
278
+ font-weight: bold;
279
+ margin-bottom: 15px;
280
+ color: #34495e;
281
+ font-size: 14px;
282
+ background-color: #ecf0f1;
283
+ padding: 8px;
284
+ border-radius: 5px;
285
+ }
286
+
287
+ .signature-container {
288
+ position: relative;
289
+ border: 2px solid #333;
290
+ border-radius: 8px;
291
+ padding: 10px;
292
+ margin-bottom: 10px;
293
+ min-height: 80px;
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: center;
297
+ }
298
+
299
+ .signature-image {
300
+ max-width: 140px;
301
+ max-height: 60px;
302
+ width: auto;
303
+ height: auto;
304
+ }
305
+
306
+ .attachment-section {
307
+ margin-top: 30px;
308
+ padding: 20px;
309
+ background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
310
+ border: 1px solid #dee2e6;
311
+ border-radius: 8px;
312
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
313
+ }
314
+
315
+ .attachment-title {
316
+ font-weight: bold;
317
+ font-size: 16px;
318
+ color: #495057;
319
+ margin-bottom: 15px;
320
+ display: flex;
321
+ align-items: center;
322
+ gap: 8px;
323
+ }
324
+
325
+ .attachment-list {
326
+ display: flex;
327
+ flex-direction: column;
328
+ gap: 12px;
329
+ }
330
+
331
+ .attachment-item {
332
+ display: inline-flex;
333
+ align-items: center;
334
+ gap: 8px;
335
+ padding: 12px 16px;
336
+ background-color: white;
337
+ border: 1px solid #dee2e6;
338
+ border-radius: 6px;
339
+ cursor: pointer;
340
+ color: #495057;
341
+ text-decoration: none;
342
+ transition: all 0.2s ease;
343
+ font-weight: 500;
344
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
345
+ }
346
+
347
+ .attachment-item:hover {
348
+ background-color: #e3f2fd;
349
+ border-color: #2196f3;
350
+ color: #1976d2;
351
+ transform: translateY(-1px);
352
+ box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);
353
+ }
354
+
355
+ .attachment-item:active {
356
+ transform: translateY(0);
357
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
358
+ }
359
+
360
+ .attachment-item.disabled {
361
+ cursor: not-allowed;
362
+ background-color: #f8f9fa;
363
+ color: #6c757d;
364
+ border-color: #e9ecef;
365
+ }
366
+
367
+ .attachment-item.disabled:hover {
368
+ background-color: #f8f9fa;
369
+ border-color: #e9ecef;
370
+ color: #6c757d;
371
+ transform: none;
372
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
373
+ }
374
+
375
+ .attachment-icon {
376
+ --md-icon-size: 18px;
377
+ color: #6c757d;
378
+ }
379
+
380
+ .attachment-item:hover .attachment-icon {
381
+ color: #1976d2;
382
+ }
383
+
384
+ .attachment-item.disabled .attachment-icon {
385
+ color: #adb5bd;
386
+ }
387
+
388
+ .date-section {
389
+ text-align: right;
390
+ margin-bottom: 20px;
391
+ font-size: 14px;
392
+ }
393
+
394
+ .form-row {
395
+ display: flex;
396
+ align-items: flex-start;
397
+ margin-bottom: 10px;
398
+ }
399
+
400
+ .form-label {
401
+ font-weight: bold;
402
+ width: 100px;
403
+ margin-right: 10px;
404
+ }
405
+
406
+ .recipient-section {
407
+ margin-bottom: 30px;
408
+ }
409
+
410
+ .recipient-item {
411
+ display: flex;
412
+ margin-bottom: 5px;
413
+ }
414
+
415
+ .recipient-label {
416
+ font-weight: bold;
417
+ margin-right: 18px;
418
+ }
419
+
420
+ .inspection-memo-input {
421
+ width: 100%;
422
+ max-width: -webkit-fill-available;
423
+ height: 40px;
424
+ border: 1px solid #ddd;
425
+ padding: 10px;
426
+ font-size: 15px;
427
+ border-radius: 5px;
428
+ }
429
+
430
+ .inspection-memo-text {
431
+ padding: 10px;
432
+ font-size: 15px;
433
+ color: #495057;
434
+ border: 1px solid #e9ecef;
435
+ border-radius: 5px;
436
+ min-height: 20px;
437
+ }
438
+
439
+ .button-container {
440
+ display: flex;
441
+ justify-content: center;
442
+ margin-top: 20px;
443
+ padding: 15px 0;
444
+ border-top: 1px solid #ddd;
445
+ }
446
+
447
+ .button-container md-elevated-button {
448
+ background-color: #3498db;
449
+ color: white;
450
+ padding: 12px 30px;
451
+ font-size: 16px;
452
+ font-weight: bold;
453
+ border-radius: 8px;
454
+ }
455
+ `
456
+ ];
457
+ __decorate([
458
+ property({ type: Object }),
459
+ __metadata("design:type", Object)
460
+ ], InspectionRequestDocument.prototype, "checklist", void 0);
461
+ __decorate([
462
+ property({ type: Object }),
463
+ __metadata("design:type", Object)
464
+ ], InspectionRequestDocument.prototype, "buildingInspection", void 0);
465
+ __decorate([
466
+ property({ type: String }),
467
+ __metadata("design:type", String)
468
+ ], InspectionRequestDocument.prototype, "mode", void 0);
469
+ InspectionRequestDocument = __decorate([
470
+ customElement('inspection-request-document')
471
+ ], InspectionRequestDocument);
472
+ export { InspectionRequestDocument };
473
+ //# sourceMappingURL=inspection-request-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspection-request-document.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/inspection-document/inspection-request-document.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/elevated-button.js'\nimport '@material/web/icon/icon.js'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { openPopup } from '@operato/layout'\nimport './photo-album-popup'\n\nexport enum InspectionMode {\n EDIT = 'EDIT',\n VIEW = 'VIEW'\n}\n\n@customElement('inspection-request-document')\nexport class InspectionRequestDocument extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: block;\n padding: 20px;\n font-family: 'Noto Sans KR', sans-serif;\n line-height: 1.4;\n overflow-y: auto;\n }\n\n .document-container {\n max-width: 800px;\n margin: 0 auto;\n background: white;\n border: 2px solid #333;\n }\n\n .document-header {\n text-align: center;\n padding: 15px;\n border-bottom: 1px solid #333;\n }\n\n .document-title {\n font-size: 18px;\n font-weight: bold;\n margin-bottom: 10px;\n }\n\n .document-main-title {\n font-size: 20px;\n font-weight: bold;\n text-align: center;\n margin-bottom: 20px;\n background-color: var(--md-sys-color-primary);\n color: white;\n padding: 10px;\n }\n\n .document-body {\n padding: 20px;\n }\n\n .request-info {\n margin-bottom: 20px;\n }\n\n .request-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n }\n\n .request-table th,\n .request-table td {\n border: 1px solid #333;\n padding: 8px;\n text-align: left;\n }\n\n .request-table th {\n background-color: #f5f5f5;\n font-weight: bold;\n width: 120px;\n }\n\n .inspection-items {\n margin: 20px 0;\n }\n\n .inspection-items textarea {\n width: 100%;\n min-height: 100px;\n border: 1px solid #ddd;\n padding: 10px;\n font-family: inherit;\n resize: vertical;\n }\n\n .signature-section {\n display: flex;\n justify-content: space-around;\n margin-top: 30px;\n padding: 20px;\n background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n border-radius: 10px;\n border: 2px solid #e1e8ed;\n }\n\n .signature-box {\n text-align: center;\n width: 220px;\n background: white;\n border-radius: 8px;\n padding: 20px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n border: 1px solid #d1d9e6;\n }\n\n .signature-title {\n font-weight: bold;\n margin-bottom: 15px;\n color: #2c3e50;\n font-size: 16px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 5px;\n }\n\n .signature-name {\n font-weight: bold;\n margin-bottom: 15px;\n color: #34495e;\n font-size: 14px;\n background-color: #ecf0f1;\n padding: 8px;\n border-radius: 5px;\n }\n\n .signature-container {\n position: relative;\n border: 2px solid #333;\n border-radius: 8px;\n padding: 10px;\n margin-bottom: 10px;\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .signature-image {\n max-width: 140px;\n max-height: 60px;\n width: auto;\n height: auto;\n }\n\n .attachment-section {\n margin-top: 30px;\n padding: 20px;\n background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n border: 1px solid #dee2e6;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n\n .attachment-title {\n font-weight: bold;\n font-size: 16px;\n color: #495057;\n margin-bottom: 15px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .attachment-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .attachment-item {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background-color: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n cursor: pointer;\n color: #495057;\n text-decoration: none;\n transition: all 0.2s ease;\n font-weight: 500;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .attachment-item:hover {\n background-color: #e3f2fd;\n border-color: #2196f3;\n color: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n }\n\n .attachment-item:active {\n transform: translateY(0);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .attachment-item.disabled {\n cursor: not-allowed;\n background-color: #f8f9fa;\n color: #6c757d;\n border-color: #e9ecef;\n }\n\n .attachment-item.disabled:hover {\n background-color: #f8f9fa;\n border-color: #e9ecef;\n color: #6c757d;\n transform: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .attachment-icon {\n --md-icon-size: 18px;\n color: #6c757d;\n }\n\n .attachment-item:hover .attachment-icon {\n color: #1976d2;\n }\n\n .attachment-item.disabled .attachment-icon {\n color: #adb5bd;\n }\n\n .date-section {\n text-align: right;\n margin-bottom: 20px;\n font-size: 14px;\n }\n\n .form-row {\n display: flex;\n align-items: flex-start;\n margin-bottom: 10px;\n }\n\n .form-label {\n font-weight: bold;\n width: 100px;\n margin-right: 10px;\n }\n\n .recipient-section {\n margin-bottom: 30px;\n }\n\n .recipient-item {\n display: flex;\n margin-bottom: 5px;\n }\n\n .recipient-label {\n font-weight: bold;\n margin-right: 18px;\n }\n\n .inspection-memo-input {\n width: 100%;\n max-width: -webkit-fill-available;\n height: 40px;\n border: 1px solid #ddd;\n padding: 10px;\n font-size: 15px;\n border-radius: 5px;\n }\n\n .inspection-memo-text {\n padding: 10px;\n font-size: 15px;\n color: #495057;\n border: 1px solid #e9ecef;\n border-radius: 5px;\n min-height: 20px;\n }\n\n .button-container {\n display: flex;\n justify-content: center;\n margin-top: 20px;\n padding: 15px 0;\n border-top: 1px solid #ddd;\n }\n\n .button-container md-elevated-button {\n background-color: #3498db;\n color: white;\n padding: 12px 30px;\n font-size: 16px;\n font-weight: bold;\n border-radius: 8px;\n }\n `\n ]\n\n @property({ type: Object }) checklist: any = {}\n @property({ type: Object }) buildingInspection: any = {}\n @property({ type: String }) mode: InspectionMode = InspectionMode.VIEW\n\n render() {\n const today = this._formatDate(new Date())\n const requestDate = this._formatDate(new Date(this.buildingInspection.requestDate))\n\n return html`\n <div class=\"document-main-title\">검측요청결과 통보내용</div>\n\n <div class=\"document-container\">\n <div class=\"document-header\">\n <div class=\"document-title\">검측요청서</div>\n </div>\n\n <div class=\"document-body\">\n <div class=\"date-section\">${today}</div>\n\n <div class=\"request-info\">\n <div class=\"recipient-section\">\n <div class=\"recipient-item\">\n <span class=\"recipient-label\">번호:</span>\n <span>${this.checklist?.documentNo || ''}</span>\n </div>\n <div class=\"recipient-item\">\n <span class=\"recipient-label\">받음:</span>\n <span>${this.buildingInspection?.buildingLevel?.building?.buildingComplex?.supervisoryCompany}</span>\n </div>\n </div>\n\n <div style=\"margin: 15px 0;\">다음과 같은 세부공종에 대하여 검측요청 하오니 검사 후 승인하여 주시 기 바랍니다.</div>\n\n <table class=\"request-table\">\n <tr>\n <th>위치 및 공종</th>\n <td>${(this.checklist?.location || '') + ' - ' + (this.checklist?.constructionType || '')}</td>\n </tr>\n <tr>\n <th>검측 부위</th>\n <td>${this.checklist?.inspectionParts?.join(', ') || ''}</td>\n </tr>\n <tr>\n <th>검측 요구일시</th>\n <td>${requestDate}</td>\n </tr>\n <tr>\n <th>검측 사항</th>\n <td>\n ${this.mode === InspectionMode.EDIT\n ? html`\n <input\n type=\"text\"\n name=\"memo\"\n class=\"inspection-memo-input\"\n .value=${this.buildingInspection?.memo || ''}\n @input=${this._onInspectionMemoChange}\n placeholder=\"검측사항을 입력하세요.\"\n />\n `\n : html` <div class=\"inspection-memo-text\">${this.buildingInspection?.memo}</div> `}\n </td>\n </tr>\n </table>\n </div>\n\n <div class=\"attachment-section\">\n <div class=\"attachment-title\">\n <md-icon class=\"attachment-icon\">attach_file</md-icon>\n 첨부자료\n </div>\n <div class=\"attachment-list\">\n <div\n class=\"attachment-item ${this.mode === InspectionMode.EDIT ? 'disabled' : ''}\"\n @click=${this.mode === InspectionMode.VIEW ? this._onChecklistClick : null}\n >\n <md-icon class=\"attachment-icon\">assignment</md-icon>\n 시공자 검측 체크리스트\n </div>\n <div class=\"attachment-item\" @click=${this._onPhotoAlbumClick}>\n <md-icon class=\"attachment-icon\">photo_library</md-icon>\n 사진대지\n </div>\n <div class=\"attachment-item\" @click=${this._onParticipantListClick}>\n <md-icon class=\"attachment-icon\">people</md-icon>\n 공사 참여자 실명부\n </div>\n </div>\n </div>\n\n <div class=\"signature-section\">\n <div class=\"signature-box\">\n <div class=\"signature-title\">공종별 시공 관리자</div>\n <div class=\"signature-name\">${this.checklist?.taskConstructor?.name || ''}</div>\n <div class=\"signature-container\">\n <img class=\"signature-image\" src=\"${this.checklist?.taskConstructorSignature || ''}\" alt=\"서명\" />\n </div>\n </div>\n <div class=\"signature-box\">\n <div class=\"signature-title\">총괄 시공 책임자</div>\n <div class=\"signature-name\">${this.checklist?.overallConstructor?.name || ''}</div>\n <div class=\"signature-container\">\n <img class=\"signature-image\" src=\"${this.checklist?.overallConstructorSignature || ''}\" alt=\"서명\" />\n </div>\n </div>\n </div>\n\n <div class=\"button-container\">\n <md-elevated-button @click=${this._onConfirm}> 확인 </md-elevated-button>\n </div>\n </div>\n </div>\n `\n }\n\n private _formatDate(date: Date): string {\n return `${date.getFullYear()}. ${String(date.getMonth() + 1).padStart(2, '0')}. ${String(date.getDate()).padStart(2, '0')}.`\n }\n\n private _onInspectionMemoChange(e: Event) {\n const target = e.target as HTMLInputElement\n this.buildingInspection = { ...this.buildingInspection, memo: target.value }\n\n // 부모 컴포넌트에 변경사항 전달\n this.dispatchEvent(\n new CustomEvent('inspection-memo-change', {\n detail: { memo: target.value },\n bubbles: true\n })\n )\n }\n\n // 체크리스트 팝업 열기\n private _onChecklistClick() {\n // TODO: 체크리스트 팝업 구현\n console.log('체크리스트 클릭')\n }\n\n // 사진대지 팝업 열기\n private _onPhotoAlbumClick() {\n openPopup(html` <photo-album-popup .checklistId=${this.checklist?.id || ''}></photo-album-popup> `, {\n backdrop: true,\n size: 'large',\n title: '사진대지'\n })\n }\n\n // 참여자 실명부 팝업 열기\n private _onParticipantListClick() {\n // TODO: 참여자 실명부 팝업 구현\n console.log('참여자 실명부 클릭')\n }\n\n // 확인 버튼\n private _onConfirm() {\n this.dispatchEvent(new CustomEvent('popup-close', { bubbles: true }))\n history.back()\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import '@material/web/button/elevated-button.js';
2
+ import '@material/web/icon/icon.js';
3
+ import '@material/web/tabs/tabs.js';
4
+ import '@material/web/tabs/primary-tab.js';
5
+ import { LitElement } from 'lit';
6
+ import '../image-preview-popup';
7
+ export declare enum PhotoTab {
8
+ CONSTRUCTOR = "constructor",
9
+ SUPERVISOR = "supervisor"
10
+ }
11
+ export declare class PhotoAlbumPopup extends LitElement {
12
+ static styles: import("lit").CSSResult[];
13
+ checklistId: string;
14
+ activeTab: PhotoTab;
15
+ constructorFiles: any[];
16
+ supervisorFiles: any[];
17
+ render(): import("lit-html").TemplateResult<1>;
18
+ firstUpdated(): Promise<void>;
19
+ private _loadPhotos;
20
+ private _isImageFile;
21
+ private _getFileExtension;
22
+ private _setActiveTab;
23
+ private _openFilePreview;
24
+ private _onImageError;
25
+ private _formatDate;
26
+ private _close;
27
+ }