Merge pull request 'feature/#59-System-naming' (#68) from feature/#59-System-naming into develop

Reviewed-on: #68
This commit is contained in:
Julian Krauser 2025-02-15 10:56:37 +00:00
commit 8de919cbab
146 changed files with 632 additions and 526 deletions

View file

@ -12,8 +12,10 @@
:disableSubLink="true" :disableSubLink="true"
/> />
<TopLevelLink <TopLevelLink
v-else-if="routeName == 'account' || routeName.includes('account-') || routeName == 'docs' || routeName.includes('docs-')" v-else-if="
:link="{ key: 'club', title: 'Zur Verwaltung', levelDefault: '' }" routeName == 'account' || routeName.includes('account-') || routeName == 'docs' || routeName.includes('docs-')
"
:link="{ key: 'club', title: 'Zur Admin Oberfläche', levelDefault: '' }"
:disableSubLink="true" :disableSubLink="true"
/> />
</div> </div>

View file

@ -2,7 +2,9 @@
<header class="flex flex-row h-16 min-h-16 justify-between p-3 md:px-5 bg-white shadow-sm"> <header class="flex flex-row h-16 min-h-16 justify-between p-3 md:px-5 bg-white shadow-sm">
<RouterLink to="/" class="flex flex-row gap-2 align-bottom w-fit h-full"> <RouterLink to="/" class="flex flex-row gap-2 align-bottom w-fit h-full">
<img src="/Logo.png" alt="LOGO" class="h-full w-auto" /> <img src="/Logo.png" alt="LOGO" class="h-full w-auto" />
<h1 v-if="false" class="font-bold text-3xl w-fit whitespace-nowrap">{{config.app_name_overwrite || "FF Admin"}}</h1> <h1 v-if="false" class="font-bold text-3xl w-fit whitespace-nowrap">
{{ config.app_name_overwrite || "FF Admin" }}
</h1>
</RouterLink> </RouterLink>
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
<div v-if="authCheck" class="hidden md:flex flex-row gap-2 h-full align-middle"> <div v-if="authCheck" class="hidden md:flex flex-row gap-2 h-full align-middle">
@ -13,8 +15,13 @@
:link="item" :link="item"
/> />
<TopLevelLink <TopLevelLink
v-else-if="routeName == 'account' || routeName.includes('account-') || routeName == 'docs' || routeName.includes('docs-')" v-else-if="
:link="{ key: 'club', title: 'Zur Verwaltung', levelDefault: '' }" routeName == 'account' ||
routeName.includes('account-') ||
routeName == 'docs' ||
routeName.includes('docs-')
"
:link="{ key: 'club', title: 'Zur Admin Oberfläche', levelDefault: '' }"
:disable-sub-link="true" :disable-sub-link="true"
/> />
</div> </div>
@ -30,7 +37,7 @@ import { useAuthStore } from "@/stores/auth";
import { useNavigationStore } from "@/stores/admin/navigation"; import { useNavigationStore } from "@/stores/admin/navigation";
import TopLevelLink from "./admin/TopLevelLink.vue"; import TopLevelLink from "./admin/TopLevelLink.vue";
import UserMenu from "./UserMenu.vue"; import UserMenu from "./UserMenu.vue";
import { config } from "@/config" import { config } from "@/config";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -73,11 +73,7 @@
<br /> <br />
<TextCopy :copyText="generatedLink" /> <TextCopy :copyText="generatedLink" />
<div v-if="selectedTypes.length != 0" class="flex flex-row gap-2 items-center"> <div v-if="selectedTypes.length != 0" class="flex flex-row gap-2 items-center">
<input <input type="checkbox" id="nscdr" v-model="provideNSCDR" />
type="checkbox"
id="nscdr"
v-model="provideNSCDR"
/>
<label for="nscdr">Standard-Typen trotz Auswahl ausliefern</label> <label for="nscdr">Standard-Typen trotz Auswahl ausliefern</label>
</div> </div>
<br /> <br />
@ -105,8 +101,8 @@ import { defineComponent } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/configuration/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import TextCopy from "@/components/TextCopy.vue"; import TextCopy from "@/components/TextCopy.vue";
@ -119,7 +115,7 @@ export default defineComponent({
data() { data() {
return { return {
selectedTypes: [] as Array<CalendarTypeViewModel>, selectedTypes: [] as Array<CalendarTypeViewModel>,
provideNSCDR: false as boolean provideNSCDR: false as boolean,
}; };
}, },
computed: { computed: {
@ -133,7 +129,7 @@ export default defineComponent({
}, },
generatedLink() { generatedLink() {
let extend = this.selectedTypes.map((t) => [t.type, t.passphrase].filter((at) => at).join(":")); let extend = this.selectedTypes.map((t) => [t.type, t.passphrase].filter((at) => at).join(":"));
return `webcal://${host || window.location.host}/api/public/calendar${extend.length == 0 ? "" : "?types=" + extend.join("&types=")}${this.provideNSCDR && extend.length != 0 ? '&nscdr=true':''}`; return `webcal://${host || window.location.host}/api/public/calendar${extend.length == 0 ? "" : "?types=" + extend.join("&types=")}${this.provideNSCDR && extend.length != 0 ? "&nscdr=true" : ""}`;
}, },
}, },
mounted() { mounted() {

View file

@ -166,8 +166,8 @@ import { useCalendarStore } from "@/stores/admin/club/calendar";
import type { CreateCalendarViewModel } from "@/viewmodels/admin/club/calendar.models"; import type { CreateCalendarViewModel } from "@/viewmodels/admin/club/calendar.models";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/configuration/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -189,8 +189,8 @@ import type {
} from "@/viewmodels/admin/club/calendar.models"; } from "@/viewmodels/admin/club/calendar.models";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon, TrashIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon, TrashIcon } from "@heroicons/vue/20/solid";
import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/configuration/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models";
import cloneDeep from "lodash.clonedeep"; import cloneDeep from "lodash.clonedeep";
import isEqual from "lodash.isequal"; import isEqual from "lodash.isequal";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";

View file

@ -101,8 +101,8 @@ import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } f
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useMemberStore } from "@/stores/admin/club/member/member"; import { useMemberStore } from "@/stores/admin/club/member/member";
import type { CreateMemberViewModel } from "@/viewmodels/admin/club/member/member.models"; import type { CreateMemberViewModel } from "@/viewmodels/admin/club/member/member.models";
import { useSalutationStore } from "../../../../stores/admin/settings/salutation"; import { useSalutationStore } from "../../../../stores/admin/configuration/salutation";
import type { SalutationViewModel } from "../../../../viewmodels/admin/settings/salutation.models"; import type { SalutationViewModel } from "../../../../viewmodels/admin/configuration/salutation.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -97,12 +97,12 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models";
import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models"; import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models";
import { useMembershipStore } from "@/stores/admin/club/member/membership"; import { useMembershipStore } from "@/stores/admin/club/member/membership";
import { useAwardStore } from "@/stores/admin/settings/award"; import { useAwardStore } from "@/stores/admin/configuration/award";
import type { AwardViewModel } from "@/viewmodels/admin/settings/award.models"; import type { AwardViewModel } from "@/viewmodels/admin/configuration/award.models";
import type { CreateMemberAwardViewModel } from "@/viewmodels/admin/club/member/memberAward.models"; import type { CreateMemberAwardViewModel } from "@/viewmodels/admin/club/member/memberAward.models";
import { useMemberAwardStore } from "@/stores/admin/club/member/memberAward"; import { useMemberAwardStore } from "@/stores/admin/club/member/memberAward";
</script> </script>

View file

@ -100,7 +100,7 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useAwardStore } from "@/stores/admin/settings/award"; import { useAwardStore } from "@/stores/admin/configuration/award";
import type { import type {
CreateMemberAwardViewModel, CreateMemberAwardViewModel,
MemberAwardViewModel, MemberAwardViewModel,

View file

@ -131,8 +131,8 @@ import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } f
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useCommunicationStore } from "@/stores/admin/club/member/communication"; import { useCommunicationStore } from "@/stores/admin/club/member/communication";
import type { CreateCommunicationViewModel } from "@/viewmodels/admin/club/member/communication.models"; import type { CreateCommunicationViewModel } from "@/viewmodels/admin/club/member/communication.models";
import { useCommunicationTypeStore } from "@/stores/admin/settings/communicationType"; import { useCommunicationTypeStore } from "@/stores/admin/configuration/communicationType";
import type { CommunicationTypeViewModel } from "@/viewmodels/admin/settings/communicationType.models"; import type { CommunicationTypeViewModel } from "@/viewmodels/admin/configuration/communicationType.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -99,12 +99,12 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models";
import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models"; import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models";
import { useMembershipStore } from "@/stores/admin/club/member/membership"; import { useMembershipStore } from "@/stores/admin/club/member/membership";
import { useExecutivePositionStore } from "@/stores/admin/settings/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/configuration/executivePosition";
import type { ExecutivePositionViewModel } from "@/viewmodels/admin/settings/executivePosition.models"; import type { ExecutivePositionViewModel } from "@/viewmodels/admin/configuration/executivePosition.models";
import type { CreateMemberExecutivePositionViewModel } from "@/viewmodels/admin/club/member/memberExecutivePosition.models"; import type { CreateMemberExecutivePositionViewModel } from "@/viewmodels/admin/club/member/memberExecutivePosition.models";
import { useMemberExecutivePositionStore } from "@/stores/admin/club/member/memberExecutivePosition"; import { useMemberExecutivePositionStore } from "@/stores/admin/club/member/memberExecutivePosition";
</script> </script>

View file

