5 Commits

Author SHA1 Message Date
Adrian Zürcher
39e5479947 fix wrong filter parameter 2025-11-16 08:42:54 +01:00
Adrian Zürcher
5c15fb5599 change padding to userfriendlier size on phone close #23 2025-11-16 08:42:28 +01:00
Adrian Zürcher
dce451bfc2 add new page header and decrease marging 2025-11-16 08:40:42 +01:00
Adrian Zürcher
bba4486136 fix translation 2025-11-16 08:39:31 +01:00
Adrian Zürcher
a18b01450d fix wrong input field to select clos #25 2025-11-16 08:39:17 +01:00
19 changed files with 370 additions and 326 deletions

View File

@@ -86,9 +86,9 @@ members: Mitglider
attendanceTable: Anweseheits Tabelle attendanceTable: Anweseheits Tabelle
excursionTable: Usflugs Tabelle excursionTable: Usflugs Tabelle
updated: aktualisiert updated: aktualisiert
events: Veranstalige events: Verastautige
eventNameIsRequired: Verastatigsname isch erforderlich eventNameIsRequired: Verastautigssname isch erforderlich
eventName: Verastatigsname eventName: Verastautigssname
attendees: Teilnähmer attendees: Teilnähmer
now: Jetzt now: Jetzt
addToEvent: Füge zu Veranstautig addToEvent: Füge zu Veranstautig

View File

@@ -60,12 +60,17 @@
filled filled
v-model="localMember.email" v-model="localMember.email"
></q-input> ></q-input>
<q-input <q-select
class="q-ml-md col-5" class="q-ml-md col-5"
:label="$t('group')" :label="$t('group')"
:options="props.group"
filled filled
emit-value
map-options
option-value="name"
option-label="name"
v-model="localMember.group" v-model="localMember.group"
></q-input> ></q-select>
<q-select <q-select
class="q-ml-md col-5" class="q-ml-md col-5"
:label="$t('responsible')" :label="$t('responsible')"
@@ -118,6 +123,9 @@ const props = defineProps({
responsibles: { responsibles: {
type: Object as PropType<Members>, type: Object as PropType<Members>,
}, },
group: {
type: Array,
},
}); });
const emit = defineEmits(['update']); const emit = defineEmits(['update']);

View File

@@ -1,11 +1,11 @@
<template> <template>
<q-page> <q-page>
<h4 class="text-primary text-bold text-center">{{ $t('events') }}</h4> <SiteTitle :title="$t('events')" />
<EventsTable /> <EventsTable />
</q-page> </q-page>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
import EventsTable from 'src/vueLib/tables/events/EventsTable.vue'; import EventsTable from 'src/vueLib/tables/events/EventsTable.vue';
</script> </script>

View File

@@ -1,10 +1,11 @@
<template> <template>
<q-page> <q-page>
<h4 class="text-primary text-bold text-center">{{ $t('groups') }}</h4> <SiteTitle :title="$t('groups')" />
<GroupTable /> <GroupTable />
</q-page> </q-page>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
import GroupTable from 'src/vueLib/tables/group/GroupTable.vue'; import GroupTable from 'src/vueLib/tables/group/GroupTable.vue';
</script> </script>

View File

@@ -1,10 +1,13 @@
<template> <template>
<q-page> <q-page>
<h4 class="text-primary text-bold text-center">{{ $t('members') }}</h4> <SiteTitle :title="$t('members')" />
<div class="q-pa-md">
<MembersTable /> <MembersTable />
</div>
</q-page> </q-page>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
import MembersTable from 'src/vueLib/tables/members/MembersTable.vue'; import MembersTable from 'src/vueLib/tables/members/MembersTable.vue';
</script> </script>

View File

@@ -1,11 +1,11 @@
<template> <template>
<q-page> <q-page>
<h4 class="text-primary text-bold text-center">{{ $t('responsibles') }}</h4> <SiteTitle :title="$t('responsibles')" />
<ResponsibleTable /> <ResponsibleTable />
</q-page> </q-page>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
import ResponsibleTable from 'src/vueLib/tables/responsible/ResponsibleTable.vue'; import ResponsibleTable from 'src/vueLib/tables/responsible/ResponsibleTable.vue';
</script> </script>

