8 Commits

Author SHA1 Message Date
Adrian Zürcher
b726eb42dc add filter so user can not change to admin if the have the right to change user rights 2026-02-14 13:43:21 +01:00
Adrian Zürcher
8963cba016 fix update role not working 2026-02-14 13:42:54 +01:00
Adrian Zürcher
73901335a3 new release
All checks were successful
Build Quasar SPA and Go Backend for memberApp / build-spa (push) Successful in 3m5s
Build Quasar SPA and Go Backend for memberApp / build-backend (amd64, .exe, windows) (push) Successful in 6m38s
Build Quasar SPA and Go Backend for memberApp / build-backend (amd64, , linux) (push) Successful in 6m47s
Build Quasar SPA and Go Backend for memberApp / build-backend (arm, 6, , linux) (push) Successful in 6m46s
Build Quasar SPA and Go Backend for memberApp / build-backend (arm64, , linux) (push) Successful in 6m41s
2026-02-13 20:40:21 +01:00
Adrian Zürcher
62aed501f3 fix not updating and hiding added memebers close #49 2026-02-13 20:39:16 +01:00
Adrian Zürcher
43d81dd27a commit forgotten file 2026-02-13 20:17:57 +01:00
Adrian Zürcher
ce654bbb6a fix language switching close #51 2026-02-13 20:16:17 +01:00
Adrian Zürcher
9b2b1d3ef7 fix responsible not showing close #50 2026-02-13 15:26:59 +01:00
Adrian Zürcher
f59443ce5a lift version 2026-02-13 13:10:25 +01:00
13 changed files with 173 additions and 14 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "lightcontrol",
"version": "1.3.0",
"version": "1.3.2",
"description": "A Tecamino App",
"productName": "Attendence Records",
"author": "A. Zuercher",

View File

@@ -170,3 +170,30 @@ week: Wuche
month: Monat
year: Jahr
appName: Applikationsname
calendar:
days:
- 'Suntig'
- 'Mäntig'
- 'Zistig'
- 'Mittwuch'
- 'Donstig'
- 'Fritig'
- 'Samstig'
daysShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
months:
- 'Januar'
- 'Februar'
- 'März'
- 'April'
- 'Mai'
- 'Juni'
- 'Juli'
- 'Ougust'
- 'Septämber'
- 'Oktober'
- 'Novämber'
- 'Dezämber'
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']
firstDayOfWeek: 1
format24h: true
pluralDay: 'Täg'

View File

@@ -170,3 +170,30 @@ week: Woche
month: Monat
year: Jahr
appName: Applikationsname
calendar:
days:
- 'Sonntag'
- 'Montag'
- 'Dienstag'
- 'Mittwoch'
- 'Donnerstag'
- 'Freitag'
- 'Samstag'
daysShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
months:
- 'Januar'
- 'Februar'
- 'März'
- 'April'
- 'Mai'
- 'Juni'
- 'Juli'
- 'August'
- 'September'
- 'Oktober'
- 'November'
- 'Dezember'
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']
firstDayOfWeek: 1
format24h: true
pluralDay: 'Tage'

View File

@@ -170,3 +170,30 @@ week: Week
month: Month
year: Year
appName: Applicationname
calendar:
days:
- 'Sunday'
- 'Monday'
- 'Tuesday'
- 'Wednesday'
- 'Thursday'
- 'Friday'
- 'Saturday'
daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat']
months:
- 'January'
- 'February'
- 'March'
- 'April'
- 'May'
- 'June'
- 'July'
- 'August'
- 'September'
- 'October'
- 'November'
- 'December'
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
firstDayOfWeek: 0
format24h: false
pluralDay: 'Days'

View File

@@ -170,3 +170,30 @@ week: Semana
month: Mes
year: Año
appName: Nombre de la aplicación
calendar:
days:
- 'Domingo'
- 'Lunes'
- 'Martes'
- 'Miércoles'
- 'Jueves'
- 'Viernes'
- 'Sábado'
daysShort: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb']
months:
- 'Enero'
- 'Febrero'
- 'Marzo'
- 'Abril'
- 'Mayo'
- 'Junio'
- 'Julio'
- 'Agosto'
- 'Septiembre'
- 'Octubre'
- 'Noviembre'
- 'Diciembre'
monthsShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']
firstDayOfWeek: 1
format24h: true
pluralDay: 'dias'

View File

