feat(dashboard): 应用新版仪表盘设计并适配深色主题

This commit is contained in:
kuaifan 2026-09-10 08:55:02 +00:00
parent 80d4b16921
commit 4249584a08
41 changed files with 902 additions and 279 deletions

View File

@ -2782,3 +2782,4 @@ WebDAV 路径冲突
负责人未发生变化
请填写指派留言
任务负责人最多不能超过10个
展开显示更多

View File

@ -40150,5 +40150,17 @@
"fr": "Non planifiées",
"id": "Belum dijadwalkan",
"ru": "Не запланированы"
},
{
"key": "展开显示更多",
"zh": "",
"zh-CHT": "展開顯示更多",
"en": "Show more",
"ko": "더 보기",
"ja": "さらに表示",
"de": "Mehr anzeigen",
"fr": "Afficher plus",
"id": "Tampilkan lebih banyak",
"ru": "Показать больше"
}
]

View File

@ -0,0 +1,27 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Time / Calendar">
<g clip-path="url(#clip0_0_65)">
<path id="Vector" d="M1.16667 7C1.16667 4.80011 1.16667 3.70017 1.85008 3.01675C2.5335 2.33333 3.63345 2.33333 5.83333 2.33333H8.16667C10.3666 2.33333 11.4665 2.33333 12.1499 3.01675C12.8333 3.70017 12.8333 4.80011 12.8333 7V8.16667C12.8333 10.3666 12.8333 11.4665 12.1499 12.1499C11.4665 12.8333 10.3666 12.8333 8.16667 12.8333H5.83333C3.63345 12.8333 2.5335 12.8333 1.85008 12.1499C1.16667 11.4665 1.16667 10.3666 1.16667 8.16667V7Z" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_2" d="M4.08333 2.33333V1.45833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_3" d="M9.91667 2.33333V1.45833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_4" d="M1.45833 5.25H12.5417" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<g id="Vector_5">
<path d="M10.5 9.91667C10.5 10.2388 10.2388 10.5 9.91667 10.5C9.5945 10.5 9.33333 10.2388 9.33333 9.91667C9.33333 9.5945 9.5945 9.33333 9.91667 9.33333C10.2388 9.33333 10.5 9.5945 10.5 9.91667Z" fill="#999999"/>
<path d="M10.5 7.58333C10.5 7.9055 10.2388 8.16667 9.91667 8.16667C9.5945 8.16667 9.33333 7.9055 9.33333 7.58333C9.33333 7.26117 9.5945 7 9.91667 7C10.2388 7 10.5 7.26117 10.5 7.58333Z" fill="#999999"/>
</g>
<g id="Vector_6">
<path d="M7.58333 9.91667C7.58333 10.2388 7.32217 10.5 7 10.5C6.67783 10.5 6.41667 10.2388 6.41667 9.91667C6.41667 9.5945 6.67783 9.33333 7 9.33333C7.32217 9.33333 7.58333 9.5945 7.58333 9.91667Z" fill="#999999"/>
<path d="M7.58333 7.58333C7.58333 7.9055 7.32217 8.16667 7 8.16667C6.67783 8.16667 6.41667 7.9055 6.41667 7.58333C6.41667 7.26117 6.67783 7 7 7C7.32217 7 7.58333 7.26117 7.58333 7.58333Z" fill="#999999"/>
</g>
<g id="Vector_7">
<path d="M4.66667 9.91667C4.66667 10.2388 4.4055 10.5 4.08333 10.5C3.76117 10.5 3.5 10.2388 3.5 9.91667C3.5 9.5945 3.76117 9.33333 4.08333 9.33333C4.4055 9.33333 4.66667 9.5945 4.66667 9.91667Z" fill="#999999"/>
<path d="M4.66667 7.58333C4.66667 7.9055 4.4055 8.16667 4.08333 8.16667C3.76117 8.16667 3.5 7.9055 3.5 7.58333C3.5 7.26117 3.76117 7 4.08333 7C4.4055 7 4.66667 7.26117 4.66667 7.58333Z" fill="#999999"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_0_65">
<rect width="14" height="14" rx="5" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Arrows / Alt Arrow Down">
<path id="Vector" d="M12.6667 6L8 10L3.33333 6" stroke="#666666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 353 B

View File