@ -106,7 +106,7 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useExecutivePositionStore } from "@/stores/admin/settings/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/configuration/executivePosition";
import type { import type {
CreateMemberExecutivePositionViewModel, CreateMemberExecutivePositionViewModel,
MemberExecutivePositionViewModel, MemberExecutivePositionViewModel,

View file

@ -106,12 +106,12 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models";
import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models"; import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models";
import { useMembershipStore } from "@/stores/admin/club/member/membership"; import { useMembershipStore } from "@/stores/admin/club/member/membership";
import { useQualificationStore } from "@/stores/admin/settings/qualification"; import { useQualificationStore } from "@/stores/admin/configuration/qualification";
import type { QualificationViewModel } from "@/viewmodels/admin/settings/qualification.models"; import type { QualificationViewModel } from "@/viewmodels/admin/configuration/qualification.models";
import type { CreateMemberQualificationViewModel } from "@/viewmodels/admin/club/member/memberQualification.models"; import type { CreateMemberQualificationViewModel } from "@/viewmodels/admin/club/member/memberQualification.models";
import { useMemberQualificationStore } from "@/stores/admin/club/member/memberQualification"; import { useMemberQualificationStore } from "@/stores/admin/club/member/memberQualification";
</script> </script>

View file

@ -41,7 +41,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useQualificationStore } from "@/stores/admin/settings/qualification"; import { useQualificationStore } from "@/stores/admin/configuration/qualification";
import { useMemberQualificationStore } from "@/stores/admin/club/member/memberQualification"; import { useMemberQualificationStore } from "@/stores/admin/club/member/memberQualification";
</script> </script>

View file

@ -107,7 +107,7 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useQualificationStore } from "@/stores/admin/settings/qualification"; import { useQualificationStore } from "@/stores/admin/configuration/qualification";
import type { import type {
CreateMemberQualificationViewModel, CreateMemberQualificationViewModel,
MemberQualificationViewModel, MemberQualificationViewModel,

View file

@ -94,8 +94,8 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models";
import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models"; import type { CreateMembershipViewModel } from "@/viewmodels/admin/club/member/membership.models";
import { useMembershipStore } from "@/stores/admin/club/member/membership"; import { useMembershipStore } from "@/stores/admin/club/member/membership";
</script> </script>

View file

@ -103,7 +103,7 @@ import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
import type { import type {
CreateMembershipViewModel, CreateMembershipViewModel,
MembershipViewModel, MembershipViewModel,

View file

@ -4,12 +4,12 @@
<p>{{ award.award }}</p> <p>{{ award.award }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'award')" v-if="can('update', 'configuration', 'award')"
:to="{ name: 'admin-settings-award-edit', params: { id: award.id } }" :to="{ name: 'admin-configuration-award-edit', params: { id: award.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'award')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'award')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -23,7 +23,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { AwardViewModel } from "@/viewmodels/admin/settings/award.models"; import type { AwardViewModel } from "@/viewmodels/admin/configuration/award.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -38,7 +38,7 @@ export default defineComponent({
...mapActions(useModalStore, ["openModal"]), ...mapActions(useModalStore, ["openModal"]),
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/settings/award/DeleteAwardModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/configuration/award/DeleteAwardModal.vue"))),
this.award.id this.award.id
); );
}, },

View file

@ -34,8 +34,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useAwardStore } from "@/stores/admin/settings/award"; import { useAwardStore } from "@/stores/admin/configuration/award";
import type { CreateAwardViewModel } from "@/viewmodels/admin/settings/award.models"; import type { CreateAwardViewModel } from "@/viewmodels/admin/configuration/award.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,8 +31,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
import { useAwardStore } from "@/stores/admin/settings/award"; import { useAwardStore } from "@/stores/admin/configuration/award";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -11,12 +11,12 @@
</div> </div>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'calendar_type')" v-if="can('update', 'configuration', 'calendar_type')"
:to="{ name: 'admin-settings-calendar_type-edit', params: { id: calendarType.id } }" :to="{ name: 'admin-configuration-calendar_type-edit', params: { id: calendarType.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'calendar_type')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'calendar_type')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -30,7 +30,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon, EyeIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon, EyeIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -46,7 +46,9 @@ export default defineComponent({
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent(() => import("@/components/admin/settings/calendarType/DeleteCalendarTypeModal.vue")) defineAsyncComponent(
() => import("@/components/admin/configuration/calendarType/DeleteCalendarTypeModal.vue")
)
), ),
this.calendarType.id this.calendarType.id
); );

View file

@ -47,8 +47,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/configuration/calendarType";
import type { CreateCalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models"; import type { CreateCalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,7 +31,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/configuration/calendarType";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,12 +4,12 @@
<p>{{ communicationType.type }}</p> <p>{{ communicationType.type }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'communication_type')" v-if="can('update', 'configuration', 'communication_type')"
:to="{ name: 'admin-settings-communication_type-edit', params: { id: communicationType.id } }" :to="{ name: 'admin-configuration-communication_type-edit', params: { id: communicationType.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'communication_type')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'communication_type')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -33,7 +33,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { CommunicationTypeViewModel } from "@/viewmodels/admin/settings/communicationType.models"; import type { CommunicationTypeViewModel } from "@/viewmodels/admin/configuration/communicationType.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -50,7 +50,7 @@ export default defineComponent({
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent( defineAsyncComponent(
() => import("@/components/admin/settings/communicationType/DeleteCommunicationTypeModal.vue") () => import("@/components/admin/configuration/communicationType/DeleteCommunicationTypeModal.vue")
) )
), ),
this.communicationType.id this.communicationType.id

View file

@ -80,8 +80,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useCommunicationTypeStore } from "@/stores/admin/settings/communicationType"; import { useCommunicationTypeStore } from "@/stores/admin/configuration/communicationType";
import type { CreateCommunicationTypeViewModel } from "@/viewmodels/admin/settings/communicationType.models"; import type { CreateCommunicationTypeViewModel } from "@/viewmodels/admin/configuration/communicationType.models";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import type { CommunicationFieldType } from "@/types/fieldTypes"; import type { CommunicationFieldType } from "@/types/fieldTypes";

View file

@ -31,7 +31,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useCommunicationTypeStore } from "@/stores/admin/settings/communicationType"; import { useCommunicationTypeStore } from "@/stores/admin/configuration/communicationType";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -34,8 +34,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useExecutivePositionStore } from "@/stores/admin/settings/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/configuration/executivePosition";
import type { CreateExecutivePositionViewModel } from "@/viewmodels/admin/settings/executivePosition.models"; import type { CreateExecutivePositionViewModel } from "@/viewmodels/admin/configuration/executivePosition.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,8 +31,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
import { useExecutivePositionStore } from "@/stores/admin/settings/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/configuration/executivePosition";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,12 +4,12 @@
<p>{{ executivePosition.position }}</p> <p>{{ executivePosition.position }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'executive_position')" v-if="can('update', 'configuration', 'executive_position')"
:to="{ name: 'admin-settings-executive_position-edit', params: { id: executivePosition.id } }" :to="{ name: 'admin-configuration-executive_position-edit', params: { id: executivePosition.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'executive_position')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'executive_position')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -23,7 +23,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { ExecutivePositionViewModel } from "@/viewmodels/admin/settings/executivePosition.models"; import type { ExecutivePositionViewModel } from "@/viewmodels/admin/configuration/executivePosition.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -40,7 +40,7 @@ export default defineComponent({
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent( defineAsyncComponent(
() => import("@/components/admin/settings/executivePosition/DeleteExecutivePositionModal.vue") () => import("@/components/admin/configuration/executivePosition/DeleteExecutivePositionModal.vue")
) )
), ),
this.executivePosition.id this.executivePosition.id

View file

@ -34,8 +34,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
import type { CreateMembershipStatusViewModel } from "@/viewmodels/admin/settings/membershipStatus.models"; import type { CreateMembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,8 +31,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,12 +4,12 @@
<p>{{ membershipStatus.status }}</p> <p>{{ membershipStatus.status }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'membership_status')" v-if="can('update', 'configuration', 'membership_status')"
:to="{ name: 'admin-settings-membership_status-edit', params: { id: membershipStatus.id } }" :to="{ name: 'admin-configuration-membership_status-edit', params: { id: membershipStatus.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'membership_status')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'membership_status')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -23,7 +23,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -40,7 +40,7 @@ export default defineComponent({
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent( defineAsyncComponent(
() => import("@/components/admin/settings/membershipStatus/DeleteMembershipStatusModal.vue") () => import("@/components/admin/configuration/membershipStatus/DeleteMembershipStatusModal.vue")
) )
), ),
this.membershipStatus.id this.membershipStatus.id

View file

@ -2,7 +2,7 @@
<form ref="form" class="flex flex-col h-fit w-full border border-primary rounded-md" @submit.prevent="updateUsage"> <form ref="form" class="flex flex-col h-fit w-full border border-primary rounded-md" @submit.prevent="updateUsage">
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center"> <div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
<p>Newsletter bei Type "{{ comType.type }}" versenden/exportieren als</p> <p>Newsletter bei Type "{{ comType.type }}" versenden/exportieren als</p>
<div v-if="can('create','settings','newsletter_config')" class="flex flex-row justify-end w-16"> <div v-if="can('create', 'configuration', 'newsletter_config')" class="flex flex-row justify-end w-16">
<button v-if="status == null" type="submit" class="!p-0 !h-fit !w-fit" title="speichern"> <button v-if="status == null" type="submit" class="!p-0 !h-fit !w-fit" title="speichern">
<ArchiveBoxArrowDownIcon class="w-5 h-5 p-1 box-content pointer-events-none" /> <ArchiveBoxArrowDownIcon class="w-5 h-5 p-1 box-content pointer-events-none" />
</button> </button>
@ -18,7 +18,9 @@
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
<select ref="config" id="config" :value="newsletterConfig?.config ?? 'def'"> <select ref="config" id="config" :value="newsletterConfig?.config ?? 'def'">
<option value="def">Standard (pdf nur mit Name)</option> <option value="def">Standard (pdf nur mit Name)</option>
<option v-for="config in configs" :key="config" :value="config">{{ config == "pdf" ? "pdf mit Adresse":config }}</option> <option v-for="config in configs" :key="config" :value="config">
{{ config == "pdf" ? "pdf mit Adresse" : config }}
</option>
</select> </select>
</div> </div>
</div> </div>
@ -29,14 +31,14 @@
import { defineComponent, type PropType } from "vue"; import { defineComponent, type PropType } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { ArchiveBoxArrowDownIcon, ArchiveBoxXMarkIcon } from "@heroicons/vue/24/outline"; import { ArchiveBoxArrowDownIcon, ArchiveBoxXMarkIcon } from "@heroicons/vue/24/outline";
import { useNewsletterConfigStore } from "@/stores/admin/settings/newsletterConfig"; import { useNewsletterConfigStore } from "@/stores/admin/configuration/newsletterConfig";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import { NewsletterConfigType } from "@/enums/newsletterConfigType"; import { NewsletterConfigType } from "@/enums/newsletterConfigType";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";
import type { CommunicationTypeViewModel } from "@/viewmodels/admin/settings/communicationType.models"; import type { CommunicationTypeViewModel } from "@/viewmodels/admin/configuration/communicationType.models";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
</script> </script>
@ -52,12 +54,12 @@ export default defineComponent({
configs: [] as Array<string>, configs: [] as Array<string>,
}; };
}, },
computed:{ computed: {
...mapState(useNewsletterConfigStore, ["config"]), ...mapState(useNewsletterConfigStore, ["config"]),
...mapState(useAbilityStore, ["can"]), ...mapState(useAbilityStore, ["can"]),
newsletterConfig() { newsletterConfig() {
return this.config.find(c => c.comTypeId == this.comType.id) return this.config.find((c) => c.comTypeId == this.comType.id);
} },
}, },
mounted() { mounted() {
this.configs = Object.values(NewsletterConfigType); this.configs = Object.values(NewsletterConfigType);
@ -74,25 +76,26 @@ export default defineComponent({
const fromData = e.target.elements; const fromData = e.target.elements;
const config = fromData.config.value === "def" ? null : fromData.config.value; const config = fromData.config.value === "def" ? null : fromData.config.value;
this.status = "loading" this.status = "loading";
let request: Promise<AxiosResponse<any, any>> let request: Promise<AxiosResponse<any, any>>;
if(config){ if (config) {
request = this.setNewsletterConfig({ request = this.setNewsletterConfig({
comTypeId: this.comType.id, comTypeId: this.comType.id,
config: config config: config,
}) });
} else { } else {
request = this.deleteNewsletterConfig(this.comType.id) request = this.deleteNewsletterConfig(this.comType.id);
} }
request.then(() => { request
this.status = { status: "success" }; .then(() => {
this.timeout = setTimeout(() => { this.status = { status: "success" };
this.status = null; this.timeout = setTimeout(() => {
}, 2000); this.status = null;
}) }, 2000);
.catch(() => { })
this.status = { status: "failed" }; .catch(() => {
}); this.status = { status: "failed" };
});
}, },
resetForm() { resetForm() {
(this.$refs.config as HTMLSelectElement).value = String(this.newsletterConfig?.config ?? "def"); (this.$refs.config as HTMLSelectElement).value = String(this.newsletterConfig?.config ?? "def");

View file

@ -38,8 +38,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useQualificationStore } from "@/stores/admin/settings/qualification"; import { useQualificationStore } from "@/stores/admin/configuration/qualification";
import type { CreateQualificationViewModel } from "@/viewmodels/admin/settings/qualification.models"; import type { CreateQualificationViewModel } from "@/viewmodels/admin/configuration/qualification.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,8 +31,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
import { useQualificationStore } from "@/stores/admin/settings/qualification"; import { useQualificationStore } from "@/stores/admin/configuration/qualification";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,12 +4,12 @@
<p>{{ qualification.qualification }}</p> <p>{{ qualification.qualification }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'qualification')" v-if="can('update', 'configuration', 'qualification')"
:to="{ name: 'admin-settings-qualification-edit', params: { id: qualification.id } }" :to="{ name: 'admin-configuration-qualification-edit', params: { id: qualification.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'qualification')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'qualification')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -29,7 +29,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { QualificationViewModel } from "@/viewmodels/admin/settings/qualification.models"; import type { QualificationViewModel } from "@/viewmodels/admin/configuration/qualification.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -45,7 +45,9 @@ export default defineComponent({
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent(() => import("@/components/admin/settings/qualification/DeleteQualificationModal.vue")) defineAsyncComponent(
() => import("@/components/admin/configuration/qualification/DeleteQualificationModal.vue")
)
), ),
this.qualification.id this.qualification.id
); );

View file

@ -34,8 +34,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useQueryStoreStore } from "@/stores/admin/settings/queryStore"; import { useQueryStoreStore } from "@/stores/admin/configuration/queryStore";
import type { CreateQueryViewModel } from "@/viewmodels/admin/settings/query.models"; import type { CreateQueryViewModel } from "@/viewmodels/admin/configuration/query.models";
import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder"; import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder";
</script> </script>

