From 34baeb40e3c60b54a4408deec3ddfad0ae801f7f Mon Sep 17 00:00:00 2001 From: CCTVcalc Date: Thu, 26 Jun 2025 11:06:48 +0300 Subject: [PATCH] before store --- i18n-2.xlsm | Bin 40816 -> 46547 bytes index.html | 1 + package-lock.json | 128 +++---- package.json | 2 +- quasar.config.ts | 3 +- src/App.vue | 116 ++---- src/boot/axios.ts | 1 - src/boot/global-components.ts | 14 +- src/boot/helpers.ts | 73 ---- src/boot/telegram-boot.ts | 5 - src/components/companyInfoPersons.vue | 9 +- src/components/meetingBlock.vue | 452 ++++++++++++----------- src/components/pnAutoAvatar.vue | 61 +++- src/components/pnBottomSheetDialog.vue | 97 +++++ src/components/pnChainAvatar.vue | 56 +++ src/components/pnDialogBody.vue | 37 -- src/components/pnFileUploader.vue | 158 ++++++++ src/components/pnPageCard.vue | 8 +- src/components/pnScrollList.vue | 110 +----- src/components/pnShadowScroll.vue | 107 ++++++ src/components/pnSmallDialog.vue | 85 +++++ src/components/pnTaskPriorityIcon.vue | 51 ++- src/components/projectInfoBlock.vue | 74 ---- src/components/taskBlock.vue | 393 ++++++++++++++++++++ src/components/taskItem.vue | 148 ++++++-- src/css/app.scss | 2 +- src/helpers/files-functions.ts | 125 +++++++ src/helpers/helpers.ts | 98 +++++ src/i18n/en-US/index — копия.ts | 18 - src/i18n/en-US/index.ts | 2 +- src/i18n/ru-RU/index.ts | 2 +- src/pages/ErrorNotFound.vue | 13 +- src/pages/MainPage.vue | 13 +- src/pages/MeetingAddPage.vue | 30 +- src/pages/MeetingEditPage.vue | 261 ++------------ src/pages/MeetingInfoPage.vue | 390 ++++++++++---------- src/pages/TaskAddPage.vue | 259 ++------------ src/pages/TaskEditPage.vue | 34 ++ src/pages/TaskInfoPage.vue | 380 ++++++++++++++++---- src/pages/UserInfoPage.vue | 94 ++--- src/pages/main/ChatsPage.vue | 15 +- src/pages/main/FilesPage.vue | 477 ++++++++++--------------- src/pages/main/HeaderPage.vue | 53 ++- src/pages/main/MeetingsPage.vue | 139 ++----- src/pages/main/TasksPage.vue | 431 +++++++++++++++------- src/pages/main/UsersPage.vue | 40 +-- src/router/index.ts | 36 +- src/router/routes.ts | 8 +- src/stores/auth.ts | 21 ++ src/stores/chats.ts | 7 +- src/stores/files.ts | 10 +- src/stores/meetings.ts | 51 ++- src/stores/projects.ts | 45 ++- src/stores/settings.ts | 8 +- src/stores/tasks.ts | 33 +- src/stores/users.ts | 23 +- src/types/{File.ts => FileLink.ts} | 5 +- src/types/Meeting.ts | 4 +- src/types/Task.ts | 13 +- 59 files changed, 3180 insertions(+), 2149 deletions(-) delete mode 100644 src/boot/helpers.ts create mode 100644 src/components/pnBottomSheetDialog.vue create mode 100644 src/components/pnChainAvatar.vue delete mode 100644 src/components/pnDialogBody.vue create mode 100644 src/components/pnFileUploader.vue create mode 100644 src/components/pnShadowScroll.vue create mode 100644 src/components/pnSmallDialog.vue delete mode 100644 src/components/projectInfoBlock.vue create mode 100644 src/components/taskBlock.vue create mode 100644 src/helpers/files-functions.ts create mode 100644 src/helpers/helpers.ts delete mode 100644 src/i18n/en-US/index — копия.ts create mode 100644 src/pages/TaskEditPage.vue create mode 100644 src/stores/auth.ts rename src/types/{File.ts => FileLink.ts} (86%) diff --git a/i18n-2.xlsm b/i18n-2.xlsm index 2f472860926c07abd1c9e3177d9635637e5ecfae..912d8ec3581d048e2d005254cd3eb33bc5528d71 100644 GIT binary patch delta 36962 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 + diff --git a/package-lock.json b/package-lock.json index 0545aad..32966f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "@twa-dev/types": "^8.0.2", "@types/node": "^20.17.30", "@types/telegram-web-app": "^7.10.1", - "@vue/devtools": "^7.7.2", + "@vue/devtools": "^7.7.6", "@vue/eslint-config-typescript": "^14.1.3", "autoprefixer": "^10.4.2", "eslint": "^9.14.0", @@ -2142,9 +2142,9 @@ "license": "MIT" }, "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -2642,14 +2642,14 @@ } }, "node_modules/@vue/devtools": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools/-/devtools-7.7.2.tgz", - "integrity": "sha512-YLGea5P5cX3av6ExnQ08cbk/BYSUyfp0frRPQQgEYVfC53QV8UVisYFVdB2eFCjsQ9b+z0LmEIGtXAmTMnKQNw==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools/-/devtools-7.7.6.tgz", + "integrity": "sha512-i/mADVyhxpvy6F2nFzN/3eY0OkGZDiDmIxGcAx/0BziDpHpi+1lWJRiJrt8yuKhpKe7Zfv9FM+UqXuZf6xHkHw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-electron": "^7.7.2", - "@vue/devtools-kit": "^7.7.2" + "@vue/devtools-electron": "^7.7.6", + "@vue/devtools-kit": "^7.7.6" }, "bin": { "vue-devtools": "cli.mjs" @@ -2662,18 +2662,18 @@ "license": "MIT" }, "node_modules/@vue/devtools-core": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.2.tgz", - "integrity": "sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.6.tgz", + "integrity": "sha512-ghVX3zjKPtSHu94Xs03giRIeIWlb9M+gvDRVpIZ/cRIxKHdW6HE/sm1PT3rUYS3aV92CazirT93ne+7IOvGUWg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.2", - "@vue/devtools-shared": "^7.7.2", + "@vue/devtools-kit": "^7.7.6", + "@vue/devtools-shared": "^7.7.6", "mitt": "^3.0.1", - "nanoid": "^5.0.9", - "pathe": "^2.0.2", - "vite-hot-client": "^0.2.4" + "nanoid": "^5.1.0", + "pathe": "^2.0.3", + "vite-hot-client": "^2.0.4" }, "peerDependencies": { "vue": "^3.0.0" @@ -2706,43 +2706,43 @@ "license": "MIT" }, "node_modules/@vue/devtools-electron": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-electron/-/devtools-electron-7.7.2.tgz", - "integrity": "sha512-WxCwLdqBdKDGHwEAU9BozOgPIOMwncM8lcze4fDs5HYRGaICclW9du1ARH5eewJl8wTvSGs2I0r/p5q60p6wAA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-electron/-/devtools-electron-7.7.6.tgz", + "integrity": "sha512-RAQr0hRiZbXE86OZi/gOWguTPEW2kUWk7ox1CO24e8H7P+85YdYByv/rYBccGukdrfIygbuJmhkiiYLmdsS3EQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-core": "^7.7.2", - "@vue/devtools-kit": "^7.7.2", - "@vue/devtools-shared": "^7.7.2", - "electron": "^32.2.6", - "execa": "^9.5.1", - "h3": "^1.13.0", + "@vue/devtools-core": "^7.7.6", + "@vue/devtools-kit": "^7.7.6", + "@vue/devtools-shared": "^7.7.6", + "electron": "^33.4.8", + "execa": "^9.5.2", + "h3": "^1.15.1", "ip": "^2.0.1", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "socket.io": "^4.8.1", "socket.io-client": "^4.8.1" } }, "node_modules/@vue/devtools-electron/node_modules/execa": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", - "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", "dev": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", - "human-signals": "^8.0.0", + "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", - "pretty-ms": "^9.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" + "yoctocolors": "^2.1.1" }, "engines": { "node": "^18.19.0 || >=20.5.0" @@ -2855,25 +2855,25 @@ } }, "node_modules/@vue/devtools-kit": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz", - "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.2", - "birpc": "^0.2.19", + "@vue/devtools-shared": "^7.7.6", + "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", - "superjson": "^2.2.1" + "superjson": "^2.2.2" } }, "node_modules/@vue/devtools-shared": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", - "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", + "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", "dev": true, "license": "MIT", "dependencies": { @@ -3488,9 +3488,9 @@ } }, "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", "dev": true, "license": "MIT", "funding": { @@ -4485,9 +4485,9 @@ } }, "node_modules/crossws": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", - "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "dev": true, "license": "MIT", "dependencies": { @@ -4914,9 +4914,9 @@ "license": "MIT" }, "node_modules/electron": { - "version": "32.3.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.3.3.tgz", - "integrity": "sha512-7FT8tDg+MueAw8dBn5LJqDvlM4cZkKJhXfgB3w7P5gvSoUQVAY6LIQcXJxgL+vw2rIRY/b9ak7ZBFbCMF2Bk4w==", + "version": "33.4.11", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", + "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6636,20 +6636,20 @@ "license": "MIT" }, "node_modules/h3": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", - "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.3.tgz", + "integrity": "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==", "dev": true, "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", - "crossws": "^0.3.3", + "crossws": "^0.3.4", "defu": "^6.1.4", - "destr": "^2.0.3", + "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", - "ufo": "^1.5.4", + "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, @@ -11326,9 +11326,9 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, "license": "MIT" }, @@ -11619,9 +11619,9 @@ } }, "node_modules/vite-hot-client": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz", - "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.0.4.tgz", + "integrity": "sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg==", "dev": true, "license": "MIT", "funding": { diff --git a/package.json b/package.json index 48a5004..687f01a 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@twa-dev/types": "^8.0.2", "@types/node": "^20.17.30", "@types/telegram-web-app": "^7.10.1", - "@vue/devtools": "^7.7.2", + "@vue/devtools": "^7.7.6", "@vue/eslint-config-typescript": "^14.1.3", "autoprefixer": "^10.4.2", "eslint": "^9.14.0", diff --git a/quasar.config.ts b/quasar.config.ts index 902d21b..8312784 100644 --- a/quasar.config.ts +++ b/quasar.config.ts @@ -50,7 +50,8 @@ export default defineConfig((ctx) => { alias: { 'composables': path.resolve(__dirname, './src/composables'), - 'types': path.resolve(__dirname, './src/types') + 'types': path.resolve(__dirname, './src/types'), + 'helpers': path.resolve(__dirname, './src/helpers') }, typescript: { diff --git a/src/App.vue b/src/App.vue index d2eeb01..5acbc42 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,13 +3,15 @@ - - - - \ No newline at end of file diff --git a/src/boot/axios.ts b/src/boot/axios.ts index 4c44fdc..aa0b788 100644 --- a/src/boot/axios.ts +++ b/src/boot/axios.ts @@ -1,6 +1,5 @@ import { defineBoot } from '#q-app/wrappers' import axios, { type AxiosInstance } from 'axios' -import { useAuthStore } from 'src/stores/auth' declare module 'vue' { interface ComponentCustomProperties { diff --git a/src/boot/global-components.ts b/src/boot/global-components.ts index 4488a41..ab598f4 100644 --- a/src/boot/global-components.ts +++ b/src/boot/global-components.ts @@ -3,9 +3,13 @@ import pnPageCard from 'components/pnPageCard.vue' import pnScrollList from 'components/pnScrollList.vue' import pnAutoAvatar from 'components/pnAutoAvatar.vue' import pnOverlay from 'components/pnOverlay.vue' -import pnDialogBody from 'components/pnDialogBody.vue' +import pnSmallDialog from 'components/pnSmallDialog.vue' import pnImageSelector from 'components/pnImageSelector.vue' import pnTaskPriorityIcon from 'components/pnTaskPriorityIcon.vue' +import pnChainAvatar from 'components/pnChainAvatar.vue' +import pnShadowScroll from 'components/pnShadowScroll.vue' +import pnFileUploader from 'components/pnFileUploader.vue' +import pnBottomSheetDialog from 'components/pnBottomSheetDialog.vue' const components = { pnPageCard, @@ -13,8 +17,12 @@ const components = { pnAutoAvatar, pnOverlay, pnImageSelector, - pnDialogBody, - pnTaskPriorityIcon + pnSmallDialog, + pnBottomSheetDialog, + pnTaskPriorityIcon, + pnChainAvatar, + pnShadowScroll, + pnFileUploader } export default boot(({ app }) => { diff --git a/src/boot/helpers.ts b/src/boot/helpers.ts deleted file mode 100644 index 6b1a2ea..0000000 --- a/src/boot/helpers.ts +++ /dev/null @@ -1,73 +0,0 @@ -function isDirty ( - obj1: Record | null | undefined, - obj2: Record | null | undefined -): boolean { - const actualObj1 = obj1 ?? {} - const actualObj2 = obj2 ?? {} - - const filteredObj1 = filterIgnored(actualObj1) - const filteredObj2 = filterIgnored(actualObj2) - - const allKeys = new Set([...Object.keys(filteredObj1), ...Object.keys(filteredObj2)]) - - for (const key of allKeys) { - const hasKey1 = Object.hasOwn(filteredObj1, key) - const hasKey2 = Object.hasOwn(filteredObj2, key) - - if (hasKey1 !== hasKey2) return false - - if (hasKey1 && hasKey2) { - const val1 = filteredObj1[key] - const val2 = filteredObj2[key] - - if (typeof val1 === 'string' && typeof val2 === 'string') { - if (val1.trim() !== val2.trim()) return false - } else if (val1 !== val2) { - return false - } - } - } - - return true -} - -function filterIgnored(obj: Record): Record { - const filtered: Record = {} - - for (const key in obj) { - const originalValue = obj[key] - - // Пропускаем значения, которые не string, number или boolean - if ( - typeof originalValue !== 'string' && - typeof originalValue !== 'number' && - typeof originalValue !== 'boolean' - ) { - continue - } - - let value = originalValue - - if (typeof value === 'string') { - value = value.trim() - if (value === '') continue - } - - if (value === 0 || value === false) continue - - filtered[key] = value - } - - return filtered -} - -function parseIntString (s: string | string[] | undefined) :number | null { - if (typeof s !== 'string') return null - const regex = /^[+-]?\d+$/ - return regex.test(s) ? Number(s) : null -} - -export { - isDirty, - parseIntString -} \ No newline at end of file diff --git a/src/boot/telegram-boot.ts b/src/boot/telegram-boot.ts index aa8c7df..445645c 100644 --- a/src/boot/telegram-boot.ts +++ b/src/boot/telegram-boot.ts @@ -1,6 +1,5 @@ import { defineBoot } from '#q-app/wrappers' import type { WebApp } from "@twa-dev/types" -import { useProjectsStore } from 'stores/projects' declare global { interface Window { @@ -16,10 +15,6 @@ export default defineBoot(({ app }) => { webApp.ready() webApp.SettingsButton.isVisible = true app.config.globalProperties.$tg = webApp - const projectStore = useProjectsStore() - if (Number(webApp.initDataUnsafe.start_param)) { - projectStore.setStartProjectId(Number(webApp.initDataUnsafe.start_param)) - } app.provide('tg', webApp) } }) diff --git a/src/components/companyInfoPersons.vue b/src/components/companyInfoPersons.vue index db051f9..ce1be05 100644 --- a/src/components/companyInfoPersons.vue +++ b/src/components/companyInfoPersons.vue @@ -13,10 +13,11 @@ @click="goPersonInfo()" > - - - - + diff --git a/src/components/meetingBlock.vue b/src/components/meetingBlock.vue index 4a2cdbd..7eb5b8a 100644 --- a/src/components/meetingBlock.vue +++ b/src/components/meetingBlock.vue @@ -1,253 +1,307 @@ + + + + + diff --git a/src/components/pnBottomSheetDialog.vue b/src/components/pnBottomSheetDialog.vue new file mode 100644 index 0000000..79d03d6 --- /dev/null +++ b/src/components/pnBottomSheetDialog.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/src/components/pnChainAvatar.vue b/src/components/pnChainAvatar.vue new file mode 100644 index 0000000..6489c90 --- /dev/null +++ b/src/components/pnChainAvatar.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/pnDialogBody.vue b/src/components/pnDialogBody.vue deleted file mode 100644 index da26e2c..0000000 --- a/src/components/pnDialogBody.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/components/pnFileUploader.vue b/src/components/pnFileUploader.vue new file mode 100644 index 0000000..77cf454 --- /dev/null +++ b/src/components/pnFileUploader.vue @@ -0,0 +1,158 @@ + + + + + \ No newline at end of file diff --git a/src/components/pnPageCard.vue b/src/components/pnPageCard.vue index db8cf53..7f4b394 100644 --- a/src/components/pnPageCard.vue +++ b/src/components/pnPageCard.vue @@ -6,15 +6,13 @@ - +
+ +
diff --git a/src/components/pnScrollList.vue b/src/components/pnScrollList.vue index 0d88983..9b23999 100644 --- a/src/components/pnScrollList.vue +++ b/src/components/pnScrollList.vue @@ -5,62 +5,32 @@ >
- -
+
- + -
- - - -
- +
\ No newline at end of file + diff --git a/src/components/pnShadowScroll.vue b/src/components/pnShadowScroll.vue new file mode 100644 index 0000000..733f6fa --- /dev/null +++ b/src/components/pnShadowScroll.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/components/pnSmallDialog.vue b/src/components/pnSmallDialog.vue new file mode 100644 index 0000000..3e04756 --- /dev/null +++ b/src/components/pnSmallDialog.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/components/pnTaskPriorityIcon.vue b/src/components/pnTaskPriorityIcon.vue index 298b338..9c563c7 100644 --- a/src/components/pnTaskPriorityIcon.vue +++ b/src/components/pnTaskPriorityIcon.vue @@ -1,22 +1,45 @@ diff --git a/src/components/projectInfoBlock.vue b/src/components/projectInfoBlock.vue deleted file mode 100644 index 15cb87e..0000000 --- a/src/components/projectInfoBlock.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - diff --git a/src/components/taskBlock.vue b/src/components/taskBlock.vue new file mode 100644 index 0000000..b72e06c --- /dev/null +++ b/src/components/taskBlock.vue @@ -0,0 +1,393 @@ + + + + + diff --git a/src/components/taskItem.vue b/src/components/taskItem.vue index 4ff1afc..d935393 100644 --- a/src/components/taskItem.vue +++ b/src/components/taskItem.vue @@ -1,50 +1,146 @@ diff --git a/src/pages/MeetingInfoPage.vue b/src/pages/MeetingInfoPage.vue index 6e637f9..b8748a5 100644 --- a/src/pages/MeetingInfoPage.vue +++ b/src/pages/MeetingInfoPage.vue @@ -1,195 +1,133 @@ diff --git a/src/pages/TaskAddPage.vue b/src/pages/TaskAddPage.vue index c308cbf..4096f8e 100644 --- a/src/pages/TaskAddPage.vue +++ b/src/pages/TaskAddPage.vue @@ -1,236 +1,39 @@ - - + \ No newline at end of file diff --git a/src/pages/TaskEditPage.vue b/src/pages/TaskEditPage.vue new file mode 100644 index 0000000..274c90c --- /dev/null +++ b/src/pages/TaskEditPage.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/pages/TaskInfoPage.vue b/src/pages/TaskInfoPage.vue index 84eebc2..7756665 100644 --- a/src/pages/TaskInfoPage.vue +++ b/src/pages/TaskInfoPage.vue @@ -1,93 +1,327 @@ - - - - - - - - - {{ $t('settings__language') }} - - - - - - - - - - - {{ $t('settings__font_size') }} - - -
- - -
-
-
-
+ + + +
+ + + + + +
+ + +
diff --git a/src/pages/UserInfoPage.vue b/src/pages/UserInfoPage.vue index fe5884c..d623b00 100644 --- a/src/pages/UserInfoPage.vue +++ b/src/pages/UserInfoPage.vue @@ -2,37 +2,35 @@
- - - - - - +
{{ tname }}
@{{ user.username }}
-
@@ -44,6 +42,7 @@ v-show="item" :model-value="displayUser[key]" dense + readonly filled class="w100" :label = "$t('user_card__' + key)" @@ -60,21 +59,19 @@ diff --git a/src/pages/main/UsersPage.vue b/src/pages/main/UsersPage.vue index 536172d..15cc982 100644 --- a/src/pages/main/UsersPage.vue +++ b/src/pages/main/UsersPage.vue @@ -27,26 +27,26 @@ @click="goUserInfo(item.id)" > - - - - - - - - {{item.section1}} - - - {{item.section3}} - - -
- -
{{item.section2_1}}
-
{{'@' + item.section2_2}}
-
-
-
+ + + + + {{item.section1}} + + + {{item.section3}} + + +
+ +
{{item.section2_1}}
+
{{'@' + item.section2_2}}
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts index a346060..770fa93 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -24,26 +24,42 @@ export default defineRouter(function (/* { store, ssrContext } */) { }) Router.beforeEach(async (to) => { - console.log(to) - if (to.name === 'settings') return; - const projectsStore = useProjectsStore() + + if (to.name === 'settings') return + if (to.name === '404') return + const projectsStore = useProjectsStore() + console.log('router mount', projectsStore.startRouteInfo) + + if (projectsStore.startRouteInfo && to.path === '/') { + const { id, taskId, meetingId } = projectsStore.startRouteInfo + projectsStore.setStartRouteInfo(null) + + if (!projectsStore.isInit) await projectsStore.init() + const project = projectsStore.projectById(id) + + if (!project) return { name: '404' } + + return taskId + ? { name: 'task_info', params: { id, taskId } } + : meetingId + ? { name: 'meeting_info', params: { id, meetingId } } + : { name: 'files', params: { id } } + } + if (to.params.id) { const projectId = Number(to.params.id) - if (!projectsStore.isInit) await projectsStore.init() const project = projectsStore.projectById(projectId) - if (!project) return { name: 'page404' } - + if (!project) return { name: '404' } + if (projectsStore.currentProjectId !== projectId) { projectsStore.setCurrentProjectId(projectId) } } else { - if (!projectsStore.startProjectId) return { name: 'page404' } - projectsStore.setCurrentProjectId(projectsStore.startProjectId) - return { name: 'files', params: { id: projectsStore.startProjectId }} + return { name: '404' } } }) @@ -61,7 +77,7 @@ export default defineRouter(function (/* { store, ssrContext } */) { } Router.afterEach((to) => { - const BackButton = window.Telegram?.WebApp?.BackButton; + const BackButton = window.Telegram?.WebApp?.BackButton if (BackButton) { // Управление видимостью if (to.meta.hideBackButton) { diff --git a/src/router/routes.ts b/src/router/routes.ts index 39d66c8..a94d273 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -48,6 +48,11 @@ const routes: RouteRecordRaw[] = [ path: '/project/:id(\\d+)/task/add', component: () => import('pages/TaskAddPage.vue') }, + { + name: 'task_edit', + path: '/project/:id(\\d+)/task/:taskId(\\d+)/edit', + component: () => import('pages/TaskEditPage.vue'), + }, { name: 'task_info', path: '/project/:id(\\d+)/task/:taskId(\\d+)', @@ -60,7 +65,7 @@ const routes: RouteRecordRaw[] = [ }, { name: 'meeting_edit', - path: '/project/:id(\\d+)/meeting/:meetingId(\\d+)', + path: '/project/:id(\\d+)/meeting/:meetingId(\\d+)/edit', component: () => import('pages/MeetingEditPage.vue'), }, { @@ -81,6 +86,7 @@ const routes: RouteRecordRaw[] = [ ] }, { + name: '404', path: '/:catchAll(.*)*', component: () => import('pages/ErrorNotFound.vue'), } diff --git a/src/stores/auth.ts b/src/stores/auth.ts new file mode 100644 index 0000000..78ab3fd --- /dev/null +++ b/src/stores/auth.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { api } from 'boot/axios' +import type { WebApp } from '@twa-dev/types' + +export const useAuthStore = defineStore('auth', () => { + const isInit = ref(false) + const telegramUserData = ref() + + async function init (tg: WebApp) { + await api.post('/auth?' + tg?.initData) + telegramUserData.value = tg?.initDataUnsafe.user + isInit.value = true + } + + return { + isInit, + telegramUserData, + init + } +}) diff --git a/src/stores/chats.ts b/src/stores/chats.ts index a4ef668..0d135b7 100644 --- a/src/stores/chats.ts +++ b/src/stores/chats.ts @@ -13,8 +13,8 @@ export const useChatsStore = defineStore('chats', () => { const currentProjectId = computed(() => projectsStore.currentProjectId) async function init () { - const response = await api.get('/project/' + currentProjectId.value + '/chat') - const chatsAPI = response.data.data + const { data } = await api.get('/project/' + currentProjectId.value + '/chat') + const chatsAPI = data.data chats.value.push(...chatsAPI) isInit.value = true } @@ -24,6 +24,8 @@ export const useChatsStore = defineStore('chats', () => { isInit.value = false } + const getChats = computed(() => chats.value) + function chatById (id: number) { return chats.value.find(el =>el.id === id) } @@ -33,6 +35,7 @@ export const useChatsStore = defineStore('chats', () => { isInit, init, reset, + getChats, chatById } }) diff --git a/src/stores/files.ts b/src/stores/files.ts index 9eacac1..9f3b735 100644 --- a/src/stores/files.ts +++ b/src/stores/files.ts @@ -2,19 +2,19 @@ import { ref, computed } from 'vue' import { defineStore } from 'pinia' import { api } from 'boot/axios' import { useProjectsStore } from 'stores/projects' -import type { File } from 'types/File' +import type { FileLink } from 'types/FileLink' export const useFilesStore = defineStore('files', () => { - const files = ref([]) + const files = ref([]) const isInit = ref(false) const projectsStore = useProjectsStore() const currentProjectId = computed(() => projectsStore.currentProjectId) async function init () { - const response = await api.get('/project/' + currentProjectId.value + '/file') - const filesAPI = response.data.data + const { data } = await api.get('/project/' + currentProjectId.value + '/file') + const filesAPI = data.data files.value.push(...filesAPI) isInit.value = true } @@ -34,6 +34,7 @@ export const useFilesStore = defineStore('files', () => { return (await response).data.data } + const getFiles = computed(() => files.value) function fileById (id: number) { return files.value.find(el =>el.id === id) @@ -46,6 +47,7 @@ export const useFilesStore = defineStore('files', () => { reset, fileUrl, remove, + getFiles, fileById } }) diff --git a/src/stores/meetings.ts b/src/stores/meetings.ts index 9a280e9..7c20051 100644 --- a/src/stores/meetings.ts +++ b/src/stores/meetings.ts @@ -13,8 +13,8 @@ export const useMeetingsStore = defineStore('meetings', () => { const currentProjectId = computed(() => projectsStore.currentProjectId) async function init () { - const response = await api.get('/project/' + currentProjectId.value + '/meeting') - const meetingsAPI = response.data.data + const { data } = await api.get('/project/' + currentProjectId.value + '/meeting') + const meetingsAPI = data.data meetings.value.push(...meetingsAPI) isInit.value = true } @@ -24,44 +24,57 @@ export const useMeetingsStore = defineStore('meetings', () => { isInit.value = false } - async function add (meetingData: MeetingParams) { - const response = await api.post('/project/' + currentProjectId.value + '/meeting', meetingData) - const newMeetingAPI = response.data.data + async function add (meetingData: MeetingParams, newFiles: File[]) { + const { data } = await api.post('/project/' + currentProjectId.value + '/meeting', meetingData) + const newMeetingAPI = data.data meetings.value.push(newMeetingAPI) - return newMeetingAPI + const id = newMeetingAPI.id + await updateParticipants(id, meetingData.participants) + if (newFiles.length !== 0) await attachFiles(id, newFiles) + return newMeetingAPI //not include files and participants!! } async function update (meetingId: number, meetingData: MeetingParams) { - const response = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId, meetingData) - const meetingAPI = response.data.data + const { data } = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId, meetingData) + const meetingAPI = data.data const idx = meetings.value.findIndex(item => item.id === meetingAPI.id) if (meetings.value[idx]) Object.assign(meetings.value[idx], meetingAPI) } async function updateParticipants (meetingId: number, participants: number[]) { - const response = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId + '/participant', participants) - const participantsAPI = response.data.data + const { data } = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId + '/participant', participants) + const participantsAPI = data.data const idx = meetings.value.findIndex(item => item.id === meetingId) if (meetings.value[idx]) meetings.value[idx].participants = participantsAPI } - async function attachFiles (meetingId: number, files: number[]) { - const response = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId + '/attach', files) - const filesAPI = response.data.data + async function attachFiles (meetingId: number, files: File[]) { + const formData = new FormData() + files.forEach(file => formData.append('files[]', file)) + const { data } = await api.post( + '/project/' + currentProjectId.value + '/meeting/' + meetingId + '/attach', + formData, + { + headers: { + 'Content-Type': 'multipart/form-data' + } + } + ) + const filesAPI = data.data const idx = meetings.value.findIndex(item => item.id === meetingId) if (meetings.value[idx]) meetings.value[idx].files = filesAPI } async function setCancelStatus (meetingId: number, status: boolean) { - const response = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId, { is_cancel: status }) - const meetingAPI = response.data.data + const { data } = await api.put('/project/' + currentProjectId.value + '/meeting/' + meetingId, { is_cancel: status }) + const meetingAPI = data.data const idx = meetings.value.findIndex(item => item.id === meetingAPI.id) if (meetings.value[idx]) Object.assign(meetings.value[idx], meetingAPI) } async function remove (meetingId: number) { - const response = await api.delete('/project/' + currentProjectId.value + '/meeting/' + meetingId) - const meetingAPIid = response.data.data.id + const { data } = await api.delete('/project/' + currentProjectId.value + '/meeting/' + meetingId) + const meetingAPIid = data.data.id const idx = meetings.value.findIndex(item => item.id === meetingAPIid) meetings.value.splice(idx, 1) } @@ -70,6 +83,9 @@ export const useMeetingsStore = defineStore('meetings', () => { return meetings.value.find(el => el.id === id) } + // getters + const getMeetings = computed(() => meetings.value) + return { meetings, isInit, @@ -81,6 +97,7 @@ export const useMeetingsStore = defineStore('meetings', () => { attachFiles, setCancelStatus, remove, + getMeetings, meetingById } }) diff --git a/src/stores/projects.ts b/src/stores/projects.ts index 6af0459..5ec6881 100644 --- a/src/stores/projects.ts +++ b/src/stores/projects.ts @@ -1,7 +1,9 @@ -import { ref, watch } from 'vue' +import { ref, watch, computed } from 'vue' import { defineStore } from 'pinia' import { api } from 'boot/axios' +import { useAuthStore } from 'stores/auth' + import { useFilesStore } from 'stores/files' import { useTasksStore } from 'stores/tasks' import { useMeetingsStore } from 'stores/meetings' @@ -13,7 +15,6 @@ import type { Project } from 'types/Project' export const useProjectsStore = defineStore('projects', () => { const projects = ref([]) const currentProjectId = ref(null) - const startProjectId = ref(null) const isInit = ref(false) const filesStore = useFilesStore() @@ -23,8 +24,8 @@ export const useProjectsStore = defineStore('projects', () => { const chatsStore = useChatsStore() async function init () { - const response = await api.get('/project') - const projectsAPI = response.data.data + const { data } = await api.get('/project') + const projectsAPI = data.data projects.value.push(...projectsAPI) isInit.value = true } @@ -43,18 +44,21 @@ export const useProjectsStore = defineStore('projects', () => { currentProjectId.value = id } - function setStartProjectId (id: number | null) { - startProjectId.value = id - } + const authStore = useAuthStore() + async function initStores () { resetStores() - if (!filesStore.isInit) await filesStore.init() - if (!tasksStore.isInit) await tasksStore.init() - if (!meetingsStore.isInit) await meetingsStore.init() - if (!usersStore.isInit) await usersStore.init() - if (!chatsStore.isInit) await chatsStore.init() - + + await Promise.all([ + filesStore.init(), + tasksStore.init(), + meetingsStore.init(), + usersStore.init(), + chatsStore.init() + ]) + + usersStore.setMyId(authStore.telegramUserData.id) } function resetStores () { @@ -65,6 +69,14 @@ export const useProjectsStore = defineStore('projects', () => { chatsStore.reset() } + const getProjects = computed(() => projects.value) + + const startRouteInfo = ref<{ id: number; taskId?: number; meetingId?: number } | null>(null) + + function setStartRouteInfo (info: { id: number; taskId?: number; meetingId?: number } | null) { + startRouteInfo.value = info + } + watch (currentProjectId, async (newId) => { if (newId) await initStores(); else resetStores() }, { flush: 'sync' }) @@ -75,11 +87,12 @@ export const useProjectsStore = defineStore('projects', () => { isInit, projects, currentProjectId, - startProjectId, projectById, setCurrentProjectId, - setStartProjectId, initStores, - resetStores + resetStores, + getProjects, + startRouteInfo, + setStartRouteInfo } }) diff --git a/src/stores/settings.ts b/src/stores/settings.ts index 9453984..5619c08 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -54,8 +54,6 @@ export const useSettingsStore = defineStore('settings', () => { console.error('Quasar Error load locale:', quasarLang, e) } } - - const detectLocale = (): string => { const localeMap = { @@ -113,10 +111,10 @@ export const useSettingsStore = defineStore('settings', () => { const init = async () => { try { - const response = await api.get('/settings') + const { data } = await api.get('/settings') settings.value = { - fontSize: response.data.data.settings.fontSize || defaultSettings.fontSize, - locale: response.data.data.settings.locale || detectLocale() + fontSize: data.data.settings.fontSize || defaultSettings.fontSize, + locale: data.data.settings.locale || detectLocale() } } catch { settings.value.locale = detectLocale() diff --git a/src/stores/tasks.ts b/src/stores/tasks.ts index ba0efb6..0ac89b5 100644 --- a/src/stores/tasks.ts +++ b/src/stores/tasks.ts @@ -45,13 +45,37 @@ export const useTasksStore = defineStore('tasks', () => { if (tasks.value[idx]) tasks.value[idx].participants = observersAPI } - async function attachFiles (taskId: number, files: number[]) { - const response = await api.put('/project/' + currentProjectId.value + '/task/' + taskId + '/attach', files) + async function attachFiles (taskId: number, files: File[]) { + const formData = new FormData() + files.forEach(file => formData.append('files[]', file)) + const response = await api.post( + '/project/' + currentProjectId.value + '/task/' + taskId + '/attach', + formData, + { + headers: { + 'Content-Type': 'multipart/form-data' + } + } + ) const filesAPI = response.data.data const idx = tasks.value.findIndex(item => item.id === taskId) if (tasks.value[idx]) tasks.value[idx].files = filesAPI } + async function setCancelStatus (taskId: number) { + const response = await api.put('/project/' + currentProjectId.value + '/task/' + taskId, { status: 6 }) + const taskAPI = response.data.data + const idx = tasks.value.findIndex(item => item.id === taskAPI.id) + if (tasks.value[idx]) Object.assign(tasks.value[idx], taskAPI) + } + + async function setRestoreStatus (taskId: number) { + const response = await api.put('/project/' + currentProjectId.value + '/task/' + taskId, { status: 0 }) + const taskAPI = response.data.data + const idx = tasks.value.findIndex(item => item.id === taskAPI.id) + if (tasks.value[idx]) Object.assign(tasks.value[idx], taskAPI) + } + async function remove (taskId: number) { const response = await api.delete('/project/' + currentProjectId.value + '/task/' + taskId) const taskAPIid = response.data.data.id @@ -59,6 +83,8 @@ export const useTasksStore = defineStore('tasks', () => { tasks.value.splice(idx, 1) } + const getTasks = computed(() => tasks.value) + function taskById (id :number) { return tasks.value.find(el => el.id === id) } @@ -72,7 +98,10 @@ export const useTasksStore = defineStore('tasks', () => { update, updateObservers, attachFiles, + setCancelStatus, + setRestoreStatus, remove, + getTasks, taskById } }) diff --git a/src/stores/users.ts b/src/stores/users.ts index 8529bcb..f112cb4 100644 --- a/src/stores/users.ts +++ b/src/stores/users.ts @@ -6,15 +6,21 @@ import type { User } from 'types/User' export const useUsersStore = defineStore('users', () => { + interface myId { + telegram_id: number + id: number + } + const users = ref([]) const isInit = ref(false) + const myId = ref({ telegram_id: -1, id: -1 }) const projectsStore = useProjectsStore() const currentProjectId = computed(() => projectsStore.currentProjectId) async function init () { - const response = await api.get('/project/' + currentProjectId.value + '/user') - const usersAPI = response.data.data + const { data } = await api.get('/project/' + currentProjectId.value + '/user') + const usersAPI = data.data users.value.push(...usersAPI) isInit.value = true } @@ -34,6 +40,8 @@ export const useUsersStore = defineStore('users', () => { return users.value.find(el =>el.id === id) } + const getUsers = computed(() => users.value) + function userNameById (id: number) { const user = userById(id) return user?.fullname @@ -42,13 +50,22 @@ export const useUsersStore = defineStore('users', () => { || '---' } + function setMyId (telegram_id: number | undefined) { + if (!telegram_id) return + const me = users.value.find(el => el.telegram_id === telegram_id) + if (me) myId.value = { telegram_id: telegram_id, id: me.id } + } + return { users, isInit, + myId, init, reset, reload, userById, - userNameById + getUsers, + userNameById, + setMyId } }) diff --git a/src/types/File.ts b/src/types/FileLink.ts similarity index 86% rename from src/types/File.ts rename to src/types/FileLink.ts index 7dcf80e..5495ea4 100644 --- a/src/types/File.ts +++ b/src/types/FileLink.ts @@ -1,10 +1,11 @@ -interface File { +interface FileLink { id: number project_id: number origin_chat_id: number origin_message_id: number chat_id: number message_id: number + telegram_chat_id: number file_id: number filename: string mime: string @@ -19,5 +20,5 @@ interface File { } export type { - File + FileLink } diff --git a/src/types/Meeting.ts b/src/types/Meeting.ts index 7f1f8f8..e9ece19 100644 --- a/src/types/Meeting.ts +++ b/src/types/Meeting.ts @@ -3,16 +3,18 @@ interface MeetingParams { description: string place: string meet_date: number - chat_attach: number | null + chat_id: number | null participants: number[] files: number[] is_cancel: boolean + [key: string]: unknown } interface Meeting extends MeetingParams { id: number project_id: number created_by: number + is_editable: boolean [key: string]: unknown } diff --git a/src/types/Task.ts b/src/types/Task.ts index 72a52ae..1c9df80 100644 --- a/src/types/Task.ts +++ b/src/types/Task.ts @@ -1,12 +1,16 @@ interface TaskParams { name: string description: string - assigned_to: number + assigned_to: number | null priority: 0 | 1 | 2 | 3 - status: 1 | 5 + status: 1 | 5 | 6 time_spent?: number - create_date: number plan_date: number + observers: number[] + files: number[] + chat_id: number | null + close_files: number[] + close_comment: string } interface Task extends TaskParams { @@ -14,8 +18,7 @@ interface Task extends TaskParams { project_id: number created_by: number closed_by: number | null - observers: number[] - files: number[] + create_date: number close_date: number [key: string]: unknown }