Compare commits
19 Commits
main
...
shadi/deve
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e522e40e56 | ||
![]() |
1212ac9380 | ||
![]() |
c7adf4183e | ||
![]() |
196be7113c | ||
ad028b7f4b | |||
![]() |
309f1f155f | ||
![]() |
fdae7448e1 | ||
341c333a18 | |||
6a525c0c71 | |||
a8c2b42240 | |||
6086ec8aad | |||
![]() |
d42c64d7bc | ||
![]() |
f1970d3e6e | ||
![]() |
98a2940b81 | ||
![]() |
5c66bd084e | ||
![]() |
c54776215d | ||
![]() |
7aa389afa4 | ||
![]() |
c460543f5d | ||
![]() |
78b4d2464e |
1
.env
1
.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
|
||||
|
|
|
@ -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 = قانون - حاشیه نویسی
|
||||
|
||||
|
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -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
|
||||
|
|
|
@ -3,13 +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 <repository-url>
|
||||
cd <repository-directory>
|
||||
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 <repository-url>
|
||||
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:
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
props: ["counter"],
|
||||
data() {
|
||||
|
@ -55,27 +56,27 @@ export default {
|
|||
}, refreshInterval);
|
||||
},
|
||||
|
||||
// goToRouteName() {
|
||||
// this.$router.push({
|
||||
// name: "searchResult",
|
||||
// query: {
|
||||
// q: undefined,
|
||||
// key: this.counter.routeName,
|
||||
// },
|
||||
// });
|
||||
// },
|
||||
goToRouteName() {
|
||||
this.$router.push({
|
||||
name: "search",
|
||||
query: {
|
||||
q: undefined,
|
||||
key: this.counter.routeName,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
urlResolver() {
|
||||
console.log("555");
|
||||
|
||||
// const routeData = this.$router.resolve({
|
||||
// name: "searchResult",
|
||||
// query: {
|
||||
// q: undefined,
|
||||
// key: this.counter.routeName,
|
||||
// },
|
||||
// });
|
||||
// return routeData.href;
|
||||
|
||||
const routeData = this.$router.resolve({
|
||||
name: "search",
|
||||
query: {
|
||||
q: undefined,
|
||||
key: this.counter.routeName,
|
||||
},
|
||||
});
|
||||
return routeData.href;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -175,6 +176,7 @@ export default defineNuxtConfig({
|
|||
"@research": "~/systems/research_ui",
|
||||
"@haditha": "~/systems/hadith_ui",
|
||||
"@chat": "~/systems/chat_ui",
|
||||
"@task": "~/systems/task_ui",
|
||||
},
|
||||
vite: {
|
||||
assetsInclude: ["**/*.svg"],
|
||||
|
|
380
plugins/persianNumber.js
Normal file
380
plugins/persianNumber.js
Normal file
|
@ -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,
|
||||
};
|
53
routes/task.ts
Normal file
53
routes/task.ts
Normal file
|
@ -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: "گزارش وظایف",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
|
@ -1 +1 @@
|
|||
Subproject commit 5b38341d08c1e9229a067443e30c12dbc7b7f700
|
||||
Subproject commit ce54af871a476562e3c1af352ddc2b1f6387d14b
|
|
@ -1 +1 @@
|
|||
Subproject commit dc2d5cc460d983ddcb1b302f238070a79d818135
|
||||
Subproject commit 4e676bb758c7c3294043164f9f8ada94eb4efc1c
|
1
systems/task_ui
Submodule
1
systems/task_ui
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit cc55ac6684ad57c6d801d897e7f2328d9a64fea2
|
Loading…
Reference in New Issue
Block a user