perbaikan setting pinia dan simpan user role belum fix, ad env.example

This commit is contained in:
2025-06-05 15:20:22 +07:00
parent 35772f38c9
commit fe32e13ca4
16 changed files with 514 additions and 87 deletions

View File

@@ -1,28 +1,17 @@
<script setup lang="ts">
import typeUser from "@/data/dummy/keuangan.type_user.json";
import role_menu from "@/data/dummy/keuangan.role_menu.json";
import menu from "@/data/dummy/keuangan.menu.json";
import {useSettingStore} from "@/stores/api/setting/setting"
import {useRoleMode} from "@/stores/api/roleMenu"
import {useMenu} from "@/stores/api/menu"
import {useTypeUser} from "@/stores/api/typeUser"
const {getMenu,getRoleMenuById,getTypeUser} = useSettingStore()
const {roleMenuById,listMenu,listTypeUser} = storeToRefs(useSettingStore())
const {getMenu} = useMenu()
const {getTypeUser} = useTypeUser()
const {roleMenuById} = storeToRefs(useRoleMode())
const {listMenu} = storeToRefs(useMenu())
const {listTypeUser} = storeToRefs(useTypeUser())
const data = ref<any>([])
const dataMenu = async() => {
await getMenu()
await getTypeUser()
// console.log('ini semua tipe:',listTypeUser.value);
return roleMenuById.value.data.map((role_menu: any) => {
const menuItem = listMenu.value.find((menu:any) => menu._id == role_menu.menu_id)
const type_user= listTypeUser.value.find((type_user:any) => type_user._id == role_menu.type_user_id)
// console.log("ini menunya:",menuItem);
return {
_id: role_menu._id,
menu: menuItem?.display || '-',
@@ -33,7 +22,6 @@ const dataMenu = async() => {
accessDelete: role_menu.access?.[3]?.delete || 0
}
});
// console.log(data)
};
const onSubmit = async() => {
@@ -44,7 +32,7 @@ const onSubmit = async() => {
onMounted(async () => {
// console.log(roleMenuById.value.data);
data.value = await dataMenu()
console.log(data.value);
// console.log(data.value);
})
const columns=ref([
@@ -59,9 +47,6 @@ const columns=ref([
<template>
<div class="d-flex flex-column gap-1 mx-1 pa-7 pt-0 pb-0">
<!-- {{roleMenuById.data}} -->
<!-- {{dataMenu}} -->
<!-- {{data}} -->
<MasterTable :columns="columns" :data="data"/>
</div>
</template>

View File

@@ -1,18 +1,9 @@
<script setup lang="ts">
import typeUser from "@/data/dummy/keuangan.type_user.json";
import role_menu from "@/data/dummy/keuangan.role_menu.json";
import menu from "@/data/dummy/keuangan.menu.json";
import {useSettingStore} from "@/stores/api/setting/setting";
import {useRoleMode} from "@/stores/api/roleMenu";
import {useMenu} from "@/stores/api/menu";
import {useTypeUser} from "@/stores/api/typeUser";
const {getTypeUser, getMenu, postRoleUserMenu} = useSettingStore();
const {listMenu, listTypeUser, roleMenuById,} = storeToRefs(useSettingStore());
const {getMenu} = useMenu();
const {getTypeUser} = useTypeUser();
const {roleMenuById} = storeToRefs(useRoleMode());
const {listMenu} = storeToRefs(useMenu());
const {listTypeUser} = storeToRefs(useTypeUser());
const data = ref<any>([]);
const menuItem = ref<any>([]);
const type_user = ref<any>([]);
@@ -34,12 +25,13 @@ const dataMenu = async () => {
);
return {
_id: role_menu._id,
idTipeUser: type_user.value._id,
menu: menuItem?.value.display || "-",
type_user: type_user?.value.display || "-",
accessAdd: role_menu.access?.[0]?.add || 0,
accessUpdate: role_menu.access?.[1]?.update || 0,
accessRead: role_menu.access?.[2]?.read || 0,
accessDelete: role_menu.access?.[3]?.delete || 0,
accessUpdate: role_menu.access?.[0]?.update || 0,
accessRead: role_menu.access?.[0]?.read || 0,
accessDelete: role_menu.access?.[0]?.delete || 0,
};
});
} else {
@@ -58,6 +50,7 @@ const checkMenu = () => {
arr.forEach((i: any, index: number) => {
data.value.push({
_id: `${index + 1}`,
idTipeUser: type_user.value._id,
menu: i.display,
accessAdd: 0,
accessUpdate: 0,
@@ -68,12 +61,58 @@ const checkMenu = () => {
}
}
const onChange = (newValue, oldValue, el$) => {
}
// const onSubmit = async () => {
// const formData = dataDetail.value?.form$.data;
// const result = data.value.map(menu => ({
// id: menu._id,
// menuName: formData[`menu_${menu._id}`]?.name,
// // ... akses data lainnya ...
// }));
//
// console.log("Data terstruktur:", result);
// };
const onSubmit = async () => {
console.log("ini disimpan:", dataDetail.value?.form$.data);
};
// try {
const formData = dataDetail.value?.form$.data
// Struktur data untuk dikirim ke backend
const payload = {
type_user_id: formData.idTipeUser, // ID tipe user dari hidden field
menus: data.value.map(menu => ({
menu_id: menu._id,
menu_name: formData[`name_menu_${menu._id}`], // Nama menu dari static element
access: [
{type: 'add', value: formData[`accessAdd_${menu._id}`] || '0'},
{type: 'update', value: formData[`accessUpdate_${menu._id}`] || '0'},
{type: 'read', value: formData[`accessRead_${menu._id}`] || '0'},
{type: 'delete', value: formData[`accessDelete_${menu._id}`] || '0'}
]
}))
}
// console.log('Data yang dikirim:', payload)
await postRoleUserMenu(payload)
// Panggil action dari store untuk mengirim data ke backend
// const response = await saveRoleMenu(payload)
// Handle response dari backend
// if (response.success) {
// alert('Data berhasil disimpan!')
// // Refresh data jika perlu
// data.value = await dataMenu()
// } else {
// alert('Gagal menyimpan data: ' + response.message)
// }
// } catch (error) {
// console.error('Error saat menyimpan data:', error)
// alert('Terjadi kesalahan saat menyimpan data')
// }
}
onMounted(async () => {
data.value = await dataMenu();
console.log(checkMenu())
checkMenu()
console.log('aaaaa', data.value);
});
@@ -104,20 +143,89 @@ const createCheckbox = (namePrefix: string, menu: any) => {
let count = 0
const createMenuRow = (menu: any) => {
count += 1; // Use the current counter value and then increment it
return [
const multiElement = {
nama_menu: {
name: 'name_menu',
type: 'static',
content: menu.menu,
builder: {
type: 'p',
},
},
[`idMenu_${menu._id}`]: {
type: 'hidden',
default: menu._id,
builder: {
type: 'text',
},
},
idTipeUser: {
type: 'hidden',
default: menu.idTipeUser,
builder: {
type: 'text',
},
},
}
console.log(multiElement)
const result = [
[`${count}`, 1, 1],
[menu.menu, 1, 1],
[
{
name: 'container1',
type: 'group',
schema: {
column: {
name: 'column',
type: 'group',
schema: multiElement
},
},
builder: {
type: 'container2',
label: '2 columns',
},
},
1,
1
],
[createCheckbox('accessAdd', menu), 1, 1],
[createCheckbox('accessUpdate', menu), 1, 1],
[createCheckbox('accessRead', menu), 1, 1],
[createCheckbox('accessDelete', menu), 1, 1]
]
// console.log(result)
return result
}
// const checkMenu = () => {
// // Filter the listMenu based on roleMenuById
// var arr = listMenu.value.filter((i: any) =>
// !roleMenuById.value.data ||
// !roleMenuById.value.data.map((r: any) => r.menu_id).includes(i._id)
// );
// // Check if arr is not empty or roleMenuById.value.data is null
// if (arr.length !== 0 || !roleMenuById.value.data) {
// arr.forEach((i: any, index: number) => {
// data.value.push({
// _id: `${index + 1}`,
// menu: i.display,
// accessAdd: 0,
// accessUpdate: 0,
// accessRead: 0,
// accessDelete: 0
// });
// });
// }
// }
</script>
<template>
<div class="d-flex flex-column gap-1 mx-1 pa-7 pt-0 pb-0">
<Vueform ref="dataDetail" validate-on="change|step" method="post" :endpoint="onSubmit">
<!-- <v-text-field v-model="data[0].idTipeUser"></v-text-field>-->
<GridElement
name="gridTable"
:widths="['80px', '','90px','90px','90px','90px']"
@@ -125,24 +233,24 @@ const createMenuRow = (menu: any) => {
:cols="6"
:rows="1+data.length"
:grid="[
[
['No', 1, 1, null, null],
['Nama Menu', 1, 1, null, null],
['Tambah', 1, 1, null, null],
['Ubah', 1, 1, null, null],
['Baca', 1, 1, null, null],
['Hapus', 1, 1, null, null],
],
...data.map((menu:any) => createMenuRow(menu))
]"
[
['No', 1, 1, null, null],
['Nama Menu', 1, 1, null, null],
['Tambah', 1, 1, null, null],
['Ubah', 1, 1, null, null],
['Baca', 1, 1, null, null],
['Hapus', 1, 1, null, null],
],
...data.map((menu:any) => createMenuRow(menu))
]"
/>
<ButtonElement
class="mt-6"
name="primaryButton"
button-label="Simpan"
:submits="true"
align="right"
/>
<ButtonElement
class="mt-6"
name="primaryButton"
button-label="Simpan"
:submits="true"
align="right"
/>
</Vueform>
</div>

View File

@@ -0,0 +1,213 @@
<script setup lang="ts">
import {useSettingStore} from "@/stores/api/setting/setting";
const {getTypeUser, getMenu} = useSettingStore();
const {listMenu, listTypeUser, roleMenuById} = storeToRefs(useSettingStore());
const data = ref<any>([]);
const menuItem = ref<any>([]);
const type_user = ref<any>([]);
const dataDetail = ref(null)
const dataMenu = async () => {
await Promise.all([
getMenu(),
getTypeUser()
])
// filtering role akses menu terhadap tipe user
if (roleMenuById.value.data != null && roleMenuById.value.data != "") {
return roleMenuById.value.data.map((role_menu: any) => {
menuItem.value = listMenu.value.find(
(menu: any) => menu._id == role_menu.menu_id
);
type_user.value = listTypeUser.value.find(
(type_user: any) => type_user._id == role_menu.type_user_id
);
return {
_id: role_menu._id,
idTipeUser: type_user.value._id,
menu: menuItem?.value.display || "-",
type_user: type_user?.value.display || "-",
accessAdd: role_menu.access?.[0]?.add || 0,
accessUpdate: role_menu.access?.[1]?.update || 0,
accessRead: role_menu.access?.[2]?.read || 0,
accessDelete: role_menu.access?.[3]?.delete || 0,
};
});
} else {
checkMenu()
}
};
const checkMenu = () => {
// Filter the listMenu based on roleMenuById
var arr = listMenu.value.filter((i: any) =>
!roleMenuById.value.data ||
!roleMenuById.value.data.map((r: any) => r.menu_id).includes(i._id)
);
// Check if arr is not empty or roleMenuById.value.data is null
if (arr.length !== 0 || !roleMenuById.value.data) {
arr.forEach((i: any, index: number) => {
data.value.push({
_id: `${index + 1}`,
idTipeUser: type_user.value._id,
menu: i.display,
accessAdd: 0,
accessUpdate: 0,
accessRead: 0,
accessDelete: 0
});
});
}
}
const onChange = (newValue, oldValue, el$) => {
}
const onSubmit = async () => {
console.log("ini disimpan:", dataDetail.value?.form$.data);
};
onMounted(async () => {
data.value = await dataMenu();
checkMenu()
console.log('aaaaa', data.value);
});
// Helper function to create checkbox config
const createCheckbox = (namePrefix: string, menu: any) => {
const accessMap = {
accessAdd: menu.accessAdd,
accessUpdate: menu.accessUpdate,
accessRead: menu.accessRead,
accessDelete: menu.accessDelete
};
return {
name: `${namePrefix}_${menu._id}`,
type: 'checkbox',
text: 'Ya',
default: accessMap[namePrefix] !== undefined ? accessMap[namePrefix] : 0,
'true-value': "1",
'false-value': "0",
builder: {
type: 'checkbox',
label: 'Checkbox'
}
};
};
// Helper function to create a menu row
let count = 0
const createMenuRow = (menu: any) => {
count += 1; // Use the current counter value and then increment it
const multiElement = {
nama_menu: {
name: 'name_menu',
type: 'static',
content: menu.menu,
builder: {
type: 'p',
},
},
id_menu: {
type: 'text',
default: menu._id,
builder: {
type: 'text',
},
},
idTipeUser: {
type: 'hidden',
default: menu.idTipeUser,
builder: {
type: 'text',
},
},
}
console.log(multiElement)
const result = [
[`${count}`, 1, 1],
[
{
name: 'container1',
type: 'group',
schema: {
column: {
name: 'column',
type: 'group',
schema: multiElement
},
},
builder: {
type: 'container2',
label: '2 columns',
},
},
1,
1
],
[createCheckbox('accessAdd', menu), 1, 1],
[createCheckbox('accessUpdate', menu), 1, 1],
[createCheckbox('accessRead', menu), 1, 1],
[createCheckbox('accessDelete', menu), 1, 1]
]
// console.log(result)
return result
}
// const checkMenu = () => {
// // Filter the listMenu based on roleMenuById
// var arr = listMenu.value.filter((i: any) =>
// !roleMenuById.value.data ||
// !roleMenuById.value.data.map((r: any) => r.menu_id).includes(i._id)
// );
// // Check if arr is not empty or roleMenuById.value.data is null
// if (arr.length !== 0 || !roleMenuById.value.data) {
// arr.forEach((i: any, index: number) => {
// data.value.push({
// _id: `${index + 1}`,
// menu: i.display,
// accessAdd: 0,
// accessUpdate: 0,
// accessRead: 0,
// accessDelete: 0
// });
// });
// }
// }
</script>
<template>
<div class="d-flex flex-column gap-1 mx-1 pa-7 pt-0 pb-0">
<Vueform ref="dataDetail" validate-on="change|step" method="post" :endpoint="onSubmit">
<!-- <v-text-field v-model="data[0].idTipeUser"></v-text-field>-->
<GridElement
name="gridTable"
:widths="['80px', '','90px','90px','90px','90px']"
:presets="['grid']"
:cols="6"
:rows="1+data.length"
:grid="[
[
['No', 1, 1, null, null],
['Nama Menu', 1, 1, null, null],
['Tambah', 1, 1, null, null],
['Ubah', 1, 1, null, null],
['Baca', 1, 1, null, null],
['Hapus', 1, 1, null, null],
],
...data.map((menu:any) => createMenuRow(menu))
]"
/>
<ButtonElement
class="mt-6"
name="primaryButton"
button-label="Simpan"
:submits="true"
align="right"
/>
</Vueform>
</div>
</template>

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
const data = ref(null)
import {useTypeUser} from "@/stores/api/typeUser"
const {getTypeUser} = useTypeUser()
import {useSettingStore} from "@/stores/api/setting/setting"
const {getTypeUser} = useSettingStore()
const onSubmit = async() => {
// console.log("ini disimpan:",data.value?.data.typeUser);