Compare commits

..

No commits in common. "8de919cbab749d4eb35e7b6558f8cabd23643ed4" and "662f36b3e2c19a34ec3a4eab2a115ad949713845" have entirely different histories.

146 changed files with 527 additions and 633 deletions
src
components
Footer.vueHeader.vue
admin
club
settings
user
queryBuilder
router
stores/admin
types
viewmodels/admin

View file

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

View file

@ -2,9 +2,7 @@
<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"> <h1 v-if="false" class="font-bold text-3xl w-fit whitespace-nowrap">{{config.app_name_overwrite || "FF Admin"}}</h1>
{{ 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">
@ -15,13 +13,8 @@
:link="item" :link="item"
/> />
<TopLevelLink <TopLevelLink
v-else-if=" v-else-if="routeName == 'account' || routeName.includes('account-') || routeName == 'docs' || routeName.includes('docs-')"
routeName == 'account' || :link="{ key: 'club', title: 'Zur Verwaltung', levelDefault: '' }"
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>
@ -37,7 +30,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,7 +73,11 @@
<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 type="checkbox" id="nscdr" v-model="provideNSCDR" /> <input
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 />
@ -101,8 +105,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/configuration/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/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";
@ -115,7 +119,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: {
@ -129,7 +133,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/configuration/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/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/configuration/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/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/configuration/salutation"; import { useSalutationStore } from "../../../../stores/admin/settings/salutation";
import type { SalutationViewModel } from "../../../../viewmodels/admin/configuration/salutation.models"; import type { SalutationViewModel } from "../../../../viewmodels/admin/settings/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/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/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/configuration/award"; import { useAwardStore } from "@/stores/admin/settings/award";
import type { AwardViewModel } from "@/viewmodels/admin/configuration/award.models"; import type { AwardViewModel } from "@/viewmodels/admin/settings/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/configuration/award"; import { useAwardStore } from "@/stores/admin/settings/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/configuration/communicationType"; import { useCommunicationTypeStore } from "@/stores/admin/settings/communicationType";
import type { CommunicationTypeViewModel } from "@/viewmodels/admin/configuration/communicationType.models"; import type { CommunicationTypeViewModel } from "@/viewmodels/admin/settings/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/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/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/configuration/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/settings/executivePosition";
import type { ExecutivePositionViewModel } from "@/viewmodels/admin/configuration/executivePosition.models"; import type { ExecutivePositionViewModel } from "@/viewmodels/admin/settings/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/configuration/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/settings/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/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/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/configuration/qualification"; import { useQualificationStore } from "@/stores/admin/settings/qualification";
import type { QualificationViewModel } from "@/viewmodels/admin/configuration/qualification.models"; import type { QualificationViewModel } from "@/viewmodels/admin/settings/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/configuration/qualification"; import { useQualificationStore } from "@/stores/admin/settings/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/configuration/qualification"; import { useQualificationStore } from "@/stores/admin/settings/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/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus";
import type { MembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/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/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/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', 'configuration', 'award')" v-if="can('update', 'settings', 'award')"
:to="{ name: 'admin-configuration-award-edit', params: { id: award.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'award')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/award.models"; import type { AwardViewModel } from "@/viewmodels/admin/settings/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/configuration/award/DeleteAwardModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/settings/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/configuration/award"; import { useAwardStore } from "@/stores/admin/settings/award";
import type { CreateAwardViewModel } from "@/viewmodels/admin/configuration/award.models"; import type { CreateAwardViewModel } from "@/viewmodels/admin/settings/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/management/role"; import { useRoleStore } from "@/stores/admin/user/role";
import { useAwardStore } from "@/stores/admin/configuration/award"; import { useAwardStore } from "@/stores/admin/settings/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', 'configuration', 'calendar_type')" v-if="can('update', 'settings', 'calendar_type')"
:to="{ name: 'admin-configuration-calendar_type-edit', params: { id: calendarType.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'calendar_type')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/calendarType.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -46,9 +46,7 @@ export default defineComponent({
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent( defineAsyncComponent(() => import("@/components/admin/settings/calendarType/DeleteCalendarTypeModal.vue"))
() => 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/configuration/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType";
import type { CreateCalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models"; import type { CreateCalendarTypeViewModel } from "@/viewmodels/admin/settings/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/configuration/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/settings/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', 'configuration', 'communication_type')" v-if="can('update', 'settings', 'communication_type')"
:to="{ name: 'admin-configuration-communication_type-edit', params: { id: communicationType.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'communication_type')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/communicationType.models"; import type { CommunicationTypeViewModel } from "@/viewmodels/admin/settings/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/configuration/communicationType/DeleteCommunicationTypeModal.vue") () => import("@/components/admin/settings/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/configuration/communicationType"; import { useCommunicationTypeStore } from "@/stores/admin/settings/communicationType";
import type { CreateCommunicationTypeViewModel } from "@/viewmodels/admin/configuration/communicationType.models"; import type { CreateCommunicationTypeViewModel } from "@/viewmodels/admin/settings/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/configuration/communicationType"; import { useCommunicationTypeStore } from "@/stores/admin/settings/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/configuration/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/settings/executivePosition";
import type { CreateExecutivePositionViewModel } from "@/viewmodels/admin/configuration/executivePosition.models"; import type { CreateExecutivePositionViewModel } from "@/viewmodels/admin/settings/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/management/role"; import { useRoleStore } from "@/stores/admin/user/role";
import { useExecutivePositionStore } from "@/stores/admin/configuration/executivePosition"; import { useExecutivePositionStore } from "@/stores/admin/settings/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', 'configuration', 'executive_position')" v-if="can('update', 'settings', 'executive_position')"
:to="{ name: 'admin-configuration-executive_position-edit', params: { id: executivePosition.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'executive_position')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/executivePosition.models"; import type { ExecutivePositionViewModel } from "@/viewmodels/admin/settings/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/configuration/executivePosition/DeleteExecutivePositionModal.vue") () => import("@/components/admin/settings/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/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/membershipStatus";
import type { CreateMembershipStatusViewModel } from "@/viewmodels/admin/configuration/membershipStatus.models"; import type { CreateMembershipStatusViewModel } from "@/viewmodels/admin/settings/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/management/role"; import { useRoleStore } from "@/stores/admin/user/role";
import { useMembershipStatusStore } from "@/stores/admin/configuration/membershipStatus"; import { useMembershipStatusStore } from "@/stores/admin/settings/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', 'configuration', 'membership_status')" v-if="can('update', 'settings', 'membership_status')"
:to="{ name: 'admin-configuration-membership_status-edit', params: { id: membershipStatus.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'membership_status')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/membershipStatus.models"; import type { MembershipStatusViewModel } from "@/viewmodels/admin/settings/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/configuration/membershipStatus/DeleteMembershipStatusModal.vue") () => import("@/components/admin/settings/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', 'configuration', 'newsletter_config')" class="flex flex-row justify-end w-16"> <div v-if="can('create','settings','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,9 +18,7 @@
<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"> <option v-for="config in configs" :key="config" :value="config">{{ config == "pdf" ? "pdf mit Adresse":config }}</option>
{{ config == "pdf" ? "pdf mit Adresse" : config }}
</option>
</select> </select>
</div> </div>
</div> </div>
@ -31,14 +29,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/configuration/newsletterConfig"; import { useNewsletterConfigStore } from "@/stores/admin/settings/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/configuration/communicationType.models"; import type { CommunicationTypeViewModel } from "@/viewmodels/admin/settings/communicationType.models";
import { useAbilityStore } from "@/stores/ability"; import { useAbilityStore } from "@/stores/ability";
</script> </script>
@ -58,8 +56,8 @@ export default defineComponent({
...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);
@ -76,18 +74,17 @@ 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 request.then(() => {
.then(() => {
this.status = { status: "success" }; this.status = { status: "success" };
this.timeout = setTimeout(() => { this.timeout = setTimeout(() => {
this.status = null; this.status = null;

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/configuration/qualification"; import { useQualificationStore } from "@/stores/admin/settings/qualification";
import type { CreateQualificationViewModel } from "@/viewmodels/admin/configuration/qualification.models"; import type { CreateQualificationViewModel } from "@/viewmodels/admin/settings/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/management/role"; import { useRoleStore } from "@/stores/admin/user/role";
import { useQualificationStore } from "@/stores/admin/configuration/qualification"; import { useQualificationStore } from "@/stores/admin/settings/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', 'configuration', 'qualification')" v-if="can('update', 'settings', 'qualification')"
:to="{ name: 'admin-configuration-qualification-edit', params: { id: qualification.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'qualification')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/qualification.models"; import type { QualificationViewModel } from "@/viewmodels/admin/settings/qualification.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -45,9 +45,7 @@ export default defineComponent({
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(
defineAsyncComponent( defineAsyncComponent(() => import("@/components/admin/settings/qualification/DeleteQualificationModal.vue"))
() => 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/configuration/queryStore"; import { useQueryStoreStore } from "@/stores/admin/settings/queryStore";
import type { CreateQueryViewModel } from "@/viewmodels/admin/configuration/query.models"; import type { CreateQueryViewModel } from "@/viewmodels/admin/settings/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/configuration/queryStore"; import { useQueryStoreStore } from "@/stores/admin/settings/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', 'configuration', 'query_store')" @click="loadUpdate"> <div v-if="can('update', 'settings', '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', 'configuration', 'query_store')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/query.models"; import type { QueryViewModel } from "@/viewmodels/admin/settings/query.models";
import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder"; import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder";
</script> </script>
@ -45,9 +45,7 @@ export default defineComponent({
}, },
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(defineAsyncComponent(() => import("@/components/admin/settings/queryStore/DeleteQueryStoreModal.vue"))),
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/configuration/queryStore"; import { useQueryStoreStore } from "@/stores/admin/settings/queryStore";
import type { CreateQueryViewModel, UpdateQueryViewModel } from "@/viewmodels/admin/configuration/query.models"; import type { CreateQueryViewModel, UpdateQueryViewModel } from "@/viewmodels/admin/settings/query.models";
import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder"; import { useQueryBuilderStore } from "@/stores/admin/club/queryBuilder";
</script> </script>
@ -67,9 +67,7 @@ export default defineComponent({
...mapActions(useQueryStoreStore, ["updateActiveQueryStore"]), ...mapActions(useQueryStoreStore, ["updateActiveQueryStore"]),
changeToCreate() { changeToCreate() {
this.openModal( this.openModal(
markRaw( markRaw(defineAsyncComponent(() => import("@/components/admin/settings/queryStore/CreateQueryStoreModal.vue")))
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/configuration/salutation"; import { useSalutationStore } from "@/stores/admin/settings/salutation";
import type { CreateSalutationViewModel } from "@/viewmodels/admin/configuration/salutation.models"; import type { CreateSalutationViewModel } from "@/viewmodels/admin/settings/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/management/role"; import { useRoleStore } from "@/stores/admin/user/role";
import { useSalutationStore } from "@/stores/admin/configuration/salutation"; import { useSalutationStore } from "@/stores/admin/settings/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', 'configuration', 'salutation')" v-if="can('update', 'settings', 'salutation')"
:to="{ name: 'admin-configuration-salutation-edit', params: { id: salutation.id } }" :to="{ name: 'admin-settings-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', 'configuration', 'salutation')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/salutation.models"; import type { SalutationViewModel } from "@/viewmodels/admin/settings/salutation.models";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -38,9 +38,7 @@ export default defineComponent({
...mapActions(useModalStore, ["openModal"]), ...mapActions(useModalStore, ["openModal"]),
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(defineAsyncComponent(() => import("@/components/admin/settings/salutation/DeleteSalutationModal.vue"))),
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/configuration/template"; import { useTemplateStore } from "@/stores/admin/settings/template";
import type { CreateTemplateViewModel } from "@/viewmodels/admin/configuration/template.models"; import type { CreateTemplateViewModel } from "@/viewmodels/admin/settings/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-configuration-template-edit", params: { id: res.data } }); this.$router.push({ name: "admin-settings-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/configuration/queryStore"; import { useQueryStoreStore } from "@/stores/admin/settings/queryStore";
import { useTemplateStore } from "@/stores/admin/configuration/template"; import { useTemplateStore } from "@/stores/admin/settings/template";
</script> </script>
<script lang="ts"> <script lang="ts">

View file

@ -4,8 +4,8 @@
<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', 'configuration', 'template')" v-if="can('update', 'settings', 'template')"
:to="{ name: 'admin-configuration-template-edit', params: { id: template.id } }" :to="{ name: 'admin-settings-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>
@ -15,7 +15,7 @@
<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', 'configuration', 'template')" @click="openDeleteModal"> <div v-if="can('delete', 'settings', '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/configuration/template.models"; import type { TemplateViewModel } from "@/viewmodels/admin/settings/template.models";
import { useTemplateStore } from "@/stores/admin/configuration/template"; import { useTemplateStore } from "@/stores/admin/settings/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";
@ -66,9 +66,7 @@ export default defineComponent({
...mapActions(useTemplateStore,["cloneTemplate"]), ...mapActions(useTemplateStore,["cloneTemplate"]),
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw( markRaw(defineAsyncComponent(() => import("@/components/admin/settings/template/DeleteTemplateModal.vue"))),
defineAsyncComponent(() => import("@/components/admin/configuration/template/DeleteTemplateModal.vue"))
),
this.template.id this.template.id
); );
}, },
@ -78,13 +76,13 @@ export default defineComponent({
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-configuration-template-edit", params: { id: res.data } }); this.$router.push({ name: "admin-settings-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/configuration/templateUsage"; import { useTemplateUsageStore } from "@/stores/admin/settings/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,24 +6,13 @@
<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 <button v-if="status == null && can('create','settings','newsletter_config')" type="submit" class="!p-0 !h-fit !w-fit" title="speichern">
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 <button type="button" v-if="can('create','settings','newsletter_config')" class="!p-0 !h-fit !w-fit" title="zurücksetzen" @click="resetForm">
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>
@ -34,21 +23,12 @@
<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"> <option v-for="template in templates" :key="template.id" :value="template.id">{{ template.template }}</option>
{{ 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 <input id="headerHeight" type="number" :min="15" v-model="templateUsage.headerHeight" class="!w-24" placeholder="15">
id="headerHeight"
type="number"
:min="15"
v-model="templateUsage.headerHeight"
class="!w-24"
placeholder="15"
/>
</div> </div>
</div> </div>
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
@ -63,21 +43,12 @@
<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"> <option v-for="template in templates" :key="template.id" :value="template.id">{{ template.template }}</option>
{{ 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 <input id="footerHeight" type="number" :min="15" v-model="templateUsage.footerHeight" class="!w-24" placeholder="15">
id="footerHeight"
type="number"
:min="15"
v-model="templateUsage.footerHeight"
class="!w-24"
placeholder="15"
/>
</div> </div>
</div> </div>
</div> </div>
@ -88,9 +59,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/configuration/templateUsage.models"; import type { TemplateUsageViewModel } from "@/viewmodels/admin/settings/templateUsage.models";
import { useTemplateStore } from "@/stores/admin/configuration/template"; import { useTemplateStore } from "@/stores/admin/settings/template";
import { useTemplateUsageStore } from "@/stores/admin/configuration/templateUsage"; import { useTemplateUsageStore } from "@/stores/admin/settings/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";
@ -123,11 +94,9 @@ export default defineComponent({
...mapActions(useTemplateUsageStore, ["updateTemplateUsage"]), ...mapActions(useTemplateUsageStore, ["updateTemplateUsage"]),
previewUsage() { previewUsage() {
this.openModal( this.openModal(
markRaw( markRaw(defineAsyncComponent(() => import("@/components/admin/settings/templateUsage/TemplatePreviewModal.vue"))),
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;
@ -137,14 +106,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', 'management', 'backup')" @click="openRestoreModal"> <div v-if="can('admin', 'user', '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/management/backup"; import { useBackupStore } from "../../../../stores/admin/user/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/management/backup/RestoreBackupModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/user/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/management/backup"; import { useBackupStore } from "@/stores/admin/user/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/management/backup"; import { useBackupStore } from "@/stores/admin/user/backup";
import type { BackupRestoreViewModel } from "../../../../viewmodels/admin/management/backup.models"; import type { BackupRestoreViewModel } from "../../../../viewmodels/admin/user/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/management/backup"; import { useBackupStore } from "@/stores/admin/user/backup";
</script> </script>
<script lang="ts"> <script lang="ts">
@ -75,6 +75,7 @@ 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/management/role"; import { useRoleStore } from "@/stores/admin/user/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/management/role"; import { useRoleStore } from "@/stores/admin/user/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', 'management', 'role')" v-if="can('admin', 'user', 'role')"
:to="{ name: 'admin-management-role-permission', params: { id: role.id } }" :to="{ name: 'admin-user-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', 'management', 'role')" v-if="can('update', 'user', 'role')"
:to="{ name: 'admin-management-role-edit', params: { id: role.id } }" :to="{ name: 'admin-user-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', 'management', 'role')" @click="openDeleteModal"> <div v-if="can('delete', 'user', '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/management/role.models"; import type { RoleViewModel } from "@/viewmodels/admin/user/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/management/role/DeleteRoleModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/user/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/management/user"; import { useUserStore } from "@/stores/admin/user/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', 'management', 'user')" @click="triggerDeleteInvite"> <div v-if="can('delete', 'user', '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/management/invite.models"; import type { InviteViewModel } from "@/viewmodels/admin/user/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/management/invite"; import { useInviteStore } from "@/stores/admin/user/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/management/invite"; import { useInviteStore } from "@/stores/admin/user/invite";
import type { CreateInviteViewModel } from "@/viewmodels/admin/management/invite.models"; import type { CreateInviteViewModel } from "@/viewmodels/admin/user/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', 'management', 'user')" v-if="can('admin', 'user', 'user')"
:to="{ name: 'admin-management-user-roles', params: { id: user.id } }" :to="{ name: 'admin-user-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', 'management', 'user')" v-if="can('admin', 'user', 'user')"
:to="{ name: 'admin-management-user-permission', params: { id: user.id } }" :to="{ name: 'admin-user-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', 'management', 'user')" v-if="can('update', 'user', 'user')"
:to="{ name: 'admin-management-user-edit', params: { id: user.id } }" :to="{ name: 'admin-user-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', 'management', 'user')" v-if="can('delete', 'user', '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/management/user.models"; import type { UserViewModel } from "@/viewmodels/admin/user/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/management/user/DeleteUserModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/user/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/management/webapi"; import { useWebapiStore } from "@/stores/admin/user/webapi";
import type { CreateWebapiViewModel } from "../../../../viewmodels/admin/management/webapi.models"; import type { CreateWebapiViewModel } from "../../../../viewmodels/admin/user/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/management/webapi"; import { useWebapiStore } from "@/stores/admin/user/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', 'management', 'webapi')" @click="openTokenViewModal"> <div v-if="can('admin', 'user', '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', 'management', 'webapi')" v-if="can('admin', 'user', 'webapi')"
:to="{ name: 'admin-management-webapi-permission', params: { id: webapi.id } }" :to="{ name: 'admin-user-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', 'management', 'webapi')" v-if="can('update', 'user', 'webapi')"
:to="{ name: 'admin-management-webapi-edit', params: { id: webapi.id } }" :to="{ name: 'admin-user-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', 'management', 'webapi')" @click="openDeleteModal"> <div v-if="can('delete', 'user', '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/management/webapi.models"; import type { WebapiViewModel } from "@/viewmodels/admin/user/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/management/webapi/WebapiTokenModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/user/webapi/WebapiTokenModal.vue"))),
this.webapi.id this.webapi.id
); );
}, },
openDeleteModal() { openDeleteModal() {
this.openModal( this.openModal(
markRaw(defineAsyncComponent(() => import("@/components/admin/management/webapi/DeleteWebapiModal.vue"))), markRaw(defineAsyncComponent(() => import("@/components/admin/user/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/configuration/calendarType"; import { useCalendarTypeStore } from "@/stores/admin/settings/calendarType";
import type { CalendarTypeViewModel } from "@/viewmodels/admin/configuration/calendarType.models"; import type { CalendarTypeViewModel } from "@/viewmodels/admin/settings/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/management/webapi"; import { useWebapiStore } from "../../../../stores/admin/user/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', 'configuration', 'query_store')" v-if="allowPredefinedSelect && can('read', 'settings', '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', 'configuration', 'query_store')" v-if="can('create', 'settings', '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/configuration/queryStore"; import { useQueryStoreStore } from "@/stores/admin/settings/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;
if ((admin && ability.isAdmin()) || ability.can(type, section, module)) {
NProgress.done();
navigation.activeNavigation = to.name.split("-")[1]; navigation.activeNavigation = to.name.split("-")[1];
navigation.activeLink = to.name.split("-")[2]; navigation.activeLink = to.name.split("-")[2];
if (ability.can(type, section, module)) {
NProgress.done();
next(); next();
} else { } else {
NProgress.done(); NProgress.done();

View file

@ -1,4 +1,4 @@
import { useBackupStore } from "../stores/admin/management/backup"; import { useBackupStore } from "../stores/admin/user/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: "configuration", path: "settings",
name: "admin-configuration", name: "admin-settings",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration" }, meta: { type: "read", section: "settings" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-default", name: "admin-settings-default",
component: () => import("@/views/admin/ViewSelect.vue"), component: () => import("@/views/admin/ViewSelect.vue"),
meta: { type: "read", section: "configuration" }, meta: { type: "read", section: "settings" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "qualification", path: "qualification",
name: "admin-configuration-qualification-route", name: "admin-settings-qualification-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "qualification" }, meta: { type: "read", section: "settings", module: "qualification" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-qualification", name: "admin-settings-qualification",
component: () => import("@/views/admin/configuration/qualification/Qualification.vue"), component: () => import("@/views/admin/settings/qualification/Qualification.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-qualification-edit", name: "admin-settings-qualification-edit",
component: () => import("@/views/admin/configuration/qualification/QualificationEdit.vue"), component: () => import("@/views/admin/settings/qualification/QualificationEdit.vue"),
meta: { type: "update", section: "configuration", module: "qualification" }, meta: { type: "update", section: "settings", module: "qualification" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -335,21 +335,21 @@ const router = createRouter({
}, },
{ {
path: "award", path: "award",
name: "admin-configuration-award-route", name: "admin-settings-award-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "award" }, meta: { type: "read", section: "settings", module: "award" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-award", name: "admin-settings-award",
component: () => import("@/views/admin/configuration/award/Award.vue"), component: () => import("@/views/admin/settings/award/Award.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-award-edit", name: "admin-settings-award-edit",
component: () => import("@/views/admin/configuration/award/AwardEdit.vue"), component: () => import("@/views/admin/settings/award/AwardEdit.vue"),
meta: { type: "update", section: "configuration", module: "award" }, meta: { type: "update", section: "settings", 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-configuration-executive_position-route", name: "admin-settings-executive_position-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "executive_position" }, meta: { type: "read", section: "settings", module: "executive_position" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-executive_position", name: "admin-settings-executive_position",
component: () => import("@/views/admin/configuration/executivePosition/ExecutivePosition.vue"), component: () => import("@/views/admin/settings/executivePosition/ExecutivePosition.vue"),
meta: { type: "read", section: "configuration", module: "executive_position" }, meta: { type: "read", section: "settings", module: "executive_position" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-executive_position-edit", name: "admin-settings-executive_position-edit",
component: () => import("@/views/admin/configuration/executivePosition/ExecutivePositionEdit.vue"), component: () => import("@/views/admin/settings/executivePosition/ExecutivePositionEdit.vue"),
meta: { type: "update", section: "configuration", module: "executive_position" }, meta: { type: "update", section: "settings", 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-configuration-communication_type-route", name: "admin-settings-communication_type-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "communication_type" }, meta: { type: "read", section: "settings", module: "communication_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-communication_type", name: "admin-settings-communication_type",
component: () => import("@/views/admin/configuration/communicationType/CommunicationType.vue"), component: () => import("@/views/admin/settings/communicationType/CommunicationType.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-communication_type-edit", name: "admin-settings-communication_type-edit",
component: () => import("@/views/admin/configuration/communicationType/CommunicationTypeEdit.vue"), component: () => import("@/views/admin/settings/communicationType/CommunicationTypeEdit.vue"),
meta: { type: "update", section: "configuration", module: "communication_type" }, meta: { type: "update", section: "settings", module: "communication_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -403,21 +403,21 @@ const router = createRouter({
}, },
{ {
path: "status", path: "status",
name: "admin-configuration-membership_status-route", name: "admin-settings-membership_status-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "membership_status" }, meta: { type: "read", section: "settings", module: "membership_status" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-membership_status", name: "admin-settings-membership_status",
component: () => import("@/views/admin/configuration/membershipStatus/MembershipStatus.vue"), component: () => import("@/views/admin/settings/membershipStatus/MembershipStatus.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-membership_status-edit", name: "admin-settings-membership_status-edit",
component: () => import("@/views/admin/configuration/membershipStatus/MembershipStatusEdit.vue"), component: () => import("@/views/admin/settings/membershipStatus/MembershipStatusEdit.vue"),
meta: { type: "update", section: "configuration", module: "membership_status" }, meta: { type: "update", section: "settings", module: "membership_status" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -425,21 +425,21 @@ const router = createRouter({
}, },
{ {
path: "salutation", path: "salutation",
name: "admin-configuration-salutation-route", name: "admin-settings-salutation-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "salutation" }, meta: { type: "read", section: "settings", module: "salutation" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-salutation", name: "admin-settings-salutation",
component: () => import("@/views/admin/configuration/salutation/Salutation.vue"), component: () => import("@/views/admin/settings/salutation/Salutation.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-salutation-edit", name: "admin-settings-salutation-edit",
component: () => import("@/views/admin/configuration/salutation/SalutationEdit.vue"), component: () => import("@/views/admin/settings/salutation/SalutationEdit.vue"),
meta: { type: "update", section: "configuration", module: "salutation" }, meta: { type: "update", section: "settings", 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-configuration-calendar_type-route", name: "admin-settings-calendar_type-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "calendar_type" }, meta: { type: "read", section: "settings", module: "calendar_type" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-calendar_type", name: "admin-settings-calendar_type",
component: () => import("@/views/admin/configuration/calendarType/CalendarType.vue"), component: () => import("@/views/admin/settings/calendarType/CalendarType.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-calendar_type-edit", name: "admin-settings-calendar_type-edit",
component: () => import("@/views/admin/configuration/calendarType/CalendarTypeEdit.vue"), component: () => import("@/views/admin/settings/calendarType/CalendarTypeEdit.vue"),
meta: { type: "update", section: "configuration", module: "calendar_type" }, meta: { type: "update", section: "settings", 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-configuration-query_store", name: "admin-settings-query_store",
component: () => import("@/views/admin/configuration/queryStore/QueryStore.vue"), component: () => import("@/views/admin/settings/queryStore/QueryStore.vue"),
meta: { type: "read", section: "configuration", module: "query_store" }, meta: { type: "read", section: "settings", module: "query_store" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "template", path: "template",
name: "admin-configuration-template-route", name: "admin-settings-template-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "configuration", module: "template" }, meta: { type: "read", section: "settings", module: "template" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-configuration-template", name: "admin-settings-template",
component: () => import("@/views/admin/configuration/template/Template.vue"), component: () => import("@/views/admin/settings/template/Template.vue"),
}, },
{ {
path: "info", path: "info",
name: "admin-configuration-template-info", name: "admin-settings-template-info",
component: () => import("@/views/admin/configuration/template/UsageInfo.vue"), component: () => import("@/views/admin/settings/template/UsageInfo.vue"),
props: true, props: true,
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-configuration-template-edit", name: "admin-settings-template-edit",
component: () => import("@/views/admin/configuration/template/TemplateEdit.vue"), component: () => import("@/views/admin/settings/template/TemplateEdit.vue"),
meta: { type: "update", section: "configuration", module: "template" }, meta: { type: "update", section: "settings", 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-configuration-template_usage", name: "admin-settings-template_usage",
component: () => import("@/views/admin/configuration/templateUsage/TemplateUsage.vue"), component: () => import("@/views/admin/settings/templateUsage/TemplateUsage.vue"),
meta: { type: "read", section: "configuration", module: "template_usage" }, meta: { type: "read", section: "settings", module: "template_usage" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "newsletter-config", path: "newsletter-config",
name: "admin-configuration-newsletter_config", name: "admin-settings-newsletter_config",
component: () => import("@/views/admin/configuration/newsletterConfig/NewsletterConfig.vue"), component: () => import("@/views/admin/settings/newsletterConfig/NewsletterConfig.vue"),
meta: { type: "read", section: "configuration", module: "newsletter_config" }, meta: { type: "read", section: "settings", module: "newsletter_config" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
], ],
}, },
{ {
path: "management", path: "user",
name: "admin-management", name: "admin-user",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "management" }, meta: { type: "read", section: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-management-default", name: "admin-user-default",
component: () => import("@/views/admin/ViewSelect.vue"), component: () => import("@/views/admin/ViewSelect.vue"),
meta: { type: "read", section: "management" }, meta: { type: "read", section: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
}, },
{ {
path: "user", path: "user",
name: "admin-management-user-route", name: "admin-user-user-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "management", module: "user" }, meta: { type: "read", section: "user", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-management-user", name: "admin-user-user",
component: () => import("@/views/admin/management/user/User.vue"), component: () => import("@/views/admin/user/user/User.vue"),
}, },
{ {
path: "invites", path: "invites",
name: "admin-management-user-invites", name: "admin-user-user-invites",
component: () => import("@/views/admin/management/user/Invite.vue"), component: () => import("@/views/admin/user/user/Invite.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-management-user-edit", name: "admin-user-user-edit",
component: () => import("@/views/admin/management/user/UserEdit.vue"), component: () => import("@/views/admin/user/user/UserEdit.vue"),
meta: { type: "update", section: "management", module: "user" }, meta: { type: "update", section: "user", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/permission", path: ":id/permission",
name: "admin-management-user-permission", name: "admin-user-user-permission",
component: () => import("@/views/admin/management/user/UserEditPermission.vue"), component: () => import("@/views/admin/user/user/UserEditPermission.vue"),
meta: { type: "update", section: "management", module: "user" }, meta: { type: "update", section: "user", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/roles", path: ":id/roles",
name: "admin-management-user-roles", name: "admin-user-user-roles",
component: () => import("@/views/admin/management/user/UserEditRoles.vue"), component: () => import("@/views/admin/user/user/UserEditRoles.vue"),
meta: { type: "update", section: "management", module: "user" }, meta: { type: "update", section: "user", module: "user" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -577,29 +577,29 @@ const router = createRouter({
}, },
{ {
path: "role", path: "role",
name: "admin-management-role-route", name: "admin-user-role-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "management", module: "role" }, meta: { type: "read", section: "user", module: "role" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-management-role", name: "admin-user-role",
component: () => import("@/views/admin/management/role/Role.vue"), component: () => import("@/views/admin/user/role/Role.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-management-role-edit", name: "admin-user-role-edit",
component: () => import("@/views/admin/management/role/RoleEdit.vue"), component: () => import("@/views/admin/user/role/RoleEdit.vue"),
meta: { type: "update", section: "management", module: "role" }, meta: { type: "update", section: "user", module: "role" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/permission", path: ":id/permission",
name: "admin-management-role-permission", name: "admin-user-role-permission",
component: () => import("@/views/admin/management/role/RoleEditPermission.vue"), component: () => import("@/views/admin/user/role/RoleEditPermission.vue"),
meta: { type: "update", section: "management", module: "role" }, meta: { type: "update", section: "user", module: "role" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -607,29 +607,29 @@ const router = createRouter({
}, },
{ {
path: "webapi", path: "webapi",
name: "admin-management-webapi-route", name: "admin-user-webapi-route",
component: () => import("@/views/RouterView.vue"), component: () => import("@/views/RouterView.vue"),
meta: { type: "read", section: "management", module: "webapi" }, meta: { type: "read", section: "user", module: "webapi" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-management-webapi", name: "admin-user-webapi",
component: () => import("@/views/admin/management/webapi/Webapi.vue"), component: () => import("@/views/admin/user/webapi/Webapi.vue"),
}, },
{ {
path: ":id/edit", path: ":id/edit",
name: "admin-management-webapi-edit", name: "admin-user-webapi-edit",
component: () => import("@/views/admin/management/webapi/WebapiEdit.vue"), component: () => import("@/views/admin/user/webapi/WebapiEdit.vue"),
meta: { type: "update", section: "management", module: "webapi" }, meta: { type: "update", section: "user", module: "webapi" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
{ {
path: ":id/permission", path: ":id/permission",
name: "admin-management-webapi-permission", name: "admin-user-webapi-permission",
component: () => import("@/views/admin/management/webapi/WebapiEditPermission.vue"), component: () => import("@/views/admin/user/webapi/WebapiEditPermission.vue"),
meta: { type: "update", section: "management", module: "webapi" }, meta: { type: "update", section: "user", module: "webapi" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
props: true, props: true,
}, },
@ -637,36 +637,34 @@ const router = createRouter({
}, },
{ {
path: "backup", path: "backup",
name: "admin-management-backup-route", name: "admin-user-backup-route",
component: () => import("@/views/admin/management/backup/BackupRouting.vue"), component: () => import("@/views/admin/user/backup/BackupRouting.vue"),
meta: { type: "read", section: "management", module: "backup" }, meta: { type: "read", section: "user", module: "backup" },
beforeEnter: [abilityAndNavUpdate], beforeEnter: [abilityAndNavUpdate],
children: [ children: [
{ {
path: "", path: "",
name: "admin-management-backup", name: "admin-user-backup",
redirect: { name: "admin-management-backup-generated" }, redirect: { name: "admin-user-backup-generated" },
}, },
{ {
path: "generated", path: "generated",
name: "admin-management-backup-generated", name: "admin-user-backup-generated",
component: () => import("@/views/admin/management/backup/GeneratedBackup.vue"), component: () => import("@/views/admin/user/backup/GeneratedBackup.vue"),
beforeEnter: [setBackupPage], beforeEnter: [setBackupPage],
}, },
{ {
path: "uploads", path: "uploads",
name: "admin-management-backup-uploaded", name: "admin-user-backup-uploaded",
component: () => import("@/views/admin/management/backup/UploadedBackup.vue"), component: () => import("@/views/admin/user/backup/UploadedBackup.vue"),
beforeEnter: [setBackupPage], beforeEnter: [setBackupPage],
}, },
], ],
}, },
{ {
path: "version", path: "version",
name: "admin-management-version", name: "admin-user-version",
component: () => import("@/views/admin/management/version/VersionDisplay.vue"), component: () => import("@/views/admin/user/version/VersionDisplay.vue"),
meta: { admin: true },
beforeEnter: [abilityAndNavUpdate],
}, },
], ],
}, },
@ -778,7 +776,6 @@ 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/configuration/query.models"; import type { TableMeta } from "@/viewmodels/admin/settings/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,11 +1,12 @@
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 type navigationModel = { export interface navigationModel {
[key in topLevelNavigationType]: navigationSplitModel; club: navigationSplitModel;
}; settings: navigationSplitModel;
user: navigationSplitModel;
}
export interface navigationSplitModel { export interface navigationSplitModel {
topTitle?: string; topTitle?: string;
@ -14,7 +15,7 @@ export interface navigationSplitModel {
main: Array<navigationLinkModel>; main: Array<navigationLinkModel>;
} }
export type topLevelNavigationType = PermissionSection; export type topLevelNavigationType = "club" | "settings" | "user";
export interface topLevelNavigationModel { export interface topLevelNavigationModel {
key: topLevelNavigationType; key: topLevelNavigationType;
@ -57,20 +58,20 @@ export const useNavigationStore = defineStore("navigation", {
} as topLevelNavigationModel, } as topLevelNavigationModel,
] ]
: []), : []),
...(abilityStore.canSection("read", "configuration") ...(abilityStore.canSection("read", "settings")
? [ ? [
{ {
key: "configuration", key: "settings",
title: "Konfiguration", title: "Einstellungen",
levelDefault: "salutation", levelDefault: "salutation",
} as topLevelNavigationModel, } as topLevelNavigationModel,
] ]
: []), : []),
...(abilityStore.canSection("read", "management") ...(abilityStore.canSection("read", "user")
? [ ? [
{ {
key: "management", key: "user",
title: "Verwaltung", title: "Benutzer",
levelDefault: "user", levelDefault: "user",
} as topLevelNavigationModel, } as topLevelNavigationModel,
] ]
@ -94,49 +95,45 @@ 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" }] : []),
], ],
}, },
configuration: { settings: {
mainTitle: "Einstellungen", mainTitle: "Einstellungen",
main: [ main: [
{ key: "divider1", title: "Mitgliederdaten" }, { key: "divider1", title: "Mitgliederdaten" },
...(abilityStore.can("read", "configuration", "salutation") ...(abilityStore.can("read", "settings", "salutation") ? [{ key: "salutation", title: "Anrede" }] : []),
? [{ key: "salutation", title: "Anrede" }] ...(abilityStore.can("read", "settings", "award") ? [{ key: "award", title: "Auszeichnungen" }] : []),
: []), ...(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", "configuration", "membership_status") ...(abilityStore.can("read", "settings", "membership_status")
? [{ key: "membership_status", title: "Mitgliedsstatus" }] ? [{ key: "membership_status", title: "Mitgliedsstatus" }]
: []), : []),
...(abilityStore.can("read", "configuration", "qualification") ...(abilityStore.can("read", "settings", "qualification")
? [{ key: "qualification", title: "Qualifikationen" }] ? [{ key: "qualification", title: "Qualifikationen" }]
: []), : []),
...(abilityStore.can("read", "configuration", "executive_position") ...(abilityStore.can("read", "settings", "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", "configuration", "newsletter_config") ...(abilityStore.can("read", "settings", "newsletter_config")
? [{ key: "newsletter_config", title: "Newsletter Konfiguration" }] ? [{ key: "newsletter_config", title: "Newsletter Konfiguration" }]
: []), : []),
...(abilityStore.can("read", "configuration", "template") ? [{ key: "template", title: "Templates" }] : []), ...(abilityStore.can("read", "settings", "template") ? [{ key: "template", title: "Templates" }] : []),
...(abilityStore.can("read", "configuration", "template_usage") ...(abilityStore.can("read", "settings", "template_usage")
? [{ key: "template_usage", title: "Template-Verwendung" }] ? [{ key: "template_usage", title: "Template-Verwendung" }]
: []), : []),
...(abilityStore.can("read", "configuration", "calendar_type") ...(abilityStore.can("read", "settings", "calendar_type")
? [{ key: "calendar_type", title: "Terminarten" }] ? [{ key: "calendar_type", title: "Terminarten" }]
: []), : []),
...(abilityStore.can("read", "configuration", "query") ...(abilityStore.can("read", "settings", "query") ? [{ key: "query_store", title: "Query Store" }] : []),
? [{ key: "query_store", title: "Query Store" }]
: []),
], ],
}, },
management: { user: {
mainTitle: "Benutzer", mainTitle: "Benutzer",
main: [ main: [
...(abilityStore.can("read", "management", "user") ? [{ key: "user", title: "Benutzer" }] : []), ...(abilityStore.can("read", "user", "user") ? [{ key: "user", title: "Benutzer" }] : []),
...(abilityStore.can("read", "management", "role") ? [{ key: "role", title: "Rollen" }] : []), ...(abilityStore.can("read", "user", "role") ? [{ key: "role", title: "Rollen" }] : []),
...(abilityStore.can("read", "management", "webapi") ? [{ key: "webapi", title: "Webapi-Token" }] : []), ...(abilityStore.can("read", "user", "webapi") ? [{ key: "webapi", title: "Webapi-Token" }] : []),
...(abilityStore.can("read", "management", "backup") ? [{ key: "backup", title: "Backups" }] : []), ...(abilityStore.can("read", "user", "backup") ? [{ key: "backup", title: "Backups" }] : []),
...(abilityStore.isAdmin() ? [{ key: "version", title: "Version" }] : []), ...(abilityStore.isAdmin() ? [{ key: "version", title: "Version" }] : []),
], ],
}, },

View file

@ -1,9 +1,5 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { import type { CreateAwardViewModel, UpdateAwardViewModel, AwardViewModel } from "@/viewmodels/admin/settings/award.models";
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/configuration/calendarType.models"; } from "@/viewmodels/admin/settings/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/configuration/communicationType.models"; } from "@/viewmodels/admin/settings/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/configuration/executivePosition.models"; } from "@/viewmodels/admin/settings/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/configuration/membershipStatus.models"; } from "@/viewmodels/admin/settings/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/configuration/newsletterConfig.models"; } from "@/viewmodels/admin/settings/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/configuration/qualification.models"; } from "@/viewmodels/admin/settings/qualification.models";
import { http } from "@/serverCom"; import { http } from "@/serverCom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

View file

@ -1,9 +1,5 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import type { import type { CreateQueryViewModel, QueryViewModel, UpdateQueryViewModel } from "@/viewmodels/admin/settings/query.models";
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";
@ -38,17 +34,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", "configuration", "query_store")) { if (queryBuilderStore.activeQueryId != undefined && abilityStore.can("update", "settings", "query_store")) {
modalStore.openModal( modalStore.openModal(
markRaw( markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/queryStore/UpdateQueryStoreModal.vue")) defineAsyncComponent(() => import("@/components/admin/settings/queryStore/UpdateQueryStoreModal.vue"))
), ),
queryBuilderStore.activeQueryId queryBuilderStore.activeQueryId
); );
} else { } else {
modalStore.openModal( modalStore.openModal(
markRaw( markRaw(
defineAsyncComponent(() => import("@/components/admin/configuration/queryStore/CreateQueryStoreModal.vue")) defineAsyncComponent(() => import("@/components/admin/settings/queryStore/CreateQueryStoreModal.vue"))
) )
); );
} }

View file

@ -3,7 +3,7 @@ import type {
CreateSalutationViewModel, CreateSalutationViewModel,
UpdateSalutationViewModel, UpdateSalutationViewModel,
SalutationViewModel, SalutationViewModel,
} from "@/viewmodels/admin/configuration/salutation.models"; } from "@/viewmodels/admin/settings/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/configuration/template.models"; } from "@/viewmodels/admin/settings/template.models";
export const useTemplateStore = defineStore("template", { export const useTemplateStore = defineStore("template", {
state: () => { state: () => {

View file

@ -1,14 +1,8 @@
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 { import type { CreateTemplateViewModel, UpdateTemplateViewModel } from "@/viewmodels/admin/settings/template.models";
CreateTemplateViewModel, import type { TemplateUsageViewModel, UpdateTemplateUsageViewModel } from "@/viewmodels/admin/settings/templateUsage.models";
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/management/backup.models"; import type { BackupRestoreViewModel } from "../../../viewmodels/admin/user/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/management/invite.models"; import type { CreateInviteViewModel, InviteViewModel } from "@/viewmodels/admin/user/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/management/role.models"; import type { RoleViewModel } from "@/viewmodels/admin/user/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/management/user.models"; import type { UpdateUserViewModel, UserViewModel } from "@/viewmodels/admin/user/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/management/webapi.models"; } from "@/viewmodels/admin/user/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,4 +1,4 @@
export type PermissionSection = "club" | "configuration" | "management"; export type PermissionSection = "club" | "settings" | "user";
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", "configuration", "management"]; export const permissionSections: Array<PermissionSection> = ["club", "settings", "user"];
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"],
configuration: [ settings: [
"qualification", "qualification",
"award", "award",
"executive_position", "executive_position",
@ -82,5 +82,5 @@ export const sectionsAndModules: SectionsAndModulesObject = {
"template_usage", "template_usage",
"newsletter_config", "newsletter_config",
], ],
management: ["user", "role", "webapi", "backup"], user: ["user", "role", "webapi", "backup"],
}; };

View file

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

View file

@ -1,4 +1,4 @@
import type { CommunicationTypeViewModel } from "../../configuration/communicationType.models"; import type { CommunicationTypeViewModel } from "../../settings/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 "../../configuration/salutation.models"; import type { SalutationViewModel } from "../../settings/salutation.models";
export interface MemberViewModel { export interface MemberViewModel {
id: string; id: string;

View file

@ -1,4 +1,4 @@
import type { QueryViewModel } from "../../configuration/query.models"; import type { QueryViewModel } from "../../settings/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