@dssp/supervision 1.0.0-alpha.77 → 1.0.0-alpha.78
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.
- package/dist-client/pages/building-inspection/building-inspection-management.d.ts +1 -0
- package/dist-client/pages/building-inspection/building-inspection-management.js +6 -2
- package/dist-client/pages/building-inspection/building-inspection-management.js.map +1 -1
- package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.d.ts +3 -0
- package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js +104 -31
- package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js.map +1 -1
- package/dist-client/pages/building-inspection/component/field-document/field-document-popup.d.ts +5 -4
- package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js +89 -65
- package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/building-inspection/building-inspection-mutation.js +30 -0
- package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
- package/dist-server/service/building-inspection/index.d.ts +1 -1
- package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.js +10 -0
- package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.js.map +1 -1
- package/dist-server/service/field-document/field-document-query.d.ts +1 -0
- package/dist-server/service/field-document/field-document-query.js +14 -1
- package/dist-server/service/field-document/field-document-query.js.map +1 -1
- package/dist-server/service/field-document/field-document-type.d.ts +2 -1
- package/dist-server/service/field-document/field-document-type.js +2 -1
- package/dist-server/service/field-document/field-document-type.js.map +1 -1
- package/dist-server/service/field-document/field-document.d.ts +1 -0
- package/dist-server/service/field-document/field-document.js +4 -0
- package/dist-server/service/field-document/field-document.js.map +1 -1
- package/dist-server/service/index.d.ts +2 -1
- package/dist-server/service/index.js +4 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import '@material/web/icon/icon.js';
|
|
3
|
+
import '../../component/image-preview-popup';
|
|
3
4
|
import { ScrollbarStyles } from '@operato/styles';
|
|
4
5
|
import { css, html, LitElement } from 'lit';
|
|
5
6
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
7
|
+
import { openPopup } from '@operato/layout';
|
|
6
8
|
let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
7
9
|
constructor() {
|
|
8
10
|
super(...arguments);
|
|
@@ -24,6 +26,7 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
24
26
|
${this.code
|
|
25
27
|
? html `
|
|
26
28
|
<div table-header>
|
|
29
|
+
<div></div>
|
|
27
30
|
<div>
|
|
28
31
|
<input
|
|
29
32
|
type="checkbox"
|
|
@@ -36,6 +39,7 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
36
39
|
<div>등록부서</div>
|
|
37
40
|
<div>등록자</div>
|
|
38
41
|
<div>자료분류</div>
|
|
42
|
+
<div>기술분야</div>
|
|
39
43
|
<div>등록일자</div>
|
|
40
44
|
</div>
|
|
41
45
|
|
|
@@ -49,15 +53,24 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
49
53
|
|
|
50
54
|
${this.documents.length > 0
|
|
51
55
|
? this.documents.map((doc, idx) => {
|
|
52
|
-
var _a;
|
|
56
|
+
var _a, _b;
|
|
53
57
|
return html `
|
|
54
58
|
<div
|
|
55
59
|
doc-item
|
|
56
60
|
draggable="true"
|
|
57
|
-
?selected=${this.
|
|
61
|
+
?selected=${((_a = this.selectedDoc) === null || _a === void 0 ? void 0 : _a.id) === doc.id}
|
|
58
62
|
@dragstart=${(e) => this._onDocDragStart(e, doc)}
|
|
59
63
|
@click=${() => this._selectDoc(doc)}
|
|
60
64
|
>
|
|
65
|
+
<div>
|
|
66
|
+
<md-icon
|
|
67
|
+
preview
|
|
68
|
+
@click=${(e) => {
|
|
69
|
+
e.stopPropagation();
|
|
70
|
+
this._openPreview(doc);
|
|
71
|
+
}}
|
|
72
|
+
>visibility</md-icon>
|
|
73
|
+
</div>
|
|
61
74
|
<div>
|
|
62
75
|
<input
|
|
63
76
|
type="checkbox"
|
|
@@ -72,7 +85,8 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
72
85
|
<span>${doc.name}</span>
|
|
73
86
|
</div>
|
|
74
87
|
<div></div>
|
|
75
|
-
<div>${((
|
|
88
|
+
<div>${((_b = doc.creator) === null || _b === void 0 ? void 0 : _b.name) || ''}</div>
|
|
89
|
+
<div></div>
|
|
76
90
|
<div></div>
|
|
77
91
|
<div>${this._formatDate(doc.createdAt)}</div>
|
|
78
92
|
</div>
|
|
@@ -95,7 +109,8 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
95
109
|
<div detail-info>
|
|
96
110
|
<div file-name>${this.selectedDoc.name}</div>
|
|
97
111
|
<div file-meta>
|
|
98
|
-
|
|
112
|
+
<div>수정한 날짜: ${this._formatDateTime(this.selectedDoc.createdAt)}</div>
|
|
113
|
+
${this.selectedDoc.fileSize ? html `<div>크기: ${this._formatFileSize(this.selectedDoc.fileSize)}</div>` : ''}
|
|
99
114
|
</div>
|
|
100
115
|
${this.selectedDoc.aiSummary
|
|
101
116
|
? html `
|
|
@@ -109,8 +124,8 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
109
124
|
`
|
|
110
125
|
: this.selectedDoc.aiSummaryStatus === '10'
|
|
111
126
|
? html `
|
|
112
|
-
<div ai-
|
|
113
|
-
<md-icon
|
|
127
|
+
<div ai-pending>
|
|
128
|
+
<md-icon>hourglass_top</md-icon>
|
|
114
129
|
AI 요약 생성 중...
|
|
115
130
|
</div>
|
|
116
131
|
`
|
|
@@ -131,7 +146,23 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
131
146
|
}
|
|
132
147
|
_selectDoc(doc) {
|
|
133
148
|
this.selectedDoc = doc;
|
|
134
|
-
|
|
149
|
+
}
|
|
150
|
+
_openPreview(doc) {
|
|
151
|
+
this.selectedDoc = doc;
|
|
152
|
+
if (!doc.fullpath)
|
|
153
|
+
return;
|
|
154
|
+
const ext = doc.fullpath.toLowerCase().split('.').pop() || '';
|
|
155
|
+
const isImage = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext);
|
|
156
|
+
if (isImage) {
|
|
157
|
+
openPopup(html `<image-preview-popup
|
|
158
|
+
.images=${[{ fullpath: doc.fullpath, name: doc.name }]}
|
|
159
|
+
.currentIndex=${0}
|
|
160
|
+
></image-preview-popup>`, { backdrop: true, size: 'large', title: doc.name });
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// PDF 등 기타 파일은 새 탭에서 열기
|
|
164
|
+
window.open(doc.fullpath, '_blank');
|
|
165
|
+
}
|
|
135
166
|
}
|
|
136
167
|
_toggleDoc(e, id) {
|
|
137
168
|
const checked = e.target.checked;
|
|
@@ -199,6 +230,16 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
199
230
|
return '';
|
|
200
231
|
}
|
|
201
232
|
}
|
|
233
|
+
_formatFileSize(size) {
|
|
234
|
+
const bytes = Number(size);
|
|
235
|
+
if (isNaN(bytes))
|
|
236
|
+
return size;
|
|
237
|
+
if (bytes < 1024)
|
|
238
|
+
return `${bytes} B`;
|
|
239
|
+
if (bytes < 1024 * 1024)
|
|
240
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
241
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
242
|
+
}
|
|
202
243
|
_formatDateTime(date) {
|
|
203
244
|
if (!date)
|
|
204
245
|
return '';
|
|
@@ -250,7 +291,7 @@ FieldDocumentListPanel.styles = [
|
|
|
250
291
|
|
|
251
292
|
div[table-header] {
|
|
252
293
|
display: grid;
|
|
253
|
-
grid-template-columns: 40px 80px 1fr
|
|
294
|
+
grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;
|
|
254
295
|
padding: 8px 16px;
|
|
255
296
|
background: #f0e6e6;
|
|
256
297
|
font-size: 12px;
|
|
@@ -268,12 +309,13 @@ FieldDocumentListPanel.styles = [
|
|
|
268
309
|
div[doc-list] {
|
|
269
310
|
flex: 1;
|
|
270
311
|
overflow-y: auto;
|
|
312
|
+
overflow-x: hidden;
|
|
271
313
|
position: relative;
|
|
272
314
|
}
|
|
273
315
|
|
|
274
316
|
div[doc-item] {
|
|
275
317
|
display: grid;
|
|
276
|
-
grid-template-columns: 40px 80px 1fr
|
|
318
|
+
grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;
|
|
277
319
|
padding: 8px 16px;
|
|
278
320
|
border-bottom: 1px solid #f0f0f0;
|
|
279
321
|
font-size: 13px;
|
|
@@ -294,6 +336,19 @@ FieldDocumentListPanel.styles = [
|
|
|
294
336
|
white-space: nowrap;
|
|
295
337
|
}
|
|
296
338
|
|
|
339
|
+
md-icon[preview] {
|
|
340
|
+
--md-icon-size: 18px;
|
|
341
|
+
cursor: pointer;
|
|
342
|
+
color: #999;
|
|
343
|
+
border-radius: 50%;
|
|
344
|
+
padding: 2px;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
md-icon[preview]:hover {
|
|
348
|
+
color: #0595e5;
|
|
349
|
+
background: #e3f2fd;
|
|
350
|
+
}
|
|
351
|
+
|
|
297
352
|
div[name-cell] {
|
|
298
353
|
justify-content: flex-start;
|
|
299
354
|
gap: 6px;
|
|
@@ -301,6 +356,7 @@ FieldDocumentListPanel.styles = [
|
|
|
301
356
|
md-icon[favorite] {
|
|
302
357
|
--md-icon-size: 16px;
|
|
303
358
|
color: #ffc107;
|
|
359
|
+
flex-shrink: 0;
|
|
304
360
|
}
|
|
305
361
|
|
|
306
362
|
span {
|
|
@@ -309,6 +365,26 @@ FieldDocumentListPanel.styles = [
|
|
|
309
365
|
}
|
|
310
366
|
}
|
|
311
367
|
|
|
368
|
+
div[ai-cell] {
|
|
369
|
+
font-size: 11px;
|
|
370
|
+
|
|
371
|
+
span[ai-done] {
|
|
372
|
+
display: flex;
|
|
373
|
+
align-items: center;
|
|
374
|
+
gap: 2px;
|
|
375
|
+
color: #2e7d32;
|
|
376
|
+
|
|
377
|
+
md-icon {
|
|
378
|
+
--md-icon-size: 14px;
|
|
379
|
+
color: #4caf50;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
span[ai-pending] {
|
|
384
|
+
color: #ef6c00;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
312
388
|
input[type='checkbox'] {
|
|
313
389
|
cursor: pointer;
|
|
314
390
|
}
|
|
@@ -361,32 +437,11 @@ FieldDocumentListPanel.styles = [
|
|
|
361
437
|
}
|
|
362
438
|
}
|
|
363
439
|
|
|
364
|
-
div[ai-badge] {
|
|
365
|
-
display: inline-flex;
|
|
366
|
-
align-items: center;
|
|
367
|
-
gap: 3px;
|
|
368
|
-
font-size: 11px;
|
|
369
|
-
padding: 2px 6px;
|
|
370
|
-
border-radius: 4px;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
div[ai-badge][status='20'] {
|
|
374
|
-
background: #e8f5e9;
|
|
375
|
-
color: #2e7d32;
|
|
376
|
-
}
|
|
377
|
-
div[ai-badge][status='10'] {
|
|
378
|
-
background: #fff3e0;
|
|
379
|
-
color: #ef6c00;
|
|
380
|
-
}
|
|
381
|
-
div[ai-badge][status='30'] {
|
|
382
|
-
background: #fbe9e7;
|
|
383
|
-
color: #c62828;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
440
|
div[doc-detail] {
|
|
387
441
|
padding: 12px 16px;
|
|
388
442
|
background: #fafafa;
|
|
389
443
|
border-top: 1px solid #e0e0e0;
|
|
444
|
+
overflow-y: auto;
|
|
390
445
|
|
|
391
446
|
div[detail-content] {
|
|
392
447
|
display: flex;
|
|
@@ -399,6 +454,7 @@ FieldDocumentListPanel.styles = [
|
|
|
399
454
|
background: #e3f2fd;
|
|
400
455
|
padding: 8px;
|
|
401
456
|
border-radius: 8px;
|
|
457
|
+
flex-shrink: 0;
|
|
402
458
|
}
|
|
403
459
|
|
|
404
460
|
div[detail-info] {
|
|
@@ -432,8 +488,25 @@ FieldDocumentListPanel.styles = [
|
|
|
432
488
|
flex-shrink: 0;
|
|
433
489
|
}
|
|
434
490
|
}
|
|
491
|
+
|
|
492
|
+
div[ai-pending] {
|
|
493
|
+
display: flex;
|
|
494
|
+
align-items: center;
|
|
495
|
+
gap: 6px;
|
|
496
|
+
padding: 8px 12px;
|
|
497
|
+
background: #fff3e0;
|
|
498
|
+
border-radius: 6px;
|
|
499
|
+
font-size: 12px;
|
|
500
|
+
color: #ef6c00;
|
|
501
|
+
|
|
502
|
+
md-icon {
|
|
503
|
+
--md-icon-size: 18px;
|
|
504
|
+
flex-shrink: 0;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
435
507
|
}
|
|
436
508
|
}
|
|
509
|
+
|
|
437
510
|
}
|
|
438
511
|
`
|
|
439
512
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-document-list-panel.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/field-document/field-document-list-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { ScrollbarStyles } from '@operato/styles'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n@customElement('field-document-list-panel')\nexport class FieldDocumentListPanel extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n div[panel-header] {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n\n h3 {\n margin: 0;\n font-size: 14px;\n color: #333;\n flex: 1;\n }\n\n span[doc-count] {\n font-size: 12px;\n color: #999;\n }\n }\n\n div[table-header] {\n display: grid;\n grid-template-columns: 40px 80px 1fr 100px 80px 80px 100px;\n padding: 8px 16px;\n background: #f0e6e6;\n font-size: 12px;\n font-weight: bold;\n color: #666;\n border-bottom: 1px solid #ddd;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n div[doc-list] {\n flex: 1;\n overflow-y: auto;\n position: relative;\n }\n\n div[doc-item] {\n display: grid;\n grid-template-columns: 40px 80px 1fr 100px 80px 80px 100px;\n padding: 8px 16px;\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n cursor: pointer;\n transition: background-color 0.15s;\n align-items: center;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n div[name-cell] {\n justify-content: flex-start;\n gap: 6px;\n\n md-icon[favorite] {\n --md-icon-size: 16px;\n color: #ffc107;\n }\n\n span {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n input[type='checkbox'] {\n cursor: pointer;\n }\n }\n\n div[doc-item][selected] {\n background-color: #e3f2fd;\n }\n\n div[doc-item][draggable='true'] {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n div[drop-zone] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(33, 150, 243, 0.08);\n border: 3px dashed #1976d2;\n border-radius: 8px;\n z-index: 10;\n pointer-events: none;\n\n span {\n font-size: 16px;\n color: #1976d2;\n font-weight: bold;\n }\n }\n\n div[empty-state] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n flex: 1;\n\n md-icon {\n --md-icon-size: 48px;\n color: #ddd;\n margin-bottom: 12px;\n }\n }\n\n div[ai-badge] {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n div[ai-badge][status='20'] {\n background: #e8f5e9;\n color: #2e7d32;\n }\n div[ai-badge][status='10'] {\n background: #fff3e0;\n color: #ef6c00;\n }\n div[ai-badge][status='30'] {\n background: #fbe9e7;\n color: #c62828;\n }\n\n div[doc-detail] {\n padding: 12px 16px;\n background: #fafafa;\n border-top: 1px solid #e0e0e0;\n\n div[detail-content] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n\n md-icon[file-icon] {\n --md-icon-size: 36px;\n color: #0595e5;\n background: #e3f2fd;\n padding: 8px;\n border-radius: 8px;\n }\n\n div[detail-info] {\n flex: 1;\n\n div[file-name] {\n font-weight: bold;\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n div[file-meta] {\n font-size: 12px;\n color: #666;\n margin-bottom: 8px;\n }\n\n div[ai-summary] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 8px 12px;\n background: #e8f5e9;\n border-radius: 6px;\n font-size: 12px;\n color: #333;\n\n md-icon {\n --md-icon-size: 18px;\n color: #4caf50;\n flex-shrink: 0;\n }\n }\n }\n }\n }\n `\n ]\n\n @property({ type: String }) projectId: string = ''\n @property({ type: String }) code: string = ''\n @property({ type: String }) folderName: string = ''\n @property({ type: Array }) documents: any[] = []\n\n @state() private selectedIds: Set<string> = new Set()\n @state() private isDragOver: boolean = false\n @state() private selectedDoc: any = null\n\n render() {\n return html`\n <div panel-header>\n <h3>문서 목록${this.folderName ? ` - ${this.folderName}` : ''}</h3>\n <span doc-count>${this.documents.length}건</span>\n </div>\n\n ${this.code\n ? html`\n <div table-header>\n <div>\n <input\n type=\"checkbox\"\n @change=${this._toggleAll}\n .checked=${this.selectedIds.size > 0 && this.selectedIds.size === this.documents.length}\n />\n </div>\n <div>문서번호</div>\n <div style=\"justify-content:flex-start; padding-left:8px;\">제 목</div>\n <div>등록부서</div>\n <div>등록자</div>\n <div>자료분류</div>\n <div>등록일자</div>\n </div>\n\n <div\n doc-list\n @dragover=${this._onListDragOver}\n @dragleave=${this._onListDragLeave}\n @drop=${this._onListDrop}\n >\n ${this.isDragOver ? html`<div drop-zone><span>여기에 파일을 놓으세요</span></div>` : ''}\n\n ${this.documents.length > 0\n ? this.documents.map(\n (doc, idx) => html`\n <div\n doc-item\n draggable=\"true\"\n ?selected=${this.selectedIds.has(doc.id)}\n @dragstart=${(e: DragEvent) => this._onDocDragStart(e, doc)}\n @click=${() => this._selectDoc(doc)}\n >\n <div>\n <input\n type=\"checkbox\"\n .checked=${this.selectedIds.has(doc.id)}\n @change=${(e: Event) => this._toggleDoc(e, doc.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n </div>\n <div>${doc.code}${String(idx + 1).padStart(2, '0')}</div>\n <div name-cell>\n ${doc.isFavorite ? html`<md-icon favorite>star</md-icon>` : ''}\n <span>${doc.name}</span>\n </div>\n <div></div>\n <div>${doc.creator?.name || ''}</div>\n <div></div>\n <div>${this._formatDate(doc.createdAt)}</div>\n </div>\n `\n )\n : html`\n <div empty-state>\n <md-icon>folder_open</md-icon>\n <div>등록된 문서가 없습니다.</div>\n <div style=\"font-size:12px; margin-top:4px;\">파일을 드래그하여 업로드하세요.</div>\n </div>\n `}\n </div>\n\n ${this.selectedDoc\n ? html`\n <div doc-detail>\n <div detail-content>\n <md-icon file-icon>description</md-icon>\n <div detail-info>\n <div file-name>${this.selectedDoc.name}</div>\n <div file-meta>\n 수정한 날짜: ${this._formatDateTime(this.selectedDoc.createdAt)}\n </div>\n ${this.selectedDoc.aiSummary\n ? html`\n <div ai-summary>\n <md-icon>auto_awesome</md-icon>\n <div>\n <strong>AI 브리핑</strong><br />\n ${this.selectedDoc.aiSummary}\n </div>\n </div>\n `\n : this.selectedDoc.aiSummaryStatus === '10'\n ? html`\n <div ai-badge status=\"10\">\n <md-icon style=\"--md-icon-size:14px;\">hourglass_top</md-icon>\n AI 요약 생성 중...\n </div>\n `\n : ''}\n </div>\n </div>\n </div>\n `\n : ''}\n `\n : html`\n <div empty-state>\n <md-icon>folder</md-icon>\n <div>소분류 폴더를 선택해주세요.</div>\n </div>\n `}\n `\n }\n\n private _selectDoc(doc: any) {\n this.selectedDoc = doc\n this.dispatchEvent(new CustomEvent('open-detail', { detail: doc }))\n }\n\n private _toggleDoc(e: Event, id: string) {\n const checked = (e.target as HTMLInputElement).checked\n const newSet = new Set(this.selectedIds)\n if (checked) {\n newSet.add(id)\n } else {\n newSet.delete(id)\n }\n this.selectedIds = newSet\n this.dispatchEvent(new CustomEvent('document-selected', { detail: newSet }))\n }\n\n private _toggleAll(e: Event) {\n const checked = (e.target as HTMLInputElement).checked\n if (checked) {\n this.selectedIds = new Set(this.documents.map(d => d.id))\n } else {\n this.selectedIds = new Set()\n }\n this.dispatchEvent(new CustomEvent('document-selected', { detail: this.selectedIds }))\n }\n\n /* Drag & Drop: 데스크톱 파일 업로드 */\n private _onListDragOver(e: DragEvent) {\n const types = e.dataTransfer?.types || []\n if (types.includes('Files')) {\n e.preventDefault()\n this.isDragOver = true\n }\n }\n\n private _onListDragLeave() {\n this.isDragOver = false\n }\n\n private _onListDrop(e: DragEvent) {\n e.preventDefault()\n this.isDragOver = false\n\n const files = Array.from(e.dataTransfer?.files || [])\n if (files.length > 0) {\n this.dispatchEvent(new CustomEvent('documents-changed', { detail: { files } }))\n }\n }\n\n /* Drag: 문서 이동용 */\n private _onDocDragStart(e: DragEvent, doc: any) {\n const ids = this.selectedIds.has(doc.id) ? Array.from(this.selectedIds) : [doc.id]\n e.dataTransfer?.setData('application/x-field-document-ids', JSON.stringify(ids))\n e.dataTransfer!.effectAllowed = 'move'\n }\n\n private _formatDate(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(d)\n } catch {\n return ''\n }\n }\n\n private _formatDateTime(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n }).format(d)\n } catch {\n return ''\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"field-document-list-panel.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/field-document/field-document-list-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '../../component/image-preview-popup'\n\nimport { ScrollbarStyles } from '@operato/styles'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { openPopup } from '@operato/layout'\n\n@customElement('field-document-list-panel')\nexport class FieldDocumentListPanel extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n div[panel-header] {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n\n h3 {\n margin: 0;\n font-size: 14px;\n color: #333;\n flex: 1;\n }\n\n span[doc-count] {\n font-size: 12px;\n color: #999;\n }\n }\n\n div[table-header] {\n display: grid;\n grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;\n padding: 8px 16px;\n background: #f0e6e6;\n font-size: 12px;\n font-weight: bold;\n color: #666;\n border-bottom: 1px solid #ddd;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n div[doc-list] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n }\n\n div[doc-item] {\n display: grid;\n grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;\n padding: 8px 16px;\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n cursor: pointer;\n transition: background-color 0.15s;\n align-items: center;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n md-icon[preview] {\n --md-icon-size: 18px;\n cursor: pointer;\n color: #999;\n border-radius: 50%;\n padding: 2px;\n }\n\n md-icon[preview]:hover {\n color: #0595e5;\n background: #e3f2fd;\n }\n\n div[name-cell] {\n justify-content: flex-start;\n gap: 6px;\n\n md-icon[favorite] {\n --md-icon-size: 16px;\n color: #ffc107;\n flex-shrink: 0;\n }\n\n span {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n div[ai-cell] {\n font-size: 11px;\n\n span[ai-done] {\n display: flex;\n align-items: center;\n gap: 2px;\n color: #2e7d32;\n\n md-icon {\n --md-icon-size: 14px;\n color: #4caf50;\n }\n }\n\n span[ai-pending] {\n color: #ef6c00;\n }\n }\n\n input[type='checkbox'] {\n cursor: pointer;\n }\n }\n\n div[doc-item][selected] {\n background-color: #e3f2fd;\n }\n\n div[doc-item][draggable='true'] {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n div[drop-zone] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(33, 150, 243, 0.08);\n border: 3px dashed #1976d2;\n border-radius: 8px;\n z-index: 10;\n pointer-events: none;\n\n span {\n font-size: 16px;\n color: #1976d2;\n font-weight: bold;\n }\n }\n\n div[empty-state] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n flex: 1;\n\n md-icon {\n --md-icon-size: 48px;\n color: #ddd;\n margin-bottom: 12px;\n }\n }\n\n div[doc-detail] {\n padding: 12px 16px;\n background: #fafafa;\n border-top: 1px solid #e0e0e0;\n overflow-y: auto;\n\n div[detail-content] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n\n md-icon[file-icon] {\n --md-icon-size: 36px;\n color: #0595e5;\n background: #e3f2fd;\n padding: 8px;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n div[detail-info] {\n flex: 1;\n\n div[file-name] {\n font-weight: bold;\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n div[file-meta] {\n font-size: 12px;\n color: #666;\n margin-bottom: 8px;\n }\n\n div[ai-summary] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 8px 12px;\n background: #e8f5e9;\n border-radius: 6px;\n font-size: 12px;\n color: #333;\n\n md-icon {\n --md-icon-size: 18px;\n color: #4caf50;\n flex-shrink: 0;\n }\n }\n\n div[ai-pending] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: #fff3e0;\n border-radius: 6px;\n font-size: 12px;\n color: #ef6c00;\n\n md-icon {\n --md-icon-size: 18px;\n flex-shrink: 0;\n }\n }\n }\n }\n\n }\n `\n ]\n\n @property({ type: String }) projectId: string = ''\n @property({ type: String }) code: string = ''\n @property({ type: String }) folderName: string = ''\n @property({ type: Array }) documents: any[] = []\n\n @state() private selectedIds: Set<string> = new Set()\n @state() private isDragOver: boolean = false\n @state() private selectedDoc: any = null\n\n render() {\n return html`\n <div panel-header>\n <h3>문서 목록${this.folderName ? ` - ${this.folderName}` : ''}</h3>\n <span doc-count>${this.documents.length}건</span>\n </div>\n\n ${this.code\n ? html`\n <div table-header>\n <div></div>\n <div>\n <input\n type=\"checkbox\"\n @change=${this._toggleAll}\n .checked=${this.selectedIds.size > 0 && this.selectedIds.size === this.documents.length}\n />\n </div>\n <div>문서번호</div>\n <div style=\"justify-content:flex-start; padding-left:8px;\">제 목</div>\n <div>등록부서</div>\n <div>등록자</div>\n <div>자료분류</div>\n <div>기술분야</div>\n <div>등록일자</div>\n </div>\n\n <div\n doc-list\n @dragover=${this._onListDragOver}\n @dragleave=${this._onListDragLeave}\n @drop=${this._onListDrop}\n >\n ${this.isDragOver ? html`<div drop-zone><span>여기에 파일을 놓으세요</span></div>` : ''}\n\n ${this.documents.length > 0\n ? this.documents.map(\n (doc, idx) => html`\n <div\n doc-item\n draggable=\"true\"\n ?selected=${this.selectedDoc?.id === doc.id}\n @dragstart=${(e: DragEvent) => this._onDocDragStart(e, doc)}\n @click=${() => this._selectDoc(doc)}\n >\n <div>\n <md-icon\n preview\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openPreview(doc)\n }}\n >visibility</md-icon>\n </div>\n <div>\n <input\n type=\"checkbox\"\n .checked=${this.selectedIds.has(doc.id)}\n @change=${(e: Event) => this._toggleDoc(e, doc.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n </div>\n <div>${doc.code}${String(idx + 1).padStart(2, '0')}</div>\n <div name-cell>\n ${doc.isFavorite ? html`<md-icon favorite>star</md-icon>` : ''}\n <span>${doc.name}</span>\n </div>\n <div></div>\n <div>${doc.creator?.name || ''}</div>\n <div></div>\n <div></div>\n <div>${this._formatDate(doc.createdAt)}</div>\n </div>\n `\n )\n : html`\n <div empty-state>\n <md-icon>folder_open</md-icon>\n <div>등록된 문서가 없습니다.</div>\n <div style=\"font-size:12px; margin-top:4px;\">파일을 드래그하여 업로드하세요.</div>\n </div>\n `}\n </div>\n\n ${this.selectedDoc\n ? html`\n <div doc-detail>\n <div detail-content>\n <md-icon file-icon>description</md-icon>\n <div detail-info>\n <div file-name>${this.selectedDoc.name}</div>\n <div file-meta>\n <div>수정한 날짜: ${this._formatDateTime(this.selectedDoc.createdAt)}</div>\n ${this.selectedDoc.fileSize ? html`<div>크기: ${this._formatFileSize(this.selectedDoc.fileSize)}</div>` : ''}\n </div>\n ${this.selectedDoc.aiSummary\n ? html`\n <div ai-summary>\n <md-icon>auto_awesome</md-icon>\n <div>\n <strong>AI 브리핑</strong><br />\n ${this.selectedDoc.aiSummary}\n </div>\n </div>\n `\n : this.selectedDoc.aiSummaryStatus === '10'\n ? html`\n <div ai-pending>\n <md-icon>hourglass_top</md-icon>\n AI 요약 생성 중...\n </div>\n `\n : ''}\n </div>\n </div>\n </div>\n `\n : ''}\n `\n : html`\n <div empty-state>\n <md-icon>folder</md-icon>\n <div>소분류 폴더를 선택해주세요.</div>\n </div>\n `}\n `\n }\n\n private _selectDoc(doc: any) {\n this.selectedDoc = doc\n }\n\n private _openPreview(doc: any) {\n this.selectedDoc = doc\n\n if (!doc.fullpath) return\n\n const ext = doc.fullpath.toLowerCase().split('.').pop() || ''\n const isImage = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext)\n\n if (isImage) {\n openPopup(\n html`<image-preview-popup\n .images=${[{ fullpath: doc.fullpath, name: doc.name }]}\n .currentIndex=${0}\n ></image-preview-popup>`,\n { backdrop: true, size: 'large', title: doc.name }\n )\n } else {\n // PDF 등 기타 파일은 새 탭에서 열기\n window.open(doc.fullpath, '_blank')\n }\n }\n\n private _toggleDoc(e: Event, id: string) {\n const checked = (e.target as HTMLInputElement).checked\n const newSet = new Set(this.selectedIds)\n if (checked) {\n newSet.add(id)\n } else {\n newSet.delete(id)\n }\n this.selectedIds = newSet\n this.dispatchEvent(new CustomEvent('document-selected', { detail: newSet }))\n }\n\n private _toggleAll(e: Event) {\n const checked = (e.target as HTMLInputElement).checked\n if (checked) {\n this.selectedIds = new Set(this.documents.map(d => d.id))\n } else {\n this.selectedIds = new Set()\n }\n this.dispatchEvent(new CustomEvent('document-selected', { detail: this.selectedIds }))\n }\n\n /* Drag & Drop: 데스크톱 파일 업로드 */\n private _onListDragOver(e: DragEvent) {\n const types = e.dataTransfer?.types || []\n if (types.includes('Files')) {\n e.preventDefault()\n this.isDragOver = true\n }\n }\n\n private _onListDragLeave() {\n this.isDragOver = false\n }\n\n private _onListDrop(e: DragEvent) {\n e.preventDefault()\n this.isDragOver = false\n\n const files = Array.from(e.dataTransfer?.files || [])\n if (files.length > 0) {\n this.dispatchEvent(new CustomEvent('documents-changed', { detail: { files } }))\n }\n }\n\n /* Drag: 문서 이동용 */\n private _onDocDragStart(e: DragEvent, doc: any) {\n const ids = this.selectedIds.has(doc.id) ? Array.from(this.selectedIds) : [doc.id]\n e.dataTransfer?.setData('application/x-field-document-ids', JSON.stringify(ids))\n e.dataTransfer!.effectAllowed = 'move'\n }\n\n private _formatDate(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(d)\n } catch {\n return ''\n }\n }\n\n private _formatFileSize(size: string): string {\n const bytes = Number(size)\n if (isNaN(bytes)) return size\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n\n private _formatDateTime(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n }).format(d)\n } catch {\n return ''\n }\n }\n}\n"]}
|
package/dist-client/pages/building-inspection/component/field-document/field-document-popup.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ import '@material/web/button/filled-button.js';
|
|
|
3
3
|
import '@material/web/button/outlined-button.js';
|
|
4
4
|
import './field-document-list-panel';
|
|
5
5
|
import { LitElement } from 'lit';
|
|
6
|
-
import './field-document-detail-popup';
|
|
7
6
|
export declare class FieldDocumentPopup extends LitElement {
|
|
8
7
|
static styles: import("lit").CSSResult[];
|
|
9
8
|
projectId: string;
|
|
@@ -14,6 +13,9 @@ export declare class FieldDocumentPopup extends LitElement {
|
|
|
14
13
|
private selectedDocIds;
|
|
15
14
|
private codeCounts;
|
|
16
15
|
private dragOverItem;
|
|
16
|
+
private _tooltipText;
|
|
17
|
+
private _tooltipX;
|
|
18
|
+
private _tooltipY;
|
|
17
19
|
render(): import("lit-html").TemplateResult<1>;
|
|
18
20
|
firstUpdated(): Promise<void>;
|
|
19
21
|
private _selectMajor;
|
|
@@ -24,15 +26,14 @@ export declare class FieldDocumentPopup extends LitElement {
|
|
|
24
26
|
private _getMajorCount;
|
|
25
27
|
private _getMiddleCount;
|
|
26
28
|
private _shareDocuments;
|
|
27
|
-
private _openMoveDialog;
|
|
28
29
|
private _toggleFavorites;
|
|
29
30
|
private _triggerUpload;
|
|
30
|
-
private
|
|
31
|
+
private _onNativeFileSelected;
|
|
31
32
|
private _uploadFiles;
|
|
32
33
|
private _deleteDocuments;
|
|
33
34
|
private _onFolderDragOver;
|
|
34
35
|
private _expandTimeout;
|
|
35
36
|
private _onFolderDrop;
|
|
36
37
|
private _onDocumentsChanged;
|
|
37
|
-
private
|
|
38
|
+
private _showTooltip;
|
|
38
39
|
}
|