import { Model } from '@vuex-orm/core' import { Ability } from '@casl/ability' import { Store } from 'vuex' import { Context } from '@nuxt/types/app' import DataPersister from '~/services/dataPersister/dataPersister' import DataProvider from '~/services/dataProvider/dataProvider' import DataDeleter from '~/services/dataDeleter/dataDeleter' import { ABILITIES, GENDER, QUERY_TYPE, TYPE_ALERT } from '~/types/enums' /** * Upgrade du @nuxt/types pour TypeScript */ declare module '@nuxt/types' { interface Context { $ability: Ability, $dataPersister: DataPersister, $dataProvider: DataProvider, $dataDeleter: DataDeleter, } } interface ItemMenu { title: string, icon?: string, to?: string, children?: ItemsMenu, isExternalLink?: boolean, } interface ItemsMenu extends Array {} interface Menu{ getMenu : () => ItemMenu | null, getHeaderMenu : () => ItemMenu | null, } interface AbilitiesType { action: ABILITIES, subject: string, /** an array of fields to which user has (or not) access */ fields?: string[] /** an object of conditions which restricts the rule scope */ conditions?: any /** indicates whether rule allows or forbids something */ inverted?: boolean /** message which explains why rule is forbidden */ reason?: string } interface formState { dirty: boolean, showConfirmToLeave: boolean, goAfterLeave: string } interface alert{ type: TYPE_ALERT, message: string } interface pageState { alerts: Array, } interface baseAccessState { id: number, name: string, givenName: string, gender: GENDER, avatarId: number } interface Historical { future?: boolean, past?: boolean, present?: boolean, dateStart?: string, dateEnd?: string } interface accessState extends baseAccessState{ bearer: string, switchId: number, activityYear: number, historical: Historical, roles: Array, abilities: Array, isAdminAccess: boolean, isAdmin: boolean, isAdministratifManager: boolean, isPedagogicManager: boolean, isFinancialManager: boolean, isCaMember: boolean, isStudent: boolean, isTeacher: boolean, isMember: boolean, isOther: boolean, hasLateralMenu: boolean, hasConfigurationMenu: boolean, hasAccessesMenu: boolean, hasFamilyMenu: boolean, multiAccesses: Array, familyAccesses: Array, originalAccess: baseAccessState } interface AccessStore extends Store<{profile:{access:accessState}}> {} interface baseOrganizationState { id: number, name: string, website?: string, subDomain?: string } interface organizationState extends baseOrganizationState{ id: number, name: string, product?: string, modules?: Array, hasChildren?: boolean, networks: Array, parents: Array, } interface OrganizationStore extends Store<{profile:{organization:organizationState}}> {} interface AnyJson extends Record {} interface AnyStore extends Store {} interface EnumChoice { value: string, label: string } interface EnumChoices extends Array {} interface UrlArgs { readonly type: QUERY_TYPE, readonly url?:string, readonly enumType?:string, readonly model?: typeof Model, readonly rootModel?: typeof Model, readonly id?:any, readonly rootId?:number readonly progress?:boolean } interface DataPersisterArgs extends UrlArgs{ data?: AnyJson, readonly hook?: string } interface DataDeleterArgs extends UrlArgs{ readonly hook?: string } interface HookPersister{ invoke(args: DataPersisterArgs): Promise, } interface HookDeleter{ invoke(args: DataDeleterArgs): Promise, } interface DataProviderArgs extends UrlArgs{ readonly hook?: string } interface HookProvider{ invoke(args: DataProviderArgs): Promise, } interface Provider{ invoke(data: AnyJson): Promise, } interface Denormalizer{ denormalize(data: any): any, } interface Normalizer{ normalize(args: DataPersisterArgs): any, } interface DataProviders{ initCtx(ctx: Context): void, invoke(args: DataProviderArgs): Promise, }