@ -0,0 +1,19 @@
<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="75" cy="75" r="60" fill="#3B3B3C"/>
<mask id="mask0_469_19160" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="15" y="15" width="120" height="120">
<circle cx="75" cy="75" r="60" fill="#F2F3F6"/>
</mask>
<g mask="url(#mask0_469_19160)">
<rect x="33.5" y="43.5" width="83" height="98" rx="3.5" fill="#636365" stroke="#292929"/>
<rect x="54" y="97" width="42" height="6" rx="3" fill="#8B8B8C"/>
<rect x="54" y="109" width="42" height="6" rx="3" fill="#8B8B8C"/>
<rect x="64" y="121" width="22" height="6" rx="3" fill="#8B8B8C"/>
<path d="M90.8136 57.885C91.9852 56.7134 93.8852 56.7134 95.0568 57.885C96.2279 59.0565 96.2279 60.9557 95.0568 62.1272L73.6144 83.5695C73.0964 84.0875 72.4357 84.3758 71.7589 84.4357C70.8924 84.5243 69.9951 84.2373 69.3312 83.5734L56.1212 70.3635C54.9499 69.1919 54.9497 67.2928 56.1212 66.1213C57.2927 64.9498 59.1918 64.95 60.3634 66.1213L71.4699 77.2277L90.8136 57.885Z" fill="#A9A9A9"/>
<path d="M90.8136 57.885L91.1672 58.2385L91.1672 58.2385L90.8136 57.885ZM95.0568 57.885L95.4104 57.5315L95.4103 57.5314L95.0568 57.885ZM95.0568 62.1272L95.4103 62.4807L95.4104 62.4807L95.0568 62.1272ZM71.7589 84.4357L71.7148 83.9377L71.7081 83.9383L71.7589 84.4357ZM69.3312 83.5734L68.9776 83.927V83.927L69.3312 83.5734ZM56.1212 70.3635L55.7676 70.717L55.7677 70.717L56.1212 70.3635ZM56.1212 66.1213L55.7677 65.7677L55.7677 65.7677L56.1212 66.1213ZM60.3634 66.1213L60.717 65.7677L60.7169 65.7677L60.3634 66.1213ZM71.4699 77.2277L71.1163 77.5813C71.3116 77.7766 71.6281 77.7766 71.8234 77.5813L71.4699 77.2277ZM90.8136 57.885L91.1672 58.2385C92.1435 57.2622 93.7269 57.2622 94.7032 58.2385L95.0568 57.885L95.4103 57.5314C94.0435 56.1646 91.8269 56.1646 90.4601 57.5314L90.8136 57.885ZM95.0568 57.885L94.7032 58.2385C95.6791 59.2147 95.6791 60.7974 94.7032 61.7736L95.0568 62.1272L95.4104 62.4807C96.7767 61.1139 96.7767 58.8982 95.4104 57.5315L95.0568 57.885ZM95.0568 62.1272L94.7032 61.7736L73.2608 83.216L73.6144 83.5695L73.9679 83.9231L95.4103 62.4807L95.0568 62.1272ZM73.6144 83.5695L73.2608 83.216C72.8291 83.6477 72.2795 83.8877 71.7148 83.9377L71.7589 84.4357L71.803 84.9338C72.592 84.8639 73.3636 84.5274 73.9679 83.9231L73.6144 83.5695ZM71.7589 84.4357L71.7081 83.9383C70.9845 84.0123 70.2377 83.7728 69.6847 83.2199L69.3312 83.5734L68.9776 83.927C69.7525 84.7019 70.8004 85.0363 71.8097 84.9332L71.7589 84.4357ZM69.3312 83.5734L69.6847 83.2199L56.4748 70.0099L56.1212 70.3635L55.7677 70.717L68.9776 83.927L69.3312 83.5734ZM56.1212 70.3635L56.4748 70.01C55.4987 69.0336 55.4986 67.451 56.4748 66.4748L56.1212 66.1213L55.7677 65.7677C54.4009 67.1345 54.4011 69.3502 55.7676 70.717L56.1212 70.3635ZM56.1212 66.1213L56.4748 66.4748C57.451 65.4987 59.0335 65.4987 60.0099 66.4749L60.3634 66.1213L60.7169 65.7677C59.3501 64.4012 57.1345 64.4009 55.7677 65.7677L56.1212 66.1213ZM60.3634 66.1213L60.0099 66.4748L71.1163 77.5813L71.4699 77.2277L71.8234 76.8742L60.717 65.7677L60.3634 66.1213ZM71.4699 77.2277L71.8234 77.5813L91.1672 58.2385L90.8136 57.885L90.4601 57.5314L71.1163 76.8742L71.4699 77.2277Z" fill="#363638"/>
</g>
<circle cx="75" cy="75" r="59.5" stroke="#515151"/>
<circle cx="17" cy="29" r="3" fill="#3B3B3C"/>
<circle cx="146" cy="15" r="3" fill="#3B3B3C"/>
<circle cx="139" cy="32" r="5" fill="#3B3B3C"/>
<circle cx="8" cy="112" r="6" fill="#3B3B3C"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,29 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="147" height="123" viewBox="0 0 147 123" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 3">
<g id="Group 5">
<circle id="Ellipse 5" cx="73" cy="63" r="60" fill="#EBECEE"/>
<g id="Mask group">
<mask id="mask0_0_4" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="13" y="3" width="120" height="120">
<circle id="Ellipse 6" cx="73" cy="63" r="60" fill="#F2F3F6"/>
</mask>
<g mask="url(#mask0_0_4)">
<g id="Group 4">
<rect id="Rectangle 4" x="31.5" y="31.5" width="83" height="98" rx="3.5" fill="white" stroke="#D2D4DB"/>
<rect id="Rectangle 5" opacity="0.3" x="52" y="85" width="42" height="6" rx="3" fill="#515A6E"/>
<rect id="Rectangle 6" opacity="0.3" x="52" y="97" width="42" height="6" rx="3" fill="#515A6E"/>
<rect id="Rectangle 7" opacity="0.3" x="62" y="109" width="22" height="6" rx="3" fill="#515A6E"/>
<g id="Union" opacity="0.3">
<path d="M88.8137 45.885C89.9853 44.7134 91.8853 44.7134 93.0569 45.885C94.228 47.0565 94.228 48.9557 93.0569 50.1272L71.6145 71.5696C71.0965 72.0876 70.4358 72.3758 69.759 72.4358C68.8925 72.5243 67.9952 72.2374 67.3313 71.5735L54.1213 58.3635C52.95 57.1919 52.9498 55.2928 54.1213 54.1213C55.2928 52.9498 57.1919 52.95 58.3635 54.1213L69.47 65.2278L88.8137 45.885Z" fill="#515A6E"/>
<path d="M88.8137 45.885L89.1673 46.2386L89.1673 46.2385L88.8137 45.885ZM93.0569 45.885L93.4105 45.5315L93.4104 45.5314L93.0569 45.885ZM93.0569 50.1272L93.4104 50.4807L93.4105 50.4807L93.0569 50.1272ZM69.759 72.4358L69.7149 71.9377L69.7082 71.9384L69.759 72.4358ZM67.3313 71.5735L66.9777 71.927V71.927L67.3313 71.5735ZM54.1213 58.3635L53.7677 58.717L53.7678 58.7171L54.1213 58.3635ZM54.1213 54.1213L53.7678 53.7678L53.7678 53.7678L54.1213 54.1213ZM58.3635 54.1213L58.7171 53.7678L58.717 53.7677L58.3635 54.1213ZM69.47 65.2278L69.1164 65.5813C69.3117 65.7766 69.6282 65.7766 69.8235 65.5813L69.47 65.2278ZM88.8137 45.885L89.1673 46.2385C90.1436 45.2622 91.727 45.2622 92.7033 46.2385L93.0569 45.885L93.4104 45.5314C92.0436 44.1646 89.827 44.1646 88.4602 45.5314L88.8137 45.885ZM93.0569 45.885L92.7033 46.2385C93.6792 47.2148 93.6792 48.7975 92.7033 49.7737L93.0569 50.1272L93.4105 50.4807C94.7768 49.1139 94.7768 46.8982 93.4105 45.5315L93.0569 45.885ZM93.0569 50.1272L92.7033 49.7736L71.2609 71.216L71.6145 71.5696L71.968 71.9231L93.4104 50.4807L93.0569 50.1272ZM71.6145 71.5696L71.2609 71.216C70.8292 71.6477 70.2796 71.8877 69.7149 71.9377L69.759 72.4358L69.8031 72.9338C70.5921 72.864 71.3637 72.5274 71.968 71.9231L71.6145 71.5696ZM69.759 72.4358L69.7082 71.9384C68.9846 72.0123 68.2378 71.7729 67.6848 71.2199L67.3313 71.5735L66.9777 71.927C67.7526 72.7019 68.8005 73.0363 69.8098 72.9332L69.759 72.4358ZM67.3313 71.5735L67.6848 71.2199L54.4749 58.01L54.1213 58.3635L53.7678 58.7171L66.9777 71.927L67.3313 71.5735ZM54.1213 58.3635L54.4749 58.01C53.4988 57.0336 53.4987 55.4511 54.4749 54.4749L54.1213 54.1213L53.7678 53.7678C52.401 55.1346 52.4012 57.3502 53.7677 58.717L54.1213 58.3635ZM54.1213 54.1213L54.4749 54.4749C55.4511 53.4987 57.0336 53.4988 58.01 54.4749L58.3635 54.1213L58.717 53.7677C57.3502 52.4012 55.1346 52.401 53.7678 53.7678L54.1213 54.1213ZM58.3635 54.1213L58.01 54.4749L69.1164 65.5813L69.47 65.2278L69.8235 64.8742L58.7171 53.7678L58.3635 54.1213ZM69.47 65.2278L69.8235 65.5813L89.1673 46.2386L88.8137 45.885L88.4602 45.5314L69.1164 64.8742L69.47 65.2278Z" fill="#001034"/>
</g>
</g>
</g>
</g>
<circle id="Ellipse 6_2" cx="73" cy="63" r="59.5" stroke="#CBCDD3"/>
</g>
<circle id="Ellipse 2" cx="15" cy="17" r="3" fill="#EBECEE"/>
<circle id="Ellipse 3" cx="144" cy="3" r="3" fill="#EBECEE"/>
<circle id="Ellipse 4" cx="137" cy="20" r="5" fill="#EBECEE"/>
<circle id="Ellipse 1" cx="6" cy="100" r="6" fill="#EBECEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,6 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Users / User">
<circle id="Vector" cx="7" cy="3.5" r="2.33333" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_2" d="M11.6667 10.2083C11.6667 11.6581 11.6667 12.8333 7 12.8333C2.33333 12.8333 2.33333 11.6581 2.33333 10.2083C2.33333 8.75859 4.42267 7.58333 7 7.58333C9.57733 7.58333 11.6667 8.75859 11.6667 10.2083Z" stroke="#999999" stroke-width="1.25"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 557 B

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Essentional, UI / Flag 2">
<path id="Vector" d="M2.91667 12.8333V8.16667M2.91667 8.16667V2.33333M2.91667 8.16667L4.35789 7.87842C5.3207 7.68586 6.31873 7.77749 7.23038 8.14215C8.21828 8.53731 9.30558 8.6111 10.3378 8.35305L10.3962 8.33844C10.7381 8.25297 10.9002 7.86152 10.7189 7.55934L9.80856 6.04204C9.60935 5.71003 9.50975 5.54403 9.48614 5.36346C9.47629 5.28814 9.47629 5.21186 9.48614 5.13654C9.50975 4.95597 9.60935 4.78997 9.80856 4.45796L10.5544 3.21493C10.7496 2.8896 10.454 2.49067 10.0859 2.58269C9.21744 2.79981 8.30263 2.73772 7.47146 2.40525L7.23038 2.30882C6.31873 1.94416 5.3207 1.85253 4.35789 2.04509L2.91667 2.33333M2.91667 2.33333V1.16667" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 917 B