View File

@@ -1,6 +1,5 @@
<template> <template>
<h4 class="text-primary text-bold text-center">{{ $t('userSettings') }}</h4> <SiteTitle :title="$t('userSettings')" />
<div class="text-h2 flex flex-center"> <div class="text-h2 flex flex-center">
<q-card class="q-gutter-md"> <q-card class="q-gutter-md">
<div> <div>
@@ -152,6 +151,7 @@ import { useNotify } from 'src/vueLib/general/useNotify';
import { type Settings } from 'src/vueLib/models/settings'; import { type Settings } from 'src/vueLib/models/settings';
import { useUserStore } from 'src/vueLib/login/userStore'; import { useUserStore } from 'src/vueLib/login/userStore';
import { setLocalSettings } from 'src/localstorage/localStorage'; import { setLocalSettings } from 'src/localstorage/localStorage';
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
const { NotifyResponse } = useNotify(); const { NotifyResponse } = useNotify();
const colorGroup = ref(false); const colorGroup = ref(false);

View File

@@ -1,6 +1,5 @@
<template> <template>
<h4 class="text-primary text-bold text-center">{{ $t('userSettings') }}</h4> <SiteTitle :title="$t('userSettings')" />
<div class="q-pa-md"> <div class="q-pa-md">
<div class="q-gutter-y-md"> <div class="q-gutter-y-md">
<q-card> <q-card>
@@ -35,6 +34,7 @@
import { ref } from 'vue'; import { ref } from 'vue';
import UserTable from 'src/vueLib/tables/users/UserTable.vue'; import UserTable from 'src/vueLib/tables/users/UserTable.vue';
import RoleTable from 'src/vueLib/tables/roles/RoleTable.vue'; import RoleTable from 'src/vueLib/tables/roles/RoleTable.vue';
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
const tab = ref('users'); const tab = ref('users');
</script> </script>

View File

@@ -25,12 +25,12 @@ const routes: RouteRecordRaw[] = [
}, },
{ {
path: 'responsible', path: 'responsible',
component: () => import('pages/ResponsibleTable.vue'), component: () => import('src/pages/ResponsibleTable.vue'),
meta: { requiresAuth: true, requiresAdmin: true }, meta: { requiresAuth: true, requiresAdmin: true },
}, },
{ {
path: 'group', path: 'group',
component: () => import('pages/GroupTable.vue'), component: () => import('src/pages/GroupTable.vue'),
meta: { requiresAuth: true, requiresAdmin: true }, meta: { requiresAuth: true, requiresAdmin: true },
}, },
{ {

View File

@@ -25,7 +25,7 @@
<q-separator color="black" /> <q-separator color="black" />
<!-- Content Slot --> <!-- Content Slot -->
<div class="scrollArea"> <div class="scrollArea" :style="'padding: ' + props.innerPadding + 'px'">
<slot /> <slot />
</div> </div>
@@ -48,6 +48,7 @@ const props = defineProps({
headerTitle: { type: String, default: '' }, headerTitle: { type: String, default: '' },
width: { type: Number, default: 400 }, width: { type: Number, default: 400 },
height: { type: Number, default: 250 }, height: { type: Number, default: 250 },
innerPadding: { type: Number, default: 16 },
}); });
// Fullscreen toggle // Fullscreen toggle
@@ -153,7 +154,6 @@ const cardStyle = computed(() => {
flex: 1 1 auto; flex: 1 1 auto;
min-height: 0; min-height: 0;
overflow-y: auto; overflow-y: auto;
padding: 16px;
} }
/* Resize handle in bottom right */ /* Resize handle in bottom right */

View File

@@ -0,0 +1,12 @@
<template>
<h4 class="text-primary text-bold text-center" :style="{ margin: props.marging + 'px' }">
{{ props.title }}
</h4>
</template>
<script setup lang="ts">
const props = defineProps({
title: { type: String },
marging: { type: Number, default: 28 },
});
</script>

View File

