Files
crater/resources/scripts/stores/role.js
Mohit Panjwani 082d5cacf2 v5.0.0 update
2021-11-30 18:58:19 +05:30

170 lines
4.8 KiB
JavaScript

import axios from 'axios'
import { defineStore } from 'pinia'
import { useNotificationStore } from './notification'
import _ from 'lodash'
import { handleError } from '@/scripts/helpers/error-handling'
export const useRoleStore = (useWindow = false) => {
const defineStoreFunc = useWindow ? window.pinia.defineStore : defineStore
const { global } = window.i18n
return defineStoreFunc({
id: 'role',
state: () => ({
roles: [],
allAbilities: [],
selectedRoles: [],
currentRole: {
id: null,
name: '',
abilities: [],
},
}),
getters: {
isEdit: (state) => (state.currentRole.id ? true : false),
abilitiesList: (state) => {
let abilities = state.allAbilities.map((a) => ({
modelName: a.model
? a.model.substring(a.model.lastIndexOf('\\') + 1)
: 'Common',
disabled: false,
...a,
}))
return _.groupBy(abilities, 'modelName')
},
},
actions: {
fetchRoles(params) {
return new Promise((resolve, reject) => {
axios
.get(`/api/v1/roles`, { params })
.then((response) => {
this.roles = response.data.data
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
})
},
fetchRole(id) {
return new Promise((resolve, reject) => {
axios
.get(`/api/v1/roles/${id}`)
.then((response) => {
this.currentRole.name = response.data.data.name
this.currentRole.id = response.data.data.id
response.data.data.abilities.forEach((_ra) => {
for (const property in this.abilitiesList) {
this.abilitiesList[property].forEach((_p) => {
if (_p.ability === _ra.name) {
this.currentRole.abilities.push(_p)
}
})
}
})
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
})
},
addRole(data) {
const notificationStore = useNotificationStore()
return new Promise((resolve, reject) => {
axios
.post('/api/v1/roles', data)
.then((response) => {
this.roles.push(response.data.role)
notificationStore.showNotification({
type: 'success',
message: global.t('settings.roles.created_message'),
})
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
})
},
updateRole(data) {
const notificationStore = useNotificationStore()
return new Promise((resolve, reject) => {
axios
.put(`/api/v1/roles/${data.id}`, data)
.then((response) => {
if (response.data) {
let pos = this.roles.findIndex(
(role) => role.id === response.data.data.id
)
this.roles[pos] = data.role
notificationStore.showNotification({
type: 'success',
message: global.t('settings.roles.updated_message'),
})
}
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
})
},
fetchAbilities(params) {
return new Promise((resolve, reject) => {
if (this.allAbilities.length) {
resolve(this.allAbilities)
} else {
axios
.get(`/api/v1/abilities`, { params })
.then((response) => {
this.allAbilities = response.data.abilities
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
}
})
},
deleteRole(id) {
const notificationStore = useNotificationStore()
return new Promise((resolve, reject) => {
axios
.delete(`/api/v1/roles/${id}`)
.then((response) => {
let index = this.roles.findIndex((role) => role.id === id)
this.roles.splice(index, 1)
notificationStore.showNotification({
type: 'success',
message: global.t('settings.roles.deleted_message'),
})
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
})
},
},
})()
}