@@ -31,16 +31,16 @@
</q-tabs>
</div>
<div class="row">
<q-date v-model="dateRange" range flat />
<q-date :locale="calendarLanguage" v-model="dateRange" range flat />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, watch, type PropType } from 'vue';
import { ref, onMounted, watch, type PropType, computed } from 'vue';
import { date } from 'quasar';
import { i18n } from 'src/boot/lang';
import type { QDateLocale } from 'src/vueLib/models/qDateLocale';
const props = defineProps({
title: String,
height: { type: Number, default: 400 },
@@ -74,6 +74,20 @@ const weekdayOptions = [
{ label: i18n.global.t('SundayShort'), value: 0 },
];
const calendarLanguage = computed(() => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const localeData = i18n.global.tm('calendar') as unknown as QDateLocale;
return {
days: localeData.days,
daysShort: localeData.daysShort,
months: localeData.months,
monthsShort: localeData.monthsShort,
firstDayOfWeek: localeData.firstDayOfWeek,
format24h: localeData.format24h,
pluralDay: localeData.pluralDay,
};
});
const onTabChange = (val: 'today' | 'week' | 'month' | 'year') => {
if (val) setRange(val);
// Optional: Reset tab to empty so user can click the same tab again later

View File

@@ -77,7 +77,7 @@
:label="$t('responsible')"
filled
:options="props.responsibles"
:option-label="(opt) => opt.firstName + ' ' + opt.lastName"
:option-label="(opt) => opt.member.firstName + ' ' + opt.member.lastName"
v-model="localMember.responsible"
></q-select>
<q-input

View File

@@ -30,6 +30,9 @@
class="col-5 required"
:label="$t('role')"
filled
option-label="role"
option-value="role"
emit-value
:options="props.roles"
:rules="[(val) => !!val || $t('roleIsRequired')]"
v-model="role"

View File

@@ -11,8 +11,15 @@
align="justify"
narrow-indicator
>
<q-tab name="users" no-caps :label="$t('users')" />
<q-tab name="roles" no-caps :label="$t('roles')" />
<q-tab name="users" icon="people" no-caps :label="$t('users')" />
<q-tab name="roles" icon="rule" no-caps :label="$t('roles')" />
<q-tab
v-if="user?.user?.role.role.includes('admin')"
name="workspaces"
icon="dashboard"
no-caps
:label="$t('workspaces')"
/>
</q-tabs>
<q-separator />
@@ -23,16 +30,24 @@
<q-tab-panel name="roles" style="padding: 0px">
<RoleTable />
</q-tab-panel>
<q-tab-panel name="workspaces" style="padding: 0px">
<RoleTable />
</q-tab-panel>
</q-tab-panels>
</q-card>
</div>
{{ user?.user?.role }}
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { onMounted, ref } from 'vue';
import UserTable from 'src/vueLib/tables/users/UserTable.vue';
import RoleTable from 'src/vueLib/tables/roles/RoleTable.vue';
import SiteTitle from 'src/vueLib/general/SiteTitle.vue';
import { useUserStore } from 'src/vueLib/login/userStore';
import type { UserState } from 'src/vueLib/models/user';
const tab = ref('users');
const user = ref<UserState>();
onMounted(() => (user.value = useUserStore()));
</script>

View File

@@ -0,0 +1,9 @@
export interface QDateLocale {
days: string[];
daysShort: string[];
months: string[];
monthsShort: string[];
firstDayOfWeek: number;
format24h: boolean;
pluralDay: string;
}

View File

@@ -6,6 +6,7 @@ export interface User {
user: string;
email: string;
role?: Role;
roleId?: number;
expiration?: string;
password?: string;
newPassword?: string;

View File

@@ -307,8 +307,11 @@ onMounted(() => {
});
});
async function updateTable() {
async function updateTable(add?: Members) {
localCompareMembers.value = inProps.compareMembers;
if (add) {
localCompareMembers.value?.push(...add);
}
await updateMembers(localCompareMembers.value, inProps.addResponsible).catch((err) =>
NotifyResponse(err, 'error'),
);
@@ -452,15 +455,15 @@ async function addMemberTo() {
})
.catch((err) => {
NotifyResponse(err, 'error');
})
.finally(() => (selected.value = []));
});
if (inProps.addAttendees) {
await updateMemberLastVisit(selected.value);
} else {
await updateTable();
await updateTable(selected.value);
emit('update-event', filteredMembers.value.length);
}
selected.value = [];
}
async function updateMemberLastVisit(members: Members) {

View File

@@ -148,7 +148,7 @@
query-id
v-on:update="(val) => updateUser(val)"
></EditOneDialog>
<EditAllDialog ref="editAllDialog" :roles="localRoles" v-on:update="updateUsers"></EditAllDialog>
<EditAllDialog ref="editAllDialog" :roles="roles" v-on:update="updateUsers"></EditAllDialog>
<OkDialog
ref="okDialog"
:dialog-label="$t('delete')"
@@ -184,7 +184,10 @@ const editAllDialog = ref();
const okDialog = ref();
const deleteText = ref('');
const localRoles = computed(() => {
return roles.value.map((role) => role.role);
return roles.value.filter((role) => {
if (user.user?.role.role.includes('admin') || !user.user?.role.role.includes('admin'))
return role;
});
});
const selectOption = ref(false);
const selected = ref<Users>([]);
@@ -272,6 +275,9 @@ function removeUser(...removeUsers: Users) {
// update role select
function updateUser(user: User) {
if (user.role?.id) {
user.roleId = user.role?.id;
}
appApi
.post('/users/update', user)
.then(() => NotifyResponse(i18n.global.t('userUpdated')))