@peng_kai/kit 0.3.0-beta.20 → 0.3.0-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/components/currency/src/CurrencyIcon.vue +3 -1
- package/admin/components/date/TtaTimeZone.vue +6 -6
- package/admin/components/date/TtaTimeZoneSimple.vue +104 -0
- package/admin/components/date/index.ts +1 -0
- package/admin/components/filter/src/FilterReset.vue +14 -7
- package/admin/components/filter/src/more/TableSetting.vue +38 -25
- package/admin/components/rich-text/src/RichText.new.vue +1 -1
- package/admin/components/text/src/Amount.v2.vue +0 -1
- package/admin/layout/large/Notice.vue +13 -15
- package/antd/hooks/useAntdTable.ts +1 -3
- package/antd/hooks/useTableColumns.ts +52 -93
- package/libs/dayjs.ts +4 -0
- package/package.json +2 -2
- package/utils/number.ts +8 -9
|
@@ -18,12 +18,14 @@ export const imgIcons = ref<Record<string, string>>({
|
|
|
18
18
|
USD: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIj48cGF0aCBkPSJNMTIgMjRjNi42MjcgMCAxMi01LjM3MyAxMi0xMlMxOC42MjcgMCAxMiAwIDAgNS4zNzMgMCAxMnM1LjM3MyAxMiAxMiAxMnoiIGZpbGw9IiMxNkM3ODQiLz48cGF0aCBkPSJNMTEuNDc2IDE5aDEuMDc5bC4wMDUtMS4yNTJjMi4xODMtLjE3IDMuNDM1LTEuNDYgMy40NC0zLjI5My0uMDA1LTEuOTQtMS40OTYtMi44MjctMy4wNjQtMy4yMjZsLS4zMzUtLjA5My4wMi0zLjEyM2MuODE0LjE1MyAxLjMzOC42NzggMS40MiAxLjQ2NmgxLjgxNmMtLjAzLTEuNzQtMS4zMDItMy4wMDgtMy4yMjYtMy4yMDVMMTIuNjM2IDVoLTEuMDc5bC0uMDA1IDEuMjc0QzkuNjQ0IDYuNDgyIDguMjcgNy43NCA4LjI3NSA5LjU1YzAgMS42MDggMS4wNjMgMi41MzIgMi43NzggMy4wMDhsLjQ1OC4xMjYtLjAyIDMuMzA4Yy0uOTEtLjE1My0xLjU2Ny0uNzEtMS42MzMtMS43SDhjLjA3MSAyLjA1IDEuMzg0IDMuMjcgMy40OCAzLjQ1NkwxMS40NzcgMTl6bTEuMDk0LTMuMDA4bC4wMi0zLjAwMmMuOTI3LjI5IDEuNTE3LjY3MiAxLjUyMiAxLjQ1LS4wMDUuODA4LS42MSAxLjM4OC0xLjU0MiAxLjU1MnptLTEuMDQ4LTUuMTUxYy0uNzAzLS4yNDEtMS4zNDQtLjY0LTEuMzM0LTEuNDE3LjAwNS0uNzA1LjQ5OS0xLjI1MiAxLjM1NC0xLjQxbC0uMDIgMi44Mjd6IiBmaWxsPSIjZmZmIi8+PHNjcmlwdC8+PHNjcmlwdC8+PC9zdmc+',
|
|
19
19
|
// 数字货币
|
|
20
20
|
USDT: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjMjZBMTdCIi8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE3LjkyMiAxNy4zODN2LS4wMDJjLS4xMS4wMDgtLjY3Ny4wNDItMS45NDIuMDQyLTEuMDEgMC0xLjcyMS0uMDMtMS45NzEtLjA0MnYuMDAzYy0zLjg4OC0uMTcxLTYuNzktLjg0OC02Ljc5LTEuNjU4czIuOTAyLTEuNDg2IDYuNzktMS42NnYyLjY0NGMuMjU0LjAxOC45ODIuMDYxIDEuOTg4LjA2MSAxLjIwNyAwIDEuODEyLS4wNSAxLjkyNS0uMDZ2LTIuNjQzYzMuODguMTczIDYuNzc1Ljg1IDYuNzc1IDEuNjU4IDAgLjgxLTIuODk1IDEuNDg1LTYuNzc1IDEuNjU3bTAtMy41OXYtMi4zNjZoNS40MTRWNy44MTlIOC41OTV2My42MDhoNS40MTR2Mi4zNjVjLTQuNC4yMDItNy43MDkgMS4wNzQtNy43MDkgMi4xMThzMy4zMDkgMS45MTUgNy43MDkgMi4xMTh2Ny41ODJoMy45MTN2LTcuNTg0YzQuMzkzLS4yMDIgNy42OTQtMS4wNzMgNy42OTQtMi4xMTZzLTMuMzAxLTEuOTE0LTcuNjk0LTIuMTE3Ii8+PC9nPjwvc3ZnPg==',
|
|
21
|
+
USDC: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iIzNFNzNDNCIvPjxnIGZpbGw9IiNGRkYiPjxwYXRoIGQ9Ik0yMC4wMjIgMTguMTI0YzAtMi4xMjQtMS4yOC0yLjg1Mi0zLjg0LTMuMTU2LTEuODI4LS4yNDMtMi4xOTMtLjcyOC0yLjE5My0xLjU3OHMuNjEtMS4zOTYgMS44MjgtMS4zOTZjMS4wOTcgMCAxLjcwNy4zNjQgMi4wMTEgMS4yNzVhLjQ2LjQ2IDAgMCAwIC40MjcuMzAzaC45NzVhLjQxNi40MTYgMCAwIDAgLjQyNy0uNDI1di0uMDZhMy4wNCAzLjA0IDAgMCAwLTIuNzQzLTIuNDg5VjkuMTQyYzAtLjI0My0uMTgzLS40MjUtLjQ4Ny0uNDg2aC0uOTE1Yy0uMjQzIDAtLjQyNi4xODItLjQ4Ny40ODZ2MS4zOTZjLTEuODI5LjI0Mi0yLjk4NiAxLjQ1Ni0yLjk4NiAyLjk3NCAwIDIuMDAyIDEuMjE4IDIuNzkxIDMuNzc4IDMuMDk1IDEuNzA3LjMwMyAyLjI1NS42NjggMi4yNTUgMS42MzkgMCAuOTctLjg1MyAxLjYzOC0yLjAxMSAxLjYzOC0xLjU4NSAwLTIuMTMzLS42NjctMi4zMTYtMS41NzgtLjA2LS4yNDItLjI0NC0uMzY0LS40MjctLjM2NGgtMS4wMzZhLjQxNi40MTYgMCAwIDAtLjQyNi40MjV2LjA2Yy4yNDMgMS41MTggMS4yMTkgMi42MSAzLjIzIDIuOTE0djEuNDU3YzAgLjI0Mi4xODMuNDI1LjQ4Ny40ODVoLjkxNWMuMjQzIDAgLjQyNi0uMTgyLjQ4Ny0uNDg1VjIxLjM0YzEuODI5LS4zMDMgMy4wNDctMS41NzggMy4wNDctMy4yMTd6Ii8+PHBhdGggZD0iTTEyLjg5MiAyNC40OTdjLTQuNzU0LTEuNy03LjE5Mi02Ljk4LTUuNDI0LTExLjY1My45MTQtMi41NSAyLjkyNS00LjQ5MSA1LjQyNC01LjQwMi4yNDQtLjEyMS4zNjUtLjMwMy4zNjUtLjYwN3YtLjg1YzAtLjI0Mi0uMTIxLS40MjQtLjM2NS0uNDg1LS4wNjEgMC0uMTgzIDAtLjI0NC4wNmExMC44OTUgMTAuODk1IDAgMCAwLTcuMTMgMTMuNzE3YzEuMDk2IDMuNCAzLjcxNyA2LjAxIDcuMTMgNy4xMDIuMjQ0LjEyMS40ODggMCAuNTQ4LS4yNDMuMDYxLS4wNi4wNjEtLjEyMi4wNjEtLjI0M3YtLjg1YzAtLjE4Mi0uMTgyLS40MjQtLjM2NS0uNTQ2bTYuNDYtMTguOTM2Yy0uMjQ0LS4xMjItLjQ4OCAwLS41NDguMjQyLS4wNjEuMDYxLS4wNjEuMTIyLS4wNjEuMjQzdi44NWMwIC4yNDMuMTgyLjQ4NS4zNjUuNjA3IDQuNzU0IDEuNyA3LjE5MiA2Ljk4IDUuNDI0IDExLjY1My0uOTE0IDIuNTUtMi45MjUgNC40OTEtNS40MjQgNS40MDItLjI0NC4xMjEtLjM2NS4zMDMtLjM2NS42MDd2Ljg1YzAgLjI0Mi4xMjEuNDI0LjM2NS40ODUuMDYxIDAgLjE4MyAwIC4yNDQtLjA2YTEwLjg5NSAxMC44OTUgMCAwIDAgNy4xMy0xMy43MTdjLTEuMDk2LTMuNDYtMy43NzgtNi4wNy03LjEzLTcuMTYyIi8+PC9nPjwvZz48L3N2Zz4=',
|
|
21
22
|
ETH: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjNjI3RUVBIi8+PGcgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj48cGF0aCBmaWxsLW9wYWNpdHk9Ii42MDIiIGQ9Ik0xNi40OTggNHY4Ljg3bDcuNDk3IDMuMzV6Ii8+PHBhdGggZD0iTTE2LjQ5OCA0TDkgMTYuMjJsNy40OTgtMy4zNXoiLz48cGF0aCBmaWxsLW9wYWNpdHk9Ii42MDIiIGQ9Ik0xNi40OTggMjEuOTY4djYuMDI3TDI0IDE3LjYxNnoiLz48cGF0aCBkPSJNMTYuNDk4IDI3Ljk5NXYtNi4wMjhMOSAxNy42MTZ6Ii8+PHBhdGggZmlsbC1vcGFjaXR5PSIuMiIgZD0iTTE2LjQ5OCAyMC41NzNsNy40OTctNC4zNTMtNy40OTctMy4zNDh6Ii8+PHBhdGggZmlsbC1vcGFjaXR5PSIuNjAyIiBkPSJNOSAxNi4yMmw3LjQ5OCA0LjM1M3YtNy43MDF6Ii8+PC9nPjwvZz48L3N2Zz4=',
|
|
22
23
|
TRX: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iI0VGMDAyNyIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yMS45MzIgOS45MTNMNy41IDcuMjU3bDcuNTk1IDE5LjExMiAxMC41ODMtMTIuODk0em0tLjIzMiAxLjE3bDIuMjA4IDIuMDk5LTYuMDM4IDEuMDkzem0tNS4xNDIgMi45NzNsLTYuMzY0LTUuMjc4IDEwLjQwMiAxLjkxNHptLS40NTMuOTM0bC0xLjAzOCA4LjU4TDkuNDcyIDkuNDg3em0uOTYuNDU1bDYuNjg3LTEuMjEtNy42NyA5LjM0M3oiLz48L2c+PC9zdmc+',
|
|
23
24
|
BNB: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iI0YzQkEyRiIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xMi4xMTYgMTQuNDA0TDE2IDEwLjUybDMuODg2IDMuODg2IDIuMjYtMi4yNkwxNiA2bC02LjE0NCA2LjE0NHpNNiAxNmwyLjI2LTIuMjZMMTAuNTIgMTZsLTIuMjYgMi4yNnptNi4xMTYgMS41OTZMMTYgMjEuNDhsMy44ODYtMy44ODYgMi4yNiAyLjI1OUwxNiAyNmwtNi4xNDQtNi4xNDQtLjAwMy0uMDAzek0yMS40OCAxNmwyLjI2LTIuMjZMMjYgMTZsLTIuMjYgMi4yNnptLTMuMTg4LS4wMDJoLjAwMlYxNkwxNiAxOC4yOTRsLTIuMjkxLTIuMjktLjAwNC0uMDA0LjAwNC0uMDAzLjQwMS0uNDAyLjE5NS0uMTk1TDE2IDEzLjcwNnoiLz48L2c+PC9zdmc+',
|
|
24
25
|
MATIC: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iIzZGNDFEOCIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yMS4wOTIgMTIuNjkzYy0uMzY5LS4yMTUtLjg0OC0uMjE1LTEuMjU0IDBsLTIuODc5IDEuNjU0LTEuOTU1IDEuMDc4LTIuODc5IDEuNjUzYy0uMzY5LjIxNi0uODQ4LjIxNi0xLjI1NCAwbC0yLjI4OC0xLjI5NGMtLjM2OS0uMjE1LS42MjctLjYxLS42MjctMS4wNDJWMTIuMTljMC0uNDMxLjIyMS0uODI2LjYyNy0xLjA0MmwyLjI1LTEuMjU4Yy4zNy0uMjE2Ljg1LS4yMTYgMS4yNTYgMGwyLjI1IDEuMjU4Yy4zNy4yMTYuNjI4LjYxMS42MjggMS4wNDJ2MS42NTRsMS45NTUtMS4xMTV2LTEuNjUzYTEuMTYgMS4xNiAwIDAgMC0uNjI3LTEuMDQybC00LjE3LTIuMzcyYy0uMzY5LS4yMTYtLjg0OC0uMjE2LTEuMjU0IDBsLTQuMjQ0IDIuMzcyQTEuMTYgMS4xNiAwIDAgMCA2IDExLjA3NnY0Ljc4YzAgLjQzMi4yMjEuODI3LjYyNyAxLjA0M2w0LjI0NCAyLjM3MmMuMzY5LjIxNS44NDkuMjE1IDEuMjU0IDBsMi44NzktMS42MTggMS45NTUtMS4xMTQgMi44NzktMS42MTdjLjM2OS0uMjE2Ljg0OC0uMjE2IDEuMjU0IDBsMi4yNTEgMS4yNThjLjM3LjIxNS42MjcuNjEuNjI3IDEuMDQydjIuNTUyYzAgLjQzMS0uMjIuODI2LS42MjcgMS4wNDJsLTIuMjUgMS4yOTRjLS4zNy4yMTYtLjg1LjIxNi0xLjI1NSAwbC0yLjI1MS0xLjI1OGMtLjM3LS4yMTYtLjYyOC0uNjExLS42MjgtMS4wNDJ2LTEuNjU0bC0xLjk1NSAxLjExNXYxLjY1M2MwIC40MzEuMjIxLjgyNy42MjcgMS4wNDJsNC4yNDQgMi4zNzJjLjM2OS4yMTYuODQ4LjIxNiAxLjI1NCAwbDQuMjQ0LTIuMzcyYy4zNjktLjIxNS42MjctLjYxLjYyNy0xLjA0MnYtNC43OGExLjE2IDEuMTYgMCAwIDAtLjYyNy0xLjA0MmwtNC4yOC0yLjQwOXoiLz48L2c+PC9zdmc+',
|
|
25
26
|
BTC: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjRjc5MzFBIi8+PHBhdGggZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMjMuMTg5IDE0LjAyYy4zMTQtMi4wOTYtMS4yODMtMy4yMjMtMy40NjUtMy45NzVsLjcwOC0yLjg0LTEuNzI4LS40My0uNjkgMi43NjVjLS40NTQtLjExNC0uOTItLjIyLTEuMzg1LS4zMjZsLjY5NS0yLjc4M0wxNS41OTYgNmwtLjcwOCAyLjgzOXEtLjU2NS0uMTI3LTEuMTA0LS4yNmwuMDAyLS4wMDktMi4zODQtLjU5NS0uNDYgMS44NDZzMS4yODMuMjk0IDEuMjU2LjMxMmMuNy4xNzUuODI2LjYzOC44MDUgMS4wMDZsLS44MDYgMy4yMzVxLjA3My4wMTcuMTguMDU3bC0uMTgzLS4wNDUtMS4xMyA0LjUzMmMtLjA4Ni4yMTItLjMwMy41MzEtLjc5My40MS4wMTguMDI1LTEuMjU2LS4zMTMtMS4yNTYtLjMxM2wtLjg1OCAxLjk3OCAyLjI1LjU2MWMuNDE4LjEwNS44MjguMjE1IDEuMjMxLjMxOGwtLjcxNSAyLjg3MiAxLjcyNy40My43MDgtMi44NHEuNzA3LjE5IDEuMzc4LjM1N2wtLjcwNiAyLjgyOCAxLjcyOC40My43MTUtMi44NjZjMi45NDguNTU4IDUuMTY0LjMzMyA2LjA5Ny0yLjMzMy43NTItMi4xNDYtLjAzNy0zLjM4NS0xLjU4OC00LjE5MiAxLjEzLS4yNiAxLjk4LTEuMDAzIDIuMjA3LTIuNTM4bS0zLjk1IDUuNTM4Yy0uNTMzIDIuMTQ3LTQuMTQ4Ljk4Ni01LjMyLjY5NWwuOTUtMy44MDVjMS4xNzIuMjkzIDQuOTI5Ljg3MiA0LjM3IDMuMTFtLjUzNS01LjU2OWMtLjQ4NyAxLjk1My0zLjQ5NS45Ni00LjQ3LjcxN2wuODYtMy40NWMuOTc1LjI0MyA0LjExOC42OTYgMy42MSAyLjczMyIvPjwvZz48L3N2Zz4=',
|
|
26
|
-
TON: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9IlRvbmNvaW5XaWRnZXRfX2xvZ28iPjxwYXRoIGQ9Ik0yOCA1NmMxNS40NjQgMCAyOC0xMi41MzYgMjgtMjhTNDMuNDY0IDAgMjggMCAwIDEyLjUzNiAwIDI4czEyLjUzNiAyOCAyOCAyOHoiIGZpbGw9IiMwMDk4RUEiLz48cGF0aCBkPSJNMzcuNTYgMTUuNjI4SDE4LjQ0Yy0zLjUxNiAwLTUuNzQ1IDMuNzkyLTMuOTc2IDYuODU4bDExLjgwMSAyMC40NTVjLjc3IDEuMzM1IDIuNyAxLjMzNSAzLjQ3IDBsMTEuODA0LTIwLjQ1NWMxLjc2Ny0zLjA2LS40NjItNi44NTgtMy45NzUtNi44NThoLS4wMDN6TTI2LjI1NSAzNi44MDdsLTIuNTctNC45NzQtNi4yMDItMTEuMDkyYy0uNDA5LS43MS4wOTYtMS42Mi45NTMtMS42Mmg3LjgxNlYzNi44MWwuMDAzLS4wMDJ6TTM4LjUxIDIwLjczOWwtNi4yIDExLjA5Ni0yLjU3IDQuOTcyVjE5LjExOWg3LjgxN2MuODU3IDAgMS4zNjIuOTEuOTUzIDEuNjJ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+'
|
|
27
|
+
TON: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9IlRvbmNvaW5XaWRnZXRfX2xvZ28iPjxwYXRoIGQ9Ik0yOCA1NmMxNS40NjQgMCAyOC0xMi41MzYgMjgtMjhTNDMuNDY0IDAgMjggMCAwIDEyLjUzNiAwIDI4czEyLjUzNiAyOCAyOCAyOHoiIGZpbGw9IiMwMDk4RUEiLz48cGF0aCBkPSJNMzcuNTYgMTUuNjI4SDE4LjQ0Yy0zLjUxNiAwLTUuNzQ1IDMuNzkyLTMuOTc2IDYuODU4bDExLjgwMSAyMC40NTVjLjc3IDEuMzM1IDIuNyAxLjMzNSAzLjQ3IDBsMTEuODA0LTIwLjQ1NWMxLjc2Ny0zLjA2LS40NjItNi44NTgtMy45NzUtNi44NThoLS4wMDN6TTI2LjI1NSAzNi44MDdsLTIuNTctNC45NzQtNi4yMDItMTEuMDkyYy0uNDA5LS43MS4wOTYtMS42Mi45NTMtMS42Mmg3LjgxNlYzNi44MWwuMDAzLS4wMDJ6TTM4LjUxIDIwLjczOWwtNi4yIDExLjA5Ni0yLjU3IDQuOTcyVjE5LjExOWg3LjgxN2MuODU3IDAgMS4zNjIuOTEuOTUzIDEuNjJ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+',
|
|
28
|
+
SOL: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iIzY2RjlBMSIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik05LjkyNSAxOS42ODdhLjYuNiAwIDAgMSAuNDE1LS4xN2gxNC4zNjZhLjI5LjI5IDAgMCAxIC4yMDcuNDk3bC0yLjgzOCAyLjgxNWEuNi42IDAgMCAxLS40MTUuMTcxSDcuMjk0YS4yOTEuMjkxIDAgMCAxLS4yMDctLjQ5OHptMC0xMC41MTdBLjYuNiAwIDAgMSAxMC4zNCA5aDE0LjM2NmMuMjYxIDAgLjM5Mi4zMTQuMjA3LjQ5OGwtMi44MzggMi44MTVhLjYuNiAwIDAgMS0uNDE1LjE3SDcuMjk0YS4yOTEuMjkxIDAgMCAxLS4yMDctLjQ5N3ptMTIuMTUgNS4yMjVhLjYuNiAwIDAgMC0uNDE1LS4xN0g3LjI5NGEuMjkxLjI5MSAwIDAgMC0uMjA3LjQ5OGwyLjgzOCAyLjgxNWMuMTEuMTA5LjI2LjE3LjQxNS4xN2gxNC4zNjZhLjI5MS4yOTEgMCAwIDAgLjIwNy0uNDk4eiIvPjwvZz48L3N2Zz4=',
|
|
27
29
|
});
|
|
28
30
|
export const textIcons = ref(['¥', '€', '₱', '$', '৳', '£', '₪', '₹', '₩', '₽', '฿', '₺', '₫', 'R', '₴']);
|
|
29
31
|
const fullbackIcon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDIwIDIwIj48cGF0aCBmaWxsPSIjODQ4YTlkNTUiIGQ9Ik0xMCAyMGExMCAxMCAwIDEgMSAwLTIwIDEwIDEwIDAgMCAxIDAgMjBtMS01aDFhMyAzIDAgMCAwIDAtNkg3Ljk5YTEgMSAwIDAgMSAwLTJIMTRWNWgtM1YzSDl2Mkg4YTMgMyAwIDEgMCAwIDZoNGExIDEgMCAxIDEgMCAySDZ2MmgzdjJoMnoiLz48L3N2Zz4=';
|
|
@@ -425,6 +425,12 @@ const timeZonesZh: Record<string, string> = {
|
|
|
425
425
|
'Pacific/Wallis': '太平洋/瓦利斯',
|
|
426
426
|
};
|
|
427
427
|
|
|
428
|
+
export const timeZones = Intl.supportedValuesOf('timeZone').map(tz => ({
|
|
429
|
+
en: tz,
|
|
430
|
+
cn: timeZonesZh[tz],
|
|
431
|
+
offset: getTimeZoneOffset(tz),
|
|
432
|
+
}));
|
|
433
|
+
|
|
428
434
|
function getTimeZoneOffset(timeZone: string) {
|
|
429
435
|
const date = new Date();
|
|
430
436
|
const formatter = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'short' });
|
|
@@ -434,12 +440,6 @@ function getTimeZoneOffset(timeZone: string) {
|
|
|
434
440
|
</script>
|
|
435
441
|
|
|
436
442
|
<script setup lang="ts">
|
|
437
|
-
const timeZones = Intl.supportedValuesOf('timeZone').map(tz => ({
|
|
438
|
-
en: tz,
|
|
439
|
-
cn: timeZonesZh[tz],
|
|
440
|
-
offset: getTimeZoneOffset(tz),
|
|
441
|
-
}));
|
|
442
|
-
|
|
443
443
|
const visible = ref(false);
|
|
444
444
|
const ttaTimeZone = getTtaTimeZone();
|
|
445
445
|
const now = useNow({ interval: 100 });
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { timeZones } from './TtaTimeZone.vue';
|
|
3
|
+
import { customRef } from 'vue';
|
|
4
|
+
import { Select } from 'ant-design-vue';
|
|
5
|
+
import { getTtaTimeZone } from './helpers';
|
|
6
|
+
|
|
7
|
+
const offsetOptions = [
|
|
8
|
+
{ label: 'UTC', value: 'UTC' },
|
|
9
|
+
{ label: "GMT+01:00", value: "GMT+1" },
|
|
10
|
+
{ label: "GMT+02:00", value: "GMT+2" },
|
|
11
|
+
{ label: "GMT+03:00", value: "GMT+3" },
|
|
12
|
+
{ label: "GMT+03:30", value: "GMT+3:30" },
|
|
13
|
+
{ label: "GMT+04:00", value: "GMT+4" },
|
|
14
|
+
{ label: "GMT+04:30", value: "GMT+4:30" },
|
|
15
|
+
{ label: "GMT+05:00", value: "GMT+5" },
|
|
16
|
+
{ label: "GMT+05:30", value: "GMT+5:30" },
|
|
17
|
+
{ label: "GMT+05:45", value: "GMT+5:45" },
|
|
18
|
+
{ label: "GMT+06:00", value: "GMT+6" },
|
|
19
|
+
{ label: "GMT+06:30", value: "GMT+6:30" },
|
|
20
|
+
{ label: "GMT+07:00", value: "GMT+7" },
|
|
21
|
+
{ label: "GMT+08:00", value: "GMT+8" },
|
|
22
|
+
{ label: "GMT+08:45", value: "GMT+8:45" },
|
|
23
|
+
{ label: "GMT+09:00", value: "GMT+9" },
|
|
24
|
+
{ label: "GMT+09:30", value: "GMT+9:30" },
|
|
25
|
+
{ label: "GMT+10:00", value: "GMT+10" },
|
|
26
|
+
{ label: "GMT+10:30", value: "GMT+10:30" },
|
|
27
|
+
{ label: "GMT+11:00", value: "GMT+11" },
|
|
28
|
+
{ label: "GMT+12:00", value: "GMT+12" },
|
|
29
|
+
{ label: "GMT+12:45", value: "GMT+12:45" },
|
|
30
|
+
{ label: "GMT+13:00", value: "GMT+13" },
|
|
31
|
+
{ label: "GMT+14:00", value: "GMT+14" },
|
|
32
|
+
{ label: "GMT-01:00", value: "GMT-1" },
|
|
33
|
+
{ label: "GMT-02:00", value: "GMT-2" },
|
|
34
|
+
{ label: "GMT-02:30", value: "GMT-2:30" },
|
|
35
|
+
{ label: "GMT-03:00", value: "GMT-3" },
|
|
36
|
+
{ label: "GMT-04:00", value: "GMT-4" },
|
|
37
|
+
{ label: "GMT-05:00", value: "GMT-5" },
|
|
38
|
+
{ label: "GMT-06:00", value: "GMT-6" },
|
|
39
|
+
{ label: "GMT-07:00", value: "GMT-7" },
|
|
40
|
+
{ label: "GMT-08:00", value: "GMT-8" },
|
|
41
|
+
{ label: "GMT-09:00", value: "GMT-9" },
|
|
42
|
+
{ label: "GMT-09:30", value: "GMT-9:30" },
|
|
43
|
+
{ label: "GMT-10:00", value: "GMT-10" },
|
|
44
|
+
{ label: "GMT-11:00", value: "GMT-11" },
|
|
45
|
+
]
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<script lang="ts" setup>
|
|
49
|
+
const ttaTimeZone = getTtaTimeZone();
|
|
50
|
+
const current = customRef((track, trigger) => {
|
|
51
|
+
return {
|
|
52
|
+
get() {
|
|
53
|
+
let value = 'UTC';
|
|
54
|
+
|
|
55
|
+
if (ttaTimeZone.value !== value) {
|
|
56
|
+
const tz = timeZones.find(x => x.en === ttaTimeZone.value);
|
|
57
|
+
value = offsetOptions.find(x => x.value === tz?.offset)?.value || value;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
track();
|
|
61
|
+
return value;
|
|
62
|
+
},
|
|
63
|
+
set(value: string) {
|
|
64
|
+
if (value === 'UTC') {
|
|
65
|
+
ttaTimeZone.value = 'UTC';
|
|
66
|
+
} else {
|
|
67
|
+
const tz = timeZones.find(x => x.offset === value);
|
|
68
|
+
tz && (ttaTimeZone.value = tz.en);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
trigger();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<template>
|
|
78
|
+
<Select class="tta-tz-select" v-model:value="current" :bordered="false" :virtual="false"
|
|
79
|
+
:dropdownMatchSelectWidth="120" :options="offsetOptions">
|
|
80
|
+
<template #suffixIcon>
|
|
81
|
+
<i class="i-iconoir:time-zone text-5 text-white" />
|
|
82
|
+
</template>
|
|
83
|
+
</Select>
|
|
84
|
+
</template>
|
|
85
|
+
|
|
86
|
+
<style lang="scss" scoped>
|
|
87
|
+
.tta-tz-select {
|
|
88
|
+
:deep(.ant-select-selector) {
|
|
89
|
+
border: none;
|
|
90
|
+
padding: 0;
|
|
91
|
+
padding-left: 24px;
|
|
92
|
+
font-variant-numeric: lining-nums;
|
|
93
|
+
|
|
94
|
+
.ant-select-selection-item {
|
|
95
|
+
padding: 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
:deep(.ant-select-arrow) {
|
|
100
|
+
position: absolute;
|
|
101
|
+
left: 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
</style>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { default as TimeFieldSelectForLabel } from './TimeFieldSelectForLabel.vue';
|
|
2
2
|
export { default as TtaTimeZone } from './TtaTimeZone.vue';
|
|
3
|
+
export { default as TtaTimeZoneSimple } from './TtaTimeZoneSimple.vue';
|
|
3
4
|
export { default as PeriodPicker } from './PeriodPicker.vue';
|
|
4
5
|
export { getTtaTimeZone, onTtaTimeZone, datetime } from './helpers';
|
|
5
6
|
export { antdRangePickerPresets, antdRangePickerShowTimeProps } from './presetProps';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { Button, Menu, MenuItem, Dropdown, type TableColumnsType } from 'ant-design-vue';
|
|
3
|
-
import { computed } from 'vue';
|
|
3
|
+
import { type Ref, computed, inject } from 'vue';
|
|
4
4
|
import { onTtaTimeZone } from '../../date';
|
|
5
5
|
import { TableSettingModal } from './more/TableSetting.vue'
|
|
6
|
+
import { type ColumnConfig } from '../../../../antd/hooks/useTableColumns';
|
|
6
7
|
|
|
7
8
|
const props = withDefaults(defineProps<{
|
|
8
9
|
loading?: boolean
|
|
@@ -10,6 +11,7 @@ const props = withDefaults(defineProps<{
|
|
|
10
11
|
filterParams?: any
|
|
11
12
|
filterForm?: any
|
|
12
13
|
tableColumns?: TableColumnsType<any>
|
|
14
|
+
tableColumnsConfig?: ColumnConfig[]
|
|
13
15
|
}>(), {
|
|
14
16
|
loading: undefined,
|
|
15
17
|
});
|
|
@@ -43,15 +45,20 @@ function reset() {
|
|
|
43
45
|
emits('reset');
|
|
44
46
|
}
|
|
45
47
|
|
|
48
|
+
const tableColumns = inject('tableColumns', props.tableColumns) as TableColumnsType<any>;
|
|
49
|
+
const tableColumnsConfig = inject('tableColumnsConfig') as Ref<ColumnConfig[]>;
|
|
46
50
|
function openTableSettingModal() {
|
|
47
|
-
const tableColumns = props.tableColumns?.map((x: any) => ({
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
})) || [];
|
|
51
|
+
// const tableColumns = props.tableColumns?.map((x: any) => ({
|
|
52
|
+
// ...x,
|
|
53
|
+
// title: typeof x.title === 'string' ? x.title : x.dataIndex || '',
|
|
54
|
+
// })) || [];
|
|
51
55
|
|
|
52
|
-
|
|
56
|
+
if (!tableColumns || !tableColumnsConfig) return;
|
|
57
|
+
|
|
58
|
+
TableSettingModal.open({ tableColumns, tableColumnsConfig } as any)?.then((res) => {
|
|
53
59
|
TableSettingModal.close();
|
|
54
60
|
if (res) {
|
|
61
|
+
tableColumnsConfig.value = res;
|
|
55
62
|
emits('setColumnsConfig', res);
|
|
56
63
|
}
|
|
57
64
|
});
|
|
@@ -79,7 +86,7 @@ onTtaTimeZone(() => {
|
|
|
79
86
|
</Button>
|
|
80
87
|
<template #overlay>
|
|
81
88
|
<Menu>
|
|
82
|
-
<MenuItem v-if="
|
|
89
|
+
<MenuItem v-if="tableColumns && tableColumnsConfig" @click="openTableSettingModal">
|
|
83
90
|
设置表格
|
|
84
91
|
</MenuItem>
|
|
85
92
|
</Menu>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { RadioGroup,type TableColumnsType } from 'ant-design-vue';
|
|
2
|
+
import { RadioGroup, type TableColumnsType } from 'ant-design-vue';
|
|
3
3
|
import { reactive, defineAsyncComponent, ref } from 'vue';
|
|
4
4
|
import { useDragAndDrop } from "fluid-dnd/vue";
|
|
5
5
|
import { useAntdModal } from '../../../../../antd/hooks/useAntdModal';
|
|
6
|
-
import { type ColumnConfig } from '../../../../../antd/hooks/
|
|
6
|
+
import { type ColumnConfig } from '../../../../../antd/hooks/useTableColumns';
|
|
7
7
|
|
|
8
8
|
export const TableSettingModal = useAntdModal(
|
|
9
9
|
// eslint-disable-next-line import/no-self-import
|
|
@@ -20,21 +20,36 @@ export const TableSettingModal = useAntdModal(
|
|
|
20
20
|
<script lang="ts" setup>
|
|
21
21
|
const props = defineProps<{
|
|
22
22
|
tableColumns: TableColumnsType<any>
|
|
23
|
+
tableColumnsConfig: ColumnConfig[]
|
|
23
24
|
}>();
|
|
24
|
-
|
|
25
|
+
|
|
26
|
+
let columnsCfg = props.tableColumns.map((col: any) => ({
|
|
25
27
|
title: col.title as string,
|
|
26
28
|
dataIndex: col.dataIndex as string,
|
|
27
|
-
visible: col.visible !== false,
|
|
28
|
-
compact: col.compact === true,
|
|
29
|
-
|
|
29
|
+
visible: props.tableColumnsConfig.find(cf => cf.dataIndex === col.dataIndex)?.visible !== false,
|
|
30
|
+
compact: props.tableColumnsConfig.find(cf => cf.dataIndex === col.dataIndex)?.compact === true,
|
|
31
|
+
fixed: !!col.fixed,
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
// 排序
|
|
35
|
+
if (props.tableColumnsConfig.length) {
|
|
36
|
+
const dataIndexOrderMap = new Map(props.tableColumnsConfig.map((col, i) => [col.dataIndex, i]));
|
|
37
|
+
columnsCfg.sort((a, b) => {
|
|
38
|
+
const aIndex = dataIndexOrderMap.get(a.dataIndex);
|
|
39
|
+
const bIndex = dataIndexOrderMap.get(b.dataIndex);
|
|
40
|
+
return (aIndex ?? 0) - (bIndex ?? 0);
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const columnsConfig = ref(columnsCfg);
|
|
30
45
|
const columnsShowOptions = reactive(Object.fromEntries(props.tableColumns.map((col: any) => {
|
|
31
46
|
const options = [{ label: '显示', value: 'show' }, { label: '隐藏', value: 'hidden' }];
|
|
32
47
|
col.compactable === true && options.unshift({ label: '简略', value: 'compact' });
|
|
33
48
|
return [col.dataIndex, options];
|
|
34
49
|
})) as Record<string, { value: string; options: string }[]>);
|
|
35
|
-
const columnsShowValue = reactive(Object.fromEntries(
|
|
36
|
-
const value =
|
|
37
|
-
return [
|
|
50
|
+
const columnsShowValue = reactive(Object.fromEntries(columnsConfig.value.map((cf) => {
|
|
51
|
+
const value = cf.visible === false ? 'hidden' : cf.compact === true ? 'compact' : 'show';
|
|
52
|
+
return [cf.dataIndex, value]
|
|
38
53
|
})) as Record<string, string>);
|
|
39
54
|
|
|
40
55
|
const [$ctn] = useDragAndDrop(columnsConfig, {
|
|
@@ -46,10 +61,10 @@ const [$ctn] = useDragAndDrop(columnsConfig, {
|
|
|
46
61
|
defineExpose({
|
|
47
62
|
confirm(_: any, resolve: (data: any) => void) {
|
|
48
63
|
const newColumnsConfig = columnsConfig.value.map((col) => ({
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
dataIndex: col.dataIndex,
|
|
65
|
+
visible: columnsShowValue[col.dataIndex] !== 'hidden',
|
|
66
|
+
compact: columnsShowValue[col.dataIndex] === 'compact',
|
|
67
|
+
})) as ColumnConfig[];
|
|
53
68
|
resolve(newColumnsConfig);
|
|
54
69
|
return true;
|
|
55
70
|
},
|
|
@@ -61,19 +76,17 @@ defineExpose({
|
|
|
61
76
|
<div>
|
|
62
77
|
<!-- <Divider>列设置</Divider> -->
|
|
63
78
|
<div ref="$ctn">
|
|
64
|
-
<div
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<
|
|
79
|
+
<div v-for="(col, i) in columnsConfig" :key="col.dataIndex" :index="i"
|
|
80
|
+
class="flex items-center gap-2 p-2 select-none">
|
|
81
|
+
<div
|
|
82
|
+
class="drag-handler flex items-center justify-center p-1 -m-2 mr-auto"
|
|
83
|
+
:class="{ 'pointer-events-none !cursor-no-drop': col.fixed }"
|
|
84
|
+
>
|
|
85
|
+
<i class="i-material-symbols:drag-indicator" :class="{ 'op-0': col.fixed }" />
|
|
86
|
+
<span>{{ col.title }}</span>
|
|
71
87
|
</div>
|
|
72
|
-
<RadioGroup
|
|
73
|
-
|
|
74
|
-
:options="columnsShowOptions[col.dataIndex]"
|
|
75
|
-
optionType="button" buttonStyle="solid" size="small"
|
|
76
|
-
/>
|
|
88
|
+
<RadioGroup v-model:value="columnsShowValue[col.dataIndex]" :options="columnsShowOptions[col.dataIndex]"
|
|
89
|
+
optionType="button" buttonStyle="solid" size="small" />
|
|
77
90
|
<!-- <Select v-model:value="columnsShowValue[col.dataIndex]" :options="columnsShowOptions[col.dataIndex]" /> -->
|
|
78
91
|
</div>
|
|
79
92
|
</div>
|
|
@@ -12,10 +12,9 @@ noticeAudio.src = audioURL;
|
|
|
12
12
|
noticeAudio.muted = true;
|
|
13
13
|
document.body.append(noticeAudio);
|
|
14
14
|
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const numCanvas = document.createElement('canvas') as (HTMLCanvasElement & { num: number });
|
|
15
|
+
const faviconEle = document.querySelector('link[rel="icon"]');
|
|
16
|
+
const logoFaviconHref = document.querySelector('link[rel="icon"]')?.getAttribute('href')!;
|
|
17
|
+
const numCanvas = document.createElement('canvas') as (HTMLCanvasElement & { num: number, dataURL: string });
|
|
19
18
|
numCanvas.width = 32;
|
|
20
19
|
numCanvas.height = 32;
|
|
21
20
|
|
|
@@ -49,15 +48,17 @@ watch(noticeNum, (num = 0, oldNum = 0) => {
|
|
|
49
48
|
useIntervalFn(() => {
|
|
50
49
|
const num = noticeNum.value;
|
|
51
50
|
|
|
52
|
-
if (!num || document.visibilityState === 'visible') {
|
|
53
|
-
|
|
54
|
-
numFaviconEle.remove();
|
|
55
|
-
logoFaviconEle && document.head.appendChild(logoFaviconEle);
|
|
56
|
-
}
|
|
51
|
+
if (!num || !faviconEle || document.visibilityState === 'visible') {
|
|
52
|
+
faviconEle?.setAttribute('href', logoFaviconHref);
|
|
57
53
|
return;
|
|
58
54
|
}
|
|
59
55
|
|
|
60
|
-
|
|
56
|
+
const isNumIcon = faviconEle.getAttribute('href')?.startsWith('data:image/png');
|
|
57
|
+
|
|
58
|
+
if (isNumIcon) {
|
|
59
|
+
faviconEle.setAttribute('href', logoFaviconHref);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
61
62
|
if (numCanvas.num !== num) {
|
|
62
63
|
numCanvas.num = num;
|
|
63
64
|
const ctx = numCanvas.getContext('2d')!;
|
|
@@ -70,13 +71,10 @@ useIntervalFn(() => {
|
|
|
70
71
|
ctx.textAlign = 'center';
|
|
71
72
|
ctx.textBaseline = 'middle';
|
|
72
73
|
ctx.fillText(num.toString(), 16, 16);
|
|
74
|
+
numCanvas.dataURL = numCanvas.toDataURL();
|
|
73
75
|
}
|
|
74
76
|
|
|
75
|
-
|
|
76
|
-
logoFaviconEle.parentNode.replaceChild(numFaviconEle, logoFaviconEle);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
numFaviconEle.parentNode?.replaceChild(logoFaviconEle!, numFaviconEle);
|
|
77
|
+
faviconEle.setAttribute('href', numCanvas.dataURL);
|
|
80
78
|
}
|
|
81
79
|
}, 500);
|
|
82
80
|
</script>
|
|
@@ -61,7 +61,7 @@ export function useAntdTable<
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
|
-
const { defineColumns
|
|
64
|
+
const { defineColumns } = useTableColumns<LocalColumnsType>();
|
|
65
65
|
const defineRowSelection = (rowSelectionGetter: () => LocalTableRowSelection = () => ({})) => {
|
|
66
66
|
const rowSelection = reactive(rowSelectionGetter());
|
|
67
67
|
|
|
@@ -122,8 +122,6 @@ export function useAntdTable<
|
|
|
122
122
|
bodyCellType,
|
|
123
123
|
/** 用于定义 columns */
|
|
124
124
|
defineColumns,
|
|
125
|
-
/** 用于设置 columns 的配置 */
|
|
126
|
-
setColumnsConfig,
|
|
127
125
|
/** 【类型辅助】用于定义出类型精确的 rowSelection */
|
|
128
126
|
defineRowSelection,
|
|
129
127
|
/** 内置的 ATable onChange 事件,默认在 `tableProps` 中 */
|
|
@@ -1,51 +1,69 @@
|
|
|
1
|
-
import { computed, reactive, ref, toValue,
|
|
1
|
+
import { computed, reactive, ref, toValue, watch, provide } from 'vue';
|
|
2
2
|
import { extendRef } from '@vueuse/core';
|
|
3
3
|
|
|
4
|
-
export type ColumnConfig = {
|
|
4
|
+
export type ColumnConfig = { dataIndex: string, visible: boolean, compact: boolean }
|
|
5
|
+
interface TableConfig {
|
|
6
|
+
columns: ColumnConfig[];
|
|
7
|
+
}
|
|
5
8
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const tableConfigStore = {
|
|
10
|
+
key: 'TABLE_CONFIG',
|
|
11
|
+
genTableId(columns: { dataIndex: string }[], extra = '') {
|
|
12
|
+
const indexsStr = columns.map((col: any) => col.dataIndex).join(',') + extra;
|
|
13
|
+
let hash = 0;
|
|
14
|
+
let len = 12;
|
|
10
15
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
for (let i = 0; i < indexsStr.length; i++) {
|
|
17
|
+
const ch = indexsStr.charCodeAt(i);
|
|
18
|
+
hash = (hash << 5) - hash + ch;
|
|
19
|
+
hash |= 0;
|
|
20
|
+
}
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
const base36 = (hash >>> 0).toString(36);
|
|
23
|
+
return base36.length >= len ? base36.slice(0, len) : base36.padStart(len, '0');
|
|
24
|
+
},
|
|
25
|
+
getTableConfig(tableId: string): TableConfig | null {
|
|
26
|
+
const configStr = localStorage.getItem(this.key);
|
|
27
|
+
const allConfig = configStr ? JSON.parse(configStr) : {};
|
|
28
|
+
return allConfig[tableId] || null;
|
|
29
|
+
},
|
|
30
|
+
setTableConfig(tableId: string, config: Partial<TableConfig>) {
|
|
31
|
+
const configStr = localStorage.getItem(this.key);
|
|
32
|
+
const allConfig = configStr ? JSON.parse(configStr) : {};
|
|
33
|
+
allConfig[tableId] = Object.assign({}, allConfig[tableId] || {}, config);
|
|
34
|
+
localStorage.setItem(this.key, JSON.stringify(allConfig));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
19
37
|
|
|
20
|
-
|
|
21
|
-
|
|
38
|
+
export function useTableColumns<LCT extends any[]>() {
|
|
39
|
+
const columnsConfig = ref<Array<ColumnConfig> | null | undefined>();
|
|
40
|
+
let originalColumns: LCT | null = null;
|
|
41
|
+
let tableId = ''
|
|
22
42
|
|
|
23
43
|
const defineColumns = (columnsGetter: () => LCT) => {
|
|
24
44
|
originalColumns = toValue(columnsGetter) || [] as unknown as LCT;
|
|
45
|
+
tableId = tableConfigStore.genTableId(originalColumns);
|
|
46
|
+
columnsConfig.value = tableConfigStore.getTableConfig(tableId)?.columns;
|
|
25
47
|
|
|
48
|
+
provide('tableColumns', originalColumns);
|
|
49
|
+
provide('tableColumnsConfig', columnsConfig);
|
|
26
50
|
|
|
27
51
|
const columns = computed(() => {
|
|
28
52
|
const config = columnsConfig.value;
|
|
29
53
|
let columns = columnsGetter();
|
|
30
54
|
|
|
31
55
|
if (config?.length) {
|
|
56
|
+
columns = columns.filter((col: any) => config.find(c => c.dataIndex === col.dataIndex)?.visible !== false) as LCT;
|
|
32
57
|
columns = columns.map((col: any) => {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
return { ...col, visible: x.visible, compact: x.compact, };
|
|
36
|
-
}
|
|
37
|
-
return col;
|
|
58
|
+
const cf = config.find(c => c.dataIndex === col.dataIndex);
|
|
59
|
+
return { ...col, compact: cf?.compact };
|
|
38
60
|
}) as LCT;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
columns = config.map(x => {
|
|
46
|
-
const col = columns.find(c => c.dataIndex === x.dataIndex);
|
|
47
|
-
return col ? col : null;
|
|
48
|
-
}).filter(Boolean) as LCT;
|
|
61
|
+
const dataIndexOrderMap = new Map(config.map((c, i) => [c.dataIndex, i]));
|
|
62
|
+
columns.sort((a, b) => {
|
|
63
|
+
const indexA = dataIndexOrderMap.get(a.dataIndex);
|
|
64
|
+
const indexB = dataIndexOrderMap.get(b.dataIndex);
|
|
65
|
+
return (indexA ?? Infinity) - (indexB ?? Infinity);
|
|
66
|
+
});
|
|
49
67
|
}
|
|
50
68
|
|
|
51
69
|
return columns;
|
|
@@ -54,71 +72,12 @@ export function useTableColumns<LCT extends any[]>() {
|
|
|
54
72
|
return extendRef(columns, {});
|
|
55
73
|
};
|
|
56
74
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const setColumnsConfig = (columns: Array<ColumnConfig>) => {
|
|
62
|
-
columnsConfig.value = columns;
|
|
63
|
-
console.log('🤡 / columns:', columns);
|
|
64
|
-
};
|
|
75
|
+
watch(columnsConfig, (newConfig) => {
|
|
76
|
+
newConfig && tableConfigStore.setTableConfig(tableId, { columns: newConfig });
|
|
77
|
+
});
|
|
65
78
|
|
|
66
79
|
return {
|
|
67
80
|
defineColumns,
|
|
68
|
-
|
|
81
|
+
tableColumnsConfig: columnsConfig,
|
|
69
82
|
};
|
|
70
83
|
}
|
|
71
|
-
|
|
72
|
-
class TableConfigurator {
|
|
73
|
-
private tableId: string | null = null;
|
|
74
|
-
private storeKeyPrefix = 'TABLE_CONFIG';
|
|
75
|
-
private _columnsConfig: Array<ColumnConfig> | null = null;
|
|
76
|
-
public originalColumns: any[] | null = null;
|
|
77
|
-
|
|
78
|
-
public setColumnsConfig() {
|
|
79
|
-
const tableId = this.genTableId();
|
|
80
|
-
const key = `${this.storeKeyPrefix}@${tableId}`;
|
|
81
|
-
const configStr = JSON.stringify(this._columnsConfig);
|
|
82
|
-
|
|
83
|
-
localStorage.setItem(key, configStr);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public getColumnsConfig() {
|
|
87
|
-
const tableId = this.genTableId();
|
|
88
|
-
const key = `${this.storeKeyPrefix}@${tableId}`;
|
|
89
|
-
const configStr = localStorage.getItem(key);
|
|
90
|
-
|
|
91
|
-
if (configStr) {
|
|
92
|
-
try {
|
|
93
|
-
return JSON.parse(configStr);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
public genTableId() {
|
|
104
|
-
if (!this.originalColumns)
|
|
105
|
-
throw new Error('originalColumns 未设置');
|
|
106
|
-
|
|
107
|
-
if (this.tableId)
|
|
108
|
-
return this.tableId;
|
|
109
|
-
|
|
110
|
-
const str = this.originalColumns.map((col: any) => col.dataIndex).join('');
|
|
111
|
-
let hash = 0;
|
|
112
|
-
let len = 12;
|
|
113
|
-
|
|
114
|
-
for (let i = 0; i < str.length; i++) {
|
|
115
|
-
const ch = str.charCodeAt(i);
|
|
116
|
-
hash = (hash << 5) - hash + ch;
|
|
117
|
-
hash |= 0;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const base36 = (hash >>> 0).toString(36);
|
|
121
|
-
this.tableId = base36.length >= len ? base36.slice(0, len) : base36.padStart(len, '0');
|
|
122
|
-
return this.tableId;
|
|
123
|
-
}
|
|
124
|
-
}
|
package/libs/dayjs.ts
CHANGED
|
@@ -10,6 +10,8 @@ import weekYear from 'dayjs/esm/plugin/weekYear';
|
|
|
10
10
|
import quarterOfYear from 'dayjs/esm/plugin/quarterOfYear';
|
|
11
11
|
import advancedFormat from 'dayjs/esm/plugin/advancedFormat';
|
|
12
12
|
import customParseFormat from 'dayjs/esm/plugin/customParseFormat';
|
|
13
|
+
import updateLocale from 'dayjs/esm/plugin/updateLocale';
|
|
14
|
+
import isBetween from 'dayjs/esm/plugin/isBetween';
|
|
13
15
|
import 'dayjs/esm/locale/zh';
|
|
14
16
|
import 'dayjs/esm/locale/en';
|
|
15
17
|
|
|
@@ -26,4 +28,6 @@ dayjs.extend(weekYear);
|
|
|
26
28
|
dayjs.extend(quarterOfYear);
|
|
27
29
|
dayjs.extend(advancedFormat);
|
|
28
30
|
dayjs.extend(customParseFormat);
|
|
31
|
+
dayjs.extend(updateLocale);
|
|
32
|
+
dayjs.extend(isBetween);
|
|
29
33
|
dayjs.locale('zh');
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peng_kai/kit",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.3.0-beta.
|
|
4
|
+
"version": "0.3.0-beta.22",
|
|
5
5
|
"description": "",
|
|
6
6
|
"author": "",
|
|
7
7
|
"license": "ISC",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
16
|
"ant-design-vue": "4.2.6",
|
|
17
|
-
"vue": "3.5.
|
|
17
|
+
"vue": "3.5.18",
|
|
18
18
|
"vue-router": "4.5.1"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
package/utils/number.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { BigNumber } from 'bignumber.js';
|
|
2
1
|
import bn from 'bignumber.js';
|
|
3
2
|
|
|
4
3
|
export { default as bn } from 'bignumber.js';
|
|
@@ -22,42 +21,42 @@ export const numFmt = {
|
|
|
22
21
|
/** 舍去小数,四舍五入,千位符 */
|
|
23
22
|
d0r5t: (num: any, fallback: any = 'NaN') => {
|
|
24
23
|
const result = bn(num);
|
|
25
|
-
return result.isNaN() ? fallback : result.decimalPlaces(0, bn.ROUND_HALF_UP).toFormat(
|
|
24
|
+
return result.isNaN() ? fallback : result.decimalPlaces(0, bn.ROUND_HALF_UP).toFormat();
|
|
26
25
|
},
|
|
27
26
|
/** 舍去小数,向下取整,千位符 */
|
|
28
27
|
d0r0t: (num: any, fallback: any = 'NaN') => {
|
|
29
28
|
const result = bn(num);
|
|
30
|
-
return result.isNaN() ? fallback : result.decimalPlaces(0, bn.ROUND_DOWN).toFormat(
|
|
29
|
+
return result.isNaN() ? fallback : result.decimalPlaces(0, bn.ROUND_DOWN).toFormat();
|
|
31
30
|
},
|
|
32
31
|
/** 保留2位小数,四舍五入,千位符 */
|
|
33
32
|
d2r5t: (num: any, fallback: any = 'NaN') => {
|
|
34
33
|
const result = bn(num);
|
|
35
|
-
return result.isNaN() ? fallback : result.decimalPlaces(2, bn.ROUND_HALF_UP).toFormat(
|
|
34
|
+
return result.isNaN() ? fallback : result.decimalPlaces(2, bn.ROUND_HALF_UP).toFormat();
|
|
36
35
|
},
|
|
37
36
|
/** 保留2位小数,向下取整,千位符 */
|
|
38
37
|
d2r0t: (num: any, fallback: any = 'NaN') => {
|
|
39
38
|
const result = bn(num);
|
|
40
|
-
return result.isNaN() ? fallback : result.decimalPlaces(2, bn.ROUND_DOWN).toFormat(
|
|
39
|
+
return result.isNaN() ? fallback : result.decimalPlaces(2, bn.ROUND_DOWN).toFormat();
|
|
41
40
|
},
|
|
42
41
|
/** 保留6位小数,四舍五入,千位符 */
|
|
43
42
|
d6r5t: (num: any, fallback: any = 'NaN') => {
|
|
44
43
|
const result = bn(num);
|
|
45
|
-
return result.isNaN() ? fallback : result.decimalPlaces(6, bn.ROUND_HALF_UP).toFormat(
|
|
44
|
+
return result.isNaN() ? fallback : result.decimalPlaces(6, bn.ROUND_HALF_UP).toFormat();
|
|
46
45
|
},
|
|
47
46
|
/** 保留6位小数,向下取整,千位符 */
|
|
48
47
|
d6r0t: (num: any, fallback: any = 'NaN') => {
|
|
49
48
|
const result = bn(num);
|
|
50
|
-
return result.isNaN() ? fallback : result.decimalPlaces(6, bn.ROUND_DOWN).toFormat(
|
|
49
|
+
return result.isNaN() ? fallback : result.decimalPlaces(6, bn.ROUND_DOWN).toFormat();
|
|
51
50
|
},
|
|
52
51
|
/** 保留8位小数,四舍五入,千位符 */
|
|
53
52
|
d8r5t: (num: any, fallback: any = 'NaN') => {
|
|
54
53
|
const result = bn(num);
|
|
55
|
-
return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_HALF_UP).toFormat(
|
|
54
|
+
return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_HALF_UP).toFormat();
|
|
56
55
|
},
|
|
57
56
|
/** 保留8位小数,向下取整,千位符 */
|
|
58
57
|
d8r0t: (num: any, fallback: any = 'NaN') => {
|
|
59
58
|
const result = bn(num);
|
|
60
|
-
return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_DOWN).toFormat(
|
|
59
|
+
return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_DOWN).toFormat();
|
|
61
60
|
},
|
|
62
61
|
};
|
|
63
62
|
|