Working on UI

This commit is contained in:
2026-09-11 16:06:49 +02:00
parent fcd4d4743b
commit abf00ac401
12 changed files with 218 additions and 25 deletions
+63
View File
@@ -38,6 +38,35 @@ declare module 'vue-router/auto-routes' {
Record<never, never>, Record<never, never>,
| never | never
>, >,
'/settings': RouteRecordInfo<
'/settings',
'/settings',
Record<never, never>,
Record<never, never>,
| '/settings/groups'
| '/settings/users'
>,
'/settings/groups': RouteRecordInfo<
'/settings/groups',
'/settings/groups',
Record<never, never>,
Record<never, never>,
| never
>,
'/settings/users': RouteRecordInfo<
'/settings/users',
'/settings/users',
Record<never, never>,
Record<never, never>,
| never
>,
'/user_settings': RouteRecordInfo<
'/user_settings',
'/user_settings',
Record<never, never>,
Record<never, never>,
| never
>,
} }
/** /**
@@ -59,6 +88,40 @@ declare module 'vue-router/auto-routes' {
pathParamNames: pathParamNames:
| never | never
} }
'vue/routes/settings.vue': {
routes:
| '/settings'
| '/settings/groups'
| '/settings/users'
views:
| 'default'
pathParamNames:
| never
}
'vue/routes/settings/groups.vue': {
routes:
| '/settings/groups'
views:
| never
pathParamNames:
| never
}
'vue/routes/settings/users.vue': {
routes:
| '/settings/users'
views:
| never
pathParamNames:
| never
}
'vue/routes/user_settings.vue': {
routes:
| '/user_settings'
views:
| never
pathParamNames:
| never
}
} }
/** /**
+1
View File
@@ -12,6 +12,7 @@ export default defineConfig(() => ({
VueRouter({ VueRouter({
routesFolder: 'vue/routes', routesFolder: 'vue/routes',
importMode: 'sync', importMode: 'sync',
exclude: ['vue/routes/**/comp/**'],
}), }),
vue(), vue(),
], ],
+8 -8
View File
@@ -1,18 +1,18 @@
<template> <template>
<LanguageSwitcher/> <div class="is-flex">
<br> <Sidebar />
<ThemeSwitcher/> <main class="p-5 is-flex-grow-1">
<br> <RouterView />
<RouterView /> </main>
</div>
</template> </template>
<script setup> <script setup>
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import ThemeSwitcher from '@/components/ThemeSwitcher.vue';
import { applyTheme } from '@/components/theme'; import { applyTheme } from '@/components/theme';
import LanguageSwitcher from '@/components/LanguageSwitcher.vue'; import Sidebar from '@/components/Sidebar.vue';
applyTheme(); applyTheme();
const { t } = useI18n(); const { t } = useI18n();
</script> </script>
+53
View File
@@ -0,0 +1,53 @@
<template>
<aside class="menu m-3" :class="{ 'is-collapsed': collapsed }">
<div class="level">
<p class="level-item" v-if="!collapsed">CMMS</p>
<div class="level-item">
<button class="button" :title="collapsed ? 'Expand menu' : 'Collapse menu'" @click="toggleSidebar">
<span class="icon">
<i class="fa-solid" :class="collapsed ? 'fa-angles-right' : 'fa-angles-left'"></i>
</span>
</button>
</div>
</div>
<ul class="menu-list">
<li v-for="item in items" :key="item.to">
<RouterLink :to="item.to" active-class="is-active" :class="{ 'has-text-centered': collapsed }"
:title="collapsed ? item.label : null">
<span class="icon">
<i class="fa-solid" :class="item.icon"></i>
</span>
<span v-if="!collapsed"> {{ t(item.label) }}</span>
</RouterLink>
</li>
</ul>
</aside>
</template>
<script setup>
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { RouterLink } from 'vue-router';
const { t } = useI18n()
const collapsed = ref(localStorage.getItem('sidebarCollapsed') === 'true');
function toggleSidebar() {
collapsed.value = !collapsed.value;
localStorage.setItem('sidebarCollapsed', collapsed.value);
}
// Example items — replace `to` with real routes as pages are added.
const items = [
{ label: 'menu.dashboard', icon: 'fa-gauge-high', to: '/' },
// { label: 'Assets', icon: 'fa-boxes-stacked', to: '/assets' },
// { label: 'Work Orders', icon: 'fa-clipboard-list', to: '/work-orders' },
// { label: 'Maintenance', icon: 'fa-screwdriver-wrench', to: '/maintenance' },
// { label: 'Reports', icon: 'fa-chart-line', to: '/reports' },
{ label: 'menu.userSettings', icon: 'fa-user-gear', to: '/user_settings' },
{ label: 'menu.settings', icon: 'fa-gear', to: '/settings' },
];
</script>
+9 -1
View File
@@ -1,9 +1,12 @@
@import 'vue-multiselect/dist/vue-multiselect.css'; @import 'vue-multiselect/dist/vue-multiselect.css';
@import '@fortawesome/fontawesome-free/css/all.min.css'; @import '@fortawesome/fontawesome-free/css/all.min.css';
@import 'bulma/css/bulma.min.css'; @import 'bulma/css/bulma.min.css';
html {
background-color: var(--bulma-scheme-main-ter);
}
.dropdown { .dropdown {
--bulma-dropdown-menu-min-width: 4rem; --bulma-dropdown-menu-min-width: 4rem;
} }
@@ -12,3 +15,8 @@ a.dropdown-item,
button.dropdown-item { button.dropdown-item {
padding-inline-end: 1rem; padding-inline-end: 1rem;
} }
[data-theme=dark],
.theme-dark {
--bulma-scheme-main-ter-l: 20%;
}
+10 -1
View File
@@ -1,4 +1,13 @@
{ {
"menu": {
"settings": "Settings",
"userSettings": "User settings",
"dashboard": "Dashboard"
},
"settings":{
"users":"Users",
"groups":"Groups"
},
"common": { "common": {
"save": "Save", "save": "Save",
"cancel": "Cancel", "cancel": "Cancel",
@@ -13,4 +22,4 @@
"hello": "HELLO", "hello": "HELLO",
"world": "WORLD" "world": "WORLD"
} }
} }
+6 -1
View File
@@ -1,4 +1,9 @@
{ {
"menu": {
"settings": "Nastavitve",
"userSettings": "Uporabniške nastavitve",
"dashboard": "Nadzorna plošča"
},
"common": { "common": {
"save": "Shrani", "save": "Shrani",
"cancel": "Prekliči", "cancel": "Prekliči",
@@ -13,4 +18,4 @@
"hello": "ZDRAVO", "hello": "ZDRAVO",
"world": "SVET" "world": "SVET"
} }
} }
+2 -14
View File
@@ -1,22 +1,10 @@
<template> <template>
<p>{{ t('app.world') }}</p> <h1 class="title">{{ t('menu.dashboard') }}</h1>
<p v-for="value in j">
{{ value }}
</p>
</template> </template>
<script setup> <script setup>
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n';
const { t } = useI18n(); const { t } = useI18n();
const j = ref([]);
onMounted(async () => {
const res = await fetch("/php/notifications.php")
j.value = await res.json();
});
</script> </script>
+26
View File
@@ -0,0 +1,26 @@
<template>
<h1 class="title">{{ t('menu.settings') }}</h1>
<div class="tabs">
<ul>
<li v-for="i in routes" :class="{ 'is-active': route.path === i.path }">
<RouterLink :to="i.path">
{{ t(i.title) }}
</RouterLink>
</li>
</ul>
</div>
<RouterView />
</template>
<script setup>
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
const { t } = useI18n();
const route = useRoute();
const routes = [
{"title": "settings.users", "path": "/settings/users"},
{"title": "settings.groups", "path": "/settings/groups"}
];
</script>
+8
View File
@@ -0,0 +1,8 @@
<template>
</template>
<script setup>
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
</script>
+16
View File
@@ -0,0 +1,16 @@
<template>
<table class="table">
<thead>
<tr>
<th>user</th>
<th>email</th>
<th>group</th>
</tr>
</thead>
</table>
</template>
<script setup>
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
</script>
+16
View File
@@ -0,0 +1,16 @@
<template>
<h1 class="title">{{ t('menu.userSettings') }}</h1>
<LanguageSwitcher />
<ThemeSwitcher />
</template>
<script setup>
import ThemeSwitcher from '@/components/ThemeSwitcher.vue';
import LanguageSwitcher from '@/components/LanguageSwitcher.vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
</script>