View file

@ -31,7 +31,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useQueryStoreStore } from "@/stores/admin/settings/queryStore"; import { useQueryStoreStore } from "@/stores/admin/configuration/queryStore";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -6,10 +6,10 @@
<div @click="loadUpdate"> <div @click="loadUpdate">
<EyeIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <EyeIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
<div v-if="can('update', 'settings', 'query_store')" @click="loadUpdate"> <div v-if="can('update', 'configuration', 'query_store')" @click="loadUpdate">
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
<div v-if="can('delete', 'settings', 'query_store')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'query_store')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -23,7 +23,7 @@ import { mapState, mapActions, mapWritableState } from "pinia";
import { EyeIcon, PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { EyeIcon, PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { QueryViewModel } from "@/viewmodels/admin/settings/query.models"; import type { QueryViewModel } from "@/viewmodels/admin/configuration/query.models";
import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder"; import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder";
</script> </script>
@ -45,7 +45,9 @@ export default defineComponent({
}, },
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/settings/queryStore/DeleteQueryStoreModal.vue"))), markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/queryStore/DeleteQueryStoreModal.vue"))
),
this.queryItem.id this.queryItem.id
); );
}, },

View file

@ -36,8 +36,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useQueryStoreStore } from "@/stores/admin/settings/queryStore"; import { useQueryStoreStore } from "@/stores/admin/configuration/queryStore";
import type { CreateQueryViewModel, UpdateQueryViewModel } from "@/viewmodels/admin/settings/query.models"; import type { CreateQueryViewModel, UpdateQueryViewModel } from "@/viewmodels/admin/configuration/query.models";
import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder"; import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder";
</script> </script>
@ -67,7 +67,9 @@ export default defineComponent({
...mapActions(useQueryStoreStore, ["updateActiveQueryStore"]), ...mapActions(useQueryStoreStore, ["updateActiveQueryStore"]),
changeToCreate() { changeToCreate() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/settings/queryStore/CreateQueryStoreModal.vue"))) markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/queryStore/CreateQueryStoreModal.vue"))
)
); );
}, },
triggerUpdate() { triggerUpdate() {

View file

@ -34,8 +34,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useSalutationStore } from "@/stores/admin/settings/salutation"; import { useSalutationStore } from "@/stores/admin/configuration/salutation";
import type { CreateSalutationViewModel } from "@/viewmodels/admin/settings/salutation.models"; import type { CreateSalutationViewModel } from "@/viewmodels/admin/configuration/salutation.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,8 +31,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
import { useSalutationStore } from "@/stores/admin/settings/salutation"; import { useSalutationStore } from "@/stores/admin/configuration/salutation";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,12 +4,12 @@
<p>{{ salutation.salutation }}</p> <p>{{ salutation.salutation }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'salutation')" v-if="can('update', 'configuration', 'salutation')"
:to="{ name: 'admin-settings-salutation-edit', params: { id: salutation.id } }" :to="{ name: 'admin-configuration-salutation-edit', params: { id: salutation.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'settings', 'salutation')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'salutation')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -23,7 +23,7 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { SalutationViewModel } from "@/viewmodels/admin/settings/salutation.models"; import type { SalutationViewModel } from "@/viewmodels/admin/configuration/salutation.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -38,7 +38,9 @@ export default defineComponent({
...mapActions(useModalStore, ["openModal"]), ...mapActions(useModalStore, ["openModal"]),
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/settings/salutation/DeleteSalutationModal.vue"))), markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/salutation/DeleteSalutationModal.vue"))
),
this.salutation.id this.salutation.id
); );
}, },

View file

@ -38,8 +38,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useTemplateStore } from "@/stores/admin/settings/template"; import { useTemplateStore } from "@/stores/admin/configuration/template";
import type { CreateTemplateViewModel } from "@/viewmodels/admin/settings/template.models"; import type { CreateTemplateViewModel } from "@/viewmodels/admin/configuration/template.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -70,7 +70,7 @@ export default defineComponent({
this.status = { status: "success" }; this.status = { status: "success" };
this.timeout = setTimeout(() => { this.timeout = setTimeout(() => {
this.closeModal(); this.closeModal();
this.$router.push({ name: "admin-settings-template-edit", params: { id: res.data } }); this.$router.push({ name: "admin-configuration-template-edit", params: { id: res.data } });
}, 1500); }, 1500);
}) })
.catch(() => { .catch(() => {

View file

@ -31,8 +31,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useQueryStoreStore } from "@/stores/admin/settings/queryStore"; import { useQueryStoreStore } from "@/stores/admin/configuration/queryStore";
import { useTemplateStore } from "@/stores/admin/settings/template"; import { useTemplateStore } from "@/stores/admin/configuration/template";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,18 +4,18 @@
<p>{{ template.template }}</p> <p>{{ template.template }}</p>
<div class="flex flex-row justify-end w-24"> <div class="flex flex-row justify-end w-24">
<RouterLink <RouterLink
v-if="can('update', 'settings', 'template')" v-if="can('update', 'configuration', 'template')"
:to="{ name: 'admin-settings-template-edit', params: { id: template.id } }" :to="{ name: 'admin-configuration-template-edit', params: { id: template.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<button v-if="status == null" class="!p-0 !h-fit !w-fit" title="duplizieren" @click="cloneElement"> <button v-if="status == null" class="!p-0 !h-fit !w-fit" title="duplizieren" @click="cloneElement">
<DocumentDuplicateIcon class="w-5 h-5 p-1 box-content pointer-events-none" /> <DocumentDuplicateIcon class="w-5 h-5 p-1 box-content pointer-events-none" />
</button> </button>
<Spinner v-else-if="status == 'loading'" class="my-auto" /> <Spinner v-else-if="status == 'loading'" class="my-auto" />
<SuccessCheckmark v-else-if="status?.status == 'success'" /> <SuccessCheckmark v-else-if="status?.status == 'success'" />
<FailureXMark v-else-if="status?.status == 'failed'" /> <FailureXMark v-else-if="status?.status == 'failed'" />
<div v-if="can('delete', 'settings', 'template')" @click="openDeleteModal"> <div v-if="can('delete', 'configuration', 'template')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -35,8 +35,8 @@ import { mapState, mapActions } from "pinia";
import { PencilIcon, TrashIcon, DocumentDuplicateIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, TrashIcon, DocumentDuplicateIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import type { TemplateViewModel } from "@/viewmodels/admin/settings/template.models"; import type { TemplateViewModel } from "@/viewmodels/admin/configuration/template.models";
import { useTemplateStore } from "@/stores/admin/settings/template"; import { useTemplateStore } from "@/stores/admin/configuration/template";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
@ -63,26 +63,28 @@ export default defineComponent({
}, },
methods: { methods: {
...mapActions(useModalStore, ["openModal"]), ...mapActions(useModalStore, ["openModal"]),
...mapActions(useTemplateStore,["cloneTemplate"]), ...mapActions(useTemplateStore, ["cloneTemplate"]),
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/settings/template/DeleteTemplateModal.vue"))), markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/template/DeleteTemplateModal.vue"))
),
this.template.id this.template.id
); );
}, },
cloneElement(){ cloneElement() {
this.cloneTemplate(this.template.id) this.cloneTemplate(this.template.id)
.then((res) => { .then((res) => {
this.status = { status: "success" }; this.status = { status: "success" };
this.timeout = setTimeout(() => { this.timeout = setTimeout(() => {
this.status = null; this.status = null;
this.$router.push({ name: "admin-settings-template-edit", params: { id: res.data } }); this.$router.push({ name: "admin-configuration-template-edit", params: { id: res.data } });
}, 2000); }, 2000);
}) })
.catch(() => { .catch(() => {
this.status = { status: "failed" }; this.status = { status: "failed" };
}); });
} },
}, },
}); });
</script> </script>

View file

