\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","
\r\n \r\n \r\n
{{ group.label }}
\r\n
\r\n
\r\n\r\n
\r\n\r\n \r\n\r\n \r\n\r\n\r\n","
\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n","import type {PropType, ComponentObjectPropsOptions} from \"vue\";\r\n\r\nimport {useEmitableVisibilityEvents, useVisibilityEvents} from \"./useVisibilityEvents\";\r\nimport {computed, onBeforeUnmount, onMounted, ref} from \"vue\";\r\nimport {Modal} from \"bootstrap\";\r\n\r\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"max\" | \"fullscreen\";\r\n\r\nexport interface ModalProps {\r\n backdrop: string | boolean;\r\n centered: boolean;\r\n focus: boolean;\r\n keyboard: boolean;\r\n size: ModalSize;\r\n}\r\n\r\nexport const modalPropsOptions: ComponentObjectPropsOptions
= {\r\n backdrop: {\r\n type: [String, Boolean],\r\n default: true\r\n },\r\n centered: {\r\n type: Boolean,\r\n default: false\r\n },\r\n focus: {\r\n type: Boolean,\r\n default: true\r\n },\r\n keyboard: {\r\n type: Boolean,\r\n default: true\r\n },\r\n size: {\r\n type: String as PropType,\r\n default: \"md\"\r\n }\r\n}\r\n\r\nexport const useModal = (props: TProps, emit: any) => {\r\n\r\n const visible = ref(false);\r\n const shown = ref(false);\r\n const modalElement = ref();\r\n\r\n const modal = ref();\r\n\r\n useEmitableVisibilityEvents(\"modal\", emit, {element: modalElement});\r\n useVisibilityEvents(\"modal\", {\r\n element: modalElement,\r\n onShow: () => visible.value = true,\r\n onShown: () => shown.value = true,\r\n onHide: () => shown.value = false,\r\n onHidden: () => visible.value = false,\r\n });\r\n\r\n const dialogClass = computed(() => [\r\n \"modal-dialog\",\r\n props.centered ? \"modal-dialog-centered\" : undefined,\r\n props.size === \"sm\" ? \"modal-sm\" : undefined,\r\n props.size === \"lg\" ? \"modal-lg\" : undefined,\r\n props.size === \"xl\" ? \"modal-xl\" : undefined,\r\n props.size === \"max\" ? \"modal-max\" : undefined,\r\n props.size === \"fullscreen\" ? \"modal-fullscreen\" : undefined,\r\n ].filter(Boolean));\r\n\r\n const toggle = () => modal.value?.toggle();\r\n const show = () => modal.value?.show();\r\n const hide = () => modal.value?.hide();\r\n const handleUpdate = () => modal.value?.handleUpdate();\r\n\r\n onMounted(() => {\r\n const element = modalElement.value;\r\n\r\n document.getElementById(\"app\")?.appendChild(element);\r\n \r\n modal.value = new Modal(element, {\r\n keyboard: props.keyboard,\r\n backdrop: props.backdrop,\r\n focus: props.focus\r\n })\r\n onBeforeUnmount(() => {\r\n modal.value?.dispose();\r\n });\r\n });\r\n\r\n\r\n return {\r\n shown,\r\n visible,\r\n dialogClass,\r\n modalElement,\r\n\r\n handleUpdate,\r\n toggle,\r\n show,\r\n hide\r\n\r\n }\r\n\r\n}","\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import type {Ref} from \"vue\";\r\nimport {inject, InjectionKey, provide} from \"vue\";\r\n\r\nexport interface TabInfo {\r\n id: Ref;\r\n icon: Ref;\r\n linkText: Ref;\r\n fieldErrorCount: Ref;\r\n show?():void\r\n}\r\n\r\nexport interface PaneSubscription {\r\n addTab(tab: TabInfo): void;\r\n removeTab(tab: TabInfo): void;\r\n}\r\n\r\nconst INJECTION_KEY: InjectionKey = Symbol(\"AUNOA_PANE_SUBSCRIPTION\");\r\n\r\nexport const providePaneSubscription = (paneSubscription:PaneSubscription) => {\r\n \r\n provide(INJECTION_KEY, paneSubscription); \r\n}\r\n\r\nexport const usePaneSubscription = () => {\r\n const paneSubscription = inject(INJECTION_KEY, undefined);\r\n\r\n return {\r\n paneSubscription\r\n }\r\n}","import {inject, InjectionKey, provide, Ref} from \"vue\";\r\n\r\nconst INJECTION_KEY: InjectionKey[ = Symbol(\"AUNOA_PANE_CLASS\");\r\n\r\nexport const providePaneClass = (paneClass:Ref) => {\r\n provide(INJECTION_KEY, paneClass);\r\n}\r\n\r\nexport const usePaneClass = () => {\r\n\r\n const paneClass = inject(INJECTION_KEY, undefined);\r\n\r\n return {\r\n paneClass\r\n }\r\n}","\r\n ]\r\n \r\n
\r\n\r\n\r\n\r\n\r\n","import type {PaneSubscription} from \"./usePaneSubscription\";\r\n\r\nimport {inject, InjectionKey, provide} from \"vue\";\r\n\r\ninterface ContentSubscription extends PaneSubscription {\r\n setSortedTabIds(ids: string[]): void;\r\n}\r\n\r\nconst INJECTION_KEY: InjectionKey = Symbol(\"AUNOA_CONTENT_SUBSCRIPTION\");\r\n\r\nexport const provideContentSubscription = (contentSubscription:ContentSubscription) => {\r\n\r\n provide(INJECTION_KEY, contentSubscription);\r\n}\r\n\r\nexport const useContentSubscription = () => {\r\n const contentSubscription = inject(INJECTION_KEY, undefined);\r\n\r\n return {\r\n contentSubscription\r\n }\r\n}","\r\n \r\n \r\n
\r\n\r\n\r\n\r\n\r\n","\r\n \r\n\r\n\r\n\r\n\r\n","\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n","import {App} from \"vue\";\r\nimport AunoaTabContent from \"./AunoaTabContent.vue\";\r\nimport AunoaTabNav from \"./AunoaTabNav.vue\";\r\nimport AunoaTabNavLink from \"./AunoaTabNavLink.vue\";\r\nimport AunoaTabPane from \"./AunoaTabPane.vue\";\r\n\r\nexport interface TabComponentOptions {\r\n}\r\n\r\nexport const installTabComponents = (app: App, options: TabComponentOptions) => {\r\n options = options || {};\r\n app\r\n .component(AunoaTabContent.name, AunoaTabContent)\r\n .component(AunoaTabNav.name, AunoaTabNav)\r\n .component(AunoaTabNavLink.name, AunoaTabNavLink)\r\n .component(AunoaTabPane.name, AunoaTabPane);\r\n};\r\n\r\nexport {\r\n AunoaTabContent,\r\n AunoaTabNav,\r\n AunoaTabNavLink,\r\n AunoaTabPane\r\n}\r\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n\r\n\r\n\r\n\r\n","\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n
\r\n\r\n\r\n\r\n\r\n","import {defineComponent, PropType} from \"vue\";\r\n\r\nexport interface User {\r\n id: string;\r\n username: string;\r\n emailAddress?: string;\r\n}\r\n\r\n\r\nexport default defineComponent({\r\n props: {\r\n user: {\r\n type: Object as PropType,\r\n default: undefined\r\n }\r\n }\r\n});\r\n","\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import {Ref} from \"vue\";\r\nimport type {User} from \"../../mixins/UserMixin\";\r\nimport {computed, ref, watch} from \"vue\";\r\nimport {storageDefaultNamespace} from \"../../core\";\r\n\r\n//export type StorageItem = T | null | undefined;\r\n\r\nexport const useStorage = (storage: Storage, user?: User) => {\r\n\r\n let namespace = storageDefaultNamespace.value || \"AUNOA\";\r\n if (user && user.id) {\r\n namespace = `${namespace}.${user.id}`;\r\n }\r\n\r\n const items = (prefix?: string | undefined) => {\r\n let rootKey = namespace + \".\";\r\n if (prefix) {\r\n rootKey = rootKey + prefix + \".\";\r\n }\r\n\r\n const _subscribe = (\r\n name: string,\r\n convToStorage: (value: T | undefined) => string | undefined,\r\n convToValue: (str: string) => T | undefined,\r\n defaultValue?: any): Ref => {\r\n\r\n const key = rootKey + name;\r\n const internal = ref(storage.getItem(key));\r\n\r\n //console.log(\"initial\", key, internal.value);\r\n\r\n watch(internal, value => {\r\n if (value === undefined) {\r\n storage.removeItem(key);\r\n } else if (value === null) {\r\n storage.setItem(key, \"null\");\r\n } else {\r\n storage.setItem(key, value);\r\n }\r\n });\r\n\r\n window.addEventListener(\"storage\", (ev: StorageEvent) => {\r\n if (ev.storageArea === storage) {\r\n if (ev.key === null) {\r\n internal.value = undefined;\r\n } else if (ev.key === key) {\r\n internal.value = ev.newValue;\r\n }\r\n }\r\n });\r\n\r\n return computed({\r\n get(ctx?: any) {\r\n const str = internal.value;\r\n //console.log(key, str, ctx);\r\n if (str === undefined || str === null) {\r\n return defaultValue;\r\n }\r\n if (str === \"null\") {\r\n return null;\r\n }\r\n try {\r\n const value = convToValue(str);\r\n return value !== null\r\n ? value\r\n : defaultValue;\r\n } catch (e) {\r\n console.error(`Error parsing ${str} as Key: ${key}`);\r\n return defaultValue;\r\n }\r\n },\r\n set(value: T | null | undefined) {\r\n if (value === undefined) {\r\n internal.value = value;\r\n } else if (value === null) {\r\n internal.value = value;\r\n } else {\r\n internal.value = convToStorage(value)\r\n }\r\n }\r\n });\r\n };\r\n\r\n const subscribeObject = (name: string, defaultValue?: T) =>\r\n _subscribe(\r\n name,\r\n JSON.stringify,\r\n JSON.parse,\r\n defaultValue);\r\n\r\n const subscribeString = (name: string, defaultValue?: T) =>\r\n _subscribe(\r\n name,\r\n value => value,\r\n str => str,\r\n defaultValue);\r\n\r\n const subscribeInt = (name: string, defaultValue?: number) =>\r\n _subscribe(\r\n name,\r\n value => value?.toString(),\r\n parseInt,\r\n defaultValue);\r\n\r\n const subscribeFloat = (name: string, defaultValue?: number) =>\r\n _subscribe(\r\n name,\r\n value => value?.toString(),\r\n parseFloat,\r\n defaultValue);\r\n\r\n const subscribeBoolean = (name: string, defaultValue?: boolean) =>\r\n _subscribe(\r\n name,\r\n value => value?.toString(),\r\n str => str.toLowerCase() === \"true\"\r\n ? true\r\n : (str.toLowerCase() === \"false\" ? false : undefined),\r\n defaultValue);\r\n\r\n return {\r\n subscribeObject,\r\n subscribeString,\r\n subscribeInt,\r\n subscribeFloat,\r\n subscribeBoolean\r\n }\r\n };\r\n\r\n return {\r\n items\r\n }\r\n\r\n};","import type {User} from \"../../mixins/UserMixin\";\r\nimport {useStorage} from \"./useStorage\";\r\n\r\nexport const useLocalStorage = (user?: User) => useStorage(localStorage, user);","import type {Ref} from \"vue\";\r\nimport type {User} from \"../mixins/UserMixin\";\r\nimport type {RouteLocation} from \"vue-router\";\r\n\r\nimport {useLocalStorage} from \"./storage/useLocalStorage\";\r\nimport {singleton} from \"./singletons\";\r\n\r\ninterface PageStorage {\r\n path: string;\r\n}\r\n\r\ninterface Storage {\r\n version: number;\r\n storedAt: Date;\r\n pages: PageStorage[];\r\n}\r\n\r\nconst createStorage = (pages: PageStorage[]): Storage => ({\r\n version: 1,\r\n storedAt: new Date(),\r\n pages: pages\r\n})\r\n\r\nconst useStorage = (user: User) => singleton(`AUNOA_FAVORITES_STORAGE_${user?.id}`, () => {\r\n const storage = useLocalStorage(user).items(\"favorites\");\r\n const pages = [>storage.subscribeObject]