1
src/assets/svg-icon/library-tabs/catalog-active.svg
Normal file
|
After Width: | Height: | Size: 19 KiB |
1
src/assets/svg-icon/library-tabs/catalog-default.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
1
src/assets/svg-icon/library-tabs/device-active.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M3.02368 10.4363L1.86255 10.4363C1.50007 10.4363 1.17937 10.2093 1.05529 9.86943C0.931217 9.52711 1.02367 9.1372 1.29858 8.90247L10.4217 1.20006C10.7428 0.928644 11.2175 0.928644 11.5386 1.20006L20.6507 8.90247L20.6728 8.9247L20.6949 8.94692L20.7281 8.96915L20.7391 8.99138L20.7613 9.02473L20.7834 9.04696L20.8055 9.0803L20.8276 9.10253L20.8387 9.13587L20.8608 9.1581L20.8718 9.19145L20.8829 9.22479L20.894 9.24702L20.905 9.28036L20.9161 9.31371L20.9271 9.34705L20.9382 9.38039L20.9382 9.41374L20.9493 9.44708L20.9493 9.46931L20.9493 9.50265L20.9493 9.536L20.9603 9.56934L20.9493 9.60268L20.9493 9.63603L20.9493 9.66937L20.9382 9.70272L20.9382 9.73606L20.9271 9.7694L20.9271 9.80275L20.9161 9.83609L20.905 9.86943C20.7809 10.2118 20.4492 10.4363 20.0867 10.4363L18.9366 10.4363L18.9366 19.2835C18.9366 19.7456 18.754 20.1895 18.4279 20.5172C18.102 20.8448 17.6603 21.0285 17.2005 21.0285L4.74878 21.0285C4.28899 21.0285 3.85835 20.8448 3.53236 20.5172C3.20635 20.1895 3.02368 19.7456 3.02368 19.2835L3.02368 10.4363ZM5.66662 8.68017L5.66662 13.0927L10.09 13.0927L10.09 8.68017L5.66662 8.68017ZM5.66662 14.8599L5.66662 19.2724L10.09 19.2724L10.09 14.8599L5.66662 14.8599ZM11.8593 14.8599L11.8593 19.2724L16.2716 19.2724L16.2716 14.8599L11.8593 14.8599Z" fill="url(#linear_fill_291_91)" ></path><defs><linearGradient id="linear_fill_291_91" x1="18.4471435546875" y1="21.029296875" x2="7.7799072265625" y2="3.1552734375" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FB7315" /><stop offset="1" stop-color="#F0AF6D" /></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
1
src/assets/svg-icon/library-tabs/device-default.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M3.02368 10.4363L1.86255 10.4363C1.50007 10.4363 1.17937 10.2093 1.05529 9.86943C0.931217 9.52711 1.02367 9.1372 1.29858 8.90247L10.4217 1.20006C10.7428 0.928644 11.2175 0.928644 11.5386 1.20006L20.6507 8.90247L20.6728 8.9247L20.6949 8.94692L20.7281 8.96915L20.7391 8.99138L20.7613 9.02473L20.7834 9.04696L20.8055 9.0803L20.8276 9.10253L20.8387 9.13587L20.8608 9.1581L20.8718 9.19145L20.8829 9.22479L20.894 9.24702L20.905 9.28036L20.9161 9.31371L20.9271 9.34705L20.9382 9.38039L20.9382 9.41374L20.9493 9.44708L20.9493 9.46931L20.9493 9.50265L20.9493 9.536L20.9603 9.56934L20.9493 9.60268L20.9493 9.63603L20.9493 9.66937L20.9382 9.70272L20.9382 9.73606L20.9271 9.7694L20.9271 9.80275L20.9161 9.83609L20.905 9.86943C20.7809 10.2118 20.4492 10.4363 20.0867 10.4363L18.9366 10.4363L18.9366 19.2835C18.9366 19.7456 18.754 20.1895 18.4279 20.5172C18.102 20.8448 17.6603 21.0285 17.2005 21.0285L4.74878 21.0285C4.28899 21.0285 3.85835 20.8448 3.53236 20.5172C3.20635 20.1895 3.02368 19.7456 3.02368 19.2835L3.02368 10.4363ZM5.66662 8.68017L5.66662 13.0927L10.09 13.0927L10.09 8.68017L5.66662 8.68017ZM5.66662 14.8599L5.66662 19.2724L10.09 19.2724L10.09 14.8599L5.66662 14.8599ZM11.8593 14.8599L11.8593 19.2724L16.2716 19.2724L16.2716 14.8599L11.8593 14.8599Z" stroke="rgba(102, 102, 102, 1)" stroke-width="0.6" ></path></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
1
src/assets/svg-icon/library-tabs/process-active.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><g clip-path="url(#clip-path-291_83)"><path d="M19.4924 7.20204L4.42458 7.20204C3.52769 7.20204 2.72048 7.82987 2.45141 8.63709L0.747314 14.8257L0.747314 3.16597C0.747314 2.44845 1.28545 2 1.82359 2L7.11526 2C7.38433 2 7.6534 2.08969 7.92246 2.35876L10.1647 4.60102C10.2544 4.69071 10.2544 4.69071 10.3441 4.69071L18.3264 4.69071C18.9543 4.69071 19.4027 5.13916 19.4027 5.767L19.4027 7.20204L19.4924 7.20204ZM21.1068 8.5474C21.4656 8.5474 21.8243 8.72678 22.0037 8.99585C22.1831 9.26492 22.2728 9.62368 22.1831 9.98244L19.8512 18.3236C19.7615 18.7721 19.313 19.1309 18.7749 19.1309L2.09266 19.1309C1.46483 18.9515 1.10607 18.3236 1.28545 17.7855L3.61737 9.4443C3.70706 8.99585 4.15551 8.63709 4.69365 8.63709L21.1068 8.63709L21.1068 8.5474ZM11.8688 15.2742L14.6492 18.0546L16.3533 16.3505L13.5729 13.6597C13.7523 13.1216 13.842 12.5835 13.7523 12.0453C13.6626 11.5072 13.3935 10.969 12.9451 10.5206C12.4966 10.0721 11.9585 9.80306 11.3307 9.71337C10.7028 9.62368 10.075 9.71337 9.53687 9.98244L11.51 11.8659L10.1647 13.2113L8.10184 11.2381C7.83278 11.7762 7.74309 12.3144 7.83278 12.9422C7.92246 13.5701 8.19153 14.1082 8.72967 14.5567C9.17812 15.0051 9.71625 15.2742 10.2544 15.3639C10.7925 15.5432 11.3307 15.4536 11.8688 15.2742Z" fill="url(#linear_fill_291_85)" ></path></g><defs><clipPath id="clip-path-291_83"><path d="M22 22L0 22L0 0L22 0L22 22Z" fill="white"/></clipPath><linearGradient id="linear_fill_291_85" x1="18.4659423828125" y1="19.130859375" x2="5.65625" y2="2" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FD6D0C" /><stop offset="1" stop-color="#EFB271" /></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
1
src/assets/svg-icon/library-tabs/process-default.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M18.4288 7.20204L4.21593 7.20204C3.36993 7.20204 2.60852 7.82987 2.35472 8.63709L0.747314 14.8257L0.747314 3.16597C0.747314 2.44845 1.25492 2 1.76252 2L6.75394 2C7.00774 2 7.26155 2.08969 7.51535 2.35876L9.63036 4.60102C9.71496 4.69071 9.71496 4.69071 9.79956 4.69071L17.329 4.69071C17.9212 4.69071 18.3442 5.13916 18.3442 5.767L18.3442 7.20204L18.4288 7.20204ZM19.9516 8.5474C20.29 8.5474 20.6284 8.72678 20.7976 8.99585C20.9668 9.26492 21.0514 9.62368 20.9668 9.98244L18.7672 18.3236C18.6826 18.7721 18.2596 19.1309 17.752 19.1309L2.01632 19.1309C1.42412 18.9515 1.08572 18.3236 1.25492 17.7855L3.45453 9.4443C3.53913 8.99585 3.96213 8.63709 4.46973 8.63709L19.9516 8.63709L19.9516 8.5474ZM11.2378 15.2742L13.8604 18.0546L15.4678 16.3505L12.8452 13.6597C13.0144 13.1216 13.099 12.5835 13.0144 12.0453C12.9298 11.5072 12.676 10.969 12.253 10.5206C11.83 10.0721 11.3224 9.80306 10.7302 9.71337C10.138 9.62368 9.54576 9.71337 9.03815 9.98244L10.8994 11.8659L9.63036 13.2113L7.68455 11.2381C7.43075 11.7762 7.34615 12.3144 7.43075 12.9422C7.51535 13.5701 7.76915 14.1082 8.27675 14.5567C8.69975 15.0051 9.20735 15.2742 9.71496 15.3639C10.2226 15.5432 10.7302 15.4536 11.2378 15.2742Z" stroke="rgba(102, 102, 102, 1)" stroke-width="0.6" ></path></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 19 KiB |
1
src/assets/svg-icon/library-tabs/risk-active.svg
Normal file
|
After Width: | Height: | Size: 9.9 KiB |
1
src/assets/svg-icon/library-tabs/risk-default.svg
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
1
src/assets/svg-icon/library-tabs/rule-active.svg
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
1
src/assets/svg-icon/library-tabs/rule-default.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M14.0769 3C15.5541 3 16.5389 3.783 16.5389 5.0124L16.5389 15.969C16.5389 16.3042 16.2922 16.5279 15.9232 16.5279L5.58443 16.5279C4.84631 16.5279 4.10768 16.8631 4.10768 17.4225L4.10768 18.6524C4.10768 19.2112 4.96965 19.7701 5.70777 19.7701L16.5384 19.7701C17.1537 19.7701 17.7695 19.2112 17.7695 18.6524L17.7695 5.68335C17.7695 5.34765 18.0152 5.124 18.3847 5.124C18.7538 5.124 19 5.45971 19 5.68335L19 18.876C19 19.9938 17.8923 21 16.5384 21L5.33823 21C4.23054 20.8884 3.12285 20.1054 3 19.0992L3 5.0124C2.9995 3.67095 4.35388 3 5.70777 3L14.0769 3ZM10.7052 10.2243L10.2817 10.2243L10.2817 11.006L8.61867 11.006L8.61867 11.3907L10.1881 11.3907C10.1343 11.4799 10.0772 11.5674 10.017 11.6532C9.9568 11.7389 9.89352 11.8228 9.82717 11.9047C9.76083 11.9867 9.69156 12.0666 9.61934 12.1443C9.54714 12.2221 9.47217 12.2976 9.39444 12.3708C9.3194 12.4411 9.24238 12.5096 9.16341 12.5763C9.08445 12.643 9.00366 12.7078 8.921 12.7707C8.83837 12.8336 8.75398 12.8945 8.66786 12.9535C8.58175 13.0124 8.49403 13.0693 8.40467 13.1241L8.68555 13.4926C8.85656 13.3765 9.02172 13.2538 9.18104 13.1246C9.34035 12.9955 9.49323 12.8603 9.63966 12.7191C9.87744 12.4869 10.0915 12.2358 10.2817 11.9658L10.2817 13.8369L10.7052 13.8369L10.7052 11.9658C10.8925 12.2385 11.108 12.4896 11.3517 12.7191C11.5019 12.8582 11.659 12.9907 11.8228 13.1165C11.9866 13.2424 12.1566 13.361 12.3326 13.4724L12.5823 13.0876C12.4915 13.0348 12.4024 12.9798 12.3148 12.9227C12.2272 12.8656 12.1414 12.8064 12.0572 12.7452C11.9731 12.684 11.8908 12.6208 11.8103 12.5557C11.7298 12.4905 11.6513 12.4235 11.5746 12.3546C11.4972 12.2837 11.4227 12.2102 11.3513 12.1342C11.2799 12.0582 11.2117 11.9799 11.1468 11.8992C11.0819 11.8185 11.0204 11.7357 10.9623 11.6509C10.9042 11.566 10.8498 11.4793 10.7989 11.3907L12.395 11.3907L12.395 11.006L10.7052 11.006L10.7052 10.2243ZM11.2804 10.2284L11.0173 10.4754C11.2343 10.6482 11.4468 10.825 11.6549 11.006L11.9269 10.7427L11.2804 10.2284ZM11.3339 5.7081L10.9237 5.7081L10.9237 6.24271L9.99188 6.24271L9.99188 6.60315L10.9237 6.60315L10.9237 7.10535L10.0142 7.10535L10.0142 7.46175L10.4868 7.46175L10.1836 7.60754C10.2668 7.78846 10.3649 7.96125 10.4779 8.12596C10.57 8.25825 10.674 8.3811 10.79 8.4945C10.634 8.5855 10.472 8.6665 10.304 8.7375C10.0721 8.83743 9.83578 8.92787 9.59507 9.00885L9.81354 9.38146C10.0761 9.27843 10.3347 9.16772 10.5893 9.04935C10.7677 8.96565 10.94 8.8725 11.1065 8.7699C11.264 8.886 11.432 8.98996 11.6103 9.08175C11.8511 9.20596 12.0993 9.318 12.3549 9.4179L12.5109 9.021C12.2874 8.95601 12.0705 8.87635 11.86 8.78204C11.7831 8.74715 11.7081 8.70908 11.6352 8.66782C11.5622 8.62656 11.4915 8.58228 11.423 8.535C11.5746 8.4054 11.7084 8.26096 11.8243 8.10165C11.961 7.90454 12.077 7.69529 12.1721 7.4739L12.1721 7.10535L11.3339 7.10535L11.3339 6.60315L12.4218 6.60315L12.4218 6.24271L11.3339 6.24271L11.3339 5.7081ZM9.46132 5.7324L9.05115 5.7324L9.05115 6.40875L8.54288 6.40875L8.54288 6.79754L9.05115 6.79754L9.05115 7.49821C8.82823 7.5684 8.60381 7.6305 8.37791 7.6845L8.50721 8.08546L9.05115 7.91129L9.05115 8.72535C9.05146 8.76095 9.04699 8.79605 9.03776 8.83065C9.03513 8.83949 9.03157 8.848 9.02706 8.85617C9.02257 8.86434 9.01721 8.87204 9.01102 8.87925C9.0062 8.88377 9.00105 8.88795 8.99556 8.8918C8.99008 8.89565 8.98431 8.89911 8.97828 8.90219C8.97224 8.90527 8.96599 8.90794 8.95951 8.9102C8.95304 8.91247 8.94644 8.91432 8.93969 8.91571C8.92071 8.91973 8.90149 8.92242 8.88206 8.92377C8.86263 8.92513 8.8432 8.92515 8.82376 8.92379L8.52503 8.92379L8.6053 9.2964L8.95306 9.2964C9.03925 9.2964 9.12397 9.28829 9.2072 9.2721C9.26664 9.2586 9.32013 9.2316 9.3677 9.1911C9.38157 9.17544 9.39374 9.15876 9.40423 9.14106C9.41472 9.12336 9.42335 9.10493 9.43012 9.08579C9.45092 9.0156 9.46132 8.94404 9.46132 8.87115L9.46132 7.78575L9.96514 7.63185L9.90716 7.43746L9.84476 7.239L9.46132 7.3686L9.46132 6.79754L9.88934 6.79754L9.88934 6.40875L9.46132 6.40875L9.46132 5.7324ZM11.7307 7.46175C11.715 7.50095 11.6979 7.53966 11.6795 7.57785C11.6611 7.61605 11.6414 7.65369 11.6203 7.69076C11.5992 7.72781 11.5769 7.76422 11.5532 7.79997C11.5296 7.83572 11.5047 7.87076 11.4786 7.90505C11.4525 7.93935 11.4252 7.97287 11.3967 8.00558C11.3682 8.03829 11.3386 8.07015 11.3079 8.10114C11.2771 8.13213 11.2453 8.1622 11.2125 8.19133C11.1797 8.22047 11.1458 8.24863 11.111 8.27579C11.0576 8.22332 11.0071 8.16867 10.9594 8.11184C10.9118 8.05501 10.8672 7.99626 10.8256 7.9356C10.7243 7.78392 10.6366 7.62596 10.5626 7.46175L11.7307 7.46175ZM16.046 17.6461L5.95398 17.6461C5.58443 17.6461 5.33823 17.8694 5.33823 18.205C5.33823 18.5403 5.58443 18.764 5.95398 18.764L16.046 18.764C16.4156 18.764 16.6618 18.5403 16.6618 18.205C16.6618 17.8694 16.4156 17.6461 16.046 17.6461Z" stroke="rgba(102, 102, 102, 1)" stroke-width="0.6" ></path></svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
1
src/assets/svg-icon/library-tabs/standard-active.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M4 2.51875L4 17.5375C4 18.325 4.69231 19 5.5 19L17.9615 19C18.6538 19 19 18.6063 19 17.8188C19 17.2563 18.5385 16.75 17.9615 16.75L6.94231 16.75C6.48077 16.75 6.19231 16.4125 6.19231 16.0187C6.19231 15.625 6.48077 15.2312 6.94231 15.2312L17.5 15.2312C18.3077 15.2312 19 14.5562 19 13.7125L19 2.51875C19 1.675 18.3077 1 17.5 1L12.25 1L12.25 8.14375C12.25 8.25625 12.1923 8.3125 12.1346 8.425C12.0192 8.5375 11.7308 8.5375 11.5577 8.425C11.4423 8.3125 9.94231 7.01875 9.94231 7.01875C9.94231 7.01875 8.44231 8.25625 8.32692 8.425C8.21154 8.5375 7.92308 8.5375 7.75 8.425C7.80769 8.3125 7.75 8.2 7.75 8.14375L7.75 1L5.5 1C4.69231 1 4 1.675 4 2.51875Z" fill="url(#linear_fill_291_88)" ></path><defs><linearGradient id="linear_fill_291_88" x1="19" y1="19" x2="5.449951171875" y2="1" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FC7010" /><stop offset="1" stop-color="#EFB271" /></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
1
src/assets/svg-icon/library-tabs/standard-default.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22" fill="none"><path d="M4 2.51875L4 17.5375C4 18.325 4.69231 19 5.5 19L17.9615 19C18.6538 19 19 18.6063 19 17.8188C19 17.2563 18.5385 16.75 17.9615 16.75L6.94231 16.75C6.48077 16.75 6.19231 16.4125 6.19231 16.0187C6.19231 15.625 6.48077 15.2312 6.94231 15.2312L17.5 15.2312C18.3077 15.2312 19 14.5562 19 13.7125L19 2.51875C19 1.675 18.3077 1 17.5 1L12.25 1L12.25 8.14375C12.25 8.25625 12.1923 8.3125 12.1346 8.425C12.0192 8.5375 11.7308 8.5375 11.5577 8.425C11.4423 8.3125 9.94231 7.01875 9.94231 7.01875C9.94231 7.01875 8.44231 8.25625 8.32692 8.425C8.21154 8.5375 7.92308 8.5375 7.75 8.425C7.80769 8.3125 7.75 8.2 7.75 8.14375L7.75 1L5.5 1C4.69231 1 4 1.675 4 2.51875Z" stroke="rgba(102, 102, 102, 1)" stroke-width="0.6" ></path></svg>
|
||||
|
After Width: | Height: | Size: 863 B |
1
src/assets/svg-icon/menu/ai-read.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M19.1617 3.59961L19.1617 21.5996L21.6001 21.5996L21.6001 3.59961L19.1617 3.59961ZM6.9661 3.59961C5.95929 3.59961 5.1421 4.40841 5.1421 5.39122L5.1421 19.8092C5.1421 20.798 5.95929 21.5996 6.9661 21.5996L17.3341 21.5996L17.3341 3.59961L6.9661 3.59961ZM10.5613 8.39961L11.9161 8.39961L14.8969 15.734L13.4377 15.734L12.6253 13.7336L9.85571 13.7336L9.0409 15.734L7.58171 15.734L10.5613 8.39961ZM11.2381 10.3232L10.3957 12.3992L12.0841 12.3992L11.2393 10.3232L11.2381 10.3232ZM4.2289 7.19961L2.40009 7.19961L2.40009 10.7996L4.2289 10.7996L4.2289 7.19961ZM4.2289 12.5996L2.40009 12.5996L2.40009 16.1996L4.2289 16.1996L4.2289 12.5996Z" fill="#4A4A4A" ></path></svg>
|
||||
|
After Width: | Height: | Size: 807 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14.00347900390625" height="17" viewBox="0 0 14.00347900390625 17" fill="none"><path fill-rule="evenodd" fill="#FFFFFF" d="M0.521953 16.3701C0.133663 15.9963 -0.0506157 15.4902 0.0119531 14.9901C0.392545 12.0814 1.92635 10.8866 3.04195 10.0101C3.82497 9.39572 4.20195 9.07317 4.20195 8.5001C4.20195 7.93434 3.82245 7.62292 3.04195 7.0201C1.9118 6.14732 0.36581 4.94773 0.0119531 2.0001C-0.0459965 1.49809 0.141423 0.9941 0.531953 0.6201C0.950898 0.22077 1.54934 0.0001 2.17195 0.0001L11.832 0.0001C12.4536 0.0001 13.0437 0.22111 13.462 0.6201C13.8536 0.99359 14.0495 1.49758 13.992 2.0001C13.6367 4.95725 12.0765 6.16086 10.942 7.0401C10.1689 7.63952 9.80195 7.95321 9.80195 8.5001C9.80195 9.05447 10.1768 9.3681 10.952 9.9801C12.0733 10.8621 13.6095 12.0724 13.992 14.9901C14.0545 15.4902 13.8602 15.9963 13.472 16.3701C13.052 16.7742 12.4592 17.0001 11.832 17.0001L2.17195 17.0001C1.54473 17.0001 0.941878 16.7742 0.521953 16.3701ZM2.79905 14.0701C3.95751 13.0517 6.29905 12.3281 6.29905 11.1601L6.29905 7.2901C6.29905 6.53679 4.63766 5.96202 3.60905 4.7401C3.43931 4.53869 3.45765 4.2501 3.88905 4.2501L10.1291 4.2501C10.497 4.2501 10.5762 4.52825 10.4091 4.7301C9.39535 5.95388 7.69905 6.53308 7.69905 7.2901L7.69905 11.1601C7.69905 12.3186 10.1389 12.9367 11.2191 14.0701C11.6544 14.527 11.5002 15.1801 10.8191 15.1801L3.19905 15.1801C2.51653 15.1801 2.32045 14.4936 2.79905 14.0701Z"></path></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path fill-rule="evenodd" fill="#4A4A4A" d="M4.6 19.37C4.15624 18.9962 3.93849 18.4901 4.01 17.99C4.44496 15.0813 6.19503 13.8865 7.47 13.01C8.36488 12.3956 8.8 12.0731 8.8 11.5C8.8 10.9342 8.372 10.6228 7.48 10.02C6.18839 9.14722 4.41441 7.94763 4.01 5C3.94377 4.49799 4.16368 3.994 4.61 3.62C5.08879 3.22067 5.76845 3 6.48 3L17.52 3C18.2304 3 18.902 3.22101 19.38 3.62C19.8276 3.99349 20.0457 4.49748 19.98 5C19.574 7.95715 17.8066 9.16076 16.51 10.04C15.6265 10.6394 15.2 10.9531 15.2 11.5C15.2 12.0544 15.6241 12.368 16.51 12.98C17.7915 13.862 19.543 15.0723 19.98 17.99C20.0515 18.4901 19.8438 18.9962 19.4 19.37C18.9201 19.7741 18.2368 20 17.52 20L6.48 20C5.76317 20 5.07991 19.7741 4.6 19.37ZM7.1995 17.07C8.52345 16.0516 11.1995 15.328 11.1995 14.16L11.1995 10.29C11.1995 9.53669 9.29505 8.96192 8.1195 7.74C7.92551 7.53859 7.94647 7.25 8.4395 7.25L15.5795 7.25C16 7.25 16.0905 7.52815 15.8995 7.73C14.741 8.95378 12.7995 9.53298 12.7995 10.29L12.7995 14.16C12.7995 15.3185 15.585 15.9366 16.8195 17.07C17.317 17.5269 17.138 18.18 16.3595 18.18L7.6595 18.18C6.87947 18.18 6.65252 17.4935 7.1995 17.07Z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="17.966796875" viewBox="0 0 16 17.966796875" fill="none"><path d="M15.9997 15.1429L15.9997 2.24566C15.9997 1.0054 14.8976 0 13.5381 0L4.92267 0C3.80024 0.000785964 2.82011 0.693063 2.53809 1.68416L11.3074 1.68416C12.8791 1.68416 14.1534 2.84676 14.1534 4.28067L14.1534 14.9786L14.9996 15.5962C15.2151 15.7535 15.5192 15.7608 15.7435 15.6136C15.9069 15.5035 16.0024 15.3282 15.9997 15.1429Z" fill="#FFFFFF" ></path><path d="M2.46161 2.80713C1.10209 2.80713 0.000129232 3.81252 0.000129232 5.05274L0.000129232 17.3902C-0.00297233 17.5749 0.0914962 17.7496 0.253941 17.8597C0.482811 18.0115 0.795681 18.0011 1.01202 17.8348L6.4616 13.6464L11.9112 17.833C12.1261 17.9983 12.4364 18.0096 12.6651 17.8608C12.8296 17.7509 12.9258 17.5752 12.9232 17.3891L12.9232 5.05274C12.9232 3.81252 11.8211 2.80713 10.4616 2.80713L2.46161 2.80713Z" fill="#FFFFFF" ></path></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M20.9996 18.8565L20.9996 4.49978C20.9996 3.11918 19.7598 2 18.2304 2L8.53801 2C7.27528 2.00087 6.17262 2.77149 5.85535 3.87475L15.7208 3.87475C17.489 3.87475 18.9226 5.16891 18.9226 6.76509L18.9226 18.6736L19.8746 19.3611C20.117 19.5363 20.4591 19.5443 20.7114 19.3806C20.8953 19.2579 21.0027 19.0628 20.9996 18.8565Z" fill="#4A4A4A" ></path><path d="M5.76931 5.12402C4.23985 5.12402 3.00015 6.24319 3.00015 7.62376L3.00015 21.3574C2.99666 21.5629 3.10293 21.7575 3.28568 21.88C3.54316 22.0489 3.89514 22.0375 4.13852 21.8523L10.2693 17.1899L16.4001 21.8503C16.6419 22.0343 16.9909 22.0469 17.2483 21.8812C17.4333 21.7589 17.5415 21.5633 17.5386 21.3562L17.5386 7.62376C17.5386 6.24319 16.2987 5.12402 14.7693 5.12402L5.76931 5.12402Z" fill="#4A4A4A" ></path></svg>
|
||||
|
Before Width: | Height: | Size: 963 B After Width: | Height: | Size: 916 B |
1
src/assets/svg-icon/menu/resource-library.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M20.9996 18.8565L20.9996 4.49978C20.9996 3.11918 19.7598 2 18.2304 2L8.53801 2C7.27528 2.00087 6.17262 2.77149 5.85535 3.87475L15.7208 3.87475C17.489 3.87475 18.9226 5.16891 18.9226 6.76509L18.9226 18.6736L19.8746 19.3611C20.117 19.5363 20.4591 19.5443 20.7114 19.3806C20.8953 19.2579 21.0027 19.0628 20.9996 18.8565Z" fill="#4A4A4A" ></path><path d="M5.76931 5.12402C4.23985 5.12402 3.00015 6.24319 3.00015 7.62376L3.00015 21.3574C2.99666 21.5629 3.10293 21.7575 3.28568 21.88C3.54316 22.0489 3.89514 22.0375 4.13852 21.8523L10.2693 17.1899L16.4001 21.8503C16.6419 22.0343 16.9909 22.0469 17.2483 21.8812C17.4333 21.7589 17.5415 21.5633 17.5386 21.3562L17.5386 7.62376C17.5386 6.24319 16.2987 5.12402 14.7693 5.12402L5.76931 5.12402Z" fill="#4A4A4A" ></path></svg>
|
||||
|
After Width: | Height: | Size: 916 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="17.00146484375" viewBox="0 0 16 17.00146484375" fill="none"><path d="M14.4 16.9998L14.9333 16.9998C15.5224 16.9998 16 16.4562 16 15.7856L16 3.03557C16 2.36498 15.5224 1.82129 14.9333 1.82129L14.4 1.82129C13.8109 1.82129 13.3333 2.36498 13.3333 3.03557L13.3333 15.7856C13.3333 16.4562 13.8109 16.9998 14.4 16.9998Z" fill="#FFFFFF" ></path><path d="M8.53314 5.46428C8.53314 4.79366 9.01071 4.25 9.59981 4.25L11.7331 4.25C12.3222 4.25 12.7998 4.79366 12.7998 5.46428L12.7998 6.52678C12.7998 6.61062 12.7401 6.67857 12.6665 6.67857L8.66647 6.67857C8.59283 6.67857 8.53314 6.61062 8.53314 6.52678L8.53314 5.46428Z" fill="#FFFFFF" ></path><path d="M12.7331 14.5713C12.7699 14.5713 12.7998 14.6053 12.7998 14.6472L12.7998 15.7856C12.7998 16.4562 12.3222 16.9999 11.7331 16.9999L9.59981 16.9999C9.01071 16.9999 8.53314 16.4562 8.53314 15.7856L8.53314 14.6472C8.53314 14.6053 8.56301 14.5713 8.59978 14.5713L12.7331 14.5713Z" fill="#FFFFFF" ></path><rect transform="matrix(-1, 0, 0, 1, 12.7998046875, 7.892578125)" x="0" y="0" width="4.266664505004883" height="5.46428108215332" rx="2" fill="#FFFFFF" ></rect><path d="M5.86666 17L6.93334 17C7.52243 17 8 16.4563 8 15.7857L8 1.21431C8 0.543659 7.52243 0 6.93334 0L5.86666 0C5.27757 0 4.8 0.543659 4.8 1.21431L4.8 15.7857C4.8 16.4563 5.27757 17 5.86666 17Z" fill="#FFFFFF" ></path><path d="M0.00344515 15.6888L1.07778 2.78704C1.1271 2.19325 1.64247 1.76248 2.22879 1.82669L3.29045 1.94053C3.87677 2.00382 4.31213 2.53659 4.2628 3.13054L3.18847 16.0323C3.13914 16.6261 2.62378 17.0568 2.03746 16.9926L0.975799 16.8788C0.389477 16.8155 -0.0458808 16.2827 0.00344515 15.6888Z" fill="#FFFFFF" ></path></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M20 21.9997L20.6667 21.9997C21.403 21.9997 22 21.3601 22 20.5711L22 5.57115C22 4.78222 21.403 4.14258 20.6667 4.14258L20 4.14258C19.2636 4.14258 18.6667 4.78222 18.6667 5.57115L18.6667 20.5711C18.6667 21.3601 19.2636 21.9997 20 21.9997Z" fill="#4A4A4A" ></path><path d="M12.6664 8.42857C12.6664 7.6396 13.2634 7 13.9998 7L16.6664 7C17.4028 7 17.9998 7.6396 17.9998 8.42857L17.9998 9.67857C17.9998 9.7772 17.9251 9.85714 17.8331 9.85714L12.8331 9.85714C12.741 9.85714 12.6664 9.7772 12.6664 9.67857L12.6664 8.42857Z" fill="#4A4A4A" ></path><path d="M17.9164 19.1426C17.9624 19.1426 17.9998 19.1826 17.9998 19.2319L17.9998 20.5711C17.9998 21.3601 17.4028 21.9997 16.6664 21.9997L13.9998 21.9997C13.2634 21.9997 12.6664 21.3601 12.6664 20.5711L12.6664 19.2319C12.6664 19.1826 12.7038 19.1426 12.7497 19.1426L17.9164 19.1426Z" fill="#4A4A4A" ></path><rect transform="matrix(-1, 0, 0, 1, 17.999755859375, 11.28515625)" x="0" y="0" width="5.333331108093262" height="6.42856502532959" rx="2" fill="#4A4A4A" ></rect><path d="M9.33332 22L10.6667 22C11.403 22 12 21.3604 12 20.5714L12 3.4286C12 2.6396 11.403 2 10.6667 2L9.33332 2C8.59696 2 8 2.6396 8 3.4286L8 20.5714C8 21.3604 8.59696 22 9.33332 22Z" fill="#4A4A4A" ></path><path d="M2.00431 20.4574L3.34722 5.27893C3.40888 4.58036 4.05308 4.07357 4.78599 4.1491L6.11306 4.28303C6.84597 4.3575 7.39016 4.98429 7.32851 5.68304L5.98559 20.8616C5.92393 21.5601 5.27973 22.0669 4.54682 21.9914L3.21975 21.8575C2.48685 21.783 1.94265 21.1562 2.00431 20.4574Z" fill="#4A4A4A" ></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -189,7 +189,10 @@ function triggerUpload() {
|
||||
const el = uploadInstRef.value?.$el;
|
||||
if (el) {
|
||||
const input = el.querySelector('input[type="file"]') as HTMLInputElement;
|
||||
input?.click();
|
||||
if (input) {
|
||||
input.value = '';
|
||||
input.click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'layout.base',
|
||||
meta: {
|
||||
title: 'ai-assistant',
|
||||
i18nKey: 'route.ai-assistant'
|
||||
i18nKey: 'route.ai-assistant',
|
||||
localIcon: 'menu-ai-read'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@@ -54,7 +55,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'view.ai-assistant_ai-read',
|
||||
meta: {
|
||||
title: 'ai-assistant_ai-read',
|
||||
i18nKey: 'route.ai-assistant_ai-read'
|
||||
i18nKey: 'route.ai-assistant_ai-read',
|
||||
localIcon: 'menu-ai-read'
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -65,7 +67,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'layout.base',
|
||||
meta: {
|
||||
title: 'ai-review',
|
||||
i18nKey: 'route.ai-review'
|
||||
i18nKey: 'route.ai-review',
|
||||
localIcon: 'menu-ai-review'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@@ -73,7 +76,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
path: '/ai-review/tech-proposal',
|
||||
meta: {
|
||||
title: 'ai-review_tech-proposal',
|
||||
i18nKey: 'route.ai-review_tech-proposal'
|
||||
i18nKey: 'route.ai-review_tech-proposal',
|
||||
localIcon: 'menu-ai-review'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@@ -186,6 +190,42 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'ai-review_tech-proposal-redesign_content-check',
|
||||
path: '/ai-review/tech-proposal-redesign/content-check',
|
||||
component: 'view.ai-review_tech-proposal-redesign_content-check',
|
||||
meta: {
|
||||
title: 'ai-review_tech-proposal-redesign_content-check',
|
||||
i18nKey: 'route.ai-review_tech-proposal-redesign_content-check'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'ai-review_tech-proposal-redesign_regular-analysis',
|
||||
path: '/ai-review/tech-proposal-redesign/regular-analysis',
|
||||
component: 'view.ai-review_tech-proposal-redesign_regular-analysis',
|
||||
meta: {
|
||||
title: 'ai-review_tech-proposal-redesign_regular-analysis',
|
||||
i18nKey: 'route.ai-review_tech-proposal-redesign_regular-analysis'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'ai-review_tech-proposal-redesign_responsive-check',
|
||||
path: '/ai-review/tech-proposal-redesign/responsive-check',
|
||||
component: 'view.ai-review_tech-proposal-redesign_responsive-check',
|
||||
meta: {
|
||||
title: 'ai-review_tech-proposal-redesign_responsive-check',
|
||||
i18nKey: 'route.ai-review_tech-proposal-redesign_responsive-check'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'ai-review_tech-proposal-redesign_reupload',
|
||||
path: '/ai-review/tech-proposal-redesign/reupload',
|
||||
component: 'view.ai-review_tech-proposal-redesign_reupload',
|
||||
meta: {
|
||||
title: 'ai-review_tech-proposal-redesign_reupload',
|
||||
i18nKey: 'route.ai-review_tech-proposal-redesign_reupload'
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -195,7 +235,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'view.ai-review_tech-proposal-redesign',
|
||||
meta: {
|
||||
title: 'ai-review_tech-proposal-redesign',
|
||||
i18nKey: 'route.ai-review_tech-proposal-redesign'
|
||||
i18nKey: 'route.ai-review_tech-proposal-redesign',
|
||||
localIcon: 'menu-ai-review'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@@ -274,7 +315,7 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
meta: {
|
||||
title: 'home',
|
||||
i18nKey: 'route.home',
|
||||
icon: 'mdi:monitor-dashboard',
|
||||
localIcon: 'menu-dashboard',
|
||||
order: 1
|
||||
}
|
||||
},
|
||||
@@ -306,7 +347,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'layout.base',
|
||||
meta: {
|
||||
title: 'library',
|
||||
i18nKey: 'route.library'
|
||||
i18nKey: 'route.library',
|
||||
localIcon: 'menu-library'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@@ -333,7 +375,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'view.library_resource-library',
|
||||
meta: {
|
||||
title: 'library_resource-library',
|
||||
i18nKey: 'route.library_resource-library'
|
||||
i18nKey: 'route.library_resource-library',
|
||||
localIcon: 'menu-resource-library'
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -470,7 +513,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'layout.base',
|
||||
meta: {
|
||||
title: 'smart-proposal',
|
||||
i18nKey: 'route.smart-proposal'
|
||||
i18nKey: 'route.smart-proposal',
|
||||
localIcon: 'menu-smart-proposal'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@@ -479,7 +523,8 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
component: 'view.smart-proposal_tech-proposal',
|
||||
meta: {
|
||||
title: 'smart-proposal_tech-proposal',
|
||||
i18nKey: 'route.smart-proposal_tech-proposal'
|
||||
i18nKey: 'route.smart-proposal_tech-proposal',
|
||||
localIcon: 'menu-smart-proposal'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script setup lang="tsx">
|
||||
import { computed, h, nextTick, onActivated, onMounted, onUnmounted, provide, ref, watch } from 'vue';
|
||||
import { computed, h, nextTick, onActivated, onDeactivated, onMounted, onUnmounted, provide, ref, watch } from 'vue';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import type { UploadFileInfo } from 'naive-ui';
|
||||
import { NButton, NDivider, NInput, NTag, NText } from 'naive-ui';
|
||||
@@ -12,6 +12,8 @@ import {
|
||||
batchAddBiddingDoc,
|
||||
deleteBid,
|
||||
deleteBiddingFile,
|
||||
deleteProposal,
|
||||
deleteProposalDtl,
|
||||
fetchGetBidInfo,
|
||||
fetchGetBidList,
|
||||
generateResponseCheckRule,
|
||||
@@ -49,10 +51,11 @@ import {
|
||||
import { changeCommonContentRuleLockStatus } from '@/service/api/ai-reivew/tech-proposal';
|
||||
import { fetchGetDictDataByType } from '@/service/api/system/dict';
|
||||
import { fetchBatchDeleteOss } from '@/service/api/system/oss';
|
||||
import type { DocConvertTask } from '@/service/api/tech-proposal';
|
||||
import { useAIReviewStore } from '@/store/modules/ai-review/index';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useDownload } from '@/hooks/business/download';
|
||||
import { simpleUUID } from '@/utils/common';
|
||||
import { randomIntId } from '@/utils/common';
|
||||
import { useTaskStorage } from '@/utils/strorage-manager';
|
||||
import defaultSetting from '@/assets/json/defaultSetting.json';
|
||||
import ButtonIcon from '@/components/custom/button-icon.vue';
|
||||
@@ -109,6 +112,7 @@ const proposalFileList = ref<UploadFileInfo[]>([]);
|
||||
const proposalFolderList = ref<UploadFileInfo[]>([]);
|
||||
const proposalAppendUploadRef = ref<any>();
|
||||
const activeParentIndex = ref<number | null>(null);
|
||||
const proposalUploadIntent = ref<'file' | 'folder' | 'append' | null>(null);
|
||||
const sectionName = ref('');
|
||||
const uploadProposalName = ref('');
|
||||
const updateBidingName = ref('');
|
||||
@@ -178,6 +182,7 @@ const detailCheckItem = ref({ field: '', level: null as number | null });
|
||||
const detailShowAll = ref(false);
|
||||
const detailPreviewRef = ref<any>();
|
||||
const detailActiveProposalDtlId = ref<number | null>(null);
|
||||
const detailDocPresignCache = new Map<string, DocConvertTask>();
|
||||
const detailSelectedRowId = ref<number | null>(null);
|
||||
const detailActiveTreeId = ref<string | number | null>(null);
|
||||
const detailUseClientPagination = ref(false);
|
||||
@@ -536,6 +541,12 @@ const toReviewTree = (nodes: any[] = []): AIReview.BiddingDocTree[] => {
|
||||
|
||||
const loadReuploadData = async (requestId = reviewRequestId) => {
|
||||
if (!resultInfoId.value) return;
|
||||
activeParentIndex.value = null;
|
||||
proposalFile.value = { id: 0, name: '', url: '', file: null };
|
||||
proposalFiles.value = [];
|
||||
proposalFileList.value = [];
|
||||
proposalFolderList.value = [];
|
||||
proposalUploadIntent.value = null;
|
||||
const [{ data: bidInfo }, { data: proposalList }] = await Promise.all([
|
||||
fetchGetBidInfo(resultInfoId.value),
|
||||
queryProposalList({ infoId: resultInfoId.value })
|
||||
@@ -945,10 +956,10 @@ const combineResponseResult = (tree: any, list: any, index: number) => {
|
||||
const resultMap = new Map();
|
||||
const detailList = parseResponseJson(list.list, []);
|
||||
detailList.forEach((item: any) => {
|
||||
if (item.subItemId != null) {
|
||||
if (item.subItemId !== null && item.subItemId !== undefined) {
|
||||
resultMap.set(item.subItemId, item.plan);
|
||||
resultMap.set(String(item.subItemId), item.plan);
|
||||
} else if (item.factorId != null) {
|
||||
} else if (item.factorId !== null && item.factorId !== undefined) {
|
||||
resultMap.set(item.factorId, item.plan);
|
||||
resultMap.set(String(item.factorId), item.plan);
|
||||
}
|
||||
@@ -1408,6 +1419,35 @@ const detailRowProps = (row: any) => ({
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const closeContentDetailPanel = () => {
|
||||
detailVisible.value = false;
|
||||
detailPreviewVisible.value = false;
|
||||
detailTree.value = [];
|
||||
detailTable.value = [];
|
||||
detailFullTable.value = [];
|
||||
detailLoading.value = false;
|
||||
detailFixedType.value = 1;
|
||||
detailDataId.value = 0;
|
||||
detailDocName.value = '';
|
||||
detailIssueCount.value = 0;
|
||||
detailFixedCount.value = 0;
|
||||
detailCorrectReq.value = '';
|
||||
detailCheckItem.value = { field: '', level: null };
|
||||
detailShowAll.value = false;
|
||||
detailActiveProposalDtlId.value = null;
|
||||
detailSelectedRowId.value = null;
|
||||
detailActiveTreeId.value = null;
|
||||
detailUseClientPagination.value = false;
|
||||
detailTotal.value = 0;
|
||||
detailPagination.value.page = 1;
|
||||
};
|
||||
|
||||
const getDetailDocPresign = (docId: string) => detailDocPresignCache.get(docId) || null;
|
||||
|
||||
const setDetailDocPresign = (docId: string, data: DocConvertTask) => {
|
||||
detailDocPresignCache.set(docId, data);
|
||||
};
|
||||
const toggleSelectedRuleLock = async () => {
|
||||
if (!selectedRule.value?.id) {
|
||||
window.$message?.warning('请先选择规则模板');
|
||||
@@ -1732,28 +1772,30 @@ const inviteFileSizeMB = computed(() => {
|
||||
return (bytes / 1024 / 1024).toFixed(2);
|
||||
});
|
||||
|
||||
const generateHash = (str: string) => {
|
||||
function generateHash(str: string) {
|
||||
let hash = 0;
|
||||
for (let i = 0; i < str.length; i += 1) {
|
||||
hash = (hash * 31 + str.charCodeAt(i)) % 1000000007;
|
||||
}
|
||||
return `node_${hash}`;
|
||||
};
|
||||
}
|
||||
|
||||
const processedTreeData = computed(() => {
|
||||
const addIndexAndHash = (nodes: any[], parentPath = '') => {
|
||||
return nodes.map((node: any, idx: number) => {
|
||||
const nodePath = parentPath ? `${parentPath}-${idx + 1}` : `${idx + 1}`;
|
||||
const newNode = {
|
||||
...node,
|
||||
index: nodePath,
|
||||
tempKey: generateHash(`${node.name}_${nodePath}`)
|
||||
};
|
||||
if (node.children?.length) {
|
||||
newNode.children = addIndexAndHash(node.children, nodePath);
|
||||
}
|
||||
return newNode;
|
||||
});
|
||||
return nodes
|
||||
.filter((node: any) => node.operateType !== 'DELETE')
|
||||
.map((node: any, idx: number) => {
|
||||
const nodePath = parentPath ? `${parentPath}-${idx + 1}` : `${idx + 1}`;
|
||||
const newNode = {
|
||||
...node,
|
||||
index: nodePath,
|
||||
tempKey: generateHash(`${node.name}_${nodePath}`)
|
||||
};
|
||||
if (node.children?.length) {
|
||||
newNode.children = addIndexAndHash(node.children, nodePath);
|
||||
}
|
||||
return newNode;
|
||||
});
|
||||
};
|
||||
|
||||
return addIndexAndHash(aiReview.state.biddingDoc || []);
|
||||
@@ -1816,7 +1858,10 @@ watch(
|
||||
}
|
||||
);
|
||||
|
||||
watch(reviewInnerTab, value => {
|
||||
watch(reviewInnerTab, (value, oldValue) => {
|
||||
if (oldValue === 'ContentCheck' && value !== 'ContentCheck') closeContentDetailPanel();
|
||||
if (oldValue === 'Reupload' && value !== 'Reupload') loadReuploadData();
|
||||
if (value === 'Reupload') loadReuploadData();
|
||||
if (value === 'ResponsiveCheck') loadResponsiveCheckData();
|
||||
if (value === 'ContentCheck') loadContentCheckData();
|
||||
if (value === 'RegularAnalysis') loadRegularAnalysisData();
|
||||
@@ -1881,6 +1926,7 @@ const openHistory = () => {
|
||||
};
|
||||
|
||||
const resetUploadDraft = () => {
|
||||
closeContentDetailPanel();
|
||||
resultInfoId.value = 0;
|
||||
resultBiddingDocuId.value = '';
|
||||
sectionName.value = '';
|
||||
@@ -1898,6 +1944,7 @@ const resetUploadDraft = () => {
|
||||
const openReviewInner = (id: string | number, biddingDocuId: string | number) => {
|
||||
reviewRequestId += 1;
|
||||
const requestId = reviewRequestId;
|
||||
closeContentDetailPanel();
|
||||
resultInfoId.value = Number(id);
|
||||
resultBiddingDocuId.value = biddingDocuId.toString();
|
||||
currentStep.value = 3;
|
||||
@@ -1948,6 +1995,7 @@ const handleUploadError = () => {
|
||||
uploadVisible.value = false;
|
||||
uploadLoading.value = false;
|
||||
activeParentIndex.value = null;
|
||||
proposalUploadIntent.value = null;
|
||||
};
|
||||
|
||||
const handleInviteRemoved = (status: string) => {
|
||||
@@ -2008,7 +2056,7 @@ const buildFileTree = (files: AIReview.UploadedParam[], name?: string) => {
|
||||
|
||||
if (!childNode) {
|
||||
childNode = {
|
||||
id: simpleUUID(),
|
||||
id: randomIntId(),
|
||||
fileNumber: i === 0 ? files.length : undefined,
|
||||
createTime: dayjs(file.file?.lastModified).format('YYYY-MM-DD HH:mm:ss'),
|
||||
name: name || directoryName,
|
||||
@@ -2026,7 +2074,7 @@ const buildFileTree = (files: AIReview.UploadedParam[], name?: string) => {
|
||||
|
||||
currentNode.children ||= [];
|
||||
currentNode.children.push({
|
||||
id: simpleUUID(),
|
||||
id: randomIntId(),
|
||||
name: pathParts[pathParts.length - 1],
|
||||
ossId: file.id,
|
||||
operateType: 'ADD_DTL_OSS',
|
||||
@@ -2045,6 +2093,38 @@ const handleProposalFolderFinish = (options: AIReview.UploadedParam) => {
|
||||
proposalFiles.value.push(options);
|
||||
};
|
||||
|
||||
const prepareProposalFileImport = () => {
|
||||
activeParentIndex.value = null;
|
||||
proposalUploadIntent.value = 'file';
|
||||
proposalFile.value = { id: 0, name: '', url: '', file: null };
|
||||
proposalFileList.value = [];
|
||||
};
|
||||
|
||||
const prepareProposalFolderImport = () => {
|
||||
activeParentIndex.value = null;
|
||||
proposalUploadIntent.value = 'folder';
|
||||
proposalFiles.value = [];
|
||||
proposalFolderList.value = [];
|
||||
};
|
||||
|
||||
const triggerAppendProposalFile = async (topIndex: number) => {
|
||||
activeParentIndex.value = topIndex;
|
||||
proposalUploadIntent.value = 'append';
|
||||
proposalFile.value = { id: 0, name: '', url: '', file: null };
|
||||
proposalFileList.value = [];
|
||||
await nextTick();
|
||||
proposalAppendUploadRef.value?.triggerUpload?.();
|
||||
};
|
||||
|
||||
const resetProposalUploadState = () => {
|
||||
activeParentIndex.value = null;
|
||||
proposalUploadIntent.value = null;
|
||||
proposalFile.value = { id: 0, name: '', url: '', file: null };
|
||||
proposalFiles.value = [];
|
||||
proposalFileList.value = [];
|
||||
proposalFolderList.value = [];
|
||||
};
|
||||
|
||||
const askProposalName = (onConfirm: () => void) => {
|
||||
window.$dialog?.info({
|
||||
maskClosable: false,
|
||||
@@ -2069,6 +2149,7 @@ const askProposalName = (onConfirm: () => void) => {
|
||||
},
|
||||
onNegativeClick: () => {
|
||||
uploadProposalName.value = '';
|
||||
resetProposalUploadState();
|
||||
window.$dialog?.destroyAll();
|
||||
}
|
||||
});
|
||||
@@ -2077,26 +2158,35 @@ const askProposalName = (onConfirm: () => void) => {
|
||||
const handleProposalFileUploaded = () => {
|
||||
uploadVisible.value = false;
|
||||
uploadLoading.value = false;
|
||||
if (activeParentIndex.value !== null) {
|
||||
if (proposalUploadIntent.value === 'append' && activeParentIndex.value !== null) {
|
||||
const parent = aiReview.state.biddingDoc[activeParentIndex.value] as any;
|
||||
if (parent && proposalFile.value.id !== 0) {
|
||||
parent.children ||= [];
|
||||
parent.children.push({
|
||||
id: simpleUUID(),
|
||||
id: randomIntId(),
|
||||
ossId: proposalFile.value.id,
|
||||
name: proposalFile.value.file?.name as string,
|
||||
operateType: 'ADD_DTL_OSS',
|
||||
createTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
|
||||
});
|
||||
parent.fileNumber = parent.children.length;
|
||||
if (parent.operateType !== 'ADD_PROPOSAL') parent.operateType = 'UPDATE_PROPOSAL';
|
||||
expandedKeys.value = Array.from(new Set([...expandedKeys.value, `${activeParentIndex.value + 1}`]));
|
||||
proposalFile.value = { id: 0, name: '', url: '', file: null };
|
||||
proposalFileList.value = [];
|
||||
activeParentIndex.value = null;
|
||||
proposalUploadIntent.value = null;
|
||||
}
|
||||
activeParentIndex.value = null;
|
||||
proposalUploadIntent.value = null;
|
||||
return;
|
||||
}
|
||||
activeParentIndex.value = null;
|
||||
askProposalName(() => {
|
||||
if (proposalFile.value.id === 0) return;
|
||||
if (proposalFile.value.id === 0) {
|
||||
resetProposalUploadState();
|
||||
return;
|
||||
}
|
||||
|
||||
aiReview.addBiddingOssIds({
|
||||
name: uploadProposalName.value,
|
||||
@@ -2104,7 +2194,7 @@ const handleProposalFileUploaded = () => {
|
||||
});
|
||||
aiReview.addBiddingDoc([
|
||||
{
|
||||
id: simpleUUID(),
|
||||
id: randomIntId(),
|
||||
name: uploadProposalName.value,
|
||||
fileNumber: 1,
|
||||
createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
||||
@@ -2112,7 +2202,7 @@ const handleProposalFileUploaded = () => {
|
||||
editable: false,
|
||||
children: [
|
||||
{
|
||||
id: simpleUUID(),
|
||||
id: randomIntId(),
|
||||
ossId: proposalFile.value.id,
|
||||
name: proposalFile.value.file?.name as string,
|
||||
operateType: 'ADD_DTL_OSS',
|
||||
@@ -2122,6 +2212,8 @@ const handleProposalFileUploaded = () => {
|
||||
}
|
||||
]);
|
||||
proposalFile.value = { id: 0, name: '', url: '', file: null };
|
||||
proposalFileList.value = [];
|
||||
proposalUploadIntent.value = null;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -2129,7 +2221,10 @@ const handleProposalFolderUploaded = () => {
|
||||
uploadVisible.value = false;
|
||||
uploadLoading.value = false;
|
||||
askProposalName(() => {
|
||||
if (!proposalFiles.value.length) return;
|
||||
if (!proposalFiles.value.length) {
|
||||
resetProposalUploadState();
|
||||
return;
|
||||
}
|
||||
|
||||
const result: any = buildFileTree(proposalFiles.value, uploadProposalName.value);
|
||||
aiReview.addBiddingOssIds({
|
||||
@@ -2138,6 +2233,8 @@ const handleProposalFolderUploaded = () => {
|
||||
});
|
||||
aiReview.addBiddingDoc(result.children);
|
||||
proposalFiles.value = [];
|
||||
proposalFolderList.value = [];
|
||||
proposalUploadIntent.value = null;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -2148,22 +2245,61 @@ const handlePreview = (row: any) => {
|
||||
docPreviewVisible.value = true;
|
||||
};
|
||||
|
||||
const handleDelete = async (id: string, ossId: string, index: number) => {
|
||||
window.$dialog?.warning({
|
||||
title: '提示',
|
||||
content: '是否删除投标文件夹或投标文件?',
|
||||
positiveText: '确认',
|
||||
negativeText: '取消',
|
||||
onPositiveClick: async () => {
|
||||
aiReview.removeBiddingDocById(id);
|
||||
aiReview.removeBiddingOssIdsById(ossId, index);
|
||||
if (ossId) {
|
||||
const { error } = await fetchBatchDeleteOss([ossId]);
|
||||
if (error) return;
|
||||
}
|
||||
window.$message?.success('删除成功');
|
||||
const removeBiddingNodeById = (id: string | number) => {
|
||||
const removeNode = (nodes: any[]): any[] => {
|
||||
return nodes
|
||||
.filter(node => node.id !== id)
|
||||
.map(node => {
|
||||
if (!node.children?.length) return node;
|
||||
const children = removeNode(node.children);
|
||||
return {
|
||||
...node,
|
||||
fileNumber: children.length,
|
||||
children
|
||||
};
|
||||
})
|
||||
.filter(node => node.children === undefined || node.children.length > 0 || node.operateType !== 'ADD_PROPOSAL');
|
||||
};
|
||||
|
||||
aiReview.state.biddingDoc = removeNode(aiReview.state.biddingDoc as any[]) as any;
|
||||
};
|
||||
|
||||
const collectNewOssIds = (nodes: any[] = []): string[] => {
|
||||
return nodes.reduce((ids: string[], node: any) => {
|
||||
if (node.operateType === 'ADD_DTL_OSS' && node.ossId) ids.push(node.ossId);
|
||||
if (node.children?.length) ids.push(...collectNewOssIds(node.children));
|
||||
return ids;
|
||||
}, []);
|
||||
};
|
||||
|
||||
const hasChildrenField = (row: any) => Object.hasOwn(row, 'children');
|
||||
|
||||
const handleDelete = async (row: any) => {
|
||||
const isParent = hasChildrenField(row);
|
||||
const isNew = row.operateType === 'ADD_PROPOSAL' || row.operateType === 'ADD_DTL_OSS';
|
||||
|
||||
if (isParent) {
|
||||
const newOssIds = collectNewOssIds(row.children || []);
|
||||
if (!isNew) {
|
||||
const { error } = await deleteProposal({ proposalId: row.id, infoId: resultInfoId.value });
|
||||
if (error) return;
|
||||
}
|
||||
});
|
||||
removeBiddingNodeById(row.id);
|
||||
if (newOssIds.length > 0) await fetchBatchDeleteOss(newOssIds);
|
||||
window.$message?.success('删除成功');
|
||||
return;
|
||||
}
|
||||
|
||||
if (isNew) {
|
||||
removeBiddingNodeById(row.id);
|
||||
if (row.ossId) await fetchBatchDeleteOss([row.ossId]);
|
||||
} else {
|
||||
if (row.ossId) await fetchBatchDeleteOss([row.ossId]);
|
||||
const { error } = await deleteProposalDtl({ proposalDtlId: row.id, infoId: resultInfoId.value });
|
||||
if (error) return;
|
||||
removeBiddingNodeById(row.id);
|
||||
}
|
||||
window.$message?.success('删除成功');
|
||||
};
|
||||
|
||||
const editProposalName = (index: number) => {
|
||||
@@ -2197,7 +2333,7 @@ const columns: any = [
|
||||
<div class="unit-cell">
|
||||
<span class="folder-mark"></span>
|
||||
{row.editable ? (
|
||||
<div class="unit-edit-row" onClick={(event: MouseEvent) => event.stopPropagation()}>
|
||||
<div class="unit-edit-row compact" onClick={(event: MouseEvent) => event.stopPropagation()}>
|
||||
<NInput
|
||||
size="small"
|
||||
value={updateBidingName.value}
|
||||
@@ -2211,34 +2347,25 @@ const columns: any = [
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<NButton
|
||||
class="unit-save-btn"
|
||||
size="tiny"
|
||||
type="primary"
|
||||
onClick={(event: MouseEvent) => {
|
||||
event.stopPropagation();
|
||||
editProposalName(topIndex);
|
||||
row.editable = false;
|
||||
}}
|
||||
>
|
||||
保存
|
||||
</NButton>
|
||||
<NButton
|
||||
class="unit-cancel-btn"
|
||||
size="tiny"
|
||||
tertiary
|
||||
onClick={(event: MouseEvent) => {
|
||||
event.stopPropagation();
|
||||
row.editable = false;
|
||||
}}
|
||||
>
|
||||
取消
|
||||
</NButton>
|
||||
</div>
|
||||
) : (
|
||||
<span class="unit-name" title={row.name}>
|
||||
{row.name}
|
||||
</span>
|
||||
<>
|
||||
<span class="unit-name" title={row.name}>
|
||||
{row.name}
|
||||
</span>
|
||||
{currentStep.value === 3 ? (
|
||||
<button
|
||||
class="unit-inline-upload"
|
||||
type="button"
|
||||
onClick={(event: MouseEvent) => {
|
||||
event.stopPropagation();
|
||||
triggerAppendProposalFile(topIndex);
|
||||
}}
|
||||
>
|
||||
上传文件
|
||||
</button>
|
||||
) : null}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
@@ -2267,19 +2394,6 @@ const columns: any = [
|
||||
width: 170,
|
||||
render: (row: any) => {
|
||||
const topIndex = Number(String(row.index).split('-')[0]) - 1;
|
||||
const uploadBtn = () => (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="primary"
|
||||
icon="material-symbols:add-circle-outline"
|
||||
tooltipContent="继续上传"
|
||||
onClick={(event: MouseEvent) => {
|
||||
event.stopPropagation();
|
||||
activeParentIndex.value = topIndex;
|
||||
proposalAppendUploadRef.value?.triggerUpload?.();
|
||||
}}
|
||||
/>
|
||||
);
|
||||
const editBtn = () => (
|
||||
<ButtonIcon
|
||||
text
|
||||
@@ -2300,15 +2414,42 @@ const columns: any = [
|
||||
icon="material-symbols:delete-outline"
|
||||
tooltipContent="删除"
|
||||
popconfirmContent="确认删除?"
|
||||
onPositiveClick={() => handleDelete(row.id, row.ossId, topIndex)}
|
||||
onPositiveClick={() => handleDelete(row)}
|
||||
/>
|
||||
);
|
||||
|
||||
if (row.children) {
|
||||
if (row.editable) {
|
||||
return (
|
||||
<div class="unit-operate-edit" onClick={(event: MouseEvent) => event.stopPropagation()}>
|
||||
<NButton
|
||||
class="unit-save-btn"
|
||||
size="tiny"
|
||||
type="primary"
|
||||
onClick={(event: MouseEvent) => {
|
||||
event.stopPropagation();
|
||||
editProposalName(topIndex);
|
||||
row.editable = false;
|
||||
}}
|
||||
>
|
||||
保存
|
||||
</NButton>
|
||||
<NButton
|
||||
class="unit-cancel-btn"
|
||||
size="tiny"
|
||||
tertiary
|
||||
onClick={(event: MouseEvent) => {
|
||||
event.stopPropagation();
|
||||
row.editable = false;
|
||||
}}
|
||||
>
|
||||
取消
|
||||
</NButton>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<div class="flex-center gap-8px">
|
||||
{uploadBtn()}
|
||||
<NDivider vertical />
|
||||
{editBtn()}
|
||||
<NDivider vertical />
|
||||
{deleteBtn()}
|
||||
@@ -2352,9 +2493,19 @@ const toggleExpandAll = () => {
|
||||
expandedKeys.value = expandedKeys.value.length > 0 ? [] : getAllNodeIds(dataList.value);
|
||||
};
|
||||
|
||||
const deleteAllBiddingDoc = () => {
|
||||
const deleteAllBiddingDoc = async () => {
|
||||
const rows = [...(aiReview.state.biddingDoc as any[])];
|
||||
const newOssIds = rows.flatMap(row => collectNewOssIds(row.children || []));
|
||||
for (const row of rows) {
|
||||
if (row.operateType !== 'ADD_PROPOSAL') {
|
||||
const { error } = await deleteProposal({ proposalId: row.id, infoId: resultInfoId.value });
|
||||
if (error) return;
|
||||
}
|
||||
}
|
||||
if (newOssIds.length > 0) await fetchBatchDeleteOss(newOssIds);
|
||||
aiReview.removeBiddingDoc();
|
||||
aiReview.removeBiddingOssIds();
|
||||
window.$message?.success('删除成功');
|
||||
};
|
||||
|
||||
const tableRowProps = (row: any) => {
|
||||
@@ -2383,13 +2534,23 @@ const saveProposalInfo = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
const normalizeReuploadId = (id: any) => {
|
||||
if (typeof id === 'number') return id;
|
||||
if (typeof id === 'string' && /^\d+$/.test(id)) return Number(id);
|
||||
return randomIntId();
|
||||
};
|
||||
|
||||
const toReuploadPayload = (nodes: any[] = []): any[] => {
|
||||
return nodes.map(({ children, editable: _editable, index: _index, tempKey: _tempKey, name, ...rest }) => ({
|
||||
...rest,
|
||||
proposalName: name,
|
||||
name,
|
||||
children: children?.length ? toReuploadPayload(children) : undefined
|
||||
}));
|
||||
return nodes.map(node => {
|
||||
const { children, editable: _editable, index: _index, tempKey: _tempKey, name, id, ...rest } = node;
|
||||
return {
|
||||
...rest,
|
||||
id: normalizeReuploadId(id),
|
||||
proposalName: name,
|
||||
name,
|
||||
children: hasChildrenField(node) ? toReuploadPayload(children || []) : undefined
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
const saveReuploadInfo = () => {
|
||||
@@ -2406,7 +2567,7 @@ const saveReuploadInfo = () => {
|
||||
onPositiveClick: async () => {
|
||||
const { error } = await reuploadBiddingFile({
|
||||
sectionName: sectionName.value,
|
||||
list: toReuploadPayload(dataList.value),
|
||||
list: toReuploadPayload(aiReview.state.biddingDoc as any[]),
|
||||
infoId: resultInfoId.value
|
||||
});
|
||||
if (!error) {
|
||||
@@ -2537,6 +2698,8 @@ provide(techProposalRedesignContextKey, {
|
||||
openAnalysisSmartFilter,
|
||||
openResponseModuleDialog,
|
||||
openResultDetail,
|
||||
prepareProposalFileImport,
|
||||
prepareProposalFolderImport,
|
||||
proposalAppendUploadRef,
|
||||
proposalFileList,
|
||||
proposalFolderList,
|
||||
@@ -2601,7 +2764,12 @@ onActivated(() => {
|
||||
getHistoryList();
|
||||
});
|
||||
|
||||
onDeactivated(() => {
|
||||
closeContentDetailPanel();
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
closeContentDetailPanel();
|
||||
if (resultTimer) {
|
||||
window.clearInterval(resultTimer);
|
||||
resultTimer = null;
|
||||
@@ -2701,7 +2869,7 @@ onUnmounted(() => {
|
||||
@error="handleUploadError"
|
||||
@uploaded="handleProposalFileUploaded"
|
||||
>
|
||||
<button type="button">导入投标文件</button>
|
||||
<button type="button" @click="prepareProposalFileImport">导入投标文件</button>
|
||||
</FileUploadButton>
|
||||
<FileUploadButton
|
||||
v-model:file-list="proposalFolderList"
|
||||
@@ -2717,13 +2885,14 @@ onUnmounted(() => {
|
||||
@error="handleUploadError"
|
||||
@uploaded="handleProposalFolderUploaded"
|
||||
>
|
||||
<button type="button">导入文件夹</button>
|
||||
<button type="button" @click="prepareProposalFolderImport">导入文件夹</button>
|
||||
</FileUploadButton>
|
||||
</div>
|
||||
<span class="review-file-count">共有{{ bidPlanCount }}个投标单位,{{ bidDocCount }}个投标文件</span>
|
||||
</div>
|
||||
|
||||
<FileUploadFolder
|
||||
v-if="dataList.length === 0"
|
||||
v-model:file-list="proposalFileList"
|
||||
class="review-tree-upload"
|
||||
:max="50"
|
||||
@@ -2744,7 +2913,7 @@ onUnmounted(() => {
|
||||
</div>
|
||||
</FileUploadFolder>
|
||||
|
||||
<div class="review-tree-list" :class="{ empty: dataList.length === 0 }">
|
||||
<div v-if="dataList.length > 0" class="review-tree-list">
|
||||
<div v-if="dataList.length > 0" class="table-tools">
|
||||
<button type="button" @click="toggleExpandAll">
|
||||
{{ expandedKeys.length > 0 ? '收起全部方案' : '展开全部方案' }}
|
||||
@@ -2757,7 +2926,6 @@ onUnmounted(() => {
|
||||
</NPopconfirm>
|
||||
</div>
|
||||
<NDataTable
|
||||
v-if="dataList.length > 0"
|
||||
:columns="columns"
|
||||
:data="dataList"
|
||||
:single-line="true"
|
||||
@@ -2898,8 +3066,11 @@ onUnmounted(() => {
|
||||
<HtmlFilePreview
|
||||
v-if="detailActiveProposalDtlId"
|
||||
:id="detailActiveProposalDtlId"
|
||||
:key="detailActiveProposalDtlId"
|
||||
ref="detailPreviewRef"
|
||||
:load-all-pages="true"
|
||||
:get-presign="getDetailDocPresign"
|
||||
:set-presign="setDetailDocPresign"
|
||||
html-id="left"
|
||||
class="h-full"
|
||||
/>
|
||||
@@ -3218,13 +3389,10 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.review-actions {
|
||||
position: sticky;
|
||||
bottom: 12px;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 12px;
|
||||
margin-top: 20px;
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.ghost-action,
|
||||
@@ -3256,12 +3424,17 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.review-bid-card {
|
||||
display: flex;
|
||||
width: 744px;
|
||||
max-height: calc(100vh - 330px);
|
||||
min-height: 0;
|
||||
flex-direction: column;
|
||||
border: 1px solid #20242d;
|
||||
border-radius: 12px;
|
||||
background: #fff;
|
||||
padding: 13px;
|
||||
box-shadow: 0 28px 70px rgba(36, 42, 53, 0.14);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.review-lot-row {
|
||||
@@ -3359,15 +3532,14 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.review-tree-list {
|
||||
min-height: 168px;
|
||||
display: flex;
|
||||
height: 168px;
|
||||
min-height: 0;
|
||||
flex-direction: column;
|
||||
margin-top: 10px;
|
||||
border: 1px solid #e2e7f0;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
|
||||
&.empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.float-tools {
|
||||
@@ -5370,6 +5542,7 @@ onUnmounted(() => {
|
||||
|
||||
.table-tools {
|
||||
display: flex;
|
||||
flex: 0 0 auto;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
margin: 8px 10px;
|
||||
@@ -5383,13 +5556,24 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.review-data-table {
|
||||
height: 168px;
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
flex: 1;
|
||||
|
||||
:deep(.n-data-table-th) {
|
||||
background: #f6f7fa;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
:deep(.n-data-table-base-table),
|
||||
:deep(.n-data-table-base-table-body) {
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
:deep(.n-scrollbar-container) {
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
:deep(.n-data-table-td) {
|
||||
line-height: 18px;
|
||||
}
|
||||
@@ -5435,6 +5619,28 @@ onUnmounted(() => {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.unit-inline-upload {
|
||||
flex: 0 0 auto;
|
||||
height: 26px;
|
||||
border: 1px solid #d8dde8;
|
||||
border-radius: 6px;
|
||||
background: #fff;
|
||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
||||
color: #344054;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
line-height: 24px;
|
||||
padding: 0 10px;
|
||||
white-space: nowrap;
|
||||
|
||||
&:hover {
|
||||
border-color: #ffb165;
|
||||
background: #fff7ed;
|
||||
color: #d06f10;
|
||||
}
|
||||
}
|
||||
|
||||
.file-name-cell {
|
||||
margin-left: 32px;
|
||||
color: #4b5567;
|
||||
@@ -5449,6 +5655,19 @@ onUnmounted(() => {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.unit-edit-row.compact {
|
||||
width: 100%;
|
||||
grid-template-columns: minmax(0, 1fr);
|
||||
}
|
||||
|
||||
.unit-operate-edit {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.unit-save-btn,
|
||||
.unit-cancel-btn {
|
||||
min-width: 48px;
|
||||
|
||||
@@ -16,6 +16,8 @@ const {
|
||||
handleProposalFolderUploaded,
|
||||
handleUploadBefore,
|
||||
handleUploadError,
|
||||
prepareProposalFileImport,
|
||||
prepareProposalFolderImport,
|
||||
proposalAppendUploadRef,
|
||||
proposalFileList,
|
||||
proposalFolderList,
|
||||
@@ -52,7 +54,7 @@ const {
|
||||
@error="handleUploadError"
|
||||
@uploaded="handleProposalFileUploaded"
|
||||
>
|
||||
<button type="button">导入投标文件</button>
|
||||
<button type="button" @click="prepareProposalFileImport">导入投标文件</button>
|
||||
</FileUploadButton>
|
||||
<FileUploadButton
|
||||
v-model:file-list="proposalFolderList"
|
||||
@@ -68,7 +70,7 @@ const {
|
||||
@error="handleUploadError"
|
||||
@uploaded="handleProposalFolderUploaded"
|
||||
>
|
||||
<button type="button">导入文件夹</button>
|
||||
<button type="button" @click="prepareProposalFolderImport">导入文件夹</button>
|
||||
</FileUploadButton>
|
||||
</div>
|
||||
<div class="review-reupload-stat">
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
startGenerateDocument,
|
||||
updateTechProposal
|
||||
} from '@/service/api/tech-proposal';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useRouterPush } from '@/hooks/common/router';
|
||||
import { localStg } from '@/utils/storage';
|
||||
import ImportModal from '../modules/import-modal.vue';
|
||||
@@ -67,8 +68,24 @@ interface DocConvertManifestPart {
|
||||
}
|
||||
|
||||
const route = useRoute();
|
||||
const appStore = useAppStore();
|
||||
const { routerBack, routerPushByKey } = useRouterPush();
|
||||
const isViewMode = computed(() => route.query.mode === 'view');
|
||||
const didEnableFullContent = ref(false);
|
||||
|
||||
function enterFullContent() {
|
||||
if (!appStore.fullContent) {
|
||||
appStore.toggleFullContent();
|
||||
didEnableFullContent.value = true;
|
||||
}
|
||||
}
|
||||
|
||||
function restoreFullContent() {
|
||||
if (didEnableFullContent.value && appStore.fullContent) {
|
||||
appStore.toggleFullContent();
|
||||
}
|
||||
didEnableFullContent.value = false;
|
||||
}
|
||||
|
||||
// 从路由获取方案ID
|
||||
const proposalId = ref<number>(Number(route.query.id || route.params.id || 0));
|
||||
@@ -1883,6 +1900,7 @@ const loadProposalInfo = async () => {
|
||||
|
||||
// 页面加载时检查是否已有生成的文档
|
||||
onMounted(() => {
|
||||
enterFullContent();
|
||||
loadProposalInfo();
|
||||
checkExistingDocument();
|
||||
if (!isViewMode.value) {
|
||||
@@ -1898,6 +1916,7 @@ onMounted(() => {
|
||||
});
|
||||
|
||||
onActivated(() => {
|
||||
enterFullContent();
|
||||
if (!isViewMode.value) {
|
||||
previewContainerRef.value?.removeEventListener('click', handlePreviewClick);
|
||||
previewContainerRef.value?.addEventListener('click', handlePreviewClick);
|
||||
@@ -1919,6 +1938,7 @@ onActivated(() => {
|
||||
});
|
||||
|
||||
onDeactivated(() => {
|
||||
restoreFullContent();
|
||||
const container = previewContainerRef.value;
|
||||
if (container) {
|
||||
container.removeEventListener('scroll', handleScroll);
|
||||
@@ -1938,6 +1958,7 @@ onDeactivated(() => {
|
||||
|
||||
// 组件卸载时清理滚动监听
|
||||
onUnmounted(() => {
|
||||
restoreFullContent();
|
||||
const container = previewContainerRef.value;
|
||||
if (container) {
|
||||
container.removeEventListener('scroll', handleScroll);
|
||||
@@ -1969,12 +1990,16 @@ onUnmounted(() => {
|
||||
<NFlex vertical :size="[0, 0]" class="contain compose-page-shell h-full w-full" :class="{ 'is-fullscreen': isPreviewFullscreen }">
|
||||
<section class="compose-view" aria-label="智慧标书编制内页">
|
||||
<aside class="compose-left-tools">
|
||||
<button class="compose-tool-button" type="button" @click="back"><span>↩</span>返回</button>
|
||||
<button v-if="!isViewMode" class="compose-tool-button" type="button" @click="openCatalogueDialog"><span>▦</span>选择模版</button>
|
||||
<button v-if="!isViewMode" class="compose-tool-button" type="button" :disabled="isGenerating" @click="handleGenerateDocument">
|
||||
<span>✦</span>{{ isGenerating ? `生成中${generateProgress}%` : '生成文档' }}
|
||||
<button class="compose-tool-button" type="button" @click="back"><span class="compose-tool-icon is-back"></span>返回</button>
|
||||
<button v-if="!isViewMode" class="compose-tool-button" type="button" @click="openCatalogueDialog">
|
||||
<span class="compose-tool-icon is-template"></span>选择模版
|
||||
</button>
|
||||
<button v-if="!isViewMode" class="compose-tool-button" type="button" :disabled="isGenerating" @click="handleGenerateDocument">
|
||||
<span class="compose-tool-icon is-generate"></span>{{ isGenerating ? `生成中${generateProgress}%` : '生成文档' }}
|
||||
</button>
|
||||
<button class="compose-tool-button" type="button" :disabled="!canDownload" @click="handleDownloadDocument">
|
||||
<span class="compose-tool-icon is-download"></span>下载文档
|
||||
</button>
|
||||
<button class="compose-tool-button" type="button" :disabled="!canDownload" @click="handleDownloadDocument"><span>⇩</span>下载文档</button>
|
||||
</aside>
|
||||
|
||||
<section class="compose-editor">
|
||||
@@ -2204,7 +2229,7 @@ onUnmounted(() => {
|
||||
|
||||
<ImportModal v-model:visible="importModalVisible" />
|
||||
<!-- 目录配置弹窗 -->
|
||||
<NModal v-model:show="catalogueModalVisible" preset="card" title="目录配置" class="w-800px">
|
||||
<NModal v-model:show="catalogueModalVisible" preset="card" title="目录配置" class="catalogue-config-modal">
|
||||
<FileCatalogue
|
||||
:proposal-id="proposalId"
|
||||
:engineering-type="currentMajorType"
|
||||
@@ -2217,6 +2242,50 @@ onUnmounted(() => {
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:global(.catalogue-config-modal.n-card) {
|
||||
width: min(780px, calc(100vw - 48px));
|
||||
border-radius: 9px;
|
||||
background: #fff;
|
||||
box-shadow: 0 28px 70px rgba(27, 39, 64, 0.24);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
:global(.catalogue-config-modal .n-card-header) {
|
||||
height: 50px;
|
||||
padding: 0 20px;
|
||||
border-bottom: 1px solid #e6edf5;
|
||||
background: #fffaf2;
|
||||
}
|
||||
|
||||
:global(.catalogue-config-modal .n-card-header__main) {
|
||||
position: relative;
|
||||
padding-left: 10px;
|
||||
color: #111827;
|
||||
font-size: 15px;
|
||||
font-weight: 700;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
:global(.catalogue-config-modal .n-card-header__main::before) {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
width: 4px;
|
||||
height: 18px;
|
||||
border-radius: 999px;
|
||||
background: #f59e0b;
|
||||
content: '';
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
:global(.catalogue-config-modal .n-card-header__extra) {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
:global(.catalogue-config-modal .n-card__content) {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.page-fullscreen-shell:fullscreen {
|
||||
background: radial-gradient(circle at 12% 8%, #f6f8fc 0%, #eef2f9 42%, #e9edf6 100%);
|
||||
}
|
||||
@@ -3173,18 +3242,40 @@ onUnmounted(() => {
|
||||
|
||||
span {
|
||||
display: block;
|
||||
color: #b7bdc6;
|
||||
font-size: 24px;
|
||||
line-height: 28px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin: 0 auto 4px;
|
||||
background-color: #b7bdc6;
|
||||
transition: color 0.16s ease;
|
||||
}
|
||||
|
||||
.compose-tool-icon {
|
||||
-webkit-mask: var(--tool-icon) center / 24px 24px no-repeat;
|
||||
mask: var(--tool-icon) center / 24px 24px no-repeat;
|
||||
|
||||
&.is-back {
|
||||
--tool-icon: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 6 5 11.5l5.5 5.5 1.4-1.4-3.1-3.1H18a5 5 0 0 0 0-10h-1v2h1a3 3 0 0 1 0 6H8.8l3.1-3.1L10.5 6Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
&.is-template {
|
||||
--tool-icon: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 4h7v7H4V4Zm2 2v3h3V6H6Zm7-2h7v7h-7V4Zm2 2v3h3V6h-3ZM4 13h7v7H4v-7Zm2 2v3h3v-3H6Zm7-2h7v7h-7v-7Zm2 2v3h3v-3h-3Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
&.is-generate {
|
||||
--tool-icon: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m12 2 1.7 5.1L19 9l-5.3 1.9L12 16l-1.7-5.1L5 9l5.3-1.9L12 2Zm6.5 10 1 3 3 1-3 1-1 3-1-3-3-1 3-1 1-3ZM5.5 13l.8 2.2L8.5 16l-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8.8-2.2Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
&.is-download {
|
||||
--tool-icon: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4h2v8.2l3.1-3.1 1.4 1.4L12 16l-5.5-5.5 1.4-1.4 3.1 3.1V4Zm-6 14h14v2H5v-2Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
}
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
color: #ff8a18;
|
||||
background: rgba(255, 138, 24, 0.06);
|
||||
|
||||
span {
|
||||
color: #ff8a18;
|
||||
background-color: #ff8a18;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,6 +106,13 @@ const handleFileUpload = (file: UploadFileInfo) => {
|
||||
formData.originalFileName = file.name;
|
||||
};
|
||||
|
||||
const removeUploadedFile = () => {
|
||||
formData.originalFileOssId = undefined;
|
||||
formData.originalFileUrl = '';
|
||||
formData.originalFileName = '';
|
||||
fileList.value = [];
|
||||
};
|
||||
|
||||
watch(fileList, files => {
|
||||
if (files.length === 0) {
|
||||
formData.originalFileOssId = undefined;
|
||||
@@ -249,7 +256,7 @@ onMounted(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="smart-bid-page">
|
||||
<div class="smart-bid-page" :class="{ 'compose-ready': formData.originalFileName, 'compose-processing': isSubmitting }">
|
||||
<div class="smart-bid-watermark" aria-hidden="true"></div>
|
||||
<header class="smart-bid-topbar">
|
||||
<button class="record-entry" :class="{ active: isRecordPanelVisible }" type="button" @click="openRecordDrawer">
|
||||
@@ -263,11 +270,11 @@ onMounted(() => {
|
||||
v-for="item in bidTypeOptions"
|
||||
:key="item.value"
|
||||
class="bid-type-tab"
|
||||
:class="{ active: formData.bidType === item.value }"
|
||||
:class="[`is-${item.value}`, { active: formData.bidType === item.value }]"
|
||||
type="button"
|
||||
@click="selectBidType(item.value)"
|
||||
>
|
||||
<span></span>
|
||||
<span class="bid-type-icon" aria-hidden="true"></span>
|
||||
{{ item.label }}
|
||||
</button>
|
||||
</div>
|
||||
@@ -312,11 +319,17 @@ onMounted(() => {
|
||||
<h3>{{ formData.originalFileName || '上传招标文件入口' }}</h3>
|
||||
<p>支持 doc、docx、pdf,文件大小不超过50M</p>
|
||||
</FileUploadFolder>
|
||||
<div v-if="formData.originalFileName" class="compose-file-strip">
|
||||
<span class="compose-file-name">{{ formData.originalFileName }}</span>
|
||||
<button class="compose-remove-file" type="button" :disabled="isSubmitting" @click.stop="removeUploadedFile">删除</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<NButton class="compose-start" :disabled="!canStartCompose" :loading="isSubmitting" @click="handleStartCompose">
|
||||
开始编制
|
||||
{{ isSubmitting ? '正在编制中' : '开始编制' }}
|
||||
</NButton>
|
||||
<div v-if="isSubmitting" class="compose-progress" aria-hidden="true"><span></span></div>
|
||||
<p v-if="isSubmitting" class="compose-status">正在编制中,请稍候...</p>
|
||||
</section>
|
||||
|
||||
<RecordDrawer
|
||||
@@ -382,6 +395,9 @@ onMounted(() => {
|
||||
border-radius: 12px;
|
||||
background: #fff;
|
||||
color: #20222a;
|
||||
--smart-orange: #ff8a1f;
|
||||
--smart-line: #dfe6f0;
|
||||
--smart-muted: #7e8492;
|
||||
}
|
||||
|
||||
.smart-bid-watermark {
|
||||
@@ -426,10 +442,11 @@ onMounted(() => {
|
||||
transform 0.16s ease;
|
||||
|
||||
&::before {
|
||||
content: '◷';
|
||||
content: '';
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
margin-right: 7px;
|
||||
font-size: 17px;
|
||||
vertical-align: -1px;
|
||||
background: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 3.2a5.8 5.8 0 1 0 5.8 5.8' stroke='%2320242D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M9 1.7v4.1h4.1' stroke='%2320242D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9 8.8 6.7 11' stroke='%2320242D' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") center / 18px 18px no-repeat;
|
||||
}
|
||||
|
||||
&.active {
|
||||
@@ -458,49 +475,65 @@ onMounted(() => {
|
||||
.bid-type-tabs {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
height: 41px;
|
||||
padding: 4px 7px;
|
||||
gap: 8px;
|
||||
min-height: 50px;
|
||||
padding: 6px;
|
||||
border-radius: 999px;
|
||||
background: #f3f4f6;
|
||||
box-shadow: 0 0 0 6px rgba(32, 34, 42, 0.04);
|
||||
border: 1px solid #e7e9ee;
|
||||
background: rgba(244, 245, 247, 0.96);
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.9),
|
||||
0 10px 24px rgba(22, 28, 42, 0.06);
|
||||
}
|
||||
|
||||
.bid-type-tab {
|
||||
display: inline-flex;
|
||||
height: 31px;
|
||||
height: 38px;
|
||||
min-width: 86px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
gap: 8px;
|
||||
border: none;
|
||||
border-radius: 999px;
|
||||
background: transparent;
|
||||
color: #303542;
|
||||
color: #5d6370;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
font-size: 15px;
|
||||
font-weight: 700;
|
||||
padding: 0 15px;
|
||||
white-space: nowrap;
|
||||
|
||||
span {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
background: #c9ced8;
|
||||
.bid-type-icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
background-color: currentColor;
|
||||
display: inline-block;
|
||||
-webkit-mask: var(--tab-icon) center / 18px 18px no-repeat;
|
||||
mask: var(--tab-icon) center / 18px 18px no-repeat;
|
||||
}
|
||||
|
||||
&.is-tech {
|
||||
--tab-icon: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 2.2h8.2c1 0 1.8.8 1.8 1.8v10.3c0 .8-.7 1.5-1.5 1.5H4.7A2.7 2.7 0 0 1 2 13.1V4.2C2 2.9 3.1 2.2 5 2.2Zm0 11.2h9.1V4H5c-.9 0-1.3.3-1.3.8v8.3c.3-.1.7-.2 1.3-.2Zm2-7.7h6v1.2H7V5.7Zm0 2.6h4.7v1.2H7V8.3Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
&.is-business {
|
||||
--tab-icon: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.2 2h7.6A2.2 2.2 0 0 1 15 4.2v10.3c0 .8-.7 1.5-1.5 1.5H4.7A2.7 2.7 0 0 1 2 13.3V4.4C2 3 3 2 5.2 2Zm-.2 11.4h9V4.2c0-.4-.3-.8-.8-.8H5.2c-1 0-1.5.3-1.5.9v8.8c.3-.1.7-.2 1.3-.2Zm1.7-7.8h2.1v2.1H6.7V5.6Zm3.5 0h2.1v2.1h-2.1V5.6ZM6.7 9.1h2.1v2.1H6.7V9.1Zm3.5 0h2.1v2.1h-2.1V9.1Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
&.active {
|
||||
background: #fff;
|
||||
box-shadow: 0 6px 16px rgba(30, 39, 60, 0.1);
|
||||
color: #222;
|
||||
box-shadow: 0 6px 16px rgba(20, 24, 35, 0.1);
|
||||
|
||||
span {
|
||||
border: 2px solid #ffe0c2;
|
||||
background: #ff8a1f;
|
||||
.bid-type-icon {
|
||||
background-color: var(--smart-orange);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.compose-hero {
|
||||
margin-top: 28px;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 67px;
|
||||
text-align: center;
|
||||
|
||||
h1 {
|
||||
@@ -512,41 +545,44 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 14px 0 0;
|
||||
color: #7e8492;
|
||||
margin: 12px 0 0;
|
||||
color: #6a7487;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
.compose-card {
|
||||
width: min(745px, 100%);
|
||||
margin-top: 66px;
|
||||
padding: 13px;
|
||||
border: 1px solid #20222a;
|
||||
border-radius: 20px;
|
||||
width: min(760px, 100%);
|
||||
min-height: 268px;
|
||||
margin-top: 0;
|
||||
padding: 14px;
|
||||
border: 1px solid var(--smart-line);
|
||||
border-radius: 14px;
|
||||
background: #fff;
|
||||
box-shadow: 0 38px 70px rgba(33, 35, 43, 0.12);
|
||||
box-shadow: 0 10px 24px rgba(17, 24, 39, 0.06);
|
||||
}
|
||||
|
||||
.field-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
gap: 12px;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.soft-field {
|
||||
display: flex;
|
||||
min-height: 79px;
|
||||
min-height: 76px;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
border-radius: 9px;
|
||||
background: #edeff4;
|
||||
padding: 15px 16px 12px;
|
||||
border: 1px solid #e4e9f2;
|
||||
border-radius: 10px;
|
||||
background: #f7f9fc;
|
||||
padding: 0 14px;
|
||||
|
||||
span {
|
||||
margin-bottom: 2px;
|
||||
color: #3d506b;
|
||||
font-size: 14px;
|
||||
margin-bottom: 6px;
|
||||
color: #697488;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@@ -560,7 +596,8 @@ onMounted(() => {
|
||||
:deep(.n-input__input-el),
|
||||
:deep(.n-base-selection-input__content),
|
||||
:deep(.n-base-selection-placeholder) {
|
||||
color: #111827;
|
||||
color: #1f2a3d;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@@ -571,18 +608,18 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
.compose-upload {
|
||||
margin-top: 13px;
|
||||
margin-top: 12px;
|
||||
|
||||
:deep(.n-upload-dragger) {
|
||||
min-height: 122px;
|
||||
border: none;
|
||||
border-radius: 9px;
|
||||
background: #edeff4;
|
||||
min-height: 132px;
|
||||
border: 1px dashed #d7deea;
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(180deg, #fbfcff 0%, #f7f9fc 100%);
|
||||
padding: 18px;
|
||||
}
|
||||
|
||||
:deep(.n-upload-file-list) {
|
||||
margin-top: 10px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
:deep(.mb-12px) {
|
||||
@@ -592,11 +629,11 @@ onMounted(() => {
|
||||
|
||||
.word-mark {
|
||||
display: grid;
|
||||
width: 29px;
|
||||
height: 29px;
|
||||
margin: 1px auto 8px;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin: 0 auto 10px;
|
||||
place-items: center;
|
||||
border-radius: 8px;
|
||||
border-radius: 9px;
|
||||
background: linear-gradient(145deg, #ffa126, #ff8617);
|
||||
color: #fff;
|
||||
font-size: 19px;
|
||||
@@ -605,9 +642,9 @@ onMounted(() => {
|
||||
|
||||
.compose-upload h3 {
|
||||
margin: 0;
|
||||
color: #111827;
|
||||
color: #1f2a3d;
|
||||
font-size: 18px;
|
||||
font-weight: 800;
|
||||
font-weight: 700;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -615,25 +652,101 @@ onMounted(() => {
|
||||
margin: 7px 0 0;
|
||||
color: #7c8598;
|
||||
font-size: 13px;
|
||||
line-height: 1.45;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.compose-file-strip {
|
||||
display: flex;
|
||||
height: 34px;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
margin-top: 9px;
|
||||
border: 1px solid #dde4ef;
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.compose-file-name {
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
color: #2f3542;
|
||||
font-size: 13px;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.compose-remove-file {
|
||||
flex: 0 0 auto;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
color: #c34532;
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
padding: 0;
|
||||
|
||||
&:disabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.55;
|
||||
}
|
||||
}
|
||||
|
||||
.compose-start {
|
||||
width: 116px;
|
||||
height: 36px;
|
||||
margin-top: 40px;
|
||||
min-width: 116px;
|
||||
height: 32px;
|
||||
margin-top: 24px;
|
||||
border: none;
|
||||
border-radius: 7px;
|
||||
background: #ff8a1f;
|
||||
border-radius: 8px;
|
||||
background: linear-gradient(180deg, #ff9f22 0%, #ff8614 100%);
|
||||
box-shadow: 0 8px 16px rgba(255, 138, 31, 0.22);
|
||||
color: #fff;
|
||||
font-size: 13px;
|
||||
font-weight: 800;
|
||||
|
||||
&:disabled {
|
||||
background: #e5e7eb;
|
||||
background: #e7e7eb;
|
||||
box-shadow: none;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.compose-progress {
|
||||
width: 240px;
|
||||
height: 6px;
|
||||
margin: 18px auto 0;
|
||||
overflow: hidden;
|
||||
border-radius: 999px;
|
||||
background: #eceef3;
|
||||
|
||||
span {
|
||||
display: block;
|
||||
width: 64%;
|
||||
height: 100%;
|
||||
border-radius: inherit;
|
||||
background: linear-gradient(90deg, #ffad33 0%, #ff8614 100%);
|
||||
animation: compose-progress 1.4s ease-in-out infinite;
|
||||
}
|
||||
}
|
||||
|
||||
.compose-status {
|
||||
margin: 10px 0 0;
|
||||
color: #d97912;
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@keyframes compose-progress {
|
||||
0% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateX(160%);
|
||||
}
|
||||
}
|
||||
|
||||
.proposal-record-filter {
|
||||
margin: 0 0 18px;
|
||||
|
||||
|
||||
@@ -573,10 +573,10 @@ onMounted(async () => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NFlex vertical :size="[0, 15]" class="h-full">
|
||||
<!-- 目录模板选择 -->
|
||||
<div class="px-12px">
|
||||
<NFormItem label="目录模板" label-placement="left">
|
||||
<div class="catalogue-config-panel">
|
||||
<div class="catalogue-config-body">
|
||||
<NForm label-placement="left" :label-width="86" :show-feedback="false" class="catalogue-config-form">
|
||||
<NFormItem label="目录模板">
|
||||
<NSelect
|
||||
v-model:value="selectedCatalogueId"
|
||||
:options="catalogueOptions"
|
||||
@@ -586,11 +586,8 @@ onMounted(async () => {
|
||||
@update:value="handleCatalogueChange"
|
||||
/>
|
||||
</NFormItem>
|
||||
</div>
|
||||
|
||||
<!-- 样式规则选择 -->
|
||||
<div class="px-12px">
|
||||
<NFormItem label="样式规则" label-placement="left">
|
||||
<NFormItem label="样式规则">
|
||||
<NSelect
|
||||
v-model:value="selectedStyleRuleId"
|
||||
:options="styleRuleOptions"
|
||||
@@ -600,29 +597,18 @@ onMounted(async () => {
|
||||
@update:value="handleStyleRuleChange"
|
||||
/>
|
||||
</NFormItem>
|
||||
</div>
|
||||
|
||||
<!-- 应用样式规则开关 -->
|
||||
<div class="px-12px">
|
||||
<NFormItem label-placement="left">
|
||||
<template #label>
|
||||
<NSpace align="center" :size="8">
|
||||
<NText>应用样式规则</NText>
|
||||
</NSpace>
|
||||
</template>
|
||||
<NFormItem label="应用样式规则" class="catalogue-switch-row">
|
||||
<NSwitch v-model:value="applyStyleRule" />
|
||||
</NFormItem>
|
||||
</div>
|
||||
</NForm>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="px-12px">
|
||||
<NButton type="primary" size="small" @click="handleAddRootNode">
|
||||
➕ 添加顶级节点
|
||||
</NButton>
|
||||
</div>
|
||||
<button class="catalogue-add-button" type="button" @click="handleAddRootNode">
|
||||
<span>+</span>
|
||||
添加顶级节点
|
||||
</button>
|
||||
|
||||
<!-- 目录树 -->
|
||||
<div class="min-h-0 flex-1 overflow-auto px-12px">
|
||||
<div class="catalogue-tree-box">
|
||||
<NTree
|
||||
block-line
|
||||
:data="data"
|
||||
@@ -635,6 +621,7 @@ onMounted(async () => {
|
||||
:render-label="renderTreeLabel"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右键菜单 -->
|
||||
<NDropdown
|
||||
@@ -666,25 +653,170 @@ onMounted(async () => {
|
||||
</NFormItem>
|
||||
</NModal>
|
||||
|
||||
<!-- 保存按钮 -->
|
||||
<div class="mt-20px">
|
||||
<NSpace justify="end">
|
||||
<NButton @click="handleClose">取消</NButton>
|
||||
<NButton type="primary" :loading="saving" @click="handleSave">
|
||||
保存配置
|
||||
</NButton>
|
||||
</NSpace>
|
||||
<div class="catalogue-config-footer">
|
||||
<button class="catalogue-footer-button is-cancel" type="button" @click="handleClose">取消</button>
|
||||
<button class="catalogue-footer-button is-save" type="button" :disabled="saving" @click="handleSave">
|
||||
{{ saving ? '保存中...' : '保存配置' }}
|
||||
</button>
|
||||
</div>
|
||||
</NFlex>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scss scoped>
|
||||
:deep(.n-card__content) {
|
||||
padding: 0;
|
||||
padding-top: 0 !important;
|
||||
<style lang="scss" scoped>
|
||||
.catalogue-config-panel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 510px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
border-bottom: 1px solid #f2f2f2;
|
||||
.catalogue-config-body {
|
||||
min-height: 0;
|
||||
flex: 1;
|
||||
padding: 14px 16px 20px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.catalogue-config-form {
|
||||
:deep(.n-form-item) {
|
||||
--n-label-height: 34px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
:deep(.n-form-item-label) {
|
||||
min-height: 34px;
|
||||
padding-right: 14px;
|
||||
color: #1f2d3d;
|
||||
font-size: 14px;
|
||||
line-height: 34px;
|
||||
}
|
||||
|
||||
:deep(.n-base-selection) {
|
||||
--n-height: 34px !important;
|
||||
--n-border-radius: 8px !important;
|
||||
--n-border: 1px solid #f0d7b8 !important;
|
||||
--n-border-hover: 1px solid #f5b45f !important;
|
||||
--n-border-active: 1px solid #f59e0b !important;
|
||||
--n-box-shadow-active: 0 0 0 2px rgba(245, 158, 11, 0.12) !important;
|
||||
background: #fffaf2;
|
||||
}
|
||||
|
||||
:deep(.n-base-selection-label) {
|
||||
background: #fffaf2;
|
||||
}
|
||||
}
|
||||
|
||||
.catalogue-switch-row {
|
||||
margin-bottom: 8px !important;
|
||||
|
||||
:deep(.n-form-item-blank) {
|
||||
min-height: 24px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
:deep(.n-switch) {
|
||||
--n-button-width: 22px !important;
|
||||
--n-button-height: 22px !important;
|
||||
--n-rail-width: 42px !important;
|
||||
--n-rail-height: 24px !important;
|
||||
--n-rail-color: #d7deea !important;
|
||||
--n-rail-color-active: #f59e0b !important;
|
||||
}
|
||||
}
|
||||
|
||||
.catalogue-add-button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 30px;
|
||||
padding: 0 13px;
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
background: #2f63e8;
|
||||
box-shadow: 0 5px 12px rgba(47, 99, 232, 0.22);
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
line-height: 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.catalogue-add-button span {
|
||||
margin-right: 7px;
|
||||
font-size: 17px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.catalogue-add-button:hover {
|
||||
background: #2457d5;
|
||||
}
|
||||
|
||||
.catalogue-tree-box {
|
||||
margin-top: 15px;
|
||||
padding-left: 2px;
|
||||
|
||||
:deep(.n-tree) {
|
||||
color: #1f2d3d;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
:deep(.n-tree-node) {
|
||||
min-height: 31px;
|
||||
}
|
||||
|
||||
:deep(.n-tree-node-content) {
|
||||
min-height: 31px;
|
||||
padding: 0 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
:deep(.n-tree-node-switcher) {
|
||||
width: 19px;
|
||||
color: #596779;
|
||||
}
|
||||
|
||||
:deep(.n-tree-node-content__text) {
|
||||
color: #1f2d3d;
|
||||
line-height: 31px;
|
||||
}
|
||||
}
|
||||
|
||||
.catalogue-config-footer {
|
||||
display: flex;
|
||||
flex: 0 0 56px;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
padding: 0 16px;
|
||||
border-top: 1px solid #e8edf5;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.catalogue-footer-button {
|
||||
min-width: 76px;
|
||||
height: 32px;
|
||||
padding: 0 18px;
|
||||
border-radius: 8px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.catalogue-footer-button.is-cancel {
|
||||
border: 1px solid #ffc47d;
|
||||
background: #fff8ef;
|
||||
color: #d97706;
|
||||
}
|
||||
|
||||
.catalogue-footer-button.is-save {
|
||||
border: 1px solid #f59e0b;
|
||||
background: #f59e0b;
|
||||
color: #fff;
|
||||
box-shadow: 0 5px 12px rgba(245, 158, 11, 0.24);
|
||||
}
|
||||
|
||||
.catalogue-footer-button:disabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.65;
|
||||
}
|
||||
</style>
|
||||
|
||||