@ -14,7 +14,7 @@ import { defineComponent } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import { useTemplateUsageStore } from "@/stores/admin/settings/templateUsage"; import { useTemplateUsageStore } from "@/stores/admin/configuration/templateUsage";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -22,7 +22,7 @@ export default defineComponent({
data() { data() {
return { return {
status: null as null | "loading" | { status: "success" | "failed"; reason?: string }, status: null as null | "loading" | { status: "success" | "failed"; reason?: string },
} };
}, },
computed: { computed: {
...mapState(useModalStore, ["data"]), ...mapState(useModalStore, ["data"]),
@ -34,7 +34,7 @@ export default defineComponent({
...mapActions(useModalStore, ["closeModal"]), ...mapActions(useModalStore, ["closeModal"]),
...mapActions(useTemplateUsageStore, ["previewTemplateUsage"]), ...mapActions(useTemplateUsageStore, ["previewTemplateUsage"]),
fetchItem() { fetchItem() {
this.status = "loading" this.status = "loading";
this.previewTemplateUsage(this.data) this.previewTemplateUsage(this.data)
.then((response) => { .then((response) => {
this.status = { status: "success" }; this.status = { status: "success" };

View file

@ -6,13 +6,24 @@
<button type="button" class="!p-0 !h-fit !w-fit" title="Vorschau erzeugen" @click="previewUsage"> <button type="button" class="!p-0 !h-fit !w-fit" title="Vorschau erzeugen" @click="previewUsage">
<EyeIcon class="w-5 h-5 p-1 box-content pointer-events-none" /> <EyeIcon class="w-5 h-5 p-1 box-content pointer-events-none" />
</button> </button>
<button v-if="status == null && can('create','settings','newsletter_config')" type="submit" class="!p-0 !h-fit !w-fit" title="speichern"> <button
v-if="status == null && can('create', 'configuration', 'newsletter_config')"
type="submit"
class="!p-0 !h-fit !w-fit"
title="speichern"
>
<ArchiveBoxArrowDownIcon class="w-5 h-5 p-1 box-content pointer-events-none" /> <ArchiveBoxArrowDownIcon class="w-5 h-5 p-1 box-content pointer-events-none" />
</button> </button>
<Spinner v-else-if="status == 'loading'" class="my-auto" /> <Spinner v-else-if="status == 'loading'" class="my-auto" />
<SuccessCheckmark v-else-if="status?.status == 'success'" /> <SuccessCheckmark v-else-if="status?.status == 'success'" />
<FailureXMark v-else-if="status?.status == 'failed'" /> <FailureXMark v-else-if="status?.status == 'failed'" />
<button type="button" v-if="can('create','settings','newsletter_config')" class="!p-0 !h-fit !w-fit" title="zurücksetzen" @click="resetForm"> <button
type="button"
v-if="can('create', 'configuration', 'newsletter_config')"
class="!p-0 !h-fit !w-fit"
title="zurücksetzen"
@click="resetForm"
>
<ArchiveBoxXMarkIcon class="w-5 h-5 p-1 box-content pointer-events-none" /> <ArchiveBoxXMarkIcon class="w-5 h-5 p-1 box-content pointer-events-none" />
</button> </button>
</div> </div>
@ -23,13 +34,22 @@
<p class="min-w-16">Kopfzeile:</p> <p class="min-w-16">Kopfzeile:</p>
<select ref="header" id="header" :value="templateUsage.header?.id ?? 'def'"> <select ref="header" id="header" :value="templateUsage.header?.id ?? 'def'">
<option value="def">Standard-Vorlage verwenden</option> <option value="def">Standard-Vorlage verwenden</option>
<option v-for="template in templates" :key="template.id" :value="template.id">{{ template.template }}</option> <option v-for="template in templates" :key="template.id" :value="template.id">
{{ template.template }}
</option>
</select> </select>
</div> </div>
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
<p class="whitespace-nowrap">Höhe [mm]:</p> <p class="whitespace-nowrap">Höhe [mm]:</p>
<input id="headerHeight" type="number" :min="15" v-model="templateUsage.headerHeight" class="!w-24" placeholder="15"> <input
</div> id="headerHeight"
type="number"
:min="15"
v-model="templateUsage.headerHeight"
class="!w-24"
placeholder="15"
/>
</div>
</div> </div>
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
<p class="min-w-16">Hauptteil:</p> <p class="min-w-16">Hauptteil:</p>
@ -43,12 +63,21 @@
<p class="min-w-16">Fußzeile:</p> <p class="min-w-16">Fußzeile:</p>
<select ref="footer" id="footer" :value="templateUsage.footer?.id ?? 'def'"> <select ref="footer" id="footer" :value="templateUsage.footer?.id ?? 'def'">
<option value="def">Standard-Vorlage verwenden</option> <option value="def">Standard-Vorlage verwenden</option>
<option v-for="template in templates" :key="template.id" :value="template.id">{{ template.template }}</option> <option v-for="template in templates" :key="template.id" :value="template.id">
{{ template.template }}
</option>
</select> </select>
</div> </div>
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
<p class="whitespace-nowrap">Höhe [mm]:</p> <p class="whitespace-nowrap">Höhe [mm]:</p>
<input id="footerHeight" type="number" :min="15" v-model="templateUsage.footerHeight" class="!w-24" placeholder="15"> <input
id="footerHeight"
type="number"
:min="15"
v-model="templateUsage.footerHeight"
class="!w-24"
placeholder="15"
/>
</div> </div>
</div> </div>
</div> </div>
@ -59,9 +88,9 @@
import { defineAsyncComponent, defineComponent, markRaw, type PropType } from "vue"; import { defineAsyncComponent, defineComponent, markRaw, type PropType } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { ArchiveBoxArrowDownIcon, ArchiveBoxXMarkIcon, EyeIcon } from "@heroicons/vue/24/outline"; import { ArchiveBoxArrowDownIcon, ArchiveBoxXMarkIcon, EyeIcon } from "@heroicons/vue/24/outline";
import type { TemplateUsageViewModel } from "@/viewmodels/admin/settings/templateUsage.models"; import type { TemplateUsageViewModel } from "@/viewmodels/admin/configuration/templateUsage.models";
import { useTemplateStore } from "@/stores/admin/settings/template"; import { useTemplateStore } from "@/stores/admin/configuration/template";
import { useTemplateUsageStore } from "@/stores/admin/settings/templateUsage"; import { useTemplateUsageStore } from "@/stores/admin/configuration/templateUsage";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
@ -94,9 +123,11 @@ export default defineComponent({
...mapActions(useTemplateUsageStore, ["updateTemplateUsage"]), ...mapActions(useTemplateUsageStore, ["updateTemplateUsage"]),
previewUsage() { previewUsage() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/settings/templateUsage/TemplatePreviewModal.vue"))), markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/templateUsage/TemplatePreviewModal.vue"))
),
this.templateUsage.scope this.templateUsage.scope
) );
}, },
updateUsage(e: any) { updateUsage(e: any) {
const fromData = e.target.elements; const fromData = e.target.elements;
@ -106,14 +137,14 @@ export default defineComponent({
const headerHeight = fromData.footer.value === "" ? null : parseInt(fromData.headerHeight.value); const headerHeight = fromData.footer.value === "" ? null : parseInt(fromData.headerHeight.value);
const footerHeight = fromData.footer.value === "" ? null : parseInt(fromData.footerHeight.value); const footerHeight = fromData.footer.value === "" ? null : parseInt(fromData.footerHeight.value);
this.status = "loading" this.status = "loading";
this.updateTemplateUsage({ this.updateTemplateUsage({
scope: this.templateUsage.scope, scope: this.templateUsage.scope,
headerId: headerId, headerId: headerId,
bodyId: bodyId, bodyId: bodyId,
footerId: footerId, footerId: footerId,
headerHeight:headerHeight, headerHeight: headerHeight,
footerHeight: footerHeight footerHeight: footerHeight,
}) })
.then(() => { .then(() => {
this.status = { status: "success" }; this.status = { status: "success" };

View file

@ -6,7 +6,7 @@
<div @click="downloadBackup"> <div @click="downloadBackup">
<ArrowDownTrayIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <ArrowDownTrayIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
<div v-if="can('admin', 'user', 'backup')" @click="openRestoreModal"> <div v-if="can('admin', 'management', 'backup')" @click="openRestoreModal">
<BarsArrowUpIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <BarsArrowUpIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -20,7 +20,7 @@ import { mapState, mapActions } from "pinia";
import { ArchiveBoxArrowDownIcon, ArrowDownTrayIcon, BarsArrowUpIcon } from "@heroicons/vue/24/outline"; import { ArchiveBoxArrowDownIcon, ArrowDownTrayIcon, BarsArrowUpIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import { useBackupStore } from "../../../../stores/admin/user/backup"; import { useBackupStore } from "../../../../stores/admin/management/backup";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -36,7 +36,7 @@ export default defineComponent({
...mapActions(useBackupStore, ["fetchBackupById"]), ...mapActions(useBackupStore, ["fetchBackupById"]),
openRestoreModal() { openRestoreModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/user/backup/RestoreBackupModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/management/backup/RestoreBackupModal.vue"))),
this.backup this.backup
); );
}, },

View file

@ -30,7 +30,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useBackupStore } from "@/stores/admin/user/backup"; import { useBackupStore } from "@/stores/admin/management/backup";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -56,8 +56,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useBackupStore } from "@/stores/admin/user/backup"; import { useBackupStore } from "@/stores/admin/management/backup";
import type { BackupRestoreViewModel } from "../../../../viewmodels/admin/user/backup.models"; import type { BackupRestoreViewModel } from "../../../../viewmodels/admin/management/backup.models";
import { InformationCircleIcon } from "@heroicons/vue/24/outline"; import { InformationCircleIcon } from "@heroicons/vue/24/outline";
import { backupSections, type BackupSection } from "../../../../types/backupTypes"; import { backupSections, type BackupSection } from "../../../../types/backupTypes";
</script> </script>

View file

@ -51,7 +51,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useBackupStore } from "@/stores/admin/user/backup"; import { useBackupStore } from "@/stores/admin/management/backup";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -75,7 +75,6 @@ export default defineComponent({
}, },
fileDrop(event: DragEvent) { fileDrop(event: DragEvent) {
const file = event.dataTransfer?.files[0]; const file = event.dataTransfer?.files[0];
console.log("hi", file);
if (file?.type.toLocaleLowerCase() != "application/json") return; if (file?.type.toLocaleLowerCase() != "application/json") return;
this.uploadFile(file); this.uploadFile(file);
}, },

View file

@ -34,7 +34,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,7 +31,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useRoleStore } from "@/stores/admin/user/role"; import { useRoleStore } from "@/stores/admin/management/role";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,18 +4,18 @@
<p>{{ role.role }} <small v-if="role.permissions.admin">(Admin)</small></p> <p>{{ role.role }} <small v-if="role.permissions.admin">(Admin)</small></p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('admin', 'user', 'role')" v-if="can('admin', 'management', 'role')"
:to="{ name: 'admin-user-role-permission', params: { id: role.id } }" :to="{ name: 'admin-management-role-permission', params: { id: role.id } }"
> >
<WrenchScrewdriverIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <WrenchScrewdriverIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<RouterLink <RouterLink
v-if="can('update', 'user', 'role')" v-if="can('update', 'management', 'role')"
:to="{ name: 'admin-user-role-edit', params: { id: role.id } }" :to="{ name: 'admin-management-role-edit', params: { id: role.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'user', 'role')" @click="openDeleteModal"> <div v-if="can('delete', 'management', 'role')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -27,7 +27,7 @@
import { defineComponent, defineAsyncComponent, markRaw, type PropType } from "vue"; import { defineComponent, defineAsyncComponent, markRaw, type PropType } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { PencilIcon, WrenchScrewdriverIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, WrenchScrewdriverIcon, TrashIcon } from "@heroicons/vue/24/outline";
import type { RoleViewModel } from "@/viewmodels/admin/user/role.models"; import type { RoleViewModel } from "@/viewmodels/admin/management/role.models";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
@ -45,7 +45,7 @@ export default defineComponent({
...mapActions(useModalStore, ["openModal"]), ...mapActions(useModalStore, ["openModal"]),
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/user/role/DeleteRoleModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/management/role/DeleteRoleModal.vue"))),
this.role.id this.role.id
); );
}, },

View file

@ -31,7 +31,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useUserStore } from "@/stores/admin/user/user"; import { useUserStore } from "@/stores/admin/management/user";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -3,7 +3,7 @@
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center"> <div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
<p>{{ invite.firstname }} {{ invite.lastname }}</p> <p>{{ invite.firstname }} {{ invite.lastname }}</p>
<div class="flex flex-row"> <div class="flex flex-row">
<div v-if="can('delete', 'user', 'user')" @click="triggerDeleteInvite"> <div v-if="can('delete', 'management', 'user')" @click="triggerDeleteInvite">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -24,10 +24,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { defineComponent, type PropType } from "vue"; import { defineComponent, type PropType } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import type { InviteViewModel } from "@/viewmodels/admin/user/invite.models"; import type { InviteViewModel } from "@/viewmodels/admin/management/invite.models";
import { PencilIcon, UserGroupIcon, WrenchScrewdriverIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, UserGroupIcon, WrenchScrewdriverIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useInviteStore } from "@/stores/admin/user/invite"; import { useInviteStore } from "@/stores/admin/management/invite";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -47,8 +47,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useInviteStore } from "@/stores/admin/user/invite"; import { useInviteStore } from "@/stores/admin/management/invite";
import type { CreateInviteViewModel } from "@/viewmodels/admin/user/invite.models"; import type { CreateInviteViewModel } from "@/viewmodels/admin/management/invite.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -7,25 +7,25 @@
</p> </p>
<div class="flex flex-row"> <div class="flex flex-row">
<RouterLink <RouterLink
v-if="can('admin', 'user', 'user')" v-if="can('admin', 'management', 'user')"
:to="{ name: 'admin-user-user-roles', params: { id: user.id } }" :to="{ name: 'admin-management-user-roles', params: { id: user.id } }"
> >
<UserGroupIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <UserGroupIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<RouterLink <RouterLink
v-if="can('admin', 'user', 'user')" v-if="can('admin', 'management', 'user')"
:to="{ name: 'admin-user-user-permission', params: { id: user.id } }" :to="{ name: 'admin-management-user-permission', params: { id: user.id } }"
> >
<WrenchScrewdriverIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <WrenchScrewdriverIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<RouterLink <RouterLink
v-if="can('update', 'user', 'user')" v-if="can('update', 'management', 'user')"
:to="{ name: 'admin-user-user-edit', params: { id: user.id } }" :to="{ name: 'admin-management-user-edit', params: { id: user.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div <div
v-if="can('delete', 'user', 'user')" v-if="can('delete', 'management', 'user')"
:class="user.isOwner ? 'opacity-75 pointer-events-none' : ''" :class="user.isOwner ? 'opacity-75 pointer-events-none' : ''"
@click="openDeleteModal" @click="openDeleteModal"
> >
@ -57,7 +57,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { defineComponent, defineAsyncComponent, markRaw, type PropType } from "vue"; import { defineComponent, defineAsyncComponent, markRaw, type PropType } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import type { UserViewModel } from "@/viewmodels/admin/user/user.models"; import type { UserViewModel } from "@/viewmodels/admin/management/user.models";
import { PencilIcon, UserGroupIcon, WrenchScrewdriverIcon, TrashIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, UserGroupIcon, WrenchScrewdriverIcon, TrashIcon } from "@heroicons/vue/24/outline";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
@ -76,7 +76,7 @@ export default defineComponent({
openDeleteModal() { openDeleteModal() {
if (this.user.isOwner) return; if (this.user.isOwner) return;
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/user/user/DeleteUserModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/management/user/DeleteUserModal.vue"))),
this.user.id this.user.id
); );
}, },

View file

@ -38,8 +38,8 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useWebapiStore } from "@/stores/admin/user/webapi"; import { useWebapiStore } from "@/stores/admin/management/webapi";
import type { CreateWebapiViewModel } from "../../../../viewmodels/admin/user/webapi.models"; import type { CreateWebapiViewModel } from "../../../../viewmodels/admin/management/webapi.models";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -31,7 +31,7 @@ import { useModalStore } from "@/stores/modal";
import Spinner from "@/components/Spinner.vue"; import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue"; import FailureXMark from "@/components/FailureXMark.vue";
import { useWebapiStore } from "@/stores/admin/user/webapi"; import { useWebapiStore } from "@/stores/admin/management/webapi";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -3,22 +3,22 @@
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center"> <div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
<p>{{ webapi.title }} <small v-if="webapi.permissions.admin">(Admin)</small></p> <p>{{ webapi.title }} <small v-if="webapi.permissions.admin">(Admin)</small></p>
<div class="flex flex-row"> <div class="flex flex-row">
<div v-if="can('admin', 'user', 'webapi')" @click="openTokenViewModal"> <div v-if="can('admin', 'management', 'webapi')" @click="openTokenViewModal">
<FingerPrintIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <FingerPrintIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
<RouterLink <RouterLink
v-if="can('admin', 'user', 'webapi')" v-if="can('admin', 'management', 'webapi')"
:to="{ name: 'admin-user-webapi-permission', params: { id: webapi.id } }" :to="{ name: 'admin-management-webapi-permission', params: { id: webapi.id } }"
> >
<WrenchScrewdriverIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <WrenchScrewdriverIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<RouterLink <RouterLink
v-if="can('update', 'user', 'webapi')" v-if="can('update', 'management', 'webapi')"
:to="{ name: 'admin-user-webapi-edit', params: { id: webapi.id } }" :to="{ name: 'admin-management-webapi-edit', params: { id: webapi.id } }"
> >
<PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <PencilIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</RouterLink> </RouterLink>
<div v-if="can('delete', 'user', 'webapi')" @click="openDeleteModal"> <div v-if="can('delete', 'management', 'webapi')" @click="openDeleteModal">
<TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" /> <TrashIcon class="w-5 h-5 p-1 box-content cursor-pointer" />
</div> </div>
</div> </div>
@ -74,7 +74,7 @@
import { defineComponent, defineAsyncComponent, markRaw, type PropType } from "vue"; import { defineComponent, defineAsyncComponent, markRaw, type PropType } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { PencilIcon, WrenchScrewdriverIcon, TrashIcon, FingerPrintIcon } from "@heroicons/vue/24/outline"; import { PencilIcon, WrenchScrewdriverIcon, TrashIcon, FingerPrintIcon } from "@heroicons/vue/24/outline";
import type { WebapiViewModel } from "@/viewmodels/admin/user/webapi.models"; import type { WebapiViewModel } from "@/viewmodels/admin/management/webapi.models";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
@ -92,13 +92,13 @@ export default defineComponent({
...mapActions(useModalStore, ["openModal"]), ...mapActions(useModalStore, ["openModal"]),
openTokenViewModal() { openTokenViewModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/user/webapi/WebapiTokenModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/management/webapi/WebapiTokenModal.vue"))),
this.webapi.id this.webapi.id
); );
}, },
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/user/webapi/DeleteWebapiModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/management/webapi/DeleteWebapiModal.vue"))),
this.webapi.id this.webapi.id
); );
}, },

View file

@ -21,14 +21,14 @@ import { defineComponent } from "vue";
import { mapState, mapActions } from "pinia"; import { mapState, mapActions } from "pinia";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/configuration/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models";
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import TextCopy from "@/components/TextCopy.vue"; import TextCopy from "@/components/TextCopy.vue";
import { CalendarDaysIcon, InformationCircleIcon } from "@heroicons/vue/24/outline"; import { CalendarDaysIcon, InformationCircleIcon } from "@heroicons/vue/24/outline";
import { host } from "@/serverCom"; import { host } from "@/serverCom";
import { useWebapiStore } from "../../../../stores/admin/user/webapi"; import { useWebapiStore } from "../../../../stores/admin/management/webapi";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -27,7 +27,7 @@
</div> </div>
<div class="grow"></div> <div class="grow"></div>
<div <div
v-if="allowPredefinedSelect && can('read', 'settings', 'query_store')" v-if="allowPredefinedSelect && can('read', 'configuration', 'query_store')"
class="flex flex-row gap-2 max-lg:w-full max-lg:order-10" class="flex flex-row gap-2 max-lg:w-full max-lg:order-10"
> >
<select v-model="activeQueryId" class="max-h-[34px] !py-0"> <select v-model="activeQueryId" class="max-h-[34px] !py-0">
@ -37,7 +37,7 @@
</option> </option>
</select> </select>
<div <div
v-if="can('create', 'settings', 'query_store')" v-if="can('create', 'configuration', 'query_store')"
class="p-1 border border-gray-400 bg-gray-100 rounded-md" class="p-1 border border-gray-400 bg-gray-100 rounded-md"
title="Abfrage speichern" title="Abfrage speichern"
@click="$emit('query:save')" @click="$emit('query:save')"
@ -93,7 +93,7 @@ import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder";
import { useModalStore } from "@/stores/modal"; import { useModalStore } from "@/stores/modal";
import Table from "./Table.vue"; import Table from "./Table.vue";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import { useQueryStoreStore } from "@/stores/admin/settings/queryStore"; import { useQueryStoreStore } from "@/stores/admin/configuration/queryStore";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -7,15 +7,15 @@ export async function abilityAndNavUpdate(to: any, from: any, next: any) {
const ability = useAbilityStore(); const ability = useAbilityStore();
const navigation = useNavigationStore(); const navigation = useNavigationStore();
let admin = to.meta.admin || false;
let type = to.meta.type; let type = to.meta.type;
let section = to.meta.section; let section = to.meta.section;
let module = to.meta.module; let module = to.meta.module;
navigation.activeNavigation = to.name.split("-")[1]; if ((admin && ability.isAdmin()) || ability.can(type, section, module)) {
navigation.activeLink = to.name.split("-")[2];
if (ability.can(type, section, module)) {
NProgress.done(); NProgress.done();
navigation.activeNavigation = to.name.split("-")[1];
navigation.activeLink = to.name.split("-")[2];
next(); next();
} else { } else {
NProgress.done(); NProgress.done();

View file

@ -1,4 +1,4 @@
import { useBackupStore } from "../stores/admin/user/backup"; import { useBackupStore } from "../stores/admin/management/backup";
export async function setBackupPage(to: any, from: any, next: any) { export async function setBackupPage(to: any, from: any, next: any) {
const backup = useBackupStore(); const backup = useBackupStore();

View file

@ -298,36 +298,36 @@ const router = createRouter({
], ],
}, },
{ {
path: "settings", path: "configuration",
name: "admin-settings", name: "admin-configuration",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings" }, meta: { type: "read", section: "configuration" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-default", name: "admin-configuration-default",
component: () => import("@/views/admin/ViewSelect.vue"), component: () => import("@/views/admin/ViewSelect.vue"),
meta: { type: "read", section: "settings" }, meta: { type: "read", section: "configuration" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "qualification", path: "qualification",
name: "admin-settings-qualification-route", name: "admin-configuration-qualification-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "qualification" }, meta: { type: "read", section: "configuration", module: "qualification" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-qualification", name: "admin-configuration-qualification",
component: () => import("@/views/admin/settings/qualification/Qualification.vue"), component: () => import("@/views/admin/configuration/qualification/Qualification.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-qualification-edit", name: "admin-configuration-qualification-edit",
component: () => import("@/views/admin/settings/qualification/QualificationEdit.vue"), component: () => import("@/views/admin/configuration/qualification/QualificationEdit.vue"),
meta: { type: "update", section: "settings", module: "qualification" }, meta: { type: "update", section: "configuration", module: "qualification" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -335,21 +335,21 @@ const router = createRouter({
}, },
{ {
path: "award", path: "award",
name: "admin-settings-award-route", name: "admin-configuration-award-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "award" }, meta: { type: "read", section: "configuration", module: "award" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-award", name: "admin-configuration-award",
component: () => import("@/views/admin/settings/award/Award.vue"), component: () => import("@/views/admin/configuration/award/Award.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-award-edit", name: "admin-configuration-award-edit",
component: () => import("@/views/admin/settings/award/AwardEdit.vue"), component: () => import("@/views/admin/configuration/award/AwardEdit.vue"),
meta: { type: "update", section: "settings", module: "award" }, meta: { type: "update", section: "configuration", module: "award" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -357,23 +357,23 @@ const router = createRouter({
}, },
{ {
path: "executive-position", path: "executive-position",
name: "admin-settings-executive_position-route", name: "admin-configuration-executive_position-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "executive_position" }, meta: { type: "read", section: "configuration", module: "executive_position" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-executive_position", name: "admin-configuration-executive_position",
component: () => import("@/views/admin/settings/executivePosition/ExecutivePosition.vue"), component: () => import("@/views/admin/configuration/executivePosition/ExecutivePosition.vue"),
meta: { type: "read", section: "settings", module: "executive_position" }, meta: { type: "read", section: "configuration", module: "executive_position" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-executive_position-edit", name: "admin-configuration-executive_position-edit",
component: () => import("@/views/admin/settings/executivePosition/ExecutivePositionEdit.vue"), component: () => import("@/views/admin/configuration/executivePosition/ExecutivePositionEdit.vue"),
meta: { type: "update", section: "settings", module: "executive_position" }, meta: { type: "update", section: "configuration", module: "executive_position" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -381,21 +381,21 @@ const router = createRouter({
}, },
{ {
path: "communication-type", path: "communication-type",
name: "admin-settings-communication_type-route", name: "admin-configuration-communication_type-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "communication_type" }, meta: { type: "read", section: "configuration", module: "communication_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-communication_type", name: "admin-configuration-communication_type",
component: () => import("@/views/admin/settings/communicationType/CommunicationType.vue"), component: () => import("@/views/admin/configuration/communicationType/CommunicationType.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-communication_type-edit", name: "admin-configuration-communication_type-edit",
component: () => import("@/views/admin/settings/communicationType/CommunicationTypeEdit.vue"), component: () => import("@/views/admin/configuration/communicationType/CommunicationTypeEdit.vue"),
meta: { type: "update", section: "settings", module: "communication_type" }, meta: { type: "update", section: "configuration", module: "communication_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -403,21 +403,21 @@ const router = createRouter({
}, },
{ {
path: "status", path: "status",
name: "admin-settings-membership_status-route", name: "admin-configuration-membership_status-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "membership_status" }, meta: { type: "read", section: "configuration", module: "membership_status" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-membership_status", name: "admin-configuration-membership_status",
component: () => import("@/views/admin/settings/membershipStatus/MembershipStatus.vue"), component: () => import("@/views/admin/configuration/membershipStatus/MembershipStatus.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-membership_status-edit", name: "admin-configuration-membership_status-edit",
component: () => import("@/views/admin/settings/membershipStatus/MembershipStatusEdit.vue"), component: () => import("@/views/admin/configuration/membershipStatus/MembershipStatusEdit.vue"),
meta: { type: "update", section: "settings", module: "membership_status" }, meta: { type: "update", section: "configuration", module: "membership_status" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -425,21 +425,21 @@ const router = createRouter({
}, },
{ {
path: "salutation", path: "salutation",
name: "admin-settings-salutation-route", name: "admin-configuration-salutation-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "salutation" }, meta: { type: "read", section: "configuration", module: "salutation" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-salutation", name: "admin-configuration-salutation",
component: () => import("@/views/admin/settings/salutation/Salutation.vue"), component: () => import("@/views/admin/configuration/salutation/Salutation.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-salutation-edit", name: "admin-configuration-salutation-edit",
component: () => import("@/views/admin/settings/salutation/SalutationEdit.vue"), component: () => import("@/views/admin/configuration/salutation/SalutationEdit.vue"),
meta: { type: "update", section: "settings", module: "salutation" }, meta: { type: "update", section: "configuration", module: "salutation" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -447,21 +447,21 @@ const router = createRouter({
}, },
{ {
path: "calendar-type", path: "calendar-type",
name: "admin-settings-calendar_type-route", name: "admin-configuration-calendar_type-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "calendar_type" }, meta: { type: "read", section: "configuration", module: "calendar_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-calendar_type", name: "admin-configuration-calendar_type",
component: () => import("@/views/admin/settings/calendarType/CalendarType.vue"), component: () => import("@/views/admin/configuration/calendarType/CalendarType.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-calendar_type-edit", name: "admin-configuration-calendar_type-edit",
component: () => import("@/views/admin/settings/calendarType/CalendarTypeEdit.vue"), component: () => import("@/views/admin/configuration/calendarType/CalendarTypeEdit.vue"),
meta: { type: "update", section: "settings", module: "calendar_type" }, meta: { type: "update", section: "configuration", module: "calendar_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -469,34 +469,34 @@ const router = createRouter({
}, },
{ {
path: "query-store", path: "query-store",
name: "admin-settings-query_store", name: "admin-configuration-query_store",
component: () => import("@/views/admin/settings/queryStore/QueryStore.vue"), component: () => import("@/views/admin/configuration/queryStore/QueryStore.vue"),
meta: { type: "read", section: "settings", module: "query_store" }, meta: { type: "read", section: "configuration", module: "query_store" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "template", path: "template",
name: "admin-settings-template-route", name: "admin-configuration-template-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "settings", module: "template" }, meta: { type: "read", section: "configuration", module: "template" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-settings-template", name: "admin-configuration-template",
component: () => import("@/views/admin/settings/template/Template.vue"), component: () => import("@/views/admin/configuration/template/Template.vue"),
}, },
{ {
path: "info", path: "info",
name: "admin-settings-template-info", name: "admin-configuration-template-info",
component: () => import("@/views/admin/settings/template/UsageInfo.vue"), component: () => import("@/views/admin/configuration/template/UsageInfo.vue"),
props: true, props: true,
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-settings-template-edit", name: "admin-configuration-template-edit",
component: () => import("@/views/admin/settings/template/TemplateEdit.vue"), component: () => import("@/views/admin/configuration/template/TemplateEdit.vue"),
meta: { type: "update", section: "settings", module: "template" }, meta: { type: "update", section: "configuration", module: "template" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -504,72 +504,72 @@ const router = createRouter({
}, },
{ {
path: "template-usage", path: "template-usage",
name: "admin-settings-template_usage", name: "admin-configuration-template_usage",
component: () => import("@/views/admin/settings/templateUsage/TemplateUsage.vue"), component: () => import("@/views/admin/configuration/templateUsage/TemplateUsage.vue"),
meta: { type: "read", section: "settings", module: "template_usage" }, meta: { type: "read", section: "configuration", module: "template_usage" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "newsletter-config", path: "newsletter-config",
name: "admin-settings-newsletter_config", name: "admin-configuration-newsletter_config",
component: () => import("@/views/admin/settings/newsletterConfig/NewsletterConfig.vue"), component: () => import("@/views/admin/configuration/newsletterConfig/NewsletterConfig.vue"),
meta: { type: "read", section: "settings", module: "newsletter_config" }, meta: { type: "read", section: "configuration", module: "newsletter_config" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
], ],
}, },
{ {
path: "user", path: "management",
name: "admin-user", name: "admin-management",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "user" }, meta: { type: "read", section: "management" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-user-default", name: "admin-management-default",
component: () => import("@/views/admin/ViewSelect.vue"), component: () => import("@/views/admin/ViewSelect.vue"),
meta: { type: "read", section: "user" }, meta: { type: "read", section: "management" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "user", path: "user",
name: "admin-user-user-route", name: "admin-management-user-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "user", module: "user" }, meta: { type: "read", section: "management", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-user-user", name: "admin-management-user",
component: () => import("@/views/admin/user/user/User.vue"), component: () => import("@/views/admin/management/user/User.vue"),
}, },
{ {
path: "invites", path: "invites",
name: "admin-user-user-invites", name: "admin-management-user-invites",
component: () => import("@/views/admin/user/user/Invite.vue"), component: () => import("@/views/admin/management/user/Invite.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-user-user-edit", name: "admin-management-user-edit",
component: () => import("@/views/admin/user/user/UserEdit.vue"), component: () => import("@/views/admin/management/user/UserEdit.vue"),
meta: { type: "update", section: "user", module: "user" }, meta: { type: "update", section: "management", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/permission", path: ":id/permission",
name: "admin-user-user-permission", name: "admin-management-user-permission",
component: () => import("@/views/admin/user/user/UserEditPermission.vue"), component: () => import("@/views/admin/management/user/UserEditPermission.vue"),
meta: { type: "update", section: "user", module: "user" }, meta: { type: "update", section: "management", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/roles", path: ":id/roles",
name: "admin-user-user-roles", name: "admin-management-user-roles",
component: () => import("@/views/admin/user/user/UserEditRoles.vue"), component: () => import("@/views/admin/management/user/UserEditRoles.vue"),
meta: { type: "update", section: "user", module: "user" }, meta: { type: "update", section: "management", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -577,29 +577,29 @@ const router = createRouter({
}, },
{ {
path: "role", path: "role",
name: "admin-user-role-route", name: "admin-management-role-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "user", module: "role" }, meta: { type: "read", section: "management", module: "role" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-user-role", name: "admin-management-role",
component: () => import("@/views/admin/user/role/Role.vue"), component: () => import("@/views/admin/management/role/Role.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-user-role-edit", name: "admin-management-role-edit",
component: () => import("@/views/admin/user/role/RoleEdit.vue"), component: () => import("@/views/admin/management/role/RoleEdit.vue"),
meta: { type: "update", section: "user", module: "role" }, meta: { type: "update", section: "management", module: "role" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/permission", path: ":id/permission",
name: "admin-user-role-permission", name: "admin-management-role-permission",
component: () => import("@/views/admin/user/role/RoleEditPermission.vue"), component: () => import("@/views/admin/management/role/RoleEditPermission.vue"),
meta: { type: "update", section: "user", module: "role" }, meta: { type: "update", section: "management", module: "role" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -607,29 +607,29 @@ const router = createRouter({
}, },
{ {
path: "webapi", path: "webapi",
name: "admin-user-webapi-route", name: "admin-management-webapi-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "user", module: "webapi" }, meta: { type: "read", section: "management", module: "webapi" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-user-webapi", name: "admin-management-webapi",
component: () => import("@/views/admin/user/webapi/Webapi.vue"), component: () => import("@/views/admin/management/webapi/Webapi.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-user-webapi-edit", name: "admin-management-webapi-edit",
component: () => import("@/views/admin/user/webapi/WebapiEdit.vue"), component: () => import("@/views/admin/management/webapi/WebapiEdit.vue"),
meta: { type: "update", section: "user", module: "webapi" }, meta: { type: "update", section: "management", module: "webapi" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/permission", path: ":id/permission",
name: "admin-user-webapi-permission", name: "admin-management-webapi-permission",
component: () => import("@/views/admin/user/webapi/WebapiEditPermission.vue"), component: () => import("@/views/admin/management/webapi/WebapiEditPermission.vue"),
meta: { type: "update", section: "user", module: "webapi" }, meta: { type: "update", section: "management", module: "webapi" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -637,34 +637,36 @@ const router = createRouter({
}, },
{ {
path: "backup", path: "backup",
name: "admin-user-backup-route", name: "admin-management-backup-route",
component: () => import("@/views/admin/user/backup/BackupRouting.vue"), component: () => import("@/views/admin/management/backup/BackupRouting.vue"),
meta: { type: "read", section: "user", module: "backup" }, meta: { type: "read", section: "management", module: "backup" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-user-backup", name: "admin-management-backup",
redirect: { name: "admin-user-backup-generated" }, redirect: { name: "admin-management-backup-generated" },
}, },
{ {
path: "generated", path: "generated",
name: "admin-user-backup-generated", name: "admin-management-backup-generated",
component: () => import("@/views/admin/user/backup/GeneratedBackup.vue"), component: () => import("@/views/admin/management/backup/GeneratedBackup.vue"),
beforeEnter: [setBackupPage], beforeEnter: [setBackupPage],
}, },
{ {
path: "uploads", path: "uploads",
name: "admin-user-backup-uploaded", name: "admin-management-backup-uploaded",
component: () => import("@/views/admin/user/backup/UploadedBackup.vue"), component: () => import("@/views/admin/management/backup/UploadedBackup.vue"),
beforeEnter: [setBackupPage], beforeEnter: [setBackupPage],
}, },
], ],
}, },
{ {
path: "version", path: "version",
name: "admin-user-version", name: "admin-management-version",
component: () => import("@/views/admin/user/version/VersionDisplay.vue"), component: () => import("@/views/admin/management/version/VersionDisplay.vue"),
meta: { admin: true },
beforeEnter: [abilityAndNavUpdate],
}, },
], ],
}, },
@ -776,6 +778,7 @@ export default router;
declare module "vue-router" { declare module "vue-router" {
interface RouteMeta { interface RouteMeta {
admin?: boolean;
type?: PermissionType | "admin"; type?: PermissionType | "admin";
section?: PermissionSection; section?: PermissionSection;
module?: PermissionModule; module?: PermissionModule;

View file

@ -1,6 +1,6 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { TableMeta } from "@/viewmodels/admin/settings/query.models"; import type { TableMeta } from "@/viewmodels/admin/configuration/query.models";
import type { DynamicQueryStructure, FieldType } from "@/types/dynamicQueries"; import type { DynamicQueryStructure, FieldType } from "@/types/dynamicQueries";
export const useQueryBuilderStore = defineStore("queryBuilder", { export const useQueryBuilderStore = defineStore("queryBuilder", {

View file

@ -1,5 +1,9 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { CreateAwardViewModel, UpdateAwardViewModel, AwardViewModel } from "@/viewmodels/admin/settings/award.models"; import type {
CreateAwardViewModel,
UpdateAwardViewModel,
AwardViewModel,
} from "@/viewmodels/admin/configuration/award.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -3,7 +3,7 @@ import type {
CreateCalendarTypeViewModel, CreateCalendarTypeViewModel,
UpdateCalendarTypeViewModel, UpdateCalendarTypeViewModel,
CalendarTypeViewModel, CalendarTypeViewModel,
} from "@/viewmodels/admin/settings/calendarType.models"; } from "@/viewmodels/admin/configuration/calendarType.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -3,7 +3,7 @@ import type {
CreateCommunicationTypeViewModel, CreateCommunicationTypeViewModel,
UpdateCommunicationTypeViewModel, UpdateCommunicationTypeViewModel,
CommunicationTypeViewModel, CommunicationTypeViewModel,
} from "@/viewmodels/admin/settings/communicationType.models"; } from "@/viewmodels/admin/configuration/communicationType.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";
import type { CommunicationFieldType } from "@/types/fieldTypes"; import type { CommunicationFieldType } from "@/types/fieldTypes";

View file

@ -3,7 +3,7 @@ import type {
CreateExecutivePositionViewModel, CreateExecutivePositionViewModel,
UpdateExecutivePositionViewModel, UpdateExecutivePositionViewModel,
ExecutivePositionViewModel, ExecutivePositionViewModel,
} from "@/viewmodels/admin/settings/executivePosition.models"; } from "@/viewmodels/admin/configuration/executivePosition.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -3,7 +3,7 @@ import type {
CreateMembershipStatusViewModel, CreateMembershipStatusViewModel,
UpdateMembershipStatusViewModel, UpdateMembershipStatusViewModel,
MembershipStatusViewModel, MembershipStatusViewModel,
} from "@/viewmodels/admin/settings/membershipStatus.models"; } from "@/viewmodels/admin/configuration/membershipStatus.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -2,7 +2,7 @@ import { defineStore } from "pinia";
import type { import type {
SetNewsletterConfigViewModel, SetNewsletterConfigViewModel,
NewsletterConfigViewModel, NewsletterConfigViewModel,
} from "@/viewmodels/admin/settings/newsletterConfig.models"; } from "@/viewmodels/admin/configuration/newsletterConfig.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -3,7 +3,7 @@ import type {
CreateQualificationViewModel, CreateQualificationViewModel,
UpdateQualificationViewModel, UpdateQualificationViewModel,
QualificationViewModel, QualificationViewModel,
} from "@/viewmodels/admin/settings/qualification.models"; } from "@/viewmodels/admin/configuration/qualification.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -1,5 +1,9 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { CreateQueryViewModel, QueryViewModel, UpdateQueryViewModel } from "@/viewmodels/admin/settings/query.models"; import type {
CreateQueryViewModel,
QueryViewModel,
UpdateQueryViewModel,
} from "@/viewmodels/admin/configuration/query.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";
import { useQueryBuilderStore } from "../club/queryBuilder"; import { useQueryBuilderStore } from "../club/queryBuilder";
@ -34,17 +38,17 @@ export const useQueryStoreStore = defineStore("queryStore", {
const queryBuilderStore = useQueryBuilderStore(); const queryBuilderStore = useQueryBuilderStore();
const modalStore = useModalStore(); const modalStore = useModalStore();
const abilityStore = useAbilityStore(); const abilityStore = useAbilityStore();
if (queryBuilderStore.activeQueryId != undefined && abilityStore.can("update", "settings", "query_store")) { if (queryBuilderStore.activeQueryId != undefined && abilityStore.can("update", "configuration", "query_store")) {
modalStore.openModal( modalStore.openModal(
markRaw( markRaw(
defineAsyncComponent(() => import("@/components/admin/settings/queryStore/UpdateQueryStoreModal.vue")) defineAsyncComponent(() => import("@/components/admin/configuration/queryStore/UpdateQueryStoreModal.vue"))
), ),
queryBuilderStore.activeQueryId queryBuilderStore.activeQueryId
); );
} else { } else {
modalStore.openModal( modalStore.openModal(
markRaw( markRaw(
defineAsyncComponent(() => import("@/components/admin/settings/queryStore/CreateQueryStoreModal.vue")) defineAsyncComponent(() => import("@/components/admin/configuration/queryStore/CreateQueryStoreModal.vue"))
) )
); );
} }

View file

@ -3,7 +3,7 @@ import type {
CreateSalutationViewModel, CreateSalutationViewModel,
UpdateSalutationViewModel, UpdateSalutationViewModel,
SalutationViewModel, SalutationViewModel,
} from "@/viewmodels/admin/settings/salutation.models"; } from "@/viewmodels/admin/configuration/salutation.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -5,7 +5,7 @@ import type {
CreateTemplateViewModel, CreateTemplateViewModel,
TemplateViewModel, TemplateViewModel,
UpdateTemplateViewModel, UpdateTemplateViewModel,
} from "@/viewmodels/admin/settings/template.models"; } from "@/viewmodels/admin/configuration/template.models";
export const useTemplateStore = defineStore("template", { export const useTemplateStore = defineStore("template", {
state: () => { state: () => {

View file

@ -1,8 +1,14 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";
import type { CreateTemplateViewModel, UpdateTemplateViewModel } from "@/viewmodels/admin/settings/template.models"; import type {
import type { TemplateUsageViewModel, UpdateTemplateUsageViewModel } from "@/viewmodels/admin/settings/templateUsage.models"; CreateTemplateViewModel,
UpdateTemplateViewModel,
} from "@/viewmodels/admin/configuration/template.models";
import type {
TemplateUsageViewModel,
UpdateTemplateUsageViewModel,
} from "@/viewmodels/admin/configuration/templateUsage.models";
import type { PermissionModule } from "@/types/permissionTypes"; import type { PermissionModule } from "@/types/permissionTypes";
export const useTemplateUsageStore = defineStore("templateUsage", { export const useTemplateUsageStore = defineStore("templateUsage", {

View file

@ -1,7 +1,7 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse, AxiosProgressEvent } from "axios"; import type { AxiosResponse, AxiosProgressEvent } from "axios";
import type { BackupRestoreViewModel } from "../../../viewmodels/admin/user/backup.models"; import type { BackupRestoreViewModel } from "../../../viewmodels/admin/management/backup.models";
export const useBackupStore = defineStore("backup", { export const useBackupStore = defineStore("backup", {
state: () => { state: () => {

View file

@ -1,5 +1,5 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { CreateInviteViewModel, InviteViewModel } from "@/viewmodels/admin/user/invite.models"; import type { CreateInviteViewModel, InviteViewModel } from "@/viewmodels/admin/management/invite.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { PermissionObject } from "@/types/permissionTypes"; import type { PermissionObject } from "@/types/permissionTypes";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -1,5 +1,5 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { RoleViewModel } from "@/viewmodels/admin/user/role.models"; import type { RoleViewModel } from "@/viewmodels/admin/management/role.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { PermissionObject } from "@/types/permissionTypes"; import type { PermissionObject } from "@/types/permissionTypes";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -1,5 +1,5 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { UpdateUserViewModel, UserViewModel } from "@/viewmodels/admin/user/user.models"; import type { UpdateUserViewModel, UserViewModel } from "@/viewmodels/admin/management/user.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { PermissionObject } from "@/types/permissionTypes"; import type { PermissionObject } from "@/types/permissionTypes";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -3,7 +3,7 @@ import type {
CreateWebapiViewModel, CreateWebapiViewModel,
UpdateWebapiViewModel, UpdateWebapiViewModel,
WebapiViewModel, WebapiViewModel,
} from "@/viewmodels/admin/user/webapi.models"; } from "@/viewmodels/admin/management/webapi.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { PermissionObject } from "@/types/permissionTypes"; import type { PermissionObject } from "@/types/permissionTypes";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -1,12 +1,11 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
import router from "@/router"; import router from "@/router";
import type { PermissionSection } from "../../types/permissionTypes";
export interface navigationModel { export type navigationModel = {
club: navigationSplitModel; [key in topLevelNavigationType]: navigationSplitModel;
settings: navigationSplitModel; };
user: navigationSplitModel;
}
export interface navigationSplitModel { export interface navigationSplitModel {
topTitle?: string; topTitle?: string;
@ -15,7 +14,7 @@ export interface navigationSplitModel {
main: Array<navigationLinkModel>; main: Array<navigationLinkModel>;
} }
export type topLevelNavigationType = "club" | "settings" | "user"; export type topLevelNavigationType = PermissionSection;
export interface topLevelNavigationModel { export interface topLevelNavigationModel {
key: topLevelNavigationType; key: topLevelNavigationType;
@ -58,20 +57,20 @@ export const useNavigationStore = defineStore("navigation", {
} as topLevelNavigationModel, } as topLevelNavigationModel,
] ]
: []), : []),
...(abilityStore.canSection("read", "settings") ...(abilityStore.canSection("read", "configuration")
? [ ? [
{ {
key: "settings", key: "configuration",
title: "Einstellungen", title: "Konfiguration",
levelDefault: "salutation", levelDefault: "salutation",
} as topLevelNavigationModel, } as topLevelNavigationModel,
] ]
: []), : []),
...(abilityStore.canSection("read", "user") ...(abilityStore.canSection("read", "management")
? [ ? [
{ {
key: "user", key: "management",
title: "Benutzer", title: "Verwaltung",
levelDefault: "user", levelDefault: "user",
} as topLevelNavigationModel, } as topLevelNavigationModel,
] ]
@ -95,45 +94,49 @@ export const useNavigationStore = defineStore("navigation", {
...(abilityStore.can("read", "club", "query") ? [{ key: "query_builder", title: "Query Builder" }] : []), ...(abilityStore.can("read", "club", "query") ? [{ key: "query_builder", title: "Query Builder" }] : []),
], ],
}, },
settings: { configuration: {
mainTitle: "Einstellungen", mainTitle: "Einstellungen",
main: [ main: [
{ key: "divider1", title: "Mitgliederdaten" }, { key: "divider1", title: "Mitgliederdaten" },
...(abilityStore.can("read", "settings", "salutation") ? [{ key: "salutation", title: "Anrede" }] : []), ...(abilityStore.can("read", "configuration", "salutation")
...(abilityStore.can("read", "settings", "award") ? [{ key: "award", title: "Auszeichnungen" }] : []), ? [{ key: "salutation", title: "Anrede" }]
...(abilityStore.can("read", "settings", "communication_type") : []),
...(abilityStore.can("read", "configuration", "award") ? [{ key: "award", title: "Auszeichnungen" }] : []),
...(abilityStore.can("read", "configuration", "communication_type")
? [{ key: "communication_type", title: "Kommunikationsarten" }] ? [{ key: "communication_type", title: "Kommunikationsarten" }]
: []), : []),
...(abilityStore.can("read", "settings", "membership_status") ...(abilityStore.can("read", "configuration", "membership_status")
? [{ key: "membership_status", title: "Mitgliedsstatus" }] ? [{ key: "membership_status", title: "Mitgliedsstatus" }]
: []), : []),
...(abilityStore.can("read", "settings", "qualification") ...(abilityStore.can("read", "configuration", "qualification")
? [{ key: "qualification", title: "Qualifikationen" }] ? [{ key: "qualification", title: "Qualifikationen" }]
: []), : []),
...(abilityStore.can("read", "settings", "executive_position") ...(abilityStore.can("read", "configuration", "executive_position")
? [{ key: "executive_position", title: "Vereinsämter" }] ? [{ key: "executive_position", title: "Vereinsämter" }]
: []), : []),
{ key: "divider2", title: "Einstellungen" }, { key: "divider2", title: "Einstellungen" },
...(abilityStore.can("read", "settings", "newsletter_config") ...(abilityStore.can("read", "configuration", "newsletter_config")
? [{ key: "newsletter_config", title: "Newsletter Konfiguration" }] ? [{ key: "newsletter_config", title: "Newsletter Konfiguration" }]
: []), : []),
...(abilityStore.can("read", "settings", "template") ? [{ key: "template", title: "Templates" }] : []), ...(abilityStore.can("read", "configuration", "template") ? [{ key: "template", title: "Templates" }] : []),
...(abilityStore.can("read", "settings", "template_usage") ...(abilityStore.can("read", "configuration", "template_usage")
? [{ key: "template_usage", title: "Template-Verwendung" }] ? [{ key: "template_usage", title: "Template-Verwendung" }]
: []), : []),
...(abilityStore.can("read", "settings", "calendar_type") ...(abilityStore.can("read", "configuration", "calendar_type")
? [{ key: "calendar_type", title: "Terminarten" }] ? [{ key: "calendar_type", title: "Terminarten" }]
: []), : []),
...(abilityStore.can("read", "settings", "query") ? [{ key: "query_store", title: "Query Store" }] : []), ...(abilityStore.can("read", "configuration", "query")
? [{ key: "query_store", title: "Query Store" }]
: []),
], ],
}, },
user: { management: {
mainTitle: "Benutzer", mainTitle: "Benutzer",
main: [ main: [
...(abilityStore.can("read", "user", "user") ? [{ key: "user", title: "Benutzer" }] : []), ...(abilityStore.can("read", "management", "user") ? [{ key: "user", title: "Benutzer" }] : []),
...(abilityStore.can("read", "user", "role") ? [{ key: "role", title: "Rollen" }] : []), ...(abilityStore.can("read", "management", "role") ? [{ key: "role", title: "Rollen" }] : []),
...(abilityStore.can("read", "user", "webapi") ? [{ key: "webapi", title: "Webapi-Token" }] : []), ...(abilityStore.can("read", "management", "webapi") ? [{ key: "webapi", title: "Webapi-Token" }] : []),
...(abilityStore.can("read", "user", "backup") ? [{ key: "backup", title: "Backups" }] : []), ...(abilityStore.can("read", "management", "backup") ? [{ key: "backup", title: "Backups" }] : []),
...(abilityStore.isAdmin() ? [{ key: "version", title: "Version" }] : []), ...(abilityStore.isAdmin() ? [{ key: "version", title: "Version" }] : []),
], ],
}, },

View file

@ -1,4 +1,4 @@
export type PermissionSection = "club" | "settings" | "user"; export type PermissionSection = "club" | "configuration" | "management";
export type PermissionModule = export type PermissionModule =
| "member" | "member"
@ -43,7 +43,7 @@ export type SectionsAndModulesObject = {
[section in PermissionSection]: Array<PermissionModule>; [section in PermissionSection]: Array<PermissionModule>;
}; };
export const permissionSections: Array<PermissionSection> = ["club", "settings", "user"]; export const permissionSections: Array<PermissionSection> = ["club", "configuration", "management"];
export const permissionModules: Array<PermissionModule> = [ export const permissionModules: Array<PermissionModule> = [
"member", "member",
"calendar", "calendar",
@ -69,7 +69,7 @@ export const permissionModules: Array<PermissionModule> = [
export const permissionTypes: Array<PermissionType> = ["read", "create", "update", "delete"]; export const permissionTypes: Array<PermissionType> = ["read", "create", "update", "delete"];
export const sectionsAndModules: SectionsAndModulesObject = { export const sectionsAndModules: SectionsAndModulesObject = {
club: ["member", "calendar", "newsletter", "protocol", "query"], club: ["member", "calendar", "newsletter", "protocol", "query"],
settings: [ configuration: [
"qualification", "qualification",
"award", "award",
"executive_position", "executive_position",
@ -82,5 +82,5 @@ export const sectionsAndModules: SectionsAndModulesObject = {
"template_usage", "template_usage",
"newsletter_config", "newsletter_config",
], ],
user: ["user", "role", "webapi", "backup"], management: ["user", "role", "webapi", "backup"],
}; };

View file

@ -1,4 +1,4 @@
import type { CalendarTypeViewModel } from "../settings/calendarType.models"; import type { CalendarTypeViewModel } from "../configuration/calendarType.models";
export interface CalendarViewModel { export interface CalendarViewModel {
id: string; id: string;

View file

@ -1,4 +1,4 @@
import type { CommunicationTypeViewModel } from "../../settings/communicationType.models"; import type { CommunicationTypeViewModel } from "../../configuration/communicationType.models";
export interface CommunicationViewModel { export interface CommunicationViewModel {
id: number; id: number;

View file

@ -1,6 +1,6 @@
import type { CommunicationViewModel } from "./communication.models"; import type { CommunicationViewModel } from "./communication.models";
import type { MembershipViewModel } from "./membership.models"; import type { MembershipViewModel } from "./membership.models";
import type { SalutationViewModel } from "../../settings/salutation.models"; import type { SalutationViewModel } from "../../configuration/salutation.models";
export interface MemberViewModel { export interface MemberViewModel {
id: string; id: string;

View file

@ -1,4 +1,4 @@
import type { QueryViewModel } from "../../settings/query.models"; import type { QueryViewModel } from "../../configuration/query.models";
export interface NewsletterViewModel { export interface NewsletterViewModel {
id: number; id: number;

Some files were not shown because too many files have changed in this diff Show more