@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.
Files changed (30) hide show
  1. package/dist-client/pages/building-inspection/building-inspection-management.d.ts +1 -0
  2. package/dist-client/pages/building-inspection/building-inspection-management.js +6 -2
  3. package/dist-client/pages/building-inspection/building-inspection-management.js.map +1 -1
  4. package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.d.ts +3 -0
  5. package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js +104 -31
  6. package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js.map +1 -1
  7. package/dist-client/pages/building-inspection/component/field-document/field-document-popup.d.ts +5 -4
  8. package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js +89 -65
  9. package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js.map +1 -1
  10. package/dist-client/route.d.ts +1 -1
  11. package/dist-client/tsconfig.tsbuildinfo +1 -1
  12. package/dist-server/service/building-inspection/building-inspection-mutation.js +30 -0
  13. package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
  14. package/dist-server/service/building-inspection/index.d.ts +1 -1
  15. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.js +10 -0
  16. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.js.map +1 -1
  17. package/dist-server/service/field-document/field-document-query.d.ts +1 -0
  18. package/dist-server/service/field-document/field-document-query.js +14 -1
  19. package/dist-server/service/field-document/field-document-query.js.map +1 -1
  20. package/dist-server/service/field-document/field-document-type.d.ts +2 -1
  21. package/dist-server/service/field-document/field-document-type.js +2 -1
  22. package/dist-server/service/field-document/field-document-type.js.map +1 -1
  23. package/dist-server/service/field-document/field-document.d.ts +1 -0
  24. package/dist-server/service/field-document/field-document.js +4 -0
  25. package/dist-server/service/field-document/field-document.js.map +1 -1
  26. package/dist-server/service/index.d.ts +2 -1
  27. package/dist-server/service/index.js +4 -0
  28. package/dist-server/service/index.js.map +1 -1
  29. package/dist-server/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +2 -2
@@ -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.selectedIds.has(doc.id)}
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>${((_a = doc.creator) === null || _a === void 0 ? void 0 : _a.name) || ''}</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
- 수정한 날짜: ${this._formatDateTime(this.selectedDoc.createdAt)}
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-badge status="10">
113
- <md-icon style="--md-icon-size:14px;">hourglass_top</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
- this.dispatchEvent(new CustomEvent('open-detail', { detail: doc }));
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 100px 80px 80px 100px;
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 100px 80px 80px 100px;
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"]}
@@ -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 _onFileSelected;
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 _openDetail;
38
+ private _showTooltip;
38
39
  }