bug fix in slogan and application name

This commit is contained in:
Hesabix 2025-03-22 21:30:34 +00:00
parent b5c87da37e
commit 769d0b2ade
12 changed files with 89 additions and 55 deletions

View file

@ -25,7 +25,7 @@ class UiGeneralController extends AbstractController
#[Route('/system/getslogon', name: 'general_get_slogon')] #[Route('/system/getslogon', name: 'general_get_slogon')]
public function general_get_slogon(registryMGR $registryManager): JsonResponse public function general_get_slogon(registryMGR $registryManager): JsonResponse
{ {
$name = $registryManager->get('system', 'appSlogon'); $name = $registryManager->get('system', 'appSlogan');
return $this->json($name); return $this->json($name);
} }
#[Route('/system/geturl', name: 'general_get_url')] #[Route('/system/geturl', name: 'general_get_url')]

View file

@ -74,7 +74,7 @@ export async function getSiteName() {
); );
} }
export async function getSiteSlogon() { export async function getSiteSlogan() {
return fetchAndCache( return fetchAndCache(
`${getApiUrl()}/system/getslogon`, `${getApiUrl()}/system/getslogon`,
KEYS.SITE_SLOGON, KEYS.SITE_SLOGON,

View file

@ -432,7 +432,6 @@ const fa_lang = {
close_dialog: "بستن", close_dialog: "بستن",
}, },
app: { app: {
name: "حسابیکس",
loading: "در حال بارگذاری...", loading: "در حال بارگذاری...",
please_wait: "لطفا صبر کنید ...", please_wait: "لطفا صبر کنید ...",
logout: "خروج", logout: "خروج",
@ -511,10 +510,6 @@ const fa_lang = {
file_size_limit: 'حجم فایل انتخابی بیش از حد مجاز است.', file_size_limit: 'حجم فایل انتخابی بیش از حد مجاز است.',
"form_invalid": "لطفاً فرم را به درستی پر کنید" "form_invalid": "لطفاً فرم را به درستی پر کنید"
}, },
hesabix: {
banner: "حسابیکس سامانه جامع مدیریت کسب‌و‌کار",
name: "حسابیکس"
},
title: { title: {
user: { user: {
"dashboard": "پیشخوان کاربر", "dashboard": "پیشخوان کاربر",

View file

@ -19,7 +19,7 @@ export default {
timeNow: '', timeNow: '',
apiUrl: '', apiUrl: '',
siteName: '', siteName: '',
siteSlogon: '', siteSlogan: '',
permissions: {}, permissions: {},
showShortcutsDialog: false, showShortcutsDialog: false,
isEditingShortcuts: false, isEditingShortcuts: false,
@ -67,7 +67,7 @@ export default {
}, },
async created() { async created() {
this.siteName = await getSiteName(); this.siteName = await getSiteName();
this.siteSlogon = await getSiteSlogon(); this.siteSlogan = await getSiteSlogan();
}, },
beforeUnmount() { beforeUnmount() {
window.removeEventListener('keydown', this.handleKeyDown); window.removeEventListener('keydown', this.handleKeyDown);
@ -288,7 +288,7 @@ export default {
<template> <template>
<v-system-bar color="primaryLight2"> <v-system-bar color="primaryLight2">
<v-avatar image="/img/logo-blue.png" size="20" class="me-2 d-none d-sm-flex" /> <v-avatar image="/img/logo-blue.png" size="20" class="me-2 d-none d-sm-flex" />
<span class="d-none d-sm-flex">{{ siteSlogon }}</span> <span class="d-none d-sm-flex">{{ siteSlogan }}</span>
<v-avatar :image="apiUrl + '/front/avatar/file/get/' + business.id" size="20" class="me-2 d-flex d-sm-none" /> <v-avatar :image="apiUrl + '/front/avatar/file/get/' + business.id" size="20" class="me-2 d-flex d-sm-none" />
<span class="d-flex d-sm-none">{{ business.name }}</span> <span class="d-flex d-sm-none">{{ business.name }}</span>
<v-spacer /> <v-spacer />

View file

@ -5,7 +5,7 @@
<v-row class="d-flex flex-column align-center justify-center"> <v-row class="d-flex flex-column align-center justify-center">
<img src="/img/logo-blue.png" width="120 " class="mt-2 mb-5 p-1" alt="" /> <img src="/img/logo-blue.png" width="120 " class="mt-2 mb-5 p-1" alt="" />
<h4 class="text-center mt-5 px-8"> <h4 class="text-center mt-5 px-8">
نسخه وب اپلیکیشن (PWA) را به صفحه اصلی اضافه کنید. نسخه وب اپلیکیشن (PWA) را به صفحه اصلی اضافه کنید.
</h4> </h4>
<p class="text-center mt-5 px-5">با این کار، میتوانید برای همیشه و بدون نیاز به بروزرسانی از خدمات اپلیکیشن استفاده کنید.</p> <p class="text-center mt-5 px-5">با این کار، میتوانید برای همیشه و بدون نیاز به بروزرسانی از خدمات اپلیکیشن استفاده کنید.</p>
<p class="text-center mt-5 px-5" v-if="chromeBanner">ابتدا از دکمه <span class="font-weight-bold text-indigo-darken-3">نصب</span> استفاده کنید و سپس <span class="font-weight-bold text-indigo-darken-3">Add</span> را بزنید. اگر برنامه نصب نشد مراحل بعدی را انجام دهید.</p> <p class="text-center mt-5 px-5" v-if="chromeBanner">ابتدا از دکمه <span class="font-weight-bold text-indigo-darken-3">نصب</span> استفاده کنید و سپس <span class="font-weight-bold text-indigo-darken-3">Add</span> را بزنید. اگر برنامه نصب نشد مراحل بعدی را انجام دهید.</p>
@ -22,7 +22,7 @@
class="mt-2 mb-2" class="mt-2 mb-2"
alt="" alt=""
/> />
<h4 class="text-primary pr-2 pt-4">{{ $t("app.name") }}</h4> <h4 class="text-primary pr-2 pt-4">{{ siteName }}</h4>
</v-col> </v-col>
<v-col md="4" class="pl-5"> <v-col md="4" class="pl-5">
<v-btn <v-btn
@ -49,7 +49,6 @@
</v-card> </v-card>
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row>
<v-btn <v-btn
block block
@ -57,8 +56,8 @@
color="indigo-darken-3" color="indigo-darken-3"
variant="flat" variant="flat"
:to="{ name: 'user_login' }" :to="{ name: 'user_login' }"
> >
باز گشت به صفحه ورود باز گشت به صفحه ورود
</v-btn> </v-btn>
</v-row> </v-row>
</v-container> </v-container>
@ -67,45 +66,58 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import axios from "axios"; import { getSiteName } from "@/hesabixConfig";
import { onMounted, ref } from "vue"; import { onMounted, ref } from "vue";
const installPromptEvent = ref<Event | null>(null); const installPromptEvent = ref<Event | null>(null);
const browserName = ref<string>(""); const browserName = ref<string>("");
const chromeBanner = ref<boolean>(false); const chromeBanner = ref<boolean>(false);
const iosChecker = ref<boolean>(false); const iosChecker = ref<boolean>(false);
const siteName = ref<string>(""); // siteName به صورت ref
// Call button method for install banner // تابع برای گرفتن siteName
const fetchSiteName = () => {
getSiteName()
.then((name) => {
siteName.value = name; // مقدار رو توی ref میذاریم
})
.catch((error) => {
console.error("خطا در گرفتن نام سایت:", error);
siteName.value = "نام پیش‌فرض"; // مقدار پیشفرض در صورت خطا
});
};
// تابع نصب
const callInstallbtn = () => { const callInstallbtn = () => {
if (installPromptEvent.value) { if (installPromptEvent.value) {
// Cast as BeforeInstallPromptEvent if needed
const event = installPromptEvent.value as BeforeInstallPromptEvent; const event = installPromptEvent.value as BeforeInstallPromptEvent;
event.prompt(); event.prompt();
event.userChoice.then((choiceResult: { outcome: string }) => { event.userChoice.then((choiceResult: { outcome: string }) => {
if (choiceResult.outcome === "accepted") { if (choiceResult.outcome === "accepted") {
console.log("کاربر نصب رو قبول کرد");
} else { } else {
console.log("کاربر نصب رو رد کرد");
} }
installPromptEvent.value = null; installPromptEvent.value = null;
}); });
} }
}; };
const getBrowserName = (): any => { // تابع تشخیص مرورگر
const getBrowserName = (): string => {
const userAgent = navigator.userAgent; const userAgent = navigator.userAgent;
if (userAgent.includes("Chrome") && !userAgent.includes("Edg")) { if (userAgent.includes("Chrome") && !userAgent.includes("Edg")) {
if (userAgent.includes("Mac OS X")) { if (userAgent.includes("Mac OS X")) {
iosChecker.value = true iosChecker.value = true;
} else{ } else {
chromeBanner.value = true; chromeBanner.value = true;
} }
return "Google Chrome"; return "Google Chrome";
} else if (userAgent.includes("Firefox")) { } else if (userAgent.includes("Firefox")) {
if (userAgent.includes("Mac OS X")) { if (userAgent.includes("Mac OS X")) {
iosChecker.value = true iosChecker.value = true;
} }
return "Mozilla Firefox"; return "Mozilla Firefox";
} else if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) { } else if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) {
@ -114,22 +126,22 @@ const getBrowserName = (): any => {
return "Apple Safari"; return "Apple Safari";
} else if (userAgent.includes("SamsungBrowser")) { } else if (userAgent.includes("SamsungBrowser")) {
if (userAgent.includes("Mac OS X")) { if (userAgent.includes("Mac OS X")) {
iosChecker.value = true iosChecker.value = true;
} else{ } else {
chromeBanner.value = true; chromeBanner.value = true;
} }
return "Samsung Browser"; return "Samsung Browser";
} else if (userAgent.includes("Edg")) { } else if (userAgent.includes("Edg")) {
if (userAgent.includes("Mac OS X")) { if (userAgent.includes("Mac OS X")) {
iosChecker.value = true iosChecker.value = true;
} else{ } else {
chromeBanner.value = true; chromeBanner.value = true;
} }
return "Microsoft Edge"; return "Microsoft Edge";
} else if (userAgent.includes("Opera") || userAgent.includes("OPR")) { } else if (userAgent.includes("Opera") || userAgent.includes("OPR")) {
if (userAgent.includes("Mac OS X")) { if (userAgent.includes("Mac OS X")) {
iosChecker.value = true iosChecker.value = true;
} else{ } else {
chromeBanner.value = true; chromeBanner.value = true;
} }
return "Opera"; return "Opera";
@ -138,18 +150,14 @@ const getBrowserName = (): any => {
} }
}; };
// هنگام بارگذاری کامپوننت
onMounted(() => { onMounted(() => {
browserName.value = getBrowserName(); browserName.value = getBrowserName();
fetchSiteName(); // فراخوانی تابع بدون await
window.addEventListener("beforeinstallprompt", (e: Event) => { window.addEventListener("beforeinstallprompt", (e: Event) => {
e.preventDefault(); e.preventDefault();
installPromptEvent.value = e; installPromptEvent.value = e;
}); });
// setTimeout(() => {
// if (installPromptEvent.value) {
// installBanner.value = true;
// }
// }, 1000);
}); });
</script> </script>

View file

@ -2,6 +2,7 @@
import { defineComponent, ref } from 'vue' import { defineComponent, ref } from 'vue'
import Swal from 'sweetalert2'; import Swal from 'sweetalert2';
import axios from "axios"; import axios from "axios";
import { getSiteName } from '@/hesabixConfig';
export default defineComponent({ export default defineComponent({
name: "active_account", name: "active_account",
data() { data() {
@ -16,6 +17,7 @@ export default defineComponent({
mobile: '', mobile: '',
email: '', email: '',
}, },
siteName: '',
response: { response: {
code: '', code: '',
message: '', message: '',
@ -36,6 +38,9 @@ export default defineComponent({
} }
} }
}, },
async created() {
this.siteName = await getSiteName();
},
methods: { methods: {
onResendCodeClick() { onResendCodeClick() {
axios.post('/api/user/register/resend-active-code', { 'mobile': this.$route.params.id }).then((response: any) => { axios.post('/api/user/register/resend-active-code', { 'mobile': this.$route.params.id }).then((response: any) => {
@ -46,7 +51,7 @@ export default defineComponent({
icon: 'success' icon: 'success'
}); });
} }
else{ else {
Swal.fire({ Swal.fire({
text: response.data.message, text: response.data.message,
confirmButtonText: this.$t('dialog.ok'), confirmButtonText: this.$t('dialog.ok'),
@ -83,7 +88,7 @@ export default defineComponent({
<v-container> <v-container>
<v-row class="d-flex justify-center"> <v-row class="d-flex justify-center">
<v-col md="5"> <v-col md="5">
<v-card :loading="loading ? 'blue' : null" :disabled="loading" :title="$t('app.name')" <v-card :loading="loading ? 'blue' : null" :disabled="loading" :title="siteName"
:subtitle="$t('user.active_account')"> :subtitle="$t('user.active_account')">
<v-card-text> <v-card-text>
کد ارسالی از طریق پیامک و یا پست الکترونیکی دریافتی خود را در کادر زیر وارد نمایید. کد ارسالی از طریق پیامک و یا پست الکترونیکی دریافتی خود را در کادر زیر وارد نمایید.

View file

@ -2,7 +2,7 @@
<v-container> <v-container>
<v-row class="d-flex justify-center"> <v-row class="d-flex justify-center">
<v-col md="5"> <v-col md="5">
<v-card :loading="loading ? 'blue' : undefined" :disabled="loading" :title="$t('app.name')" <v-card :loading="loading ? 'blue' : undefined" :disabled="loading" :title="siteName"
:subtitle="$t('user.login_label')"> :subtitle="$t('user.login_label')">
<v-card-text class="text-justify"> <v-card-text class="text-justify">
{{ $t("login.des") }} {{ $t("login.des") }}
@ -62,6 +62,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { getSiteName } from "@/hesabixConfig";
import axios from "axios"; import axios from "axios";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import { onMounted, ref } from "vue"; import { onMounted, ref } from "vue";
@ -76,6 +77,7 @@ export default {
loading: false, loading: false,
captchaLoading: false, captchaLoading: false,
dialog: false, dialog: false,
siteName:'',
showCaptcha: false, showCaptcha: false,
errorMsg: self.$t('login.input_fail'), errorMsg: self.$t('login.input_fail'),
captchaImage: '', captchaImage: '',
@ -188,6 +190,9 @@ export default {
mounted() { mounted() {
// کپچا در ابتدا نمایش داده نمیشه // کپچا در ابتدا نمایش داده نمیشه
}, },
async created(){
this.siteName = await getSiteName();
},
}; };
</script> </script>

View file

@ -2,6 +2,7 @@
import { defineComponent, ref } from 'vue' import { defineComponent, ref } from 'vue'
import axios from "axios"; import axios from "axios";
import VueCountdown from '@chenfengyuan/vue-countdown'; import VueCountdown from '@chenfengyuan/vue-countdown';
import { getSiteName } from '@/hesabixConfig';
export default defineComponent({ export default defineComponent({
name: "reset-password", name: "reset-password",
@ -16,6 +17,7 @@ export default defineComponent({
loading: false, loading: false,
counting: true, counting: true,
disableSend: ref(true), disableSend: ref(true),
siteName:'',
code: '', code: '',
response: { response: {
code: '', code: '',
@ -35,6 +37,9 @@ export default defineComponent({
} }
} }
}, },
async created(){
this.siteName = await getSiteName();
},
watch: { watch: {
code(cval, bval) { code(cval, bval) {
if (Object.keys(cval).length == 6) { if (Object.keys(cval).length == 6) {
@ -81,7 +86,7 @@ export default defineComponent({
<v-container> <v-container>
<v-row class="d-flex justify-center"> <v-row class="d-flex justify-center">
<v-col md="5"> <v-col md="5">
<v-card :loading="loading ? 'blue' : null" :title="$t('app.name')" :subtitle="$t('user.forget_password')"> <v-card :loading="loading ? 'blue' : null" :title="siteName" :subtitle="$t('user.forget_password')">
<v-card-text> <v-card-text>
<v-form ref="form" :disabled="loading" fast-fail @submit.prevent="submit()"> <v-form ref="form" :disabled="loading" fast-fail @submit.prevent="submit()">
<v-otp-input focus-all v-model="code" :disabled="loading" style="direction: ltr"></v-otp-input> <v-otp-input focus-all v-model="code" :disabled="loading" style="direction: ltr"></v-otp-input>

View file

@ -2,7 +2,7 @@
<v-container> <v-container>
<v-row class="d-flex justify-center"> <v-row class="d-flex justify-center">
<v-col md="5"> <v-col md="5">
<v-card :loading="loading ? 'blue' : undefined" :title="$t('app.name')" :subtitle="$t('user.forget_password')"> <v-card :loading="loading ? 'blue' : undefined" :title="siteName" :subtitle="$t('user.forget_password')">
<v-card-text> <v-card-text>
<v-form ref="form" :disabled="loading" fast-fail @submit.prevent="submit()"> <v-form ref="form" :disabled="loading" fast-fail @submit.prevent="submit()">
<v-text-field v-model="mobile" class="mb-2" :label="$t('user.mobile')" <v-text-field v-model="mobile" class="mb-2" :label="$t('user.mobile')"
@ -50,6 +50,7 @@
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import axios from "axios"; import axios from "axios";
import { ref } from 'vue'; import { ref } from 'vue';
import { getSiteName } from '@/hesabixConfig';
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
@ -63,6 +64,7 @@ export default defineComponent({
dialog: ref(false), dialog: ref(false),
mobile: '', mobile: '',
captcha: '', captcha: '',
siteName:'',
captchaImage: '', captchaImage: '',
rules: { rules: {
mobile: [ mobile: [
@ -82,6 +84,9 @@ export default defineComponent({
} }
}; };
}, },
async created(){
this.siteName = await getSiteName();
},
mounted() { mounted() {
this.loadCaptcha(); // لود اولیه کپچا this.loadCaptcha(); // لود اولیه کپچا
}, },

View file

@ -1,7 +1,7 @@
<template> <template>
<v-system-bar color="primaryLight2"> <v-system-bar color="primaryLight2">
<v-avatar :image="getbase() + 'img/logo-blue.png'" size="20" class="me-2" /> <v-avatar :image="getbase() + 'img/logo-blue.png'" size="20" class="me-2" />
<span>{{ siteSlogon }}</span> <span>{{ siteSlogan }}</span>
<v-spacer /> <v-spacer />
</v-system-bar> </v-system-bar>
<v-navigation-drawer v-model="drawer"> <v-navigation-drawer v-model="drawer">
@ -37,7 +37,7 @@
</v-list-group> </v-list-group>
<v-list-item color="primary"> <v-list-item color="primary">
<v-list-item-title> <v-list-item-title>
<small class="text-primary">{{ $t('app.name') }} : {{ hesabix.version }}</small> <small class="text-primary">{{ siteName }} : {{ hesabix.version }}</small>
</v-list-item-title> </v-list-item-title>
</v-list-item> </v-list-item>
</v-list> </v-list>
@ -63,7 +63,7 @@
<script lang="ts"> <script lang="ts">
import axios from "axios"; import axios from "axios";
import { getSiteName, getApiUrl, getBasePath, getSiteSlogon } from "@/hesabixConfig" import { getSiteName, getApiUrl, getBasePath, getSiteSlogan } from "@/hesabixConfig"
import { applicationStore } from "@/stores/applicationStore"; import { applicationStore } from "@/stores/applicationStore";
import { useUserStore } from "@/stores/userStore"; import { useUserStore } from "@/stores/userStore";
import { ref, defineComponent } from "vue"; import { ref, defineComponent } from "vue";
@ -82,7 +82,7 @@ export default defineComponent({
}, },
siteName: '', siteName: '',
siteUrl: '', siteUrl: '',
siteSlogon:'', siteSlogan:'',
ROLE_ADMIN: false, ROLE_ADMIN: false,
user: { user: {
mobile: '1' mobile: '1'
@ -125,7 +125,7 @@ export default defineComponent({
components: { Change_lang }, components: { Change_lang },
async created() { async created() {
this.siteName = await getSiteName(); this.siteName = await getSiteName();
this.siteSlogon = await getSiteSlogon(); this.siteSlogan = await getSiteSlogan();
this.siteUrl = getApiUrl(); this.siteUrl = getApiUrl();
}, },
methods: { methods: {

View file

@ -2,7 +2,7 @@
<v-container> <v-container>
<v-row class="d-flex justify-center"> <v-row class="d-flex justify-center">
<v-col md="5"> <v-col md="5">
<v-card :loading="loading ? 'blue' : undefined" :title="$t('app.name')" :subtitle="$t('user.register_label')" <v-card :loading="loading ? 'blue' : undefined" :title="siteName" :subtitle="$t('user.register_label')"
:disabled="!canRegister"> :disabled="!canRegister">
<v-card-text> <v-card-text>
<v-form ref="form" :disabled="loading" fast-fail @submit.prevent="submit()"> <v-form ref="form" :disabled="loading" fast-fail @submit.prevent="submit()">
@ -65,6 +65,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import axios from "axios"; import axios from "axios";
import { getSiteName } from '@/hesabixConfig';
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
@ -76,6 +77,7 @@ export default defineComponent({
loading: false, loading: false,
captchaLoading: false, captchaLoading: false,
dialog: false, dialog: false,
siteName: '',
dialogColor: 'dangerLight', dialogColor: 'dangerLight',
dialogIcon: 'mdi-close-octagon', dialogIcon: 'mdi-close-octagon',
dialogTitle: '', dialogTitle: '',
@ -104,6 +106,9 @@ export default defineComponent({
this.checkRegisterStatus(); this.checkRegisterStatus();
this.loadData(); this.loadData();
}, },
async created(){
this.siteName = await getSiteName();
},
methods: { methods: {
validate(input: string, type: string) { validate(input: string, type: string) {
if (type === 'fill') { if (type === 'fill') {

View file

@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import Change_lang from "@/components/application/buttons/change_lang.vue"; import Change_lang from "@/components/application/buttons/change_lang.vue";
import { getBasePath } from "@/hesabixConfig";
import axios from "axios"; import axios from "axios";
export default { export default {
@ -10,9 +11,14 @@ export default {
} }
}, },
methods: {
getbase() {
return getBasePath();
},
},
created() { created() {
axios.post('/api/user/check/login').then((response)=>{ axios.post('/api/user/check/login').then((response) => {
if(response.data.Success == true){ if (response.data.Success == true) {
this.$router.push('/profile/business') this.$router.push('/profile/business')
} }
}); });
@ -23,7 +29,7 @@ export default {
<template> <template>
<v-app id=""> <v-app id="">
<v-app-bar class="px-2" color="indigo-darken-2" flat> <v-app-bar class="px-2" color="indigo-darken-2" flat>
<v-avatar size="32" image="./img/favw.png"></v-avatar> <v-avatar size="32" :image="getbase() + 'img/favw.png'"></v-avatar>
<v-spacer></v-spacer> <v-spacer></v-spacer>