hesabixCore/webUI/src/main.ts

255 lines
8 KiB
TypeScript
Raw Normal View History

2025-03-21 14:20:43 +03:30
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import axios from "axios";
import "./registerServiceWorker";
import { vMaska } from "maska/vue"
import VueApexCharts from "vue3-apexcharts";
import Uploader from 'vue-media-upload';
2025-03-26 21:40:38 +03:30
import DateFnsJalaliAdapter from '@date-io/date-fns-jalali';
import faIR from 'date-fns-jalali/locale/fa-IR';
2025-03-21 14:20:43 +03:30
//pinia
import { createPinia } from 'pinia'
const pinia = createPinia();
import CKEditor from '@ckeditor/ckeditor5-vue';
// Import translations for the Persian language.
import '@ckeditor/ckeditor5-build-classic/build/translations/fa';
// Vuetify
import 'vuetify/styles'
import { createVuetify } from 'vuetify'
import * as components from 'vuetify/components'
import * as directives from 'vuetify/directives'
import * as labsComponents from 'vuetify/labs/components'
import colors from 'vuetify/util/colors'
//i18n imports
import { createVueI18nAdapter } from 'vuetify/locale/adapters/vue-i18n'
import { createI18n, useI18n } from 'vue-i18n'
import i18n from '@/i18n/i18n'
// Styles
import '@mdi/font/css/materialdesignicons.css'
import 'vuetify/styles'
import { aliases, mdi } from "vuetify/iconsets/mdi";
const vuetify = createVuetify({
defaults: {
VNavigationDrawer: {
color: 'primaryLight',
VCard: {
color: 'indigo-darken-2'
},
VList: {
density: 'compact',
VListGroup: {
density: 'compact',
VListItem: {
class: 'text-indigo-darken-4',
VListItemAction: {
class: 'text-caption text-danger'
},
VBtn: {
class: 'text-primary',
variant: 'flat'
},
},
}
},
},
VTextField: {
hideDetails: "auto",
variant: "outlined",
size: "small",
density: "comfortable"
2025-03-21 14:20:43 +03:30
},
VTextarea: {
hideDetails: "auto",
density: "comfortable"
2025-03-21 14:20:43 +03:30
},
VSelect: {
hideDetails: "auto",
variant: "outlined",
density: "comfortable"
2025-03-21 14:20:43 +03:30
},
VDialog: {
VCard: {
}
},
VToolbar: {
density: 'compact'
},
VAppBar: {
color: 'indigo-darken-2'
},
VMenu: {
VList: {
density: "compact"
}
}
},
components: {
...components,
...labsComponents
},
directives,
icons: {
defaultSet: 'mdi',
aliases,
sets: {
mdi,
},
},
locale: {
adapter: createVueI18nAdapter({ i18n, useI18n }),
},
theme: {
defaultTheme: 'light',
themes: {
light: {
dark: false,
colors: {
primary: '#044792', // #E53935
secondary: colors.grey.darken4, // #FFCDD2
danger: colors.red.darken3,
error: colors.red.darken3,
dangerLight: colors.red.lighten4,
successLight: colors.green.lighten4,
primaryLight: '#f8f9fc',
primaryLight2: '#edf1fc',
success: '#457237',
toolbar: colors.indigo.lighten5,
primaryDark: colors.indigo.darken4,
btnAdd: '#5696bd'
}
},
},
},
2025-03-26 21:40:38 +03:30
date: {
adapter: DateFnsJalaliAdapter,
locale: {
fa:faIR // تنظیم زبان فارسی
},
},
2025-03-21 14:20:43 +03:30
});
// @ts-ignore
import Vue3EasyDataTable from 'vue3-easy-data-table';
import 'vue3-easy-data-table/dist/style.css';
import { LoadingPlugin } from 'vue-loading-overlay';
import 'vue-loading-overlay/dist/css/index.css';
import '@/css/main.css';
import money from 'v-money3';
import Vue3PersianDatetimePicker from 'vue3-persian-datetime-picker';
import Swal from "sweetalert2";
import { getApiUrl } from "@/hesabixConfig";
const app = createApp(App)
app.component('EasyDataTable', Vue3EasyDataTable);
app.component('DatePicker', Vue3PersianDatetimePicker);
import vSelect from 'vue-select'
import 'vue-select/dist/vue-select.css';
app.component('v-cob', vSelect)
import Hdatepicker from "@/components/forms/Hdatepicker.vue";
import calendarLocalConfig from "@/i18n/calendarLocalConfig";
app.component('h-date-picker', Hdatepicker);
app.use(CKEditor)
app.use(Vue3PersianDatetimePicker, {
name: 'CustomDatePicker',
props: {
locale: localStorage.getItem('UI_LANG'),
color: "#3059ab",
format: calendarLocalConfig.format(localStorage.getItem('UI_CALENDAR')),
displayFormat: calendarLocalConfig.format(localStorage.getItem('UI_CALENDAR')),
editable: false,
autoSubmit: true,
localeConfig: calendarLocalConfig.data().localeConfig
}
})
axios.defaults.headers.common['X-AUTH-TOKEN'] = localStorage.getItem('X-AUTH-TOKEN');
app.config.globalProperties.$API_URL = getApiUrl();
axios.defaults.baseURL = app.config.globalProperties.$API_URL;
axios.defaults.withCredentials = true;
axios.defaults.headers.common['activeBid'] = localStorage.getItem('activeBid');
axios.defaults.headers.common['activeYear'] = localStorage.getItem('activeYear');
axios.defaults.headers.common['activeMoney'] = localStorage.getItem('activeMoney');
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
console.log('Error');
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
if (error.code === 404) {
// Do something with response error
Swal.fire({
text: 'اتصال با سرویس دهنده برقرار نشد. لطفا اتصال اینترنت خود را بررسی نمایید.',
icon: 'error',
confirmButtonText: 'قبول'
});
}
return Promise.reject(error);
});
app.use(router)
app.use(money)
app.use(LoadingPlugin)
app.use(pinia)
app.use(i18n)
app.use(vuetify);
app.use(VueApexCharts);
app.directive("maska", vMaska);
app.component('Uploader', Uploader);
//global methods
app.config.globalProperties.$filters = {
formatNumber(value: any, moneyLabel: any = false) {
let result = parseFloat(value).toFixed(0).toString();
result = result.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
if (moneyLabel == true) {
result = result + ' ' + localStorage.getItem('activeMoneyShortName');
}
return result;
},
onlyNumber($event: any) {
let keyCode = ($event.keyCode ? $event.keyCode : $event.which);
if ((keyCode < 48 || keyCode > 57)) { // 46 is dot
$event.preventDefault();
}
},
getApiUrl() {
return getApiUrl();
},
getActiveMoney() {
return {
name: localStorage.getItem('activeMoney'),
symbol: localStorage.getItem('activeMoneySymbol'),
shortName: localStorage.getItem('activeMoneyShortName'),
};
},
async isLogin() {
let result = await axios.post('/api/user/check/login');
return result.status === 200;
}
}
app.config.globalProperties.app_isLogin = async () => {
let result = await axios.post('/api/user/check/login');
if (result.status === 200) {
return result.data.result;
} else {
return false;
}
}
app.config.compilerOptions.isCustomElement = (tag) => {
return ['transition'].includes(tag)
}
app.mount('#page-container')