@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.
@@ -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
- ...x,
49
- title: typeof x.title === 'string' ? x.title : x.dataIndex || '',
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
- TableSettingModal.open({ tableColumns })?.then((res) => {
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="props.tableColumns" @click="openTableSettingModal">
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/useAntdTable';
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
- const columnsConfig = ref(props.tableColumns.map((col: any) => ({
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(props.tableColumns.map((col: any) => {
36
- const value = col.visible === false ? 'hidden' : (col.compact === true && col.compactable === true) ? 'compact' : 'show';
37
- return [col.dataIndex, value]
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
- ...col,
50
- visible: columnsShowValue[col.dataIndex] !== 'hidden',
51
- compact: columnsShowValue[col.dataIndex] === 'compact',
52
- })) as ColumnConfig[];
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
- v-for="(col, i) in columnsConfig" :key="col.dataIndex" :index="i"
66
- class="flex items-center gap-2 p-2 select-none"
67
- >
68
- <div class="drag-handler flex items-center justify-center p-1 -m-2 mr-auto">
69
- <i class="i-material-symbols:drag-indicator" />&nbsp;
70
- <span >{{ col.title }}</span>
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 }" />&nbsp;
86
+ <span>{{ col.title }}</span>
71
87
  </div>
72
- <RadioGroup
73
- v-model:value="columnsShowValue[col.dataIndex]"
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>
@@ -25,7 +25,7 @@ const props = withDefaults(
25
25
  modelValue: string;
26
26
  disabled?: boolean;
27
27
  plugins?: string[];
28
- height: string;
28
+ height?: string;
29
29
  }>(),
30
30
  {
31
31
  disabled: false,
@@ -2,7 +2,6 @@
2
2
 
3
3
  <script setup lang="ts">
4
4
  import { computed } from 'vue';
5
- import type { BigNumber } from 'bignumber.js';
6
5
  import bignumber from 'bignumber.js';
7
6
  import CurrencyIcon, {textIcons} from '../../currency/src/CurrencyIcon.vue';
8
7
  import Num from './Num.vue';
@@ -12,10 +12,9 @@ noticeAudio.src = audioURL;
12
12
  noticeAudio.muted = true;
13
13
  document.body.append(noticeAudio);
14
14
 
15
- const logoFaviconEle = document.querySelector('link[rel="icon"]');
16
- const numFaviconEle = document.createElement('link');
17
- numFaviconEle.rel = 'icon';
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
- if (numFaviconEle.parentNode) {
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
- if (logoFaviconEle?.parentNode) {
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
- numFaviconEle.href = numCanvas.toDataURL();
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, setColumnsConfig } = useTableColumns<LocalColumnsType>();
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, getCurrentInstance } from 'vue';
1
+ import { computed, reactive, ref, toValue, watch, provide } from 'vue';
2
2
  import { extendRef } from '@vueuse/core';
3
3
 
4
- export type ColumnConfig = { title: string, dataIndex: string, visible: boolean, compact: boolean }
4
+ export type ColumnConfig = { dataIndex: string, visible: boolean, compact: boolean }
5
+ interface TableConfig {
6
+ columns: ColumnConfig[];
7
+ }
5
8
 
6
- export function useTableColumns<LCT extends any[]>() {
7
- const columnsConfig = ref<Array<ColumnConfig> | null>(null);
8
- let originalColumns: LCT | null = null;
9
- let tableId = ''
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
- // const _getTableId = () => {
12
- // if (!originalColumns)
13
- // throw new Error('请先调用 defineColumns() 方法定义 columns');
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
- // const indexsStr = originalColumns.map((col: any) => col.dataIndex).join(',');
16
- // if (!tableId) {
17
- // tableId = genTableId(indexsStr);
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
- // return tableId;
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 x = config.find(c => c.dataIndex === col.dataIndex);
34
- if (x) {
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
- // columns = columns.filter((col: any) => {
41
- // const x = config.find(c => c.dataIndex === col.dataIndex);
42
- // return x ? x.visible : true;
43
- // }) as LCT;
44
- // 基于 config 的顺序排序
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
- const getColumnsConfig = () => {
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
- setColumnsConfig
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.20",
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",
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(0);
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(0);
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(2);
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(2);
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(6);
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(6);
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(8);
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(8);
59
+ return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_DOWN).toFormat();
61
60
  },
62
61
  };
63
62