@@ -1,5 +1,4 @@
<template> <template>
<div class="q-pa-md">
<q-table <q-table
flat flat
bordered bordered
@@ -19,6 +18,7 @@
:selection="selectOption ? 'multiple' : 'none'" :selection="selectOption ? 'multiple' : 'none'"
v-model:selected="selected" v-model:selected="selected"
binary-state-sort binary-state-sort
dense
class="bigger-table-text" class="bigger-table-text"
> >
<template v-slot:top-left> <template v-slot:top-left>
@@ -91,7 +91,6 @@
</q-td> </q-td>
</template> </template>
</q-table> </q-table>
</div>
<DialogFrame ref="memberTableDialog" :header-title="$t('members')" :width="700" :height="500"> <DialogFrame ref="memberTableDialog" :header-title="$t('members')" :width="700" :height="500">
<MembersTable <MembersTable
add-attendees add-attendees

View File

@@ -1,5 +1,11 @@
<template> <template>
<DialogFrame ref="dialog" :header-title="$t('attendees')" :width="700" :height="600"> <DialogFrame
ref="dialog"
:header-title="$t('attendees')"
:width="700"
:height="600"
:inner-padding="0"
>
<q-card> <q-card>
<q-tabs <q-tabs
v-model="tab" v-model="tab"
@@ -17,10 +23,10 @@
<q-separator /> <q-separator />
<q-tab-panels v-model="tab" animated> <q-tab-panels v-model="tab" animated>
<q-tab-panel name="attendance"> <q-tab-panel name="attendance" style="padding: 0px">
<AttendeesTable :event="localEvent!" v-on:update="updateTable" /> <AttendeesTable :event="localEvent!" v-on:update="updateTable" />
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="noneAttendees"> <q-tab-panel name="noneAttendees" style="padding: 0px">
<MembersTable <MembersTable
add-attendees add-attendees
:compare-members="attendees" :compare-members="attendees"

View File

@@ -19,6 +19,7 @@
:selection="selectOption ? 'multiple' : 'none'" :selection="selectOption ? 'multiple' : 'none'"
v-model:selected="selected" v-model:selected="selected"
binary-state-sort binary-state-sort
dense
class="bigger-table-text" class="bigger-table-text"
> >
<template v-slot:top-left> <template v-slot:top-left>

View File

@@ -19,6 +19,7 @@
:selection="selectOption ? 'multiple' : 'none'" :selection="selectOption ? 'multiple' : 'none'"
v-model:selected="selected" v-model:selected="selected"
binary-state-sort binary-state-sort
dense
class="bigger-table-text" class="bigger-table-text"
> >
<template v-slot:top-left> <template v-slot:top-left>

View File

