feat:时间设置

This commit is contained in:
shixiaohua 2024-04-18 10:38:47 +08:00
parent 8ab2e8d69c
commit 5848dd2d04
14 changed files with 818 additions and 69 deletions

450
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "assistant-todo",
"version": "0.1.0",
"dependencies": {
"@ant-design/pro-components": "^2.7.1",
"@heroicons/react": "^2.0.18",
"@tailwindcss/forms": "^0.5.7",
"antd": "^5.16.1",
@ -110,6 +111,276 @@
"resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz",
"integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA=="
},
"node_modules/@ant-design/pro-card": {
"version": "2.6.1",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-card/-/pro-card-2.6.1.tgz",
"integrity": "sha512-LiZwTUFHNU8t7bJsp51DnSmuct2uY2WHxl+dMcWCpsW2V6KRPws4raGo96SDMPfGjwbF0YrMZhR9yO7qmI5nag==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.1",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"omit.js": "^2.0.2",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.4.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-components": {
"version": "2.7.1",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-components/-/pro-components-2.7.1.tgz",
"integrity": "sha512-9e1BCrDNZ4NZXt7sY9eotVOFa506Pnwhsg9alRWfAzn36IpLt0o9/VllBSAR3WeGaUn452vEEOWJTsCVW4Jq4w==",
"dependencies": {
"@ant-design/pro-card": "2.6.1",
"@ant-design/pro-descriptions": "2.5.37",
"@ant-design/pro-field": "2.14.10",
"@ant-design/pro-form": "2.26.0",
"@ant-design/pro-layout": "7.19.1",
"@ant-design/pro-list": "2.5.52",
"@ant-design/pro-provider": "2.14.1",
"@ant-design/pro-skeleton": "2.1.11",
"@ant-design/pro-table": "3.15.3",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.16.3"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-descriptions": {
"version": "2.5.37",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-descriptions/-/pro-descriptions-2.5.37.tgz",
"integrity": "sha512-YaMs0IGQ39n8jMDUQjhpWW6uZMDktgxAAYwUE9s1tF2XK/ySQSdfylsGvMHZFKqWPRnOqNFIYQ1kAcDLIO9KXQ==",
"dependencies": {
"@ant-design/pro-field": "2.14.10",
"@ant-design/pro-form": "2.26.0",
"@ant-design/pro-skeleton": "2.1.11",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"rc-resize-observer": "^0.2.3",
"rc-util": "^5.0.6"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-descriptions/node_modules/rc-resize-observer": {
"version": "0.2.6",
"resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-0.2.6.tgz",
"integrity": "sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.1",
"rc-util": "^5.0.0",
"resize-observer-polyfill": "^1.5.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@ant-design/pro-field": {
"version": "2.14.10",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-field/-/pro-field-2.14.10.tgz",
"integrity": "sha512-Q5JIfZJheQKbxgpX29xNwQgsP+fA9WYD4ov5QBLBn1ePUqOreXOQK4cLMBPxxD5MOMULihzHoKi3JOBmuyBCUw==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.1",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"@chenshuai2144/sketch-color": "^1.0.8",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.tonumber": "^4.0.3",
"omit.js": "^2.0.2",
"rc-util": "^5.4.0",
"swr": "^2.0.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-form": {
"version": "2.26.0",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-form/-/pro-form-2.26.0.tgz",
"integrity": "sha512-K542iiEM0mS/U2iaBHhJjsNinsquy4ZSSfoz6dRdFg6OQEU6+qxx7SpvXpVAGk+CtTxDTmd6u0EKlyVl6shK5Q==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-field": "2.14.10",
"@ant-design/pro-provider": "2.14.1",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"@chenshuai2144/sketch-color": "^1.0.7",
"@umijs/use-params": "^1.0.9",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.merge": "^4.6.2",
"omit.js": "^2.0.2",
"rc-resize-observer": "^1.1.0",
"rc-util": "^5.0.6"
},
"peerDependencies": {
"@types/lodash.merge": "^4.6.7",
"antd": "^4.24.15 || ^5.11.2",
"rc-field-form": "^1.22.0",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
},
"peerDependenciesMeta": {
"@types/lodash.merge": {
"optional": true
}
}
},
"node_modules/@ant-design/pro-layout": {
"version": "7.19.1",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-layout/-/pro-layout-7.19.1.tgz",
"integrity": "sha512-JquPxUMFuEZ0kAgs75ECsRFEgygmXawk/oAvEvKNuNTavrUyU/8EJHN+oAETjKdhtsst0Wp5MJKQqPZAcQdYnA==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.1",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"@umijs/route-utils": "^4.0.0",
"@umijs/use-params": "^1.0.9",
"classnames": "^2.3.2",
"lodash.merge": "^4.6.2",
"omit.js": "^2.0.2",
"path-to-regexp": "2.4.0",
"rc-resize-observer": "^1.1.0",
"rc-util": "^5.0.6",
"swr": "^2.0.0",
"warning": "^4.0.3"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-list": {
"version": "2.5.52",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-list/-/pro-list-2.5.52.tgz",
"integrity": "sha512-Ndro8YKubSQxFDJ3ZTMU9esZJAjye9TqKMLd768ST86nWvSeDrm8A0oUIKtyMgvnbzsh7YXj4JgexGUNJJPaGg==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-card": "2.6.1",
"@ant-design/pro-field": "2.14.10",
"@ant-design/pro-table": "3.15.3",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"rc-resize-observer": "^1.0.0",
"rc-util": "^4.19.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-list/node_modules/rc-util": {
"version": "4.21.1",
"resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-4.21.1.tgz",
"integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==",
"dependencies": {
"add-dom-event-listener": "^1.1.0",
"prop-types": "^15.5.10",
"react-is": "^16.12.0",
"react-lifecycles-compat": "^3.0.4",
"shallowequal": "^1.1.0"
}
},
"node_modules/@ant-design/pro-provider": {
"version": "2.14.1",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-provider/-/pro-provider-2.14.1.tgz",
"integrity": "sha512-N8hTUNJc7dtIjj79ZFviielizo15nOUyjrmz9Ll0Mn68Btne2FLpf8cKHsUMdA+yLDW9oM0ExcqIWJOKyx0nUg==",
"dependencies": {
"@ant-design/cssinjs": "^1.11.1",
"@babel/runtime": "^7.18.0",
"@ctrl/tinycolor": "^3.4.0",
"rc-util": "^5.0.1",
"swr": "^2.0.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-skeleton": {
"version": "2.1.11",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-skeleton/-/pro-skeleton-2.1.11.tgz",
"integrity": "sha512-a1drmZSDXHFexFniN1YD7PgYiWvhdBAM9OwzSOO3eXPAltAg2cGcaVBlFmweShN+dupO220RN+6aaLUv3G9B2Q==",
"dependencies": {
"@babel/runtime": "^7.18.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-table": {
"version": "3.15.3",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-table/-/pro-table-3.15.3.tgz",
"integrity": "sha512-85LMPOsE8vqnKO0/C/r1fLBMhG5jfBUzSlzO7dtDKNzgR3FIeIdOBm49rtoKJ3sHdf3HV3sFazHkOUv9aXQ6Bg==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-card": "2.6.1",
"@ant-design/pro-field": "2.14.10",
"@ant-design/pro-form": "2.26.0",
"@ant-design/pro-provider": "2.14.1",
"@ant-design/pro-utils": "2.15.7",
"@babel/runtime": "^7.18.0",
"@dnd-kit/core": "^6.0.8",
"@dnd-kit/modifiers": "^6.0.1",
"@dnd-kit/sortable": "^7.0.2",
"@dnd-kit/utilities": "^3.2.1",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.merge": "^4.6.2",
"omit.js": "^2.0.2",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.0.1"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"rc-field-form": "^1.22.0",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-utils": {
"version": "2.15.7",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-utils/-/pro-utils-2.15.7.tgz",
"integrity": "sha512-VMK1mkb9St4OoEoekW0qUqkKK632XOGjBZusKjlfP9WPwv+MP8bPAB2jOH89JoY8SIQ87Zod6lMgWLMJX3qbOw==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.1",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.merge": "^4.6.2",
"rc-util": "^5.0.6",
"safe-stable-stringify": "^2.4.3",
"swr": "^2.0.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/react-slick": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz",
@ -582,6 +853,18 @@
"node": ">=6.9.0"
}
},
"node_modules/@chenshuai2144/sketch-color": {
"version": "1.0.9",
"resolved": "https://registry.npmmirror.com/@chenshuai2144/sketch-color/-/sketch-color-1.0.9.tgz",
"integrity": "sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==",
"dependencies": {
"reactcss": "^1.2.3",
"tinycolor2": "^1.4.2"
},
"peerDependencies": {
"react": ">=16.12.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
@ -590,6 +873,68 @@
"node": ">=10"
}
},
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz",
"integrity": "sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/core": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.1.0.tgz",
"integrity": "sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==",
"dependencies": {
"@dnd-kit/accessibility": "^3.1.0",
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@dnd-kit/modifiers": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz",
"integrity": "sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.1",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.0.6",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/sortable": {
"version": "7.0.2",
"resolved": "https://registry.npmmirror.com/@dnd-kit/sortable/-/sortable-7.0.2.tgz",
"integrity": "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.0",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.0.7",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/utilities": {
"version": "3.2.2",
"resolved": "https://registry.npmmirror.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
"integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@emotion/hash": {
"version": "0.8.0",
"resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz",
@ -1407,6 +1752,19 @@
"node": "^16.0.0 || >=18.0.0"
}
},
"node_modules/@umijs/route-utils": {
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/@umijs/route-utils/-/route-utils-4.0.1.tgz",
"integrity": "sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ=="
},
"node_modules/@umijs/use-params": {
"version": "1.0.9",
"resolved": "https://registry.npmmirror.com/@umijs/use-params/-/use-params-1.0.9.tgz",
"integrity": "sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==",
"peerDependencies": {
"react": "*"
}
},
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -1484,6 +1842,14 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/add-dom-event-listener": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz",
"integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==",
"dependencies": {
"object-assign": "4.x"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
@ -4238,14 +4604,17 @@
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
"node_modules/lodash.tonumber": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz",
"integrity": "sha512-SY0SwuPOHRwKcCNTdsntPYb+Zddz5mDUIVFABzRMqmAiL41pMeyoQFGxYAw5zdc9NnH4pbJqiqqp5ckfxa+zSA=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
@ -4572,6 +4941,11 @@
"node": ">= 0.4"
}
},
"node_modules/omit.js": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-2.0.2.tgz",
"integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg=="
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
@ -4701,6 +5075,11 @@
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/path-to-regexp": {
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz",
"integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w=="
},
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
@ -4978,7 +5357,6 @@
"version": "15.8.1",
"resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dev": true,
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@ -5615,8 +5993,20 @@
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmmirror.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"node_modules/reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/reactcss/-/reactcss-1.2.3.tgz",
"integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
"dependencies": {
"lodash": "^4.0.1"
}
},
"node_modules/read-cache": {
"version": "1.0.0",
@ -5909,6 +6299,14 @@
"node": ">= 0.4"
}
},
"node_modules/safe-stable-stringify": {
"version": "2.4.3",
"resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
"integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
"engines": {
"node": ">=10"
}
},
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz",
@ -5984,6 +6382,11 @@
"node": ">= 0.4"
}
},
"node_modules/shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
@ -6363,6 +6766,18 @@
"node": ">= 0.4"
}
},
"node_modules/swr": {
"version": "2.2.5",
"resolved": "https://registry.npmmirror.com/swr/-/swr-2.2.5.tgz",
"integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==",
"dependencies": {
"client-only": "^0.0.1",
"use-sync-external-store": "^1.2.0"
},
"peerDependencies": {
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/synckit": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.9.0.tgz",
@ -6454,6 +6869,11 @@
"node": ">=12.22"
}
},
"node_modules/tinycolor2": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@ -6675,6 +7095,14 @@
"punycode": "^2.1.0"
}
},
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -6690,6 +7118,14 @@
"spdx-expression-parse": "^3.0.0"
}
},
"node_modules/warning": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz",
"integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",

