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.