[feat] kasir menu

This commit is contained in:
Baghaztra 2025-09-08 10:33:28 +07:00
parent 9b2d50ac65
commit 20c844a98b
3 changed files with 34 additions and 11 deletions

View File

@ -20,10 +20,15 @@ class DatabaseSeeder extends Seeder
public function run(): void public function run(): void
{ {
User::factory()->create([ User::factory()->create([
'nama' => 'Test', 'nama' => 'Owner',
'role' => 'owner', 'role' => 'owner',
'password' => bcrypt('123123'), 'password' => bcrypt('123123'),
]); ]);
User::factory()->create([
'nama' => 'Kasir',
'role' => 'kasir',
'password' => bcrypt('123123'),
]);
User::factory(2)->create(); User::factory(2)->create();
Sales::factory(5)->create(); Sales::factory(5)->create();

View File

@ -1,5 +1,5 @@
<script setup> <script setup>
import { ref, provide } from "vue"; import { ref, provide, computed } from "vue";
import NavDesktop from "./NavDesktop.vue"; import NavDesktop from "./NavDesktop.vue";
import NavMobile from "./NavMobile.vue"; import NavMobile from "./NavMobile.vue";
import logo from "../../images/logo.png"; import logo from "../../images/logo.png";
@ -9,9 +9,10 @@ const isOpen = ref(false);
const isMobileMenuOpen = ref(false); const isMobileMenuOpen = ref(false);
const openDropdownIndex = ref(null); const openDropdownIndex = ref(null);
const items = [ const baseItems = [
{ {
label: "Manajemen Produk", subItems: [ label: "Manajemen Produk",
subItems: [
{ label: "Brankas", route: "/brankas" }, { label: "Brankas", route: "/brankas" },
{ label: "Nampan", route: "/nampan" }, { label: "Nampan", route: "/nampan" },
{ label: "Produk", route: "/produk" }, { label: "Produk", route: "/produk" },
@ -24,6 +25,18 @@ const items = [
{ label: "Akun", route: "/akun" }, { label: "Akun", route: "/akun" },
]; ];
const role = localStorage.getItem("role");
const items = computed(() => {
if (role === "owner") {
return baseItems;
}
if (role === "kasir") {
return baseItems.filter(item => !["Akun", "Laporan"].includes(item.label));
}
return baseItems;
});
const toggleDropdown = (index = null) => { const toggleDropdown = (index = null) => {
if (index !== null) { if (index !== null) {
openDropdownIndex.value = openDropdownIndex.value === index ? null : index; openDropdownIndex.value = openDropdownIndex.value === index ? null : index;
@ -46,15 +59,20 @@ const closeMobileMenu = () => {
const logout = async () => { const logout = async () => {
try { try {
await axios.post('/api/logout', { await axios.post("/api/logout", null, {
headers: { headers: {
Authorization: `Bearer ${localStorage.getItem("token")}`, Authorization: `Bearer ${localStorage.getItem("token")}`,
}, },
}); });
window.location.href = '/'; localStorage.removeItem("token");
localStorage.removeItem("role");
window.location.href = "/";
} catch (error) { } catch (error) {
if (error.response && error.response.status === 401) { if (error.response && error.response.status === 401) {
window.location.href = '/'; localStorage.removeItem("token");
localStorage.removeItem("role");
window.location.href = "/";
} else { } else {
console.error("Logout failed:", error); console.error("Logout failed:", error);
} }
@ -63,7 +81,7 @@ const logout = async () => {
}; };
// Provide shared data to child components // Provide shared data to child components
provide('navigationData', { provide("navigationData", {
logo, logo,
items, items,
isOpen, isOpen,

View File

@ -12,9 +12,9 @@ import Laporan from "../pages/Laporan.vue";
import Login from "../pages/Login.vue"; import Login from "../pages/Login.vue";
import Akun from "../pages/Akun.vue"; import Akun from "../pages/Akun.vue";
import auth from "../middleware/auth"; import auth from "../middlewares/auth";
import guest from "../middleware/guest"; import guest from "../middlewares/guest";
import owner from "../middleware/owner"; import owner from "../middlewares/owner";
const middlewareMap = { auth, guest, owner }; const middlewareMap = { auth, guest, owner };