base_ui/utils/globalMixin.ts

534 lines
16 KiB
TypeScript
Raw Permalink Normal View History

2025-02-01 09:34:55 +00:00
// // import Vue from "vue";
import { convertEnToPe } from "~/manuals/persianNumber";
// import { mapState } from "pinia";
// import Cookies from "js-cookie";
import { useCommonStore } from "~/stores/commonStore";
import { useAuthStore } from "~/stores/authStore";
// // ...mapState("common", ["activeSystemGetter"]),
export const appDescription = () => {
return import.meta.env.VITVITE_DESCRIPTION_BUILD_NAME ?? "monir";
};
export const buildName = () => {
return import.meta.env.VITE_BUILD_NAME ?? "monir";
};
export const logoPhoto = () => {
if (buildName() == "majles")
return import("assets/majles/img/logo_200x200_green.png");
return import("assets/common/img/logo/logo.png");
};
export const appLongTitle = () => {
return import.meta.env.VITE_TITLE ?? "زیست بوم تحریر";
};
export const appShortTitle = () => {
return import.meta.env.VITE_SHORT_TITLE ?? "زیست بوم تحریر";
};
export const buildState = () => {
return import.meta.env.VITE_BUILD_STATE ?? 0;
};
export const isMajlesBuild = () => {
return buildName() == "majles" && buildState() == 1;
};
export const isAdmin = () => {
const authStore = useAuthStore();
return authStore.currentUser?.user_level > 1;
};
export const AddButtonText = () => {
return import.meta.env.VITE_NEW_TEXT;
};
export const EditButtonText = () => {
return import.meta.env.VITE_EDIT_TEXT;
};
// export const pageFormTitle = () => {
// return this.$route.meta.pageFormTitle;
// };
// export const pageName = () => {
// return this.$route.meta.breadcrumb;
// };
// export const getHtmlTooltip = (section, key, id) => {
// let res = {};
// let link = "";
// if (id) link = location.origin + "/" + key + "/" + id;
// if (section == "search") {
// if (key == "search_type") {
// res = {
// html:
// "<p>" +
// "برای یافتن بهترین پاسخ، روش جستجو را تعیین می‌کند" +
// "</p>" +
// '<a href="' +
// link +
// '"> بیشتر ... </a>',
// };
// }
// }
// if (section == "entity") {
// }
// return res;
// };
export const tahrirUrl = () => {
return import.meta.env.VITE_TAHRIR_BASE_URL + "/";
};
export const messageUrl = () => {
return import.meta.env.VITE_MESSAGE + "/";
};
export const loginUrl = () => {
return import.meta.env.VITE_AUTH + "/";
};
export const keyValueUrl = () => {
return import.meta.env.VITE_KEY_VALUE + "/";
};
export const permitUrl = () => {
return import.meta.env.VITE_PERMIT + "/";
};
export const repoUrl = () => {
return import.meta.env.VITE_REPO + "/";
};
export const listUrl = () => {
return import.meta.env.VITE_LIST + "/";
};
export const taskUrl = () => {
return import.meta.env.VITE_TASK + "/";
};
export const logUrl = () => {
return import.meta.env.VITE_LOG + "/";
};
export const fileUrl = () => {
return import.meta.env.VITE_FILE + "/";
};
export const baseUrl = () => {
return import.meta.env.BASE_URL;
};
// // ...mapActions(["SET_PWA_ISTALL_PROMPT_EVENT"]),
export const setDocumentTitle = (data, key1 = "title") => {
let title = "";
if (data) {
let dataWithSource = data;
if ("_source" in data) {
dataWithSource = { ...dataWithSource, ...dataWithSource._source };
}
title = appShortTitle();
if (key1 in dataWithSource) title = dataWithSource[key1];
// else if (key2 in dataWithSource) title = dataWithSource[key2];
// else title = dataWithSource[key3];
// this.$nextTick(() => {
document.title = title; //appShortTitle() + "-" +
// });
} else document.title = appShortTitle();
};
// export const canUpdateInShowPage = (elemnt_key = undefined) => {
// const authStore = useAuthStore();
// const CommonStore = useCommonStore();
// if (authStore.currentUser.user_level > 1) return true;
// if (elemnt_key) {
// // کلید واحد کامل با توجه به صفحه
// const res = CommonStore.userPermisionGetter?.includes(elemnt_key + "_update");
// return res;
// }
// const routeName = this.$route.name;
// const routekey = this.$route.params.key;
// if (routeName == "answersShow") {
// const res = CommonStore.userPermisionGetter?.includes(
// "answers-properties_update"
// );
// return res;
// }
// if (routeName == "issuesShow") {
// const res = CommonStore.userPermisionGetter?.includes(
// "issues-properties_update"
// );
// return res;
// }
// if (routeName == "critionsShow") {
// const res = CommonStore.userPermisionGetter?.includes(
// "critions-properties_update"
// );
// return res;
// }
// if (routekey == "mqsection" || routekey == "qsection") {
// const res = CommonStore.userPermisionGetter?.includes(routekey + "_update");
// return res;
// } else {
// return CommonStore.userPermisionGetter?.includes(routeName + "_update");
// }
// };
export const copyToClipboard = async (
id = undefined,
domainUrl = undefined
) => {
try {
const _id = id ? "/" + id : "";
let url = location.href;
if (domainUrl) {
url = location.origin + domainUrl;
}
await navigator.clipboard.writeText(url + _id);
mySwalToast({
html: "نشانی پیوند کپی شد.",
});
} catch (err) {
console.log(err.message);
mySwalToast({
html: "خطایی رخ داد.لطفا دوباره امتحان کنید.",
});
}
};
export const copyTextToClipboard = async (text) => {
try {
await navigator.clipboard.writeText(text);
mySwalToast({
html: "متن کپی شد.",
});
} catch (err) {
console.log(err.message);
mySwalToast({
html: "خطایی رخ داد.لطفا دوباره امتحان کنید.",
});
}
};
// // for firefox browser that does nt support pwa installation.
export const alertPwaNotSupported = () => {
if (isMajlesBuild()) return;
const vm = this;
mySwalConfirm({
title: "توجه!",
html: `مرورگر شما امکان نصب سامانه در صفحه گوشی یا رایانه شما را نمی دهد.
درصورت تمایل به نصب سامانه،
از مرورگر گوگل کروم
<img src="${require("assets/common/img/chrome.svg")}" width="20" height="20" alt="Google Chrome">
یا مایکروسافت اج
<img src="${require("assets/common/img/edge.svg")}" width="20" height="20" alt="Microsoft Edge">
استفاده نمایید.
`,
showCancelButton: true,
confirmButtonText: "باشه",
cancelButtonText: "فعلا نمی خوام",
});
// .then((result) => {
// if (result.isConfirmed) {
// vm.dismissPwaInstallationBox(365);
// }
// });
};
export const identifyBrowser = () => {
var ua = navigator.userAgent;
var tem;
var M =
ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) ||
[];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return "IE " + (tem[1] || "");
}
if (M[1] === "Chrome") {
tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
if (tem != null) return tem.slice(1).join(" ").replace("OPR", "Opera");
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, "-?"];
if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]);
return M.join(" ");
};
export const dismissPwaInstallationBox = async (time) => {
const CommonStore = useCommonStore();
// Cookies.set("add-to-home-screen", null, { expires: +time });
CommonStore.SET_PWA_INSTALL_PROMPT_EVENT(null);
};
export const installPwa = async () => {
const vm = this;
const CommonStore = useCommonStore();
CommonStore.getPwaInstallPromptEvent.prompt(); // Wait for the user to respond to the prompt
CommonStore.getPwaInstallPromptEvent.userChoice.then((choice) => {
if (choice.outcome === "accepted") {
console.log("User accepted");
} else {
console.log("User dismissed");
}
});
};
export const userFullname = (user) => {
if (user?.first_name || user?.last_name)
return user?.first_name + " " + user?.last_name;
else return user?.username;
};
export const userAvatar = (user = undefined) => {
if (user) {
try {
if (user?.avatar && user?.avatar?.length) {
return (
import.meta.env.VITE_BASE_URL +
import.meta.env.VITE_API_NAME +
fileUrl() +
user.avatar
);
} else {
let initials = "";
if (user.first_name) initials += user?.first_name.charAt(0);
if (user.last_name) initials += user?.last_name.charAt(0);
if (initials == "")
initials = user?.username?.charAt(0) + user?.username?.charAt(1);
return generateAvatarFromChars(initials);
}
} catch (err) {
return import("~/assets/common/img/user.svg");
}
}
return import("~/assets/common/img/user.svg");
};
export const generateAvatarFromChars = (
text,
foregroundColor = "white",
backgroundColor = "#00b6e3"
) => {
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
canvas.width = 100;
canvas.height = 100;
// Draw background
context.fillStyle = backgroundColor;
context.fillRect(0, 0, canvas.width, canvas.height);
// Draw text
context.font = "normal 2.5rem sahel-bold";
context.fillStyle = foregroundColor;
context.textAlign = "center";
context.textBaseline = "middle";
context.direction = "rtl";
context.fillText(text.trim(), canvas.width / 2, canvas.height / 2);
return canvas.toDataURL("image/png");
};
export const logout = (route = undefined) => {
const authStore = useAuthStore();
// const route = useRoute();
const router = useRouter();
authStore.logout();
if (route) {
router.push({
name: "login",
params: route.params,
query: {
redirectBack: true,
path: route.fullPath,
},
});
} else {
router.push({
name: "login",
});
}
};
export const redirectToRouteName = (routeName = "dashboard") => {
const router = useRouter();
router.push({ name: routeName }).then(() => {
// if (routeName === 'dashboard')
// clearBodyClass();
});
};
export const getGroupAvatar = (user = undefined) => {
try {
if (user) {
if (isValidHttpUrl(user.avatar)) return user.avatar;
else {
if ("title" in user) {
const nameArray = user.title?.split(" ");
if (nameArray?.length > 1) {
const initials = nameArray[0].charAt(0) + nameArray[1].charAt(0);
return generateAvatarFromChars(initials);
} else {
const initials = nameArray[0].charAt(0);
return generateAvatarFromChars(initials);
}
}
}
}
} catch (err) {
return import("~/assets/common/img/default.svg").default;
}
};
export const convertUnixToPersianDateTime = (created_at) => {
if (created_at) {
const currentDate = new Date();
const currentYear = currentDate.getFullYear();
const currentMonth = currentDate.getMonth();
const currentDay = currentDate.getDate();
const currentHours = currentDate.getHours();
const currentMinutes = currentDate.getMinutes();
const currentSeconds = currentDate.getSeconds();
const updatedAtDate = new Date(created_at * 1000);
const updatedAtYear = updatedAtDate.getFullYear();
const updatedAtMonth = updatedAtDate.getMonth();
const updatedAtDay = updatedAtDate.getDate();
const updatedAtHours = updatedAtDate.getHours();
const updatedAtMinutes = updatedAtDate.getMinutes();
const updatedAtSeconds = updatedAtDate.getSeconds();
let yr =
updatedAtYear - currentYear !== 0
? Math.abs(updatedAtYear - currentYear)
: 0;
if (yr) return convertEnToPe(yr) + " سال پیش";
let mon =
updatedAtMonth - currentMonth !== 0
? Math.abs(updatedAtMonth - currentMonth)
: 0;
if (mon) return convertEnToPe(mon) + " ماه پیش";
let dy =
updatedAtDay - currentDay !== 0 ? Math.abs(updatedAtDay - currentDay) : 0;
if (dy) {
if (dy % 7 === 0) return convertEnToPe(dy) + " هفته پیش";
else return convertEnToPe(dy) + " روز پیش";
}
let sec =
updatedAtSeconds - currentSeconds !== 0
? Math.abs(updatedAtSeconds - currentSeconds)
: 0;
let _seconds = "";
if (sec) _seconds = " چند لحظه پیش";
let min =
updatedAtMinutes - currentMinutes !== 0
? Math.abs(updatedAtMinutes - currentMinutes)
: 0;
let _minutes = "";
if (min) _minutes = convertEnToPe(min) + " دقیقه پیش";
let hr =
updatedAtHours - currentHours !== 0
? Math.abs(updatedAtHours - currentHours)
: 0;
if (hr) {
// if (min) {
// return convertEnToPe(hr) + " ساعت و " + _minutes
// };
return convertEnToPe(hr) + " ساعت پیش ";
}
if (!min && sec) return _seconds;
return _minutes;
} else {
return "تاریخ نامعتبر";
}
};
// export const deletePaper = (url, { isowner, title, guid }) => {
// let html = `
// <div class="custom-sw-content">
// <div class="custom-sw-header-container">
// <div class="icon">
// <i class="tavasi tavasi-Component-360--58"><span class="path1"></span><span class="path2"></span></i>
// </div>
// <p class="custom-content-title">${title}</p>
// </div>
// <span class="text__gray text__small">سند <strong>اشتراکی</strong> شما حذف و در بخش بازیافت به مدت ۶۰ روز بایگانی می‌شود. بعد ازاین مدت خود به خود حذف می‌شود و بازگرداندن آن غیر ممکن است</span>
// </div>
// `;
// if (isowner === 1) {
// html = `
// <div class="custom-sw-content">
// <div class="custom-sw-header-container">
// <div class="icon">
// <i class="tavasi tavasi-Component-360--58"><span class="path1"></span><span class="path2"></span></i>
// </div>
// <p class="custom-content-title">${title}</p>
// </div>
// <span class="text__gray text__small">سند شما حذف و در بخش بازیافت به مدت ۶۰ روز بایگانی می‌شود. بعد ازاین مدت خود به خود حذف می‌شود و بازگرداندن آن غیر ممکن است</span>
// </div>
// `;
// }
// return new Promise((resolve, reject) => {
// this.mySwalConfirm({
// title: "از حذف این پرونده مطمئن هستید؟",
// html,
// }).then((result) => {
// if (result.isConfirmed) {
// ApiService.formData(url, { guid })
// .then((response) => {
// resolve(response);
// })
// .catch((err) => {
// //todo: define what operation should to be done on error(401,403,500)
// reject(err);
// });
// }
// });
// });
// };
// export const 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;
// };
export const myEncodeQuery = (text) => {
//text = JSON.stringify(text);
if (!text || text == "") return "";
let ch1 = encodeURIComponent("#");
let ch3 = encodeURIComponent("\\");
let ch4 = encodeURIComponent("&");
text = text.replaceAll(ch1, "#");
text = text.replaceAll(ch4, "&");
text = text.replaceAll(ch3, "\\");
return text;
};
// // Vue.mixin(globalMixin);
export const formDataParamMaker = (data) => {
const formData = new FormData();
for (const [key, value] of Object.entries(data)) {
if (
key != null &&
key != undefined &&
value !== undefined &&
value !== null
)
formData.append(key, value);
}
return formData;
};