mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
244 lines
6.9 KiB
JavaScript
244 lines
6.9 KiB
JavaScript
import axios from 'axios'
|
|
import { defineStore } from 'pinia'
|
|
import { useCompanyStore } from './company'
|
|
import { useUserStore } from './user'
|
|
import { useModuleStore } from './module'
|
|
import { useNotificationStore } from '@/scripts/stores/notification'
|
|
import { handleError } from '@/scripts/helpers/error-handling'
|
|
import _ from 'lodash'
|
|
|
|
export const useGlobalStore = (useWindow = false) => {
|
|
const defineStoreFunc = useWindow ? window.pinia.defineStore : defineStore
|
|
const { global } = window.i18n
|
|
|
|
return defineStoreFunc({
|
|
id: 'global',
|
|
state: () => ({
|
|
// Global Configuration
|
|
config: null,
|
|
globalSettings: null,
|
|
|
|
// Global Lists
|
|
timeZones: [],
|
|
dateFormats: [],
|
|
currencies: [],
|
|
countries: [],
|
|
languages: [],
|
|
fiscalYears: [],
|
|
|
|
// Menus
|
|
mainMenu: [],
|
|
settingMenu: [],
|
|
|
|
// Boolean Flags
|
|
isAppLoaded: false,
|
|
isSidebarOpen: false,
|
|
areCurrenciesLoading: false,
|
|
|
|
downloadReport: null,
|
|
}),
|
|
|
|
getters: {
|
|
menuGroups: (state) => {
|
|
return Object.values(_.groupBy(state.mainMenu, 'group'))
|
|
},
|
|
},
|
|
|
|
actions: {
|
|
bootstrap() {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.get('/api/v1/bootstrap')
|
|
.then((response) => {
|
|
const companyStore = useCompanyStore()
|
|
const userStore = useUserStore()
|
|
const moduleStore = useModuleStore()
|
|
|
|
this.mainMenu = response.data.main_menu
|
|
this.settingMenu = response.data.setting_menu
|
|
|
|
this.config = response.data.config
|
|
this.globalSettings = response.data.global_settings
|
|
|
|
// user store
|
|
userStore.currentUser = response.data.current_user
|
|
userStore.currentUserSettings =
|
|
response.data.current_user_settings
|
|
userStore.currentAbilities = response.data.current_user_abilities
|
|
|
|
// Module store
|
|
moduleStore.apiToken = response.data.global_settings.api_token
|
|
moduleStore.enableModules = response.data.modules
|
|
|
|
// company store
|
|
companyStore.companies = response.data.companies
|
|
companyStore.selectedCompany = response.data.current_company
|
|
companyStore.setSelectedCompany(response.data.current_company)
|
|
companyStore.selectedCompanySettings =
|
|
response.data.current_company_settings
|
|
companyStore.selectedCompanyCurrency =
|
|
response.data.current_company_currency
|
|
|
|
global.locale =
|
|
response.data.current_user_settings.language || 'en'
|
|
|
|
this.isAppLoaded = true
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
fetchCurrencies() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.currencies.length || this.areCurrenciesLoading) {
|
|
resolve(this.currencies)
|
|
} else {
|
|
this.areCurrenciesLoading = true
|
|
axios
|
|
.get('/api/v1/currencies')
|
|
.then((response) => {
|
|
this.currencies = response.data.data.filter((currency) => {
|
|
return (currency.name = `${currency.code} - ${currency.name}`)
|
|
})
|
|
this.areCurrenciesLoading = false
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
this.areCurrenciesLoading = false
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchConfig(params) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.get(`/api/v1/config`, { params })
|
|
.then((response) => {
|
|
if (response.data.languages) {
|
|
this.languages = response.data.languages
|
|
} else {
|
|
this.fiscalYears = response.data.fiscal_years
|
|
}
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
fetchDateFormats() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.dateFormats.length) {
|
|
resolve(this.dateFormats)
|
|
} else {
|
|
axios
|
|
.get('/api/v1/date/formats')
|
|
.then((response) => {
|
|
this.dateFormats = response.data.date_formats
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchTimeZones() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.timeZones.length) {
|
|
resolve(this.timeZones)
|
|
} else {
|
|
axios
|
|
.get('/api/v1/timezones')
|
|
.then((response) => {
|
|
this.timeZones = response.data.time_zones
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchCountries() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.countries.length) {
|
|
resolve(this.countries)
|
|
} else {
|
|
axios
|
|
.get('/api/v1/countries')
|
|
.then((response) => {
|
|
this.countries = response.data.data
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchPlaceholders(params) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.get(`/api/v1/number-placeholders`, { params })
|
|
.then((response) => {
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
setSidebarVisibility(val) {
|
|
this.isSidebarOpen = val
|
|
},
|
|
|
|
setIsAppLoaded(isAppLoaded) {
|
|
this.isAppLoaded = isAppLoaded
|
|
},
|
|
|
|
updateGlobalSettings({ data, message }) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.post('/api/v1/settings', data)
|
|
.then((response) => {
|
|
Object.assign(this.globalSettings, data.settings)
|
|
|
|
if (message) {
|
|
const notificationStore = useNotificationStore()
|
|
|
|
notificationStore.showNotification({
|
|
type: 'success',
|
|
message: global.t(message),
|
|
})
|
|
}
|
|
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
},
|
|
})()
|
|
}
|