View File

@ -0,0 +1,12 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Folders / Folder With Files" clip-path="url(#clip0_0_53)">
<path id="Vector" d="M10.5 5.83333L7.58333 5.83333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_2" d="M5.83333 1.75H9.625C9.89591 1.75 10.0314 1.75 10.1451 1.76497C10.9304 1.86836 11.5483 2.4863 11.6517 3.27158C11.6667 3.3853 11.6667 3.52075 11.6667 3.79167" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_3" d="M1.16667 4.05402C1.16667 3.53921 1.16667 3.2818 1.20712 3.06739C1.38521 2.12351 2.12351 1.38521 3.06739 1.20712C3.2818 1.16667 3.53921 1.16667 4.05402 1.16667C4.27958 1.16667 4.39236 1.16667 4.50075 1.1768C4.96805 1.2205 5.4113 1.4041 5.77263 1.70363C5.85644 1.77311 5.93619 1.85286 6.09569 2.01235L6.41667 2.33333C6.89254 2.8092 7.13047 3.04714 7.4154 3.20566C7.57192 3.29275 7.73795 3.36152 7.91021 3.41062C8.22377 3.5 8.56027 3.5 9.23325 3.5H9.45122C10.9868 3.5 11.7545 3.5 12.2536 3.94885C12.2995 3.99014 12.3432 4.03383 12.3845 4.07973C12.8333 4.57879 12.8333 5.34656 12.8333 6.88211V8.16667C12.8333 10.3666 12.8333 11.4665 12.1499 12.1499C11.4665 12.8333 10.3666 12.8333 8.16667 12.8333H5.83333C3.63345 12.8333 2.5335 12.8333 1.85008 12.1499C1.16667 11.4665 1.16667 10.3666 1.16667 8.16667V4.05402Z" stroke="#999999" stroke-width="1.25"/>
</g>
<defs>
<clipPath id="clip0_0_53">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Astronomy / Star">
<path id="Vector" d="M7 11.6667V10.2667M7 3.73333V2.33333M11.6667 7H10.2667M3.73333 7H2.33333M10.2998 3.70017L9.30988 4.69012M4.69012 9.30988L3.70017 10.2998M3.70004 3.70027L4.68999 4.69022M9.30976 9.30998L10.2997 10.2999" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 498 B

View File

@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / List / Checklist">
<path id="Vector" d="M1.16667 3.20833L1.875 4.08333L4.375 1.75" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.16667 7.29167L1.875 8.16667L4.375 5.83333" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M1.16667 11.375L1.875 12.25L4.375 9.91667" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M12.8333 11.0833L7 11.0833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_5" d="M12.8333 7L7 7" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_6" d="M12.8333 2.91667L7 2.91667" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 997 B

View File

@ -0,0 +1,7 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / List / List">
<path id="Vector" d="M11.6667 4.08333L2.33333 4.08333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_2" d="M8.75 7L2.33333 7" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_3" d="M5.25 9.91667H2.33333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -21,7 +21,7 @@ negative:
- 团队仪表盘不统计私密任务和子任务
- 团队仪表盘不会授予修改下属任务的权限
- 已关闭负责人视角可见性的项目不参与统计
last_verified: v1.8.69
last_verified: v1.9.18
---
# 部门负责人仪表盘统计口径
@ -45,3 +45,5 @@ last_verified: v1.8.69
## 分布数据
成员任务分配按超期数降序、任务总数降序排列。流程阶段分为待处理、进行中、验收/测试;没有工作流或不属于后两种状态的普通未完成任务归待处理。多负责人任务会分别计入各负责人工作量,但团队任务总数按任务去重。
优先级分布以环形图和档位列表展示,圆心显示未完成任务总数。图形比例根据真实任务数量计算,颜色沿用优先级配置,不固定为设计示例中的四档。扇区之间保留间隙,无边框和阴影,悬停时放大;任务行以圆点标示优先级颜色。点击扇区或档位可筛选下方任务;无任务时显示空环和暂无数据。

View File

@ -18,7 +18,7 @@ negative:
- 布局切换只适用于个人视角
- 四象限不显示待开始和本周完成分组
- 用户不能自定义象限名称或顺序
last_verified: v1.8.69
last_verified: v1.9.18
---
# 切换仪表盘列表和四象限布局
@ -28,13 +28,16 @@ last_verified: v1.8.69
## 列表布局
- 顶部显示已超期、今日到期、待完成、我协助的四张摘要卡。
- 摘要卡使用不同颜色区分任务类别,零值仍保留配色;补充统计可通过悬停查看。「待开始」非零时继续显示在待完成摘要卡中。
- 展开的分组各自显示表头,桌面端列顺序为任务、子任务、项目、优先级、截止时间、状态;窄屏会隐藏部分辅助列。
- 任务按已超期、今日到期、待完成、待开始、我协助的分组;有稳定完成记录时还会显示本周完成。
- 普通任务分组默认展示前 10 条,本周完成默认展示最近 5 条,可展开其余任务。
- 每个分组可独立收起,规则见 [[dashboard.collapse.howto]]。
## 四象限布局
- 固定显示已超期、今日到期、待完成、我协助的四个象限。
- 每个象限默认显示前 5 条,数量更多时可以展开其余任务,再次点击可收起。
- 空象限会显示对应的空状态提示。
- 每个象限默认显示前 7 条,点击「展开显示更多」可查看其余任务,再次点击「收起」可恢复。
- 有 17 条任务时显示「全部显示完毕」;今日到期恰好 1 条时改为「今天只有这一项,处理完就轻松了」。无任务时仍显示对应空状态提示。
- 空象限显示插图和对应的空状态提示;任务仍可打开详情或通过状态菜单操作。
待开始和本周完成只出现在列表布局,不会加入四象限。

View File

@ -19,7 +19,7 @@ negative:
- 本周完成卡片不能下钻到未完成任务列表
- 重点任务列表每次加载 20 条,需要点击加载更多
- 高优先级使用系统优先级设置中的前两档
last_verified: v1.8.69
last_verified: v1.9.18
---
# 下钻团队成员、优先级和重点关注任务
@ -32,9 +32,9 @@ last_verified: v1.8.69
- 重点关注标签已超期、3 天内到期、高优先级、未分配负责人。
## 成员和优先级显示
成员列表默认显示前 6 人,可展开全部。进度条悬停约 300 毫秒后显示未完成总数、超期数量和占比,以及待处理、进行中、验收/测试三个阶段的数量与占比。
成员列表默认显示前 5 人,可展开全部。进度条悬停约 300 毫秒后显示未完成总数、超期数量和占比,以及待处理、进行中、验收/测试三个阶段的数量与占比。
优先级分布只显示有任务的档位,默认前 6 项,可展开其余优先级;“未设置”会作为独立档位出现。
优先级分布的环形图展示全部有任务的档位,右侧列表默认前 6 项,可展开其余优先级;“未设置”会作为独立档位出现。点击环形图扇区或列表档位均可下钻筛选。下方关注条件采用下划线标签切换,临时筛选仍可点击关闭。
## 任务列表
筛选后自动滚动到重点关注区域。每页加载 20 条,点击「加载更多」继续获取;点击任务行打开任务详情。通过负责人视角额外看到的任务仍然只读。

View File

@ -0,0 +1,21 @@
<template>
<img class="dashboard-icon" :src="$A.mainUrl(`images/dashboard/${name}.svg`)" :width="size" :height="size" alt="" aria-hidden="true"/>
</template>
<script>
export default {
props: {
name: {type: String, required: true},
size: {type: Number, default: 14},
},
}
</script>
<style scoped>
.dashboard-icon {
display: inline-block;
flex-shrink: 0;
object-fit: contain;
vertical-align: middle;
}
</style>

View File

@ -0,0 +1,105 @@
<template>
<div class="dashboard-priority-chart">
<div ref="chart" class="priority-chart-canvas" :aria-label="$L('优先级分布')"/>
<div class="priority-chart-total">
<strong :class="{'total-long': String(total).length > 5}">{{total}}</strong>
<span>{{$L('未完成任务')}}</span>
</div>
</div>
</template>
<script>
import {init, use} from 'echarts/core';
import {PieChart} from 'echarts/charts';
import {CanvasRenderer} from 'echarts/renderers';
import {TooltipComponent} from 'echarts/components';
use([PieChart, CanvasRenderer, TooltipComponent]);
export default {
props: {
items: {type: Array, default: () => []},
total: {type: Number, default: 0},
},
watch: {
items: {deep: true, handler() { this.renderChart() }},
},
mounted() {
this.chart = init(this.$refs.chart)
this.chart.on('click', params => {
const item = this.items[params.dataIndex]
if (item) this.$emit('select', item)
})
this.renderChart()
},
beforeDestroy() {
if (this.chart) this.chart.dispose()
},
methods: {
renderChart() {
if (!this.chart) return
this.chart.setOption({
tooltip: {trigger: 'item', confine: true},
series: [{
type: 'pie',
radius: [70, 90],
center: ['50%', '50%'],
startAngle: 180,
minAngle: 3,
padAngle: 2.72,
label: {show: false},
labelLine: {show: false},
stillShowZeroSum: false,
emptyCircleStyle: {color: '#e9ebef'},
itemStyle: {borderWidth: 0, borderRadius: 4, shadowBlur: 0},
emphasis: {scaleSize: 10, itemStyle: {borderWidth: 0, shadowBlur: 0}},
data: this.items.map(item => ({
name: item.name,
value: item.num,
itemStyle: {color: item.color || '#bbc2db', opacity: 0.55},
})),
}],
})
},
},
}
</script>
<style scoped>
.dashboard-priority-chart {
position: relative;
width: 180px;
height: 180px;
flex: 0 0 180px;
}
.priority-chart-canvas {
/* Reserve canvas space for the 10px emphasis expansion. */
position: absolute;
top: -12px;
left: -12px;
width: 204px;
height: 204px;
}
.priority-chart-total {
position: absolute;
inset: 36px 24px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
pointer-events: none;
color: #666;
font-size: 14px;
text-align: center;
}
.priority-chart-total strong {
max-width: 100%;
font-size: 40px;
line-height: 1.2;
color: #2a2b2d;
overflow-wrap: anywhere;
}
.priority-chart-total .total-long {
font-size: 24px;
}
</style>

View File

@ -2,35 +2,29 @@
<div class="dashboard-team">
<!--核心指标-->
<ul class="dashboard-cards">
<li @click="onBlock('uncompleted')">
<li class="stat-uncompleted" @click="onBlock('uncompleted')">
<div class="card-label">{{$L('未完成')}}</div>
<div class="card-data">
<span class="card-num">{{blocks.uncompleted || 0}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}</span>
</div>
<div class="card-link">{{$L('查看任务')}} </div>
</li>
<li @click="onBlock('overdue')">
<li class="stat-overdue" @click="onBlock('overdue')">
<div class="card-label">{{$L('已超期')}}</div>
<div class="card-data">
<span class="card-num num-red">{{blocks.overdue || 0}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}<template v-if="blocks.overdue_owner_count"> · {{$L('涉及 (*) ', blocks.overdue_owner_count)}}</template></span>
<span v-if="blocks.overdue_owner_count" class="card-sub">{{$L('涉及 (*) ', blocks.overdue_owner_count)}}</span>
</div>
<div class="card-link link-red">{{$L('查看任务')}} </div>
</li>
<li @click="onBlock('soon')">
<li class="stat-soon" @click="onBlock('soon')">
<div class="card-label">{{$L('(*) 天内到期', 3)}}</div>
<div class="card-data">
<span class="card-num num-orange">{{blocks.due_soon || 0}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}</span>
</div>
<div class="card-link link-orange">{{$L('查看任务')}} </div>
</li>
<li class="card-static">
<li class="card-static stat-completed" :title="weekDiffText">
<div class="card-label">{{$L('本周完成')}}</div>
<div class="card-data">
<span class="card-num num-green">{{blocks.week_completed || 0}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}<template v-if="weekDiffText"> · {{weekDiffText}}</template></span>
</div>
</li>
</ul>
@ -40,16 +34,16 @@
<div class="card-head">
<span class="head-title">{{$L('成员任务分配')}}</span>
<span class="head-legend">
<span><i style="background:#bfe3cd"></i>{{$L('待处理')}}</span>
<span><i style="background:#1e9e55"></i>{{$L('进行中')}}</span>
<span><i style="background:#6ba7d8"></i>{{$L('验收/测试')}}</span>
<span><i style="background:#bcc1cc"></i>{{$L('待处理')}}</span>
<span><i style="background:#85acff"></i>{{$L('进行中')}}</span>
<span><i style="background:#8bcf70"></i>{{$L('验收/测试')}}</span>
</span>
</div>
<div v-if="showStatsLoading" class="team-stats-loading"><Loading/></div>
<template v-else>
<ul class="member-list">
<li v-for="member in visibleMembers" :key="member.userid" class="member-row" @click="onMember(member)">
<UserAvatar class="team-avatar" :userid="member.userid" :size="26"/>
<UserAvatar class="team-avatar" :userid="member.userid" :size="24"/>
<span class="member-name">{{member.nickname}}</span>
<ETooltip
:disabled="$isEEUIApp || $store.state.windowTouch || member.total === 0"
@ -59,9 +53,9 @@
popper-class="dashboard-member-progress-popper">
<span class="member-track">
<span class="member-bar" :style="{width: memberBarWidth(member)}">
<i v-if="member.segments.start > 0" :style="{flex: member.segments.start, background: '#bfe3cd'}"></i>
<i v-if="member.segments.progress > 0" :style="{flex: member.segments.progress, background: '#1e9e55'}"></i>
<i v-if="member.segments.test > 0" :style="{flex: member.segments.test, background: '#6ba7d8'}"></i>
<i v-if="member.segments.start > 0" :style="{flex: member.segments.start, background: '#bcc1cc'}"></i>
<i v-if="member.segments.progress > 0" :style="{flex: member.segments.progress, background: '#85acff'}"></i>
<i v-if="member.segments.test > 0" :style="{flex: member.segments.test, background: '#8bcf70'}"></i>
</span>
</span>
<div slot="content" class="member-progress-tooltip">
@ -105,23 +99,24 @@
<span v-if="!showStatsLoading" class="head-note">{{$L('未完成 (*) ', blocks.uncompleted || 0)}}</span>
</div>
<div v-if="showStatsLoading" class="team-stats-loading"><Loading/></div>
<div v-else class="priority-list">
<div v-for="item in visiblePriorityList" :key="item.level" class="priority-row" @click="onPriority(item)">
<div class="priority-head">
<span class="priority-name">{{item.name}}</span>
<span class="priority-num">{{$L('(*) 项', item.num)}} · {{item.percent}}%</span>
</div>
<div class="priority-bar">
<i :style="{width: item.percent + '%', background: item.color}"></i>
<div v-else class="priority-distribution">
<DashboardPriorityChart :items="priorityList" :total="blocks.uncompleted || 0" @select="onPriority"/>
<div class="priority-list">
<button v-for="item in visiblePriorityList" :key="item.level" type="button" class="priority-row" @click="onPriority(item)">
<div class="priority-head">
<i class="priority-dot" :style="{backgroundColor: item.color}"></i>
<span class="priority-name">{{item.name}}</span>
<span class="priority-num">{{$L('(*) 项', item.num)}} · {{item.percent}}%</span>
</div>
</button>
<div
v-if="priorityList.length > priorityLimit"
class="priority-tip priority-more"
@click="priorityExpand = !priorityExpand">
{{priorityExpand ? $L('收起') : $L('查看全部 (*) 个优先级', priorityList.length) + ' →'}}
</div>
<span v-if="priorityList.length === 0" class="priority-tip">{{$L('暂无数据')}}</span>
</div>
<div
v-if="priorityList.length > priorityLimit"
class="priority-tip priority-more"
@click="priorityExpand = !priorityExpand">
{{priorityExpand ? $L('收起') : $L('查看全部 (*) 个优先级', priorityList.length) + ' →'}}
</div>
<div v-else class="priority-tip">{{$L('点击任一档位可下钻到任务列表')}}</div>
</div>
</div>
</div>
@ -129,7 +124,6 @@
<div class="team-focus-section" :class="{'focus-scroll-reserve': focusScrollReserved}">
<div ref="focusCard" class="dashboard-card team-focus">
<div class="card-head focus-head">
<span class="head-title">{{$L('重点关注任务')}}</span>
<span
v-for="chip in chips"
:key="chip.type"
@ -142,19 +136,19 @@
</div>
<div class="focus-table">
<div class="focus-row focus-thead">
<span>{{$L('任务')}}</span>
<span class="f-project">{{$L('项目')}}</span>
<span class="f-owner">{{$L('负责人')}}</span>
<span class="f-priority">{{$L('优先级')}}</span>
<span class="f-status">{{$L('状态')}}</span>
<span class="f-end">{{$L('截止时间')}}</span>
<span><DashboardIcon name="task"/>{{$L('任务')}}</span>
<span class="f-project"><DashboardIcon name="project"/>{{$L('项目')}}</span>
<span class="f-owner"><DashboardIcon name="owner"/>{{$L('负责人')}}</span>
<span class="f-priority"><DashboardIcon name="priority"/>{{$L('优先级')}}</span>
<span class="f-status"><DashboardIcon name="status"/>{{$L('状态')}}</span>
<span class="f-end"><DashboardIcon name="calendar"/>{{$L('截止时间')}}</span>
</div>
<div v-for="item in currentList.list" :key="item.id" class="focus-row" @click="onTask(item)">
<span class="f-name">{{item.name}}</span>
<span class="f-project">{{item.project_name}}</span>
<span class="f-owner">
<template v-if="item.owner">
<UserAvatar class="team-avatar" :userid="item.owner.userid" :size="20"/>
<UserAvatar class="team-avatar" :userid="item.owner.userid" :size="24"/>
<span class="owner-name">{{item.owner.nickname}}</span>
<em v-if="item.owners.length > 1" class="owner-more">+{{item.owners.length - 1}}</em>
</template>
@ -164,7 +158,7 @@
</span>
<span class="f-priority">
<template v-if="item.p_name">
<i class="priority-dot" :style="{backgroundColor: item.p_color}"></i>
<i class="priority-glyph" :style="{backgroundColor: item.p_color}"></i>
<span>{{item.p_name}}</span>
</template>
<template v-else></template>
@ -189,9 +183,12 @@
<script>
import {mapState} from "vuex";
import dashboardTimeMixin from "./dashboard-time-mixin";
import DashboardIcon from "./DashboardIcon";
import DashboardPriorityChart from "./DashboardPriorityChart";
export default {
name: "DashboardTeam",
components: {DashboardIcon, DashboardPriorityChart},
mixins: [dashboardTimeMixin],
props: {
initialFocus: {
@ -219,7 +216,7 @@ export default {
pageSize: 20,
refreshSeconds: 60,
memberLimit: 6,
memberLimit: 5,
memberExpand: false,
priorityLimit: 6,
priorityExpand: false,
@ -555,9 +552,9 @@ export default {
memberProgressDetails(member) {
const total = Math.max(member.total || 0, 1)
return [
{type: 'start', label: this.$L('待处理'), color: '#bfe3cd', count: member.segments.start || 0},
{type: 'progress', label: this.$L('进行中'), color: '#1e9e55', count: member.segments.progress || 0},
{type: 'test', label: this.$L('验收/测试'), color: '#6ba7d8', count: member.segments.test || 0},
{type: 'start', label: this.$L('待处理'), color: '#bcc1cc', count: member.segments.start || 0},
{type: 'progress', label: this.$L('进行中'), color: '#85acff', count: member.segments.progress || 0},
{type: 'test', label: this.$L('验收/测试'), color: '#8bcf70', count: member.segments.test || 0},
].filter(item => item.count > 0).map(item => {
return {
...item,

View File

@ -76,36 +76,32 @@
<!--列表布局-->
<template v-if="layout === 'list'">
<ul class="dashboard-cards personal-panel">
<li :class="{'card-off': dashboardTask.overdue_count === 0}" @click="scrollTo('overdue')">
<li :class="{'card-off': dashboardTask.overdue_count === 0}" :title="overdueMaxDays > 0 ? $L('最久 (*) 天', overdueMaxDays) : ''" @click="scrollTo('overdue')">
<div class="card-label">{{getTitle('overdue')}}</div>
<div class="card-data">
<span class="card-num num-red">{{dashboardTask.overdue_count}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}<template v-if="overdueMaxDays > 0"> · {{$L('最久 (*) ', overdueMaxDays)}}</template></span>
</div>
</li>
<li :class="{'card-off': dashboardTask.today_count === 0}" @click="scrollTo('today')">
<li :class="{'card-off': dashboardTask.today_count === 0}" :title="todayNearest ? $L('最近') + ' ' + todayNearest : ''" @click="scrollTo('today')">
<div class="card-label">{{getTitle('today')}}</div>
<div class="card-data">
<span class="card-num num-orange">{{dashboardTask.today_count}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}<template v-if="todayNearest"> · {{$L('最近')}} {{todayNearest}}</template></span>
</div>
</li>
<li :class="{'card-off': dashboardTask.todo_count === 0}" @click="scrollTo('todo')">
<div class="card-label">{{getTitle('todo')}}</div>
<div class="card-data">
<span class="card-num">{{dashboardTask.todo_count}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}</span>
</div>
<div v-if="upcomingTask.count > 0" class="duo-upcoming" @click.stop="scrollTo('upcoming')">
<div class="side-num">{{upcomingTask.count}}</div>
<div class="side-label">{{$L('待开始')}}</div>
</div>
</li>
<li :class="{'card-off': assistTask.length === 0}" @click="scrollTo('assist')">
<li :class="{'card-off': assistTask.length === 0}" :title="assistTodayCount > 0 ? $L('今天 (*) 项到期', assistTodayCount) : ''" @click="scrollTo('assist')">
<div class="card-label">{{getTitle('assist')}}</div>
<div class="card-data">
<span class="card-num">{{assistTask.length}}</span>
<span class="card-sub">{{$L('[task_unit].项')}}<template v-if="assistTodayCount > 0"> · {{$L('今天 (*) 项到期', assistTodayCount)}}</template></span>
</div>
</li>
</ul>
@ -143,15 +139,6 @@
</div>
</div>
</div>
<div v-else class="table-row table-thead">
<span></span>
<span>{{$L('任务')}}</span>
<span class="t-project">{{$L('项目')}}</span>
<span class="t-status">{{$L('状态')}}</span>
<span class="t-priority">{{$L('优先级')}}</span>
<span class="t-sub">{{$L('子任务')}}</span>
<span class="t-end">{{$L('截止时间')}}</span>
</div>
<template v-for="group in listColumns">
<div
:key="`head-${group.type}`"
@ -160,8 +147,8 @@
:class="[`group-${group.type}`, {'group-flash': flashType === group.type}]"
@click="toggleGroup(group.type)">
<i class="group-dot"></i>
<span class="group-title">{{group.title}} · {{group.count}}</span>
<i class="group-chevron taskfont" :class="{'chevron-close': group.hidden}">&#xe702;</i>
<span class="group-title">{{group.title}}{{group.count}}</span>
<DashboardIcon name="chevron" :size="16" class="group-chevron" :class="{'chevron-close': group.hidden}"/>
</div>
<template v-if="!group.hidden">
<div v-if="group.list.length === 0" :key="`empty-${group.type}`" class="table-empty-group">
@ -169,6 +156,15 @@
<span>{{listEmptyText(group.type)}}</span>
</div>
<div class="table-body" :key="`list-${group.type}`">
<div class="table-row table-thead">
<span></span>
<span><DashboardIcon name="task"/>{{$L('任务')}}</span>
<span class="t-project"><DashboardIcon name="project"/>{{$L('项目')}}</span>
<span class="t-status"><DashboardIcon name="status"/>{{$L('状态')}}</span>
<span class="t-priority"><DashboardIcon name="priority"/>{{$L('优先级')}}</span>
<span class="t-sub"><DashboardIcon name="subtask"/>{{$L('子任务')}}</span>
<span class="t-end"><DashboardIcon name="calendar"/>{{$L('截止时间')}}</span>
</div>
<div
v-for="item in groupList(group, listLimit(group))"
:key="`${group.type}-${item.id}`"
@ -198,7 +194,7 @@
</span>
<span class="t-priority">
<template v-if="item.p_name">
<i class="priority-dot" :style="{backgroundColor: item.p_color}"></i>
<i class="priority-glyph" :style="{backgroundColor: item.p_color}"></i>
<span>{{item.p_name}}</span>
</template>
<template v-else></template>
@ -235,7 +231,7 @@
<div class="quad-head">
<i class="group-dot"></i>
<span class="group-title">{{group.title}}</span>
<span class="quad-num" :class="{'num-zero': group.count === 0}">{{group.count}}</span>
<span class="quad-num">{{group.count}}</span>
</div>
<div
v-for="item in groupList(group, quadLimit)"
@ -253,22 +249,26 @@
class="status-pill"
:class="item.flow_item_name ? item.flow_item_status : {end: !!item.complete_at}"
@click.stop="openMenu($event, item)">{{item.flow_item_name || (item.complete_at ? $L('已完成') : $L('未完成'))}}</em>
<span v-if="item.p_name" class="quad-priority"><i class="priority-dot" :style="{backgroundColor: item.p_color}"></i></span>
<span v-if="item.sub_num > 0" class="quad-sub">{{item.sub_complete}}/{{item.sub_num}}</span>
<span v-if="item.end_at" class="t-end" :class="deadlineClass(item.end_at)">{{deadlineText(item.end_at)}}</span>
<span class="quad-priority" :title="item.p_name"><i v-if="item.p_name" class="priority-glyph" :style="{backgroundColor: item.p_color}"></i><span>{{item.p_name || '—'}}</span></span>
<span class="quad-sub">{{item.sub_num > 0 ? `${item.sub_complete}/${item.sub_num}` : '—'}}</span>
<span class="t-end" :class="deadlineClass(item.end_at)" :title="item.end_at">{{deadlineText(item.end_at) || '—'}}</span>
</div>
<div v-if="group.list.length === 0" class="quad-empty">
<span class="empty-icon"><Icon type="md-checkmark"/></span>
<span class="dashboard-empty-art">
<img class="empty-art-light" :src="emptyArt" width="147" height="123" alt=""/>
<img class="empty-art-dark" :src="emptyDarkArt" width="150" height="150" alt=""/>
</span>
<span>{{quadEmptyText(group.type)}}</span>
</div>
<div v-else-if="group.list.length <= quadLimit" class="quad-filler">
{{group.type === 'today' && group.list.length === 1 ? $L('今天只有这一项,处理完就轻松了') : $L('全部显示完毕')}}
</div>
<div
v-else
v-else-if="group.list.length > quadLimit"
class="card-more"
@click="toggleExpand(group.type)">
{{expandedGroups.includes(group.type) ? $L('收起') : $L('数量较多,仅显示最近 (*) 项,展开其余 (*) 项', quadLimit, group.list.length - quadLimit) + ' →'}}
{{expandedGroups.includes(group.type) ? $L('收起') : $L('展开显示更多')}}
<DashboardIcon name="chevron" :size="12" :class="{'more-expanded': expandedGroups.includes(group.type)}"/>
</div>
</div>
</div>
@ -292,6 +292,7 @@
import {mapGetters, mapState} from "vuex";
import TaskMenu from "./components/TaskMenu";
import DashboardTeam from "./components/DashboardTeam";
import DashboardIcon from "./components/DashboardIcon";
import DepartmentOwnerView from "./components/DepartmentOwnerView";
import dashboardTimeMixin from "./components/dashboard-time-mixin";
import emitter from "../../store/events";
@ -304,10 +305,12 @@ const prefsCache = {
}
export default {
components: {TaskMenu, DashboardTeam, DepartmentOwnerView},
components: {TaskMenu, DashboardTeam, DashboardIcon, DepartmentOwnerView},
mixins: [dashboardTimeMixin],
data() {
return {
emptyArt: $A.mainUrl('images/dashboard/empty.svg'),
emptyDarkArt: $A.mainUrl('images/dashboard/empty-black.svg'),
licenseTimer: null,
view: prefsCache.view,
@ -320,7 +323,7 @@ export default {
expandedGroups: [],
groupLimit: 10,
completedLimit: 5,
quadLimit: 5,
quadLimit: 7,
flashType: '',
flashTimer: null,

View File

@ -486,6 +486,37 @@ body.dark-mode-reverse {
}
.page-dashboard {
.dashboard-empty-art {
.empty-art-light {
display: none;
}
.empty-art-dark {
display: block;
}
}
.dashboard-cards > li {
.card-label {
color: rgba(0, 0, 0, 0.85);
}
.card-data .card-num {
color: #000;
}
.card-data .card-sub {
background-color: rgba(255, 236, 232, 0.4);
}
.duo-upcoming {
.side-num,
.side-label {
color: #000;
}
}
}
.dashboard-wrapper {
.dashboard-block {
> li {

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,27 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Time / Calendar">
<g clip-path="url(#clip0_0_65)">
<path id="Vector" d="M1.16667 7C1.16667 4.80011 1.16667 3.70017 1.85008 3.01675C2.5335 2.33333 3.63345 2.33333 5.83333 2.33333H8.16667C10.3666 2.33333 11.4665 2.33333 12.1499 3.01675C12.8333 3.70017 12.8333 4.80011 12.8333 7V8.16667C12.8333 10.3666 12.8333 11.4665 12.1499 12.1499C11.4665 12.8333 10.3666 12.8333 8.16667 12.8333H5.83333C3.63345 12.8333 2.5335 12.8333 1.85008 12.1499C1.16667 11.4665 1.16667 10.3666 1.16667 8.16667V7Z" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_2" d="M4.08333 2.33333V1.45833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_3" d="M9.91667 2.33333V1.45833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_4" d="M1.45833 5.25H12.5417" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<g id="Vector_5">
<path d="M10.5 9.91667C10.5 10.2388 10.2388 10.5 9.91667 10.5C9.5945 10.5 9.33333 10.2388 9.33333 9.91667C9.33333 9.5945 9.5945 9.33333 9.91667 9.33333C10.2388 9.33333 10.5 9.5945 10.5 9.91667Z" fill="#999999"/>
<path d="M10.5 7.58333C10.5 7.9055 10.2388 8.16667 9.91667 8.16667C9.5945 8.16667 9.33333 7.9055 9.33333 7.58333C9.33333 7.26117 9.5945 7 9.91667 7C10.2388 7 10.5 7.26117 10.5 7.58333Z" fill="#999999"/>
</g>
<g id="Vector_6">
<path d="M7.58333 9.91667C7.58333 10.2388 7.32217 10.5 7 10.5C6.67783 10.5 6.41667 10.2388 6.41667 9.91667C6.41667 9.5945 6.67783 9.33333 7 9.33333C7.32217 9.33333 7.58333 9.5945 7.58333 9.91667Z" fill="#999999"/>
<path d="M7.58333 7.58333C7.58333 7.9055 7.32217 8.16667 7 8.16667C6.67783 8.16667 6.41667 7.9055 6.41667 7.58333C6.41667 7.26117 6.67783 7 7 7C7.32217 7 7.58333 7.26117 7.58333 7.58333Z" fill="#999999"/>
</g>
<g id="Vector_7">
<path d="M4.66667 9.91667C4.66667 10.2388 4.4055 10.5 4.08333 10.5C3.76117 10.5 3.5 10.2388 3.5 9.91667C3.5 9.5945 3.76117 9.33333 4.08333 9.33333C4.4055 9.33333 4.66667 9.5945 4.66667 9.91667Z" fill="#999999"/>
<path d="M4.66667 7.58333C4.66667 7.9055 4.4055 8.16667 4.08333 8.16667C3.76117 8.16667 3.5 7.9055 3.5 7.58333C3.5 7.26117 3.76117 7 4.08333 7C4.4055 7 4.66667 7.26117 4.66667 7.58333Z" fill="#999999"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_0_65">
<rect width="14" height="14" rx="5" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Arrows / Alt Arrow Down">
<path id="Vector" d="M12.6667 6L8 10L3.33333 6" stroke="#666666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 353 B

View File

@ -0,0 +1,19 @@
<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="75" cy="75" r="60" fill="#3B3B3C"/>
<mask id="mask0_469_19160" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="15" y="15" width="120" height="120">
<circle cx="75" cy="75" r="60" fill="#F2F3F6"/>
</mask>
<g mask="url(#mask0_469_19160)">
<rect x="33.5" y="43.5" width="83" height="98" rx="3.5" fill="#636365" stroke="#292929"/>
<rect x="54" y="97" width="42" height="6" rx="3" fill="#8B8B8C"/>
<rect x="54" y="109" width="42" height="6" rx="3" fill="#8B8B8C"/>
<rect x="64" y="121" width="22" height="6" rx="3" fill="#8B8B8C"/>
<path d="M90.8136 57.885C91.9852 56.7134 93.8852 56.7134 95.0568 57.885C96.2279 59.0565 96.2279 60.9557 95.0568 62.1272L73.6144 83.5695C73.0964 84.0875 72.4357 84.3758 71.7589 84.4357C70.8924 84.5243 69.9951 84.2373 69.3312 83.5734L56.1212 70.3635C54.9499 69.1919 54.9497 67.2928 56.1212 66.1213C57.2927 64.9498 59.1918 64.95 60.3634 66.1213L71.4699 77.2277L90.8136 57.885Z" fill="#A9A9A9"/>
<path d="M90.8136 57.885L91.1672 58.2385L91.1672 58.2385L90.8136 57.885ZM95.0568 57.885L95.4104 57.5315L95.4103 57.5314L95.0568 57.885ZM95.0568 62.1272L95.4103 62.4807L95.4104 62.4807L95.0568 62.1272ZM71.7589 84.4357L71.7148 83.9377L71.7081 83.9383L71.7589 84.4357ZM69.3312 83.5734L68.9776 83.927V83.927L69.3312 83.5734ZM56.1212 70.3635L55.7676 70.717L55.7677 70.717L56.1212 70.3635ZM56.1212 66.1213L55.7677 65.7677L55.7677 65.7677L56.1212 66.1213ZM60.3634 66.1213L60.717 65.7677L60.7169 65.7677L60.3634 66.1213ZM71.4699 77.2277L71.1163 77.5813C71.3116 77.7766 71.6281 77.7766 71.8234 77.5813L71.4699 77.2277ZM90.8136 57.885L91.1672 58.2385C92.1435 57.2622 93.7269 57.2622 94.7032 58.2385L95.0568 57.885L95.4103 57.5314C94.0435 56.1646 91.8269 56.1646 90.4601 57.5314L90.8136 57.885ZM95.0568 57.885L94.7032 58.2385C95.6791 59.2147 95.6791 60.7974 94.7032 61.7736L95.0568 62.1272L95.4104 62.4807C96.7767 61.1139 96.7767 58.8982 95.4104 57.5315L95.0568 57.885ZM95.0568 62.1272L94.7032 61.7736L73.2608 83.216L73.6144 83.5695L73.9679 83.9231L95.4103 62.4807L95.0568 62.1272ZM73.6144 83.5695L73.2608 83.216C72.8291 83.6477 72.2795 83.8877 71.7148 83.9377L71.7589 84.4357L71.803 84.9338C72.592 84.8639 73.3636 84.5274 73.9679 83.9231L73.6144 83.5695ZM71.7589 84.4357L71.7081 83.9383C70.9845 84.0123 70.2377 83.7728 69.6847 83.2199L69.3312 83.5734L68.9776 83.927C69.7525 84.7019 70.8004 85.0363 71.8097 84.9332L71.7589 84.4357ZM69.3312 83.5734L69.6847 83.2199L56.4748 70.0099L56.1212 70.3635L55.7677 70.717L68.9776 83.927L69.3312 83.5734ZM56.1212 70.3635L56.4748 70.01C55.4987 69.0336 55.4986 67.451 56.4748 66.4748L56.1212 66.1213L55.7677 65.7677C54.4009 67.1345 54.4011 69.3502 55.7676 70.717L56.1212 70.3635ZM56.1212 66.1213L56.4748 66.4748C57.451 65.4987 59.0335 65.4987 60.0099 66.4749L60.3634 66.1213L60.7169 65.7677C59.3501 64.4012 57.1345 64.4009 55.7677 65.7677L56.1212 66.1213ZM60.3634 66.1213L60.0099 66.4748L71.1163 77.5813L71.4699 77.2277L71.8234 76.8742L60.717 65.7677L60.3634 66.1213ZM71.4699 77.2277L71.8234 77.5813L91.1672 58.2385L90.8136 57.885L90.4601 57.5314L71.1163 76.8742L71.4699 77.2277Z" fill="#363638"/>
</g>
<circle cx="75" cy="75" r="59.5" stroke="#515151"/>
<circle cx="17" cy="29" r="3" fill="#3B3B3C"/>
<circle cx="146" cy="15" r="3" fill="#3B3B3C"/>
<circle cx="139" cy="32" r="5" fill="#3B3B3C"/>
<circle cx="8" cy="112" r="6" fill="#3B3B3C"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,29 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="147" height="123" viewBox="0 0 147 123" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 3">
<g id="Group 5">
<circle id="Ellipse 5" cx="73" cy="63" r="60" fill="#EBECEE"/>
<g id="Mask group">
<mask id="mask0_0_4" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="13" y="3" width="120" height="120">
<circle id="Ellipse 6" cx="73" cy="63" r="60" fill="#F2F3F6"/>
</mask>
<g mask="url(#mask0_0_4)">
<g id="Group 4">
<rect id="Rectangle 4" x="31.5" y="31.5" width="83" height="98" rx="3.5" fill="white" stroke="#D2D4DB"/>
<rect id="Rectangle 5" opacity="0.3" x="52" y="85" width="42" height="6" rx="3" fill="#515A6E"/>
<rect id="Rectangle 6" opacity="0.3" x="52" y="97" width="42" height="6" rx="3" fill="#515A6E"/>
<rect id="Rectangle 7" opacity="0.3" x="62" y="109" width="22" height="6" rx="3" fill="#515A6E"/>
<g id="Union" opacity="0.3">
<path d="M88.8137 45.885C89.9853 44.7134 91.8853 44.7134 93.0569 45.885C94.228 47.0565 94.228 48.9557 93.0569 50.1272L71.6145 71.5696C71.0965 72.0876 70.4358 72.3758 69.759 72.4358C68.8925 72.5243 67.9952 72.2374 67.3313 71.5735L54.1213 58.3635C52.95 57.1919 52.9498 55.2928 54.1213 54.1213C55.2928 52.9498 57.1919 52.95 58.3635 54.1213L69.47 65.2278L88.8137 45.885Z" fill="#515A6E"/>
<path d="M88.8137 45.885L89.1673 46.2386L89.1673 46.2385L88.8137 45.885ZM93.0569 45.885L93.4105 45.5315L93.4104 45.5314L93.0569 45.885ZM93.0569 50.1272L93.4104 50.4807L93.4105 50.4807L93.0569 50.1272ZM69.759 72.4358L69.7149 71.9377L69.7082 71.9384L69.759 72.4358ZM67.3313 71.5735L66.9777 71.927V71.927L67.3313 71.5735ZM54.1213 58.3635L53.7677 58.717L53.7678 58.7171L54.1213 58.3635ZM54.1213 54.1213L53.7678 53.7678L53.7678 53.7678L54.1213 54.1213ZM58.3635 54.1213L58.7171 53.7678L58.717 53.7677L58.3635 54.1213ZM69.47 65.2278L69.1164 65.5813C69.3117 65.7766 69.6282 65.7766 69.8235 65.5813L69.47 65.2278ZM88.8137 45.885L89.1673 46.2385C90.1436 45.2622 91.727 45.2622 92.7033 46.2385L93.0569 45.885L93.4104 45.5314C92.0436 44.1646 89.827 44.1646 88.4602 45.5314L88.8137 45.885ZM93.0569 45.885L92.7033 46.2385C93.6792 47.2148 93.6792 48.7975 92.7033 49.7737L93.0569 50.1272L93.4105 50.4807C94.7768 49.1139 94.7768 46.8982 93.4105 45.5315L93.0569 45.885ZM93.0569 50.1272L92.7033 49.7736L71.2609 71.216L71.6145 71.5696L71.968 71.9231L93.4104 50.4807L93.0569 50.1272ZM71.6145 71.5696L71.2609 71.216C70.8292 71.6477 70.2796 71.8877 69.7149 71.9377L69.759 72.4358L69.8031 72.9338C70.5921 72.864 71.3637 72.5274 71.968 71.9231L71.6145 71.5696ZM69.759 72.4358L69.7082 71.9384C68.9846 72.0123 68.2378 71.7729 67.6848 71.2199L67.3313 71.5735L66.9777 71.927C67.7526 72.7019 68.8005 73.0363 69.8098 72.9332L69.759 72.4358ZM67.3313 71.5735L67.6848 71.2199L54.4749 58.01L54.1213 58.3635L53.7678 58.7171L66.9777 71.927L67.3313 71.5735ZM54.1213 58.3635L54.4749 58.01C53.4988 57.0336 53.4987 55.4511 54.4749 54.4749L54.1213 54.1213L53.7678 53.7678C52.401 55.1346 52.4012 57.3502 53.7677 58.717L54.1213 58.3635ZM54.1213 54.1213L54.4749 54.4749C55.4511 53.4987 57.0336 53.4988 58.01 54.4749L58.3635 54.1213L58.717 53.7677C57.3502 52.4012 55.1346 52.401 53.7678 53.7678L54.1213 54.1213ZM58.3635 54.1213L58.01 54.4749L69.1164 65.5813L69.47 65.2278L69.8235 64.8742L58.7171 53.7678L58.3635 54.1213ZM69.47 65.2278L69.8235 65.5813L89.1673 46.2386L88.8137 45.885L88.4602 45.5314L69.1164 64.8742L69.47 65.2278Z" fill="#001034"/>
</g>
</g>
</g>
</g>
<circle id="Ellipse 6_2" cx="73" cy="63" r="59.5" stroke="#CBCDD3"/>
</g>
<circle id="Ellipse 2" cx="15" cy="17" r="3" fill="#EBECEE"/>
<circle id="Ellipse 3" cx="144" cy="3" r="3" fill="#EBECEE"/>
<circle id="Ellipse 4" cx="137" cy="20" r="5" fill="#EBECEE"/>
<circle id="Ellipse 1" cx="6" cy="100" r="6" fill="#EBECEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,6 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Users / User">
<circle id="Vector" cx="7" cy="3.5" r="2.33333" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_2" d="M11.6667 10.2083C11.6667 11.6581 11.6667 12.8333 7 12.8333C2.33333 12.8333 2.33333 11.6581 2.33333 10.2083C2.33333 8.75859 4.42267 7.58333 7 7.58333C9.57733 7.58333 11.6667 8.75859 11.6667 10.2083Z" stroke="#999999" stroke-width="1.25"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 557 B

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Essentional, UI / Flag 2">
<path id="Vector" d="M2.91667 12.8333V8.16667M2.91667 8.16667V2.33333M2.91667 8.16667L4.35789 7.87842C5.3207 7.68586 6.31873 7.77749 7.23038 8.14215C8.21828 8.53731 9.30558 8.6111 10.3378 8.35305L10.3962 8.33844C10.7381 8.25297 10.9002 7.86152 10.7189 7.55934L9.80856 6.04204C9.60935 5.71003 9.50975 5.54403 9.48614 5.36346C9.47629 5.28814 9.47629 5.21186 9.48614 5.13654C9.50975 4.95597 9.60935 4.78997 9.80856 4.45796L10.5544 3.21493C10.7496 2.8896 10.454 2.49067 10.0859 2.58269C9.21744 2.79981 8.30263 2.73772 7.47146 2.40525L7.23038 2.30882C6.31873 1.94416 5.3207 1.85253 4.35789 2.04509L2.91667 2.33333M2.91667 2.33333V1.16667" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 917 B

View File

@ -0,0 +1,12 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Folders / Folder With Files" clip-path="url(#clip0_0_53)">
<path id="Vector" d="M10.5 5.83333L7.58333 5.83333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_2" d="M5.83333 1.75H9.625C9.89591 1.75 10.0314 1.75 10.1451 1.76497C10.9304 1.86836 11.5483 2.4863 11.6517 3.27158C11.6667 3.3853 11.6667 3.52075 11.6667 3.79167" stroke="#999999" stroke-width="1.25"/>
<path id="Vector_3" d="M1.16667 4.05402C1.16667 3.53921 1.16667 3.2818 1.20712 3.06739C1.38521 2.12351 2.12351 1.38521 3.06739 1.20712C3.2818 1.16667 3.53921 1.16667 4.05402 1.16667C4.27958 1.16667 4.39236 1.16667 4.50075 1.1768C4.96805 1.2205 5.4113 1.4041 5.77263 1.70363C5.85644 1.77311 5.93619 1.85286 6.09569 2.01235L6.41667 2.33333C6.89254 2.8092 7.13047 3.04714 7.4154 3.20566C7.57192 3.29275 7.73795 3.36152 7.91021 3.41062C8.22377 3.5 8.56027 3.5 9.23325 3.5H9.45122C10.9868 3.5 11.7545 3.5 12.2536 3.94885C12.2995 3.99014 12.3432 4.03383 12.3845 4.07973C12.8333 4.57879 12.8333 5.34656 12.8333 6.88211V8.16667C12.8333 10.3666 12.8333 11.4665 12.1499 12.1499C11.4665 12.8333 10.3666 12.8333 8.16667 12.8333H5.83333C3.63345 12.8333 2.5335 12.8333 1.85008 12.1499C1.16667 11.4665 1.16667 10.3666 1.16667 8.16667V4.05402Z" stroke="#999999" stroke-width="1.25"/>
</g>
<defs>
<clipPath id="clip0_0_53">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Astronomy / Star">
<path id="Vector" d="M7 11.6667V10.2667M7 3.73333V2.33333M11.6667 7H10.2667M3.73333 7H2.33333M10.2998 3.70017L9.30988 4.69012M4.69012 9.30988L3.70017 10.2998M3.70004 3.70027L4.68999 4.69022M9.30976 9.30998L10.2997 10.2999" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 498 B

View File

@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / List / Checklist">
<path id="Vector" d="M1.16667 3.20833L1.875 4.08333L4.375 1.75" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.16667 7.29167L1.875 8.16667L4.375 5.83333" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M1.16667 11.375L1.875 12.25L4.375 9.91667" stroke="#999999" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M12.8333 11.0833L7 11.0833" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_5" d="M12.8333 7L7 7" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_6" d="M12.8333 2.91667L7 2.91667" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 997 B

View File

@ -0,0 +1,7 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / List / List">
<path id="Vector" d="M11.6667 4.08333L2.33333 4.08333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_2" d="M8.75 7L2.33333 7" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
<path id="Vector_3" d="M5.25 9.91667H2.33333" stroke="#999999" stroke-width="1.25" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B