171 lines
5.4 KiB
Vue
171 lines
5.4 KiB
Vue
<template>
|
|
<div class="has-text-black menu-view-rights">
|
|
<div>
|
|
{{ props.row.fullname }} / {{ isVietnamese ? props.row.type__name : props.row.type__en }}
|
|
{{ $lang("access-right") }}:
|
|
</div>
|
|
<div class="mt-2">
|
|
<span class="icon-text mr-6" v-for="v in options">
|
|
<span :class="{ disabled: !(option === v.code) }">
|
|
<SvgIcon
|
|
v-bind="{
|
|
name: option === v.code ? 'radio-checked.svg' : 'radio-unchecked.svg',
|
|
type: option === v.code ? 'blue' : 'gray',
|
|
size: 25,
|
|
}"
|
|
/>
|
|
</span>
|
|
<b class="fs-18">{{ v[$store.lang === "en" ? "en" : "name"] }}</b>
|
|
</span>
|
|
</div>
|
|
<aside class="menu">
|
|
<ul class="menu-list" v-for="v in topmenu">
|
|
<li>
|
|
<div class="field is-grouped has-background-light has-text-black py-2 px-3">
|
|
<div class="control is-expanded">
|
|
<b>{{ v[$store.lang] }}</b>
|
|
</div>
|
|
<div class="control" v-if="v.submenu.length === 0 && option === 'limit'" :class="{ disabled: !(v.checked) }">
|
|
<span class="ml-6 is-clickable" >
|
|
<SvgIcon
|
|
v-bind="{
|
|
name: v.checked ? 'checked.svg' : 'uncheck.svg',
|
|
type: v.checked ? 'blue' : 'gray',
|
|
size: 25,
|
|
}"
|
|
></SvgIcon>
|
|
</span>
|
|
</div>
|
|
<div v-if="v.submenu.length > 0 && option === 'limit'">
|
|
<span class="ml-6 is-clickable" title="Xem">
|
|
<SvgIcon
|
|
v-bind="{
|
|
name: 'view.svg',
|
|
type: 'gray',
|
|
size: 25,
|
|
}"
|
|
></SvgIcon>
|
|
</span>
|
|
<span class="ml-6 is-clickable" title="Sửa">
|
|
<SvgIcon
|
|
v-bind="{
|
|
name: 'edit1.svg',
|
|
type: 'gray',
|
|
size: 25,
|
|
}"
|
|
></SvgIcon>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<ul>
|
|
<li class="border-bottom" v-for="x in v.submenu">
|
|
<div class="field is-grouped py-1">
|
|
<div class="control is-expanded">
|
|
<span class="icon-text">
|
|
<span>{{ x[$store.lang] }}</span>
|
|
</span>
|
|
</div>
|
|
<div class="control" v-if="option === 'limit'">
|
|
<span class="ml-6 is-clickable" title="Xem thông tin" :class="{ disabled: !x.checked }">
|
|
<SvgIcon
|
|
v-bind="{
|
|
name: x.checked ? 'checked.svg' : 'uncheck.svg',
|
|
type: x.checked ? 'blue' : 'gray',
|
|
size: 25,
|
|
}"
|
|
/>
|
|
</span>
|
|
<span
|
|
class="ml-6 is-clickable"
|
|
title="Chỉnh sửa thông tin"
|
|
:class="{ disabled: !(x.checked && x.is_edit === true) }"
|
|
>
|
|
<SvgIcon
|
|
v-bind="{
|
|
name: x.checked && x.is_edit === true ? 'checked.svg' : 'uncheck.svg',
|
|
type: x.checked && x.is_edit === true ? 'blue' : 'gray',
|
|
size: 25,
|
|
}"
|
|
></SvgIcon>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</aside>
|
|
</div>
|
|
</template>
|
|
<script setup>
|
|
const { $getdata, $filter, $find, $store } = useNuxtApp();
|
|
|
|
const props = defineProps({
|
|
row: Object,
|
|
api: String,
|
|
setting: String,
|
|
});
|
|
|
|
const isVietnamese = computed(() => $store.lang.toLowerCase() === "vi");
|
|
|
|
const options = [
|
|
{ code: "all", name: "Tất cả tính năng", en: "All functions" },
|
|
{ code: "limit", name: "Bị giới hạn", en: "Limited functions" },
|
|
];
|
|
const option = ref("limit");
|
|
|
|
const topmenu = ref([]);
|
|
let loanRights = [];
|
|
|
|
const rows = await $getdata(props.setting, {
|
|
category__in: ["topmenu", "submenu"],
|
|
});
|
|
|
|
async function getRights(first) {
|
|
loanRights = await $getdata(props.api, { group: props.row.type });
|
|
if (loanRights.length === 0 && first) {
|
|
option.value = "all";
|
|
}
|
|
const rights = $filter(rows, { category: "topmenu" });
|
|
|
|
rights
|
|
.sort((a, b) => (a.index ?? 0) - (b.index ?? 0))
|
|
.forEach((parent) => {
|
|
const subs = $filter(rows, {
|
|
category: "submenu",
|
|
classify: parent.code,
|
|
});
|
|
|
|
subs
|
|
.sort((a, b) => (a.index ?? 0) - (b.index ?? 0))
|
|
.forEach((sub) => {
|
|
const found = $find(loanRights, { setting: sub.id });
|
|
sub.checked = !!found;
|
|
sub.is_edit = found?.is_edit || null;
|
|
sub.rightId = found?.id || null;
|
|
});
|
|
|
|
const foundParent = $find(loanRights, { setting: parent.id });
|
|
parent.rightId = foundParent?.id || null;
|
|
|
|
parent.checked = subs.length ? subs.some((s) => s.checked) : !!foundParent;
|
|
parent.is_edit = !!foundParent?.is_edit;
|
|
parent.submenu = subs;
|
|
});
|
|
topmenu.value = [...rights];
|
|
}
|
|
await getRights(true);
|
|
</script>
|
|
|
|
<style>
|
|
.menu-view-rights .is-clickable {
|
|
cursor: default !important;
|
|
}
|
|
|
|
.menu-view-rights .disabled {
|
|
cursor: not-allowed !important;
|
|
opacity: 0.4 !important;
|
|
pointer-events: none !important;
|
|
}
|
|
</style>
|