View File

@ -9,6 +9,7 @@
"lint": "next lint"
},
"dependencies": {
"@ant-design/pro-components": "^2.7.1",
"@heroicons/react": "^2.0.18",
"@tailwindcss/forms": "^0.5.7",
"antd": "^5.16.1",

1
src/app/lib/constants.ts Normal file
View File

@ -0,0 +1 @@
export const DATE_TIME='yyyy-MM-dd HH:mm:ss'

View File

@ -1,4 +1,5 @@
import React from "react";
import {Dayjs} from "dayjs";
export type Invoice = {
id: string;
@ -40,8 +41,10 @@ export type DataType ={
action?:React.ReactNode;
expectedStartTime?:Date;
expectedEndTime?:Date;
expectedTimeRange?:(string|Dayjs)[];
actualStartTime?:Date;
actualEndTime?:Date;
actualTimeRange?:(string|Dayjs)[]
children: DataType[]|undefined;
}
export type DictType={

View File

@ -136,33 +136,6 @@ export const taskPriorityList: DictType[] = [
color: 'green'
}
]
export const TASK_PRIORITY_LIST: DictType[] = [
{
id: 0,
code: '0',
name: '重要紧急',
order: 0,
color: 'red'
}, {
id: 1,
code: '1',
name: '重要不紧急',
order: 1,
color: 'yellow'
}, {
id: 2,
code: '2',
name: '不重要紧急',
order: 2,
color: 'gary'
}, {
id: 3,
code: '3',
name: '不重要不紧急',
order: 3,
color: 'green'
}
]
// 0,暂存1,提交2审核3通过4拒绝5排期中6进行中7完成8bug修复9修复完成10确认11,上线运行
export const taskStateList: DictType[] = [
{

View File

@ -1,12 +1,69 @@
'use client'
import SideNav from '@/app/ui/dashboard/sidenav';
import TreeTable from "@/app/ui/task/project/TreeTable";
import '@/app/ui/task/four/index.modules.css'
import {useEffect} from "react";
export default function Layout({children}: { children: React.ReactNode }) {
// useEffect(() => {
// // @ts-ignore
// const divWidth = document.getElementById('myDiv').offsetWidth;
// // @ts-ignore
// document.getElementById('mySpan').style.fontSize = divWidth + 'px';
// }, []); // 这里的空数组表示只在组件挂载时执行一次
//
// return (
// <>
// <div id="myDiv" style={{width: '200px'}}>
// Content
// </div>
// <span id="mySpan">Content</span>
// </>
// )
useEffect(() => {
// @ts-ignore
const divWidth = document.getElementById('tenUp').offsetWidth;
// @ts-ignore
document.getElementById('upUp').style.fontSize = divWidth + 'px';
// @ts-ignore
document.getElementById('upDown').style.fontSize = divWidth + 'px';
// @ts-ignore
const divHeight = document.getElementById('left').offsetHeight;
// @ts-ignore
document.getElementById('tenLeft').style.fontSize = divHeight/6*4 + 'px';
}, []);
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
<div className="w-full flex-none md:w-64">
<SideNav />
<div>
<div className='firstRow' style={{display: 'flex'}}>
<div className='leftUp'>
<TreeTable/>
</div>
<div id='tenUp' className='up'>
<span id='upUp'></span>
</div>
<div className='rightUp'>
<TreeTable/>
</div>
</div>
<div id='left' className='left'>
<span id='tenLeft' style={{fontSize:'1vh'}}></span>
</div>
<div className='secondRow' style={{display: 'flex'}}>
<div className='leftDown'>
<TreeTable/>
</div>
<div className='up'>
<span id='upDown'></span>
</div>
{/*<div style={{float:'left',width:'48%',height: '48vh',background:"gray"}}>{children}</div>*/}
<div className='rightDown'>
<TreeTable/>
</div>
</div>
<div className="flex-grow p-6 md:overflow-y-auto md:p-12">{children}</div>
</div>
);
}
}

View File

@ -1,7 +1,12 @@
import SideNav from '@/app/ui/dashboard/sidenav';
'use client'
import React from "react";
import {TitleOperation} from "@/app/ui/task/TitleOperation";
export default function Layout({children}: { children: React.ReactNode }) {
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<div>{children}</div>
<div>
<TitleOperation/>
{children}</div>
);
}
}

