Merge branch 'rezae/feat/refactor-imports' of https://git2.tavasi.ir/front/base_ui into rezae/feat/haditha

This commit is contained in:
mustafa-rezae 2025-05-18 17:09:20 +03:30
commit 08843804bd
26 changed files with 74 additions and 1255 deletions

View File

@ -67,7 +67,13 @@
<script>
import { mapActions, mapState } from "pinia";
import { useResearchStore } from "~/stores/researchStore";
import { useAuthStore } from "@stores/authStore";
import { useCommonStore } from "@stores/commonStore";
import { useEntityStore } from "@entity/entityStore";
import { useSearchStore } from "@search/stores/searchStore";
import { useResearchStore } from "@research/stores/researchStore";
export default {
mounted() {
@ -102,13 +108,18 @@ export default {
},
methods: {
...mapActions("common", ["systemsSetter", "activeSystemSetter"]),
...mapActions(useCommonStore, [
"systemsSetter",
"activeSystemSetter",
"searchActiveTabSetter",
]),
...mapActions("aiTools", [
"aiToolsActiveActionSetter",
"aiToolsSchemaSetter",
"aiToolsActiveDomainSetter",
]),
...mapActions("entity", [
...mapActions(useEntityStore, [
"activeTabSetter",
"entityViewSchemaSetter",
"activeEntityViewSchemaSetter",
@ -119,10 +130,9 @@ export default {
"domainActiveSetter",
"selectionFilterItemsSetter",
]),
...mapActions("search", [
...mapActions(useSearchStore, [
"domainActiveSetter", //3
"activeTabSetter", //2
"searchActiveTabSetter",
"searchSchemaSetter",
"helpSchemaSetter",
"helpActiveSchemaSetter",
@ -134,8 +144,8 @@ export default {
]),
reloadPage() {
let appVersion = useStorage("app-version", '0.0.0');
appVersion.vlaue = this.envVersion;
let appVersion = useStorage("app-version", "0.0.0");
appVersion.vlaue = this.envVersion;
this.clearStorage();
// this.clearCookies();

View File

@ -1,58 +1,18 @@
// composables/useInfiniteScroll.ts
import { ref, onMounted, onBeforeUnmount } from "vue";
export default function useInfiniteScroll(
callback: () => Promise<void>,
elementId?: string
callback: () => void,
elementId: string
) {
const route = useRoute();
const isFetching = ref(false);
const infiniteScroll = ref<HTMLElement | Window | null>(null);
const infiniteScroll = ref<HTMLElement | null>(null);
// Throttle function to limit scroll event frequency
const throttle = (func: (...args: any[]) => void, limit: number) => {
let lastFunc: ReturnType<typeof setTimeout>;
let lastRan: number;
return function (this: any, ...args: any[]) {
const context = this;
if (!lastRan) {
func.apply(context, args);
lastRan = Date.now();
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(() => {
if (Date.now() - lastRan >= limit) {
func.apply(context, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
};
};
const handleScroll = () => {
if (isFetching.value) return;
const scrollPosition =
infiniteScroll.value.scrollTop + infiniteScroll.value.clientHeight;
const threshold = infiniteScroll.value.scrollHeight - 100;
const checkScrollPosition = () => {
if (isFetching.value || !infiniteScroll.value) return;
let scrollPosition: number;
let threshold: number;
let clientHeight: number;
let scrollHeight: number;
if (infiniteScroll.value === window) {
scrollPosition = window.scrollY || window.pageYOffset;
clientHeight = document.documentElement.clientHeight;
scrollHeight = document.documentElement.scrollHeight;
} else {
const el = infiniteScroll.value as HTMLElement;
scrollPosition = el.scrollTop;
clientHeight = el.clientHeight;
scrollHeight = el.scrollHeight;
}
threshold = scrollHeight - 100;
const currentPosition = scrollPosition + clientHeight;
if (currentPosition >= threshold) {
if (scrollPosition >= threshold) {
isFetching.value = true;
callback().finally(() => {
isFetching.value = false;
@ -60,57 +20,28 @@ export default function useInfiniteScroll(
}
};
// Throttled version of scroll handler
const throttledScrollHandler = throttle(checkScrollPosition, 200);
const handleTouchEnd = () => {
setTimeout(throttledScrollHandler, 100);
// Add a slight delay to ensure scroll position is updated
setTimeout(handleScroll, 100);
};
onMounted(() => {
console.info(route.name)
if (route.name == "hadithaSearch" || route.name == "hadithaLibrary") {
const targetElement = elementId
? document.getElementById(elementId)
: window;
const targetElement = document.getElementById(elementId);
infiniteScroll.value = targetElement;
if (!targetElement) {
console.warn(
`Element ${elementId || "window"} not found for infinite scroll`
);
return;
}
infiniteScroll.value = targetElement;
if (targetElement === window) {
window.addEventListener("scroll", throttledScrollHandler);
window.addEventListener("touchend", handleTouchEnd);
} else {
targetElement.addEventListener("scroll", throttledScrollHandler);
targetElement.addEventListener("touchend", handleTouchEnd);
}
if (targetElement) {
targetElement.addEventListener("scroll", handleScroll);
targetElement.addEventListener("touchend", handleTouchEnd);
}
});
onBeforeUnmount(() => {
if (route.name == "hadithaSearch" || route.name == "hadithaLibrary") {
if (!infiniteScroll.value) return;
const targetElement = document.getElementById(elementId);
infiniteScroll.value = targetElement;
if (infiniteScroll.value === window) {
window.removeEventListener("scroll", throttledScrollHandler);
window.removeEventListener("touchend", handleTouchEnd);
} else {
(infiniteScroll.value as HTMLElement).removeEventListener(
"scroll",
throttledScrollHandler
);
(infiniteScroll.value as HTMLElement).removeEventListener(
"touchend",
handleTouchEnd
);
}
if (targetElement) {
targetElement.removeEventListener("scroll", handleScroll);
targetElement.removeEventListener("touchend", handleTouchEnd);
}
});

View File

@ -3,6 +3,9 @@ import fs from "fs-extra";
import path from "path";
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 = "";
@ -24,7 +27,7 @@ export default defineNuxtConfig({
__dirname,
`systems/${buildName}_ui/assets/${buildName}/images`
); // Source folder (e.g., assets/images)
const targetDir = path.resolve(__dirname, `public/img/${buildName}`); // Target folder (e.g., public/images)
const targetDir = path.resolve(__dirname, `public/img/${buildName}`); // Target folder (e.g., public/img)
// Ensure the target directory exists
fs.ensureDirSync(targetDir);
@ -39,6 +42,7 @@ export default defineNuxtConfig({
"pages:extend"(pages) {
// Add custom routes
pages.push(...haditha);
// pages.push(...search, ...research, ...haditha, ...chat, ...task);
},
},
@ -128,7 +132,7 @@ export default defineNuxtConfig({
storesDirs: ["./stores/**"],
},
plugins: [
{ src: "~/plugins/api.ts", mode: "client" },
// { src: "~/plugins/api.ts", mode: "client" },
// { src: "~/plugins/vuelidate.ts", mode: "client" },
// { src: "~/plugins/bootstrap.client.ts", mode: "client" },
// { src: "~/plugins/vueJalaliMoment.ts", mode: "client" },
@ -163,10 +167,13 @@ export default defineNuxtConfig({
"@utils": "~/utils",
"@manuals": "~/manuals",
"@pages": "~/pages",
// "@chat": "~/systems/chat_ui",
// "@search": "~/systems/search_ui",
// "@research": "~/systems/research_ui",
"@haditha": "~/systems/haditha_ui",
// "@chat": "~/systems/chat_ui",
// "@task": "~/systems/task_ui",
},
vite: {
assetsInclude: ["**/*.svg"],

View File

@ -131,7 +131,7 @@ export default {
};
},
computed: {
...mapState(useSearchStore, ["searchSchemaGetter"]),
...mapState(useCommonStore, ["searchSchemaGetter"]),
},
methods: {
...mapActions(["checkPermissions"]),

View File

@ -1,49 +0,0 @@
export default defineNuxtPlugin((nuxtApp) => {
const config = useRuntimeConfig();
const id_token = useCookie("id_token");
const token = id_token.value ?? "GuestAccess";
const baseUrl =
config.public.NUXT_PUBLIC_BASE_URL + config.public.NUXT_PUBLIC_API_NAME;
const api = $fetch.create({
// baseURL: baseUrl,
onRequest({ request, options, error }) {
options.baseURL = baseUrl + options.baseURL;
// options.baseURL = options.baseURL;
if (token) {
const headers = (options.headers ||= {});
if (Array.isArray(headers)) {
headers.push(["Authorization", token]);
} else if (headers instanceof Headers) {
headers.set("Authorization", token);
} else {
headers.Authorization = token;
}
}
},
async onResponseError({ response }) {
if (response.status === 401) {
await nuxtApp.runWithContext(() => navigateTo("/login"));
}
},
onRequestError({ request, options, error }) {
// Handle the request errors
},
onResponse({ request, response, options }) {
// Process the response data
// localStorage.setItem('token', response._data.token)
},
});
// Expose to useNuxtApp().$api
return {
provide: {
api,
},
};
});

View File

@ -1,5 +0,0 @@
import bootstrap from "bootstrap/dist/js/bootstrap.bundle";
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.provide("bs", bootstrap);
});

View File

@ -1,74 +0,0 @@
import { useCommonStore } from "~/stores/commonStore";
import { useAuthStore } from "~/stores/authStore";
// plugins/my-directive.ts
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.directive("can", {
// called before bound element's attributes
// or event listeners are applied
created(el, binding, vnode) {
// see below for details on arguments
if (vnode.elm && !isSuperAdmin()) {
if (binding.value != "" && !hasPermission(binding.value)) {
if (binding.modifiers.checkbox || binding.modifiers.radio) {
vnode.elm.classList.add("disabled");
vnode.elm.disabled = true;
} else {
vnode.elm.remove();
}
}
}
},
// called right before the element is inserted into the DOM.
beforeMount(el, binding, vnode) {},
// called when the bound element's parent component
// and all its children are mounted.
mounted(el, binding, vnode) {},
// called before the parent component is updated
beforeUpdate(el, binding, vnode, prevVnode) {},
// called after the parent component and
// all of its children have updated
updated(el, binding, vnode, prevVnode) {
if (vnode.elm && !isSuperAdmin()) {
if (binding.value != "" && !hasPermission(binding.value)) {
if (binding.modifiers.checkbox || binding.modifiers.radio) {
vnode.elm.classList.add("disabled");
vnode.elm.disabled = true;
} else {
vnode.elm.remove();
}
}
}
},
// called before the parent component is unmounted
beforeUnmount(el, binding, vnode) {},
// called when the parent component is unmounted
unmounted(el, binding, vnode) {},
getSSRProps(binding, vnode) {
// You can provide SSR-specific props here
return {};
},
});
});
function hasPermission(permission) {
const CommonStore = useCommonStore();
if (CommonStore.userPermisionGetter && CommonStore.userPermisionGetter.length)
return CommonStore.userPermisionGetter.includes(permission);
// if (CommonStore.getters.userPermisionGetter.includes(binding.value)) {
// vnode.elm.style.display = 'none!important';
// vnode.elm.classList.add('disabled');
// vnode.elm.disabled = true;
// vnode.elm.title = 'عدم دسترسی';
}
function isSuperAdmin() {
const CommonStore = useAuthStore();
// user with id = 2 is super admin
return CommonStore?.currentUser?.user_level > 1;
}

View File

@ -1,38 +0,0 @@
// plugins/my-directive.ts
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.directive("focus", {
// called before bound element's attributes
// or event listeners are applied
created(el, binding, vnode) {
// see below for details on arguments
el.focus();
},
// called right before the element is inserted into the DOM.
beforeMount(el, binding, vnode) {},
// called when the bound element's parent component
// and all its children are mounted.
mounted(el, binding, vnode) {},
// called before the parent component is updated
beforeUpdate(el, binding, vnode, prevVnode) {},
// called after the parent component and
// all of its children have updated
updated(el, binding, vnode, prevVnode) {
var value = binding.value;
if (value) {
// Vue.nextTick(function() {
el.focus();
// });
}
},
// called before the parent component is unmounted
beforeUnmount(el, binding, vnode) {},
// called when the parent component is unmounted
unmounted(el, binding, vnode) {},
getSSRProps(binding, vnode) {
// You can provide SSR-specific props here
return {};
},
});
});

View File

@ -1,5 +0,0 @@
export default defineNuxtPlugin(() => {
// Your initialization code here
console.log("My plugin is initialized");
});

View File

@ -1,384 +0,0 @@
export default defineNuxtPlugin(() => {
console.info("persina number plugin");
});
// 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,
// };

View File

@ -1,5 +0,0 @@
import Swal from 'sweetalert2'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.provide('swal', Swal)
})

View File

@ -1,5 +0,0 @@
import VueJstree from "vue-jstree";
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(VueJstree);
});

View File

@ -1,33 +0,0 @@
import { defineNuxtPlugin } from '#app';
import Swal from 'sweetalert2';
import 'sweetalert2/dist/sweetalert2.min.css';
export default defineNuxtPlugin(nuxtApp => {
const mySwalToast = (options:any) => {
return Swal.fire({
toast: true,
position: 'bottom-end',
showConfirmButton: false,
timerProgressBar: true,
timer: 5000,
icon: 'success',
...options,
});
};
const mySwalConfirm = (options:any) => {
return Swal.fire({
title: 'هشدار',
text: 'آیا مطمئن هستید؟',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'تایید',
cancelButtonText: 'انصراف',
...options,
});
};
// به جای استفاده از `provide()`
nuxtApp.$mySwalToast = mySwalToast;
nuxtApp.$mySwalConfirm = mySwalConfirm;
});

View File

@ -1,7 +0,0 @@
import { defineNuxtPlugin } from '#app'
import { QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('QuillEditor', QuillEditor)
})

View File

@ -1,6 +0,0 @@
import { defineNuxtPlugin } from "#app";
import PersianDatepicker from "vue3-persian-datetime-picker";
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(PersianDatepicker);
});

View File

@ -1,6 +0,0 @@
import { defineNuxtPlugin } from '#app'
import TreeVue from 'vue3-tree-vue'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(TreeVue)
})

View File

@ -1,5 +0,0 @@
import { VueDraggableNext } from 'vue-draggable-next';
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('draggable', VueDraggableNext);
});

View File

@ -1,25 +0,0 @@
// import { VueJalaliMoment } from "vue-jalali-moment";
// export default defineNuxtPlugin((nuxtApp) => {
// // nuxtApp.vueApp.use(VueJalaliMoment);
// nuxtApp.vueApp.use(VueJalaliMoment, {
// // Global configuration options
// // locale: 'fa',
// // format: 'jYYYY/jMM/jDD',
// });
// });
import moment from 'jalali-moment';
export default defineNuxtPlugin((nuxtApp) => {
moment.locale('fa'); // Set the locale to 'fa' for Jalali calendar
return {
provide: {
$jalaliMoment: moment,
},
};
// Global Access
// nuxtApp.vueApp.config.globalProperties.$jalaliMoment = moment;
});

View File

@ -1,8 +0,0 @@
import VuePlyr from "vue-plyr";
import "vue-plyr/dist/vue-plyr.css";
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(VuePlyr, {
plyr: {}
})
});

View File

@ -1,31 +0,0 @@
// import { createApp } from "vue";
// import Vuelidate from "@vuelidate/core";
// createApp.use(Vuelidate);
import { useVuelidate } from '@vuelidate/core'
// import { required, minLength } from '@vuelidate/validators'
// export default defineNuxtPlugin((nuxtApp) => {
// nuxtApp.vueApp.use((useVuelidate) => {
// // // Example of global setup, but typically you'd handle this in the component
// // const state = reactive({
// // firstName: ''
// // })
// // const rules = {
// // firstName: {
// // required,
// // minLength: minLength(2)
// // }
// // }
// // const v$ = useVuelidate(rules, state)
// // return v$;
// // // Return the v$ instance or any other necessary setup
// })
// })
export default defineNuxtPlugin(nuxtApp => {
nuxtApp.provide('vuelidate', useVuelidate)
})

View File

@ -1,53 +0,0 @@
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: "گزارش وظایف",
},
},
],
},
];

View File

@ -1,146 +0,0 @@
// import Vue from "vue";
// import axios from "axios";
// // import 'sweetalert2/dist/sweetalert2.min.css';
// import "assets/common/css/sweetalert2.min.css";
// const tfooter = '<a href="">در ارتباط با سرور مشکلی ایجاد شد</a>';
// const ApiService = {
// init(baseURL) {
// axios.defaults.baseURL = baseURL;
// this.setHeader();
// },
// removeHeader() {
// axios.defaults.headers.common = {};
// },
// setHeader() {
// axios.defaults.headers.common["Authorization"] = getToken();
// // axios.defaults.headers.common["lang"] = "fa";
// },
// get(
// vue,
// url,
// callBack = null,
// errorBk = null,
// hasToast = false,
// ttitle = "دریافت اطلاعات",
// tbody = "انجام شد."
// ) {
// //axios.defaults.headers.common["lang"] = window.localStorage.getItem("lang");
// return axios
// .get(url)
// .then((response) => {
// if (hasToast && response) {
// Vue.swal({
// title: ttitle,
// text: tbody,
// icon: "success",
// position: "bottom-end",
// showConfirmButton: false,
// toast: true,
// timer: 2000,
// });
// }
// if (callBack) callBack(response);
// })
// .catch((response) => {
// // if (response.response.status == 401 && vue != null) {
// // vue.$store.dispatch(LOGOUT);
// // vue.$router.push({
// // name: "login"
// // });
// // }
// // Swal.fire({
// // title: ttitle,
// // text: response.response.message,
// // icon: "error",
// // position: "bottom-end",
// // footer: tfooter,
// // showConfirmButton: false,
// // toast: true,
// // timer: 2500
// // });
// if (errorBk) errorBk(response);
// });
// },
// post(
// vue,
// url,
// datas,
// callBack = null,
// errorBk = null,
// hasToast = false,
// ttitle = "ثبت اطلاعات",
// tbody = "انجام شد."
// ) {
// var data = new FormData();
// for (const [key, value] of Object.entries(datas)) data.append(key, value);
// return axios
// .post(url, data)
// .then((response) => {
// if (hasToast && response) {
// Vue.swal({
// title: ttitle,
// text: tbody,
// icon: "success",
// position: "bottom-end",
// showConfirmButton: false,
// toast: true,
// timer: 2000,
// });
// }
// if (callBack) callBack(response);
// })
// .catch((response) => {
// // if (response.response.status == 401 && vue != null) {
// // vue.$store.dispatch(LOGOUT);
// // vue.$router.push({
// // name: "login"
// // });
// // }
// // Swal.fire({
// // title: ttitle,
// // text: response.response.data.message,
// // icon: "error",
// // position: "bottom-end",
// // footer: tfooter,
// // showConfirmButton: false,
// // toast: true,
// // timer: 2500
// // });
// if (errorBk) errorBk(response);
// });
// },
// getRequest(url, options = {}) {
// return axios.get(url, options);
// },
// postRequest(url, data = [], options = {}) {
// return axios.post(url, data, options);
// },
// formData(url, data = []) {
// const formData = new FormData();
// for (const [key, value] of Object.entries(data)) {
// if (value !== undefined && value !== null) formData.append(key, value);
// }
// return axios.post(url, formData);
// },
// externalPostRequest(url, data = [], config = {}) {
// const formData = new FormData();
// for (const [key, value] of Object.entries(data))
// formData.append(key, value);
// return axios.post(url, formData, config);
// },
// put(url, data) {
// return axios.put(url, data);
// },
// delete(url, guid) {
// return axios.delete(url, { guid });
// },
// customRequest(data) {
// return axios(data);
// },
// };
// export default ApiService;

View File

View File

@ -1,57 +0,0 @@
// // file-upload.service.js
// // import * as axios from 'axios';
// // const BASE_URL = 'http://localhost:3001';
// // function upload(formData) {
// // const url = `${BASE_URL}/photos/upload`;
// // return axios.post(url, formData)
// // // get data
// // .then(x => x.data)
// // // add url field
// // .then(x => x.map(img => Object.assign({},
// // img, { url: `${BASE_URL}/images/${img.id}` })));
// // }
// // file-upload.fake.service.js
// function upload(formData) {
// const photos = formData.getAll('photos');
// const promises = photos.map((x) => getImage(x)
// .then(img => ({
// id: img,
// originalName: x.name,
// fileName: x.name,
// url: img
// })));
// return Promise.all(promises);
// }
// function getImage(file) {
// return new Promise((resolve, reject) => {
// const fReader = new FileReader();
// const img = new Image();
// fReader.onload = (e) => {
// img.src = fReader.result;
// resolve(getBase64Image(img));
// }
// fReader.readAsDataURL(file);
// })
// }
// function getBase64Image(img) {
// const canvas = document.createElement('canvas');
// canvas.width = img.width;
// canvas.height = img.height;
// const ctx = canvas.getContext('2d');
// ctx.drawImage(img, 0, 0);
// const dataURL = canvas.toDataURL('image/png');
// return dataURL;
// }
// export { upload }

View File

@ -1,204 +0,0 @@
// // import axios from "axios";
// //import os from "os";
// import { v4 as uuidv4 } from 'uuid';
// // import 'sweetalert2/dist/sweetalert2.min.css';
// // import 'assets/common/css/sweetalert2.min.css';
// var httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
// //var local_ip = "";
// var local_city = "";
// var local_country = "";
// var local_gps = "";
// var os_name = "";
// var browser = "";
// var time_new_search = null;
// var id_current_search = "";
// var id_session_search = "";
// var last_query_string = "";
// // const axiosLog = axios.create({
// // baseURL: import.meta.env.VITE_API_SEARCH,
// // })
// // function getNetworkIp() {
// // const url = 'https://api.ipify.org/?format=json';
// // var results= [];
// // axios.get(url).then(response => {
// // results = response.data
// // local_ip = results.ip;
// // // axios.get('http://freegeoip.net/json/'+local_ip).then(response=>{
// // // var res = response.data
// // // local_city = res.city;
// // // local_country = res.country;
// // // local_gps = res.loc;
// // // });
// // })
// // }
// function fnBrowserDetect(){
// let userAgent = navigator.userAgent;
// let browserName;
// if(userAgent.match(/chrome|chromium|crios/i)){
// browserName = "chrome";
// }else if(userAgent.match(/firefox|fxios/i)){
// browserName = "firefox";
// } else if(userAgent.match(/safari/i)){
// browserName = "safari";
// }else if(userAgent.match(/opr\//i)){
// browserName = "opera";
// } else if(userAgent.match(/edg/i)){
// browserName = "edge";
// }else{
// browserName="none";
// }
// return browserName;
// }
// function getOs(){
// var detectedOS = "none";
// if (window.navigator.appVersion.indexOf("Mac") != -1)
// detectedOS = "MacOS";
// if (window.navigator.appVersion.indexOf("Win") != -1)
// detectedOS = "Windows";
// if (window.navigator.appVersion.indexOf("Linux") != -1)
// detectedOS = "Linux";
// return detectedOS;
// }
// function myEncodeQuery(text) {
// // console.log(text)
// if (!text || text == "") return "";
// //text = JSON.stringify(text);
// let ch1 = encodeURIComponent("#");
// let ch3 = encodeURIComponent("\\");
// let ch4 = encodeURIComponent("&");
// text = text.replaceAll("#", ch1);
// text = text.replaceAll("&", ch4);
// text = text.replaceAll("/", "\\");
// text = text.replaceAll("\\", ch3);
// // text = text.replaceAll(".", '%2E');
// return text;
// }
// const LogService = {
// reset(){
// var resetall = true;
// if(time_new_search != null)
// {
// var dt = new Date();
// var diffMs = (time_new_search - dt); // milliseconds
// var diffMins = Math.round(((diffMs % 86400000) % 3600000) / 60000);
// if(diffMins < 60){
// resetall = false;
// }
// }
// if(resetall){
// //getNetworkIp();
// os_name = getOs();
// id_session_search = uuidv4();
// }
// browser = fnBrowserDetect();
// time_new_search = new Date();
// id_current_search = uuidv4();
// },
// index(
// user,
// query,
// _page,
// _facet,
// _took,
// _owner="",
// _type="",
// _branch="",
// _id_click= "",
// _index_click= -1
// )
// {
// if(query=='')
// return;
// query = myEncodeQuery(query);
// _facet = myEncodeQuery(_facet);
// if(last_query_string != query){
// id_current_search = uuidv4();
// last_query_string = query;
// }
// var dt = new Date();
// //var _minutes = dt.getMinutes();
// var _hour = dt.getHours();
// var _time = dt.getTime();
// var dtfa = dt.toLocaleDateString("fa-IR");
// //var host = window.location.protocol + "//" + window.location.host;
// const obj = {
// id_session:id_session_search,
// id:id_current_search,
// browser: browser,
// os_version: os_name,
// //ip: local_ip,
// gps : local_gps,
// city : local_city,
// country : local_country,
// date: dt.toLocaleDateString(),
// hour: _hour,
// date_fa: dtfa,
// time: _time,
// took:_took,
// query_String : query,
// page: _page,
// owner:_owner,
// type:_type,
// branch:_branch,
// facet: _facet,
// username: user?.user_data?.username,
// userid : user?.user_id,
// id_click:_id_click,
// index_click:_index_click
// };
// const json = JSON.stringify(obj);
// //const blob = new Blob([json], {
// // type: 'application/json'
// //});
// //const data = new FormData();
// //data.append("document", blob);
// // return ApiService
// // .postRequest("/indexlog", json )
// // .then()
// // .catch();
// httpService
// .postRequest("/indexlog", json)
// .then((response) => {
// })
// .catch((error) => {
// });
// }
// };
// //const json = JSON.stringify({ answer: 42 });
// //const res = await axios.post('https://httpbin.org/post', json);
// export default LogService;

View File

@ -27,6 +27,8 @@ import type {
helpActiveSchema,
helpSchema,
searchActiveTab,
searchSchema,
searchSynonymTitle,
} from "~/types/searchTypes";
export const useCommonStore = defineStore("commonStore", {
@ -92,12 +94,13 @@ export const useCommonStore = defineStore("commonStore", {
appVersion: "" as string,
isShowHilight: true as boolean,
sidebarMenu: {},
// search
searchSynonymTitle: undefined as searchSynonymTitle | undefined,
searchActiveTab: undefined as searchActiveTab | undefined,
searchSchema: undefined as searchSchema | undefined,
}),
getters: {
searchActiveTabGetter(state) {
return state.searchActiveTab;
},
vuexEntityGetter(state) {
return state.vuexEntity;
},
@ -109,10 +112,18 @@ export const useCommonStore = defineStore("commonStore", {
return state.helpActiveSchema;
},
// from search
searchSynonymTitleGetter(state) {
return state.searchSynonymTitle;
},
searchActiveTabGetter(state) {
return state.searchActiveTab;
},
searchSchemaGetter(state) {
return state.searchSchema;
},
domainActiveGetter(state) {
return state.domainActive;
},
diffTypeGetter(diffType) {
return diffType;
},
@ -122,7 +133,6 @@ export const useCommonStore = defineStore("commonStore", {
activeEntityViewSchemaGetter(state) {
return state.activeEntityViewSchema;
},
researchTermsGetter(state) {
return state.researchTerms;
},
@ -165,10 +175,6 @@ export const useCommonStore = defineStore("commonStore", {
isShowHilightGetter: (state) => state.isShowHilight,
},
actions: {
searchActiveTabSetter(searchActiveTab: searchActiveTab = undefined) {
this.searchActiveTab = searchActiveTab;
},
vuexEntitySetter(vuexEntity = undefined) {
this.vuexEntity = vuexEntity;
},
@ -180,6 +186,17 @@ export const useCommonStore = defineStore("commonStore", {
this.helpActiveSchema = helpActiveSchema;
},
// from search
searchSynonymTitleSetter(searchSynonymTitle = undefined) {
this.searchSynonymTitle = searchSynonymTitle;
},
searchActiveTabSetter(searchActiveTab: searchActiveTab) {
this.searchActiveTab = searchActiveTab;
},
searchSchemaSetter(searchSchema = undefined) {
this.searchSchema = searchSchema;
},
domainActiveSetter(domain = undefined) {
this.domainActive = domain;
},