@@ -241,8 +241,9 @@ export function useMemberTable() {
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
//filter same members out so list is shorter //filter same members out so list is shorter
filteredMembers.value = allMembers.value;
if (filter) { if (filter) {
filteredMembers.value = allMembers.value.filter( filteredMembers.value = filteredMembers.value.filter(
(m1) => (m1) =>
!filter.some((m2) => { !filter.some((m2) => {
if (filterbyName) { if (filterbyName) {
@@ -256,7 +257,7 @@ export function useMemberTable() {
//second filter //second filter
const list = filterList.value ?? []; const list = filterList.value ?? [];
if (filterList.value && filterList.value.length > 0) { if (filterList.value && filterList.value.length > 0) {
filteredMembers.value = allMembers.value.filter((member) => filteredMembers.value = filteredMembers.value.filter((member) =>
list.every((filterItem) => { list.every((filterItem) => {
const keys = filterItem.keys ?? []; const keys = filterItem.keys ?? [];
if (keys.includes('null')) return true; if (keys.includes('null')) return true;

View File

@@ -1,5 +1,4 @@
<template> <template>
<div class="q-pa-md">
<q-table <q-table
flat flat
bordered bordered
@@ -19,8 +18,11 @@
:selection="selectOption ? 'multiple' : 'none'" :selection="selectOption ? 'multiple' : 'none'"
v-model:selected="selected" v-model:selected="selected"
binary-state-sort binary-state-sort
dense
class="bigger-table-text" class="bigger-table-text"
> >
<!-- top left of table-->
<template v-slot:top-left> <template v-slot:top-left>
<div> <div>
<q-btn-group push flat style="color: grey"> <q-btn-group push flat style="color: grey">
@@ -34,9 +36,7 @@
<q-tooltip>{{ $t('addNewMember') }}</q-tooltip> <q-tooltip>{{ $t('addNewMember') }}</q-tooltip>
</q-btn> </q-btn>
<q-btn <q-btn
v-if=" v-if="user.isPermittedTo('members', 'write') || user.isPermittedTo('members', 'delete')"
user.isPermittedTo('members', 'write') || user.isPermittedTo('members', 'delete')
"
dense dense
flat flat
style="color: grey" style="color: grey"
@@ -127,6 +127,9 @@
{{ $t('selected') }}: {{ selected.length }} {{ $t('selected') }}: {{ selected.length }}
</div> </div>
</template> </template>
<!-- top right of table-->
<template v-slot:top-right> <template v-slot:top-right>
<q-input filled dense debounce="300" v-model="filter" :placeholder="$t('search')"> <q-input filled dense debounce="300" v-model="filter" :placeholder="$t('search')">
<template v-slot:append> <template v-slot:append>
@@ -134,6 +137,9 @@
</template> </template>
</q-input> </q-input>
</template> </template>
<!-- table body content-->
<template v-slot:body-cell="props"> <template v-slot:body-cell="props">
<q-td <q-td
:props="props" :props="props"
@@ -160,6 +166,7 @@
<q-td :props="props"> <q-td :props="props">
<q-select <q-select
v-if="groups.length > 0" v-if="groups.length > 0"
dense
:readonly="!user.isPermittedTo('members', 'write')" :readonly="!user.isPermittedTo('members', 'write')"
:options="groups" :options="groups"
emit-value emit-value
@@ -174,6 +181,7 @@
<template v-slot:body-cell-responsiblePerson="props"> <template v-slot:body-cell-responsiblePerson="props">
<q-td :props="props"> <q-td :props="props">
<q-select <q-select
dense
v-if="responsibles.length > 0" v-if="responsibles.length > 0"
:readonly="!user.isPermittedTo('members', 'write')" :readonly="!user.isPermittedTo('members', 'write')"
:options="responsibles" :options="responsibles"
@@ -194,6 +202,7 @@
/> />
<q-menu v-if="openSubmenu" anchor="top right" self="top left"> <q-menu v-if="openSubmenu" anchor="top right" self="top left">
<q-item <q-item
dense
v-if="user.isPermittedTo('members', 'write')" v-if="user.isPermittedTo('members', 'write')"
clickable clickable
v-close-popup v-close-popup
@@ -207,6 +216,7 @@
!inProps.addAttendees && !inProps.addAttendees &&
!inProps.addResponsible !inProps.addResponsible
" "
dense
clickable clickable
v-close-popup v-close-popup
@click="openRemoveDialog(props.row)" @click="openRemoveDialog(props.row)"
@@ -218,7 +228,6 @@
</q-td> </q-td>
</template> </template>
</q-table> </q-table>
</div>
<EditOneDialog <EditOneDialog
ref="editOneDialog" ref="editOneDialog"
endpoint="members/edit" endpoint="members/edit"
@@ -228,6 +237,7 @@
<EditAllDialog <EditAllDialog
ref="editAllDialog" ref="editAllDialog"
:responsibles="responsibles" :responsibles="responsibles"
:group="groups"
v-on:update="updateMember" v-on:update="updateMember"
></EditAllDialog> ></EditAllDialog>
<OkDialog <OkDialog

View File

@@ -19,6 +19,7 @@
:selection="selectOption ? 'multiple' : 'none'" :selection="selectOption ? 'multiple' : 'none'"
v-model:selected="selected" v-model:selected="selected"
binary-state-sort binary-state-sort
dense
class="bigger-table-text" class="bigger-table-text"
> >
<template v-slot:top-left> <template v-slot:top-left>

View File

@@ -19,6 +19,7 @@
:selection="selectOption ? 'multiple' : 'none'" :selection="selectOption ? 'multiple' : 'none'"
v-model:selected="selected" v-model:selected="selected"
binary-state-sort binary-state-sort
dense
class="bigger-table-text" class="bigger-table-text"
> >
<template v-slot:top-left> <template v-slot:top-left>