117 lines
3.1 KiB
JavaScript
117 lines
3.1 KiB
JavaScript
import { defineStore } from 'pinia'
|
||
import api from 'src/services/api'
|
||
|
||
let lastRequestId = 0
|
||
|
||
const ACTION_CANONICAL = {
|
||
view: 'read',
|
||
insert: 'write'
|
||
}
|
||
|
||
function normalizeToken(v) {
|
||
return String(v || '').toLowerCase().trim()
|
||
}
|
||
|
||
function canonicalAction(v) {
|
||
const key = normalizeToken(v)
|
||
return ACTION_CANONICAL[key] || key
|
||
}
|
||
|
||
export const useRoleDeptPermissionListStore = defineStore('roleDeptPermissionList', {
|
||
state: () => ({
|
||
modules: [],
|
||
moduleActions: [],
|
||
rows: [],
|
||
loading: false,
|
||
error: null,
|
||
filters: {
|
||
search: ''
|
||
}
|
||
}),
|
||
|
||
getters: {
|
||
totalCount (state) {
|
||
return state.rows.length
|
||
}
|
||
},
|
||
|
||
actions: {
|
||
async fetchRows () {
|
||
const rid = ++lastRequestId
|
||
this.loading = true
|
||
this.error = null
|
||
|
||
try {
|
||
const search = String(this.filters.search || '').trim()
|
||
const params = {}
|
||
if (search) params.search = search
|
||
|
||
const res = await api.get('/role-dept-permissions/list', { params })
|
||
|
||
if (rid !== lastRequestId) {
|
||
return
|
||
}
|
||
|
||
const payload = res?.data || {}
|
||
this.modules = Array.isArray(payload?.modules)
|
||
? payload.modules.map((m) => ({
|
||
value: String(m.value || '').toLowerCase().trim(),
|
||
label: String(m.label || '')
|
||
})).filter((m) => m.value)
|
||
: []
|
||
|
||
this.moduleActions = Array.isArray(payload?.module_actions)
|
||
? payload.module_actions
|
||
.map((a) => ({
|
||
module_code: normalizeToken(a.module_code),
|
||
action: canonicalAction(a.action)
|
||
}))
|
||
.filter((a) => a.module_code && a.action)
|
||
.filter((a, idx, arr) =>
|
||
arr.findIndex((x) => x.module_code === a.module_code && x.action === a.action) === idx
|
||
)
|
||
: []
|
||
|
||
const rawRows = Array.isArray(payload?.rows)
|
||
? payload.rows
|
||
: Array.isArray(res?.data) ? res.data : []
|
||
|
||
this.rows = rawRows.map((r) => {
|
||
const rawFlags = (r?.module_flags && typeof r.module_flags === 'object')
|
||
? r.module_flags
|
||
: {}
|
||
const flags = {}
|
||
Object.keys(rawFlags).forEach((k) => {
|
||
const [moduleRaw, actionRaw] = normalizeToken(k).split('|')
|
||
if (!moduleRaw || !actionRaw) return
|
||
const action = canonicalAction(actionRaw)
|
||
const key = `${moduleRaw}|${action}`
|
||
flags[key] = Boolean(flags[key]) || Boolean(rawFlags[k])
|
||
})
|
||
|
||
return {
|
||
role_id: Number(r.role_id || 0),
|
||
role_title: r.role_title || '',
|
||
department_code: r.department_code || '',
|
||
department_title: r.department_title || '',
|
||
module_flags: flags
|
||
}
|
||
})
|
||
} catch (err) {
|
||
if (rid !== lastRequestId) return
|
||
this.modules = []
|
||
this.moduleActions = []
|
||
this.rows = []
|
||
this.error =
|
||
err?.response?.data ||
|
||
err?.message ||
|
||
'Yetki listesi alınamadı'
|
||
} finally {
|
||
if (rid === lastRequestId) {
|
||
this.loading = false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
})
|