View File

@ -1,10 +1,11 @@
import TreeTable from "@/app/ui/task/project/TreeTable";
import TreeTablePro from "@/app/ui/task/project/TreeTablePro";
const Page: React.FC = () => {
return (
<>
<TreeTable/>
<TreeTablePro/>
{/*<TreeTable/>*/}
</>
);
};

View File

@ -0,0 +1,45 @@
div{
overflow: auto;
}
.leftUp{
width: 49%;
height: 45vh;
background: red;
}
.up{
width: 2%;
height: 45vh;
background: dodgerblue;
}
.rightUp{
width: 49%;
height: 45vh;
background: yellow;
}
.left{
width: 100%;
height: 4vh;
background: dodgerblue;
overflow: hidden;
}
.leftDown{
width: 49%;
height: 45vh;
background: gray;
}
.rightDown{
/*float: right;*/
width: 49%;
height: 45vh;
background: green;
}
/*#tenLeft {*/
/* display: inline-block;*/
/* animation: scroll 10s linear infinite; !* 控制滚动速度和循环 *!*/
/*}*/
/*@keyframes scroll {*/
/* 0% { transform: translateX(0); } !* 开始位置 *!*/
/* 100% { transform: translateX(-100%); } !* 结束位置 *!*/
/*}*/

View File

