PageSourceSearch

https://app.scan2invoice.com/srcjs/watched-folder-settings-page-9fde16eb.js

js scan2invoice.com collected 2026-10-01 08:06:15 UTC 51,861 bytes, 1,170 lines download raw bytes

1import{_ as t,n as e,t as i,i as o,s as a,a as n,aW as s,b as r,r as l,u as d,aX as c,aY as p,aZ as h,a_ as u,L as g,S as m,a$ as f,N as x,b0 as v,b1 as b,b2 as w,b3 as y,b4 as S}from"./app-shell-87aeda14.js";import{L as I,A as F}from"./logger-18751d05.js";class C{static getFolderName(t){if(!t||!t.trim())return"";const e=t.trim().replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter(t=>t.length>0);return 0===e.length?"":e[e.length-1]}}var k;let $=k=class extends o{constructor(){super(...arguments),this.folders=[],this.statusSnapshot=null,this.isLoading=!1,this.setupDialogOpened=!1,this.confirmImportExistingDialogOpened=!1,this.setupConfirmationInProgress=!1,this.setupDecision="watch-new-files-only",this.pendingSetupConfig=null,this.pendingSupportedFileCount=0,this.expandedAttentionItemIds=new Set,this.log=I.getInstance(k.name),this.instanceId=++k.instanceCounter,this.statusListener=null,this.documentVisibilityListener=null,this.statusRefreshTimer=null,this.visibleStatusRefreshTimer=null,this.loadingStatusPromise=null,this.loadStatusCount=0,this.statusEventCount=0,this.renderCount=0,this.updatedCount=0}static get styles(){return[a,n`
2        :host {
3          display: block;
4          font-family: "Open Sans", sans-serif;
5          color: var(--lumo-body-text-color);
6        }
7
8        .section {
9          padding: 8px 0 20px;
10        }
11
12        .page-header {
13          margin-bottom: 22px;
14        }
15
16        .page-subtitle {
17          margin: 0px 0 0;
18          color: var(--lumo-secondary-text-color);
19          font-size: 18px;
20          line-height: 1.5;
21        }
22
23        .actions {
24          display: flex;
25          align-items: center;
26          gap: 10px;
27          margin: 22px 0 22px;
28        }
29
30        .folder-list {
31          display: grid;
32          gap: 16px;
33        }
34
35        .folder-card {
36          position: relative;
37          overflow: hidden;
38          border: 1px solid var(--lumo-contrast-10pct);
39          border-radius: 10px;
40          background: var(--lumo-base-color);
41          box-shadow: var(--lumo-box-shadow-s);
42        }
43
44        .folder-card.warning {
45          border-color: var(--lumo-warning-color);
46        }
47
48        .folder-card.error {
49          border-color: var(--lumo-error-color-50pct);
50        }
51
52        .folder-card-header {
53          display: grid;
54          grid-template-columns: 76px minmax(0, 1fr) auto;
55          gap: 18px;
56          padding: 26px 28px 22px;
57          align-items: start;
58        }
59
60        .folder-icon-wrap {
61          display: inline-flex;
62          align-items: center;
63          justify-content: center;
64          width: 56px;
65          height: 56px;
66          border-radius: 50%;
67          background: var(--lumo-primary-color-10pct);
68          color: var(--lumo-primary-color);
69        }
70
71        .folder-card.disabled .folder-icon-wrap,
72        .folder-card.idle .folder-icon-wrap {
73          background: var(--lumo-contrast-10pct);
74          color: var(--lumo-secondary-text-color);
75        }
76
77        .folder-card.warning .folder-icon-wrap {
78          background: var(--lumo-warning-color-10pct);
79          color: var(--lumo-warning-color);
80        }
81
82        .folder-card.error .folder-icon-wrap {
83          background: var(--lumo-error-color-10pct);
84          color: var(--lumo-error-text-color);
85        }
86
87        .folder-icon-wrap vaadin-icon {
88          width: 34px;
89          height: 34px;
90        }
91
92        .folder-content {
93          min-width: 0;
94        }
95
96        .folder-title-row {
97          display: flex;
98          align-items: center;
99          gap: 10px;
100          min-width: 0;
101        }
102
103        .folder-name {
104          color: var(--lumo-header-text-color);
105          font-size: 18px;
106          font-weight: 700;
107          line-height: 1.2;
108          overflow: hidden;
109          text-overflow: ellipsis;
110          white-space: nowrap;
111        }
112
113        .folder-path-row {
114          display: inline-flex;
115          align-items: center;
116          gap: 8px;
117          max-width: 100%;
118          margin-top: 10px;
119          padding: 5px 9px;
120          border-radius: 6px;
121          background: var(--lumo-contrast-5pct);
122          color: var(--lumo-secondary-text-color);
123          font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
124          font-size: 13px;
125          line-height: 1.35;
126        }
127
128        .folder-path {
129          overflow: hidden;
130          text-overflow: ellipsis;
131          white-space: nowrap;
132        }
133
134        .copy-path-button,
135        .open-folder-button,
136        .more-button {
137          display: inline-flex;
138          align-items: center;
139          justify-content: center;
140          border: 0;
141          background: transparent;
142          color: var(--lumo-secondary-text-color);
143          cursor: pointer;
144          padding: 2px;
145          border-radius: 5px;
146        }
147
148        .copy-path-button:hover,
149        .open-folder-button:hover,
150        .more-button:hover {
151          background: var(--lumo-contrast-10pct);
152          color: var(--lumo-body-text-color);
153        }
154
155        .copy-path-button vaadin-icon,
156        .open-folder-button vaadin-icon {
157          width: 16px;
158          height: 16px;
159        }
160
161        .folder-detail {
162          display: grid;
163          grid-template-columns: 32px minmax(0, 1fr);
164          align-items: center;
165          gap: 18px;
166          margin: 0 28px 18px;
167          padding: 13px 15px;
168          border: 1px solid var(--lumo-primary-color-50pct);
169          border-radius: 8px;
170          background: var(--lumo-primary-color-10pct);
171          color: var(--lumo-primary-text-color);
172          line-height: 1.45;
173        }
174
175        .folder-detail vaadin-icon {
176          width: 32px;
177          height: 32px;
178          color: var(--lumo-primary-color);
179        }
180
181        .folder-detail-text {
182          min-width: 0;
183        }
184
185        .folder-detail-title {
186          color: var(--lumo-primary-text-color);
187          font-size: 17px;
188          font-weight: 500;
189          line-height: 1.35;
190        }
191
192        .folder-detail-message {
193          margin-top: 6px;
194          color: var(--lumo-secondary-text-color);
195          font-size: 15px;
196          line-height: 1.35;
197          white-space: pre-line;
198        }
199
200        .folder-detail.error {
201          border-color: var(--lumo-error-color-50pct);
202          background: var(--lumo-error-color-10pct);
203          color: var(--lumo-error-text-color);
204        }
205
206        .folder-detail.error vaadin-icon,
207        .folder-detail.error .folder-detail-title,
208        .folder-detail.error .folder-detail-message {
209          color: var(--lumo-error-text-color);
210        }
211
212        .folder-detail.warning {
213          border-color: var(--lumo-warning-color);
214          background: var(--lumo-warning-color-10pct);
215          color: var(--lumo-warning-text-color);
216        }
217
218        .folder-detail.warning vaadin-icon {
219          color: var(--lumo-warning-color);
220        }
221
222        .folder-detail.warning .folder-detail-title,
223        .folder-detail.warning .folder-detail-message {
224          color: var(--lumo-warning-text-color);
225        }
226
227        .attention-list {
228          display: grid;
229          gap: 7px;
230          padding: 0 28px 14px 108px;
231        }
232
233        .attention-item {
234          display: grid;
235          grid-template-columns: minmax(0, 1fr) auto;
236          gap: 12px;
237          align-items: start;
238          border: 1px solid var(--lumo-warning-color);
239          border-radius: 8px;
240          background: var(--lumo-warning-color-10pct);
241          padding: 9px 10px;
242        }
243
244        .attention-main {
245          min-width: 0;
246        }
247
248        .attention-item.error {
249          border-color: var(--lumo-error-color-50pct);
250          background: var(--lumo-error-color-10pct);
251        }
252
253        .attention-header {
254          display: grid;
255          grid-template-columns: 22px minmax(0, 1fr) auto;
256          gap: 8px;
257          align-items: flex-start;
258        }
259
260        .attention-icon {
261          width: 18px;
262          height: 18px;
263          margin-top: 1px;
264          color: var(--lumo-warning-color);
265        }
266
267        .attention-item.error .attention-icon {
268          color: var(--lumo-error-text-color);
269        }
270
271        .attention-title {
272          color: var(--lumo-warning-text-color);
273          font-size: 14px;
274          font-weight: 700;
275          line-height: 1.35;
276        }
277
278        .attention-item.error .attention-title {
279          color: var(--lumo-error-text-color);
280        }
281
282        .attention-content {
283          min-width: 0;
284        }
285
286        .attention-error,
287        .attention-description,
288        .attention-detail-row {
289          margin-top: 4px;
290          color: var(--lumo-secondary-text-color);
291          font-size: 13px;
292          line-height: 1.35;
293          overflow-wrap: anywhere;
294        }
295
296        .attention-filename {
297          margin-top: 3px;
298          color: var(--lumo-secondary-text-color);
299          font-size: 13px;
300          line-height: 1.35;
301          overflow: hidden;
302          text-overflow: ellipsis;
303          white-space: nowrap;
304        }
305
306        .attention-error,
307        .attention-description,
308        .attention-detail-value {
309          white-space: pre-line;
310        }
311
312        .attention-error {
313          margin-left: 30px;
314          color: var(--lumo-secondary-text-color);
315        }
316
317        .attention-item.error .attention-error {
318          color: var(--lumo-secondary-text-color);
319        }
320
321        .attention-details {
322          display: grid;
323          gap: 5px;
324          margin-top: 7px;
325          margin-left: 30px;
326          padding-top: 7px;
327        }
328
329        .attention-detail-row {
330          display: grid;
331          grid-template-columns: 110px minmax(0, 1fr);
332          gap: 12px;
333          margin-top: 0;
334          align-items: baseline;
335        }
336
337        .attention-detail-label {
338          color: var(--lumo-body-text-color);
339          font-weight: 700;
340        }
341
342        .attention-detail-value {
343          margin-top: 0;
344          min-width: 0;
345          overflow-wrap: anywhere;
346        }
347
348        .attention-actions {
349          display: flex;
350          flex-wrap: wrap;
351          gap: 6px;
352          justify-content: flex-end;
353          justify-items: end;
354          min-width: max-content;
355          width: 100%;
356        }
357
358        .attention-action-column {
359          display: grid;
360          gap: 18px;
361          justify-items: stretch;
362          align-content: start;
363          min-width: max-content;
364        }
365
366        .attention-actions vaadin-button {
367          --lumo-button-size: 28px;
368        }
369
370        .attention-more-button {
371          border: 0;
372          background: transparent;
373          color: var(--lumo-primary-text-color);
374          font-size: 13px;
375          font-weight: 400;
376          padding: 0 4px 0 0;
377          cursor: pointer;
378          white-space: nowrap;
379          align-self: start;
380          justify-self: end;
381          width: 100%;
382          text-align: right;
383        }
384
385        @media only screen and (max-width: 900px) {
386          .attention-item {
387            grid-template-columns: minmax(0, 1fr);
388          }
389
390          .attention-actions {
391            justify-content: flex-start;
392            justify-items: start;
393            min-width: 0;
394            padding-top: 0;
395            margin-left: 30px;
396          }
397
398          .attention-action-column {
399            gap: 7px;
400            justify-items: start;
401            min-width: 0;
402          }
403
404          .attention-detail-row {
405            grid-template-columns: 90px minmax(0, 1fr);
406            gap: 8px;
407          }
408        }
409
410        .folder-card-actions {
411          display: flex;
412          align-items: flex-start;
413          gap: 12px;
414        }
415
416        .status-dot {
417          display: inline-block;
418          width: 7px;
419          height: 7px;
420          border-radius: 999px;
421          background: currentColor;
422        }
423
424        .folder-controls {
425          display: grid;
426          grid-template-columns: minmax(220px, 1fr) 1px minmax(280px, 1fr) auto;
427          align-items: center;
428          gap: 24px;
429          padding: 22px 28px 24px;
430          border-top: 1px solid var(--lumo-contrast-10pct);
431        }
432
433        .folder-control {
434          display: inline-grid;
435          grid-template-columns: auto minmax(0, 1fr);
436          gap: 12px;
437          align-items: start;
438          min-width: 0;
439          color: var(--lumo-body-text-color);
440        }
441
442        .control-text {
443          min-width: 0;
444        }
445
446        .folder-control-label {
447          display: block;
448          cursor: pointer;
449          color: var(--lumo-body-text-color);
450          font-size: 15px;
451          font-weight: 700;
452          line-height: 1.25;
453          user-select: none;
454        }
455
456        .folder-control-help {
457          display: block;
458          margin-top: 3px;
459          color: var(--lumo-secondary-text-color);
460          font-size: 13px;
461          line-height: 1.35;
462        }
463
464        .control-divider {
465          width: 1px;
466          height: 42px;
467          background: var(--lumo-contrast-10pct);
468        }
469
470        vaadin-checkbox {
471          margin-top: -2px;
472        }
473
474        .flood-actions {
475          display: flex;
476          flex-wrap: wrap;
477          gap: 8px;
478          margin-top: 14px;
479        }
480
481        vaadin-button.remove-button {
482          justify-self: end;
483        }
484
485        .company-status {
486          margin-bottom: 18px;
487          padding: 12px 14px;
488          border: 1px solid var(--lumo-warning-color);
489          border-left: 4px solid var(--lumo-warning-color);
490          border-radius: 8px;
491          background: var(--lumo-warning-color-10pct);
492          color: var(--lumo-warning-text-color);
493          font-size: 14px;
494          line-height: 1.45;
495        }
496
497        .empty {
498          border: 1px dashed var(--lumo-contrast-20pct);
499          border-radius: 10px;
500          color: var(--lumo-secondary-text-color);
501          padding: 26px;
502          background: var(--lumo-base-color);
503          text-align: center;
504        }
505
506        .save-note {
507          display: inline-flex;
508          align-items: center;
509          gap: 8px;
510          margin-top: 18px;
511          color: var(--lumo-secondary-text-color);
512          font-size: 13px;
513        }
514
515        .save-note vaadin-icon {
516          width: 18px;
517          height: 18px;
518        }
519
520        vaadin-dialog.existing-files-dialog {
521          --vaadin-dialog-min-width: min(820px, calc(100vw - 48px));
522          --vaadin-dialog-max-width: min(820px, calc(100vw - 48px));
523          --vaadin-dialog-border-radius: 10px;
524          --vaadin-dialog-background: var(--lumo-base-color);
525        }
526
527
528        .existing-files-dialog-content {
529          position: relative;
530          width: 100%;
531          box-sizing: border-box;
532          padding: 10px;
533          color: var(--lumo-body-text-color);
534        }
535
536        .setup-dialog-close {
537          position: absolute;
538          top: 0px;
539          right: 0px;
540          color: var(--lumo-secondary-text-color);
541          --lumo-button-size: 36px;
542          z-index: 1;
543        }
544
545        .setup-dialog-close vaadin-icon {
546          width: 22px;
547          height: 22px;
548        }
549
550        .existing-files-header {
551          display: grid;
552          grid-template-columns: 52px minmax(0, 1fr);
553          gap: 16px;
554          align-items: start;
555          padding-right: 42px;
556        }
557
558        .existing-files-header-icon {
559          position: relative;
560          width: 44px;
561          height: 44px;
562          color: var(--lumo-primary-color);
563        }
564
565        .existing-files-header-icon vaadin-icon {
566          width: 44px;
567          height: 44px;
568        }
569
570        .existing-files-header-icon::after {
571          content: "!";
572          position: absolute;
573          right: -3px;
574          bottom: -1px;
575          display: inline-flex;
576          align-items: center;
577          justify-content: center;
578          width: 24px;
579          height: 24px;
580          border-radius: 999px;
581          background: var(--lumo-primary-color);
582          color: var(--lumo-primary-contrast-color);
583          border: 2px solid var(--lumo-primary-contrast-color);
584          font-size: 15px;
585          font-weight: 700;
586          line-height: 1;
587        }
588
589        .existing-files-title {
590          margin: 0 0 16px;
591          color: var(--lumo-header-text-color);
592          font-size: 24px;
593          font-weight: 800;
594          line-height: 1.18;
595        }
596
597        .existing-files-copy {
598          display: grid;
599          gap: 6px;
600          color: var(--lumo-secondary-text-color);
601          font-size: 16px;
602          line-height: 1.5;
603        }
604
605        .existing-files-options {
606          display: grid;
607          grid-template-columns: repeat(2, minmax(0, 1fr));
608          gap: 24px;
609          margin-top: 32px;
610        }
611
612        .existing-files-option {
613          display: grid;
614          grid-template-columns: 28px minmax(0, 1fr);
615          gap: 16px;
616          min-height: 210px;
617          box-sizing: border-box;
618          padding: 24px;
619          border: 1px solid var(--lumo-contrast-20pct);
620          border-radius: 10px;
621          background: var(--lumo-base-color);
622          color: var(--lumo-body-text-color);
623          text-align: left;
624          cursor: pointer;
625          font-family: inherit;
626          box-shadow: var(--lumo-box-shadow-xs);
627          transition: border-color 120ms ease, box-shadow 120ms ease, background 120ms ease;
628        }
629
630        .existing-files-option:hover {
631          border-color: var(--lumo-primary-color-50pct);
632        }
633
634        .existing-files-option.selected {
635          border-color: var(--lumo-primary-color);
636          background: var(--lumo-primary-color-10pct);
637          box-shadow: var(--lumo-box-shadow-s);
638        }
639
640        .setup-radio {
641          width: 20px;
642          height: 20px;
643          margin-top: 22px;
644          border: 2px solid var(--lumo-contrast-30pct);
645          border-radius: 999px;
646          box-sizing: border-box;
647        }
648
649        .existing-files-option.selected .setup-radio {
650          border: 6px solid var(--lumo-primary-color);
651        }
652
653        .option-main {
654          min-width: 0;
655        }
656
657        .option-heading {
658          display: grid;
659          grid-template-columns: 58px minmax(0, 1fr);
660          gap: 16px;
661          align-items: center;
662        }
663
664        .option-icon {
665          position: relative;
666          display: inline-flex;
667          align-items: center;
668          justify-content: center;
669          width: 44px;
670          height: 44px;
671          color: var(--lumo-primary-color);
672        }
673
674        .option-icon vaadin-icon {
675          width: 44px;
676          height: 44px;
677        }
678
679        .option-icon.file-clock::after {
680          content: "";
681          position: absolute;
682          right: -6px;
683          bottom: -2px;
684          width: 24px;
685          height: 24px;
686          border-radius: 999px;
687          background: var(--lumo-primary-color);
688          border: 2px solid var(--lumo-primary-contrast-color);
689        }
690
691        .option-icon.file-clock::before {
692          content: "";
693          position: absolute;
694          right: 5px;
695          bottom: 9px;
696          width: 6px;
697          height: 6px;
698          border-left: 2px solid var(--lumo-primary-contrast-color);
699          border-bottom: 2px solid var(--lumo-primary-contrast-color);
700          z-index: 1;
701          transform: rotate(-90deg);
702        }
703
704        .option-icon.import {
705          color: var(--lumo-success-color);
706        }
707
708        .option-icon.import vaadin-icon {
709          width: 46px;
710          height: 46px;
711        }
712
713        .option-title-row {
714          min-width: 0;
715        }
716
717        .option-title {
718          color: var(--lumo-header-text-color);
719          font-size: 18px;
720          font-weight: 800;
721          line-height: 1.25;
722        }
723
724        .recommended-badge {
725          display: inline-flex;
726          margin-top: 6px;
727          padding: 3px 8px;
728          border-radius: 5px;
729          background: var(--lumo-primary-color-10pct);
730          color: var(--lumo-primary-text-color);
731          font-size: 13px;
732          font-weight: 800;
733          line-height: 1.2;
734        }
735
736        .option-divider {
737          height: 1px;
738          margin: 5px 0 5px;
739          background: var(--lumo-contrast-10pct);
740        }
741
742        .option-points {
743          display: grid;
744          gap: 14px;
745          color: var(--lumo-secondary-text-color);
746          font-size: 14px;
747          line-height: 1.45;
748        }
749
750        .option-point,
751        .option-count {
752          display: grid;
753          grid-template-columns: 20px minmax(0, 1fr);
754          gap: 12px;
755          align-items: center;
756        }
757
758        .option-point vaadin-icon,
759        .option-count vaadin-icon {
760          width: 20px;
761          height: 20px;
762          color: var(--lumo-secondary-text-color);
763        }
764
765        .btnsecondary {
766          margin-right: 10px;          
767        }
768        .btnprimary {
769          margin-right: 2px;          
770        }        
771
772
773        @media (max-width: 760px) {
774          .folder-card-header {
775            grid-template-columns: 48px minmax(0, 1fr);
776            padding: 20px;
777          }
778
779          .folder-icon-wrap {
780            width: 42px;
781            height: 42px;
782          }
783
784          .folder-icon-wrap vaadin-icon {
785            width: 26px;
786            height: 26px;
787          }
788
789          .folder-card-actions {
790            grid-column: 1 / -1;
791            margin-left: 60px;
792          }
793
794          .folder-controls {
795            grid-template-columns: 1fr;
796            gap: 14px;
797            padding: 18px 20px 20px;
798          }
799
800          .control-divider {
801            display: none;
802          }
803
804          vaadin-button.remove-button {
805            justify-self: start;
806          }
807
808          vaadin-dialog.existing-files-dialog {
809            --vaadin-dialog-min-width: calc(100vw - 28px);
810            --vaadin-dialog-max-width: calc(100vw - 28px);
811          }
812
813          .existing-files-dialog-content {
814            padding: 28px 20px 24px;
815          }
816
817          .setup-dialog-close {
818            top: 18px;
819            right: 16px;
820          }
821
822          .existing-files-header {
823            grid-template-columns: 44px minmax(0, 1fr);
824            gap: 14px;
825            padding-right: 36px;
826          }
827
828          .existing-files-header-icon,
829          .existing-files-header-icon vaadin-icon {
830            width: 40px;
831            height: 40px;
832          }
833
834          .existing-files-header-icon::after {
835            width: 24px;
836            height: 24px;
837            font-size: 16px;
838          }
839
840          .existing-files-title {
841            margin-bottom: 16px;
842            font-size: 24px;
843          }
844
845          .existing-files-copy {
846            font-size: 16px;
847          }
848
849          .existing-files-options {
850            grid-template-columns: 1fr;
851            gap: 16px;
852            margin-top: 28px;
853          }
854
855          .existing-files-option {
856            min-height: 0;
857            padding: 24px 20px;
858            gap: 16px;
859          }
860
861          .option-heading {
862            grid-template-columns: 58px minmax(0, 1fr);
863            gap: 14px;
864          }
865
866          .option-title {
867            font-size: 20px;
868          }
869
870          .option-points {
871            font-size: 15px;
872          }
873
874        }
875      `]}render(){return this.renderCount=this.renderCount+1,this.trace("render instanceId="+this.instanceId+" renderCount="+this.renderCount+" isLoading="+this.isLoading+" folders="+this.folders.length+" hasSnapshot="+(null!=this.statusSnapshot)+" setupDialogOpened="+this.setupDialogOpened+" confirmImportExistingDialogOpened="+this.confirmImportExistingDialogOpened),s(F.getPlatformConfig().isElectron)?r`
876      <div class="section">
877        ${this.isLoading?r`<loading-indicator></loading-indicator>`:r`
878          <div class="page-header">            
879            <p class="page-subtitle">Automatically import invoices and receipts from selected folders.</p>
880          </div>
881
882          ${this.renderCompanyStatus()}
883
884          <div class="actions">
885            <vaadin-button theme="primary" @click="${this.addFolder}">
886              <vaadin-icon icon="vaadin:folder-add" slot="prefix"></vaadin-icon>
887              Add Folder
888            </vaadin-button>
889          </div>
890
891          ${0===this.folders.length?r`
892            <div class="empty">No watched folders have been added for this company.</div>
893          `:r`
894            <div class="folder-list">
895              ${this.folders.map(t=>this.renderFolder(t))}
896            </div>
897            <div class="save-note">
898              <vaadin-icon icon="vaadin:info-circle-o"></vaadin-icon>
899              Changes are saved automatically.
900            </div>
901          `}
902        `}
903      </div>
904
905      <vaadin-dialog
906        class="existing-files-dialog"
907        .opened="${this.setupDialogOpened}"
908        @opened-changed="${this.setupDialogOpenedChanged}"
909        ${l(()=>this.renderSetupDialogContent(),[this.pendingSupportedFileCount,this.setupDecision])}
910        ${d(()=>this.renderSetupDialogFooter(),[this.setupConfirmationInProgress])}
911      ></vaadin-dialog>
912
913      <dialog-box
914        ?opened="${this.confirmImportExistingDialogOpened}"
915        @opened-changed="${t=>{this.confirmImportExistingDialogOpened=t.detail.opened}}"
916        @confirmed="${this.importExistingFilesConfirmed}"
917        dialog-title="Import existing files?"
918        message="This action will import ${this.pendingSupportedFileCount} file${1===this.pendingSupportedFileCount?"":"s"}. To continue, type IMPORT in the field below."
919        icon="vaadin:warning"
920        icon-style="fill: var(--lumo-warning-color)"
921        cancel-visible
922        close-on-ok
923        ok-button-text="Import Existing Files"
924        is-type-to-confirm
925        type-to-confirm-text="IMPORT"
926        ok-button-theme="primary"
927      ></dialog-box>
928    `:r``}renderSetupDialogContent(){return r`
929        <div class="existing-files-dialog-content">
930          <vaadin-button
931            class="setup-dialog-close"
932            theme="tertiary icon"
933            aria-label="Close"
934            @click="${this.cancelSetup}"
935          >
936            <vaadin-icon icon="vaadin:close"></vaadin-icon>
937          </vaadin-button>
938          <div class="existing-files-header">
939            <div class="existing-files-header-icon" aria-hidden="true">
940              <vaadin-icon icon="vaadin:folder-o"></vaadin-icon>
941            </div>
942            <div>
943              <h2 class="existing-files-title">Existing files found</h2>
944              <div class="existing-files-copy">
945                <div>${this.pendingSupportedFileCount} supported file${1===this.pendingSupportedFileCount?"":"s"} already exist in this folder.</div>
946                <div>
946Choose how Scan2Invoice should handle them before watching is enabled.</div>
947              </div>
948            </div>
949          </div>
950
951          <div class="existing-files-options" role="radiogroup" aria-label="How to handle existing files">
952            ${this.renderSetupDecisionOption("watch-new-files-only","Watch new files only",r`
953                <div class="option-heading">
954                  <span class="option-icon file-clock" aria-hidden="true"><vaadin-icon icon="vaadin:file-o"></vaadin-icon></span>
955                  <span class="option-title-row">
956                    <span class="option-title">Watch new files only</span>
957                    <span class="recommended-badge">Recommended</span>
958                  </span>
959                </div>
960                <div class="option-divider"></div>
961                <div class="option-points">
962                  <div class="option-point">
963                    <vaadin-icon icon="vaadin:ban"></vaadin-icon>
964                    <span>Existing files will be ignored.</span>
965                  </div>
966                  <div class="option-point">
967                    <vaadin-icon icon="vaadin:clock"></vaadin-icon>
968                    <span>Only newly added files will be processed.</span>
969                  </div>
970                </div>
971              `)}
972            ${this.renderSetupDecisionOption("import-existing-files-too","Import existing files",r`
973                <div class="option-heading">
974                  <span class="option-icon import" aria-hidden="true"><vaadin-icon icon="vaadin:archive"></vaadin-icon></span>
975                  <span class="option-title">Import existing files</span>
976                </div>
977                <div class="option-divider"></div>
978                <div class="option-points">
979                  <div>Existing files will immediately enter the OCR and upload queue.</div>
980                  <div class="option-divider"></div>
981                  <div class="option-count">
982                    <vaadin-icon icon="vaadin:file-text-o"></vaadin-icon>
983                    <span>${this.pendingSupportedFileCount} file${1===this.pendingSupportedFileCount?"":"s"}</span>
984                  </div>
985                </div>
986              `)}
987          </div>
988        </div>
989    `}renderSetupDialogFooter(){return r`
990        <vaadin-button class="btnsecondary" theme="tertiary" ?disabled="${this.setupConfirmationInProgress}" @click="${this.cancelSetup}">
991          Cancel
992        </vaadin-button>
993        <vaadin-button class="btnprimary" theme="primary" ?disabled="${this.setupConfirmationInProgress}" @click="${this.continueSetupDecision}">
994          Continue
995        </vaadin-button>
996    `}setupDialogOpenedChanged(t){this.setupDialogOpened=t.detail.value}renderCompanyStatus(){const t=this.statusSnapshot?.companyImportState;return"subscription-inactive"===t?.pausedReason?r`<div class="company-status">Auto import is paused because the company subscription or trial is inactive. Files remain queued locally.</div>`:"quota-reached"===t?.pausedReason?r`<div class="company-status">Auto import is paused because the document import quota has been reached. Files remain queued locally.</div>`:r``}renderSetupDecisionOption(t,e,i){const o=this.setupDecision===t;return r`
997      <button
998        class="existing-files-option ${o?"selected":""}"
999        type="button"
1000        role="radio"
1001        aria-checked="${o?"true":"false"}"
1002        aria-label="${e}"
1003        @click="${()=>{this.setupDecision=t}}"
1004      >
1005        <span class="setup-radio" aria-hidden="true"></span>
1006        <span class="option-main">${i}</span>
1007      </button>
1008    `}renderFolder(t){const e=c(this.statusSnapshot,t.id),i=p(t,e,this.statusSnapshot?.companyImportState),o=h(this.statusSnapshot,t.id),a=C.getFolderName(t.path),n=!0===t.importOptions?.splitPdf;return r`
1009      <div class="folder-card ${i.level}">
1010        <div class="folder-card-header">
1011          <div class="folder-icon-wrap">
1012            <vaadin-icon icon="vaadin:folder-open"></vaadin-icon>
1013          </div>
1014
1015          <div class="folder-content">
1016            <div class="folder-title-row">
1017              <div class="folder-name" title="${a}">${a}</div>
1018            </div>
1019
1020            <div class="folder-path-row" title="${t.path}">
1021              <span class="folder-path">${t.path}</span>
1022              <button class="open-folder-button" type="button" title="Open folder" @click="${()=>this.openFolder(t)}">
1023                <vaadin-icon icon="vaadin:folder-open-o"></vaadin-icon>
1024              </button>
1025            </div>
1026
1027          </div>
1028
1029          <div class="folder-card-actions">
1030            <ta-badge status="${this.getFolderBadgeStatus(i.level)}">
1031              <span slot="icon" class="status-dot"></span>
1032              ${i.text}
1033            </ta-badge>
1034          </div>
1035        </div>
1036
1037        ${i.detail&&i.level&&"ok"!=i.level?r`
1038          <div class="folder-detail ${i.level}">
1039            <vaadin-icon style="--vaadin-icon-size: 10px;" icon="${this.getFolderDetailIcon(i.level)}"></vaadin-icon>
1040            <div class="folder-detail-text">
1041              <div class="folder-detail-title">${i.text}</div>
1042              <div class="folder-detail-message">${i.detail}</div>
1043              ${"flood-protection"===t.paused?.reason?this.renderFloodActions(t):""}
1044            </div>
1045          </div>
1046        `:""}
1047
1048        ${o.length>0?r`
1049          <div class="attention-list">
1050            ${o.map(e=>this.renderAttentionItem(t,e))}
1051          </div>
1052        `:""}
1053
1054        <div class="folder-controls">
1055          <span class="folder-control">
1056            <vaadin-checkbox
1057              aria-label="Enabled"
1058              ?checked="${t.enabled}"
1059              @click="${e=>this.toggleEnabledFromClick(e,t)}"
1060            ></vaadin-checkbox>
1061            <span class="control-text">
1062              <span class="folder-control-label" @click="${e=>this.toggleEnabledFromClick(e,t)}">Enabled</span>
1063              <span class="folder-control-help">${t.enabled?"Folder is active and being watched":"Folder is saved but not watched"}</span>
1064            </span>
1065          </span>
1066
1067          <span class="control-divider" aria-hidden="true"></span>
1068
1069          <span class="folder-control">
1070            <vaadin-checkbox
1071              aria-label="Auto-split multi-invoice PDFs"
1072              ?checked="${n}"
1073              @click="${e=>this.toggleSplitPdfFromClick(e,t)}"
1074            ></vaadin-checkbox>
1075            <span class="control-text">
1076              <span class="folder-control-label" @click="${e=>this.toggleSplitPdfFromClick(e,t)}">Auto-split multi-invoice PDFs</span>
1077              <span class="folder-control-help">Automatically split PDFs by invoice</span>
1078            </span>
1079          </span>
1080
1081          <vaadin-button class="remove-button" theme="small error tertiary" @click="${()=>this.removeFolder(t)}">
1082            <vaadin-icon icon="vaadin:trash" slot="prefix"></vaadin-icon>
1083            Remove
1084          </vaadin-button>
1085
1086        </div>
1087      </div>
1088    `}renderFloodActions(t){return r`
1089      <div class="flood-actions">
1090        <vaadin-button theme="small" @click="${()=>this.resumeFolder(t)}">Resume and import detected files</vaadin-button>
1091        <vaadin-button theme="small" @click="${()=>this.ignoreDetectedAndResume(t)}">Ignore detected files and continue watching</vaadin-button>
1092        <vaadin-button theme="small" @click="${()=>this.disableFolder(t)}">Disable watched folder</vaadin-button>
1093      </div>
1094    `}getFolderDetailIcon(t){return"error"===t?"vaadin:exclamation-circle-o":"warning"===t?"vaadin:warning":"vaadin:info-circle-o"}getFolderBadgeStatus(t){switch(t){case"ok":return"success";case"warning":return"warning";case"error":return"error";case"info":return"info";default:return"neutral"}}renderAttentionItem(t,e){const i=this.expandedAttentionItemIds.has(e.id),o="error"===e.lastErrorSeverity||e.lastErrorBlocking?"error":"warning",a=e.summary||e.detailedDescription;return r`
1095      <div class="attention-item ${o}">
1096        <div class="attention-main">
1097          <div class="attention-header">
1098            <vaadin-icon class="attention-icon" icon="${"error"===o?"vaadin:exclamation-circle-o":"vaadin:warning"}"></vaadin-icon>
1099            <div class="attention-content">
1100              <div class="attention-title">${e.message}</div>
1101              <div class="attention-filename" title="${e.name}">${this.shortenFilename(e.name)}
1101</div>
1102            </div>
1103          </div>
1104          ${a?r`<div class="attention-error">${a}</div>`:""}
1105          ${i?this.renderAttentionDetails(e):""}
1106        </div>
1107        <div class="attention-action-column">
1108          <button class="attention-more-button" type="button" @click="${()=>this.toggleAttentionDetails(e.id)}">
1109            ${i?"Hide details":"View Details"}
1110          </button>
1111          <div class="attention-actions">
1112            ${e.actions.includes("retry-now")?r`
1113              <vaadin-button theme="small primary" @click="${()=>this.retryAttentionItem(t,e)}">Retry now</vaadin-button>
1114            `:""}
1115            ${e.actions.includes("ignore")?r`
1116              <vaadin-button theme="small" @click="${()=>this.ignoreAttentionItem(t,e)}">Ignore file</vaadin-button>
1117            `:""}
1118            ${e.actions.includes("clear-lifecycle-error")?r`
1119              <vaadin-button theme="small" @click="${()=>this.clearAttentionItemError(t,e)}">Clear warning</vaadin-button>
1120            `:""}
1121          </div>
1122        </div>
1123      </div>
1124    `}renderAttentionDetails(t){const e=t.diagnosticDetails||[];return r`
1125      <div class="attention-details">
1126        <div class="attention-description">${t.detailedDescription}</div>
1127        ${e.map(t=>r`
1128          <div class="attention-detail-row">
1129            <div class="attention-detail-label">${t.label}</div>
1130            <div class="attention-detail-value">${this.formatAttentionDetailValue(t.label,t.value)}</div>
1131          </div>
1132        `)}
1133      </div>
1134    `}formatAttentionDetailValue(t,e){return this.isIsoTimestampDetail(t,e)?u(e):e}isIsoTimestampDetail(t,e){return!!/(retry|time|date| at)$/i.test(t)&&(!!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(e)&&!Number.isNaN(new Date(e).getTime()))}shortenFilename(t){if(t.length<=50)return t;const e=t.lastIndexOf("."),i=e>0&&t.length-e<=8?t.slice(e):"";return(i?t.slice(0,e):t).slice(0,50-i.length-3)+"..."+i}toggleAttentionDetails(t){const e=new Set(this.expandedAttentionItemIds);e.has(t)?e.delete(t):e.add(t),this.expandedAttentionItemIds=e}connectedCallback(){super.connectedCallback(),k.activeInstanceIds.add(this.instanceId),this.trace("connected instanceId="+this.instanceId+" activeInstances="+this.getActiveInstanceSummary(),!0),this.statusListener=t=>{this.statusEventCount=this.statusEventCount+1,this.trace("watched-folders-status event instanceId="+this.instanceId+" #"+this.statusEventCount+" detail="+JSON.stringify(t.detail),!0),this.scheduleStatusRefresh("watched-folders-status")},this.documentVisibilityListener=()=>{this.shouldRunVisibleStatusRefresh()?(this.trace("document visible instanceId="+this.instanceId,!0),this.refreshStatusWhileVisible("document-visible")):this.stopVisibleStatusRefresh("document-hidden")},window.addEventListener("watched-folders-status",this.statusListener),document.addEventListener("visibilitychange",this.documentVisibilityListener),this.startVisibleStatusRefresh("connected")}disconnectedCallback(){k.activeInstanceIds.delete(this.instanceId),this.trace("disconnected instanceId="+this.instanceId+" activeInstances="+this.getActiveInstanceSummary(),!0),this.statusListener&&(window.removeEventListener("watched-folders-status",this.statusListener),this.statusListener=null),this.documentVisibilityListener&&(document.removeEventListener("visibilitychange",this.documentVisibilityListener),this.documentVisibilityListener=null),this.statusRefreshTimer&&(clearTimeout(this.statusRefreshTimer),this.statusRefreshTimer=null),this.stopVisibleStatusRefresh("disconnected"),super.disconnectedCallback()}firstUpdated(t){super.firstUpdated(t),this.trace("firstUpdated instanceId="+this.instanceId+" changed="+this.describeChangedProperties(t),!0),this.loadStatus(!0,"firstUpdated"),this.startVisibleStatusRefresh("firstUpdated")}updated(t){if(super.updated(t),this.updatedCount=this.updatedCount+1,this.trace("updated instanceId="+this.instanceId+" updatedCount="+this.updatedCount+" changed="+this.describeChangedProperties(t)+" isLoading="+this.isLoading+" folders="+this.folders.length+" hasSnapshot="+(null!=this.statusSnapshot)),this.setupDialogOpened){const t=this.shadowRoot?.querySelector("vaadin-dialog.existing-files-dialog"),e=t?.$?.overlay;e&&(e.style.zIndex="10000")}}getWatchedFoldersApi(){return F.getPlatformConfig().isElectron&&window.watchedFolders||null}getScope(){const t=g.getInstance();return m.hasText(t.userId)&&m.hasText(t.companyId)?{userId:t.userId,companyId:t.companyId}:null}getScopeCacheKey(t){return t.userId+":"+t.companyId}applyStatusSnapshot(t,e){this.trace("applyStatusSnapshot instanceId="+this.instanceId+" scope="+JSON.stringify(e)+" configs="+String(t.configs?.length||0)+" queueSummaries="+String(t.queueSummaries?.length||0)+" companyPausedReason="+t.companyImportState?.pausedReason),this.statusSnapshot=t,this.folders=f(t.configs||[],e),k.statusSnapshotCache.set(this.getScopeCacheKey(e),t),window.dispatchEvent(new CustomEvent("watched-folders-snapshot",{detail:t}))}scheduleStatusRefresh(t){this.shouldRunVisibleStatusRefresh()?(this.statusRefreshTimer&&(this.trace("scheduleStatusRefresh clearing existing timer instanceId="+this.instanceId+" reason="+t),clearTimeout(this.statusRefreshTimer)),this.trace("scheduleStatusRefresh instanceId="+this.instanceId+" reason="+t,!0),this.statusRefreshTimer=setTimeout(()=>{this.statusRefreshTimer=null,this.trace("scheduleStatusRefresh firing instanceId="+this.instanceId+" reason="+t,!0),this.loadStatus(!1,"scheduled:"+t)},100)):this.trace("scheduleStatusRefresh skipped not visible instanceId="+this.instanceId+" reason="+t)}startVisibleStatusRefresh(t){!this.visibleStatusRefreshTimer&&this.shouldRunVisibleStatusRefresh()&&(this.trace("startVisibleStatusRefresh instanceId="+this.instanceId+" reason="+t),this.visibleStatusRefreshTimer=setTimeout(()=>{this.visibleStatusRefreshTimer=null,this.refreshStatusWhileVisible("visible-poll")},k.VISIBLE_STATUS_REFRESH_INTERVAL_MS))}stopVisibleStatusRefresh(t){this.visibleStatusRefreshTimer&&(this.trace("stopVisibleStatusRefresh instanceId="+this.instanceId+" reason="+t),clearTimeout(this.visibleStatusRefreshTimer),this.visibleStatusRefreshTimer=null)}async refreshStatusWhileVisible(t){this.shouldRunVisibleStatusRefresh()?(await this.loadStatus(!1,t),this.startVisibleStatusRefresh("visible-poll")):this.stopVisibleStatusRefresh(t+":not-visible")}shouldRunVisibleStatusRefresh(){return this.isConnected&&s(F.getPlatformConfig().isElectron)&&"hidden"
1134!==document.visibilityState&&!!this.getWatchedFoldersApi()&&!!this.getScope()}async loadStatus(t=!1,e="manual"){this.loadStatusCount=this.loadStatusCount+1;const i=this.loadStatusCount;if(this.trace("loadStatus start instanceId="+this.instanceId+" #"+i+" reason="+e+" showLoading="+t+" hasSnapshot="+(null!=this.statusSnapshot),!0),this.loadingStatusPromise)return this.trace("loadStatus join in-flight instanceId="+this.instanceId+" #"+i),this.loadingStatusPromise;const o=this.getWatchedFoldersApi(),a=this.getScope();if(!o||!a)return this.trace("loadStatus skipped instanceId="+this.instanceId+" #"+i+" api="+!!o+" scope="+JSON.stringify(a)),this.folders=[],void(this.statusSnapshot=null);const n=k.statusSnapshotCache.get(this.getScopeCacheKey(a));return n&&!this.statusSnapshot&&(this.trace("loadStatus using cached snapshot instanceId="+this.instanceId+" #"+i+" folders="+n.configs.length),this.applyStatusSnapshot(n,a)),t&&!this.statusSnapshot&&(this.trace("loadStatus set isLoading=true instanceId="+this.instanceId+" #"+i+" reason="+e),this.isLoading=!0),this.loadingStatusPromise=(async()=>{try{this.trace("loadStatus invoking getStatus instanceId="+this.instanceId+" #"+i,!0);const t=o.getStatus?await o.getStatus({scope:a}):{scope:a,configs:await o.list({scope:a}),queueSummaries:[],attentionItems:[]};this.applyStatusSnapshot(t,a),this.trace("loadStatus success instanceId="+this.instanceId+" #"+i+" folders="+this.folders.length+" queueSummaries="+m.nullSafeToString(t.queueSummaries?.length))}catch(t){this.log.warn("Failed to load watched folders. message="+m.nullSafeToString(t?.message)),x.showErrorDialog("Failed to load watched folders.")}finally{this.isLoading=!1,this.loadingStatusPromise=null,this.trace("loadStatus finish instanceId="+this.instanceId+" #"+i+" isLoading="+this.isLoading)}})(),this.loadingStatusPromise}getActiveInstanceSummary(){return Array.from(k.activeInstanceIds.values()).join(",")}trace(t,e=!1){const i="WatchedFolderSettings "+t+(e?" stack="+this.getDebugStack():"");this.log.debug(i),F.isDevMode()&&console.info("[WF-DEBUG] "+i)}getDebugStack(){return(new Error("watched-folder-settings trace").stack||"").split("\n").slice(2,8).map(t=>t.trim()).join(" | ")}describeChangedProperties(t){return Array.from(t.keys()).map(t=>String(t)).join(",")}async addFolder(){const t=this.getWatchedFoldersApi(),e=this.getScope();if(!t||!e)return;const i=await t.chooseFolder();if(!i)return;const o=this.createConfigRequest(i,e);try{const e=await t.scanSetupFolder(o);this.pendingSetupConfig=o,this.pendingSupportedFileCount=e.supportedFileCount||0,this.setupDecision="watch-new-files-only",v(this.pendingSupportedFileCount)?(this.log.info("WatchedFolderSettings addFolder setup warning path="+i+" supportedFileCount="+this.pendingSupportedFileCount),this.setupDialogOpened=!0):(this.log.info("WatchedFolderSettings addFolder no existing supported files path="+i),await this.confirmSetup("watch-new-files-only"))}catch(t){x.showErrorDialog(m.nullSafeToString(t?.message))}}createConfigRequest(t,e){return{id:this.createId(),scope:e,path:t,enabled:!1,importOptions:{splitPdf:!1}}}createId(){const t=window.crypto;return t?.randomUUID?t.randomUUID():"watched-folder-"+Date.now()+"-"+Math.round(1e6*Math.random())}cancelSetup(){this.pendingSetupConfig=null,this.pendingSupportedFileCount=0,this.setupDecision="watch-new-files-only",this.setupConfirmationInProgress=!1,this.setupDialogOpened=!1}async watchNewFilesOnly(){await this.confirmSetup("watch-new-files-only")}async continueSetupDecision(){"import-existing-files-too"!==this.setupDecision?await this.watchNewFilesOnly():await this.importExistingFilesSelected()}async importExistingFilesSelected(){if(b("import-existing-files-too",this.pendingSupportedFileCount))return this.setupDialogOpened=!1,void(this.confirmImportExistingDialogOpened=!0);this.setupDialogOpened=!1,await this.confirmSetup("import-existing-files-too")}async importExistingFilesConfirmed(){await this.confirmSetup("import-existing-files-too")}async confirmSetup(t){const e=this.getWatchedFoldersApi();if(e&&this.pendingSetupConfig)if(this.setupConfirmationInProgress)this.log.info("WatchedFolderSettings confirmSetup ignored duplicate decision="+t+" path="+this.pendingSetupConfig.path);else{this.setupConfirmationInProgress=!0;try{this.log.info("WatchedFolderSettings confirmSetup decision="+t+" path="+this.pendingSetupConfig.path),await e.confirmSetup(this.pendingSetupConfig,t),this.cancelSetup(),this.confirmImportExistingDialogOpened=!1,await this.loadStatus(!1,"confirmSetup")}catch(t){this.setupConfirmationInProgress=!1,x.showErrorDialog(m.nullSafeToString(t?.message))}}}async toggleEnabled(t,e){"boolean"==typeof e?w(t,e)?(this.log.info("WatchedFolderSettings toggleEnabled update folderId="+t.id+" enabled="+e),await this.updateFolder({...t,enabled:e})):this.log.info("WatchedFolderSettings toggleEnabled ignored no-op folderId="+t.id+" enabled="+e):this.log.info("WatchedFolderSettings toggleEnabled ignored non-boolean folderId="+t.id+" value="+String(e))}async toggleEnabledFromClick(t,e){t.preventDefault(),t.stopPropagation(),this.log.info("WatchedFolderSettings toggleEnabledFromClick folderId="+e.id+" current="+e.enabled+" next="+!e.enabled),await this.toggleEnabled(e,!e.enabled)}async toggleSplitPdf(t,e){"boolean"==typeof e?y(t,e)?(this.log.info("WatchedFolderSettings toggleSplitPdf update folderId="+t.id+" splitPdf="+e),await this.updateFolder({...t,importOptions:{...t.importOptions,splitPdf:e}})):this.log.info("WatchedFolderSettings toggleSplitPdf ignored no-op folderId="+t.id+" splitPdf="+e):this.log.info("WatchedFolderSettings toggleSplitPdf ignored non-boolean folderId="+t.id+" value="+String(e))}async toggleSplitPdfFromClick(t,e){t.preventDefault(),t.stopPropagation();const i=!0===e.importOptions?.splitPdf;this.log.info("WatchedFolderSettings toggleSplitPdfFromClick folderId="+e.id+" current="+i+" next="+!i),await this.toggleSplitPdf(e,!i)}async updateFolder(t){const e=this.getWatchedFoldersApi();if(!e)return;const i=this.folders.find(e=>e.id===t.id);if(!i||S(i,t))try{this.log.info("WatchedFolderSettings updateFolder sending folderId="+t.id+" enabled="+t.enabled+" splitPdf="+t.importOptions?.splitPdf),await e.update(t),await this.loadStatus(!1,"updateFolder")}catch(t){x.showErrorDialog(m.nullSafeToString(t?.message))}else this.log.info("WatchedFolderSettings updateFolder ignored unchanged folderId="+t.id+" enabled="+t.enabled+" splitPdf="+t.importOptions?.splitPdf)}async removeFolder(t){const e=this.getWatchedFoldersApi();e&&(await e.remove(t.id,t.scope),await this.loadStatus(!1,"removeFolder"))}async resumeFolder(t){const e=this.getWatchedFoldersApi();e&&(await e.resumeFolder(t.id,t.scope),await this.loadStatus(!1,"resumeFolder"))}async ignoreDetectedAndResume(t){const e=this.getWatchedFoldersApi();e&&(await e.ignoreDetectedAndResume(t.id,t.scope),await this.loadStatus(!1,"ignoreDetectedAndResume"))}async disableFolder(t){const e=this.getWatchedFoldersApi();e&&(await e.disable(t.id,t.scope),await this.loadStatus(!1,"disableFolder"))}async retryAttentionItem(t,e){const i=this.getWatchedFoldersApi();if(i)try{await i.retryItems([e.id],t.scope),await this.loadStatus(!1,"retryAttentionItem")}catch(t){x.showErrorDialog(m.nullSafeToString(t?.message))}}async ignoreAttentionItem(t,e){const i=this.getWatchedFoldersApi();if(i)try{await i.ignoreItems([e.id],t.scope),await this.loadStatus(!1,"ignoreAttentionItem")}catch(t){x.showErrorDialog(m.nullSafeToString(t?.message))}}async clearAttentionItemError(t,e){const i=this.getWatchedFoldersApi();
1134if(i)try{await i.clearItemErrors([e.id],t.scope),await this.loadStatus(!1,"clearAttentionItemError")}catch(t){x.showErrorDialog(m.nullSafeToString(t?.message))}}async openFolder(t){const e=this.getWatchedFoldersApi();if(e?.openFolder)try{this.log.info("WatchedFolderSettings open folder requested folderId="+t.id+" path="+t.path),await e.openFolder(t.id,t.scope)}catch(e){this.log.warn("Failed to open watched folder. folderId="+t.id+" path="+t.path+" message="+m.nullSafeToString(e?.message)),x.showErrorDialog("Failed to open watched folder.")}else x.showErrorDialog("Opening watched folders is not available.")}};$.instanceCounter=0,$.statusSnapshotCache=new Map,$.activeInstanceIds=new Set,$.VISIBLE_STATUS_REFRESH_INTERVAL_MS=7e3,t([e({attribute:!1})],$.prototype,"folders",void 0),t([e({attribute:!1})],$.prototype,"statusSnapshot",void 0),t([e({attribute:!1})],$.prototype,"isLoading",void 0),t([e({attribute:!1})],$.prototype,"setupDialogOpened",void 0),t([e({attribute:!1})],$.prototype,"confirmImportExistingDialogOpened",void 0),t([e({attribute:!1})],$.prototype,"setupConfirmationInProgress",void 0),t([e({attribute:!1})],$.prototype,"setupDecision",void 0),t([e({attribute:!1})],$.prototype,"pendingSetupConfig",void 0),t([e({attribute:!1})],$.prototype,"pendingSupportedFileCount",void 0),t([e({attribute:!1})],$.prototype,"expandedAttentionItemIds",void 0),$=k=t([i("watched-folder-settings")],$);let D=class extends o{static get styles(){return[a,n`
1135        .toppanel {
1136          width: 100%;
1137          height: calc(100vh - 64px - var(--app-safe-area-inset-top) - var(--app-safe-area-inset-bottom, 0px));
1138          overflow-y: auto;
1139          overflow-x: hidden;
1140          box-sizing: border-box;
1141          padding-bottom: var(--app-safe-area-inset-bottom, 0px);
1142        }
1143
1144        .content {
1145          max-width: 1000px;
1146          margin: 0 auto;
1147          padding: 0 24px 48px;
1148          box-sizing: border-box;
1149        }
1150
1151        .header {
1152          display: flex;
1153          align-items: center;
1154          margin-top: 28px;
1155          margin-bottom: 24px;
1156        }
1157      `]}render(){return r`
1158      <div class="toolbar">
1159        <toggle-button></toggle-button>
1160        <span style="font-size: 20px; margin-left: 20px;">Auto Import Folders</span>
1161      </div>
1162      <div class="toppanel">
1163        <div class="content">
1164          <div class="header">
1165            <div class="page-header" style="flex-grow: 1;">Auto Import Folders</div>
1166          </div>
1167          <watched-folder-settings></watched-folder-settings>
1168        </div>
1169      </div>
1170    `}};D=t([i("watched-folder-settings-page")],D);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.