Compare commits

..

No commits in common. "553d7496330bc26b14cc273e8b5ac69e893e247f" and "9ecb7ae551e0422d8e9500be909f673d85f983b8" have entirely different histories.

68 changed files with 294 additions and 1499 deletions

474
package-lock.json generated
View File

@ -9,27 +9,28 @@
"version": "0.1.0",
"dependencies": {
"@ant-design/icons": "^5.3.7",
"@dnd-kit/core": "^6.1.0",
"@dnd-kit/modifiers": "^7.0.0",
"@dnd-kit/sortable": "^8.0.0",
"@dnd-kit/utilities": "^3.2.2",
"antd": "^5.17.4",
"axios": "^1.7.2",
"bootstrap": "^5.3.3",
"dayjs": "^1.11.11",
"formik": "^2.4.6",
"html-to-image": "^1.11.11",
"i18next": "^23.11.5",
"lottie-react": "^2.4.0",
"path-to-regexp": "^6.2.2",
"pdf-lib": "^1.17.1",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-dom": "^18.3.1",
"react-i18next": "^13.5.0",
"react-icons": "^4.12.0",
"react-mathjax": "^1.0.1",
"react-query": "^3.39.3",
"react-router-dom": "^6.23.1",
"react-toastify": "^9.1.3",
"reactstrap": "^9.2.2",
"sass": "^1.77.4",
"ts-node": "^10.9.2",
"vite-plugin-env-compatible": "^2.0.1",
"yup": "^1.4.0",
"zustand": "^4.5.2"
},
@ -39,7 +40,6 @@
"@testing-library/user-event": "^13.5.0",
"@types/node": "^20.14.0",
"@types/react": "^18.3.3",
"@types/react-beautiful-dnd": "^13.1.8",
"@types/react-dom": "^18.3.0",
"@types/react-helmet": "^6.1.11",
"@vitejs/plugin-legacy": "^5.4.1",
@ -1975,9 +1975,6 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
},
@ -1989,9 +1986,6 @@
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
@ -2014,68 +2008,6 @@
"node": ">=10.0.0"
}
},
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@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.npmjs.org/@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": "7.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-7.0.0.tgz",
"integrity": "sha512-BG/ETy3eBjFap7+zIti53f0PCLGDzNXyTmn6fSdrudORf+OH04MxrW4p5+mPu4mgMk9kM41iYONjc3DOUWTcfg==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.1.0",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/sortable": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-8.0.0.tgz",
"integrity": "sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.1.0",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/utilities": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@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.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
@ -2807,7 +2739,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
@ -2834,8 +2765,7 @@
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
@ -2847,6 +2777,22 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@pdf-lib/standard-fonts": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz",
"integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==",
"dependencies": {
"pako": "^1.0.6"
}
},
"node_modules/@pdf-lib/upng": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz",
"integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==",
"dependencies": {
"pako": "^1.0.10"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@ -3394,34 +3340,22 @@
"node_modules/@tsconfig/node10": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
},
"node_modules/@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
},
"node_modules/@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="
},
"node_modules/@types/aria-query": {
"version": "5.0.4",
@ -3570,7 +3504,6 @@
"version": "20.14.15",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz",
"integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
@ -3589,15 +3522,6 @@
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-beautiful-dnd": {
"version": "13.1.8",
"resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz",
"integrity": "sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-dom": {
"version": "18.3.0",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
@ -3908,7 +3832,6 @@
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
@ -3929,9 +3852,6 @@
"version": "8.3.3",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
"integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"acorn": "^8.11.0"
},
@ -4094,10 +4014,7 @@
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
},
"node_modules/argparse": {
"version": "1.0.10",
@ -4773,10 +4690,7 @@
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
},
"node_modules/cross-spawn": {
"version": "7.0.3",
@ -4970,9 +4884,6 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
"optional": true,
"peer": true,
"engines": {
"node": ">=0.3.1"
}
@ -5001,6 +4912,19 @@
"csstype": "^3.0.2"
}
},
"node_modules/dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
"engines": {
"node": ">=8"
}
},
"node_modules/dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
@ -5771,6 +5695,11 @@
"void-elements": "3.1.0"
}
},
"node_modules/html-to-image": {
"version": "1.11.11",
"resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz",
"integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA=="
},
"node_modules/http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
@ -7405,6 +7334,11 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
"node_modules/load-script": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
"integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA=="
},
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@ -7459,23 +7393,6 @@
"loose-envify": "cli.js"
}
},
"node_modules/lottie-react": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.0.tgz",
"integrity": "sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w==",
"dependencies": {
"lottie-web": "^5.10.2"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/lottie-web": {
"version": "5.12.2",
"resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz",
"integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg=="
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -7533,8 +7450,7 @@
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
},
"node_modules/makeerror": {
"version": "1.0.12",
@ -7884,6 +7800,11 @@
"node": ">=6"
}
},
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@ -7946,6 +7867,27 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/path-to-regexp": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz",
"integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw=="
},
"node_modules/pdf-lib": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz",
"integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==",
"dependencies": {
"@pdf-lib/standard-fonts": "^1.0.0",
"@pdf-lib/upng": "^1.0.1",
"pako": "^1.0.11",
"tslib": "^1.11.1"
}
},
"node_modules/pdf-lib/node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/picocolors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
@ -8809,6 +8751,17 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-mathjax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/react-mathjax/-/react-mathjax-1.0.1.tgz",
"integrity": "sha512-+mjFcciZY3GQoqiQm3aRTyDjgBKuoaXpY+SCONX00jScuPpTKwnASeFMS5+pbTIzDf5zPT2Y9ZZfQ9U/d4CKtQ==",
"dependencies": {
"load-script": "^1.0.0"
},
"peerDependencies": {
"react": "^16.3.0"
}
},
"node_modules/react-popper": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
@ -9951,9 +9904,6 @@
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
@ -10022,7 +9972,6 @@
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -10034,8 +9983,7 @@
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
@ -10163,10 +10111,7 @@
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
},
"node_modules/v8-to-istanbul": {
"version": "9.3.0",
@ -10255,6 +10200,15 @@
"vite": ">=2.0.0"
}
},
"node_modules/vite-plugin-env-compatible": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/vite-plugin-env-compatible/-/vite-plugin-env-compatible-2.0.1.tgz",
"integrity": "sha512-DRrOZTg/W44ojVQQfGSMPEgYQGzp5TeIpt9cpaK35hTOC/b2D7Ffl8/RIgK8vQ0mlnDIUgETcA173bnMEkyzdw==",
"dependencies": {
"dotenv": "8.2.0",
"dotenv-expand": "5.1.0"
}
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@ -10662,9 +10616,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"optional": true,
"peer": true,
"engines": {
"node": ">=6"
}
@ -12064,9 +12015,6 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/trace-mapping": "0.3.9"
},
@ -12075,9 +12023,6 @@
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
@ -12096,50 +12041,6 @@
"integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
"dev": true
},
"@dnd-kit/accessibility": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz",
"integrity": "sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==",
"requires": {
"tslib": "^2.0.0"
}
},
"@dnd-kit/core": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.1.0.tgz",
"integrity": "sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==",
"requires": {
"@dnd-kit/accessibility": "^3.1.0",
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
}
},
"@dnd-kit/modifiers": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-7.0.0.tgz",
"integrity": "sha512-BG/ETy3eBjFap7+zIti53f0PCLGDzNXyTmn6fSdrudORf+OH04MxrW4p5+mPu4mgMk9kM41iYONjc3DOUWTcfg==",
"requires": {
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
}
},
"@dnd-kit/sortable": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-8.0.0.tgz",
"integrity": "sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==",
"requires": {
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
}
},
"@dnd-kit/utilities": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
"integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
"requires": {
"tslib": "^2.0.0"
}
},
"@emotion/hash": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
@ -12589,8 +12490,7 @@
"@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
},
"@jridgewell/set-array": {
"version": "1.2.1",
@ -12611,8 +12511,7 @@
"@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
},
"@jridgewell/trace-mapping": {
"version": "0.3.25",
@ -12624,6 +12523,22 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"@pdf-lib/standard-fonts": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz",
"integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==",
"requires": {
"pako": "^1.0.6"
}
},
"@pdf-lib/upng": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz",
"integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==",
"requires": {
"pako": "^1.0.10"
}
},
"@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@ -12989,34 +12904,22 @@
"@tsconfig/node10": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="
},
"@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
},
"@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
},
"@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="
},
"@types/aria-query": {
"version": "5.0.4",
@ -13158,7 +13061,6 @@
"version": "20.14.15",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz",
"integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==",
"dev": true,
"requires": {
"undici-types": "~5.26.4"
}
@ -13177,15 +13079,6 @@
"csstype": "^3.0.2"
}
},
"@types/react-beautiful-dnd": {
"version": "13.1.8",
"resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz",
"integrity": "sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==",
"dev": true,
"requires": {
"@types/react": "*"
}
},
"@types/react-dom": {
"version": "18.3.0",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
@ -13456,8 +13349,7 @@
"acorn": {
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"dev": true
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="
},
"acorn-import-attributes": {
"version": "1.9.5",
@ -13470,9 +13362,6 @@
"version": "8.3.3",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
"integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"acorn": "^8.11.0"
}
@ -13597,10 +13486,7 @@
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
},
"argparse": {
"version": "1.0.10",
@ -14088,10 +13974,7 @@
"create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
},
"cross-spawn": {
"version": "7.0.3",
@ -14235,10 +14118,7 @@
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
},
"diff-sequences": {
"version": "29.6.3",
@ -14261,6 +14141,16 @@
"csstype": "^3.0.2"
}
},
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
"ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
@ -14823,6 +14713,11 @@
"void-elements": "3.1.0"
}
},
"html-to-image": {
"version": "1.11.11",
"resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz",
"integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA=="
},
"http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
@ -16008,6 +15903,11 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
"load-script": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
"integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA=="
},
"loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@ -16053,19 +15953,6 @@
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"lottie-react": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.0.tgz",
"integrity": "sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w==",
"requires": {
"lottie-web": "^5.10.2"
}
},
"lottie-web": {
"version": "5.12.2",
"resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz",
"integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg=="
},
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -16110,8 +15997,7 @@
"make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
},
"makeerror": {
"version": "1.0.12",
@ -16367,6 +16253,11 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@ -16411,6 +16302,29 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-to-regexp": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz",
"integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw=="
},
"pdf-lib": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz",
"integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==",
"requires": {
"@pdf-lib/standard-fonts": "^1.0.0",
"@pdf-lib/upng": "^1.0.1",
"pako": "^1.0.11",
"tslib": "^1.11.1"
},
"dependencies": {
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}
}
},
"picocolors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
@ -17001,6 +16915,14 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"react-mathjax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/react-mathjax/-/react-mathjax-1.0.1.tgz",
"integrity": "sha512-+mjFcciZY3GQoqiQm3aRTyDjgBKuoaXpY+SCONX00jScuPpTKwnASeFMS5+pbTIzDf5zPT2Y9ZZfQ9U/d4CKtQ==",
"requires": {
"load-script": "^1.0.0"
}
},
"react-popper": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
@ -17824,9 +17746,6 @@
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
@ -17863,14 +17782,12 @@
"typescript": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"dev": true
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="
},
"undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
},
"unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
@ -17959,10 +17876,7 @@
"v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
},
"v8-to-istanbul": {
"version": "9.3.0",
@ -17998,6 +17912,15 @@
"fs-extra": "^10.0.0"
}
},
"vite-plugin-env-compatible": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/vite-plugin-env-compatible/-/vite-plugin-env-compatible-2.0.1.tgz",
"integrity": "sha512-DRrOZTg/W44ojVQQfGSMPEgYQGzp5TeIpt9cpaK35hTOC/b2D7Ffl8/RIgK8vQ0mlnDIUgETcA173bnMEkyzdw==",
"requires": {
"dotenv": "8.2.0",
"dotenv-expand": "5.1.0"
}
},
"void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@ -18281,10 +18204,7 @@
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"optional": true,
"peer": true
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
},
"yocto-queue": {
"version": "0.1.0",

View File

@ -7,8 +7,8 @@ import { BsEyeFill } from "react-icons/bs";
import { GoTrash } from "react-icons/go";
interface ActionButtonsProps {
canEdit?: boolean;
canDelete?: boolean;
canEdit: boolean;
canDelete: boolean;
canShow?: boolean;
editTooltipTitle?: string;
deleteTooltipTitle?: string;

View File

@ -1,72 +0,0 @@
import { create } from "zustand";
interface FilterState {
filterState: any[];
setFilterState: (data: any) => void;
clearFilterState: () => void;
setWithOldValue: (data: any) => void;
setInitialValue: (data: any) => void;
}
export const useFilterState = create<FilterState>((set, get) => ({
filterState: [],
setFilterState: (data) => set(() => ({ filterState: data })),
clearFilterState: () => set(() => ({ filterState: [] })),
setWithOldValue: (data) =>
set((state) => ({ filterState: [...state.filterState, data] })),
setInitialValue: (data) => {
if (get().filterState.length < 1) {
set(() => ({ filterState: data }));
}
},
}));
// import { create } from "zustand";
// interface FilterState {
// filterState: any[];
// setFilterState: (data: any) => void;
// clearFilterState: () => void;
// setWithOldValue: (data: any) => void;
// setInitialValue: (data: any) => void;
// setFilterStateWithFormat:(data:any)=>void
// }
// export const useFilterState = create<FilterState>((set, get) => ({
// filterState: [],
// setFilterState: (data) => set(() => ({ filterState: data })),
// clearFilterState: () => set(() => ({ filterState: [] })),
// setWithOldValue: (data) =>
// set((state) => ({ filterState: [...state.filterState, data] })),
// setInitialValue: (data) => {
// if (get().filterState.length < 1) {
// set(() => ({ filterState: data }));
// }
// },
// // Inside your useFilterState store
// setFilterStateWithFormat: (data:any) => {
// const formatDate = (date:any) => {
// if (!date) return null;
// const d = new Date(date);
// const year = d.getFullYear();
// const month = String(d.getMonth() + 1).padStart(2, '0'); // Months are zero-based
// const day = String(d.getDate()).padStart(2, '0');
// return `${year}-${month}-${day}`;
// };
// const formattedData = {
// ...data,
// starting_date: formatDate(data.starting_date),
// };
// set(() => ({ filterState: formattedData }));
// },
// }));

View File

@ -1,11 +0,0 @@
import { create } from "zustand";
interface ModalState {
isOpen: string;
setIsOpen: (value: string) => void;
}
export const useModalState = create<ModalState>((set) => ({
isOpen: "",
setIsOpen: (value: string) => set((state) => ({ isOpen: value })),
}));

View File

@ -1,166 +0,0 @@
import React, { ReactNode, useState } from "react";
import { FaFilter } from "react-icons/fa";
import { Form, Formik, FormikConfig, FormikHelpers } from "formik";
import { Button, ButtonProps, Divider, Modal } from "antd";
import { useTranslation } from "react-i18next";
import { useModalState } from "./Modal";
import { useFilterState } from "./FilterState";
import { ModalEnum } from "../../../enums/Model";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import FormikForm from "../../../Layout/Dashboard/FormikForm";
import SpinContainer from "../../Layout/SpinContainer";
type OmitFormikProps = "children" | "initialValues" | "onSubmit";
interface FormikFormProps extends Omit<FormikConfig<any>, OmitFormikProps> {
children: React.ReactNode;
onSubmit?: (
values: any,
formikHelpers?: FormikHelpers<any>,
) => void | Promise<any>;
getInitialValues?: any;
getValidationSchema?: any;
status?: QueryStatusEnum;
ModelClassName?: string;
width?: string;
isLoading?: boolean;
isOpen: any;
setIsOpen: any;
}
interface SubmitButtonProps extends Omit<ButtonProps, "loading"> {}
const useFilter = () => {
const { setIsOpen, isOpen } = useModalState((state) => state);
const { filterState, setFilterState, clearFilterState } = useFilterState();
const [t] = useTranslation();
const [formValues, setFormValues] = useState({});
const { setObjectToEdit } = useObjectToEdit();
// Define the type for the callback
type SubmitCallback = () => void;
const FilterButton = () => {
const handleState = () => {
if (isOpen === ModalEnum?.FILTER) {
setIsOpen("");
clearFilterState();
setFormValues({});
} else {
setIsOpen(ModalEnum?.FILTER);
}
};
return (
<span onClick={handleState} className="filter_menu_button">
<FaFilter />
{t("Filter")}
</span>
);
};
const FilterBody = ({
onSubmit,
children,
getInitialValues,
getValidationSchema,
status,
ModelClassName,
width = "28vw",
isLoading = false,
setIsOpen,
isOpen,
...formikProps
}: FormikFormProps) => {
const handleSubmit = (values: any) => {
setFilterState(values);
setFormValues(values);
if (onSubmit) {
onSubmit(values);
}
Submit();
setIsOpen("");
};
const handleCancel = () => {
setIsOpen("");
clearFilterState();
setFormValues({});
};
const handleOpen = () => {
setIsOpen(true);
// setObjectToEdit({});
};
const [t] = useTranslation();
return (
<>
<Modal
className={"ModalForm " + ModelClassName}
centered
width={width}
footer={null}
open={isOpen}
onOk={handleOpen}
onCancel={handleCancel}
mask={false}
style={{ position: "absolute", top: "31.4%", left: "16.7%" }}
>
<Formik
enableReinitialize={true}
onSubmit={handleSubmit}
initialValues={formValues}
onReset={handleCancel}
{...formikProps}
>
<Form>
<div>
<header>{t("models.filter")}</header>
<Divider />
<main className="main_modal">
{isLoading ? <SpinContainer /> : children}
<Divider />
</main>
</div>
</Form>
</Formik>
</Modal>
</>
);
};
interface SubmitButtonProps extends Omit<ButtonProps, "loading"> {
}
const FilterSubmit = ({ ...buttonProps }: SubmitButtonProps) => {
return (
<div className="filter-submit-buttons buttons">
<Button className="back_button filter_modal_add_button" type="default" htmlType="reset">
{t("practical.reset")}
</Button>
<Button className="add_button pointer filter_modal_add_button" type="primary" {...buttonProps} htmlType="submit">
{t(`practical.submit`)}
</Button>
</div>
);
};
const Submit = (callback?: SubmitCallback): void => {
if (callback) {
callback();
}
};
return {
FilterButton,
FilterBody,
filterState,
setFilterState,
clearFilterState,
FilterSubmit,
Submit,
};
};
export default useFilter;

View File

@ -10,28 +10,21 @@ interface ModalFormProps {
deleteMutation: any;
ModelEnum: any;
isNavigate?: boolean;
idVerify?:boolean
}
const DeleteModels: React.FC<ModalFormProps> = ({
deleteMutation,
ModelEnum,
isNavigate = false,
idVerify = true
}) => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = deleteMutation;
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
console.log(objectToEdit?.key);
console.log(inputValue);
const iaDisabled =
idVerify ?
Number(objectToEdit?.id) !== Number(inputValue) || isLoading
: objectToEdit?.key !== inputValue || isLoading;
const iaDisabled =
Number(objectToEdit?.id) !== Number(inputValue) || isLoading;
const navigate = useNavigate();
useEffect(() => {
if (isSuccess) {
@ -44,13 +37,9 @@ const DeleteModels: React.FC<ModalFormProps> = ({
}, [isSuccess, setIsOpen]);
const handleSubmit = () => {
idVerify?
mutate({
id: Number(objectToEdit?.id),
})
: mutate({
id:objectToEdit?.key,
})
});
};
const handleCancel = () => {
@ -88,7 +77,7 @@ const DeleteModels: React.FC<ModalFormProps> = ({
<div className="ValidationField w-100 mb-5">
<label className="text ">
{t("practical.to_confirm_deletion_please_re_enter_id")} ({" "}
{objectToEdit?.id || objectToEdit?.key} )
{objectToEdit?.id} )
</label>
<Input

View File

@ -10,7 +10,6 @@ import LayoutFilterModal from "./LayoutFilterModal";
import { BiFilterAlt } from "react-icons/bi";
import { MdKeyboardArrowDown } from "react-icons/md";
import SearchField from "../../Components/DataTable/SearchField";
import useFilter from "../../Components/Utils/Filter/useFilter";
const FilterLayout = ({
filterTitle,
@ -26,23 +25,20 @@ const FilterLayout = ({
// type: type,
// page: currentPage,
const { FilterBody , FilterSubmit} = useFilter();
return (
<div className="filter_header">
<div className="filter_header_top">
<h4>{t(filterTitle)}</h4>
<div className="filter_and_order_by">
<span>
<FilterBody
<LayoutFilterModal
ModelClassName="filter_model_direction"
children={
<div className="model_sub_children">{sub_children}</div>
}
isOpen={isOpen}
setIsOpen={setIsOpen}
>
<div className="model_sub_children">{sub_children}</div>
<FilterSubmit/>
</FilterBody>
/>
<div className="filter_button" onClick={() => setIsOpen(true)}>
<span>
<BiFilterAlt className="addition_select_icon" />
@ -51,27 +47,21 @@ const FilterLayout = ({
<MdKeyboardArrowDown />
</div>
</span>
<span>
<OrderBySelect />
</span>
</div>
</div>
<Divider />
<div className="filter_header_bottom">
<span>
<p>{t("صف لكل صفحة")}</p>
<PaginationColumn />
<p>{t("ادخالات")}</p>
</span>
<div className="header_search">
<SearchField searchBy="" placeholder={t("practical.search_here")} />
</div>
</div>
</div>
);

View File

@ -32,7 +32,7 @@ const DataTable: React.FC<DataTableProps> = ({
rowClassName={(record, index) => getRowClassName(record, index)}
className="DataTable"
loading={{
spinning: isLoading || isRefetching ,
spinning: isLoading || isRefetching,
indicator: (
<Suspense fallback={<></>}>
<LoadingLottie />

View File

@ -4,16 +4,12 @@ import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useGetAllCurriculum } from "../../../api/curriculum";
import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../../enums/params";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState();
const response = useGetAllCurriculum({
subject_id: subject_id,
pagination: true,
...filterState,
});
console.log(response?.data?.data, "response?.data");

View File

@ -8,6 +8,11 @@ const FilterForm = () => {
<Row>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -2,15 +2,9 @@ import { useColumns } from "./useTableColumns";
import React from "react";
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useGetAllGrade } from "../../../api/grade";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const { filterState } = useFilterState();
const response = useGetAllGrade({
pagination: true,
...filterState,
});
const response = useGetAllGrade({ pagination: true });
return <DataTable response={response} useColumns={useColumns} />;
};

View File

@ -1,33 +0,0 @@
import React from "react";
import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../../enums/Model";
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
import { useAddParam } from "../../../../api/param";
import ModelForm from "./ModelForm";
const AddModel: React.FC = () => {
const { mutate, status } = useAddParam();
const handleSubmit = (values: any) => {
mutate({
...values,
});
};
return (
<>
<LayoutModel
status={status as QueryStatusEnum}
ModelEnum={ModalEnum.Param_ADD}
modelTitle="param"
handleSubmit={handleSubmit}
getInitialValues={getInitialValues({})}
getValidationSchema={getValidationSchema}
>
<ModelForm />
</LayoutModel>
</>
);
};
export default AddModel;

View File

@ -1,37 +0,0 @@
import React from "react";
import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../../enums/Model";
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
import ModelForm from "./ModelForm";
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
import { useUpdateParam } from "../../../../api/param";
const EditModel: React.FC = () => {
const { mutate, status } = useUpdateParam();
const { objectToEdit } = useObjectToEdit((state) => state);
const handleSubmit = (values: any) => {
mutate({
...values,
});
};
return (
<>
<LayoutModel
status={status as QueryStatusEnum}
ModelEnum={ModalEnum.Param_EDIT}
modelTitle="param_details"
handleSubmit={handleSubmit}
getInitialValues={getInitialValues(objectToEdit)}
getValidationSchema={getValidationSchema}
isAddModal={false}
>
<ModelForm isEdit={true} />
</LayoutModel>
</>
);
};
export default EditModel;

View File

@ -1,18 +0,0 @@
import React from "react";
import ValidationField from "../../../../Components/ValidationField/ValidationField";
import { Col, Row } from "reactstrap";
const FilterForm = () => {
return (
<div>
<Row>
<Col>
<ValidationField placeholder="key" label="key" name="key" />
<ValidationField placeholder="value" label="value" name="value" />
</Col>
</Row>
</div>
);
};
export default FilterForm;

View File

@ -1,15 +0,0 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../../Components/ValidationField/ValidationField";
const Form = ({isEdit}:{isEdit?:boolean}) => {
return (
<Row className="w-100">
<Col>
<ValidationField placeholder="key" label="key" name="key" disabled={isEdit? true : false} />
<ValidationField placeholder="value" label="value" name="value" />
</Col>
</Row>
);
};
export default Form;

View File

@ -1,15 +0,0 @@
import * as Yup from "yup";
export const getInitialValues = (objectToEdit: any): any => {
return {
// id: objectToEdit?.id ?? null,
key: objectToEdit?.key ?? null,
value: objectToEdit?.value ?? null,
};
};
export const getValidationSchema = () => {
return Yup.object().shape({
key: Yup.mixed().required("validation.required"),
value: Yup.mixed().required("validation.required"),
});
};

View File

@ -1,50 +0,0 @@
import { ModalEnum } from "../../../enums/Model";
import { useTranslation } from "react-i18next";
import { lazy, Suspense } from "react";
import { Spin } from "antd";
import { canAddParam } from "../../../utils/hasAbilityFn";
import useSetPageTitle from "../../../Hooks/useSetPageTitle";
import { useDeleteTag } from "../../../api/tags";
import PageHeader from "../../../Layout/Dashboard/PageHeader";
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
import FilterForm from "./Model/FilterForm";
import { useDeleteParam } from "../../../api/param";
const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModalForm = lazy(
() => import("../../../Layout/Dashboard/DeleteModels"),
);
const TableHeader = () => {
const [t] = useTranslation();
useSetPageTitle(
t(`page_header.param`),
);
const deleteMutation = useDeleteParam();
return (
<div className="TableWithHeader">
<Suspense fallback={<Spin />}>
<PageHeader
pageTitle="param"
ModelAbility={ModalEnum?.Param_ADD}
canAdd={canAddParam}
/>
<FilterLayout
sub_children={<FilterForm />}
filterTitle="sidebar.param"
/>
<Table />
<DeleteModalForm
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.Param_DELETE}
idVerify={false}
/>
<AddModalForm />
<EditModalForm />
</Suspense>
</div>
);
};
export default TableHeader;

View File

@ -1,28 +0,0 @@
import React from "react";
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../../api/utils/useSearchQuery";
import { useGetAllParam } from "../../../api/param";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const { filterState } = useFilterState();
const response = useGetAllParam({
name: searchQuery,
pagination: true,
...filterState,
});
const transformedData = response?.data?.data && typeof response.data.data === 'object'
? Object.entries(response.data.data).map(([key, value]) => ({
key: key,
value: value
}))
: [];
return <DataTable response={response} useColumns={useColumns} dataSource={transformedData} />;
};
export default App;

View File

@ -1,17 +0,0 @@
import { useColumns } from "./useTableColumns";
import Table from "./Table";
import { FaPlus } from "react-icons/fa";
import AddModalForm from "./Model/AddModel";
import EditModalForm from "./Model/EditModel";
// import DeleteModalForm from "../../";
export {
Table,
useColumns,
AddModalForm,
EditModalForm,
// DeleteModalForm,
FaPlus,
};

View File

@ -1,60 +0,0 @@
import { TableColumnsType } from "antd";
import { param, user } from "../../../types/Item";
import { ModalEnum } from "../../../enums/Model";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useModalState } from "../../../zustand/Modal";
import { useTranslation } from "react-i18next";
import { canDeleteParam, canDeleteUser, canEditParam, canEditUser } from "../../../utils/hasAbilityFn";
import ActionButtons from "../../../Components/Table/ActionButtons";
export const useColumns = () => {
const [t] = useTranslation();
const { setIsOpen } = useModalState((state) => state);
const { setObjectToEdit } = useObjectToEdit((state) => state);
const handelDelete = (record: any) => {
setObjectToEdit(record);
setIsOpen(ModalEnum?.Param_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record);
setIsOpen(ModalEnum?.Param_EDIT);
};
const columns: TableColumnsType<param> = [
{
title: t("columns.key"),
dataIndex: "key",
key: "key",
align: "center",
},
{
title: t("columns.value"),
dataIndex: "value",
key: "value",
align: "center",
},
{
title: t("columns.procedure"),
key: "actions",
align: "center",
width: "25vw",
render: (_text, record, index) => {
return (
<ActionButtons
canDelete={canEditParam}
canEdit={canDeleteParam}
index={index}
onDelete={() => handelDelete(record)}
onEdit={() => handleEdit(record)}
/>
);
},
},
];
return columns;
};

View File

@ -4,15 +4,12 @@ import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../../api/utils/useSearchQuery";
import { useGetAllReport } from "../../../api/report";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const { filterState } = useFilterState();
const response = useGetAllReport({
name: searchQuery,
pagination: true,
...filterState,
});
return <DataTable response={response} useColumns={useColumns} />;

View File

@ -7,12 +7,13 @@ const FilterForm = () => {
<div>
<Row>
<Col>
<ValidationField placeholder="first_name" label="first_name" name="first_name" />
{/* <ValidationField placeholder="last_name" label="last_name" name="last_name" /> */}
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
{/* <Col>
<ValidationField placeholder="username" label="username" name="username" />
</Col> */}
</Row>
</div>
);

View File

@ -3,15 +3,12 @@ import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../../api/utils/useSearchQuery";
import { useGetAllReseller } from "../../../api/reseller";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const { filterState } = useFilterState();
const response = useGetAllReseller({
name: searchQuery,
pagination: true,
...filterState
});
return <DataTable response={response} useColumns={useColumns} />;

View File

@ -7,8 +7,12 @@ const FilterForm = () => {
<div>
<Row>
<Col>
<ValidationField placeholder="first_name" label="first_name" name="first_name" />
<ValidationField placeholder="last_name" label="last_name" name="last_name" />
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -2,15 +2,9 @@ import { useColumns } from "./useTableColumns";
import React from "react";
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useGetAllStudent } from "../../../api/student";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const { filterState } = useFilterState();
const response = useGetAllStudent({
pagination: true,
...filterState,
});
const response = useGetAllStudent({ pagination: true });
return <DataTable response={response} useColumns={useColumns} />;
};

View File

@ -8,6 +8,11 @@ const FilterForm = () => {
<Row>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -3,15 +3,12 @@ import { useGetAllTag } from "../../../api/tags";
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../../api/utils/useSearchQuery";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const { filterState } = useFilterState();
const response = useGetAllTag({
name: searchQuery,
pagination: true,
...filterState,
});
return <DataTable response={response} useColumns={useColumns} />;

View File

@ -25,7 +25,6 @@ const LoadingLottie = React.lazy(
import { useTranslation } from "react-i18next";
import { useColumns } from "./useTableColumns";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
interface DataType {
id: string; // Unique identifier for each row
@ -92,13 +91,7 @@ const Row: React.FC<RowProps> = (props) => {
const DrapableTable: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState();
const response = useGetAllUnit({
subject_id: subject_id,
pagination: false,
...filterState,
});
const response = useGetAllUnit({ subject_id: subject_id, pagination: false });
// Assuming the response contains a unique id for each item
const data =

View File

@ -8,6 +8,11 @@ const FilterForm = () => {
<Row>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -5,15 +5,10 @@ import { useGetAllUnit } from "../../../api/unit";
import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../../enums/params";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>();
const response = useGetAllUnit({
subject_id: subject_id,
pagination: true,
});
const response = useGetAllUnit({ subject_id: subject_id, pagination: true });
const { setOldObjectToEdit } = useObjectToEdit();
// console.log(response?.data?.data, "response?.data");
const data = response?.data?.data;

View File

@ -16,7 +16,6 @@ const EditModel: React.FC = () => {
...values,
});
};
return (
<>
<LayoutModel
@ -28,7 +27,7 @@ const EditModel: React.FC = () => {
getValidationSchema={getValidationSchema}
isAddModal={false}
>
<ModelForm isEdit={true} />
<ModelForm />
</LayoutModel>
</>
);

View File

@ -1,18 +1,18 @@
import React from "react";
import ValidationField from "../../../../Components/ValidationField/ValidationField";
import { Col, Row } from "reactstrap";
import { userTypeOptions } from "../../../../config/userTypeOptions";
const FilterForm = () => {
return (
<div>
<Row>
<Col>
<ValidationField placeholder="username" label="username" name="username" />
<ValidationField placeholder="phone_number" label="phone_number" name="phone_number" />
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField type="Select" option={userTypeOptions} placeholder="type" label="type" name="type" />
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -1,25 +1,16 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../../Components/ValidationField/ValidationField";
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
import { userTypeOptions } from "../../../../config/userTypeOptions";
const Form = ({isEdit}:{isEdit?:boolean}) => {
const Form = () => {
return (
<Row className="w-100">
<Col>
<ValidationField placeholder="username" label="username" name="username" />
{isEdit ? ""
:
<ValidationField placeholder="password" label="password" name="password" />}
<ValidationField placeholder="phone_number" label="phone_number" name="phone_number" />
</Col>
<Col>
<ValidationField type="Select" option={userTypeOptions} placeholder="type" label="type" name="type" />
{/* <ValidationField type="Select" option={typeArray} placeholder="type" label="type" name="type" />
<ValidationField type="Select" option={typeArray} placeholder="type" label="type" name="type" /> */}
<ValidationField
placeholder="name"
label="name"
name="name"
type="Number"
/>
</Col>
</Row>
);

View File

@ -2,21 +2,12 @@ import * as Yup from "yup";
export const getInitialValues = (objectToEdit: any): any => {
return {
id: objectToEdit?.id ?? null,
username: objectToEdit?.username ?? null,
password: objectToEdit?.password ?? null,
phone_number: objectToEdit?.phone_number ?? null,
type: objectToEdit?.type ?? null,
name: objectToEdit?.name ?? null,
};
};
export const getValidationSchema = () => {
return Yup.object().shape({
username: Yup.string().required("validation.required"),
// password: Yup.string().required("validation.required"),
phone_number: Yup.string()
.required("validation.required")
.min(10, "Phone number must be at least 10 characters long"),
type: Yup.string().required("validation.required"),
name: Yup.string().required("validation.required"),
});
};
};

View File

@ -8,7 +8,6 @@ import { useDeleteTag } from "../../../api/tags";
import PageHeader from "../../../Layout/Dashboard/PageHeader";
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
import FilterForm from "./Model/FilterForm";
import { useDeleteUser } from "../../../api/user";
const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import("./Model/EditModel"));
@ -18,10 +17,8 @@ const DeleteModalForm = lazy(
const TableHeader = () => {
const [t] = useTranslation();
useSetPageTitle(
t(`page_header.user`),
);
const deleteMutation = useDeleteUser();
useSetPageTitle(t(`page_header.user`));
const deleteMutation = useDeleteTag();
return (
<div className="TableWithHeader">
<Suspense fallback={<Spin />}>

View File

@ -4,17 +4,14 @@ import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../../api/utils/useSearchQuery";
import { useGetAllUser } from "../../../api/user";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const { filterState } = useFilterState();
const response = useGetAllUser({
name: searchQuery,
pagination: true,
...filterState,
});
return <DataTable response={response} useColumns={useColumns} />;
};

View File

@ -30,23 +30,12 @@ export const useColumns = () => {
align: "center",
},
{
title: t("columns.username"),
dataIndex: "username",
key: "username",
align: "center",
},
{
title: t("columns.phone_number"),
dataIndex: "phone_number",
key: "phone_number",
align: "center",
},
{
title: t("columns.type"),
dataIndex: "type",
key: "type",
title: t("columns.name"),
dataIndex: "name",
key: "name",
align: "center",
},
{
title: t("columns.procedure"),
key: "actions",

View File

@ -25,7 +25,6 @@ const LoadingLottie = React.lazy(
import { useTranslation } from "react-i18next";
import { useColumns } from "./useTableColumns";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
interface DataType {
id: string; // Unique identifier for each row
@ -92,12 +91,9 @@ const Row: React.FC<RowProps> = (props) => {
const DrapableTable: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState();
const response = useGetAllLesson({
subject_id: subject_id,
pagination: false,
...filterState,
});
// Assuming the response contains a unique id for each item

View File

@ -8,6 +8,11 @@ const FilterForm = () => {
<Row>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -5,15 +5,10 @@ import { useGetAllLesson } from "../../../api/lesson";
import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../../enums/params";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const { unit_id } = useParams<ParamsEnum>();
const response = useGetAllLesson({
unit_id: unit_id,
pagination: true,
});
const response = useGetAllLesson({ unit_id: unit_id, pagination: true });
const { setOldObjectToEdit } = useObjectToEdit();
// console.log(response?.data?.data, "response?.data");

View File

@ -1,23 +1,19 @@
import React from "react";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { Col, Row } from "reactstrap";
import useFormatDataToSelect from "../../../utils/useFormatDataToSelect";
const FilterForm = () => {
const yesNoArray = [
{id: "لا", name:"لا"},
{id: "نعم", name:"نعم"},
]
return (
<div>
<Row>
<Col>
<ValidationField placeholder="content" label="content" name="content" />
{/* <ValidationField type="Select" option={yesNoArray} placeholder="isBase" label="isBase" name="isBase" /> */}
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
{/* <Col>
<ValidationField type="Select" option={yesNoArray} placeholder="canAnswersBeShuffled" label="canAnswersBeShuffled" name="canAnswersBeShuffled" />
</Col> */}
</Row>
</div>
);

View File

@ -4,16 +4,12 @@ import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useGetAllQuestion } from "../../../api/Question";
import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../../enums/params";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const { lesson_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState();
const response = useGetAllQuestion({
lesson_id: lesson_id,
pagination: true,
...filterState,
});
return <DataTable response={response} useColumns={useColumns} />;
};

View File

@ -8,6 +8,11 @@ const FilterForm = () => {
<Row>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="name" label="name" name="name" />
</Col>
</Row>
</div>

View File

@ -3,17 +3,10 @@ import { useParams } from "react-router-dom";
import DataTable from "../../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import { ParamsEnum } from "../../../../enums/params";
import { useFilterState } from "../../../../Components/Utils/Filter/FilterState";
const TablePage: React.FC = () => {
const { course_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState();
const response = useGetAllSubject({
course_id: course_id,
pagination: true,
...filterState,
});
const response = useGetAllSubject({ course_id: course_id, pagination: true });
return <DataTable response={response} useColumns={useColumns} />;
};

View File

@ -1,33 +0,0 @@
import React from "react";
import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../../enums/Model";
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
import ModelForm from "./ModelForm";
import { useAddStudentPackage } from "../../../../api/studentPackage";
const AddModel: React.FC = () => {
const { mutate, status } = useAddStudentPackage();
const handleSubmit = (values: any) => {
mutate({
...values,
});
};
return (
<>
<LayoutModel
status={status as QueryStatusEnum}
ModelEnum={ModalEnum.Student_Package_ADD}
modelTitle="student_package"
handleSubmit={handleSubmit}
getInitialValues={getInitialValues({})}
getValidationSchema={getValidationSchema}
>
<ModelForm />
</LayoutModel>
</>
);
};
export default AddModel;

View File

@ -1,37 +0,0 @@
import React from "react";
import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../../enums/Model";
import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
import ModelForm from "./ModelForm";
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
import { useUpdateUser } from "../../../../api/user";
const EditModel: React.FC = () => {
const { mutate, status } = useUpdateUser();
const { objectToEdit } = useObjectToEdit((state) => state);
const handleSubmit = (values: any) => {
mutate({
...values,
});
};
return (
<>
<LayoutModel
status={status as QueryStatusEnum}
ModelEnum={ModalEnum.USER_EDIT}
modelTitle="user_details"
handleSubmit={handleSubmit}
getInitialValues={getInitialValues(objectToEdit)}
getValidationSchema={getValidationSchema}
isAddModal={false}
>
<ModelForm isEdit={true} />
</LayoutModel>
</>
);
};
export default EditModel;

View File

@ -1,18 +0,0 @@
import React from "react";
import ValidationField from "../../../../Components/ValidationField/ValidationField";
import { Col, Row } from "reactstrap";
const FilterForm = () => {
return (
<div>
<Row>
<Col>
<ValidationField placeholder="activation_date" label="activation_date" name="activation_date" />
{/* <ValidationField placeholder="name" label="name" name="name" /> */}
</Col>
</Row>
</div>
);
};
export default FilterForm;

View File

@ -1,28 +0,0 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../../Components/ValidationField/ValidationField";
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
const Form = ({isEdit}:{isEdit?:boolean}) => {
const typeOptions = [
{ id: "student", name: "student" },
{ id: "reseller", name: "reseller" },
{ id: "admin", name: "admin" },
]
const typeArray = useFormatDataToSelect(typeOptions)
return (
<Row className="w-100">
<Col>
<ValidationField type="Date" placeholder="activation_date" label="activation_date" name="activation_date" />
<ValidationField type="Date" placeholder="expiration_date" label="expiration_date" name="expiration_date" />
<ValidationField placeholder="student_id" label="student_id" name="student_id" />
</Col>
<Col>
<ValidationField placeholder="package_id" label="package_id" name="package_id" />
</Col>
</Row>
);
};
export default Form;

View File

@ -1,25 +0,0 @@
import * as Yup from "yup";
import dayjs from "dayjs";
export const getInitialValues = (objectToEdit: any): any => {
return {
id: objectToEdit?.id ?? null,
activation_date: objectToEdit?.activation_date
? dayjs(objectToEdit?.activation_date, "YYYY/MM/DD")
: null,
expiration_date: objectToEdit?.expiration_date
? dayjs(objectToEdit?.expiration_date, "YYYY/MM/DD")
: null,
student_id: objectToEdit?.student_id ?? null,
package_id: objectToEdit?.package_id ?? null,
};
};
export const getValidationSchema = () => {
return Yup.object().shape({
activation_date: Yup.mixed().required("validation.required"),
expiration_date: Yup.mixed().required("validation.required"),
student_id: Yup.number().required("validation.required"),
package_id: Yup.number().required("validation.required"),
});
};

View File

@ -1,49 +0,0 @@
import { ModalEnum } from "../../../enums/Model";
import { useTranslation } from "react-i18next";
import { lazy, Suspense } from "react";
import { Spin } from "antd";
import { canAddStudent_Package, canAddUser } from "../../../utils/hasAbilityFn";
import useSetPageTitle from "../../../Hooks/useSetPageTitle";
import { useDeleteTag } from "../../../api/tags";
import PageHeader from "../../../Layout/Dashboard/PageHeader";
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
import FilterForm from "./Model/FilterForm";
import { useDeleteUser } from "../../../api/user";
const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModalForm = lazy(
() => import("../../../Layout/Dashboard/DeleteModels"),
);
const TableHeader = () => {
const [t] = useTranslation();
useSetPageTitle(
t(`page_header.student_package`),
);
// const deleteMutation = useDeleteUser();
return (
<div className="TableWithHeader">
<Suspense fallback={<Spin />}>
<PageHeader
pageTitle="student_package"
ModelAbility={ModalEnum?.Student_Package_ADD}
canAdd={canAddStudent_Package}
/>
<FilterLayout
sub_children={<FilterForm />}
filterTitle="sidebar.student_package"
/>
<Table />
{/* <DeleteModalForm
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.USER_DELETE}
/> */}
<AddModalForm />
<EditModalForm />
</Suspense>
</div>
);
};
export default TableHeader;

View File

@ -1,22 +0,0 @@
import React from "react";
import { useGetAllTag } from "../../../api/tags";
import DataTable from "../../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../../api/utils/useSearchQuery";
import { useGetAllUser } from "../../../api/user";
import { useGetAllStudentPackage } from "../../../api/studentPackage";
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const { filterState } = useFilterState();
const response = useGetAllStudentPackage({
name: searchQuery,
pagination: true,
...filterState,
});
return <DataTable response={response} useColumns={useColumns} />;
};
export default App;

View File

@ -1,17 +0,0 @@
import { useColumns } from "./useTableColumns";
import Table from "./Table";
import { FaPlus } from "react-icons/fa";
import AddModalForm from "./Model/AddModel";
import EditModalForm from "./Model/EditModel";
// import DeleteModalForm from "../../";
export {
Table,
useColumns,
AddModalForm,
EditModalForm,
// DeleteModalForm,
FaPlus,
};

View File

@ -1,89 +0,0 @@
import { TableColumnsType } from "antd";
import { Student_Package } from "../../../types/Item";
import { ModalEnum } from "../../../enums/Model";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useModalState } from "../../../zustand/Modal";
import { useTranslation } from "react-i18next";
import { canDeleteUser, canEditUser } from "../../../utils/hasAbilityFn";
import ActionButtons from "../../../Components/Table/ActionButtons";
export const useColumns = () => {
const [t] = useTranslation();
const { setIsOpen } = useModalState((state) => state);
const { setObjectToEdit } = useObjectToEdit((state) => state);
const handelDelete = (record: any) => {
setObjectToEdit(record);
setIsOpen(ModalEnum?.USER_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record);
setIsOpen(ModalEnum?.USER_EDIT);
};
const columns: TableColumnsType<Student_Package> = [
{
title: t("columns.id"),
dataIndex: "id",
key: "id",
align: "center",
},
{
title: t("columns.activation_date"),
dataIndex: "activation_date",
key: "activation_date",
align: "center",
},
{
title: t("columns.expiration_date"),
dataIndex: "expiration_date",
key: "expiration_date",
align: "center",
},
{
title: t("columns.first_name"),
key: "first_name",
align: "center",
render: (row) => {
return(row?.student?.first_name)
}
},
{
title: t("columns.last_name"),
key: "last_name",
align: "center",
render: (row) => {
return(row?.student?.last_name)
}
},
{
title: t("columns.sex"),
key: "sex",
align: "center",
render: (row) => {
return(row?.student?.sex)
}
},
// {
// title: t("columns.procedure"),
// key: "actions",
// align: "center",
// width: "25vw",
// render: (_text, record, index) => {
// return (
// <ActionButtons
// // canDelete={canEditUser}
// canEdit={canDeleteUser}
// index={index}
// onDelete={() => handelDelete(record)}
// onEdit={() => handleEdit(record)}
// />
// );
// },
// },
];
return columns;
};

View File

@ -25,13 +25,6 @@ const ReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Page"));
const AddReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Add/Page"));
const EditReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Edit/Page"));
const User = React.lazy(() => import("./Pages/Admin/User/Page"));
const Param = React.lazy(() => import("./Pages/Admin/Param/Page"));
/// RESELLER ///
const Student_Package = React.lazy(() => import("./Pages/ReSeller/StudentPackage/Page"));
import { hasAbility } from "./utils/hasAbility";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "./enums/abilities";
import { ParamsEnum } from "./enums/params";
@ -98,44 +91,6 @@ export const menuItems: TMenuItem[] = [
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0,
},
{
header: "page_header.user",
element: <User />,
icon: <FaSellcast />,
text: "sidebar.user",
path: `/${ABILITIES_ENUM?.USER}`,
abilities: ABILITIES_ENUM?.USER,
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0,
},
{
header: "page_header.param",
element: <Param />,
icon: <FaSellcast />,
text: "sidebar.param",
path: `/${ABILITIES_ENUM?.PARAM}`,
abilities: ABILITIES_ENUM?.PARAM,
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0,
},
/// RESELLER /////
{
header: "page_header.student_package",
element: <Student_Package />,
icon: <FaSellcast />,
text: "sidebar.student_package",
path: `/${ABILITIES_ENUM?.Student_Package}`,
abilities: ABILITIES_ENUM?.Student_Package,
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0,
},
// {
// header: "page_header.tags",
// element: <Tags />,

View File

@ -61,5 +61,3 @@
font-size: 16px;
}
}

View File

@ -73,14 +73,3 @@
}
}
}
.filter_modal_add_button, .filter_modal_cancel_button{
padding: 20px 10px !important;
}
@media screen and (max-width:800px) {
.filter_modal_add_button, .filter_modal_cancel_button{
font-size: 8px !important;
}
}

View File

@ -4,8 +4,7 @@ import { HEADER_KEY } from "../config";
import { AxiosResponse } from "../../types/Axios";
type DataToSend = {
id?: number | string | any;
key?: string | any
id: number | string;
};
function useDeleteMutation(
@ -22,7 +21,6 @@ function useDeleteMutation(
["X-Custom-Message"]: toast,
},
});
return data;
},
);

View File

@ -18,11 +18,9 @@ const useUpdateMutation = (
dataToSend.append("_method", "PUT");
request = dataToSend;
id = dataToSend.get("id");
console.log(dataToSend);
} else {
request = { ...dataToSend, _method: "PUT" };
id = dataToSend?.id || dataToSend?.key;
id = dataToSend?.id;
}
const { data } = await axios.post(url + `/` + id, request, {

View File

@ -1,20 +0,0 @@
import useAddMutation from "./helper/useAddMutation";
import useDeleteMutation from "./helper/useDeleteMutation";
import useGetQuery from "./helper/useGetQuery";
import useUpdateMutation from "./helper/useUpdateMutation";
const API = {
GET: "/param",
ADD: "/param",
DELETE: "/param",
UPDATE: "/param",
};
const KEY = "param";
export const useGetAllParam = (params?: any, options?: any) =>
useGetQuery(KEY, API.GET, params, options);
export const useAddParam = () => useAddMutation(KEY, API.ADD);
export const useUpdateParam = (params?: any) => useUpdateMutation(KEY, API.GET);
export const useDeleteParam = (params?: any) =>
useDeleteMutation(KEY, API.DELETE);

View File

@ -1,15 +0,0 @@
import useAddMutation from "./helper/useAddMutation";
import useDeleteMutation from "./helper/useDeleteMutation";
import useGetQuery from "./helper/useGetQuery";
import useUpdateMutation from "./helper/useUpdateMutation";
const API = {
GET: "/resellers/studentPackage",
ADD: "/resellers/studentPackage",
};
const KEY = "studentPackage";
export const useGetAllStudentPackage = (params?: any, options?: any) =>
useGetQuery(KEY, API.GET, params, options);
export const useAddStudentPackage = () => useAddMutation(KEY, API.ADD);

View File

@ -1,5 +0,0 @@
export const userTypeOptions = [
{ id: "student", name: "student" },
{ id: "reseller", name: "reseller" },
{ id: "admin", name: "admin" },
]

View File

@ -2,7 +2,7 @@ export enum ModalEnum {
////// division
DIVISION_ADD = "division.add",
//// FILLTER
FILTER = "FILTER",
FILLTER_NAV_MOVE_STUDENT = "fillter_nav.move_student",
//// classes
@ -171,21 +171,10 @@ export enum ModalEnum {
USER_ADD = "USER.add",
USER_DELETE = "USER.delete",
/// ReSeller
RE_SELLER_EDIT = "ReSeller.edit",
RE_SELLER_ADD = "ReSeller.add",
RE_SELLER_DELETE = "ReSeller.delete",
/// ReSeller
RE_SELLER_EDIT = "ReSeller.edit",
RE_SELLER_ADD = "ReSeller.add",
RE_SELLER_DELETE = "ReSeller.delete",
/// Param
Param_EDIT = "Param.edit",
Param_ADD = "Param.add",
Param_DELETE = "Param.delete",
///StudentPackage
Student_Package_EDIT = "Student_Package.edit",
Student_Package_ADD = "Student_Package.add",
Student_Package_DELETE = "Student_Package.delete",
}

View File

@ -46,8 +46,6 @@ export enum ABILITIES_ENUM {
Report = "report",
User = "user",
RE_SELLER = "reseller",
Student_Package = "student_package"
////
}

View File

@ -158,12 +158,8 @@
"isBase": "سؤال رئيسي",
"question_options_count": "عدد الخيارات",
"procedure": "اجراء",
"icon":"الايقونة",
"canAnswersBeShuffled":"يمكن خلط الإجابات",
"phone_number":"رقم الهاتف",
"key":"المفتاح",
"expiration_date":"تاريخ الالغاء",
"activation_date":"تاريخ التنشيط",
"icon": "الايقونة",
"canAnswersBeShuffled": "يمكن خلط الإجابات",
"first_name":"الاسم الأول"
},
"practical": {
@ -280,8 +276,7 @@
"user": "مستخدم",
"user_details": "تفاصيل المستخدم",
"reseller_details": "تفاصيل اعادة البيع",
"reseller":"البائعين",
"student_package":"حزمة الطالب"
"reseller":"البائعين"
},
"education_class_actions": {
"Student_Records": "سجلات الطلاب",
@ -384,9 +379,7 @@
"answer_content": "نص السؤال",
"hint": "شرح الاختيار",
"hint_question": "شرح السؤال",
"_": "",
"key":"المفتاح",
"canAnswersBeShuffled":"يمكن خلط الإجابات"
"_": ""
},
"select": {
"Payments": {
@ -702,9 +695,7 @@
"report": "تقرير",
"user": "مستخدم",
"student": "الطلاب",
"reseller":"البائعين",
"param":"معامل",
"student_package":"حزمة الطالب"
"reseller":"البائعين"
},
"message": {
"some_thing_went_wrong": "حدث خطأ ما",
@ -729,9 +720,7 @@
"subject": "مواد",
"curriculum": "مقرر",
"question": "السؤال",
"user": "مستخدم",
"param":"معامل",
"student_package":"حزمة الطالب"
"user": "مستخدم"
},
"page_header": {
"dashboard": "لوحة القيادة / الصفحة الرئيسية",
@ -765,9 +754,7 @@
"grade": "الصفوف",
"report": "تقرير",
"user": "مستخدم",
"reseller":" لوحة القيادة / البائعين",
"param":"معامل",
"student_package":"حزمة الطالب"
"reseller":" لوحة القيادة / البائعين"
},
"table": {
"student": "قائمة الطلاب",

View File

@ -335,23 +335,3 @@ export type reseller = {
key?: number;
name: string;
};
export type param = {
id: number;
key?: number;
value: string;
};
export type Student_Package = {
id: number;
student: student;
expiration_date: string;
activation_date: string;
};
type student = {
first_name:string;
last_name:string;
sex:string
}

View File

@ -1,10 +0,0 @@
export const formatDate = (dateString:any) => {
if (!dateString) return null; // Handle empty date string
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`; // Return formatted date
};

View File

@ -640,41 +640,3 @@ export const canShowReSeller = hasAbility(
ABILITIES_ENUM.RE_SELLER,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Param
export const canAddParam = hasAbility(
ABILITIES_ENUM.PARAM,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditParam = hasAbility(
ABILITIES_ENUM.PARAM,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteParam = hasAbility(
ABILITIES_ENUM.PARAM,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowParam = hasAbility(
ABILITIES_ENUM.PARAM,
ABILITIES_VALUES_ENUM.SHOW,
);
/// User
export const canAddStudent_Package = hasAbility(
ABILITIES_ENUM.Student_Package,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditStudent_Package = hasAbility(
ABILITIES_ENUM.Student_Package,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteStudent_Package = hasAbility(
ABILITIES_ENUM.Student_Package,
ABILITIES_VALUES_ENUM.DELETE,
);

View File

@ -2,7 +2,6 @@ const useFormatDataToSelect = (Data: any) => {
const format = (data: any) => {
if (!Array.isArray(data)) return []; // Check if data is an array
return data?.map((item: any) => ({
value: item?.id,
label: item?.name ?? item?.title,
}));