@ -1,5 +1,6 @@
'use client'
import React, {useEffect, useState} from 'react';
import '@/app/ui/task/project/detailForm.modules.css'
import {PlusOutlined} from '@ant-design/icons';
import {
Button,
@ -28,6 +29,7 @@ import {
updateTask
} from "@/app/lib/task/project/data";
import {DataType, DictType} from "@/app/lib/definitions";
import {DATE_TIME} from "@/app/lib/constants";
export interface DetailFormProps {
itemId: number,
@ -43,7 +45,7 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
const {RangePicker} = DatePicker;
const {TextArea} = Input;
// const [taskMessage,setTaskMessage]=useState<any>({name:"useState没效果吗,是这样的"});
let taskMessage;
// let taskMessage;
useEffect(() => {
if (props.operationId === OPERATION_BUTTON_TYPE.DETAIL||props.operationId === OPERATION_BUTTON_TYPE.UPDATE) {
getTask(props.itemId).then(task => {
@ -52,6 +54,10 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
// setTaskMessage(task.data)
task.data.state=taskStateList.find(taskState=>taskState.code===task.data.state?.toString())?.name;
task.data.priority=taskPriorityList.find(taskPriority=>taskPriority.code===task.data.priority?.toString())?.name;
task.data.actualTimeRange = [task.data.expectedStartTime?dayjs(task.data.expectedStartTime,DATE_TIME):'',
task.data.expectedEndTime?dayjs(task.data.expectedEndTime,DATE_TIME):''];
task.data.expectedTimeRange = [task.data.actualStartTime?dayjs(task.data.actualStartTime,DATE_TIME):'',
task.data.actualEndTime?dayjs(task.data.actualEndTime,DATE_TIME):''];
form.setFieldsValue(task.data)
}else{
message.error(task.status.message);
@ -108,20 +114,20 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
type: values.type,
children: []
}
if (values.expectedStartTime) {
if (values.expectedStartTime[0]) {
request.expectedStartTime = values.expectedStartTime[0]
if (values.expectedTimeRange) {
if (values.expectedTimeRange[0]) {
request.expectedStartTime = values.expectedTimeRange[0]
}
if (values.expectedStartTime[1]) {
request.expectedEndTime = values.expectedStartTime[1]
if (values.expectedTimeRange[1]) {
request.expectedEndTime = values.expectedTimeRange[1]
}
}
if (values.actualStartTime) {
if (values.actualStartTime[0]) {
request.actualStartTime = values.actualStartTime[0]
if (values.actualTimeRange) {
if (values.actualTimeRange[0]) {
request.actualStartTime = values.actualTimeRange[0]
}
if (values.actualStartTime[1]) {
request.actualEndTime = values.actualStartTime[1]
if (values.actualTimeRange[1]) {
request.actualEndTime = values.actualTimeRange[1]
}
}
if (props.operationId===OPERATION_BUTTON_TYPE.ADD_CHILD){
@ -164,12 +170,12 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
{/*</Checkbox>*/}
<Form
labelCol={{span: 4}}
wrapperCol={{span: 14}}
wrapperCol={{span: 18}}
layout="horizontal"
disabled={componentDisabled}
size='large'
onFinish={onFinish}
initialValues={taskMessage}
// initialValues={taskMessage}
form={form}
// style={{maxWidth: '70%'}}
>
@ -215,7 +221,7 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
</Select>
</Form.Item>
<Form.Item<DataType> name={['expectedStartTime']} label="期望">
<Form.Item<DataType> name={['expectedTimeRange']} label="期望">
<RangePicker
disabledDate={disabledDate}
disabledTime={disabledRangeTime}
@ -228,7 +234,7 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
// format="YYYY-MM-DD HH:mm:ss"
/>
</Form.Item>
<Form.Item<DataType> name='actualStartTime' label="实际">
<Form.Item<DataType> name='actualTimeRange' label="实际">
<RangePicker
disabledDate={disabledDate}
disabledTime={disabledRangeTime}

View File

@ -3,6 +3,7 @@ import {Button, Dropdown, MenuProps, message, Modal, Popconfirm, Space} from "an
import {DownOutlined, QuestionCircleOutlined} from "@ant-design/icons";
import {DetailForm} from "@/app/ui/task/project/DetailForm";
import {deleteTask, OPERATION_BUTTON_TYPE} from "@/app/lib/task/project/data";
import Link from "next/link";
export interface OperationButtonProps {
itemId: number,
@ -91,7 +92,7 @@ class OperationButton extends React.Component<OperationButtonProps, OperationMod
},
{
key: OPERATION_BUTTON_TYPE.SHOW_FOUR,
label: <a></a>,
label: <Link href={`/task/four`} ></Link>,
}
];
return <Fragment>

View File

@ -2,9 +2,10 @@
import React, {useEffect, useState} from 'react';
import {Button, ColorPicker, Dropdown, MenuProps, Space, Switch, Table} from 'antd';
import type { TableColumnsType, TableProps } from 'antd';
import {taskPriorityList, taskStateList,TASK_PRIORITY_LIST, taskTreeResult} from "@/app/lib/task/project/data";
import {taskPriorityList, taskStateList, taskTreeResult} from "@/app/lib/task/project/data";
import {DataType, ResponseVO, ResultPage} from "@/app/lib/definitions";
import {DownOutlined} from "@ant-design/icons";
import { useSearchParams, usePathname, useRouter } from 'next/navigation';
import OperationButton from "@/app/ui/task/project/OperationButton";
type TableRowSelection<T> = TableProps<T>['rowSelection'];
@ -65,12 +66,10 @@ const rowSelection: TableRowSelection<DataType> = {
};
const TreeTable: React.FC = () => {
console.log("TreeTable: React.FC ",TASK_PRIORITY_LIST,taskPriorityList)
function recursionActionChild(children:DataType[]){
if (children.length===0){
return;
}
console.log("TreeTable: React.FC :recursionActionChild",TASK_PRIORITY_LIST,taskPriorityList)
for (let item of children) {
item.key=item.id;
item.action=(<OperationButton itemId={item.id} pid={item.pid} pPid={item.pPid} refreshDate={refreshDate}/>)
@ -103,10 +102,7 @@ const TreeTable: React.FC = () => {
{/*<Space align="center" style={{ marginBottom: 16 }}>*/}
{/* CheckStrictly: <Switch checked={checkStrictly} onChange={setCheckStrictly} />*/}
{/*</Space>*/}
<Button type="primary">线</Button>
<Button type="primary"></Button>
<Button type="primary"></Button>
<ColorPicker defaultValue="#1677ff" showText/>
{/*<ColorPicker defaultValue="#1677ff" showText/>*/}
<Table
columns={columns}
// rowSelection={{ ...rowSelection, checkStrictly}}

View File

@ -0,0 +1,221 @@
'use client'
import { EllipsisOutlined, PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { ProTable, TableDropdown } from '@ant-design/pro-components';
import { Button, Dropdown, Space, Tag } from 'antd';
import React, { useRef } from 'react';
import {DataType} from "@/app/lib/definitions";
import {taskPriorityList, taskStateList, taskTreeResult} from "@/app/lib/task/project/data";
const columns: ProColumns<DataType>[] = [
{
title: '任务编码',
dataIndex: 'code',
// valueType: 'indexBorder',
width: '10%',
},
{
title: '任务名称',
dataIndex: 'name',
width: '15%',
copyable: true,
ellipsis: true,
tooltip: '标题过长会自动收缩',
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
],
},
},
{
title: '任务描述',
dataIndex: 'description',
},
{
disable: true,
title: '任务状态',
dataIndex: 'state',
filters: true,
onFilter: true,
ellipsis: true,
valueType: 'select',
fieldProps:{options:taskStateList.map(item => {return {label: item.name,value: item.code}})},
},
{
disable: true,
title: '优先级',
dataIndex: 'priority',
valueType: 'select',
fieldProps:{options:taskPriorityList.map(item => {return {label: item.name,value: item.code}})},
render: (_, record) => (
<Space>
{
<Tag color={taskPriorityList.find(item=> item.code===record.priority?.toString())?.color}
key={taskPriorityList.find(item=> item.code===record.priority?.toString())?.code}>
{taskPriorityList.find(item=> item.code===record.priority?.toString())?.name}
</Tag>
}
</Space>
),
},
{
title: '期望开始时间',
dataIndex: 'expectedStartTime',
valueType: 'date',
hideInTable: true,
search: {
transform: (value) => {
return {
startTime: value,
};
},
},
},
// {
// title: '创建时间',
// dataIndex: 'created_at',
// valueType: 'dateRange',
// hideInTable: true,
// search: {
// transform: (value) => {
// return {
// startTime: value[0],
// endTime: value[1],
// };
// },
// },
// },
// {
// title: '操作',
// valueType: 'option',
// key: 'option',
// render: (text, record, _, action) => [
// <a
// key="editable"
// onClick={() => {
// action?.startEditable?.(record.id);
// }}
// >
// 编辑
// </a>,
// <a href={record.url} target="_blank" rel="noopener noreferrer" key="view">
// 查看
// </a>,
// <TableDropdown
// key="actionGroup"
// onSelect={() => action?.reload()}
// menus={[
// { key: 'copy', name: '复制' },
// { key: 'delete', name: '删除' },
// ]}
// />,
// ],
// },
];
const TreeTablePro: React.FC = () => {
const actionRef = useRef<ActionType>();
return (
<ProTable<DataType>
columns={columns}
actionRef={actionRef}
cardBordered
request={async (params, sort, filter) => {
console.log(sort, filter);
// await waitTime(2000);
// return axios.post<{
// data: GithubIssueItem[];
// }>('https://proapi.azurewebsites.net/github/issues', {
// params,
// });
const response = await taskTreeResult()
// axios.post('https://proapi.azurewebsites.net/github/issues', {
// params,
// });
return {
data:response.data.content,
success: response.status.success,
}
// return response.data;
}}
editable={{
type: 'multiple',
}}
columnsState={{
persistenceKey: 'pro-table-singe-demos',
persistenceType: 'localStorage',
defaultValue: {
option: { fixed: 'right', disable: true },
},
onChange(value) {
console.log('value: ', value);
},
}}
rowKey="id"
search={{
labelWidth: 'auto',
}}
options={{
setting: {
listsHeight: 400,
},
}}
form={{
// 由于配置了 transform提交的参与与定义的不同这里需要转化一下
syncToUrl: (values, type) => {
if (type === 'get') {
return {
...values,
created_at: [values.startTime, values.endTime],
};
}
return values;
},
}}
pagination={{
pageSize: 5,
onChange: (page) => console.log(page),
}}
dateFormatter="string"
headerTitle="任务管理"
toolBarRender={() => [
<Button
key="button"
icon={<PlusOutlined />}
onClick={() => {
actionRef.current?.reload();
}}
type="primary"
>
</Button>,
// <Dropdown
// key="menu"
// menu={{
// items: [
// {
// label: '1st item',
// key: '1',
// },
// {
// label: '2nd item',
// key: '1',
// },
// {
// label: '3rd item',
// key: '1',
// },
// ],
// }}
// >
// <Button>
// <EllipsisOutlined />
// </Button>
// </Dropdown>,
]}></ProTable>
);
};
export default TreeTablePro

View File

@ -0,0 +1,3 @@
.ant-picker-range-separator{
width: 60px;
}