From 78b4d2464e90e85faba062d8e7ddbbbe948270d6 Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Mon, 28 Apr 2025 08:28:47 +0330 Subject: [PATCH 01/17] . --- .gitmodules | 3 +++ systems/task_ui | 1 + 2 files changed, 4 insertions(+) create mode 160000 systems/task_ui diff --git a/.gitmodules b/.gitmodules index 990288b..5ea05f3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "systems/chat_ui"] path = systems/chat_ui url = https://git2.tavasi.ir/front/chat_ui.git +[submodule "systems/task_ui"] + path = systems/task_ui + url = https://git2.tavasi.ir/front/task_ui.git diff --git a/systems/task_ui b/systems/task_ui new file mode 160000 index 0000000..0e61ff5 --- /dev/null +++ b/systems/task_ui @@ -0,0 +1 @@ +Subproject commit 0e61ff5f8d1e301cf6436a390f6412d2b0117d21 From c460543f5d0e3b69f93d3bfd244d4718a118286c Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Mon, 28 Apr 2025 08:28:52 +0330 Subject: [PATCH 02/17] . --- .env | 1 - .env.majles | 1 + nuxt.config.ts | 4 +++- routes/task.ts | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ systems/task_ui | 2 +- 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 routes/task.ts diff --git a/.env b/.env index 15a7229..c0162bb 100644 --- a/.env +++ b/.env @@ -55,7 +55,6 @@ VITE_ENTITY_SYSTEM=entity-view-system VITE_BORHAN_SYSTEM=borhan-system VITE_THIQAT_SYSTEM=thiqat-system VITE_CHAT_SYSTEM=chat-system -VITE_TASK_SYSTEM=task-system VITE_REPORT_SYSTEM=report-system VITE_ADMIN_SYSTEM=admin-panel VITE_TAHRIR_SYSTEM=tahrir-system diff --git a/.env.majles b/.env.majles index ab79b62..bb64b85 100644 --- a/.env.majles +++ b/.env.majles @@ -21,6 +21,7 @@ VITE_TAHRIR_PAGE_TITLE = قانون - سامانه ای برای سندنگار VITE_REPORT_PAGE_TITLE = قانون - سامانه گزارش گیری داده VITE_PERMISSION_PAGE_TITLE = قانون - سامانه کنترل وظایف VITE_CHAT_PAGE_TITLE = قانون - سامانه گفتگو +VITE_TASK_PAGE_TITLE = قانون - سامانه وظایف VITE_RESEARCH_PAGE_TITLE = قانون - تحقیقات من VITE_AI_TOOLS_PAGE_TITLE = قانون - حاشیه نویسی diff --git a/nuxt.config.ts b/nuxt.config.ts index 4173a0b..32785c9 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -6,6 +6,7 @@ import chat from "./routes/chat"; import haditha from "./routes/haditha"; import search from "./routes/search"; import research from "./routes/research"; +import task from "./routes/task"; const envs = import.meta.env; let sassEnvVariables = ""; @@ -44,7 +45,7 @@ export default defineNuxtConfig({ "pages:extend"(pages) { // Add custom routes - pages.push(...search, ...research, ...haditha, ...chat); + pages.push(...search, ...research, ...haditha, ...chat, ...task); }, }, @@ -170,6 +171,7 @@ export default defineNuxtConfig({ "@research": "~/systems/research_ui", "@haditha": "~/systems/hadith_ui", "@chat": "~/systems/chat_ui", + "@task": "~/systems/task_ui", }, vite: { resolve: {}, diff --git a/routes/task.ts b/routes/task.ts new file mode 100644 index 0000000..4ec79da --- /dev/null +++ b/routes/task.ts @@ -0,0 +1,53 @@ +export default [ + { + path: "/task", + file: "@task/pages/index.vue", + meta: { breadcrumb: "سامانه وظایف" }, + children: [ + { + path: "", + redirect: { name: "taskDashboard" }, + }, + { + path: "dashboard", + name: "taskDashboard", + file: "@task/pages/TaskDashboard.vue", + meta: { + breadcrumb: "پیشخوان مدیریت وظایف", + }, + }, + { + path: "times/list", + name: "taskTimes", + file: "@task/pages/Task.vue", + meta: { + breadcrumb: "ساعات", + }, + }, + { + path: "tasks/list", + name: "taskList", + file: "@task/pages/Task.vue", + meta: { + breadcrumb: "وظایف", + }, + }, + { + path: "teams/list", + name: "teams", + file: "@task/pages/TaskTeams.vue", + meta: { + breadcrumb: "تیم ها", + }, + }, + { + path: "admin/list", + name: "taskReport", + file: "@task/pages/TaskReport.vue", + meta: { + breadcrumb: "گزارش وظایف", + }, + }, + ], + }, +]; diff --git a/systems/task_ui b/systems/task_ui index 0e61ff5..ad47094 160000 --- a/systems/task_ui +++ b/systems/task_ui @@ -1 +1 @@ -Subproject commit 0e61ff5f8d1e301cf6436a390f6412d2b0117d21 +Subproject commit ad470940f4cf986638b575d4b8afaa2ec50c267c From 7aa389afa4436df5a87c16eb7dc9bee046fee11c Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Mon, 28 Apr 2025 08:35:05 +0330 Subject: [PATCH 03/17] =?UTF-8?q?=D8=AA=D8=BA=DB=8C=DB=8C=D8=B1=D8=A7?= =?UTF-8?q?=D8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GIT_SUBMODULE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GIT_SUBMODULE.md b/GIT_SUBMODULE.md index 9b18dc5..669a0cd 100644 --- a/GIT_SUBMODULE.md +++ b/GIT_SUBMODULE.md @@ -11,6 +11,8 @@ git submodule update Or, you can do it in one step: git clone --recurse-submodules +https://git2.tavasi.ir/front/base_ui.git + Updating Submodules To update a submodule to the latest commit on its branch: git submodule update --remote From c54776215d13db30f2af51eea3d41716a6e93320 Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Mon, 28 Apr 2025 08:37:15 +0330 Subject: [PATCH 04/17] . --- GIT_SUBMODULE.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/GIT_SUBMODULE.md b/GIT_SUBMODULE.md index 669a0cd..edf1db5 100644 --- a/GIT_SUBMODULE.md +++ b/GIT_SUBMODULE.md @@ -3,15 +3,14 @@ git submodule add https://git2.tavasi.ir/front/chat_ui.git systems/chat_ui -f Cloning a Repository with Submodules If you clone a repository that contains submodules, you'll need to initialize and update the submodules: -git clone -cd +git clone repository-url +cd repository-directory git submodule init git submodule update Or, you can do it in one step: -git clone --recurse-submodules +git clone --recurse-submodules https://git2.tavasi.ir/front/base_ui.git -https://git2.tavasi.ir/front/base_ui.git Updating Submodules To update a submodule to the latest commit on its branch: From 5c66bd084e7c0b7b3d965c1a51a3b70dd596be29 Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Mon, 28 Apr 2025 11:10:34 +0330 Subject: [PATCH 05/17] . --- systems/task_ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systems/task_ui b/systems/task_ui index ad47094..03122c1 160000 --- a/systems/task_ui +++ b/systems/task_ui @@ -1 +1 @@ -Subproject commit ad470940f4cf986638b575d4b8afaa2ec50c267c +Subproject commit 03122c1c6270667382c4e21d6798530c542e680a From 98a2940b81b50014bddcb304669ff833ab6b1c75 Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Mon, 28 Apr 2025 13:21:24 +0330 Subject: [PATCH 06/17] . --- plugins/persianNumber.js | 380 +++++++++++++++++++++++++++++++++++++++ systems/task_ui | 2 +- 2 files changed, 381 insertions(+), 1 deletion(-) create mode 100644 plugins/persianNumber.js diff --git a/plugins/persianNumber.js b/plugins/persianNumber.js new file mode 100644 index 0000000..84a4794 --- /dev/null +++ b/plugins/persianNumber.js @@ -0,0 +1,380 @@ +const oneDigit = [ + "صفر", + "یک", + "دو", + "سه", + "چهار", + "پنج", + "شش", + "هفت", + "هشت", + "نه", +]; +const twoDigits = { + 10: "ده", + 11: "یازده", + 12: "دوازده", + 13: "سیزده", + 14: "چهارده", + 15: "پانزده", + 16: "شانزده", + 17: "هفده", + 18: "هجده", + 19: "نوزده", + 20: "بیست", + 30: "سی", + 40: "چهل", + 50: "پنجاه", + 60: "شصت", + 70: "هفتاد", + 80: "هشتاد", + 90: "نود", +}; +const threeDigits = { + 100: "صد", + 200: "دویست", + 300: "سیصد", + 400: "چهارصد", + 500: "پانصد", + 600: "شش صد", + 700: "هفت صد", + 800: "هشت صد", + 900: "نه صد", +}; + +const types = ["تلیارد", "میلیارد", "میلیون", "هزار", ""]; +const decimalTypes = ["دهم", "صدم", "هزارم", "ده هزارم"]; +let numbers = []; +let decimals = []; + +//Convert Number To Words +const convert = (number) => { + let negative = ""; + let decNumber = ""; + let decimal = ""; + let percent = ""; + + if (isPercent(number)) { + number = number.replace("%", ""); + percent = " درصد"; + } + + number = getString(number); + if (number == "") return ""; + sliceNumber(number); + if (isNegative(number)) negative = "منفی "; + number = number.replace("-", ""); + + if (isDecimal(number)) { + let index = number.indexOf("."); + let decNumberStr = ""; + + decNumber = number.substr(index + 1, number.length); + number = number.substr(0, index); + decNumberStr = parseInt(decNumber).toString(); + + if (decNumberStr.length === 1 && decNumberStr != "0") { + decimal += oneDigit[decNumberStr] + " "; + decimal += decimalTypes[decNumber.length - 1]; + } else { + decimal = calculateDigits(decimals); + decimal += " " + decimalTypes[decNumber.length - 1]; + } + } + + if (number.length === 1) { + if (!decimal) { + return negative + oneDigit[number] + percent; + } + + if (number == "0") { + return negative + decimal + percent; + } + + return negative + oneDigit[number] + " ممیز " + decimal + percent; + } + + if (!decimal) { + return negative + calculateDigits(numbers) + percent; + } + + return negative + calculateDigits(numbers) + " ممیز " + decimal + percent; +}; + +//split number 3 by 3 with a separator (123456789.3025=>123,456,789.3,025) Do Not Give It Persian Numbers +const sliceNumber = (number, separator = ",") => { + let percent = ""; + let neg = ""; + let dNum = ""; + let n = ""; + let d = ""; + + if (isPercent(number)) { + number = number.replace("%", ""); + percent = "%"; + } + + number = getString(number); + + if (number == "") return ""; + if (isNegative(number)) neg = "-"; + + number = number.replace("-", ""); + + if (isDecimal(number)) { + let index = number.indexOf("."); + dNum = number.substr(index + 1, number.length); + number = number.substr(0, index); + } + + n = putSeparator(number, separator); + numbers = n.split(separator); + + if (!dNum) return neg + n + percent; + + d = putSeparator(dNum, separator); + decimals = d.split(separator); + + return neg + n + "." + d + percent; +}; + +//Puts a separator between the chunks of the given numString. +const putSeparator = (numString, separator = ",") => { + if (typeof numString !== "string") return ""; + if (numString.length < 4) return numString; + + let result = ""; + for (let i = numString.length - 1, counter = 0; i >= 0; i--) { + if (counter == 3) { + result += separator; + counter = 0; + } + result += numString[i]; + counter++; + } + + result = result.split("").reverse().join(""); + return result; +}; + +//Processing on Digits of A Number +const calculateDigits = (arrNum) => { + let result = ""; + for (let i = 0; i < arrNum.length; i++) { + let parsedNum = parseInt(arrNum[i]); + let number = parsedNum; + let sadgan = Math.floor(number / 100) * 100; + number = number % 100; + let dahgan = Math.floor(number / 10) * 10; + let yekan = number % 10; + result += i !== 0 && parsedNum ? " و " : ""; + + result += + getPersian(sadgan, dahgan, yekan, i, arrNum) + " " + getType(i, arrNum); + } + + return result.trim(); +}; + +//Main Process That Turn a Number Into a String(122=>100+20+2) +const getPersian = (sadgan, dahgan, yekan, index, numbers) => { + let flag = false; + let result = ""; + let dahganPlusYekan = dahgan + yekan; + + if (threeDigits[sadgan]) { + result += + yekan > 0 || dahgan > 0 + ? threeDigits[sadgan] + " و " + : threeDigits[sadgan]; + } + + if (twoDigits[dahganPlusYekan]) { + result += twoDigits[dahganPlusYekan] + " "; + return result; + } + + if (twoDigits[dahgan]) { + result += twoDigits[dahgan] + " و "; + } + + if ( + numbers.length === 2 && + index === 0 && + yekan === 1 && + dahgan === 0 && + sadgan === 0 + ) { + return result; + } + + if ( + numbers.length > 2 && + index === numbers.length - 2 && + yekan === 1 && + dahgan === 0 && + sadgan === 0 + ) { + return result; + } + + if (yekan > 0) result += oneDigit[yekan] + " "; + + return result; +}; + +//getting The Type Of Each Number (Billion, Million,...) +const getType = (i, numbers) => { + let parsedNum = parseInt(numbers[i]); + if (isNaN(parsedNum)) return ""; + if (!parsedNum) return ""; + let length = numbers.length - i; + let index = types.length - length; + return types[index]; +}; + +//Calculate if number:String is Negative Or Not +const isNegative = (number) => { + number = getString(number); + if (!number) return false; + if (number[0] != "-") return false; + number = number.replace("-", ""); + return number != "0"; +}; + +//Calculate if number:String has '%' as Percent +const isPercent = (string) => { + if (typeof string !== "string") return false; + let index = string.indexOf("%"); + let lIndex = string.lastIndexOf("%"); + if (index != lIndex) return false; + return index > 0; +}; + +//is number:String:Number is a Valid Number? if type is Number turn it to String And Return it +const getString = (number) => { + if (number === undefined) return ""; + if (number === null) return ""; + if (isNaN(number)) return ""; + if (typeof number === "number") return number.toString(); + return number.trim(); +}; + +//Calculate if number:String has Decimal Point Or Not +const isDecimal = (number) => { + number = getString(number); + if (number == "") return false; + let index = number.indexOf("."); + let lIndex = number.lastIndexOf("."); + if (index != lIndex) return false; + return index > 0; +}; +//Convert English Numbers To Persian Numbers +const convertEnToPe = (number) => { + if (number == null || number == undefined) return ""; + if (typeof number == "number") number = number.toString(); + let res = ""; + for (let i = 0; i < number.length; i++) { + switch (number[i]) { + case "\u0030": + res += "\u06F0"; + break; + case "\u0031": + res += "\u06F1"; + break; + case "\u0032": + res += "\u06F2"; + break; + case "\u0033": + res += "\u06F3"; + break; + case "\u0034": + res += "\u06F4"; + break; + case "\u0035": + res += "\u06F5"; + break; + case "\u0036": + res += "\u06F6"; + break; + case "\u0037": + res += "\u06F7"; + break; + case "\u0038": + res += "\u06F8"; + break; + case "\u0039": + res += "\u06F9"; + break; + default: + res += number[i]; + } + } + return res; +}; +//Convert Persian Numbers To English Numbers +const convertPeToEn = (number) => { + if (number == null || number == undefined) return ""; + let res = ""; + for (let i = 0; i < number.length; i++) { + switch (number[i]) { + case "\u06F0": + res += "\u0030"; + break; + case "\u06F1": + res += "\u0031"; + break; + case "\u06F2": + res += "\u0032"; + break; + case "\u06F3": + res += "\u0033"; + break; + case "\u06F4": + res += "\u0034"; + break; + case "\u06F5": + res += "\u0035"; + break; + case "\u06F6": + res += "\u0036"; + break; + case "\u06F7": + res += "\u0037"; + break; + case "\u06F8": + res += "\u0038"; + break; + case "\u06F9": + res += "\u0039"; + break; + default: + res += number[i]; + } + } + return res; +}; + +const e2p = (s) => s.replace(/\d/g, (d) => "۰۱۲۳۴۵۶۷۸۹"[d]); +const e2a = (s) => s.replace(/\d/g, (d) => "٠١٢٣٤٥٦٧٨٩"[d]); + +const p2e = (s) => s.replace(/[۰-۹]/g, (d) => "۰۱۲۳۴۵۶۷۸۹".indexOf(d)); +const a2e = (s) => s.replace(/[٠-٩]/g, (d) => "٠١٢٣٤٥٦٧٨٩".indexOf(d)); + +const p2a = (s) => + s.replace(/[۰-۹]/g, (d) => "٠١٢٣٤٥٦٧٨٩"["۰۱۲۳۴۵۶۷۸۹".indexOf(d)]); +const a2p = (s) => + s.replace(/[٠-٩]/g, (d) => "۰۱۲۳۴۵۶۷۸۹"["٠١٢٣٤٥٦٧٨٩".indexOf(d)]); + +export { + convert, + sliceNumber, + convertEnToPe, + convertPeToEn, + e2p, + e2a, + p2e, + a2e, + p2a, + a2p, +}; diff --git a/systems/task_ui b/systems/task_ui index 03122c1..fd3221e 160000 --- a/systems/task_ui +++ b/systems/task_ui @@ -1 +1 @@ -Subproject commit 03122c1c6270667382c4e21d6798530c542e680a +Subproject commit fd3221ea12a68031a9ed39d82d083ee0d6b3d352 From f1970d3e6e147db137a06ef0e74de2f7e3865928 Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Thu, 1 May 2025 08:26:15 +0330 Subject: [PATCH 07/17] . --- systems/task_ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systems/task_ui b/systems/task_ui index fd3221e..1c9ea2e 160000 --- a/systems/task_ui +++ b/systems/task_ui @@ -1 +1 @@ -Subproject commit fd3221ea12a68031a9ed39d82d083ee0d6b3d352 +Subproject commit 1c9ea2ed118119f63d0763bff4ae79ca5f914c31 From d42c64d7bcf8013c28255d6606b4811526d1d7ed Mon Sep 17 00:00:00 2001 From: Mehdi104797 <92753457+Mehdi104797@users.noreply.github.com> Date: Thu, 1 May 2025 13:24:01 +0330 Subject: [PATCH 08/17] =?UTF-8?q?.=D8=AA=D8=BA=DB=8C=DB=8C=D8=B1=D8=A7?= =?UTF-8?q?=D8=AA=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- systems/task_ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systems/task_ui b/systems/task_ui index 1c9ea2e..cc55ac6 160000 --- a/systems/task_ui +++ b/systems/task_ui @@ -1 +1 @@ -Subproject commit 1c9ea2ed118119f63d0763bff4ae79ca5f914c31 +Subproject commit cc55ac6684ad57c6d801d897e7f2328d9a64fea2 From 6086ec8aad49de1f4c6120e0f867a3d519f27ac3 Mon Sep 17 00:00:00 2001 From: Baghi Date: Sat, 3 May 2025 17:47:38 +0330 Subject: [PATCH 09/17] router --- components/other/MyCounterListItem.vue | 37 +++++++++++++------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/components/other/MyCounterListItem.vue b/components/other/MyCounterListItem.vue index 5f8f81b..c2d6f4c 100644 --- a/components/other/MyCounterListItem.vue +++ b/components/other/MyCounterListItem.vue @@ -15,6 +15,7 @@