@authup/client-web-kit 1.0.0-beta.38 → 1.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["_inject","sym","sym","storeToRefs","_useTranslation","_useTranslationsForBaseValidation","_useTranslationsForNestedValidations","isObject","buildPagination","_buildPagination","buildPagination","create","create","isObject","isObject","APolicySummary","APolicyInlineInfo","elements","AIdentityProviderOAuth2EndpointFields","AIdentityProviderPicker","components"],"sources":["../src/components/utility/form-input-list/AFormInputListItem.vue","../src/components/utility/form-input-list/AFormInputListItem.vue","../src/core/inject.ts","../src/core/provide.ts","../src/core/http-client/authentication-hook/singleton.ts","../src/core/store/constants.ts","../src/core/store/dispatcher/constants.ts","../../../node_modules/@posva/event-emitter/dist/index.js","../src/core/store/dispatcher/module.ts","../src/core/store/dispatcher/singleton.ts","../src/core/store/create.ts","../src/core/store/singleton.ts","../src/core/store/install.ts","../src/core/store/utils.ts","../src/core/http-client/authentication-hook/install.ts","../src/core/http-client/singleton.ts","../src/core/http-client/install.ts","../src/core/form/properties.ts","../src/core/translator/constants.ts","../src/core/translator/singleton.ts","../src/core/translator/helpers.ts","../src/core/translator/de/client.ts","../src/core/translator/de/default.ts","../src/core/vuelidate.ts","../src/core/translator/de/vuelidate.ts","../src/core/translator/de/vuecs.ts","../src/core/translator/en/client.ts","../src/core/translator/en/default.ts","../src/core/translator/en/vuelidate.ts","../src/core/translator/en/vuecs.ts","../src/core/translator/install.ts","../src/core/form/submit.ts","../src/core/query/sort.ts","../src/core/busy.ts","../src/core/permission-check/module.ts","../src/core/socket-manager/singleton.ts","../src/core/socket-manager/install.ts","../src/core/slot.ts","../src/components/utility/translation/ATranslation.ts","../src/components/utility/translation/ATranslationDefault.vue","../src/components/utility/translation/ATranslationDefault.vue","../src/components/utility/form-input-list/AFormInputList.vue","../src/components/utility/form-input-list/AFormInputList.vue","../src/components/utility/pagination/module.ts","../src/components/utility/pagination/APagination.ts","../src/components/utility/entity/collection/utils/component.ts","../src/components/utility/entity/collection/utils/options.ts","../src/components/utility/entity/collection/utils/handlers.ts","../src/utils/boolable-to-object.ts","../src/components/utility/entity/socket/module.ts","../src/components/utility/entity/collection/module.ts","../src/components/utility/entity/record/error.ts","../src/components/utility/entity/record/helpers.ts","../src/components/utility/entity/record/module.ts","../src/components/utility/toggle-button/AToggleButton.vue","../src/components/utility/toggle-button/AToggleButton.vue","../src/components/utility/toggle-button/module.ts","../src/components/utility/search/module.ts","../src/components/utility/search/ASearch.ts","../src/components/utility/entity/picker/module.ts","../src/components/utility/entity/AEntityDelete.ts","../src/components/utility/title/module.ts","../src/components/utility/title/ATitle.ts","../src/components/utility/LanguageSwitcherDropdown.ts","../src/components/utility/AFormSubmit.ts","../src/components/entities/client/AClient.ts","../src/components/entities/realm/ARealm.ts","../src/composables/is-editing.ts","../src/composables/on-change.ts","../src/composables/updated-at.ts","../src/composables/use-permission-check.ts","../src/components/entities/realm/ARealmForm.ts","../src/components/entities/realm/ARealms.ts","../src/components/entities/realm/ARealmPicker.ts","../src/components/entities/client/AClientForm.vue","../src/components/entities/client/AClientForm.vue","../src/components/entities/client/AClients.ts","../src/components/entities/client/AClientPicker.ts","../src/components/entities/permission/APermission.ts","../src/components/entities/permission/APermissionCheck.ts","../src/components/entities/permission/APermissionForm.ts","../src/components/entities/permission/APermissions.ts","../src/components/entities/policy/APolicies.ts","../src/components/entities/policy/APolicyTypeBadge.vue","../src/components/entities/policy/APolicyTypeBadge.vue","../src/components/entities/policy/APolicyDetailNav.vue","../src/components/entities/policy/APolicyDetailNav.vue","../src/components/entities/policy/APolicyInlineInfo.vue","../src/components/entities/policy/APolicyInlineInfo.vue","../src/components/entities/policy/APolicySummary.vue","../src/components/entities/policy/APolicySummary.vue","../src/components/entities/permission-policy-binding/APermissionPolicyBindingButton.ts","../src/components/entities/client-permission/AClientPermissionAssignment.vue","../src/components/entities/client-permission/AClientPermissionAssignment.vue","../src/components/entities/client-permission/AClientPermissionAssignments.vue","../src/components/entities/client-permission/AClientPermissionAssignments.vue","../src/components/entities/role/ARoleForm.ts","../src/components/entities/role/ARoles.ts","../src/components/entities/role/ARole.ts","../src/components/entities/client-role/AClientRoleAssignment.vue","../src/components/entities/client-role/AClientRoleAssignment.vue","../src/components/entities/client-role/AClientRoleAssignments.vue","../src/components/entities/client-role/AClientRoleAssignments.vue","../src/components/entities/client-scope/AClientScope.ts","../src/components/entities/client-scope/AClientScopes.ts","../src/components/entities/scope/AScopeForm.ts","../src/components/entities/scope/AScopes.ts","../src/components/entities/scope/AScope.ts","../src/components/entities/client-scope/AClientScopeAssignment.vue","../src/components/entities/client-scope/AClientScopeAssignment.vue","../src/components/entities/client-scope/AClientScopeAssignments.vue","../src/components/entities/client-scope/AClientScopeAssignments.vue","../src/components/entities/identity-provider/AIdentityProvider.ts","../src/components/entities/identity-provider/AIdentityProviderBasicFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapConnectionFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapCredentialsFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapGroupFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapUserFields.ts","../src/components/entities/identity-provider/protocol/utils.ts","../src/components/entities/identity-provider/AIdentityProviderProtocol.ts","../src/components/entities/identity-provider/AIdentityProviderLdapForm.ts","../src/components/entities/identity-provider/preset/utils.ts","../src/components/entities/identity-provider/AIdentityProviderPreset.ts","../src/components/entities/identity-provider/AIdentityProviderPicker.vue","../src/components/entities/identity-provider/AIdentityProviderPicker.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2ClientFields.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2Discovery.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2EndpointFields.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2EndpointFields.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2Form.ts","../src/components/entities/identity-provider/AIdentityProviderForm.ts","../src/components/entities/identity-provider/AIdentityProviders.ts","../src/components/entities/identity-provider/AIdentityProviderIcon.vue","../src/components/entities/identity-provider/AIdentityProviderIcon.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignment.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignment.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignments.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignments.vue","../src/components/entities/policy/attribute-names/AAttributeNamesPolicyForm.vue","../src/components/entities/policy/attribute-names/AAttributeNamesPolicyForm.vue","../src/components/entities/policy/APolicyParentAssignment.ts","../src/components/entities/policy/APolicyPicker.vue","../src/components/entities/policy/APolicyPicker.vue","../src/components/entities/policy/composite/ACompositePolicyForm.vue","../src/components/entities/policy/composite/ACompositePolicyForm.vue","../src/components/entities/policy/date/ADatePolicyForm.vue","../src/components/entities/policy/date/ADatePolicyForm.vue","../src/components/entities/policy/identity/AIdentityPolicyForm.vue","../src/components/entities/policy/identity/AIdentityPolicyForm.vue","../src/components/entities/policy/realm-match/ARealmMatchPolicyForm.vue","../src/components/entities/policy/realm-match/ARealmMatchPolicyForm.vue","../src/components/entities/policy/time/ATimePolicyForm.vue","../src/components/entities/policy/time/ATimePolicyForm.vue","../src/components/entities/policy/APolicy.ts","../src/components/entities/policy/APolicyTypePicker.vue","../src/components/entities/policy/APolicyTypePicker.vue","../src/components/entities/policy/APolicyBasicForm.vue","../src/components/entities/policy/APolicyBasicForm.vue","../src/components/entities/policy/APolicyForm.vue","../src/components/entities/policy/APolicyForm.vue","../src/components/entities/permission-client/APermissionClientAssignments.vue","../src/components/entities/permission-client/APermissionClientAssignments.vue","../src/components/entities/permission-policy/APermissionPolicyAssignment.vue","../src/components/entities/permission-policy/APermissionPolicyAssignment.vue","../src/components/entities/permission-policy/APermissionPolicyAssignments.vue","../src/components/entities/permission-policy/APermissionPolicyAssignments.vue","../src/components/entities/robot-permission/ARobotPermissionAssignment.vue","../src/components/entities/robot-permission/ARobotPermissionAssignment.vue","../src/components/entities/robot/ARobot.ts","../src/components/entities/robot/ARobotForm.ts","../src/components/entities/robot/ARobots.ts","../src/components/entities/permission-robot/APermissionRobotAssignments.vue","../src/components/entities/permission-robot/APermissionRobotAssignments.vue","../src/components/entities/role-permission/ARolePermissionAssignment.vue","../src/components/entities/role-permission/ARolePermissionAssignment.vue","../src/components/entities/role-permission/ARolePermissionAssignments.vue","../src/components/entities/role-permission/ARolePermissionAssignments.vue","../src/components/entities/permission-role/APermissionRoleAssignments.vue","../src/components/entities/permission-role/APermissionRoleAssignments.vue","../src/components/entities/user-permission/AUserPermissionAssignment.vue","../src/components/entities/user-permission/AUserPermissionAssignment.vue","../src/components/entities/user-permission/AUserPermissionAssignments.vue","../src/components/entities/user-permission/AUserPermissionAssignments.vue","../src/components/entities/user/AUser.ts","../src/components/entities/user/AUserForm.ts","../src/components/entities/user/AUsers.ts","../src/components/entities/user/AUserPasswordForm.ts","../src/components/entities/permission-user/APermissionUserAssignments.vue","../src/components/entities/permission-user/APermissionUserAssignments.vue","../src/components/entities/robot-permission/ARobotPermissionAssignments.vue","../src/components/entities/robot-permission/ARobotPermissionAssignments.vue","../src/components/entities/robot-role/ARobotRoleAssignment.vue","../src/components/entities/robot-role/ARobotRoleAssignment.vue","../src/components/entities/robot-role/ARobotRoleAssignments.vue","../src/components/entities/robot-role/ARobotRoleAssignments.vue","../src/components/entities/role-client/ARoleClientAssignments.vue","../src/components/entities/role-client/ARoleClientAssignments.vue","../src/components/entities/role-robot/ARoleRobotAssignments.vue","../src/components/entities/role-robot/ARoleRobotAssignments.vue","../src/components/entities/user-role/AUserRoleAssignment.vue","../src/components/entities/user-role/AUserRoleAssignment.vue","../src/components/entities/user-role/AUserRoleAssignments.vue","../src/components/entities/user-role/AUserRoleAssignments.vue","../src/components/entities/role-user/ARoleUserAssignments.vue","../src/components/entities/role-user/ARoleUserAssignments.vue","../src/components/entities/scope-client/AScopeClientAssignments.vue","../src/components/entities/scope-client/AScopeClientAssignments.vue","../src/components/entities/index.ts","../src/module.ts","../src/components/workflows/Login.vue","../src/components/workflows/Login.vue","../src/components/workflows/authorize/AuthorizeScope.vue","../src/components/workflows/authorize/AuthorizeScope.vue","../src/components/workflows/authorize/AuthorizeScopes.vue","../src/components/workflows/authorize/AuthorizeScopes.vue","../src/components/workflows/authorize/AuthorizeForm.vue","../src/components/workflows/authorize/AuthorizeForm.vue","../src/components/workflows/authorize/AuthorizeText.vue","../src/components/workflows/authorize/AuthorizeText.vue","../src/components/workflows/authorize/Authorize.vue","../src/components/workflows/authorize/Authorize.vue","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n<script lang=\"ts\">\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { defineComponent, reactive } from 'vue';\n\nexport default defineComponent({\n components: {\n IVuelidate,\n VCFormInput,\n VCFormGroup, \n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated', 'deleted'],\n setup(props, ctx) {\n const form = reactive({ name: props.name });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(2),\n maxLength: maxLength(512),\n },\n }, form);\n\n const handleUpdated = () => {\n ctx.emit('updated', vuelidate.value.name.$model);\n };\n\n const handleDeleted = () => {\n ctx.emit('deleted');\n };\n\n return {\n handleUpdated,\n handleDeleted,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n >\n <template #groupAppend>\n <button\n :disabled=\"disabled\"\n type=\"button\"\n class=\"btn btn-xs btn-warning\"\n @click.prevent=\"handleDeleted\"\n >\n <i class=\"fa fa-minus\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n<script lang=\"ts\">\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { defineComponent, reactive } from 'vue';\n\nexport default defineComponent({\n components: {\n IVuelidate,\n VCFormInput,\n VCFormGroup, \n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated', 'deleted'],\n setup(props, ctx) {\n const form = reactive({ name: props.name });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(2),\n maxLength: maxLength(512),\n },\n }, form);\n\n const handleUpdated = () => {\n ctx.emit('updated', vuelidate.value.name.$model);\n };\n\n const handleDeleted = () => {\n ctx.emit('deleted');\n };\n\n return {\n handleUpdated,\n handleDeleted,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n >\n <template #groupAppend>\n <button\n :disabled=\"disabled\"\n type=\"button\"\n class=\"btn btn-xs btn-warning\"\n @click.prevent=\"handleDeleted\"\n >\n <i class=\"fa fa-minus\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n</template>\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport { inject as _inject, hasInjectionContext } from 'vue';\n\nexport function inject<T = any>(\n key: string | symbol,\n instance?: App,\n) : T | undefined {\n if (\n instance &&\n instance._context &&\n instance._context.provides &&\n instance._context.provides[key]\n ) {\n return instance._context.provides[key];\n }\n\n if (hasInjectionContext()) {\n return _inject(key, undefined);\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport { provide as _provide } from 'vue';\nimport { inject } from './inject';\n\nexport function provide(\n key: string | symbol,\n value: unknown,\n app?: App,\n) {\n if (typeof app === 'undefined') {\n const val = inject(key);\n if (typeof val !== 'undefined') {\n return;\n }\n\n _provide(key, value);\n\n return;\n }\n\n if (\n app &&\n app._context &&\n app._context.provides &&\n app._context.provides[key]\n ) {\n return;\n }\n\n app.provide(key, value);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport type { ClientAuthenticationHook } from '@authup/core-http-kit';\nimport { inject } from '../../inject';\nimport { provide } from '../../provide';\n\nconst sym = Symbol.for('AuthupHTTPClientAuthenticationHook');\n\nexport function injectHTTPClientAuthenticationHook(app?: App) : ClientAuthenticationHook {\n const instance = inject<ClientAuthenticationHook>(sym, app);\n if (!instance) {\n throw new Error('The http client authentication hook has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function hasHTTPClientAuthenticationHook(app?: App) : boolean {\n try {\n return !!injectHTTPClientAuthenticationHook(app);\n } catch {\n return false;\n }\n}\n\nexport function provideHTTPClientAuthenticationHook(\n refresher: ClientAuthenticationHook,\n app?: App,\n) {\n provide(sym, refresher, app);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const STORE_ID = 'authup';\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum StoreDispatcherEventName {\n LOGGING_IN = 'loggingIn',\n LOGGED_IN = 'loggedIn',\n\n LOGGING_OUT = 'loggingOut',\n LOGGED_OUT = 'loggedOut',\n\n RESOLVING = 'resolving',\n RESOLVED = 'resolved',\n\n ACCESS_TOKEN_UPDATED = 'accessTokenUpdated',\n ACCESS_TOKEN_EXPIRE_DATE_UPDATED = 'accessTokenExpireDateUpdated',\n\n REFRESH_TOKEN_UPDATED = 'refreshTokenUpdated',\n\n USER_UPDATED = 'userUpdated',\n\n REALM_UPDATED = 'realmUpdated',\n REALM_MANAGEMENT_UPDATED = 'realmManagementUpdated',\n}\n","// src/event-emitter.ts\nvar EventEmitter = class {\n /**\n * A Map of event names to registered handler functions.\n */\n all;\n constructor(all) {\n this.all = all || /* @__PURE__ */ new Map();\n }\n on(type, handler) {\n if (!this.all.has(type)) {\n this.all.set(type, []);\n }\n const handlers = this.all.get(type);\n handlers.push(handler);\n return () => handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n }\n off(type, handler) {\n if (!type) {\n return this.all.clear();\n }\n const handlers = this.all.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n this.all.delete(type);\n }\n }\n }\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing `'*'` handlers is not supported.\n *\n * @param type The event type to invoke\n * @param payload Any value to each handler\n */\n emit(type, ...payload) {\n let handlers = this.all.get(type);\n handlers?.slice().map((handler) => {\n handler(...payload);\n });\n handlers = this.all.get(\"*\");\n if (handlers) {\n handlers.slice().map((handler) => {\n handler(type, payload);\n });\n }\n }\n};\nexport {\n EventEmitter\n};\n//# sourceMappingURL=index.js.map","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EventEmitter } from '@posva/event-emitter';\nimport type { StoreDispatcher, StoreDispatcherEvents } from './types';\n\nexport function createStoreDispatcher() : StoreDispatcher {\n return new EventEmitter<StoreDispatcherEvents>();\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport { inject } from '../../inject';\nimport { provide } from '../../provide';\nimport type { StoreDispatcher } from './types';\n\nconst sym = Symbol.for('AuthupStoreEventBus');\n\nexport function injectStoreDispatcher(app?: App) : StoreDispatcher {\n const instance = inject<StoreDispatcher>(sym, app);\n if (!instance) {\n throw new Error('The store dispatcher has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function provideStoreDispatcher(eventBus: StoreDispatcher, app?: App) {\n provide(sym, eventBus, app);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n PermissionEvaluator,\n PermissionMemoryProvider,\n PolicyEngine,\n} from '@authup/access';\nimport { OAuth2Error } from '@authup/specs';\nimport { computed, ref } from 'vue';\nimport type {\n OAuth2TokenGrantResponse,\n OAuth2TokenIntrospectionResponse,\n} from '@authup/specs';\nimport type {\n Realm,\n User,\n} from '@authup/core-kit';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { Client } from '@authup/core-http-kit';\nimport { StoreDispatcherEventName } from './dispatcher';\nimport type { StoreCreateContext, StoreLoginContext } from './types';\n\ntype InputFn = (...args: any[]) => Promise<any>;\ntype OutputFn<F extends InputFn> = (...args: Parameters<F>) => Promise<Awaited<ReturnType<F>>>;\n\nfunction createPromiseShareWrapperFn<F extends InputFn>(\n fn: F,\n) : OutputFn<F> {\n let promise : Promise<Awaited<ReturnType<F>>> | undefined;\n\n return (...args: Parameters<F>) => {\n if (promise) {\n return promise;\n }\n\n promise = new Promise<Awaited<ReturnType<F>>>(\n (resolve, reject) => {\n fn(...args)\n .then((r) => resolve(r))\n .catch((e) => reject(e));\n },\n );\n\n promise.finally(() => {\n setTimeout(() => {\n promise = undefined;\n }, 0);\n });\n\n return promise;\n };\n}\n\ntype RealmMinimal = Pick<Realm, 'id' | 'name'>;\n\nexport function createStore(context: StoreCreateContext) {\n const client = new Client({ baseURL: context.baseURL });\n\n const cookiesRead = ref<boolean>(false);\n const setCookiesRead = (value: boolean) => {\n cookiesRead.value = value;\n };\n\n // --------------------------------------------------------------------\n\n const accessToken = ref<string | null>(null);\n const setAccessToken = (input: string | null) => {\n accessToken.value = input;\n\n context.dispatcher.emit(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n input,\n );\n };\n\n // --------------------------------------------------------------------\n\n const accessTokenExpireDate = ref<Date | null>(null);\n const setAccessTokenExpireDate = (input: Date | number | string | null) => {\n if (typeof input === 'number' || typeof input === 'string') {\n accessTokenExpireDate.value = new Date(input); // verify microseconds or seconds\n } else {\n accessTokenExpireDate.value = input;\n }\n\n context.dispatcher.emit(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n accessTokenExpireDate.value,\n );\n };\n\n // --------------------------------------------------------------------\n\n const refreshToken = ref<string | null>(null);\n const setRefreshToken = (input: string | null) => {\n refreshToken.value = input;\n\n context.dispatcher.emit(\n StoreDispatcherEventName.REFRESH_TOKEN_UPDATED,\n input,\n );\n };\n\n // --------------------------------------------------------------------\n\n const user = ref<User | null>(null);\n const userId = computed<string | null>(() => (user.value ? user.value.id : null));\n\n const setUser = (input: User | null) => {\n user.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.USER_UPDATED, input);\n };\n\n // --------------------------------------------------------------------\n\n const realm = ref<RealmMinimal | null>(null);\n const realmId = computed<string | undefined>(() => (realm.value ? realm.value.id : undefined));\n const realmName = computed<string | undefined>(() => (realm.value ? realm.value.name : undefined));\n const realmIsRoot = computed<boolean>(() => {\n if (realm.value) {\n return realm.value.name === REALM_MASTER_NAME;\n }\n\n return false;\n });\n\n const setRealm = (input: RealmMinimal | null) => {\n realm.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.REALM_UPDATED, input);\n };\n\n const realmManagement = ref<RealmMinimal | null>(null);\n const realmManagementId = computed<string | undefined>(() => (realmManagement.value ? realmManagement.value.id : realmId.value));\n const realmManagementName = computed<string | undefined>(() => (realmManagement.value ? realmManagement.value.name : realmName.value));\n\n const setRealmManagement = (input: RealmMinimal | null) => {\n realmManagement.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, input);\n };\n\n // --------------------------------------------------------------------\n\n const permissionProvider = new PermissionMemoryProvider();\n const permissionEvaluator = new PermissionEvaluator({\n provider: permissionProvider,\n policyEngine: new PolicyEngine(),\n });\n\n // --------------------------------------------------------------------\n\n const cleanup = async () => {\n const tempAccessToken = accessToken.value;\n const tempRefreshToken = refreshToken.value;\n\n setAccessToken(null);\n setAccessTokenExpireDate(null);\n setRefreshToken(null);\n setUser(null);\n setRealm(null);\n setRealmManagement(null);\n\n permissionProvider.setMany([]);\n\n tokenResolved.value = false;\n userResolved.value = false;\n\n try {\n if (tempAccessToken) {\n await client.token.revoke({ token: tempAccessToken });\n }\n } catch {\n // ...\n }\n\n try {\n if (tempRefreshToken) {\n await client.token.revoke({ token: tempRefreshToken });\n }\n } catch {\n // ...\n }\n };\n\n // --------------------------------------------------------------------\n\n const userResolved = ref(false);\n const resolveUser = async () : Promise<void> => {\n if (!accessToken.value || userResolved.value) {\n return Promise.resolve();\n }\n\n userResolved.value = true;\n\n return client.userInfo.get<User>(`Bearer ${accessToken.value}`)\n .then((response) => {\n setUser(response);\n });\n };\n\n // --------------------------------------------------------------------\n\n const tokenResolved = ref(false);\n const resolveToken = async () : Promise<void> => {\n if (!accessToken.value || tokenResolved.value) {\n return Promise.resolve();\n }\n\n tokenResolved.value = true;\n\n return client.token.introspect<OAuth2TokenIntrospectionResponse>({ token: accessToken.value }, {\n authorizationHeader: {\n type: 'Bearer',\n token: accessToken.value,\n },\n })\n .then((response) => {\n if (response.exp) {\n const expireDate = new Date(response.exp * 1000);\n setAccessTokenExpireDate(expireDate);\n }\n\n if (\n response.realm_id &&\n response.realm_name\n ) {\n realm.value = {\n id: response.realm_id,\n name: response.realm_name,\n };\n\n if (!realmManagement.value) {\n setRealmManagement(realm.value);\n }\n }\n\n if (response.permissions) {\n permissionProvider.setMany(response.permissions.map((permission) => ({\n permission: {\n name: permission.name,\n realm_id: permission.realm_id,\n client_id: permission.client_id,\n },\n })));\n }\n });\n };\n\n // --------------------------------------------------------------------\n\n const applyTokenGrantResponse = (\n response: OAuth2TokenGrantResponse,\n ) => {\n const expireDate = new Date(Date.now() + response.expires_in * 1000);\n\n setAccessTokenExpireDate(expireDate);\n setAccessToken(response.access_token);\n\n if (response.refresh_token) {\n setRefreshToken(response.refresh_token);\n } else {\n setRefreshToken(null);\n }\n };\n\n // --------------------------------------------------------------------\n\n const refreshSession = createPromiseShareWrapperFn(\n async (): Promise<void> => {\n if (!refreshToken.value) {\n throw new OAuth2Error('The access token can not be renewed.');\n }\n\n try {\n const response = await client.token.createWithRefreshToken({ refresh_token: refreshToken.value });\n\n applyTokenGrantResponse(response);\n } catch (e) {\n await cleanup();\n\n throw e;\n } finally {\n tokenResolved.value = false;\n userResolved.value = false;\n }\n },\n );\n\n // --------------------------------------------------------------------\n\n // todo: rename to reload() ?\n const resolveInternal = async () : Promise<void> => {\n context.dispatcher.emit(StoreDispatcherEventName.RESOLVING);\n\n try {\n if (\n !accessToken.value &&\n refreshToken.value\n ) {\n await refreshSession();\n }\n\n if (accessToken.value) {\n await resolveToken();\n\n if (!user.value) {\n await resolveUser();\n }\n }\n } catch (e) {\n if (refreshToken.value) {\n await refreshSession();\n await resolveToken();\n await resolveUser();\n } else {\n throw e;\n }\n }\n\n context.dispatcher.emit(StoreDispatcherEventName.RESOLVED);\n };\n\n const resolve = createPromiseShareWrapperFn(resolveInternal);\n\n const loggedIn = computed<boolean>(() => !!accessToken.value);\n const login = async (ctx: StoreLoginContext) => {\n context.dispatcher.emit(StoreDispatcherEventName.LOGGING_IN);\n\n const response = await client.token.createWithPassword({\n username: ctx.name,\n password: ctx.password,\n ...(realmId.value ? { realm_id: ctx.realmId } : {}),\n });\n\n applyTokenGrantResponse(response);\n\n await resolveToken();\n await resolveUser();\n\n context.dispatcher.emit(StoreDispatcherEventName.LOGGED_IN);\n };\n\n const exchangeAuthorizationCode = async (code: string) => {\n const response = await client.token.createWithAuthorizationCode({ code });\n\n await cleanup();\n\n applyTokenGrantResponse(response);\n\n await resolveToken();\n await resolveUser();\n };\n\n const logout = async () => {\n context.dispatcher.emit(StoreDispatcherEventName.LOGGING_OUT);\n\n await cleanup();\n\n context.dispatcher.emit(StoreDispatcherEventName.LOGGED_OUT);\n };\n\n return {\n cookiesRead,\n setCookiesRead,\n\n permissionEvaluator,\n\n login,\n logout,\n loggedIn,\n resolve,\n exchangeAuthorizationCode,\n\n applyTokenGrantResponse,\n accessToken,\n setAccessToken,\n accessTokenExpireDate,\n setAccessTokenExpireDate,\n refreshToken,\n setRefreshToken,\n\n realm,\n realmId,\n realmIsRoot,\n realmName,\n setRealm,\n\n realmManagement,\n realmManagementId,\n realmManagementName,\n setRealmManagement,\n\n user,\n userId,\n setUser,\n };\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Pinia } from 'pinia';\nimport type { App } from 'vue';\nimport { inject } from '../inject';\nimport { provide } from '../provide';\nimport type { Store, StoreDefinition } from './types';\n\nconst sym = Symbol.for('AuthupStore');\n\nexport function injectStore(pinia?: Pinia, app?: App) : Store {\n const instance = injectStoreFactory(app);\n if (!instance) {\n throw new Error('The store has not been injected in the app context.');\n }\n\n return instance(pinia);\n}\n\nexport function injectStoreFactory(app?: App) : StoreDefinition {\n const instance = inject<StoreDefinition>(sym, app);\n if (!instance) {\n throw new Error('The store factory has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function hasStoreFactory(app?: App) : boolean {\n return !!inject(sym, app);\n}\n\nexport function provideStoreFactory(store: StoreDefinition, app?: App) {\n provide(sym, store, app);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { CookieName } from '@authup/core-http-kit';\nimport { useCookies } from '@vueuse/integrations/useCookies';\nimport { defineStore } from 'pinia';\nimport type { App } from 'vue';\nimport type {\n CookieGetFn, \n CookieOptions, \n CookieSetFn, \n CookieUnsetFn,\n} from '../../types';\nimport { STORE_ID } from './constants';\nimport { createStore } from './create';\nimport { StoreDispatcherEventName, createStoreDispatcher, provideStoreDispatcher } from './dispatcher';\nimport { hasStoreFactory, provideStoreFactory } from './singleton';\nimport type { StoreInstallOptions } from './types';\n\nexport function installStore(app: App, options: StoreInstallOptions = {}) {\n if (hasStoreFactory(app)) {\n return;\n }\n\n const storeDispatcher = createStoreDispatcher();\n provideStoreDispatcher(storeDispatcher, app);\n\n const storeFactory = defineStore(\n STORE_ID,\n () => createStore({\n baseURL: options.baseURL,\n dispatcher: storeDispatcher,\n }),\n );\n const store = storeFactory(options.pinia);\n\n let cookieGet : CookieGetFn;\n if (options.cookieGet) {\n cookieGet = options.cookieGet;\n } else {\n const cookies = useCookies();\n cookieGet = cookies.get;\n }\n\n let cookieSet: CookieSetFn;\n if (options.cookieSet) {\n cookieSet = options.cookieSet;\n } else {\n const cookies = useCookies();\n cookieSet = cookies.set;\n }\n\n let cookieUnset : CookieUnsetFn;\n if (options.cookieUnset) {\n cookieUnset = options.cookieUnset;\n } else if (options.cookieSet) {\n cookieUnset = (key: string, opts: CookieOptions) => {\n (options.cookieSet as CookieSetFn)(key, null, opts);\n };\n } else {\n const cookies = useCookies();\n cookieUnset = cookies.remove;\n }\n\n const readCookies = () => {\n if (store.cookiesRead) {\n return;\n }\n\n store.setCookiesRead(true);\n\n const keys = Object.values(CookieName);\n\n let value : any;\n for (const key of keys) {\n value = cookieGet(key);\n if (!value) {\n continue;\n }\n\n switch (key) {\n case CookieName.ACCESS_TOKEN:\n if (!store.accessToken) {\n store.setAccessToken(value);\n }\n break;\n case CookieName.ACCESS_TOKEN_EXPIRE_DATE:\n if (!store.accessTokenExpireDate) {\n store.setAccessTokenExpireDate(value);\n }\n break;\n case CookieName.REFRESH_TOKEN:\n if (!store.refreshToken) {\n store.setRefreshToken(value);\n }\n break;\n case CookieName.USER:\n if (!store.user) {\n store.setUser(value);\n }\n break;\n case CookieName.REALM:\n if (!store.realm) {\n store.setRealm(value);\n }\n break;\n case CookieName.REALM_MANAGEMENT:\n if (!store.realmManagement) {\n store.setRealmManagement(value);\n }\n break;\n }\n }\n };\n\n const maxAgeFn = () => {\n if (!store.accessTokenExpireDate) {\n return undefined;\n }\n\n return Math.floor(\n Math.max(1000, new Date(`${store.accessTokenExpireDate}`).getTime() - Date.now()) /\n 1000,\n );\n };\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.ACCESS_TOKEN_EXPIRE_DATE, input, { maxAge: maxAgeFn() });\n } else {\n cookieUnset(CookieName.ACCESS_TOKEN_EXPIRE_DATE, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n (input) => {\n if (input) {\n const maxAge = maxAgeFn();\n cookieSet(CookieName.ACCESS_TOKEN, input, { maxAge });\n } else {\n cookieUnset(CookieName.ACCESS_TOKEN, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.REFRESH_TOKEN_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.REFRESH_TOKEN, input, {});\n } else {\n cookieUnset(CookieName.REFRESH_TOKEN, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.USER_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.USER, input, {});\n } else {\n cookieUnset(CookieName.USER, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.REALM_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.REALM, input, {});\n } else {\n cookieUnset(CookieName.REALM, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.REALM_MANAGEMENT, input, {});\n } else {\n cookieUnset(CookieName.REALM_MANAGEMENT, {});\n }\n },\n );\n\n readCookies();\n\n provideStoreFactory(storeFactory, app);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { StoreGeneric, storeToRefs as _storeToRefs } from 'pinia';\nimport {\n isReactive, \n isRef, \n toRaw, \n toRef,\n} from 'vue';\n\nexport type StoreToRefs<T extends StoreGeneric> = ReturnType<typeof _storeToRefs<T>>;\n\nexport function storeToRefs<SS extends StoreGeneric>(\n store: SS,\n): StoreToRefs<SS> {\n store = toRaw(store);\n\n const refs = {} as StoreToRefs<SS>;\n const keys = Object.keys(store);\n for (const key of keys) {\n const value = store[key];\n if (isRef(value) || isReactive(value)) {\n refs[key as (keyof StoreToRefs<SS>)] = toRef(store, key) as any;\n }\n }\n\n return refs;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client, ClientAuthenticationHook, ClientAuthenticationHookEventName } from '@authup/core-http-kit';\nimport type { App } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { hasHTTPClientAuthenticationHook, provideHTTPClientAuthenticationHook } from './singleton';\nimport { StoreDispatcherEventName, injectStoreDispatcher, injectStoreFactory } from '../../store';\nimport type { HTTPClientAuthenticationHookInstallOptions } from './types';\n\nexport function installHTTPClientAuthenticationHook(\n app: App,\n options: HTTPClientAuthenticationHookInstallOptions = {},\n) {\n if (hasHTTPClientAuthenticationHook(app)) {\n return;\n }\n\n const storeFactory = injectStoreFactory(app);\n const store = storeFactory(options.pinia);\n\n const { refreshToken } = storeToRefs(store);\n\n const hook = new ClientAuthenticationHook({\n baseURL: options.baseURL,\n tokenCreator: () => {\n if (!refreshToken.value) {\n throw new Error('No refresh token available.');\n }\n\n const client = new Client({ baseURL: options.baseURL });\n return client.token.createWithRefreshToken({ refresh_token: refreshToken.value });\n },\n timer: !options.isServer,\n });\n\n hook.on(ClientAuthenticationHookEventName.REFRESH_FINISHED, (response) => {\n store.applyTokenGrantResponse(response);\n });\n\n let isSelfCallee = false;\n\n hook.on(ClientAuthenticationHookEventName.HEADER_UNSET, () => {\n if (!isSelfCallee) {\n Promise.resolve()\n .then(() => store.logout());\n }\n });\n\n const storeDispatcher = injectStoreDispatcher(app);\n\n const handleAccessTokenEvent = () => {\n isSelfCallee = true;\n\n if (store.accessToken) {\n hook.enable();\n hook.setAuthorizationHeader({\n type: 'Bearer',\n token: store.accessToken as string,\n });\n } else {\n hook.disable();\n hook.unsetAuthorizationHeader();\n }\n\n isSelfCallee = false;\n };\n\n const handleAccessTokenExpireDateEvent = () => {\n if (store.accessTokenExpireDate) {\n const expiresIn = Math.floor((store.accessTokenExpireDate.getTime() - Date.now()) / 1000);\n hook.setTimer(expiresIn);\n }\n };\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n () => handleAccessTokenEvent(),\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n () => handleAccessTokenExpireDateEvent(),\n );\n\n handleAccessTokenEvent();\n handleAccessTokenExpireDateEvent();\n\n provideHTTPClientAuthenticationHook(hook, app);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-http-kit';\nimport type { App } from 'vue';\nimport { inject } from '../inject';\nimport { provide } from '../provide';\n\nexport const HTTPClientSymbol = Symbol.for('AuthupHTTPClient');\n\nexport function provideHTTPClient(client: Client, app?: App) {\n provide(HTTPClientSymbol, client, app);\n}\n\nexport function hasHTTPClient(app?: App) : boolean {\n try {\n return !!injectHTTPClient(app);\n } catch {\n return false;\n }\n}\n\nexport function injectHTTPClient(app?: App) {\n const instance = inject<Client>(HTTPClientSymbol, app);\n if (!instance) {\n throw new Error('The api client has not been injected.');\n }\n\n return instance;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client } from '@authup/core-http-kit';\nimport type { App } from 'vue';\nimport { hasHTTPClient, provideHTTPClient } from './singleton';\nimport type { HTTPClientInstallOptions } from './types';\nimport { injectHTTPClientAuthenticationHook } from './authentication-hook';\n\nexport function installHTTPClient(app: App, options: HTTPClientInstallOptions = {}) {\n if (hasHTTPClient(app)) {\n return;\n }\n\n const client = new Client({ baseURL: options.baseURL });\n\n const authenticationHook = injectHTTPClientAuthenticationHook(app);\n authenticationHook.attach(client);\n\n provideHTTPClient(client, app);\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\ntype PartialRecordWithNull<T extends Record<string, any>> = {\n [K in keyof T]?: T[K] | null\n};\n\n/**\n * Assign properties from input to src.\n * 'null' values will be transformed to an empty string.\n *\n * @param src\n * @param input\n */\nexport function assignFormProperties<T extends Record<string, any>>(\n src: T,\n input: PartialRecordWithNull<T> = {},\n) : T {\n const keys : (keyof T)[] = Object.keys(input);\n for (const key of keys) {\n const value = input[key];\n if (value === null) {\n src[key] = '' as T[keyof T];\n } else {\n src[key] = value as T[keyof T];\n }\n }\n\n return src;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum TranslatorTranslationGroup {\n DEFAULT = 'default',\n\n CLIENT = 'authupClient',\n\n VUECS = 'vuecs',\n VUELIDATE = 'vuelidate',\n}\n\nexport enum TranslatorTranslationVuecsKey {\n NO_MORE = 'noMore',\n}\n\nexport enum TranslatorTranslationClientKey {\n NAME_HINT = 'nameHint',\n DESCRIPTION_HINT = 'descriptionHint',\n REDIRECT_URI_HINT = 'redirectURIHint',\n IS_CONFIDENTIAL = 'isConfidential',\n IS_ACTIVE = 'isActive',\n HASH_SECRET = 'hashSecret',\n}\n\nexport enum TranslatorTranslationDefaultKey {\n ADD = 'add',\n CREATE = 'create',\n DELETE = 'delete',\n GENERATE = 'generate',\n UPDATE = 'update',\n\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n\n LOCKED = 'locked',\n NOT_LOCKED = 'notLocked',\n\n VALUE_IS_REGEX = 'valueIsRegex',\n\n CLIENT = 'client',\n CLIENTS = 'clients',\n CLIENT_SCOPES = 'clientScopes',\n DISPLAY_NAME = 'displayName',\n EMAIL = 'email',\n EXTERNAL_ID = 'externalId',\n HASHED = 'hashed',\n OVERVIEW = 'overview',\n IDENTITY_PROVIDERS = 'identityProviders',\n NAME = 'name',\n DECISION_STRATEGY = 'decisionStrategy',\n DESCRIPTION = 'description',\n PERMISSIONS = 'permissions',\n POLICY = 'policy',\n POLICIES = 'policies',\n REALM = 'realm',\n ROBOTS = 'robots',\n REALMS = 'realms',\n ROLES = 'roles',\n SCOPES = 'scopes',\n SECRET = 'secret',\n REDIRECT_URIS = 'redirectUris',\n USERS = 'users',\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n BaseValidationTranslations,\n NestedValidationsTranslations,\n} from '@ilingo/vuelidate';\nimport {\n useTranslationsForBaseValidation as _useTranslationsForBaseValidation,\n useTranslationsForNestedValidations as _useTranslationsForNestedValidations,\n} from '@ilingo/vuelidate';\nimport { useTranslation as _useTranslation, injectLocale } from '@ilingo/vuelidate/vue';\nimport type {\n BaseValidation, \n Validation, \n ValidationArgs, \n ValidationRuleCollection,\n} from '@vuelidate/core';\nimport type { GetContextReactive } from '@ilingo/vue';\nimport type { Ref } from 'vue';\n\nexport function injectTranslatorLocale() : Ref<string> {\n return injectLocale();\n}\n\nexport function useTranslation(input: GetContextReactive) : Ref<string> {\n return _useTranslation(input);\n}\n\nexport function useTranslationsForBaseValidation<\n T = unknown,\n V extends ValidationRuleCollection<T> = ValidationRuleCollection<T>,\n>(\n result: BaseValidation<T, V>,\n) : BaseValidationTranslations {\n return _useTranslationsForBaseValidation(result);\n}\n\nexport function useTranslationsForNestedValidation<\n V extends ValidationArgs = ValidationArgs,\n T = unknown,\n>(validation: Validation<V, T>) : NestedValidationsTranslations<T> {\n return _useTranslationsForNestedValidations<V, T>(validation);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { GetContext } from 'ilingo';\nimport type { Ref } from 'vue';\nimport { useTranslation } from './singleton';\n\ntype Input = Omit<GetContext, 'group'>;\nexport function useTranslationsForGroup<T extends Input>(\n group: string,\n elements: T[],\n) : Record<`${T['key']}`, Ref<string>> {\n const output = {} as Record<string, Ref<string>>;\n for (const element of elements) {\n output[element.key] = useTranslation({\n ...element,\n group,\n });\n }\n\n return output;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationClientKey } from '../constants';\n\nexport const TranslatorTranslationClientGerman : LinesRecord = {\n [TranslatorTranslationClientKey.NAME_HINT]: 'Etwas, das Benutzer erkennen und vertrauen werden',\n [TranslatorTranslationClientKey.DESCRIPTION_HINT]: 'Dies wird allen Benutzern dieser Anwendung angezeigt',\n [TranslatorTranslationClientKey.REDIRECT_URI_HINT]: 'URI-Muster, zu dem ein Browser nach einem erfolgreichen Login weiterleiten kann',\n [TranslatorTranslationClientKey.IS_CONFIDENTIAL]: 'Ist vertraulich?',\n [TranslatorTranslationClientKey.IS_ACTIVE]: 'Ist aktiv?',\n [TranslatorTranslationClientKey.HASH_SECRET]: 'Geheimnis hashen?',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationDefaultKey } from '../constants';\n\nexport const TranslatorTranslationDefaultGerman: LinesRecord = {\n [TranslatorTranslationDefaultKey.ADD]: 'hinzufügen',\n [TranslatorTranslationDefaultKey.CREATE]: 'erstellen',\n [TranslatorTranslationDefaultKey.DELETE]: 'löschen',\n [TranslatorTranslationDefaultKey.GENERATE]: 'generieren',\n [TranslatorTranslationDefaultKey.UPDATE]: 'aktualisieren',\n\n [TranslatorTranslationDefaultKey.ACTIVE]: 'aktiv',\n [TranslatorTranslationDefaultKey.INACTIVE]: 'inaktiv',\n\n [TranslatorTranslationDefaultKey.LOCKED]: 'gesperrt',\n [TranslatorTranslationDefaultKey.NOT_LOCKED]: 'nicht gesperrt',\n\n [TranslatorTranslationDefaultKey.VALUE_IS_REGEX]: 'Wert ist regex pattern?',\n\n [TranslatorTranslationDefaultKey.CLIENT]: 'Client',\n [TranslatorTranslationDefaultKey.CLIENTS]: 'Clients',\n [TranslatorTranslationDefaultKey.CLIENT_SCOPES]: 'Client-Bereiche',\n [TranslatorTranslationDefaultKey.DISPLAY_NAME]: 'Anzeigename',\n [TranslatorTranslationDefaultKey.EMAIL]: 'E-Mail',\n [TranslatorTranslationDefaultKey.EXTERNAL_ID]: 'externe ID',\n [TranslatorTranslationDefaultKey.HASHED]: 'gehasht',\n [TranslatorTranslationDefaultKey.OVERVIEW]: 'Überblick',\n [TranslatorTranslationDefaultKey.IDENTITY_PROVIDERS]: 'Identitätsanbieter',\n [TranslatorTranslationDefaultKey.NAME]: 'Name',\n [TranslatorTranslationDefaultKey.DECISION_STRATEGY]: 'Entscheidungsstrategie',\n [TranslatorTranslationDefaultKey.DESCRIPTION]: 'Beschreibung',\n [TranslatorTranslationDefaultKey.PERMISSIONS]: 'Berechtigungen',\n [TranslatorTranslationDefaultKey.POLICY]: 'Richtlinie',\n [TranslatorTranslationDefaultKey.POLICIES]: 'Richtlinien',\n [TranslatorTranslationDefaultKey.REALM]: 'Organisation',\n [TranslatorTranslationDefaultKey.REALMS]: 'Organisationen',\n [TranslatorTranslationDefaultKey.ROLES]: 'Rollen',\n [TranslatorTranslationDefaultKey.SCOPES]: 'Bereiche',\n [TranslatorTranslationDefaultKey.SECRET]: 'Geheimnis',\n [TranslatorTranslationDefaultKey.REDIRECT_URIS]: 'Weiterleitungs-URIs',\n [TranslatorTranslationDefaultKey.USERS]: 'Benutzer',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from '@authup/kit';\nimport { getSeverity } from '@ilingo/vuelidate';\nimport type { BaseValidation, Validation, ValidationRuleCollection } from '@vuelidate/core';\nimport { helpers } from '@vuelidate/validators';\nimport type { Ref } from 'vue';\n\nexport enum VuelidateCustomRuleKey {\n ALPHA_NUM_HYPHEN_UNDERSCORE = 'alphaNumHyphenUnderscore',\n ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT = 'alphaUpperNumHyphenUnderscoreDot',\n}\n\nexport const VuelidateCustomRule = {\n [VuelidateCustomRuleKey.ALPHA_NUM_HYPHEN_UNDERSCORE]: helpers.regex(/^[a-z0-9-_]*$/),\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: helpers.regex(/^[a-zA-Z0-9-_.]*$/),\n};\n\nexport function getVuelidateSeverity<\n T = unknown,\n V extends ValidationRuleCollection<T> = ValidationRuleCollection<T>,\n>(vuelidate: BaseValidation<T, V>) {\n return getSeverity<T, V>(vuelidate);\n}\n\nexport function extractVuelidateResultsFromChild(vuelidate: Ref<Validation>, child: string, keys?: string[]) {\n const childResults = vuelidate.value.$getResultsForChild(child);\n if (!childResults) {\n return {};\n }\n\n const childKeys = keys ?? Object.keys(childResults)\n .filter((key) => !key.startsWith('$'));\n\n const result : Record<string, any> = {};\n for (const childKey of childKeys) {\n if (hasOwnProperty(childResults, childKey)) {\n result[childKey] = (childResults[childKey] as { $model: Record<string, any> }).$model;\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { VuelidateCustomRuleKey } from '../../vuelidate';\n\nexport const TranslatorTranslationVuelidateGerman : LinesRecord = {\n [VuelidateCustomRuleKey.ALPHA_NUM_HYPHEN_UNDERSCORE]: 'Der Eingabewert darf nur aus folgenden Zeichen bestehen: [0-9a-z-_]+',\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: 'Der Eingabewert darf nur aus folgenden Zeichen bestehen: [0-9a-zA-Z-_.]+',\n};\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationVuecsKey } from '../constants';\n\nexport const TranslatorTranslationVuecsGerman : LinesRecord = { [TranslatorTranslationVuecsKey.NO_MORE]: 'Keine weiteren {{name}} verfügbar' };\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationClientKey } from '../constants';\n\nexport const TranslatorTranslationClientEnglish : LinesRecord = {\n [TranslatorTranslationClientKey.NAME_HINT]: 'Something users will recognize and trust',\n [TranslatorTranslationClientKey.DESCRIPTION_HINT]: 'Displayed to all users of this application',\n [TranslatorTranslationClientKey.REDIRECT_URI_HINT]: 'URI pattern a browser can redirect to after a successful login',\n [TranslatorTranslationClientKey.IS_CONFIDENTIAL]: 'Is confidential?',\n [TranslatorTranslationClientKey.IS_ACTIVE]: 'Is active?',\n [TranslatorTranslationClientKey.HASH_SECRET]: 'Hash secret?',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationDefaultKey } from '../constants';\n\nexport const TranslatorTranslationDefaultEnglish : LinesRecord = {\n [TranslatorTranslationDefaultKey.ADD]: 'add',\n [TranslatorTranslationDefaultKey.CREATE]: 'create',\n [TranslatorTranslationDefaultKey.DELETE]: 'delete',\n [TranslatorTranslationDefaultKey.GENERATE]: 'generate',\n [TranslatorTranslationDefaultKey.UPDATE]: 'update',\n\n [TranslatorTranslationDefaultKey.ACTIVE]: 'active',\n [TranslatorTranslationDefaultKey.INACTIVE]: 'inactive',\n\n [TranslatorTranslationDefaultKey.LOCKED]: 'locked',\n [TranslatorTranslationDefaultKey.NOT_LOCKED]: 'not locked',\n\n [TranslatorTranslationDefaultKey.VALUE_IS_REGEX]: 'Value is regex pattern?',\n\n [TranslatorTranslationDefaultKey.CLIENT]: 'update',\n [TranslatorTranslationDefaultKey.CLIENTS]: 'clients',\n [TranslatorTranslationDefaultKey.CLIENT_SCOPES]: 'client scopes',\n [TranslatorTranslationDefaultKey.DISPLAY_NAME]: 'display name',\n [TranslatorTranslationDefaultKey.EMAIL]: 'email',\n [TranslatorTranslationDefaultKey.EXTERNAL_ID]: 'external id',\n [TranslatorTranslationDefaultKey.HASHED]: 'hashed',\n [TranslatorTranslationDefaultKey.OVERVIEW]: 'overview',\n [TranslatorTranslationDefaultKey.IDENTITY_PROVIDERS]: 'identity providers',\n [TranslatorTranslationDefaultKey.NAME]: 'name',\n [TranslatorTranslationDefaultKey.DECISION_STRATEGY]: 'decision strategy',\n [TranslatorTranslationDefaultKey.DESCRIPTION]: 'description',\n [TranslatorTranslationDefaultKey.POLICY]: 'policy',\n [TranslatorTranslationDefaultKey.POLICIES]: 'policies',\n [TranslatorTranslationDefaultKey.PERMISSIONS]: 'permissions',\n [TranslatorTranslationDefaultKey.REALM]: 'realm',\n [TranslatorTranslationDefaultKey.REALMS]: 'realms',\n [TranslatorTranslationDefaultKey.ROLES]: 'roles',\n [TranslatorTranslationDefaultKey.SCOPES]: 'scopes',\n [TranslatorTranslationDefaultKey.SECRET]: 'secret',\n [TranslatorTranslationDefaultKey.REDIRECT_URIS]: 'redirect uri(s)',\n [TranslatorTranslationDefaultKey.USERS]: 'users',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { VuelidateCustomRuleKey } from '../../vuelidate';\n\nexport const TranslatorTranslationVuelidateEnglish : LinesRecord = {\n [VuelidateCustomRuleKey.ALPHA_NUM_HYPHEN_UNDERSCORE]: 'The input value is only allowed to consist of the following characters: [0-9a-z-_]+',\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: 'The input value is only allowed to consist of the following characters: [0-9a-zA-Z-_.]+',\n};\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationVuecsKey } from '../constants';\n\nexport const TranslatorTranslationVuecsEnglish : LinesRecord = { [TranslatorTranslationVuecsKey.NO_MORE]: 'No more {{name}} available' };\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { MemoryStore } from '@ilingo/vuelidate/core';\nimport { install } from '@ilingo/vuelidate';\nimport type { App } from 'vue';\nimport { TranslatorTranslationGroup } from './constants';\nimport {\n TranslatorTranslationClientGerman,\n TranslatorTranslationDefaultGerman,\n TranslatorTranslationVuecsGerman,\n TranslatorTranslationVuelidateGerman,\n} from './de';\nimport {\n TranslatorTranslationClientEnglish,\n TranslatorTranslationDefaultEnglish,\n TranslatorTranslationVuecsEnglish,\n TranslatorTranslationVuelidateEnglish,\n} from './en';\nimport type { TranslatorInstallOptions } from './types';\n\nexport function installTranslator(app: App, options: TranslatorInstallOptions = {}) {\n const store = new MemoryStore({\n data: {\n de: {\n [TranslatorTranslationGroup.CLIENT]: TranslatorTranslationClientGerman,\n [TranslatorTranslationGroup.DEFAULT]: TranslatorTranslationDefaultGerman,\n [TranslatorTranslationGroup.VUECS]: TranslatorTranslationVuecsGerman,\n [TranslatorTranslationGroup.VUELIDATE]: TranslatorTranslationVuelidateGerman,\n },\n en: {\n [TranslatorTranslationGroup.CLIENT]: TranslatorTranslationClientEnglish,\n [TranslatorTranslationGroup.DEFAULT]: TranslatorTranslationDefaultEnglish,\n [TranslatorTranslationGroup.VUECS]: TranslatorTranslationVuecsEnglish,\n [TranslatorTranslationGroup.VUELIDATE]: TranslatorTranslationVuelidateEnglish,\n },\n },\n });\n\n install(app, {\n store,\n locale: options.locale,\n });\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { FormSubmitOptionsInput } from '@vuecs/form-controls';\nimport { buildFormSubmit } from '@vuecs/form-controls';\nimport type { Ref, VNodeChild } from 'vue';\nimport { TranslatorTranslationDefaultKey, TranslatorTranslationGroup, useTranslation } from '../translator';\n\ntype FormSubmitTranslations = {\n createText: Ref<string>,\n updateText: Ref<string>,\n};\n\nexport function createFormSubmitTranslations() : FormSubmitTranslations {\n const updateText = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.UPDATE,\n });\n const createText = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.CREATE,\n });\n\n return {\n createText,\n updateText,\n };\n}\n\nexport function buildFormSubmitWithTranslations(\n options: FormSubmitOptionsInput,\n translations: FormSubmitTranslations,\n) : VNodeChild {\n options.createText = translations.createText.value;\n options.updateText = translations.updateText.value;\n\n return buildFormSubmit(options);\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from 'smob';\nimport type { SortBuildInput } from 'rapiq';\nimport { SortDirection } from 'rapiq';\n\ntype Data = {\n created_at?: string | Date,\n updated_at?: string | Date,\n [key: string]: any\n};\nexport function isQuerySortedDescByDate<T extends Data>(input: SortBuildInput<T>) : boolean {\n if (Array.isArray(input)) {\n return input.some((el) => isQuerySortedDescByDate(el as SortBuildInput<T>));\n }\n\n if (isObject(input)) {\n return input.created_at === SortDirection.DESC ||\n input.updated_at === SortDirection.DESC;\n }\n\n return typeof input === 'string' &&\n (input === '-created_at' || input === '-updated_at');\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Ref } from 'vue';\n\ntype Fn = (...args: any[]) => Promise<void>;\ntype OutputFn<ARGS extends unknown[]> = (...args: ARGS) => Promise<void>;\n\nexport function wrapFnWithBusyState<T extends Fn = Fn>(\n busy: Ref<boolean>,\n fn: T,\n): OutputFn<Parameters<T>> {\n return async (...args: Parameters<T>) => {\n if (busy.value) {\n return Promise.resolve();\n }\n\n busy.value = true;\n\n return fn(...args)\n .finally(() => {\n busy.value = false;\n });\n };\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityPolicyData, PermissionEvaluationContext } from '@authup/access';\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport type { Ref } from 'vue';\nimport {\n onMounted, \n onUnmounted, \n ref, \n watch,\n} from 'vue';\nimport type { Store } from '../store';\nimport { injectStore, storeToRefs } from '../store';\nimport type { PermissionCheckerReactiveFn, PermissionCheckerReactiveFnCreateContext } from './types';\n\nexport function createPermissionCheckerReactiveFn(\n ctx: PermissionCheckerReactiveFnCreateContext = {},\n) : PermissionCheckerReactiveFn {\n let store : Store;\n if (ctx.store) {\n store = ctx.store;\n } else {\n store = injectStore(ctx.pinia, ctx.app);\n }\n\n const storeRefs = storeToRefs(store);\n\n return (ctx: PermissionEvaluationContext) : Ref<boolean> => {\n const data = ref(false);\n\n let computePromise: Promise<boolean> | undefined;\n const compute = async () => {\n if (computePromise) {\n return computePromise;\n }\n\n let identity: IdentityPolicyData | undefined;\n if (storeRefs.userId.value) {\n identity = {\n type: 'user',\n id: storeRefs.userId.value,\n };\n\n if (storeRefs.realmId.value) {\n identity.realmId = storeRefs.realmId.value;\n }\n\n if (storeRefs.realmName.value) {\n identity.realmId = storeRefs.realmName.value;\n }\n }\n\n let outcome: boolean;\n\n const input = ctx.input || new PolicyData();\n input.set(BuiltInPolicyType.IDENTITY, identity);\n\n try {\n computePromise = store.permissionEvaluator\n .preEvaluateOneOf({\n ...ctx,\n input,\n })\n .then(() => true)\n .catch(() => false);\n\n outcome = await computePromise;\n } catch {\n outcome = false;\n } finally {\n computePromise = undefined;\n }\n\n return outcome;\n };\n\n Promise.resolve()\n .then(() => compute())\n .then((outcome) => {\n data.value = outcome;\n });\n\n let removeListener: undefined | CallableFunction;\n onMounted(() => {\n removeListener = watch(storeRefs.loggedIn, () => {\n Promise.resolve()\n .then(() => compute())\n .then((outcome) => {\n data.value = outcome;\n });\n });\n });\n\n onUnmounted(() => {\n if (typeof removeListener !== 'undefined') {\n removeListener();\n }\n });\n\n return data;\n };\n}\n","/*\n * Copyright (c) 2022-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport type { ClientManager } from '@authup/core-realtime-kit';\nimport { inject } from '../inject';\nimport { provide } from '../provide';\n\nexport const SocketClientSymbol = Symbol.for('AuthupSocketManager');\n\nexport function isSocketManagerUsable() {\n return !!inject(SocketClientSymbol);\n}\n\nexport function provideSocketManager(manager: ClientManager, app?: App) {\n provide(SocketClientSymbol, manager, app);\n}\n\nexport function injectSocketManager(app?: App) : ClientManager {\n const manager = inject<ClientManager>(SocketClientSymbol, app);\n if (!manager) {\n throw new Error('The socket manager has not been injected in the app context.');\n }\n\n return manager;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ClientManager } from '@authup/core-realtime-kit';\nimport type { Pinia } from 'pinia';\nimport type { App } from 'vue';\nimport { ref } from 'vue';\nimport { injectStoreFactory, storeToRefs } from '../store';\nimport { provideSocketManager } from './singleton';\n\nexport type SocketManagerInstallOptions = {\n pinia?: Pinia,\n baseURL: string\n};\n\nexport function installSocketManager(app: App, options : SocketManagerInstallOptions) {\n const storeCreator = injectStoreFactory(app);\n const store = storeCreator(options.pinia);\n const { accessToken } = storeToRefs(store);\n\n const manager = new ClientManager({\n url: options.baseURL,\n token: () => accessToken.value ?? undefined,\n });\n\n const oldValue = ref<string | undefined>();\n\n store.$subscribe((\n mutation,\n state,\n ) => {\n const normalizedToken = state.accessToken ?? undefined;\n if (normalizedToken !== oldValue.value) {\n oldValue.value = normalizedToken;\n\n Promise.resolve()\n .then(() => manager.reconnect());\n }\n });\n\n provideSocketManager(manager, app);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from '@authup/kit';\nimport type { Slot, Slots, VNode } from 'vue';\n\n/**\n * Returns true if either scoped or unscoped named slot exists\n *\n * @returns boolean\n *\n * @param name\n * @param $slots\n */\nexport function hasNormalizedSlot(\n name : string,\n $slots : Slots = {},\n) {\n return hasOwnProperty($slots, name);\n}\n\n/**\n * Returns VNodes for named slot either scoped or unscoped\n *\n * @param name\n * @param scope\n * @param $slots\n *\n * @returns {Array} VNodes\n */\nexport function normalizeSlot(\n name : string,\n scope: Record<string, any> = {},\n $slots : Slots = {},\n) : VNode[] | VNode {\n if (hasOwnProperty($slots, name)) {\n return ($slots[name] as Slot)(scope);\n }\n\n return [];\n}\n","import { SlotName } from '@vuecs/list-controls';\nimport { defineComponent } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot, useTranslation } from '../../../core';\n\nexport const ATranslation = defineComponent({\n props: {\n group: {\n type: String,\n required: true,\n },\n name: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const translation = useTranslation({\n group: props.group,\n key: props.name,\n });\n\n return () => {\n if (hasNormalizedSlot(SlotName.DEFAULT, slots)) {\n return normalizeSlot(SlotName.DEFAULT, { data: translation.value }, slots);\n }\n\n return [\n translation.value,\n ];\n };\n },\n});\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { TranslatorTranslationDefaultKey } from '../../../core';\nimport { TranslatorTranslationGroup } from '../../../core';\nimport { ATranslation } from './ATranslation';\n\nexport default defineComponent({\n components: { ATranslation },\n props: {\n name: {\n type: String as PropType<`${TranslatorTranslationDefaultKey}`>,\n required: true,\n },\n },\n setup() {\n return { TranslatorTranslationGroup };\n },\n});\n</script>\n<template>\n <ATranslation\n :group=\"TranslatorTranslationGroup.DEFAULT\"\n :name=\"name\"\n />\n</template>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { TranslatorTranslationDefaultKey } from '../../../core';\nimport { TranslatorTranslationGroup } from '../../../core';\nimport { ATranslation } from './ATranslation';\n\nexport default defineComponent({\n components: { ATranslation },\n props: {\n name: {\n type: String as PropType<`${TranslatorTranslationDefaultKey}`>,\n required: true,\n },\n },\n setup() {\n return { TranslatorTranslationGroup };\n },\n});\n</script>\n<template>\n <ATranslation\n :group=\"TranslatorTranslationGroup.DEFAULT\"\n :name=\"name\"\n />\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n ref,\n} from 'vue';\nimport AFormInputListItem from './AFormInputListItem.vue';\nimport { ATranslationDefault } from '../translation';\n\nexport default defineComponent({\n components: {\n ATranslationDefault,\n AFormInputListItem,\n },\n props: {\n names: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n minItems: {\n type: Number,\n default: 0,\n },\n maxItems: {\n type: Number,\n default: 100,\n },\n },\n emits: ['changed'],\n setup(props, setup) {\n let counter = 0;\n const items = ref<{\n id: number,\n value: string \n }[]>([]);\n\n const add = (item?: string) => {\n items.value.push({\n id: counter++,\n value: item || '',\n });\n };\n\n function assign() {\n items.value = [];\n\n props.names.map((el) => add(el));\n\n if (items.value.length < props.minItems) {\n for (let i = 0; i < props.minItems - items.value.length; i++) {\n add();\n }\n }\n }\n\n setup.expose({ assign });\n\n assign();\n\n const canAdd = computed(() => items.value.length < props.maxItems);\n\n const canDrop = computed(() => items.value.length > props.minItems);\n\n const emitUpdated = () => {\n setup.emit('changed', [\n ...items.value\n .map((el) => el.value)\n .filter(Boolean),\n ]);\n };\n\n const handleUpdated = (id: number, value: string) => {\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1 && items.value[index]) {\n items.value[index].value = value;\n }\n\n emitUpdated();\n };\n\n const handleDeleted = (id: number) => {\n if (items.value.length <= props.minItems) {\n return;\n }\n\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1) {\n items.value.splice(index, 1);\n }\n\n emitUpdated();\n };\n\n return {\n add,\n\n canAdd,\n canDrop,\n\n handleDeleted,\n handleUpdated,\n\n items,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div class=\"d-flex flex-row\">\n <div class=\"align-self-end\">\n <slot name=\"label\">\n Names\n </slot>\n </div>\n <div class=\"ms-auto\">\n <button\n class=\"btn btn-xs btn-primary\"\n type=\"button\"\n :disabled=\"!canAdd\"\n @click.prevent=\"add()\"\n >\n <i class=\"fa fa-plus\" /> <ATranslationDefault :name=\"'add'\" />\n </button>\n </div>\n </div>\n <div class=\"d-flex flex-column gap-1\">\n <template v-if=\"items.length === 0\">\n <slot name=\"noItems\">\n <div class=\"alert alert-sm alert-info\">\n The form list has no items yet\n </div>\n </slot>\n </template>\n <template\n v-for=\"item in items\"\n :key=\"item.id\"\n >\n <slot\n name=\"default\"\n :item=\"item\"\n :updated=\"handleUpdated\"\n :deleted=\"handleDeleted\"\n >\n <AFormInputListItem\n :key=\"item.id\"\n :disabled=\"!canDrop\"\n :name=\"item.value\"\n @updated=\"(input) => { handleUpdated(item.id, input) }\"\n @deleted=\"() => { handleDeleted(item.id) }\"\n />\n </slot>\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n ref,\n} from 'vue';\nimport AFormInputListItem from './AFormInputListItem.vue';\nimport { ATranslationDefault } from '../translation';\n\nexport default defineComponent({\n components: {\n ATranslationDefault,\n AFormInputListItem,\n },\n props: {\n names: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n minItems: {\n type: Number,\n default: 0,\n },\n maxItems: {\n type: Number,\n default: 100,\n },\n },\n emits: ['changed'],\n setup(props, setup) {\n let counter = 0;\n const items = ref<{\n id: number,\n value: string \n }[]>([]);\n\n const add = (item?: string) => {\n items.value.push({\n id: counter++,\n value: item || '',\n });\n };\n\n function assign() {\n items.value = [];\n\n props.names.map((el) => add(el));\n\n if (items.value.length < props.minItems) {\n for (let i = 0; i < props.minItems - items.value.length; i++) {\n add();\n }\n }\n }\n\n setup.expose({ assign });\n\n assign();\n\n const canAdd = computed(() => items.value.length < props.maxItems);\n\n const canDrop = computed(() => items.value.length > props.minItems);\n\n const emitUpdated = () => {\n setup.emit('changed', [\n ...items.value\n .map((el) => el.value)\n .filter(Boolean),\n ]);\n };\n\n const handleUpdated = (id: number, value: string) => {\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1 && items.value[index]) {\n items.value[index].value = value;\n }\n\n emitUpdated();\n };\n\n const handleDeleted = (id: number) => {\n if (items.value.length <= props.minItems) {\n return;\n }\n\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1) {\n items.value.splice(index, 1);\n }\n\n emitUpdated();\n };\n\n return {\n add,\n\n canAdd,\n canDrop,\n\n handleDeleted,\n handleUpdated,\n\n items,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div class=\"d-flex flex-row\">\n <div class=\"align-self-end\">\n <slot name=\"label\">\n Names\n </slot>\n </div>\n <div class=\"ms-auto\">\n <button\n class=\"btn btn-xs btn-primary\"\n type=\"button\"\n :disabled=\"!canAdd\"\n @click.prevent=\"add()\"\n >\n <i class=\"fa fa-plus\" /> <ATranslationDefault :name=\"'add'\" />\n </button>\n </div>\n </div>\n <div class=\"d-flex flex-column gap-1\">\n <template v-if=\"items.length === 0\">\n <slot name=\"noItems\">\n <div class=\"alert alert-sm alert-info\">\n The form list has no items yet\n </div>\n </slot>\n </template>\n <template\n v-for=\"item in items\"\n :key=\"item.id\"\n >\n <slot\n name=\"default\"\n :item=\"item\"\n :updated=\"handleUpdated\"\n :deleted=\"handleDeleted\"\n >\n <AFormInputListItem\n :key=\"item.id\"\n :disabled=\"!canDrop\"\n :name=\"item.value\"\n @updated=\"(input) => { handleUpdated(item.id, input) }\"\n @deleted=\"() => { handleDeleted(item.id) }\"\n />\n </slot>\n </template>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildPagination as _buildPagination } from '@vuecs/pagination';\nimport type { PaginationOptions } from './type';\n\nexport function buildPagination(\n ctx: PaginationOptions,\n) {\n return _buildPagination({\n load: (pagination) => ctx.load?.({\n ...ctx.meta,\n pagination: {\n limit: pagination.limit,\n offset: pagination.offset,\n },\n }),\n total: ctx.meta?.total ?? ctx.total ?? 0,\n limit: ctx.meta?.pagination?.limit ?? 0,\n offset: ctx.meta?.pagination?.offset ?? 0,\n busy: ctx.meta?.busy ?? ctx.busy,\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { buildPagination } from './module';\nimport type { PaginationLoadFn } from './type';\n\nexport const APagination = defineComponent({\n props: {\n total: { type: Number },\n meta: { type: Object as PropType<Record<string, any>> },\n busy: { type: Boolean },\n load: { type: Function as PropType<PaginationLoadFn> },\n },\n setup(props) {\n return () => buildPagination({\n busy: props.busy,\n load: props.load,\n meta: props.meta,\n total: props.total,\n });\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { BuildInput } from 'rapiq';\nimport type { PropType } from 'vue';\nimport type {\n EntityCollectionVEmitOptions,\n ListBodyOptions, \n ListFooterOptions, \n ListHeaderOptions, \n ListLoadingOptions, \n ListNoMoreOptions,\n} from '../types';\n\nexport function defineEntityCollectionVEmitOptions<T>() : EntityCollectionVEmitOptions<T> {\n return {\n \n created: (_item: T) => true,\n \n deleted: (_item: T) => true,\n \n updated: (_item: T) => true,\n };\n}\nexport function defineEntityCollectionVProps<T>() {\n return {\n query: {\n type: Object as PropType<BuildInput<T extends Record<string, any> ? T : never>>,\n default() {\n return {};\n },\n },\n realmId: {\n type: String,\n default: undefined,\n },\n loadOnSetup: {\n type: Boolean,\n default: true,\n },\n loading: {\n type: [Boolean, Object] as PropType<boolean | ListLoadingOptions<T>>,\n default: true,\n },\n noMore: {\n type: [Boolean, Object] as PropType<boolean | ListNoMoreOptions<T>>,\n default: true,\n },\n footer: {\n type: [Boolean, Object] as PropType<boolean | ListFooterOptions<T>>,\n default: true,\n },\n header: {\n type: [Boolean, Object] as PropType<boolean | ListHeaderOptions<T>>,\n default: true,\n },\n body: { type: Object as PropType<ListBodyOptions<T>> },\n };\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport type { EntityCollectionRenderOptions, EntityCollectionVProps } from '../types';\n\nfunction mergeListOption<T extends boolean | Record<string, any> | undefined>(\n primary: T,\n secondary: T,\n) : T {\n if (typeof secondary === 'undefined') {\n return primary;\n }\n\n if (typeof primary === 'undefined') {\n return secondary;\n }\n\n if (typeof primary === 'boolean' && !primary) {\n return primary;\n }\n\n const primaryRecord = typeof primary === 'boolean' ? {} : primary;\n const secondaryRecord = typeof secondary === 'boolean' ? {} : secondary;\n\n return merge(primaryRecord, secondaryRecord) as T;\n}\n\nexport function mergeEntityCollectionRenderOptions<T>(\n props: EntityCollectionVProps<T>,\n defaults: Partial<EntityCollectionRenderOptions<T>>,\n) : EntityCollectionRenderOptions<T> {\n const output : Partial<EntityCollectionRenderOptions<T>> = {\n body: defaults.body,\n item: defaults.item,\n };\n\n output.header = mergeListOption(props.header, defaults.header);\n output.noMore = mergeListOption(props.noMore, defaults.noMore);\n output.footer = mergeListOption(props.footer, defaults.footer);\n output.loading = mergeListOption(props.loading, defaults.loading);\n\n return output as EntityCollectionRenderOptions<T>;\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { Ref } from 'vue';\n\ntype EntityFn<T> = (entity: T) => void | Promise<void>;\n\ntype Options<T> = {\n created?: EntityFn<T>,\n updated?: EntityFn<T>,\n deleted?: EntityFn<T>,\n};\n\ntype StackItem<T> = {\n data: T,\n operation: 'created' | 'deleted' | 'updated'\n};\n\nexport class ListHandlers<T extends ObjectLiteral> {\n protected data: Ref<T[]>;\n\n protected options : Options<T>;\n\n protected stack : StackItem<T>[];\n\n protected stackProcessing : boolean;\n\n constructor(\n data: Ref<T[]>,\n options: Options<T> = {},\n ) {\n this.data = data;\n this.options = options;\n this.stack = [];\n\n this.stackProcessing = false;\n }\n\n protected process() {\n if (this.stackProcessing) {\n return;\n }\n\n this.stackProcessing = true;\n\n const item = this.stack.shift();\n if (!item) {\n this.stackProcessing = false;\n return;\n }\n\n const index = this.data.value.findIndex(\n (el: T) => (el as Record<string, any>).id === (item.data as Record<string, any>).id,\n );\n\n switch (item.operation) {\n case 'created': {\n if (index === -1) {\n this.data.value.push(item.data);\n\n if (this.options.created) {\n this.options.created(item.data);\n }\n }\n break;\n }\n case 'updated': {\n const existing = index !== -1 ? this.data.value[index] : undefined;\n if (existing) {\n const keys = Object.keys(item.data) as (keyof T)[];\n for (const key of keys) {\n existing[key] = item.data[key];\n }\n\n if (this.options.updated) {\n this.options.updated(existing);\n }\n }\n break;\n }\n case 'deleted': {\n if (index !== -1) {\n const [output] = this.data.value.splice(index, 1);\n\n if (this.options.deleted && output) {\n this.options.deleted(output);\n }\n }\n break;\n }\n }\n\n this.stackProcessing = false;\n\n this.process();\n }\n\n created(item: T) {\n this.stack.push({\n data: item,\n operation: 'created',\n });\n\n this.process();\n }\n\n updated(item: T) {\n this.stack.push({\n data: item,\n operation: 'updated',\n });\n\n this.process();\n }\n\n deleted(item: T) {\n this.stack.push({\n data: item,\n operation: 'deleted',\n });\n\n this.process();\n }\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function boolableToObject<T extends Record<string, any>>(input: T | boolean) : T {\n if (typeof input === 'boolean') {\n return {} as T;\n }\n\n return input;\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityDefaultEventName, REALM_MASTER_NAME, buildEntityChannelName } from '@authup/core-kit';\nimport type {\n EntityType,\n EntityTypeMap,\n EventRecord,\n} from '@authup/core-kit';\nimport type { EventFullName, STCEventContext } from '@authup/core-realtime-kit';\nimport { EventNameSuffix, buildEventFullName } from '@authup/core-realtime-kit';\nimport {\n computed, \n isRef, \n onMounted, \n onUnmounted, \n watch,\n} from 'vue';\nimport { injectStore, storeToRefs } from '../../../../core/store';\nimport type { EntitySocketManager, EntitySocketManagerCreateContext } from './type';\nimport { injectSocketManager, isSocketManagerUsable } from '../../../../core/socket-manager';\n\nfunction create<\n TYPE extends string,\n RECORD extends Record<string, any>,\n>(\n ctx: EntitySocketManagerCreateContext<TYPE, RECORD>,\n) : EntitySocketManager {\n if (!isSocketManagerUsable()) {\n return {\n mount() {\n\n },\n unmount() {\n\n },\n };\n }\n\n const socketManager = injectSocketManager();\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const realmId = computed(() => {\n if (storeRefs.realmName.value === REALM_MASTER_NAME) {\n return undefined;\n }\n\n if (isRef(ctx.realmId)) {\n return ctx.realmId.value;\n }\n\n if (ctx.realmId) {\n return ctx.realmId;\n }\n\n return storeRefs.realmId.value;\n });\n\n const targetId = computed(\n () => (\n isRef(ctx.targetId) ?\n ctx.targetId.value :\n ctx.targetId\n ),\n );\n\n const lockId = computed(\n () => (\n isRef(ctx.lockId) ?\n ctx.lockId.value :\n ctx.lockId\n ),\n );\n\n const processEvent = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) : boolean => {\n if (\n ctx.processEvent &&\n !ctx.processEvent(event, realmId.value)\n ) {\n return false;\n }\n\n const channelName = ctx.buildChannelName ?\n ctx.buildChannelName(targetId.value) :\n buildEntityChannelName(ctx.type, targetId.value);\n\n if (event.meta.roomName !== channelName) {\n return false;\n }\n\n if (ctx.target && (!targetId.value || targetId.value !== event.data.id)) {\n return false;\n }\n\n return event.data.id !== lockId.value;\n };\n\n const handleCreated = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) => {\n if (!processEvent(event)) {\n return;\n }\n\n if (ctx.onCreated) {\n ctx.onCreated(event.data as RECORD);\n }\n };\n\n const handleUpdated = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) => {\n if (!processEvent(event)) {\n return;\n }\n\n if (ctx.onUpdated) {\n ctx.onUpdated(event.data as RECORD);\n }\n };\n const handleDeleted = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) => {\n if (!processEvent(event)) {\n return;\n }\n\n if (ctx.onDeleted) {\n ctx.onDeleted(event.data as RECORD);\n }\n };\n\n let mounted = false;\n const mount = async () => {\n if ((ctx.target && !targetId.value) || mounted) {\n return;\n }\n\n mounted = true;\n\n const socket = await socketManager.connect(`/resources#${realmId.value}`);\n\n let event : EventFullName<TYPE, `${EventNameSuffix.SUBSCRIBE}`> | undefined;\n if (ctx.buildSubscribeEventName) {\n event = ctx.buildSubscribeEventName();\n } else {\n event = buildEventFullName(\n ctx.type as TYPE,\n EventNameSuffix.SUBSCRIBE,\n );\n }\n\n socket.emit(\n event,\n targetId.value,\n );\n\n if (ctx.onCreated) {\n socket.on(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.CREATED,\n ), handleCreated);\n }\n\n if (ctx.onUpdated) {\n socket.on(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.UPDATED,\n ), handleUpdated);\n }\n\n if (ctx.onDeleted) {\n socket.on(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.DELETED,\n ), handleDeleted);\n }\n };\n\n const unmount = async () => {\n if ((ctx.target && !targetId.value) || !mounted) {\n return;\n }\n\n mounted = false;\n\n const socket = await socketManager.connect(`/resources#${realmId.value}`);\n\n let event : EventFullName<TYPE, `${EventNameSuffix.UNSUBSCRIBE}`>;\n if (ctx.buildUnsubscribeEventName) {\n event = ctx.buildUnsubscribeEventName();\n } else {\n event = buildEventFullName(\n ctx.type as TYPE,\n EventNameSuffix.UNSUBSCRIBE,\n );\n }\n\n socket.emit(\n event,\n targetId.value,\n );\n\n if (ctx.onCreated) {\n socket.off(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.UPDATED,\n ), handleCreated);\n }\n\n if (ctx.onUpdated) {\n socket.off(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.UPDATED,\n ), handleUpdated);\n }\n\n if (ctx.onDeleted) {\n socket.off(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.DELETED,\n ), handleDeleted);\n }\n };\n\n onMounted(() => mount());\n onUnmounted(() => unmount());\n\n watch(targetId, (val, oldValue) => {\n if (val !== oldValue) {\n Promise.resolve()\n .then(() => unmount())\n .then(() => mount());\n }\n });\n\n return {\n mount,\n unmount,\n };\n}\n\nexport function defineEntitySocketManager<\n A extends keyof EntityTypeMap,\n>(\n ctx: EntitySocketManagerCreateContext<A, EntityTypeMap[A]>,\n) : EntitySocketManager {\n return create(ctx);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from '@authup/kit';\nimport type { EntityAPI } from '@authup/core-http-kit';\nimport type { EntityTypeMap } from '@authup/core-kit';\nimport type { ListFooterBuildOptionsInput, ListHeaderBuildOptionsInput } from '@vuecs/list-controls';\nimport { buildList } from '@vuecs/list-controls';\nimport type { BuildInput, FiltersBuildInput } from 'rapiq';\nimport type { Ref, VNodeChild } from 'vue';\nimport {\n computed,\n isRef,\n ref,\n unref,\n} from 'vue';\nimport { createMerger, isObject } from 'smob';\nimport { boolableToObject } from '../../../../utils';\nimport { injectHTTPClient } from '../../../../core/http-client';\nimport { defineEntitySocketManager } from '../socket';\nimport type { EntitySocketManagerCreateContext } from '../socket';\nimport { isQuerySortedDescByDate } from '../../../../core/query';\nimport type {\n EntityCollectionManager,\n EntityCollectionManagerCreateContext,\n EntityCollectionRenderOptions,\n ListMeta,\n} from './types';\nimport {\n ListHandlers,\n mergeEntityCollectionRenderOptions,\n} from './utils';\n\nconst merger = createMerger({\n array: false,\n inPlace: false,\n priority: 'left',\n});\n\ntype Entity<A> = A extends Record<string, any> ? A : never;\n\nfunction create<\n TYPE extends keyof EntityTypeMap,\n RECORD extends EntityTypeMap[TYPE],\n>(\n context: EntityCollectionManagerCreateContext<TYPE, RECORD>,\n) : EntityCollectionManager<RECORD> {\n const data : Ref<RECORD[]> = ref([]);\n const busy = ref(false);\n const total = ref(0);\n const meta = ref<ListMeta<RECORD>>({ pagination: { limit: 10 } }) as Ref<ListMeta<RECORD>>;\n\n const realmId = computed<string | undefined>(\n () => {\n if (context.realmId) {\n return isRef(context.realmId) ? context.realmId.value : context.realmId;\n }\n\n if (context.props.realmId) {\n return context.props.realmId;\n }\n\n return undefined;\n },\n );\n\n const client = injectHTTPClient();\n\n let domainAPI : EntityAPI<Entity<RECORD>> | undefined;\n if (hasOwnProperty(client, context.type)) {\n domainAPI = client[context.type] as any;\n }\n\n let query : BuildInput<Entity<RECORD>> | undefined;\n\n async function load(input: ListMeta<RECORD> = {}) {\n if (!domainAPI || busy.value) return;\n\n busy.value = true;\n meta.value.busy = true;\n\n try {\n let filters : FiltersBuildInput<Entity<RECORD>> | undefined;\n if (\n context.queryFilters &&\n input.filters &&\n hasOwnProperty(input.filters, 'name') &&\n typeof input.filters.name === 'string'\n ) {\n // todo: queryFilters should customize full filters object!\n filters = context.queryFilters(input.filters.name) as FiltersBuildInput<Entity<RECORD>>;\n }\n\n query = undefined;\n if (context.query) {\n if (typeof context.query === 'function') {\n query = context.query();\n } else {\n query = context.query;\n }\n }\n\n if (context.props.query) {\n if (query) {\n query = merger({}, context.props.query, query);\n } else {\n query = context.props.query;\n }\n }\n\n const nextQuery : ListMeta<RECORD> = merger(\n (filters ? { filters } : {}),\n input || {},\n {\n pagination: {\n limit: meta.value.pagination?.limit,\n offset: meta.value.pagination?.offset,\n },\n },\n query || {},\n );\n\n const response = await domainAPI.getMany(\n nextQuery as BuildInput<Entity<RECORD>>,\n );\n\n meta.value = nextQuery;\n\n if (context.loadAll) {\n data.value.push(...response.data as RECORD[]);\n } else {\n data.value = response.data as RECORD[];\n }\n\n total.value = response.meta.total;\n\n meta.value.total = response.meta.total;\n meta.value.pagination = {\n limit: response.meta.limit,\n offset: response.meta.offset,\n };\n } finally {\n busy.value = false;\n meta.value.busy = false;\n }\n\n if (\n context.loadAll &&\n total.value > data.value.length\n ) {\n await load({\n ...meta.value,\n pagination: {\n ...meta.value.pagination,\n offset: (meta.value.pagination?.offset ?? 0) + (meta.value.pagination?.limit ?? 0),\n },\n });\n }\n }\n\n const handlers = new ListHandlers<RECORD>(data, {\n created: (cbEntity) => {\n total.value++;\n\n if (context.onCreated) {\n context.onCreated(cbEntity, meta.value);\n }\n\n if (context.setup && typeof context.setup.emit === 'function') {\n context.setup.emit('created', cbEntity);\n }\n },\n deleted: (cbEntity) => {\n total.value--;\n\n if (context.setup && typeof context.setup.emit === 'function') {\n context.setup.emit('deleted', cbEntity);\n }\n },\n updated: (cbEntity) => {\n if (context.setup && typeof context.setup.emit === 'function') {\n context.setup.emit('updated', cbEntity);\n }\n },\n });\n\n\n function render(defaults?: EntityCollectionRenderOptions<RECORD>) : VNodeChild {\n let renderOptions : EntityCollectionRenderOptions<RECORD>;\n if (defaults) {\n renderOptions = mergeEntityCollectionRenderOptions(context.props, defaults);\n } else {\n renderOptions = context.props;\n }\n const header : ListHeaderBuildOptionsInput<RECORD> = boolableToObject(renderOptions.header || {});\n const footer : ListFooterBuildOptionsInput<RECORD> = boolableToObject(renderOptions.footer || {});\n\n if (renderOptions.item) {\n if (\n typeof renderOptions.body === 'undefined' ||\n typeof renderOptions.body === 'boolean'\n ) {\n renderOptions.body = { item: renderOptions.item };\n } else {\n renderOptions.body.item = renderOptions.item;\n }\n }\n\n return buildList<RECORD, ListMeta<RECORD>>({\n footer,\n header,\n noMore: renderOptions.noMore,\n body: renderOptions.body,\n loading: renderOptions.loading,\n total: total.value,\n load,\n busy: busy.value,\n data: data.value as Entity<RECORD>[],\n meta: meta.value,\n onCreated: (value: RECORD) => {\n if (context.setup.emit) {\n context.setup.emit('created', value);\n }\n\n handlers.created(value);\n },\n onDeleted: (value: RECORD) => {\n if (context.setup.emit) {\n context.setup.emit('deleted', value);\n }\n\n handlers.deleted(value);\n },\n onUpdated: (value: RECORD) => {\n if (context.setup.emit) {\n context.setup.emit('updated', value);\n }\n\n handlers.updated(value);\n },\n slotItems: context.setup.slots || {},\n });\n }\n\n context.setup.expose({\n handleCreated: (data: RECORD) => handlers.created(data),\n handleDeleted: (data: RECORD) => handlers.deleted(data),\n handleUpdated: (data: RECORD) => handlers.updated(data),\n load,\n data,\n });\n\n let loadOnSetup = true;\n const propLoadOnSetup = unref(context.props.loadOnSetup);\n if (typeof propLoadOnSetup === 'boolean') {\n loadOnSetup = propLoadOnSetup;\n }\n\n if (loadOnSetup) {\n Promise.resolve()\n .then(() => load());\n }\n\n if (\n typeof context.socket !== 'boolean' ||\n typeof context.socket === 'undefined' ||\n context.socket\n ) {\n const socketContext : EntitySocketManagerCreateContext<TYPE, RECORD> = {\n type: context.type,\n ...(isObject(context.socket) ? context.socket : {}),\n };\n\n socketContext.onCreated = (entity) => {\n const isSorted = query &&\n query.sort &&\n isQuerySortedDescByDate(query.sort) &&\n meta.value?.pagination?.offset === 0;\n\n if (isSorted || total.value < (meta.value?.pagination?.limit ?? 0)) {\n handlers.created(entity);\n }\n };\n socketContext.onDeleted = (entity: RECORD) => {\n handlers.deleted(entity);\n };\n socketContext.onUpdated = (entity: RECORD) => {\n handlers.updated(entity);\n };\n socketContext.realmId = realmId;\n\n defineEntitySocketManager(socketContext);\n }\n\n return {\n data,\n busy,\n meta,\n total,\n\n handleCreated: (entity: RECORD) => {\n handlers.updated(entity);\n },\n handleDeleted: (entity: RECORD) => {\n handlers.deleted(entity);\n },\n handleUpdated: (entity: RECORD) => {\n handlers.updated(entity);\n },\n\n render,\n load,\n };\n}\n\nexport function defineEntityCollectionManager<\n A extends keyof EntityTypeMap,\n>(\n context: EntityCollectionManagerCreateContext<A, EntityTypeMap[A]>,\n) : EntityCollectionManager<EntityTypeMap[A]> {\n return create(context);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport class EntityRecordError extends Error {\n static unresolvable() {\n return new this('Entity could not be resolved.');\n }\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { BuildInput, FieldsBuildInput, FiltersBuildInput } from 'rapiq';\nimport { unref } from 'vue';\nimport type { PropType } from 'vue';\nimport type {\n EntityManager,\n EntityVEmitOptions,\n EntityVSlotProps,\n} from './types';\n\nexport function buildEntityVSlotProps<T>(\n input: EntityManager<T>,\n) : EntityVSlotProps<T> {\n return {\n ...input,\n error: unref(input.error),\n busy: unref(input.busy),\n data: unref(input.data),\n lockId: unref(input.lockId),\n };\n}\n\nexport function defineEntityVEmitOptions<T>(): EntityVEmitOptions<T> {\n return {\n \n failed: (_item: Error) => true,\n \n created: (_item: T) => true,\n \n deleted: (_item: T) => true,\n \n updated: (_item: T) => true,\n \n resolved: (_item?: T) => true,\n };\n}\n\nexport function defineEntityVProps<T>() {\n return {\n entity: { type: Object as PropType<T> },\n entityId: { type: String },\n queryFilters: { type: Object as PropType<FiltersBuildInput<T extends Record<string, any> ? T : never>> },\n queryFields: { type: Object as PropType<FieldsBuildInput<T extends Record<string, any> ? T : never>> },\n query: { type: Object as PropType<T extends Record<string, any> ? BuildInput<T> : never> },\n };\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { EntityAPI } from '@authup/core-http-kit';\nimport type { EntityTypeMap } from '@authup/core-kit';\nimport type { ObjectLiteral } from '@authup/kit';\nimport { extendObject, hasOwnProperty } from '@authup/kit';\nimport type { BuildInput } from 'rapiq';\nimport { isObject } from 'smob';\nimport type { Ref, VNodeChild } from 'vue';\nimport {\n computed, \n isRef, \n ref, \n toRef, \n watch,\n} from 'vue';\nimport { hasNormalizedSlot, injectHTTPClient, normalizeSlot } from '../../../../core';\nimport type { EntitySocketManager, EntitySocketManagerCreateContext } from '../socket';\nimport { defineEntitySocketManager } from '../socket';\nimport { EntityRecordError } from './error';\nimport type {\n EntityID,\n EntityManager,\n EntityManagerCreateContext,\n ResourceManagerRenderFn,\n ResourceManagerResolveContext,\n} from './types';\nimport { buildEntityVSlotProps } from './helpers';\n\nfunction create<\n TYPE extends keyof EntityTypeMap,\n RECORD extends EntityTypeMap[TYPE] & ObjectLiteral,\n>(\n ctx: EntityManagerCreateContext<TYPE, RECORD>,\n) : EntityManager<RECORD> {\n const client = injectHTTPClient();\n let domainAPI : EntityAPI<RECORD> | undefined;\n if (hasOwnProperty(client, ctx.type)) {\n domainAPI = client[ctx.type] as any;\n }\n\n const entity : Ref<RECORD | undefined> = ref(undefined);\n const entityId = computed<EntityID<RECORD> | undefined>(\n () => (\n entity.value ? (entity.value as any).id : undefined),\n );\n\n const realmId = computed<string | undefined>(\n () => {\n let realmId : string | undefined;\n\n if (ctx.realmId) {\n if (typeof ctx.realmId === 'function') {\n return ctx.realmId(entity.value);\n }\n\n realmId = isRef(ctx.realmId) ? ctx.realmId.value : ctx.realmId;\n }\n\n if (!realmId && entity.value) {\n if (\n hasOwnProperty(entity.value, 'realm_id') &&\n typeof entity.value.realm_id === 'string'\n ) {\n return entity.value.realm_id;\n }\n }\n\n return realmId;\n },\n );\n\n const lockId = ref(undefined) as Ref<EntityID<RECORD> | undefined>;\n\n if (ctx.props && ctx.props.entity) {\n entity.value = ctx.props.entity;\n }\n\n const created = (value: RECORD) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('created', value);\n }\n\n if (ctx.onCreated) {\n ctx.onCreated(value);\n }\n };\n\n const deleted = (value: RECORD) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('deleted', (value || entity.value) as RECORD);\n }\n\n if (ctx.onDeleted) {\n ctx.onDeleted((value || entity.value) as RECORD);\n }\n };\n\n const updated = (value: Partial<RECORD>) => {\n if (entity.value) {\n extendObject(entity.value, value);\n }\n\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('updated', (entity.value || value) as RECORD);\n }\n\n if (ctx.onUpdated) {\n ctx.onUpdated(entity.value || value);\n }\n };\n\n const resolved = (value?: RECORD) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('resolved', value);\n }\n\n if (ctx.onResolved) {\n ctx.onResolved(value);\n }\n };\n\n const failed = (error: Error) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('failed', error);\n }\n\n if (ctx.onFailed) {\n ctx.onFailed(error);\n }\n };\n\n const busy = ref(false);\n\n const update = async (data: Partial<RECORD>) => {\n if (!domainAPI || busy.value || !entityId.value) {\n return;\n }\n\n busy.value = true;\n lockId.value = entityId.value;\n\n try {\n const response = await domainAPI.update(\n entityId.value,\n data,\n );\n\n entity.value = response;\n\n updated(response);\n } catch (e) {\n if (e instanceof Error) {\n failed(e);\n }\n } finally {\n busy.value = false;\n lockId.value = undefined;\n }\n };\n\n const remove = async () : Promise<void> => {\n if (!domainAPI || busy.value || !entityId.value) {\n return;\n }\n\n busy.value = true;\n lockId.value = entityId.value;\n\n try {\n const response = await domainAPI.delete(\n entityId.value,\n );\n\n entity.value = undefined;\n\n deleted(response);\n } catch (e) {\n if (e instanceof Error) {\n failed(e);\n }\n } finally {\n busy.value = false;\n lockId.value = undefined;\n }\n };\n\n const create = async (data: Partial<RECORD>) : Promise<void> => {\n if (!domainAPI || busy.value) {\n return;\n }\n\n busy.value = true;\n\n lockId.value = undefined;\n\n try {\n const response = await domainAPI.create(data);\n\n entity.value = response;\n\n created(response);\n } catch (e) {\n if (e instanceof Error) {\n failed(e);\n }\n } finally {\n busy.value = false;\n lockId.value = undefined;\n }\n };\n\n const createOrUpdate = async (data: Partial<RECORD>) : Promise<void> => {\n if (entity.value) {\n await update(data);\n } else {\n await create(data);\n }\n };\n\n let socket : EntitySocketManager | undefined;\n\n if (\n typeof ctx.socket !== 'boolean' ||\n typeof ctx.socket === 'undefined' ||\n typeof ctx.socket === 'function' ||\n ctx.socket\n ) {\n let socketContext : EntitySocketManagerCreateContext<TYPE, RECORD> = { type: ctx.type };\n\n if (isObject(ctx.socket)) {\n socketContext = {\n ...socketContext,\n ...ctx.socket,\n };\n }\n\n socketContext.onCreated = created;\n socketContext.onUpdated = updated;\n socketContext.lockId = lockId;\n socketContext.realmId = realmId;\n socketContext.target = true;\n socketContext.targetId = entityId;\n\n socket = defineEntitySocketManager(socketContext);\n }\n\n const error = ref<Error | undefined>(undefined);\n\n const resolveByProps = () : boolean => {\n if (!ctx.props) {\n return false;\n }\n\n if (ctx.props.entity) {\n entity.value = ctx.props.entity;\n\n if (socket) {\n socket.mount();\n }\n\n resolved(entity.value);\n\n return true;\n }\n\n return false;\n };\n\n if (ctx.props) {\n const propEntityRef = toRef(ctx.props, 'entity');\n const propsEntityId = computed(() => (propEntityRef.value ? propEntityRef.value.id : undefined));\n watch(propsEntityId, (val) => {\n entity.value = propEntityRef.value;\n\n if (val) {\n if (socket) {\n socket.mount();\n }\n } else if (socket) {\n socket.unmount();\n }\n });\n }\n\n resolveByProps();\n\n const resolve = async (rctx: ResourceManagerResolveContext<RECORD> = {}) => {\n if (entity.value) {\n return;\n }\n\n let query : BuildInput<RECORD> | undefined;\n if (rctx.query) {\n query = rctx.query as BuildInput<RECORD>;\n }\n\n let { id } = rctx;\n\n if (ctx.props) {\n if (resolveByProps()) {\n return;\n }\n\n if (ctx.props.entity) {\n entity.value = ctx.props.entity;\n\n if (socket) {\n socket.mount();\n }\n\n resolved(entity.value);\n\n return;\n }\n\n if (ctx.props.queryFilters) {\n query = query || {} as BuildInput<RECORD>;\n (query as any).filters = ctx.props.queryFilters;\n }\n\n if (ctx.props.queryFields) {\n query = query || {} as BuildInput<RECORD>;\n (query as any).fields = ctx.props.queryFields;\n }\n\n if (ctx.props.entityId) {\n id = ctx.props.entityId;\n }\n }\n\n if (!domainAPI) {\n resolved();\n\n return;\n }\n\n if (id) {\n try {\n entity.value = await domainAPI.getOne(id, query as BuildInput<any>);\n\n if (socket) {\n socket.mount();\n }\n\n resolved(entity.value);\n\n return;\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n\n if (query) {\n try {\n const response = await domainAPI.getMany({\n ...query,\n pagination: { limit: 1 },\n } as any);\n\n if (response.data.length === 1) {\n [entity.value] = response.data;\n\n if (socket) {\n socket.mount();\n }\n }\n\n resolved(entity.value);\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n };\n\n const resolveOrFail = async (resolveContext: ResourceManagerResolveContext<RECORD> = {}) => {\n await resolve(resolveContext);\n\n if (typeof entity.value === 'undefined') {\n if (!error.value) {\n throw EntityRecordError.unresolvable();\n }\n\n // eslint-disable-next-line no-throw-literal\n throw error.value as Error;\n }\n };\n\n if (ctx.query) {\n const queryFn = ctx.query;\n let initialized = false;\n\n watch(\n () => JSON.stringify(queryFn()),\n () => {\n if (!initialized) {\n initialized = true;\n return;\n }\n\n entity.value = undefined;\n resolve({ query: queryFn() as any });\n },\n { immediate: true },\n );\n }\n\n const manager : EntityManager<RECORD> = {\n resolve,\n resolveOrFail,\n lockId,\n busy,\n data: entity,\n error,\n\n create,\n createOrUpdate,\n created,\n\n update,\n updated,\n\n delete: remove,\n deleted,\n\n failed,\n\n render: () => undefined,\n renderError: () => undefined,\n };\n\n manager.render = (content?: VNodeChild | ResourceManagerRenderFn): VNodeChild => {\n if (!ctx.setup || !ctx.setup.slots) {\n return typeof content === 'function' ?\n content() :\n content;\n }\n\n if (hasNormalizedSlot('default', ctx.setup.slots)) {\n return normalizeSlot(\n 'default',\n buildEntityVSlotProps(manager),\n ctx.setup.slots,\n );\n }\n\n return typeof content === 'function' ?\n content() :\n content;\n };\n\n manager.renderError = (error: unknown) : VNodeChild => {\n if (!ctx.setup || !ctx.setup.slots) {\n return undefined;\n }\n\n if (\n isObject(error) &&\n hasNormalizedSlot('error', ctx.setup.slots)\n ) {\n return normalizeSlot('error', error, ctx.setup.slots);\n }\n\n return undefined;\n };\n\n return manager;\n}\n\nexport function defineEntityManager<\n TYPE extends keyof EntityTypeMap,\n>(\n ctx: EntityManagerCreateContext<TYPE, EntityTypeMap[TYPE]>,\n) : EntityManager<EntityTypeMap[TYPE]> {\n return create<TYPE, EntityTypeMap[TYPE]>(ctx);\n}\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n value: {\n type: Boolean,\n required: true,\n },\n isBusy: {\n type: Boolean,\n required: true,\n },\n },\n emits: ['changed'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('changed', !props.value);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n :aria-label=\"isBusy ? 'Processing' : (value ? 'Remove' : 'Add')\"\n :class=\"['btn btn-xs', {\n 'btn-dark': isBusy,\n 'btn-success': !isBusy && !value,\n 'btn-danger': !isBusy && value,\n }]\"\n :disabled=\"isBusy\"\n @click=\"handleClick\"\n >\n <i\n aria-hidden=\"true\"\n :class=\"['fa', {\n 'fa-question': isBusy,\n 'fa-plus': !isBusy && !value,\n 'fa-minus': !isBusy && value,\n }]\"\n />\n </button>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n value: {\n type: Boolean,\n required: true,\n },\n isBusy: {\n type: Boolean,\n required: true,\n },\n },\n emits: ['changed'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('changed', !props.value);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n :aria-label=\"isBusy ? 'Processing' : (value ? 'Remove' : 'Add')\"\n :class=\"['btn btn-xs', {\n 'btn-dark': isBusy,\n 'btn-success': !isBusy && !value,\n 'btn-danger': !isBusy && value,\n }]\"\n :disabled=\"isBusy\"\n @click=\"handleClick\"\n >\n <i\n aria-hidden=\"true\"\n :class=\"['fa', {\n 'fa-question': isBusy,\n 'fa-plus': !isBusy && !value,\n 'fa-minus': !isBusy && value,\n }]\"\n />\n </button>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { h } from 'vue';\n\ntype ToggleButtonOptions = {\n value: boolean,\n isBusy: boolean,\n changed: (value: boolean) => void\n};\nexport function renderToggleButton(\n options: ToggleButtonOptions,\n) {\n return h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': options.isBusy,\n 'btn-success': !options.isBusy && !options.value,\n 'btn-danger': !options.isBusy && options.value,\n }],\n disabled: options.isBusy,\n onClick($event: any) {\n $event.preventDefault();\n\n options.changed(!options.value);\n },\n }, [\n h('i', {\n class: ['fa', {\n 'fa-question': options.isBusy,\n 'fa-plus': !options.isBusy && !options.value,\n 'fa-minus': !options.isBusy && options.value,\n }],\n }),\n ]);\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type { FormInputBuildOptionsInput } from '@vuecs/form-controls';\nimport { buildFormInputText } from '@vuecs/form-controls';\nimport type { VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\nimport { ListSearchSlotName } from './constants';\nimport type { SearchOptionsInput } from './type';\n\ntype Fn = (...args: any[]) => Promise<any> | any;\nfunction debounce<T extends Fn>(func: T, timeout = 200) {\n let timer : ReturnType<typeof setTimeout> | undefined;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => { func(...args); }, timeout);\n };\n}\n\nexport function buildListSearch(\n ctx: SearchOptionsInput,\n) {\n ctx.icon = ctx.icon ?? true;\n ctx.iconClass = ctx.iconClass || 'fa fa-search';\n ctx.iconPosition = ctx.iconPosition ?? 'start';\n\n if (hasNormalizedSlot(ListSearchSlotName.DEFAULT, ctx.slots)) {\n return normalizeSlot(ListSearchSlotName.DEFAULT, {\n load: ctx.load,\n busy: ctx.busy,\n icon: ctx.icon,\n iconClass: ctx.iconClass,\n iconPosition: ctx.iconPosition,\n }, ctx.slots);\n }\n\n let iconContent : VNodeChild | undefined;\n if (hasNormalizedSlot(ListSearchSlotName.ICON)) {\n iconContent = normalizeSlot(ListSearchSlotName.ICON, {}, ctx.slots);\n }\n\n const options: FormInputBuildOptionsInput = {};\n\n if (ctx.icon) {\n if (ctx.iconPosition === 'start') {\n options.groupPrepend = true;\n if (iconContent) {\n options.groupPrependContent = iconContent;\n } else {\n options.groupPrependContent = h('i', { class: ctx.iconClass });\n }\n } else {\n options.groupAppend = true;\n if (iconContent) {\n options.groupAppendContent = iconContent;\n } else {\n options.groupAppendContent = h('i', { class: ctx.iconClass });\n }\n }\n }\n\n const handle = debounce((text: string) => {\n if (!ctx.load || ctx.meta?.busy || ctx.busy) {\n return Promise.resolve();\n }\n\n return ctx.load({\n filters: { name: text.length > 0 ? `~${text}` : text as any },\n pagination: { offset: 0 },\n });\n });\n\n return buildFormInputText({\n type: 'text',\n onChange: (text: string) => handle(text),\n props: { placeholder: '...' },\n ...options,\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ListLoadFn } from '@vuecs/list-controls';\nimport type { PropType, SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { ListMeta } from '../entity';\nimport type { SearchSlotProps } from './type';\nimport { buildListSearch } from './module';\n\nexport const ASearch = defineComponent({\n props: {\n // todo: add entity-key prop\n icon: { type: Boolean },\n iconPosition: { type: String as PropType<'start' | 'end'> },\n iconClass: { type: String },\n busy: { type: Boolean },\n load: { type: Function as PropType<ListLoadFn> },\n meta: { type: Object as PropType<ListMeta<any>> },\n },\n slots: Object as SlotsType<{\n default: SearchSlotProps\n }>,\n setup(\n props,\n { slots },\n ) {\n return () => buildListSearch({\n slots,\n icon: props.icon,\n iconPosition: props.iconPosition,\n busy: props.busy,\n load: props.load,\n meta: props.meta,\n });\n },\n});\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { SlotName } from '@vuecs/list-controls';\nimport type { PropType, Ref, VNodeChild } from 'vue';\nimport {\n computed, \n h, \n mergeProps, \n ref, \n toRef, \n watch,\n} from 'vue';\nimport { APagination } from '../../pagination';\nimport { renderToggleButton } from '../../toggle-button';\nimport type { EntityCollectionVSlots } from '../collection';\nimport { defineEntityCollectionVEmitOptions, defineEntityCollectionVProps } from '../collection';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../../core';\nimport { ASearch } from '../../search';\nimport type { EntityPickerContext, EntityPickerVEmitOptions, RecordWithID } from './types';\n\nexport function defineEntityPickerVEmitOptions<T>() : EntityPickerVEmitOptions<T> {\n return {\n \n change: (_values: string[]) => true,\n ...defineEntityCollectionVEmitOptions<T>(),\n };\n}\n\nexport function defineEntityPickerVProps<T extends RecordWithID = RecordWithID>() {\n return {\n value: { type: [Array, String] as PropType<string[] | string | null> },\n multiple: { type: Boolean as PropType<boolean | undefined> },\n ...defineEntityCollectionVProps<T>(),\n };\n}\n\nexport function defineEntityPicker<T extends RecordWithID>({\n props,\n setup,\n component,\n} : EntityPickerContext<T>) {\n const componentRef = ref(null) as Ref<null | Record<string, any>>;\n\n setup.expose({\n load: (...args: any[]) => {\n if (componentRef.value) {\n return componentRef.value.load(...args);\n }\n\n return undefined;\n },\n });\n\n const value = toRef(props, 'value');\n const items = ref<string[]>([]);\n\n const assignItems = (input?: string[] | string | null) => {\n if (Array.isArray(input)) {\n items.value = input;\n } else if (input) {\n items.value = [input];\n } else {\n items.value = [];\n }\n };\n\n const isMultiSelection = computed(() => {\n if (typeof props.multiple === 'boolean') {\n return props.multiple;\n }\n\n return Array.isArray(value.value);\n });\n\n assignItems(value.value);\n\n watch(value, (input) => assignItems(input));\n\n const toggle = (id: string) => {\n const index = items.value!.indexOf(id);\n\n if (index === -1) {\n if (isMultiSelection.value) {\n items.value!.push(id);\n } else {\n items.value = [id];\n }\n } else if (isMultiSelection.value) {\n if (index !== -1) {\n items.value!.splice(index, 1);\n }\n } else {\n items.value = [];\n }\n\n setup.emit('change', [...items.value]);\n };\n\n const render = () => h(\n component,\n mergeProps(\n { ref: componentRef },\n props,\n setup.attrs,\n ),\n {\n [SlotName.HEADER]: (slotProps: EntityCollectionVSlots<RecordWithID>['header']) => [\n h(ASearch, {\n load: (payload: any) => {\n if (slotProps.load) {\n return slotProps.load(payload);\n }\n\n return undefined;\n },\n busy: slotProps.busy,\n }),\n ],\n [SlotName.FOOTER]: (slotProps: EntityCollectionVSlots<RecordWithID>['footer']) => [\n h(APagination, {\n load: (payload: any) => {\n if (slotProps.load) {\n return slotProps.load(payload);\n }\n\n return undefined;\n },\n busy: slotProps.busy,\n meta: slotProps.meta,\n }),\n ],\n [SlotName.ITEM_ACTIONS]: (\n slotProps: EntityCollectionVSlots<RecordWithID>['itemActions'],\n ) => {\n let content : VNodeChild | undefined;\n if (hasNormalizedSlot(SlotName.ITEM_ACTIONS, setup.slots)) {\n content = normalizeSlot(SlotName.ITEM_ACTIONS, {\n ...slotProps,\n toggle,\n }, setup.slots);\n }\n\n if (content) {\n return content;\n }\n\n return renderToggleButton({\n value: items.value.includes(slotProps.data.id),\n isBusy: slotProps.busy,\n changed() {\n toggle(slotProps.data.id);\n },\n });\n },\n },\n );\n\n return { render };\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@authup/kit';\nimport type {\n Component,\n PropType,\n VNodeArrayChildren,\n VNodeProps,\n} from 'vue';\nimport {\n defineComponent, \n getCurrentInstance,\n h,\n mergeProps,\n ref, \n resolveDynamicComponent,\n} from 'vue';\nimport type { EntityType } from '@authup/core-kit';\nimport type { EntityAPISlim } from '@authup/core-http-kit';\nimport {\n TranslatorTranslationDefaultKey, \n TranslatorTranslationGroup, \n injectHTTPClient, \n useTranslation, \n wrapFnWithBusyState,\n} from '../../../core';\n\nenum ElementType {\n BUTTON = 'button',\n LINK = 'link',\n DROP_DOWN_ITEM = 'dropDownItem',\n}\n\nconst AEntityDelete = defineComponent({\n props: {\n elementIcon: {\n type: String,\n default: 'fa-solid fa-trash',\n },\n withText: {\n type: Boolean,\n default: true,\n },\n elementType: {\n type: String as PropType<`${ElementType}`>,\n default: ElementType.BUTTON,\n },\n\n entityId: {\n type: String,\n required: true,\n },\n entityType: {\n type: String as PropType<`${EntityType}`>,\n required: true,\n },\n\n hint: {\n type: String,\n default: undefined,\n },\n },\n emits: ['deleted', 'failed'],\n setup(props, ctx) {\n const apiClient = injectHTTPClient();\n const instance = getCurrentInstance();\n const busy = ref(false);\n\n const submit = wrapFnWithBusyState(busy, async () => {\n const domainAPI = (\n apiClient as Record<string, any>\n )[props.entityType] as EntityAPISlim<any> | undefined;\n\n if (!isObject(domainAPI)) {\n return;\n }\n\n if (typeof domainAPI.delete !== 'function') {\n return;\n }\n\n try {\n const response = await domainAPI.delete(props.entityId);\n response.id = props.entityId;\n ctx.emit('deleted', response);\n } catch (e) {\n ctx.emit('failed', e);\n }\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.DELETE,\n });\n\n const render = () => {\n let tag : Component | string = 'button';\n const data : VNodeProps = {};\n\n switch (props.elementType) {\n case ElementType.LINK:\n tag = 'a';\n break;\n case ElementType.DROP_DOWN_ITEM:\n if (\n instance &&\n typeof instance.appContext.app.component('BDropdownItem') !== 'undefined'\n ) {\n tag = resolveDynamicComponent('BDropdownItem') as Component;\n }\n break;\n }\n\n let icon : VNodeArrayChildren = [];\n if (props.elementIcon) {\n icon = [\n h('i', { class: [props.elementIcon, { 'pe-1': props.withText }] }),\n ];\n }\n\n let text : VNodeArrayChildren = [];\n if (props.withText) {\n text = [\n translation.value,\n ];\n }\n\n return h(\n tag as string,\n mergeProps({\n disabled: busy.value,\n onClick($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, data),\n [\n icon,\n text,\n ],\n );\n };\n\n return () => render();\n },\n});\n\nexport { AEntityDelete };\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type { VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\nimport { TitleSlotName } from './constants';\nimport type { TitleOptions } from './type';\n\nexport function buildTitle(\n ctx: TitleOptions,\n) {\n ctx.tag = ctx.tag || 'h6';\n ctx.icon = ctx.icon ?? true;\n ctx.iconClass = ctx.iconClass || 'fa-solid fa-list';\n ctx.iconPosition = ctx.iconPosition ?? 'start';\n\n if (hasNormalizedSlot(TitleSlotName.DEFAULT, ctx.slots)) {\n return normalizeSlot(TitleSlotName.DEFAULT, {\n tag: ctx.tag,\n icon: ctx.icon,\n iconClass: ctx.iconClass,\n iconPosition: ctx.iconPosition,\n }, ctx.slots);\n }\n\n let icon: VNodeChild;\n\n if (ctx.icon) {\n let iconContent : VNodeChild;\n if (hasNormalizedSlot(TitleSlotName.ICON)) {\n iconContent = normalizeSlot(TitleSlotName.ICON, {}, ctx.slots);\n }\n\n if (iconContent) {\n icon = iconContent;\n } else {\n icon = h(\n 'i',\n { class: [ctx.iconClass, 'pe-1'] },\n );\n }\n }\n\n let content: VNodeChild;\n if (typeof ctx.text === 'function') {\n content = ctx.text();\n } else {\n content = ctx.text || 'Overview';\n }\n\n if (ctx.iconPosition === 'start') {\n return h(ctx.tag, [\n icon,\n content,\n ]);\n }\n\n return h(ctx.tag, [\n content,\n icon,\n ]);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PropType, SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { TranslatorTranslationDefaultKey, TranslatorTranslationGroup, useTranslation } from '../../../core';\nimport type { TitleSlotProps } from './type';\nimport { buildTitle } from './module';\n\nexport const ATitle = defineComponent({\n props: {\n icon: {\n type: Boolean,\n default: true,\n },\n iconPosition: { type: String as PropType<'start' | 'end'> },\n iconClass: { type: String },\n text: { type: String },\n },\n slots: Object as SlotsType<{\n default: TitleSlotProps\n }>,\n setup(props, { slots }) {\n const translation = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.OVERVIEW,\n });\n\n return () => buildTitle({\n slots,\n icon: props.icon,\n iconPosition: props.iconPosition,\n text: props.text || translation.value,\n });\n },\n});\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { injectLocale } from '@ilingo/vuelidate/vue';\nimport {\n computed, \n defineComponent, \n h, \n ref,\n} from 'vue';\n\nconst LanguageSwitcherDropdown = defineComponent({\n props: {\n linkClassExtra: {\n type: String,\n default: undefined,\n },\n },\n async setup(props) {\n const opened = ref(false);\n\n const locale = injectLocale();\n const locales = ['de', 'en'];\n\n const elements = computed(() => {\n const output = [];\n for (const locale_ of locales) {\n output.push({\n value: locale_,\n active: locale.value === locale_,\n });\n }\n\n return output;\n });\n\n const setLocale = (input: string) => {\n locale.value = input;\n opened.value = false;\n };\n\n return () => [\n h('button', {\n class: [\n 'dropdown-toggle',\n props.linkClassExtra,\n ],\n onClick(event: any) {\n event.preventDefault();\n\n opened.value = !opened.value;\n },\n }, [\n locale.value,\n ]),\n h('div', {\n class: [\n 'dropdown-menu',\n opened.value ? 'show' : '',\n ],\n }, elements.value.map((element) => h('button', {\n onClick(event) {\n event.preventDefault();\n\n setLocale(element.value);\n },\n class: [\n 'dropdown-item',\n element.active ? 'active' : '',\n ],\n }, [element.value]))),\n ];\n },\n});\n\nexport { LanguageSwitcherDropdown };\n","import { defineComponent } from 'vue';\nimport { buildFormSubmitWithTranslations, createFormSubmitTranslations } from '../../core';\n\nexport const AFormSubmit = defineComponent({\n props: {\n isBusy: {\n type: Boolean,\n default: false,\n },\n isEditing: {\n type: Boolean,\n default: false,\n },\n isInvalid: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['submit'],\n setup(props, { emit }) {\n const translationsSubmit = createFormSubmitTranslations();\n\n const render = () => buildFormSubmitWithTranslations({\n submit: () => emit('submit'),\n busy: props.isBusy,\n isEditing: props.isEditing,\n invalid: props.isInvalid,\n }, translationsSubmit);\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Client } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AClient = defineComponent({\n props: defineEntityVProps<Client>(),\n emits: defineEntityVEmitOptions<Client>(),\n slots: Object as SlotsType<EntityVSlots<Client>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT}`,\n setup,\n props,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Realm } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const ARealm = defineComponent({\n props: defineEntityVProps<Realm>(),\n emits: defineEntityVEmitOptions<Realm>(),\n slots: Object as SlotsType<EntityVSlots<Realm>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.REALM}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComputedRef, MaybeRef } from 'vue';\nimport { computed, isRef } from 'vue';\n\ntype ObjectLiteral = {\n id: any\n};\nexport function useIsEditing<T extends ObjectLiteral>(input: MaybeRef<T | undefined>) : ComputedRef<boolean> {\n return computed(() => {\n if (isRef(input)) {\n return !!input.value && !!input.value.id;\n }\n\n return !!input && !!input.id;\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { watch } from 'vue';\nimport type { Ref } from 'vue';\n\nexport function onChange<T>(input: Ref<T>, fn: (item: T) => any) {\n watch(input, (val, oldValue) => {\n if (val !== oldValue) {\n fn(val);\n }\n }, { deep: true });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComputedRef, MaybeRef } from 'vue';\nimport { computed, isRef } from 'vue';\n\ntype ObjectLiteral = {\n updated_at: string | Date | undefined\n};\nexport function useUpdatedAt<T extends ObjectLiteral>(input?: MaybeRef<T | null | undefined>) : ComputedRef<string | Date | undefined> {\n return computed(() => {\n if (isRef(input)) {\n return input.value ? input.value.updated_at : undefined;\n }\n\n return input ? input.updated_at : undefined;\n });\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionEvaluationContext } from '@authup/access';\nimport type { Ref } from 'vue';\nimport { createPermissionCheckerReactiveFn } from '../core';\n\nexport function usePermissionCheck(ctx: PermissionEvaluationContext) : Ref<boolean> {\n const checkFn = createPermissionCheckerReactiveFn();\n\n return checkFn(ctx);\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport { createNanoID } from '@authup/kit';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive, \n ref, \n watch,\n} from 'vue';\nimport type { Realm } from '@authup/core-kit';\nimport { EntityType, REALM_MASTER_NAME } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n buildFormTextarea,\n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\n\nexport const ARealmForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<Realm>,\n required: false,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Realm>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n });\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: VuelidateCustomRule[\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n }, form);\n\n const manager = defineEntityManager({\n type: `${EntityType.REALM}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n const isNameEmpty = computed(() => !form.name || form.name.length === 0);\n\n const generateName = () => {\n form.name = createNanoID();\n };\n\n function initForm() {\n assignFormProperties(form, manager.data.value);\n\n if (form.name.length === 0) {\n generateName();\n }\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n const render = () => {\n const children : VNodeArrayChildren = [];\n children.push(buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: {\n disabled: manager.data.value &&\n manager.data.value.name === REALM_MASTER_NAME,\n },\n }),\n }));\n\n if (!manager.data.value || !manager.data.value.id) {\n children.push([\n h('div', { class: 'mb-3' }, [\n h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': isNameEmpty.value,\n 'btn-warning': !isNameEmpty.value,\n }],\n onClick($event: any) {\n $event.preventDefault();\n\n generateName.call(null);\n },\n }, [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n translationsDefault[TranslatorTranslationDefaultKey.GENERATE].value,\n ]),\n ]),\n ]);\n }\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 4 },\n }),\n }));\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Realm } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const ARealms = defineComponent({\n props: defineEntityCollectionVProps<Realm>(),\n emits: defineEntityCollectionVEmitOptions<Realm>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Realm>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.REALM}`,\n props,\n setup: ctx,\n });\n\n const translationsName = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationDefaultKey.REALMS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationsName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityPicker,\n defineEntityPickerVEmitOptions,\n defineEntityPickerVProps,\n} from '../../utility/entity/picker/module';\nimport type { EntityPickerVSlots } from '../../utility/entity/picker/types';\nimport { ARealms } from './ARealms';\n\nexport const ARealmPicker = defineComponent({\n props: defineEntityPickerVProps<Realm>(),\n emits: defineEntityPickerVEmitOptions<Realm>(),\n slots: Object as SlotsType<EntityPickerVSlots<Realm>>,\n setup(props, setup) {\n const { render } = defineEntityPicker({\n component: ARealms,\n props,\n setup,\n });\n\n return () => render();\n },\n});\n","<!--\n - Copyright (c) 2026.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n watch,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { type Client, EntityType } from '@authup/core-kit';\nimport { createNanoID, isBCryptHash } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { ARealmPicker } from '../realm';\nimport {\n AFormInputList, \n AFormSubmit, \n defineEntityManager, \n defineEntityVEmitOptions,\n} from '../../utility';\nimport {\n TranslatorTranslationClientKey,\n TranslatorTranslationDefaultKey, \n TranslatorTranslationGroup, \n VuelidateCustomRule, \n VuelidateCustomRuleKey,\n assignFormProperties,\n injectStore,\n storeToRefs, \n useTranslationsForGroup,\n} from '../../../core';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n ARealmPicker,\n AFormInputList,\n IVuelidate,\n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: {\n type: Object as PropType<Client>,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Client>(),\n setup(props, ctx) {\n const form = reactive({\n active: true,\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n redirect_uri: '',\n base_url: '',\n root_url: '',\n is_confidential: true,\n secret: '',\n secret_hashed: false,\n });\n\n const vuelidate = useVuelidate({\n active: { required },\n name: {\n required,\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n realm_id: { required },\n redirect_uri: {\n // todo: url is required!\n maxLength: maxLength(2000),\n },\n is_confidential: {},\n secret: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n secret_hashed: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed(() => !!props.name && props.name.length > 0);\n const realmId = computed(() => (manager.data.value ?\n manager.data.value.realm_id :\n storeRefs.realmId.value));\n\n const generateSecret = () => createNanoID('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_!.', 32);\n const isSecretHashed = computed(\n () => {\n if (!manager.data.value || manager.data.value.secret !== form.secret) {\n return false;\n }\n\n return isBCryptHash(form.secret);\n },\n );\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n assignFormProperties(form, manager.data.value);\n\n form.realm_id = realmId.value ?? '';\n\n if (form.secret.length === 0) {\n form.secret = generateSecret();\n }\n }\n\n const isConfidential = computed(() => form.is_confidential);\n watch(isConfidential, (val, oldValue) => {\n if (val === oldValue) return;\n\n if (val) {\n form.secret = manager.data.value?.secret || generateSecret();\n } else {\n form.secret = '';\n }\n });\n\n watch(\n updatedAt,\n (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n },\n );\n\n initForm();\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n\n assignFormProperties(form, manager.data.value);\n };\n\n const translationsClient = useTranslationsForGroup(\n TranslatorTranslationGroup.CLIENT,\n [\n { key: TranslatorTranslationClientKey.NAME_HINT },\n { key: TranslatorTranslationClientKey.DESCRIPTION_HINT },\n { key: TranslatorTranslationClientKey.REDIRECT_URI_HINT },\n { key: TranslatorTranslationClientKey.IS_CONFIDENTIAL },\n { key: TranslatorTranslationClientKey.IS_ACTIVE },\n { key: TranslatorTranslationClientKey.HASH_SECRET },\n ],\n );\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n { key: TranslatorTranslationDefaultKey.REDIRECT_URIS },\n { key: TranslatorTranslationDefaultKey.SECRET },\n ],\n );\n\n const redirectUris = computed(() => (vuelidate.value.redirect_uri.$model ?\n vuelidate.value.redirect_uri.$model.split(',') :\n []));\n\n return {\n translationsDefault,\n translationsClient,\n\n vuelidate,\n data: manager.data,\n isNameFixed,\n isBusy: manager.busy.value,\n isEditing,\n\n isSecretHashed,\n generateSecret,\n\n redirectUris,\n\n submit,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <template v-if=\"data\">\n <VCFormGroup>\n <template #label>\n ID\n </template>\n <VCFormInput\n :model-value=\"data.id\"\n :disabled=\"true\"\n />\n </VCFormGroup>\n </template>\n\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.name }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n <small>{{ translationsClient.nameHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.displayName }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.secret\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.secret }}\n\n <template v-if=\"isSecretHashed\">\n <span class=\"text-danger font-weight-bold\">\n <i class=\"fa fa-exclamation-triangle\" />\n </span>\n </template>\n </template>\n <VCFormInput\n v-model=\"vuelidate.secret.$model\"\n :disabled=\"!vuelidate.is_confidential.$model\"\n >\n <template #groupAppend>\n <button\n class=\"btn\"\n type=\"button\"\n @click.prevent=\"() => vuelidate.secret.$model = generateSecret()\"\n >\n <i class=\"fa fa-refresh\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.is_confidential\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.is_confidential.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isConfidential.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.secret_hashed\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.secret_hashed.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.hashSecret.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.active\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.active.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isActive.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n\n <template v-if=\"!realmId && !isEditing\">\n <hr>\n <IVuelidate :validation=\"vuelidate.realm_id\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.realm }}\n </template>\n <template #default>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(input: string[]) => {\n\n vuelidate.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n }\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </template>\n </div>\n <div class=\"col\">\n <AFormInputList\n :names=\"redirectUris\"\n @changed=\"(value) => {\n if (value.length === 0) {\n vuelidate.redirect_uri.$model = '';\n return;\n }\n vuelidate.redirect_uri.$model = value.join(',');\n }\"\n >\n <template #label>\n {{ translationsDefault.redirectUris }}\n </template>\n </AFormInputList>\n <small>{{ translationsClient.redirectURIHint }}</small>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.description }}\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"7\"\n />\n </VCFormGroup>\n\n <small>{{ translationsClient.descriptionHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <div>\n <AFormSubmit\n :is-busy=\"isBusy\"\n :is-editing=\"isEditing\"\n :is-invalid=\"vuelidate.$invalid\"\n @submit=\"submit\"\n />\n </div>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2026.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n watch,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { type Client, EntityType } from '@authup/core-kit';\nimport { createNanoID, isBCryptHash } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { ARealmPicker } from '../realm';\nimport {\n AFormInputList, \n AFormSubmit, \n defineEntityManager, \n defineEntityVEmitOptions,\n} from '../../utility';\nimport {\n TranslatorTranslationClientKey,\n TranslatorTranslationDefaultKey, \n TranslatorTranslationGroup, \n VuelidateCustomRule, \n VuelidateCustomRuleKey,\n assignFormProperties,\n injectStore,\n storeToRefs, \n useTranslationsForGroup,\n} from '../../../core';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n ARealmPicker,\n AFormInputList,\n IVuelidate,\n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: {\n type: Object as PropType<Client>,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Client>(),\n setup(props, ctx) {\n const form = reactive({\n active: true,\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n redirect_uri: '',\n base_url: '',\n root_url: '',\n is_confidential: true,\n secret: '',\n secret_hashed: false,\n });\n\n const vuelidate = useVuelidate({\n active: { required },\n name: {\n required,\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n realm_id: { required },\n redirect_uri: {\n // todo: url is required!\n maxLength: maxLength(2000),\n },\n is_confidential: {},\n secret: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n secret_hashed: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed(() => !!props.name && props.name.length > 0);\n const realmId = computed(() => (manager.data.value ?\n manager.data.value.realm_id :\n storeRefs.realmId.value));\n\n const generateSecret = () => createNanoID('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_!.', 32);\n const isSecretHashed = computed(\n () => {\n if (!manager.data.value || manager.data.value.secret !== form.secret) {\n return false;\n }\n\n return isBCryptHash(form.secret);\n },\n );\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n assignFormProperties(form, manager.data.value);\n\n form.realm_id = realmId.value ?? '';\n\n if (form.secret.length === 0) {\n form.secret = generateSecret();\n }\n }\n\n const isConfidential = computed(() => form.is_confidential);\n watch(isConfidential, (val, oldValue) => {\n if (val === oldValue) return;\n\n if (val) {\n form.secret = manager.data.value?.secret || generateSecret();\n } else {\n form.secret = '';\n }\n });\n\n watch(\n updatedAt,\n (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n },\n );\n\n initForm();\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n\n assignFormProperties(form, manager.data.value);\n };\n\n const translationsClient = useTranslationsForGroup(\n TranslatorTranslationGroup.CLIENT,\n [\n { key: TranslatorTranslationClientKey.NAME_HINT },\n { key: TranslatorTranslationClientKey.DESCRIPTION_HINT },\n { key: TranslatorTranslationClientKey.REDIRECT_URI_HINT },\n { key: TranslatorTranslationClientKey.IS_CONFIDENTIAL },\n { key: TranslatorTranslationClientKey.IS_ACTIVE },\n { key: TranslatorTranslationClientKey.HASH_SECRET },\n ],\n );\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n { key: TranslatorTranslationDefaultKey.REDIRECT_URIS },\n { key: TranslatorTranslationDefaultKey.SECRET },\n ],\n );\n\n const redirectUris = computed(() => (vuelidate.value.redirect_uri.$model ?\n vuelidate.value.redirect_uri.$model.split(',') :\n []));\n\n return {\n translationsDefault,\n translationsClient,\n\n vuelidate,\n data: manager.data,\n isNameFixed,\n isBusy: manager.busy.value,\n isEditing,\n\n isSecretHashed,\n generateSecret,\n\n redirectUris,\n\n submit,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <template v-if=\"data\">\n <VCFormGroup>\n <template #label>\n ID\n </template>\n <VCFormInput\n :model-value=\"data.id\"\n :disabled=\"true\"\n />\n </VCFormGroup>\n </template>\n\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.name }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n <small>{{ translationsClient.nameHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.displayName }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.secret\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.secret }}\n\n <template v-if=\"isSecretHashed\">\n <span class=\"text-danger font-weight-bold\">\n <i class=\"fa fa-exclamation-triangle\" />\n </span>\n </template>\n </template>\n <VCFormInput\n v-model=\"vuelidate.secret.$model\"\n :disabled=\"!vuelidate.is_confidential.$model\"\n >\n <template #groupAppend>\n <button\n class=\"btn\"\n type=\"button\"\n @click.prevent=\"() => vuelidate.secret.$model = generateSecret()\"\n >\n <i class=\"fa fa-refresh\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.is_confidential\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.is_confidential.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isConfidential.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.secret_hashed\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.secret_hashed.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.hashSecret.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.active\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.active.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isActive.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n\n <template v-if=\"!realmId && !isEditing\">\n <hr>\n <IVuelidate :validation=\"vuelidate.realm_id\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.realm }}\n </template>\n <template #default>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(input: string[]) => {\n\n vuelidate.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n }\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </template>\n </div>\n <div class=\"col\">\n <AFormInputList\n :names=\"redirectUris\"\n @changed=\"(value) => {\n if (value.length === 0) {\n vuelidate.redirect_uri.$model = '';\n return;\n }\n vuelidate.redirect_uri.$model = value.join(',');\n }\"\n >\n <template #label>\n {{ translationsDefault.redirectUris }}\n </template>\n </AFormInputList>\n <small>{{ translationsClient.redirectURIHint }}</small>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.description }}\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"7\"\n />\n </VCFormGroup>\n\n <small>{{ translationsClient.descriptionHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <div>\n <AFormSubmit\n :is-busy=\"isBusy\"\n :is-editing=\"isEditing\"\n :is-invalid=\"vuelidate.$invalid\"\n @submit=\"submit\"\n />\n </div>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Client } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\n\nexport const AClients = defineComponent({\n props: defineEntityCollectionVProps<Client>(),\n emits: defineEntityCollectionVEmitOptions<Client>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Client>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.CLIENT}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.CLIENTS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AClients;\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityPicker,\n defineEntityPickerVEmitOptions,\n defineEntityPickerVProps,\n} from '../../utility/entity/picker/module';\nimport type { EntityPickerVSlots } from '../../utility/entity/picker/types';\nimport { AClients } from './AClients';\n\nexport const AClientPicker = defineComponent({\n props: defineEntityPickerVProps<Client>(),\n emits: defineEntityPickerVEmitOptions<Client>(),\n slots: Object as SlotsType<EntityPickerVSlots<Client>>,\n setup(props, setup) {\n const { render } = defineEntityPicker({\n component: AClients,\n props,\n setup,\n });\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Permission } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const APermission = defineComponent({\n props: defineEntityVProps<Permission>(),\n emits: defineEntityVEmitOptions<Permission>(),\n slots: Object as SlotsType<EntityVSlots<Permission>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION}`,\n setup,\n props,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionEvaluationOptions } from '@authup/access';\nimport { PolicyData } from '@authup/access';\nimport { SlotName } from '@vuecs/list-controls';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport { createPermissionCheckerReactiveFn, hasNormalizedSlot, normalizeSlot } from '../../../core';\n\nexport const APermissionCheck = defineComponent({\n props: {\n name: {\n type: [String, Array] as PropType<string | string[]>,\n required: true,\n },\n input: { type: Object as PropType<Record<string, any>> },\n options: { type: Object as PropType<PermissionEvaluationOptions> },\n },\n setup(props, { slots }) {\n const fn = createPermissionCheckerReactiveFn();\n\n const isPermitted = computed(() => fn({\n name: props.name,\n input: new PolicyData(props.input),\n options: props.options,\n }));\n\n return () => {\n if (\n isPermitted.value &&\n hasNormalizedSlot(SlotName.DEFAULT, slots)\n ) {\n return normalizeSlot(SlotName.DEFAULT, {}, slots);\n }\n\n return [];\n };\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport { DecisionStrategy } from '@authup/kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n reactive,\n ref,\n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { \n buildFormGroup, \n buildFormInput, \n buildFormSelect, \n buildFormTextarea, \n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n injectStore,\n storeToRefs,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { ARealmPicker } from '../realm';\n\nfunction decisionStrategyHint(value: string) : string {\n switch (value) {\n case DecisionStrategy.AFFIRMATIVE:\n return 'At least one policy must evaluate positively.';\n case DecisionStrategy.CONSENSUS:\n return 'More policies must evaluate positively than negatively.';\n case DecisionStrategy.UNANIMOUS:\n return 'All policies must evaluate positively.';\n default:\n return 'No strategy selected. Defaults to unanimous (all policies must evaluate positively).';\n }\n}\n\nexport const APermissionForm = defineComponent({\n props: { entity: { type: Object as PropType<Permission> } },\n emits: defineEntityVEmitOptions<Permission>(),\n setup(props, ctx) {\n const busy = ref(false);\n\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n decision_strategy: '',\n realm_id: '',\n });\n\n const decisionStrategyOptions : FormSelectOption[] = Object.values(DecisionStrategy)\n .map((value) => ({\n id: value,\n value,\n }));\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n decision_strategy: {},\n realm_id: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION}`,\n setup: ctx,\n props,\n });\n\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return manager.data.value ?\n manager.data.value.realm_id :\n null;\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n function initForm() {\n assignFormProperties(form, manager.data.value);\n\n if (realmId.value) {\n form.realm_id = realmId.value;\n }\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n const data : Record<string, any> = {\n ...form,\n decision_strategy: form.decision_strategy || null,\n };\n\n await manager.createOrUpdate(data);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.DECISION_STRATEGY },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n const render = () => {\n const children : VNodeArrayChildren = [];\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: {\n disabled: manager.data.value &&\n manager.data.value.built_in,\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 4 },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.decision_strategy.value,\n validationSeverity: getVuelidateSeverity($v.value.decision_strategy),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DECISION_STRATEGY].value,\n content: [\n buildFormSelect({\n value: $v.value.decision_strategy.$model,\n onChange(input) {\n $v.value.decision_strategy.$model = input;\n },\n options: decisionStrategyOptions,\n optionDefault: true,\n optionDefaultValue: '-- None (default: unanimous) --',\n }),\n h('div', { class: 'alert alert-sm alert-info mt-1 mb-0' }, decisionStrategyHint($v.value.decision_strategy.$model)),\n ],\n }));\n\n if (!realmId.value && !isEditing.value) {\n children.push(buildFormGroup({\n validationMessages: translationsValidation.realm_id.value,\n validationSeverity: getVuelidateSeverity($v.value.realm_id),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.REALM].value,\n content: h(ARealmPicker, {\n value: $v.value.realm_id.$model,\n multiple: false,\n onChange(input: string[]) {\n $v.value.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n },\n }),\n }));\n }\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Permission } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const APermissions = defineComponent({\n props: defineEntityCollectionVProps<Permission>(),\n emits: defineEntityCollectionVEmitOptions<Permission>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Permission>>,\n setup(props, setup) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.PERMISSION}`,\n props,\n setup,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.PERMISSIONS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const APolicies = defineComponent({\n props: defineEntityCollectionVProps<Policy>(),\n emits: defineEntityCollectionVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Policy>>,\n setup(props, setup) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.POLICY}`,\n props,\n setup,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.POLICIES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BuiltInPolicyType } from '@authup/access';\n\nconst typeLabels: Record<string, string> = {\n [BuiltInPolicyType.COMPOSITE]: 'Composite',\n [BuiltInPolicyType.DATE]: 'Date',\n [BuiltInPolicyType.TIME]: 'Time',\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: 'Attr Names',\n [BuiltInPolicyType.ATTRIBUTES]: 'Attributes',\n [BuiltInPolicyType.REALM_MATCH]: 'Realm Match',\n [BuiltInPolicyType.IDENTITY]: 'Identity',\n [BuiltInPolicyType.PERMISSION_BINDING]: 'Perm Binding',\n};\n\nexport default defineComponent({\n props: {\n type: {\n type: String,\n required: true,\n },\n },\n setup() {\n return { typeLabels };\n },\n});\n</script>\n<template>\n <span class=\"badge bg-info\">{{ typeLabels[type] || type }}</span>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BuiltInPolicyType } from '@authup/access';\n\nconst typeLabels: Record<string, string> = {\n [BuiltInPolicyType.COMPOSITE]: 'Composite',\n [BuiltInPolicyType.DATE]: 'Date',\n [BuiltInPolicyType.TIME]: 'Time',\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: 'Attr Names',\n [BuiltInPolicyType.ATTRIBUTES]: 'Attributes',\n [BuiltInPolicyType.REALM_MATCH]: 'Realm Match',\n [BuiltInPolicyType.IDENTITY]: 'Identity',\n [BuiltInPolicyType.PERMISSION_BINDING]: 'Perm Binding',\n};\n\nexport default defineComponent({\n props: {\n type: {\n type: String,\n required: true,\n },\n },\n setup() {\n return { typeLabels };\n },\n});\n</script>\n<template>\n <span class=\"badge bg-info\">{{ typeLabels[type] || type }}</span>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: ['click'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('click', props.policyId);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n class=\"btn btn-xs btn-outline-info\"\n title=\"View policy details\"\n aria-label=\"View policy details\"\n @click=\"handleClick\"\n >\n <i class=\"fa fa-eye\" />\n </button>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: ['click'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('click', props.policyId);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n class=\"btn btn-xs btn-outline-info\"\n title=\"View policy details\"\n aria-label=\"View policy details\"\n @click=\"handleClick\"\n >\n <i class=\"fa fa-eye\" />\n </button>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\nimport APolicyDetailNav from './APolicyDetailNav.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge, APolicyDetailNav },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n emits: ['detail'],\n setup(props, { emit }) {\n const handleDetail = () => {\n emit('detail', props.entity);\n };\n\n return { handleDetail };\n },\n});\n</script>\n<template>\n <APolicyTypeBadge :type=\"entity.type\" />\n <span\n v-if=\"entity.invert\"\n class=\"badge bg-warning\"\n >Inverted</span>\n <APolicyDetailNav\n :policy-id=\"entity.id\"\n @click=\"handleDetail\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\nimport APolicyDetailNav from './APolicyDetailNav.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge, APolicyDetailNav },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n emits: ['detail'],\n setup(props, { emit }) {\n const handleDetail = () => {\n emit('detail', props.entity);\n };\n\n return { handleDetail };\n },\n});\n</script>\n<template>\n <APolicyTypeBadge :type=\"entity.type\" />\n <span\n v-if=\"entity.invert\"\n class=\"badge bg-warning\"\n >Inverted</span>\n <APolicyDetailNav\n :policy-id=\"entity.id\"\n @click=\"handleDetail\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Name</strong>\n <div>{{ entity.name }}</div>\n </div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Type</strong>\n <div>\n <APolicyTypeBadge :type=\"entity.type\" />\n </div>\n </div>\n <div\n v-if=\"entity.display_name\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Display Name</strong>\n <div>{{ entity.display_name }}</div>\n </div>\n <div\n v-if=\"entity.description\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Description</strong>\n <div>{{ entity.description }}</div>\n </div>\n <div\n v-if=\"entity.invert\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Invert</strong>\n <div>\n <span class=\"badge bg-warning\">Yes</span>\n </div>\n </div>\n <div\n v-if=\"entity.built_in\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Built-in</strong>\n <div>\n <span class=\"badge bg-secondary\">Yes</span>\n </div>\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Name</strong>\n <div>{{ entity.name }}</div>\n </div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Type</strong>\n <div>\n <APolicyTypeBadge :type=\"entity.type\" />\n </div>\n </div>\n <div\n v-if=\"entity.display_name\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Display Name</strong>\n <div>{{ entity.display_name }}</div>\n </div>\n <div\n v-if=\"entity.description\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Description</strong>\n <div>{{ entity.description }}</div>\n </div>\n <div\n v-if=\"entity.invert\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Invert</strong>\n <div>\n <span class=\"badge bg-warning\">Yes</span>\n </div>\n </div>\n <div\n v-if=\"entity.built_in\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Built-in</strong>\n <div>\n <span class=\"badge bg-secondary\">Yes</span>\n </div>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { EntityTypeMap, PermissionRelation, Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport {\n Teleport,\n defineComponent,\n h,\n onMounted,\n onUnmounted,\n ref,\n toRef,\n watch,\n} from 'vue';\nimport { SlotName } from '@vuecs/list-controls';\nimport { hasOwnProperty } from '@authup/kit';\nimport { injectHTTPClient } from '../../../core';\nimport { APolicies } from '../policy/APolicies';\nimport APolicyInlineInfo from '../policy/APolicyInlineInfo.vue';\nimport APolicySummary from '../policy/APolicySummary.vue';\n\ntype PermissionBindingEntity = PermissionRelation & { id: string };\n\nexport const APermissionPolicyBindingButton = defineComponent({\n props: {\n entityType: {\n type: String as PropType<keyof EntityTypeMap>,\n required: true,\n },\n entity: {\n type: Object as PropType<PermissionBindingEntity>,\n required: true,\n },\n },\n emits: ['updated', 'failed'],\n setup(props, { emit }) {\n const client = injectHTTPClient();\n\n const modalOpen = ref(false);\n const busy = ref(false);\n const currentPolicyId = ref<string | null>(props.entity.policy_id);\n const detailPolicy = ref<Policy | null>(null);\n\n const entityRef = toRef(props, 'entity');\n watch(entityRef, (val) => {\n currentPolicyId.value = val.policy_id;\n }, { deep: true });\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (detailPolicy.value) {\n detailPolicy.value = null;\n } else if (modalOpen.value) {\n modalOpen.value = false;\n }\n }\n };\n\n onMounted(() => {\n document.addEventListener('keydown', handleKeydown);\n });\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown);\n });\n\n const handlePolicySelect = async (policyId: string | null) => {\n if (busy.value) return;\n\n const api = hasOwnProperty(client, props.entityType) ?\n client[props.entityType] as any :\n undefined;\n\n if (!api || !api.update) return;\n\n busy.value = true;\n try {\n const response = await api.update(props.entity.id, { policy_id: policyId });\n currentPolicyId.value = policyId;\n emit('updated', response);\n } catch (e) {\n if (e instanceof Error) {\n emit('failed', e);\n }\n } finally {\n busy.value = false;\n }\n };\n\n const modalTitleId = `policy-modal-title-${props.entity.id}`;\n\n return () => {\n const children = [];\n\n children.push(h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': busy.value,\n 'btn-primary': !busy.value && currentPolicyId.value,\n 'btn-secondary': !busy.value && !currentPolicyId.value,\n }],\n disabled: busy.value,\n onClick(e: Event) {\n e.preventDefault();\n modalOpen.value = true;\n },\n }, [\n h('i', { class: 'fa fa-cog' }),\n ]));\n\n if (modalOpen.value) {\n const backdrop = h('div', {\n class: 'modal-backdrop fade show',\n onClick() {\n if (detailPolicy.value) {\n detailPolicy.value = null;\n } else {\n modalOpen.value = false;\n }\n },\n });\n\n let modalTitle: string;\n let modalBody;\n let modalFooter;\n\n if (detailPolicy.value) {\n const policy = detailPolicy.value;\n modalTitle = policy.name;\n modalBody = h(APolicySummary, { entity: policy });\n modalFooter = [\n h('button', {\n type: 'button',\n class: 'btn btn-outline-secondary btn-xs',\n onClick() {\n detailPolicy.value = null;\n },\n }, [\n h('i', { class: 'fa fa-arrow-left me-1' }),\n 'Back',\n ]),\n ];\n } else {\n modalTitle = 'Junction Policy';\n modalBody = h(APolicies, { query: { filters: { parent_id: null } } }, {\n [SlotName.ITEM]: (slotProps: { data: Policy }) => {\n const isSelected = currentPolicyId.value === slotProps.data.id;\n\n return [\n h('div', [slotProps.data.name]),\n h(APolicyInlineInfo, {\n entity: slotProps.data,\n onDetail: (policy: Policy) => {\n detailPolicy.value = policy;\n },\n }),\n h('div', { class: 'ms-auto' }, [\n h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': busy.value,\n 'btn-success': !busy.value && isSelected,\n 'btn-secondary': !busy.value && !isSelected,\n }],\n disabled: busy.value,\n onClick(e: Event) {\n e.preventDefault();\n if (isSelected) {\n handlePolicySelect(null);\n } else {\n handlePolicySelect(slotProps.data.id);\n }\n },\n }, [\n h('i', {\n class: ['fa', {\n 'fa-check': isSelected,\n 'fa-plus': !isSelected,\n }],\n }),\n ]),\n ]),\n ];\n },\n });\n modalFooter = [\n currentPolicyId.value ?\n h('button', {\n type: 'button',\n class: 'btn btn-warning btn-xs',\n disabled: busy.value,\n onClick() {\n handlePolicySelect(null);\n },\n }, 'Reset') :\n undefined,\n h('button', {\n type: 'button',\n class: 'btn btn-secondary btn-xs',\n onClick() {\n modalOpen.value = false;\n },\n }, 'Close'),\n ];\n }\n\n const modal = h('div', {\n class: 'modal fade show d-block',\n tabindex: '-1',\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': modalTitleId,\n }, [\n h('div', {\n class: 'modal-dialog',\n role: 'document',\n onClick(e: Event) {\n e.stopPropagation();\n },\n }, [\n h('div', { class: 'modal-content' }, [\n h('div', { class: 'modal-header' }, [\n h('h5', { class: 'modal-title', id: modalTitleId }, modalTitle),\n h('button', {\n type: 'button',\n class: 'btn-close',\n 'aria-label': 'Close',\n onClick() {\n if (detailPolicy.value) {\n detailPolicy.value = null;\n } else {\n modalOpen.value = false;\n }\n },\n }),\n ]),\n h('div', { class: 'modal-body' }, [modalBody]),\n h('div', { class: 'modal-footer' }, modalFooter),\n ]),\n ]),\n ]);\n\n children.push(h(Teleport, { to: 'body' }, [backdrop, modal]));\n }\n\n return h('span', children);\n };\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n clientId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.client_id === props.clientId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: ClientPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.CLIENT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n clientId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.client_id === props.clientId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: ClientPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.CLIENT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AClientPermissionAssignment from './AClientPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AClientPermissionAssignment from './AClientPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive, \n ref, \n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Role } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n buildFormTextarea,\n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n injectStore,\n storeToRefs,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { ARealmPicker } from '../realm';\n\nexport const ARoleForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<Role>,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Role>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(30),\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.ROLE}`,\n setup: ctx,\n props,\n });\n\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return manager.data.value ?\n manager.data.value.realm_id :\n null;\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n function initForm() {\n assignFormProperties(form, manager.data.value);\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n const render = () => {\n const children : VNodeArrayChildren = [];\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 6 },\n }),\n }));\n\n if (!realmId.value && !isEditing.value) {\n children.push(\n buildFormGroup({\n validationMessages: translationsValidation.realm_id.value,\n validationSeverity: getVuelidateSeverity($v.value.realm_id),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.REALM].value,\n content: h(ARealmPicker, {\n value: $v.value.realm_id.$model,\n onChange: (input: string[]) => {\n $v.value.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n },\n }),\n }),\n );\n }\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n\n return () => render();\n },\n});\n\nexport default ARoleForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Role } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\n\nexport const ARoles = defineComponent({\n props: defineEntityCollectionVProps<Role>(),\n emits: defineEntityCollectionVEmitOptions<Role>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Role>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.ROLE}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationDefaultKey.ROLES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default ARoles;\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Role } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const ARole = defineComponent({\n props: defineEntityVProps<Role>(),\n emits: defineEntityVEmitOptions<Role>(),\n slots: Object as SlotsType<EntityVSlots<Role>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROLE}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n clientId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n clientId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AClientRoleAssignment from './AClientRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AClientRoleAssignment },\n props: {\n entityId: { type: String, required: true },\n realmId: String,\n },\n setup(props, { slots }) {\n const query = computed(() => ({ filters: { realm_id: [...(props.realmId ? [props.realmId] : []), null] } }));\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n\n return { query, forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :query=\"query\">\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AClientRoleAssignment from './AClientRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AClientRoleAssignment },\n props: {\n entityId: { type: String, required: true },\n realmId: String,\n },\n setup(props, { slots }) {\n const query = computed(() => ({ filters: { realm_id: [...(props.realmId ? [props.realmId] : []), null] } }));\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n\n return { query, forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :query=\"query\">\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AClientScope = defineComponent({\n props: defineEntityVProps<ClientScope>(),\n emits: defineEntityVEmitOptions<ClientScope>(),\n slots: Object as SlotsType<EntityVSlots<ClientScope>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const AClientScopes = defineComponent({\n props: defineEntityCollectionVProps<ClientScope>(),\n emits: defineEntityCollectionVEmitOptions<ClientScope>(),\n slots: Object as SlotsType<EntityCollectionVSlots<ClientScope>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n props,\n setup: ctx,\n });\n\n const translationClientScopes = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.CLIENT_SCOPES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationClientScopes },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AClientScopes;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type {\n PropType,\n VNodeArrayChildren,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n reactive,\n ref,\n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Scope } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n buildFormTextarea,\n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n injectStore,\n storeToRefs,\n useTranslationsForGroup, \n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { ARealmPicker } from '../realm';\n\nexport const AScopeForm = defineComponent({\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: { type: Object as PropType<Scope> },\n },\n emits: defineEntityVEmitOptions<Scope>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const $v = useVuelidate({\n name: {\n required,\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(3),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.SCOPE}`,\n setup: ctx,\n props,\n });\n\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return manager.data.value ?\n manager.data.value.realm_id :\n null;\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed<boolean>(() => {\n if (!!props.name && props.name.length > 0) {\n return true;\n }\n\n return !!(manager.data.value && manager.data.value.built_in);\n });\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n assignFormProperties(form, manager.data.value);\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n return () => {\n const children : VNodeArrayChildren = [\n buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: { disabled: isNameFixed.value },\n }),\n }),\n buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 7 },\n }),\n }),\n ];\n\n if (\n !realmId.value &&\n !isNameFixed.value &&\n !isEditing.value\n ) {\n children.push(buildFormGroup({\n validationMessages: translationsValidation.realm_id.value,\n validationSeverity: getVuelidateSeverity($v.value.realm_id),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.REALM].value,\n content: h(ARealmPicker, {\n value: $v.value.realm_id.$model,\n onChange: (input: string[]) => {\n $v.value.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n },\n }),\n }));\n }\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n },\n});\n\nexport default AScopeForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Scope } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\n\nexport const AScopes = defineComponent({\n props: defineEntityCollectionVProps<Scope>(),\n emits: defineEntityCollectionVEmitOptions<Scope>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Scope>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: EntityType.SCOPE,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.SCOPES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AScopes;\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Scope } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AScope = defineComponent({\n props: defineEntityVProps<Scope>(),\n emits: defineEntityVEmitOptions<Scope>(),\n slots: Object as SlotsType<EntityVSlots<Scope>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.SCOPE}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n clientId: { type: String, required: true },\n scopeId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientScope>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.scope_id === props.scopeId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n scope_id: props.scopeId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n clientId: { type: String, required: true },\n scopeId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientScope>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.scope_id === props.scopeId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n scope_id: props.scopeId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AScopes } from '../scope';\nimport AClientScopeAssignment from './AClientScopeAssignment.vue';\n\nexport default defineComponent({\n components: { AScopes, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AScopes>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :scope-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AScopes>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AScopes } from '../scope';\nimport AClientScopeAssignment from './AClientScopeAssignment.vue';\n\nexport default defineComponent({\n components: { AScopes, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AScopes>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :scope-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AScopes>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AIdentityProvider = defineComponent({\n props: defineEntityVProps<IdentityProvider>(),\n emits: defineEntityVEmitOptions<IdentityProvider>(),\n slots: Object as SlotsType<EntityVSlots<IdentityProvider>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider } from '@authup/core-kit';\nimport { createNanoID } from '@authup/kit';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive,\n} from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey, \n assignFormProperties, \n getVuelidateSeverity, \n useTranslationsForGroup, \n useTranslationsForNestedValidation,\n} from '../../../core';\n\nexport const AIdentityProviderBasicFields = defineComponent({\n props: { entity: { type: Object as PropType<Partial<IdentityProvider>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n name: '',\n display_name: '',\n enabled: true,\n });\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: VuelidateCustomRule[\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n enabled: { required },\n }, form, { $registerAs: 'basic' });\n\n const isNameEmpty = computed(() => !form.name || form.name.length === 0);\n\n function generateId() {\n form.name = createNanoID();\n }\n\n const update = () => {\n setup.emit('updated', {\n data: form,\n valid: !$v.value.$invalid,\n });\n };\n\n function assign(data: Partial<IdentityProvider> = {}) {\n assignFormProperties(form, data);\n\n if (isNameEmpty.value) {\n generateId();\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n ],\n );\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n\n return () => {\n const name = buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n }),\n });\n\n const nameGenerator = h('div', { class: 'mb-3' }, [\n h('button', {\n class: 'btn btn-xs btn-dark',\n onClick($event: any) {\n $event.preventDefault();\n\n generateId.call(null);\n update();\n },\n }, [\n h('i', { class: 'fa fa-refresh' }),\n ' ',\n 'Generate',\n ]),\n ]);\n\n const displayName = buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n });\n\n const enabled = buildFormInputCheckbox({\n groupClass: 'form-switch mt-3',\n labelContent: 'Enabled?',\n value: $v.value.enabled.$model,\n onChange(input) {\n $v.value.enabled.$model = input;\n update();\n },\n });\n\n return [\n name,\n nameGenerator,\n displayName,\n enabled,\n ];\n };\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { numeric, required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapConnectionFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n url: '',\n timeout: 0,\n start_tls: true,\n base_dn: '',\n });\n\n const $v = useVuelidate({\n url: { required },\n timeout: { numeric },\n start_tls: { required },\n base_dn: { required },\n }, form, { $registerAs: 'connection' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.url.value,\n validationSeverity: getVuelidateSeverity($v.value.url),\n label: true,\n labelContent: 'URL',\n content: buildFormInput({\n value: $v.value.url.$model,\n onChange(input) {\n $v.value.url.$model = input;\n },\n props: { placeholder: '<scheme>://<address>:<port>' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.timeout.value,\n validationSeverity: getVuelidateSeverity($v.value.timeout),\n label: true,\n labelContent: 'Timeout',\n content: buildFormInput({\n value: $v.value.timeout.$model,\n onChange(input) {\n const intValue = Number.parseInt(input, 10);\n if (!Number.isNaN(intValue)) {\n $v.value.timeout.$model = intValue;\n }\n },\n props: { type: 'number' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.start_tls.value,\n validationSeverity: getVuelidateSeverity($v.value.start_tls),\n label: true,\n labelContent: 'StartTLS',\n content: buildFormInputCheckbox({\n groupClass: 'form-switch',\n labelContent: 'Enable StartTLS process?',\n value: $v.value.start_tls.$model,\n onChange(input) {\n $v.value.start_tls.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.base_dn.value,\n validationSeverity: getVuelidateSeverity($v.value.base_dn),\n label: true,\n labelContent: 'Base DN',\n content: buildFormInput({\n value: $v.value.base_dn.$model,\n onChange(input) {\n $v.value.base_dn.$model = input;\n },\n props: { placeholder: 'e.g. dc=example,dc=com' },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapCredentialsFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n user: '',\n password: '',\n });\n\n const $v = useVuelidate({\n user: { required },\n password: { required },\n }, form, { $registerAs: 'credentials' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.user.value,\n validationSeverity: getVuelidateSeverity($v.value.user),\n label: true,\n labelContent: 'User',\n content: buildFormInput({\n value: $v.value.user.$model,\n onChange(input) {\n $v.value.user.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.password.value,\n validationSeverity: getVuelidateSeverity($v.value.password),\n label: true,\n labelContent: 'Password',\n content: buildFormInput({\n value: $v.value.password.$model,\n onChange(input) {\n $v.value.password.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapGroupFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n group_filter: '',\n group_base_dn: '',\n group_name_attribute: '',\n group_class: '',\n group_member_attribute: '',\n group_member_user_attribute: '',\n });\n\n const $v = useVuelidate({\n group_filter: {},\n group_base_dn: {},\n group_name_attribute: {},\n group_class: {},\n group_member_attribute: {},\n group_member_user_attribute: {},\n }, form, { $registerAs: 'group' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.group_filter.value,\n validationSeverity: getVuelidateSeverity($v.value.group_filter),\n label: true,\n labelContent: 'Filter',\n content: buildFormInput({\n value: $v.value.group_filter.$model,\n onChange(input) {\n $v.value.group_filter.$model = input;\n },\n props: { placeholder: '(member={{dn}})' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_base_dn.value,\n validationSeverity: getVuelidateSeverity($v.value.group_base_dn),\n label: true,\n labelContent: 'Base DN',\n content: buildFormInput({\n value: $v.value.group_base_dn.$model,\n onChange(input) {\n $v.value.group_base_dn.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_class.value,\n validationSeverity: getVuelidateSeverity($v.value.group_class),\n label: true,\n labelContent: 'Class',\n content: buildFormInput({\n value: $v.value.group_class.$model,\n onChange(input) {\n $v.value.group_class.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_name_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.group_name_attribute),\n label: true,\n labelContent: 'Name Attribute',\n content: buildFormInput({\n value: $v.value.group_name_attribute.$model,\n onChange(input) {\n $v.value.group_name_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_member_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.group_member_attribute),\n label: true,\n labelContent: 'Member Attribute',\n content: buildFormInput({\n value: $v.value.group_member_attribute.$model,\n onChange(input) {\n $v.value.group_member_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_member_user_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.group_member_user_attribute),\n label: true,\n labelContent: 'Member User Attribute',\n content: buildFormInput({\n value: $v.value.group_member_user_attribute.$model,\n onChange(input) {\n $v.value.group_member_user_attribute.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapUserFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n user_filter: '',\n user_base_dn: '',\n user_name_attribute: '',\n user_mail_attribute: '',\n user_display_name_attribute: '',\n } satisfies Omit<LdapIdentityProvider, keyof IdentityProvider | 'base_dn' | 'url'>);\n\n const $v = useVuelidate({\n user_filter: {},\n user_base_dn: {},\n user_name_attribute: {},\n user_mail_attribute: {},\n user_display_name_attribute: {},\n }, form, { $registerAs: 'user' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.user_filter.value,\n validationSeverity: getVuelidateSeverity($v.value.user_filter),\n label: true,\n labelContent: 'Filter',\n content: buildFormInput({\n value: $v.value.user_filter.$model,\n onChange(input) {\n $v.value.user_filter.$model = input;\n },\n props: { placeholder: '(|({name_attribute}={{input}})({mail_attribute}={{input}}))' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_base_dn.value,\n validationSeverity: getVuelidateSeverity($v.value.user_base_dn),\n label: true,\n labelContent: 'Base DN',\n content: buildFormInput({\n value: $v.value.user_base_dn.$model,\n onChange(input) {\n $v.value.user_base_dn.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_name_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.user_name_attribute),\n label: true,\n labelContent: 'Name Attribute',\n content: buildFormInput({\n value: $v.value.user_name_attribute.$model,\n onChange(input) {\n $v.value.user_name_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_mail_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.user_mail_attribute),\n label: true,\n labelContent: 'Mail Attribute',\n content: buildFormInput({\n value: $v.value.user_mail_attribute.$model,\n onChange(input) {\n $v.value.user_mail_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_display_name_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.user_display_name_attribute),\n label: true,\n labelContent: 'DisplayName Attribute',\n content: buildFormInput({\n value: $v.value.user_display_name_attribute.$model,\n onChange(input) {\n $v.value.user_display_name_attribute.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { IdentityProviderProtocol } from '@authup/core-kit';\nimport type { IdentityProviderProtocolElement } from './type';\n\nconst elements = {\n [IdentityProviderProtocol.OAUTH2]: {\n name: 'OAuth2',\n icon: 'fa fa-lock',\n },\n [IdentityProviderProtocol.OIDC]: {\n name: 'OpenID Connect',\n icon: 'fas fa-id-card',\n },\n [IdentityProviderProtocol.LDAP]: {\n name: 'LDAP',\n icon: 'fas fa-sitemap',\n },\n};\n\nexport function getIdentityProviderProtocolElement(\n id: `${IdentityProviderProtocol}`,\n) : IdentityProviderProtocolElement | undefined {\n return elements[id];\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderProtocol } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\nimport { getIdentityProviderProtocolElement } from './protocol';\n\nexport const AIdentityProviderProtocol = defineComponent({\n props: {\n id: {\n type: String,\n required: true,\n },\n },\n setup(props, setup) {\n const preset = getIdentityProviderProtocolElement(props.id as IdentityProviderProtocol);\n if (preset) {\n if (hasNormalizedSlot('default', setup.slots)) {\n return () => normalizeSlot('default', preset, setup.slots);\n }\n } else if (hasNormalizedSlot('error', setup.slots)) {\n return () => normalizeSlot('error', {}, setup.slots);\n }\n\n return () => [];\n },\n});\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { EntityType, IdentityProviderProtocol } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport {\n type PropType, \n type VNodeChild, \n defineComponent, \n h, \n ref,\n} from 'vue';\nimport { useIsEditing } from '../../../composables';\nimport {\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n extractVuelidateResultsFromChild,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { AIdentityProviderBasicFields } from './AIdentityProviderBasicFields';\nimport { AIdentityProviderLdapConnectionFields } from './AIdentityProviderLdapConnectionFields';\nimport { AIdentityProviderLdapCredentialsFields } from './AIdentityProviderLdapCredentialsFields';\nimport { AIdentityProviderLdapGroupFields } from './AIdentityProviderLdapGroupFields';\nimport { AIdentityProviderLdapUserFields } from './AIdentityProviderLdapUserFields';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\nimport type { IdentityProviderProtocolElement } from './protocol';\n\nexport const AIdentityProviderLdapForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: false,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<IdentityProvider>(),\n setup(props, ctx) {\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n\n const busy = ref(false);\n const $v = useVuelidate({ $stopPropagation: true });\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n const data : Partial<IdentityProvider> = {\n ...extractVuelidateResultsFromChild($v, 'basic'),\n ...extractVuelidateResultsFromChild($v, 'connection'),\n ...extractVuelidateResultsFromChild($v, 'credentials'),\n ...extractVuelidateResultsFromChild($v, 'group'),\n ...extractVuelidateResultsFromChild($v, 'user'),\n protocol: IdentityProviderProtocol.LDAP,\n };\n\n await manager.createOrUpdate(data);\n };\n\n const submitTranslations = createFormSubmitTranslations();\n\n return () => {\n const submitNode = buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, submitTranslations);\n\n let headerNode : VNodeChild | undefined;\n if (!manager.data.value) {\n headerNode = h(AIdentityProviderProtocol, {\n key: IdentityProviderProtocol.LDAP,\n id: IdentityProviderProtocol.LDAP,\n }, {\n default: (element: IdentityProviderProtocolElement) => h('div', [\n h('h4', { class: 'mb-3' }, [\n h('i', { class: [element.icon, 'pe-1'] }),\n element.name,\n ]),\n ]),\n });\n }\n\n const basicNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n 'Basic',\n ]),\n h(AIdentityProviderBasicFields, { entity: manager.data.value }),\n ];\n\n const connectionNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa-solid fa-vihara' }),\n ' ',\n 'Connection',\n ]),\n h(AIdentityProviderLdapConnectionFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n const credentialsNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-lock' }),\n ' ',\n 'Security',\n ]),\n h(AIdentityProviderLdapCredentialsFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n const groupNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa-solid fa-theater-masks' }),\n ' ',\n 'Group',\n ]),\n h(AIdentityProviderLdapGroupFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n const userNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fas fa-user' }),\n ' ',\n 'User',\n ]),\n h(AIdentityProviderLdapUserFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.call(null);\n },\n }, [\n headerNode,\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n basicNode,\n ]),\n h('div', { class: 'col' }, [\n credentialsNode,\n ]),\n ]),\n h('hr'),\n connectionNode,\n h('hr'),\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n userNode,\n ]),\n h('div', { class: 'col' }, [\n groupNode,\n ]),\n ]),\n submitNode,\n ]);\n };\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { IdentityProviderPreset } from '@authup/core-kit';\nimport type { IdentityProviderPresetElement } from './type';\n\nconst elements = {\n [IdentityProviderPreset.FACEBOOK]: {\n name: 'Facebook',\n icon: 'fab fa-facebook',\n },\n [IdentityProviderPreset.GITHUB]: {\n name: 'GitHub',\n icon: 'fab fa-github',\n },\n [IdentityProviderPreset.GITLAB]: {\n name: 'GitLab',\n icon: 'fab fa-gitlab',\n },\n [IdentityProviderPreset.GOOGLE]: {\n name: 'Google',\n icon: 'fab fa-google',\n },\n [IdentityProviderPreset.PAYPAL]: {\n name: 'Paypal',\n icon: 'fab fa-paypal',\n },\n [IdentityProviderPreset.INSTAGRAM]: {\n name: 'Instagram',\n icon: 'fab fa-instagram',\n },\n [IdentityProviderPreset.STACKOVERFLOW]: {\n name: 'StackOverflow',\n icon: 'fa fa-code',\n },\n [IdentityProviderPreset.TWITTER]: {\n name: 'Twitter',\n icon: 'fab fa-twitter',\n },\n};\n\nexport function getIdentityProviderPresetElement(\n id: `${IdentityProviderPreset}`,\n) : IdentityProviderPresetElement | undefined {\n return elements[id];\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderPreset } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { getIdentityProviderPresetElement } from './preset';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\n\nexport const AIdentityProviderPreset = defineComponent({\n props: {\n id: {\n type: String,\n required: true,\n },\n },\n setup(props, setup) {\n const preset = getIdentityProviderPresetElement(props.id as IdentityProviderPreset);\n if (preset) {\n if (hasNormalizedSlot('default', setup.slots)) {\n return () => normalizeSlot('default', preset, setup.slots);\n }\n } else if (hasNormalizedSlot('error', setup.slots)) {\n return () => normalizeSlot('error', {}, setup.slots);\n }\n\n return () => [];\n },\n});\n","<script lang=\"ts\">\nimport { IdentityProviderPreset, IdentityProviderProtocol } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: {\n AIdentityProviderPreset,\n AIdentityProviderProtocol,\n },\n props: {\n protocol: { type: String },\n preset: { type: String },\n },\n emits: ['pick'],\n setup(props, setup) {\n const protocols = Object.values(IdentityProviderProtocol);\n const presets = Object.values(IdentityProviderPreset);\n\n const pickProtocol = (protocol: string) => {\n setup.emit('pick', 'protocol', protocol);\n };\n\n const pickPreset = (preset: string) => {\n setup.emit('pick', 'preset', preset);\n };\n\n return {\n protocols,\n presets,\n pickProtocol,\n pickPreset,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Protocols</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in protocols\"\n :key=\"key\"\n >\n <AIdentityProviderProtocol :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === protocol && !preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickProtocol(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderProtocol>\n </template>\n </div>\n </div>\n <div>\n <h6>Presets</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in presets\"\n :key=\"key\"\n >\n <AIdentityProviderPreset :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickPreset(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderPreset>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.identity-provider-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.identity-provider-picker-item.active,\n.identity-provider-picker-item:hover,\n.identity-provider-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","<script lang=\"ts\">\nimport { IdentityProviderPreset, IdentityProviderProtocol } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: {\n AIdentityProviderPreset,\n AIdentityProviderProtocol,\n },\n props: {\n protocol: { type: String },\n preset: { type: String },\n },\n emits: ['pick'],\n setup(props, setup) {\n const protocols = Object.values(IdentityProviderProtocol);\n const presets = Object.values(IdentityProviderPreset);\n\n const pickProtocol = (protocol: string) => {\n setup.emit('pick', 'protocol', protocol);\n };\n\n const pickPreset = (preset: string) => {\n setup.emit('pick', 'preset', preset);\n };\n\n return {\n protocols,\n presets,\n pickProtocol,\n pickPreset,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Protocols</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in protocols\"\n :key=\"key\"\n >\n <AIdentityProviderProtocol :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === protocol && !preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickProtocol(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderProtocol>\n </template>\n </div>\n </div>\n <div>\n <h6>Presets</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in presets\"\n :key=\"key\"\n >\n <AIdentityProviderPreset :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickPreset(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderPreset>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.identity-provider-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.identity-provider-picker-item.active,\n.identity-provider-picker-item:hover,\n.identity-provider-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, OAuth2IdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderOAuth2ClientFields = defineComponent({\n props: { entity: { type: Object as PropType<Partial<OAuth2IdentityProvider>> } },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n client_id: '',\n client_secret: '',\n });\n\n const $v = useVuelidate({\n client_id: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n client_secret: {\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n }, form, { $registerAs: 'client' });\n\n function assign() {\n assignFormProperties(form, props.entity);\n }\n\n const updatedAt = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updatedAt, () => assign());\n\n assign();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.client_id.value,\n validationSeverity: getVuelidateSeverity($v.value.client_id),\n label: true,\n labelContent: 'Client ID',\n content: buildFormInput({\n value: $v.value.client_id.$model,\n onChange(input) {\n $v.value.client_id.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.client_secret.value,\n validationSeverity: getVuelidateSeverity($v.value.client_secret),\n label: true,\n labelContent: 'Client Secret',\n content: buildFormInput({\n value: $v.value.client_secret.$model,\n onChange(input) {\n $v.value.client_secret.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client } from '@authup/core-http-kit';\nimport { isOpenIDProviderMetadata } from '@authup/specs';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { url } from '@vuelidate/validators';\nimport type { VNodeChild } from 'vue';\nimport {\n defineComponent, \n h, \n reactive, \n ref,\n} from 'vue';\nimport { getVuelidateSeverity, useTranslationsForBaseValidation } from '../../../core';\n\nexport const AIdentityProviderOAuth2Discovery = defineComponent({\n emits: ['lookup', 'failed'],\n setup(_, setup) {\n const busy = ref(false);\n const form = reactive({ url: '' });\n\n const $v = useVuelidate({ url: { url } }, form);\n\n const lookupValid = ref(false);\n\n const message = ref<string | null>(null);\n\n const apiClient = new Client();\n\n const lookup = async () => {\n if (busy.value || $v.value.url.$invalid) {\n return;\n }\n\n try {\n const response = await apiClient.get(form.url);\n if (isOpenIDProviderMetadata(response.data)) {\n setup.emit('lookup', response.data);\n lookupValid.value = true;\n }\n } catch (e) {\n lookupValid.value = false;\n\n if (e instanceof Error) {\n message.value = `Lookup failed with: ${e.message}`;\n setup.emit('failed', e);\n }\n } finally {\n busy.value = false;\n }\n };\n\n const validationMessages = useTranslationsForBaseValidation($v.value.url);\n\n return () => {\n let messageNode : VNodeChild;\n if (message.value) {\n messageNode = h('div', { class: 'alert alert-sm alert-warning' }, message.value);\n }\n\n return [\n buildFormGroup({\n validationMessages: validationMessages.value,\n validationSeverity: getVuelidateSeverity($v.value.url),\n labelContent: 'Discovery',\n content: buildFormInput({\n class: { 'is-valid': lookupValid.value },\n props: { placeholder: 'https://example.com/.well-known/openid-configuration' },\n value: $v.value.url.$model,\n onChange(input) {\n $v.value.url.$model = input;\n },\n }),\n }),\n messageNode,\n h('button', {\n type: 'button',\n class: 'btn btn-xs btn-primary mb-1',\n disabled: !form.url || $v.value.$invalid,\n onClick($event: any) {\n $event.preventDefault();\n\n return lookup();\n },\n }, [\n h('i', { class: 'fa fa-search pe-1' }),\n 'Lookup',\n ]),\n ];\n };\n },\n});\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider, OAuth2IdentityProvider } from '@authup/core-kit';\nimport type { OpenIDProviderMetadata } from '@authup/specs';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { required, url } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\nimport { AIdentityProviderOAuth2Discovery } from './AIdentityProviderOAuth2Discovery';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n AIdentityProviderOAuth2Discovery, \n },\n props: {\n entity: { type: Object as PropType<Partial<OAuth2IdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n token_url: '',\n authorize_url: '',\n user_info_url: '',\n });\n\n const $v = useVuelidate({\n token_url: {\n required,\n url,\n },\n authorize_url: {\n required,\n url,\n },\n user_info_url: { url },\n }, form, { $registerAs: 'endpoint' });\n\n function init() {\n form.token_url = '';\n form.authorize_url = '';\n form.user_info_url = '';\n\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n const handleDiscoveryLookup = (data: OpenIDProviderMetadata) => {\n form.authorize_url = data.authorization_endpoint;\n form.token_url = data.token_endpoint;\n };\n\n return {\n $v,\n validationMessages,\n handleDiscoveryLookup,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <AIdentityProviderOAuth2Discovery\n v-if=\"discovery\"\n @lookup=\"handleDiscoveryLookup\"\n />\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.token_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.token_url)\"\n >\n <template #label>\n Token\n </template>\n <VCFormInput\n v-model=\"$v.token_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.authorize_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.authorize_url)\"\n >\n <template #label>\n Authorize\n </template>\n <VCFormInput\n v-model=\"$v.authorize_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.user_info_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.user_info_url)\"\n >\n <template #label>\n UserInfo\n </template>\n <VCFormInput\n v-model=\"$v.user_info_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n</template>\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider, OAuth2IdentityProvider } from '@authup/core-kit';\nimport type { OpenIDProviderMetadata } from '@authup/specs';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { required, url } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\nimport { AIdentityProviderOAuth2Discovery } from './AIdentityProviderOAuth2Discovery';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n AIdentityProviderOAuth2Discovery, \n },\n props: {\n entity: { type: Object as PropType<Partial<OAuth2IdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n token_url: '',\n authorize_url: '',\n user_info_url: '',\n });\n\n const $v = useVuelidate({\n token_url: {\n required,\n url,\n },\n authorize_url: {\n required,\n url,\n },\n user_info_url: { url },\n }, form, { $registerAs: 'endpoint' });\n\n function init() {\n form.token_url = '';\n form.authorize_url = '';\n form.user_info_url = '';\n\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n const handleDiscoveryLookup = (data: OpenIDProviderMetadata) => {\n form.authorize_url = data.authorization_endpoint;\n form.token_url = data.token_endpoint;\n };\n\n return {\n $v,\n validationMessages,\n handleDiscoveryLookup,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <AIdentityProviderOAuth2Discovery\n v-if=\"discovery\"\n @lookup=\"handleDiscoveryLookup\"\n />\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.token_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.token_url)\"\n >\n <template #label>\n Token\n </template>\n <VCFormInput\n v-model=\"$v.token_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.authorize_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.authorize_url)\"\n >\n <template #label>\n Authorize\n </template>\n <VCFormInput\n v-model=\"$v.authorize_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.user_info_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.user_info_url)\"\n >\n <template #label>\n UserInfo\n </template>\n <VCFormInput\n v-model=\"$v.user_info_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport useVuelidate from '@vuelidate/core';\nimport type {\n PropType,\n VNodeArrayChildren, \n VNodeChild,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h, \n nextTick,\n ref,\n} from 'vue';\nimport type {\n IdentityProvider,\n IdentityProviderPreset, \n OAuth2IdentityProvider,\n} from '@authup/core-kit';\nimport { EntityType, IdentityProviderProtocol } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n} from '@vuecs/form-controls';\nimport { onChange, useIsEditing } from '../../../composables';\nimport {\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n extractVuelidateResultsFromChild,\n injectHTTPClient,\n} from '../../../core';\nimport { defineEntityManager, defineEntityVEmitOptions } from '../../utility';\nimport { AIdentityProviderBasicFields } from './AIdentityProviderBasicFields';\nimport { AIdentityProviderOAuth2ClientFields } from './AIdentityProviderOAuth2ClientFields';\nimport AIdentityProviderOAuth2EndpointFields from './AIdentityProviderOAuth2EndpointFields.vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\nimport type { IdentityProviderPresetElement } from './preset';\nimport type { IdentityProviderProtocolElement } from './protocol';\n\nexport const AIdentityProviderOAuth2Form = defineComponent({\n components: {\n IdentityProviderBasicFields: AIdentityProviderBasicFields,\n IdentityProviderClientFields: AIdentityProviderOAuth2ClientFields,\n },\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: false,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n protocol: {\n type: String as PropType<string | null>,\n default: IdentityProviderProtocol.OAUTH2,\n },\n preset: { type: String as PropType<string | null> },\n },\n emits: defineEntityVEmitOptions<IdentityProvider>(),\n setup(props, ctx) {\n const apiClient = injectHTTPClient();\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n setup: ctx,\n props,\n });\n\n const protocol = computed(() => {\n if (manager.data.value) {\n return manager.data.value.protocol;\n }\n\n return props.protocol;\n });\n\n const preset = computed(() => {\n if (manager.data.value) {\n return manager.data.value.preset;\n }\n\n return props.preset;\n });\n\n const busy = ref(false);\n\n const $v = useVuelidate({ $stopPropagation: true });\n\n const isEditing = useIsEditing(manager.data);\n\n const authorizeUri = computed<string>(() => {\n if (!manager.data.value) {\n return '';\n }\n\n return apiClient.identityProvider.getAuthorizeUri(manager.data.value.id);\n });\n\n const basicFieldsNode = ref<null | typeof AIdentityProviderBasicFields>(null);\n\n onChange(preset, () => {\n if (!basicFieldsNode.value) {\n return;\n }\n\n if (preset.value) {\n basicFieldsNode.value.assign({\n name: preset.value,\n slug: preset.value,\n });\n\n return;\n }\n\n basicFieldsNode.value.assign({\n name: '',\n slug: '',\n });\n });\n function initForm() {\n nextTick(() => {\n if (\n !manager.data.value &&\n preset.value &&\n basicFieldsNode.value\n ) {\n basicFieldsNode.value.assign({\n name: preset.value,\n slug: preset.value,\n });\n }\n });\n }\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n const data : Partial<IdentityProvider> = {\n ...extractVuelidateResultsFromChild($v, 'basic'),\n ...extractVuelidateResultsFromChild($v, 'client'),\n ...extractVuelidateResultsFromChild($v, 'endpoint'),\n };\n\n if (protocol.value) {\n data.protocol = protocol.value as IdentityProviderProtocol;\n }\n\n if (preset.value) {\n data.preset = preset.value as IdentityProviderPreset;\n }\n\n await manager.createOrUpdate(data);\n };\n\n const submitTranslations = createFormSubmitTranslations();\n\n return () => {\n let headerNode : VNodeChild;\n\n if (!manager.data.value) {\n if (preset.value) {\n headerNode = h(AIdentityProviderPreset, {\n key: preset.value,\n id: preset.value,\n }, {\n default: (element: IdentityProviderPresetElement) => h('div', [\n h('h4', { class: 'mb-3' }, [\n h('i', { class: [element.icon, 'pe-1'] }),\n element.name,\n ]),\n ]),\n });\n } else {\n headerNode = h(AIdentityProviderProtocol, {\n key: protocol.value!,\n id: protocol.value!,\n }, {\n default: (element: IdentityProviderProtocolElement) => h('div', [\n h('h4', { class: 'mb-3' }, [\n h('i', { class: [element.icon, 'pe-1'] }),\n element.name,\n ]),\n ]),\n });\n }\n }\n\n let detailsNode : VNodeArrayChildren = [];\n if (isEditing.value) {\n detailsNode = [\n h('h6', [\n h('i', { class: 'fas fa-info-circle' }),\n ' ',\n 'Details',\n ]),\n buildFormGroup({\n label: true,\n labelContent: 'Redirect URL',\n content: buildFormInput({\n value: authorizeUri,\n props: { disabled: true },\n }),\n }),\n h('hr'),\n ];\n }\n\n const basicNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n 'Basic',\n ]),\n h(AIdentityProviderBasicFields, {\n ref: basicFieldsNode,\n entity: manager.data.value,\n }),\n ];\n\n const securityNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-lock' }),\n ' ',\n 'Security',\n ]),\n h(AIdentityProviderOAuth2ClientFields, { entity: manager.data.value as OAuth2IdentityProvider }),\n ];\n\n let endpointsNode : VNodeChild;\n if (!preset.value) {\n endpointsNode = [\n h('h6', [\n h('i', { class: 'fa-solid fa-vihara' }),\n ' ',\n 'Endpoints',\n ]),\n h(\n AIdentityProviderOAuth2EndpointFields,\n {\n entity: manager.data.value as OAuth2IdentityProvider,\n discovery: protocol.value === IdentityProviderProtocol.OIDC,\n },\n ),\n ];\n }\n\n const submitNode = buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, submitTranslations);\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.call(null);\n },\n }, [\n headerNode,\n detailsNode,\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n basicNode,\n ]),\n h('div', { class: 'col' }, [\n securityNode,\n ]),\n ]),\n h('hr'),\n endpointsNode,\n submitNode,\n ]);\n };\n },\n});\n\nexport default AIdentityProviderOAuth2Form;\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n defineComponent, \n h, \n ref, \n toRef,\n} from 'vue';\nimport { IdentityProviderProtocol, getIdentityProviderProtocolForPreset } from '@authup/core-kit';\nimport type { IdentityProvider, IdentityProviderPreset } from '@authup/core-kit';\nimport type { PropType, VNodeChild } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { AIdentityProviderLdapForm } from './AIdentityProviderLdapForm';\nimport AIdentityProviderPicker from './AIdentityProviderPicker.vue';\nimport { AIdentityProviderOAuth2Form } from './AIdentityProviderOAuth2Form';\n\nexport const AIdentityProviderForm = defineComponent({\n props: {\n entity: { type: Object as PropType<IdentityProvider> },\n realmId: { type: String },\n },\n emits: ['created', 'deleted', 'updated', 'failed'],\n setup(props, setup) {\n const protocol = ref<string | null>(null);\n const preset = ref<string | null>(null);\n\n const entity = toRef(props, 'entity');\n const updatedAt = useUpdatedAt(entity);\n\n const set = () => {\n if (entity.value) {\n if (entity.value.preset) {\n preset.value = entity.value.preset;\n }\n\n if (entity.value.protocol) {\n protocol.value = entity.value.protocol;\n }\n }\n };\n\n set();\n\n onChange(updatedAt, () => set());\n\n const renderPicker = () : VNodeChild => h(\n AIdentityProviderPicker,\n {\n protocol: protocol.value ?? undefined,\n preset: preset.value ?? undefined,\n onPick(type: 'protocol' | 'preset', value: string) {\n if (type === 'preset') {\n preset.value = value;\n protocol.value = `${getIdentityProviderProtocolForPreset(value as IdentityProviderPreset)}`;\n return;\n }\n\n protocol.value = value;\n preset.value = null;\n },\n },\n );\n\n const render = (node: VNodeChild) : VNodeChild => {\n if (!entity.value) {\n return [\n renderPicker(),\n h('hr'),\n node,\n ];\n }\n\n return node;\n };\n\n return () => {\n if (!protocol.value && !preset.value) {\n return renderPicker();\n }\n\n if (protocol.value) {\n switch (protocol.value) {\n case IdentityProviderProtocol.OAUTH2:\n case IdentityProviderProtocol.OIDC: {\n return render(h(AIdentityProviderOAuth2Form, {\n entity: entity.value,\n realmId: props.realmId,\n protocol: protocol.value,\n preset: preset.value,\n onCreated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('created', el);\n },\n onUpdated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('updated', el);\n },\n }));\n }\n case IdentityProviderProtocol.LDAP: {\n return render(h(AIdentityProviderLdapForm, {\n entity: entity.value,\n realmId: props.realmId,\n onCreated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('created', el);\n },\n onUpdated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('updated', el);\n },\n }));\n }\n }\n }\n\n let prefix : string | undefined;\n if (protocol.value) {\n prefix = protocol.value;\n }\n if (preset.value) {\n prefix = preset.value;\n }\n\n return render(h('div', { class: 'alert alert-warning alert-sm' }, [\n `${prefix} is not supported yet :/`,\n ]));\n };\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const AIdentityProviders = defineComponent({\n props: defineEntityCollectionVProps<IdentityProvider>(),\n emits: defineEntityCollectionVEmitOptions<IdentityProvider>(),\n slots: Object as SlotsType<EntityCollectionVSlots<IdentityProvider>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.IDENTITY_PROVIDERS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AIdentityProviders;\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: { AIdentityProviderPreset, AIdentityProviderProtocol },\n inheritAttrs: false,\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <AIdentityProviderPreset\n v-if=\"entity.preset\"\n :id=\"entity.preset\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderPreset>\n <AIdentityProviderProtocol\n v-else-if=\"entity.protocol\"\n :id=\"entity.protocol\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderProtocol>\n</template>\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: { AIdentityProviderPreset, AIdentityProviderProtocol },\n inheritAttrs: false,\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <AIdentityProviderPreset\n v-if=\"entity.preset\"\n :id=\"entity.preset\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderPreset>\n <AIdentityProviderProtocol\n v-else-if=\"entity.protocol\"\n :id=\"entity.protocol\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderProtocol>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive, ref } from 'vue';\nimport type { IdentityProviderRoleMapping, Role } from '@authup/core-kit';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n assignFormProperties,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n VCFormInputCheckbox, \n },\n props: {\n role: {\n type: Object as PropType<Role>,\n required: true,\n },\n entityId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<IdentityProviderRoleMapping>(),\n async setup(props, setup) {\n const display = ref(false);\n const toggleDisplay = () => {\n display.value = !display.value;\n };\n\n const form = reactive({\n name: '',\n value: '',\n value_is_regex: false,\n });\n\n const $v = useVuelidate({\n name: {\n minLength: minLength(3),\n maxLength: maxLength(32),\n },\n value: {\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n value_is_regex: {},\n }, form);\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.VALUE_IS_REGEX },\n ],\n );\n\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER_ROLE_MAPPING}`,\n setup,\n socket: {\n processEvent(event) {\n return event.data.role_id === props.role.id &&\n event.data.provider_id === props.entityId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.role.id,\n provider_id: props.entityId,\n },\n },\n });\n\n if (manager.data.value) {\n assignFormProperties(form, manager.data.value);\n }\n\n const handleSaveOrCreate = (e: Event) => {\n e.preventDefault();\n\n if (manager.data.value) {\n return manager.update(form);\n }\n\n return manager.create({\n ...form,\n provider_id: props.entityId,\n role_id: props.role.id,\n });\n };\n\n const handleDelete = (e: Event) => {\n e.preventDefault();\n\n return manager.delete();\n };\n\n return {\n display,\n toggleDisplay,\n $v,\n validationMessages,\n translationsDefault,\n manager,\n handleSaveOrCreate,\n handleDelete,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <div class=\"list-item flex-column\">\n <div class=\"d-flex flex-row\">\n <div class=\"me-2\">\n <button\n class=\"btn btn-xs btn-dark\"\n @click.prevent=\"toggleDisplay()\"\n >\n <i\n :class=\"['fa', {\n 'fa-chevron-down': !display,\n 'fa-chevron-up': display,\n }]\"\n />\n </button>\n </div>\n <div>\n <h6\n class=\"mb-0\"\n @click.prevent=\"toggleDisplay()\"\n >\n {{ role.name }}\n </h6>\n </div>\n <div class=\"ms-auto\">\n <button\n :class=\"['btn btn-xs', {\n 'btn-primary': !manager.data.value,\n 'btn-dark': !!manager.data.value,\n }]\"\n @click=\"handleSaveOrCreate\"\n >\n <i\n :class=\"['fa', {\n 'fa-plus': !manager.data.value,\n 'fa-save': manager.data.value,\n }]\"\n />\n </button>\n <button\n v-if=\"manager.data.value\"\n class=\"btn btn-xs btn-danger ms-1\"\n :disabled=\"manager.busy.value\"\n @click=\"handleDelete\"\n >\n <i class=\"fa fa-trash\" />\n </button>\n </div>\n </div>\n <div\n v-if=\"display\"\n class=\"mt-2\"\n >\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.name.value\"\n :validation-severity=\"getVuelidateSeverity($v.name)\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"$v.name.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value.value\"\n :validation-severity=\"getVuelidateSeverity($v.value)\"\n >\n <template #label>\n Value\n </template>\n <VCFormInput\n v-model=\"$v.value.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value_is_regex.value\"\n :validation-severity=\"getVuelidateSeverity($v.value_is_regex)\"\n >\n <template #label>\n Regex\n </template>\n <VCFormInputCheckbox\n v-model=\"$v.value_is_regex.$model\"\n group-class=\"form-switch\"\n :label-content=\"translationsDefault.valueIsRegex.value\"\n />\n </VCFormGroup>\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive, ref } from 'vue';\nimport type { IdentityProviderRoleMapping, Role } from '@authup/core-kit';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n assignFormProperties,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n VCFormInputCheckbox, \n },\n props: {\n role: {\n type: Object as PropType<Role>,\n required: true,\n },\n entityId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<IdentityProviderRoleMapping>(),\n async setup(props, setup) {\n const display = ref(false);\n const toggleDisplay = () => {\n display.value = !display.value;\n };\n\n const form = reactive({\n name: '',\n value: '',\n value_is_regex: false,\n });\n\n const $v = useVuelidate({\n name: {\n minLength: minLength(3),\n maxLength: maxLength(32),\n },\n value: {\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n value_is_regex: {},\n }, form);\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.VALUE_IS_REGEX },\n ],\n );\n\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER_ROLE_MAPPING}`,\n setup,\n socket: {\n processEvent(event) {\n return event.data.role_id === props.role.id &&\n event.data.provider_id === props.entityId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.role.id,\n provider_id: props.entityId,\n },\n },\n });\n\n if (manager.data.value) {\n assignFormProperties(form, manager.data.value);\n }\n\n const handleSaveOrCreate = (e: Event) => {\n e.preventDefault();\n\n if (manager.data.value) {\n return manager.update(form);\n }\n\n return manager.create({\n ...form,\n provider_id: props.entityId,\n role_id: props.role.id,\n });\n };\n\n const handleDelete = (e: Event) => {\n e.preventDefault();\n\n return manager.delete();\n };\n\n return {\n display,\n toggleDisplay,\n $v,\n validationMessages,\n translationsDefault,\n manager,\n handleSaveOrCreate,\n handleDelete,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <div class=\"list-item flex-column\">\n <div class=\"d-flex flex-row\">\n <div class=\"me-2\">\n <button\n class=\"btn btn-xs btn-dark\"\n @click.prevent=\"toggleDisplay()\"\n >\n <i\n :class=\"['fa', {\n 'fa-chevron-down': !display,\n 'fa-chevron-up': display,\n }]\"\n />\n </button>\n </div>\n <div>\n <h6\n class=\"mb-0\"\n @click.prevent=\"toggleDisplay()\"\n >\n {{ role.name }}\n </h6>\n </div>\n <div class=\"ms-auto\">\n <button\n :class=\"['btn btn-xs', {\n 'btn-primary': !manager.data.value,\n 'btn-dark': !!manager.data.value,\n }]\"\n @click=\"handleSaveOrCreate\"\n >\n <i\n :class=\"['fa', {\n 'fa-plus': !manager.data.value,\n 'fa-save': manager.data.value,\n }]\"\n />\n </button>\n <button\n v-if=\"manager.data.value\"\n class=\"btn btn-xs btn-danger ms-1\"\n :disabled=\"manager.busy.value\"\n @click=\"handleDelete\"\n >\n <i class=\"fa fa-trash\" />\n </button>\n </div>\n </div>\n <div\n v-if=\"display\"\n class=\"mt-2\"\n >\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.name.value\"\n :validation-severity=\"getVuelidateSeverity($v.name)\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"$v.name.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value.value\"\n :validation-severity=\"getVuelidateSeverity($v.value)\"\n >\n <template #label>\n Value\n </template>\n <VCFormInput\n v-model=\"$v.value.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value_is_regex.value\"\n :validation-severity=\"getVuelidateSeverity($v.value_is_regex)\"\n >\n <template #label>\n Regex\n </template>\n <VCFormInputCheckbox\n v-model=\"$v.value_is_regex.$model\"\n group-class=\"form-switch\"\n :label-content=\"translationsDefault.valueIsRegex.value\"\n />\n </VCFormGroup>\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport AIdentityProviderRoleAssignment from './AIdentityProviderRoleAssignment.vue';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, AIdentityProviderRoleAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'body')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :header-title=\"false\">\n <template #body=\"slotProps\">\n <AIdentityProviderRoleAssignment\n v-for=\"item in slotProps.data\"\n :key=\"item.id\"\n :entity-id=\"entityId\"\n :role=\"item\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport AIdentityProviderRoleAssignment from './AIdentityProviderRoleAssignment.vue';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, AIdentityProviderRoleAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'body')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :header-title=\"false\">\n <template #body=\"slotProps\">\n <AIdentityProviderRoleAssignment\n v-for=\"item in slotProps.data\"\n :key=\"item.id\"\n :entity-id=\"entityId\"\n :role=\"item\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<script lang=\"ts\">\nimport type { AttributeNamesPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ names: string[] }>({ names: [] });\n\n const vuelidate = useVuelidate({ names: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<AttributeNamesPolicy> = {}) {\n form.names = data.names || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.names = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.names.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n />\n</template>\n","<script lang=\"ts\">\nimport type { AttributeNamesPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ names: string[] }>({ names: [] });\n\n const vuelidate = useVuelidate({ names: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<AttributeNamesPolicy> = {}) {\n form.names = data.names || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.names = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.names.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n />\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport type { EntityManager } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n renderToggleButton,\n} from '../../utility';\n\nexport const APolicyParentAssignment = defineComponent({\n props: {\n entityId: {\n type: String,\n required: true,\n },\n entity: { type: Object as PropType<Policy> },\n parentId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<Policy>(),\n async setup(props, setup) {\n const manager : EntityManager<Policy> = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup,\n socket: {\n processEvent(event) {\n return event.data.id === props.entityId;\n },\n },\n props: {\n entity: props.entity,\n entityId: props.entityId,\n },\n });\n\n await manager.resolve({ query: { filters: { id: props.entityId } } });\n\n return () => renderToggleButton({\n changed: (value) => {\n if (!manager.data.value) {\n return;\n }\n\n if (value) {\n manager.data.value.parent_id = props.parentId;\n } else {\n manager.data.value.parent_id = null;\n if (manager.data.value.parent) {\n manager.data.value.parent = null;\n }\n }\n\n manager.update(manager.data.value);\n },\n value: !!manager.data.value &&\n manager.data.value.parent_id === props.parentId,\n isBusy: manager.busy.value,\n });\n },\n});\n","<!--\n Copyright (c) 2025.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport { SlotName } from '@vuecs/list-controls';\nimport type { SlotsType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { defineEntityPicker, defineEntityPickerVEmitOptions, defineEntityPickerVProps } from '../../utility';\nimport type { EntityPickerVSlots } from '../../utility';\nimport { APolicies } from './APolicies';\nimport { APolicyParentAssignment } from './APolicyParentAssignment';\n\nexport default defineComponent({\n props: {\n parentId: { type: String },\n ...defineEntityPickerVProps<Policy>(),\n },\n emits: defineEntityPickerVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityPickerVSlots<Policy>>,\n setup(props, {\n slots,\n ...setup\n }) {\n const { render } = defineEntityPicker({\n component: APolicies,\n props,\n setup: {\n ...setup,\n slots: {\n ...(\n props.parentId ? {\n [SlotName.ITEM_ACTIONS]: (\n slotProps: EntityPickerVSlots<Policy>['itemActions'],\n ) => h(APolicyParentAssignment, {\n entity: slotProps.data,\n entityId: slotProps.data.id,\n parentId: props.parentId as string,\n }),\n } : {}\n ),\n ...slots,\n },\n },\n });\n\n return () => render();\n },\n});\n</script>\n","<!--\n Copyright (c) 2025.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport { SlotName } from '@vuecs/list-controls';\nimport type { SlotsType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { defineEntityPicker, defineEntityPickerVEmitOptions, defineEntityPickerVProps } from '../../utility';\nimport type { EntityPickerVSlots } from '../../utility';\nimport { APolicies } from './APolicies';\nimport { APolicyParentAssignment } from './APolicyParentAssignment';\n\nexport default defineComponent({\n props: {\n parentId: { type: String },\n ...defineEntityPickerVProps<Policy>(),\n },\n emits: defineEntityPickerVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityPickerVSlots<Policy>>,\n setup(props, {\n slots,\n ...setup\n }) {\n const { render } = defineEntityPicker({\n component: APolicies,\n props,\n setup: {\n ...setup,\n slots: {\n ...(\n props.parentId ? {\n [SlotName.ITEM_ACTIONS]: (\n slotProps: EntityPickerVSlots<Policy>['itemActions'],\n ) => h(APolicyParentAssignment, {\n entity: slotProps.data,\n entityId: slotProps.data.id,\n parentId: props.parentId as string,\n }),\n } : {}\n ),\n ...slots,\n },\n },\n });\n\n return () => render();\n },\n});\n</script>\n","<script lang=\"ts\">\nimport type { BuildInput, FiltersBuildInput } from 'rapiq';\nimport {\n type PropType,\n computed,\n defineComponent,\n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { DecisionStrategy } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormSelect } from '@vuecs/form-controls';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport APolicyPicker from '../APolicyPicker.vue';\n\nexport default defineComponent({\n components: {\n APolicyChildrenPicker: APolicyPicker,\n VCFormGroup,\n VCFormSelect,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ items: string[], decision_strategy: string }>({\n items: [],\n decision_strategy: '',\n });\n\n const decisionStrategyOptions : FormSelectOption[] = Object.values(DecisionStrategy)\n .map((value) => ({\n id: value,\n value,\n }));\n\n const id = computed(() => {\n if (!props.entity) {\n return undefined;\n }\n\n return props.entity.id;\n });\n\n const vuelidate = useVuelidate({ items: {}, decision_strategy: {} }, form, { $registerAs: 'type' });\n\n const query = computed<BuildInput<Policy & { parent_id?: string | null }>>(() => {\n const filters : FiltersBuildInput<Policy & { parent_id?: string | null }> = {};\n if (props.entity) {\n // todo: maybe respect manual realmId component prop\n if (props.entity.realm_id) {\n filters.realm_id = props.entity.realm_id;\n }\n\n if (props.entity.parent_id) {\n filters.id = [\n `!${props.entity.id}`,\n `!${props.entity.parent_id}`,\n ];\n } else {\n filters.id = `!${props.entity.id}`;\n }\n\n filters.parent_id = [null, `${props.entity.id}`];\n } else {\n filters.parent_id = null;\n }\n\n return {\n filters,\n sort: { name: 'ASC' },\n };\n });\n\n function assign(data: Partial<Policy> = {}) {\n if (data.children) {\n form.items = data.children\n .map((child) => child.id)\n .filter((id): id is string => !!id);\n } else {\n form.items = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const record = data as Record<string, any>;\n if (record.decision_strategy) {\n form.decision_strategy = record.decision_strategy;\n } else {\n form.decision_strategy = '';\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (children: string[]) => {\n form.items = children;\n emitUpdated();\n };\n\n const decisionStrategyHint = computed(() => {\n switch (form.decision_strategy) {\n case DecisionStrategy.AFFIRMATIVE:\n return 'At least one child policy must evaluate positively.';\n case DecisionStrategy.CONSENSUS:\n return 'More child policies must evaluate positively than negatively.';\n case DecisionStrategy.UNANIMOUS:\n return 'All child policies must evaluate positively.';\n default:\n return 'No strategy selected. Defaults to unanimous (all child policies must evaluate positively).';\n }\n });\n\n const handleDecisionStrategyUpdated = () => {\n emitUpdated();\n };\n\n const emitUpdated = () => {\n setup.emit('updated', {\n data: [\n ...form.items,\n ],\n decision_strategy: form.decision_strategy || undefined,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n id,\n\n handleUpdated,\n handleDecisionStrategyUpdated,\n\n decisionStrategyHint,\n decisionStrategyOptions,\n vuelidate,\n\n query,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.decision_strategy\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Decision Strategy\n </template>\n <VCFormSelect\n v-model=\"vuelidate.decision_strategy.$model\"\n :options=\"decisionStrategyOptions\"\n :option-default=\"true\"\n :option-default-value=\"'-- None (default: unanimous) --'\"\n @change=\"handleDecisionStrategyUpdated\"\n />\n <div class=\"alert alert-sm alert-info mt-1 mb-0\">\n {{ decisionStrategyHint }}\n </div>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.items\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Children\n </template>\n <APolicyChildrenPicker\n :parent-id=\"id\"\n :query=\"query\"\n :value=\"vuelidate.items.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { BuildInput, FiltersBuildInput } from 'rapiq';\nimport {\n type PropType,\n computed,\n defineComponent,\n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { DecisionStrategy } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormSelect } from '@vuecs/form-controls';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport APolicyPicker from '../APolicyPicker.vue';\n\nexport default defineComponent({\n components: {\n APolicyChildrenPicker: APolicyPicker,\n VCFormGroup,\n VCFormSelect,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ items: string[], decision_strategy: string }>({\n items: [],\n decision_strategy: '',\n });\n\n const decisionStrategyOptions : FormSelectOption[] = Object.values(DecisionStrategy)\n .map((value) => ({\n id: value,\n value,\n }));\n\n const id = computed(() => {\n if (!props.entity) {\n return undefined;\n }\n\n return props.entity.id;\n });\n\n const vuelidate = useVuelidate({ items: {}, decision_strategy: {} }, form, { $registerAs: 'type' });\n\n const query = computed<BuildInput<Policy & { parent_id?: string | null }>>(() => {\n const filters : FiltersBuildInput<Policy & { parent_id?: string | null }> = {};\n if (props.entity) {\n // todo: maybe respect manual realmId component prop\n if (props.entity.realm_id) {\n filters.realm_id = props.entity.realm_id;\n }\n\n if (props.entity.parent_id) {\n filters.id = [\n `!${props.entity.id}`,\n `!${props.entity.parent_id}`,\n ];\n } else {\n filters.id = `!${props.entity.id}`;\n }\n\n filters.parent_id = [null, `${props.entity.id}`];\n } else {\n filters.parent_id = null;\n }\n\n return {\n filters,\n sort: { name: 'ASC' },\n };\n });\n\n function assign(data: Partial<Policy> = {}) {\n if (data.children) {\n form.items = data.children\n .map((child) => child.id)\n .filter((id): id is string => !!id);\n } else {\n form.items = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const record = data as Record<string, any>;\n if (record.decision_strategy) {\n form.decision_strategy = record.decision_strategy;\n } else {\n form.decision_strategy = '';\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (children: string[]) => {\n form.items = children;\n emitUpdated();\n };\n\n const decisionStrategyHint = computed(() => {\n switch (form.decision_strategy) {\n case DecisionStrategy.AFFIRMATIVE:\n return 'At least one child policy must evaluate positively.';\n case DecisionStrategy.CONSENSUS:\n return 'More child policies must evaluate positively than negatively.';\n case DecisionStrategy.UNANIMOUS:\n return 'All child policies must evaluate positively.';\n default:\n return 'No strategy selected. Defaults to unanimous (all child policies must evaluate positively).';\n }\n });\n\n const handleDecisionStrategyUpdated = () => {\n emitUpdated();\n };\n\n const emitUpdated = () => {\n setup.emit('updated', {\n data: [\n ...form.items,\n ],\n decision_strategy: form.decision_strategy || undefined,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n id,\n\n handleUpdated,\n handleDecisionStrategyUpdated,\n\n decisionStrategyHint,\n decisionStrategyOptions,\n vuelidate,\n\n query,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.decision_strategy\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Decision Strategy\n </template>\n <VCFormSelect\n v-model=\"vuelidate.decision_strategy.$model\"\n :options=\"decisionStrategyOptions\"\n :option-default=\"true\"\n :option-default-value=\"'-- None (default: unanimous) --'\"\n @change=\"handleDecisionStrategyUpdated\"\n />\n <div class=\"alert alert-sm alert-info mt-1 mb-0\">\n {{ decisionStrategyHint }}\n </div>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.items\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Children\n </template>\n <APolicyChildrenPicker\n :parent-id=\"id\"\n :query=\"query\"\n :value=\"vuelidate.items.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport type { DatePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n });\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<DatePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport type { DatePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n });\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<DatePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { IdentityPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ types: string[] }>({ types: [] });\n\n const vuelidate = useVuelidate({ types: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<IdentityPolicy> = {}) {\n form.types = data.types || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.types = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.types.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n >\n <template #label>\n Types\n </template>\n </AFormInputList>\n</template>\n","<script lang=\"ts\">\nimport type { IdentityPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ types: string[] }>({ types: [] });\n\n const vuelidate = useVuelidate({ types: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<IdentityPolicy> = {}) {\n form.types = data.types || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.types = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.types.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n >\n <template #label>\n Types\n </template>\n </AFormInputList>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup } from '@vuecs/form-controls';\nimport type { RealmMatchPolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: {\n AFormInputList,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n attribute_name_strict: false,\n attribute_null_match_all: false,\n identity_master_match_all: false,\n attribute_name: [] as string[],\n });\n\n const vuelidate = useVuelidate({\n attribute_name_strict: {},\n attribute_null_match_all: {},\n identity_master_match_all: {},\n attribute_name: {},\n }, form, { $registerAs: 'type' });\n\n function assign(input: Partial<RealmMatchPolicy> = {}) {\n const {\n attribute_name, \n ...data \n } = input;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n if (attribute_name) {\n form.attribute_name = typeof attribute_name === 'string' ? [attribute_name] : attribute_name;\n } else {\n form.attribute_name = [];\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleAttributeNameChanged = (data: string[]) => {\n form.attribute_name = data;\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleAttributeNameChanged,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col-7\">\n <IVuelidate :validation=\"vuelidate.attribute_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <AFormInputList\n :names=\"vuelidate.attribute_name.$model\"\n @changed=\"handleAttributeNameChanged\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col-5\">\n <IVuelidate :validation=\"vuelidate.attribute_name_strict\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_name_strict.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Only match if the attribute is strict equal to the name?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.attribute_null_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_null_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Determines if resources with null realm-id/name value should match all identity realms.<br>\n If true, any identity realm can access resources with null realm-id/name values.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.identity_master_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.identity_master_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Specifies whether the master realm of an identity should match all realm-id/name attributes, including null.<br>\n If true, the master realm can access any resource regardless of its realm value.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup } from '@vuecs/form-controls';\nimport type { RealmMatchPolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: {\n AFormInputList,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n attribute_name_strict: false,\n attribute_null_match_all: false,\n identity_master_match_all: false,\n attribute_name: [] as string[],\n });\n\n const vuelidate = useVuelidate({\n attribute_name_strict: {},\n attribute_null_match_all: {},\n identity_master_match_all: {},\n attribute_name: {},\n }, form, { $registerAs: 'type' });\n\n function assign(input: Partial<RealmMatchPolicy> = {}) {\n const {\n attribute_name, \n ...data \n } = input;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n if (attribute_name) {\n form.attribute_name = typeof attribute_name === 'string' ? [attribute_name] : attribute_name;\n } else {\n form.attribute_name = [];\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleAttributeNameChanged = (data: string[]) => {\n form.attribute_name = data;\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleAttributeNameChanged,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col-7\">\n <IVuelidate :validation=\"vuelidate.attribute_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <AFormInputList\n :names=\"vuelidate.attribute_name.$model\"\n @changed=\"handleAttributeNameChanged\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col-5\">\n <IVuelidate :validation=\"vuelidate.attribute_name_strict\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_name_strict.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Only match if the attribute is strict equal to the name?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.attribute_null_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_null_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Determines if resources with null realm-id/name value should match all identity realms.<br>\n If true, any identity realm can access resources with null realm-id/name values.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.identity_master_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.identity_master_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Specifies whether the master realm of an identity should match all realm-id/name attributes, including null.<br>\n If true, the master realm can access any resource regardless of its realm value.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxValue, minValue } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport {\n TimePolicyInterval,\n isIntervalForDayOfMonth,\n isIntervalForDayOfWeek,\n isIntervalForDayOfYear,\n} from '@authup/access';\nimport type { TimePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n interval: '',\n day_of_week: '',\n day_of_month: '',\n day_of_year: '',\n });\n\n const intervalOptions : FormSelectOption[] = Object.values(TimePolicyInterval)\n .map((el) => ({\n id: el,\n value: el,\n } satisfies FormSelectOption));\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n interval: {},\n day_of_week: {\n minValue: minValue(0),\n maxValue: maxValue(6),\n },\n day_of_month: {\n minValue: minValue(1),\n maxValue: maxValue(31),\n },\n day_of_year: {\n minValue: minValue(1),\n maxValue: maxValue(365),\n },\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<TimePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const displayIntervalForDayOfWeek = computed(\n () => isIntervalForDayOfWeek(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfMonth = computed(\n () => isIntervalForDayOfMonth(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfYear = computed(\n () => isIntervalForDayOfYear(vuelidate.value.interval.$model),\n );\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleIntervalUpdated = (value: string) => {\n if (!isIntervalForDayOfWeek(value)) {\n vuelidate.value.day_of_week.$model = '';\n }\n\n if (!isIntervalForDayOfMonth(value)) {\n vuelidate.value.day_of_month.$model = '';\n }\n\n if (!isIntervalForDayOfYear(value)) {\n vuelidate.value.day_of_year.$model = '';\n }\n\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleIntervalUpdated,\n\n intervalOptions,\n vuelidate,\n\n displayIntervalForDayOfWeek,\n displayIntervalForDayOfMonth,\n displayIntervalForDayOfYear,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.interval\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Interval\n </template>\n <VCFormSelect\n v-model=\"vuelidate.interval.$model\"\n :options=\"intervalOptions\"\n @change=\"handleIntervalUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <div class=\"row\">\n <div\n v-if=\"displayIntervalForDayOfWeek\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_week\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Week\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_week.$model\"\n placeholder=\"0-6\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfMonth\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_month\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Month\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_month.$model\"\n placeholder=\"1-31\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfYear\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_year\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Year\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_year.$model\"\n type=\"number\"\n placeholder=\"1-365\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxValue, minValue } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport {\n TimePolicyInterval,\n isIntervalForDayOfMonth,\n isIntervalForDayOfWeek,\n isIntervalForDayOfYear,\n} from '@authup/access';\nimport type { TimePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n interval: '',\n day_of_week: '',\n day_of_month: '',\n day_of_year: '',\n });\n\n const intervalOptions : FormSelectOption[] = Object.values(TimePolicyInterval)\n .map((el) => ({\n id: el,\n value: el,\n } satisfies FormSelectOption));\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n interval: {},\n day_of_week: {\n minValue: minValue(0),\n maxValue: maxValue(6),\n },\n day_of_month: {\n minValue: minValue(1),\n maxValue: maxValue(31),\n },\n day_of_year: {\n minValue: minValue(1),\n maxValue: maxValue(365),\n },\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<TimePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const displayIntervalForDayOfWeek = computed(\n () => isIntervalForDayOfWeek(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfMonth = computed(\n () => isIntervalForDayOfMonth(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfYear = computed(\n () => isIntervalForDayOfYear(vuelidate.value.interval.$model),\n );\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleIntervalUpdated = (value: string) => {\n if (!isIntervalForDayOfWeek(value)) {\n vuelidate.value.day_of_week.$model = '';\n }\n\n if (!isIntervalForDayOfMonth(value)) {\n vuelidate.value.day_of_month.$model = '';\n }\n\n if (!isIntervalForDayOfYear(value)) {\n vuelidate.value.day_of_year.$model = '';\n }\n\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleIntervalUpdated,\n\n intervalOptions,\n vuelidate,\n\n displayIntervalForDayOfWeek,\n displayIntervalForDayOfMonth,\n displayIntervalForDayOfYear,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.interval\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Interval\n </template>\n <VCFormSelect\n v-model=\"vuelidate.interval.$model\"\n :options=\"intervalOptions\"\n @change=\"handleIntervalUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <div class=\"row\">\n <div\n v-if=\"displayIntervalForDayOfWeek\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_week\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Week\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_week.$model\"\n placeholder=\"0-6\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfMonth\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_month\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Month\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_month.$model\"\n placeholder=\"1-31\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfYear\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_year\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Year\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_year.$model\"\n type=\"number\"\n placeholder=\"1-365\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Policy } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const APolicy = defineComponent({\n props: defineEntityVProps<Policy>(),\n emits: defineEntityVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityVSlots<Policy>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup,\n props,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\n\nexport default defineComponent({\n props: {\n type: { type: String },\n types: { type: Array as PropType<(FormSelectOption | string)[]> },\n },\n emits: ['pick'],\n setup(props, setup) {\n const option = ref<string | null>(null);\n const options = computed<FormSelectOption[]>(() => {\n if (props.types) {\n return props.types.map((type) => {\n if (typeof type === 'string') {\n return {\n id: type,\n value: type, \n } satisfies FormSelectOption;\n }\n\n return type;\n });\n }\n\n return Object.values(BuiltInPolicyType)\n .map((type: string) => ({\n id: type,\n value: type,\n } satisfies FormSelectOption));\n });\n\n if (props.type) {\n option.value = props.type;\n }\n\n const pick = (val: string) => {\n option.value = val;\n setup.emit('pick', val);\n };\n\n return {\n option,\n options,\n pick,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Type</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in options\"\n :key=\"key\"\n >\n <div\n :class=\"{'active': item.id === option}\"\n class=\"d-flex flex-column gap-1 text-center a-picker-item\"\n @click.prevent=\"pick(`${item.id}`)\"\n >\n <div>\n {{ item.value }}\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.a-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.a-picker-item.active,\n.a-picker-item:hover,\n.a-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\n\nexport default defineComponent({\n props: {\n type: { type: String },\n types: { type: Array as PropType<(FormSelectOption | string)[]> },\n },\n emits: ['pick'],\n setup(props, setup) {\n const option = ref<string | null>(null);\n const options = computed<FormSelectOption[]>(() => {\n if (props.types) {\n return props.types.map((type) => {\n if (typeof type === 'string') {\n return {\n id: type,\n value: type, \n } satisfies FormSelectOption;\n }\n\n return type;\n });\n }\n\n return Object.values(BuiltInPolicyType)\n .map((type: string) => ({\n id: type,\n value: type,\n } satisfies FormSelectOption));\n });\n\n if (props.type) {\n option.value = props.type;\n }\n\n const pick = (val: string) => {\n option.value = val;\n setup.emit('pick', val);\n };\n\n return {\n option,\n options,\n pick,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Type</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in options\"\n :key=\"key\"\n >\n <div\n :class=\"{'active': item.id === option}\"\n class=\"d-flex flex-column gap-1 text-center a-picker-item\"\n @click.prevent=\"pick(`${item.id}`)\"\n >\n <div>\n {{ item.value }}\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.a-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.a-picker-item.active,\n.a-picker-item:hover,\n.a-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n toRef,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { assignFormProperties, injectStore, storeToRefs } from '../../../core';\nimport { onChange, useIsEditing, useUpdatedAt } from '../../../composables';\nimport { ARealmPicker } from '../realm';\n\nexport default defineComponent({\n components: {\n ARealmPicker,\n VCFormInput,\n VCFormInputCheckbox,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Policy> } },\n emits: ['updated'],\n setup(props, setup) {\n const entity = toRef(props, 'entity');\n const form = reactive({\n name: '',\n invert: false,\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const isEditing = useIsEditing(entity);\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return entity.value ?\n entity.value.realm_id :\n null;\n });\n\n const typeOptions : FormSelectOption[] = [\n ...Object.values(BuiltInPolicyType).map((type) => ({\n id: type,\n value: type, \n })),\n ];\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n invert: {},\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form, { $registerAs: 'basic' });\n\n function assign(data: Partial<Policy> = {}) {\n assignFormProperties(form, data);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n isEditing,\n realmId,\n\n handleUpdated,\n typeOptions,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Display Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Description\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"4\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.invert.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Invert?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"!realmId && !isEditing\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Realm\n </template>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(value: string[]) => { vuelidate.realm_id.$model = value.length > 0 ? value[0] ?? '' : ''; }\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n toRef,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { assignFormProperties, injectStore, storeToRefs } from '../../../core';\nimport { onChange, useIsEditing, useUpdatedAt } from '../../../composables';\nimport { ARealmPicker } from '../realm';\n\nexport default defineComponent({\n components: {\n ARealmPicker,\n VCFormInput,\n VCFormInputCheckbox,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Policy> } },\n emits: ['updated'],\n setup(props, setup) {\n const entity = toRef(props, 'entity');\n const form = reactive({\n name: '',\n invert: false,\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const isEditing = useIsEditing(entity);\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return entity.value ?\n entity.value.realm_id :\n null;\n });\n\n const typeOptions : FormSelectOption[] = [\n ...Object.values(BuiltInPolicyType).map((type) => ({\n id: type,\n value: type, \n })),\n ];\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n invert: {},\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form, { $registerAs: 'basic' });\n\n function assign(data: Partial<Policy> = {}) {\n assignFormProperties(form, data);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n isEditing,\n realmId,\n\n handleUpdated,\n typeOptions,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Display Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Description\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"4\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.invert.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Invert?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"!realmId && !isEditing\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Realm\n </template>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(value: string[]) => { vuelidate.realm_id.$model = value.length > 0 ? value[0] ?? '' : ''; }\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { useIsEditing } from '../../../composables';\nimport { extractVuelidateResultsFromChild, injectHTTPClient } from '../../../core';\nimport { AFormSubmit, defineEntityManager } from '../../utility';\nimport APolicyBasicForm from './APolicyBasicForm.vue';\nimport APolicyTypePicker from './APolicyTypePicker.vue';\nimport AAttributeNamesPolicyForm from './attribute-names/AAttributeNamesPolicyForm.vue';\nimport ACompositePolicyForm from './composite/ACompositePolicyForm.vue';\nimport ADatePolicyForm from './date/ADatePolicyForm.vue';\nimport ARealmMatchPolicyForm from './realm-match/ARealmMatchPolicyForm.vue';\nimport ATimePolicyForm from './time/ATimePolicyForm.vue';\nimport AIdentityPolicyForm from './identity/AIdentityPolicyForm.vue';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n APolicyTypePicker,\n APolicyBasicForm, \n },\n props: {\n entity: { type: Object as PropType<Policy> },\n type: { type: String as PropType<string> },\n },\n setup(props, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const typeComponents : Record<string, any> = {\n [BuiltInPolicyType.IDENTITY]: AIdentityPolicyForm,\n [BuiltInPolicyType.REALM_MATCH]: ARealmMatchPolicyForm,\n [BuiltInPolicyType.COMPOSITE]: ACompositePolicyForm,\n [BuiltInPolicyType.DATE]: ADatePolicyForm,\n [BuiltInPolicyType.TIME]: ATimePolicyForm,\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: AAttributeNamesPolicyForm,\n };\n\n const httpClient = injectHTTPClient();\n const manager = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n\n const typeComputed = computed<string | null>(() => {\n if (manager.data.value) {\n return manager.data.value.type;\n }\n\n if (props.type) {\n return props.type;\n }\n\n return null;\n });\n\n const vuelidate = useVuelidate({ $stopPropagation: true });\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n const {\n items = [], \n ...data \n } = {\n ...extractVuelidateResultsFromChild(vuelidate, 'basic'),\n ...extractVuelidateResultsFromChild(vuelidate, 'type'),\n } as Partial<Omit<Policy, 'children'>> & { items: string[] };\n\n if (typeComputed.value) {\n data.type = typeComputed.value;\n }\n\n await manager.createOrUpdate(data);\n\n if (manager.data.value) {\n if (items.length > 0) {\n for (const item of items) {\n await httpClient.policy.update(item, { parent_id: manager.data.value.id });\n }\n }\n }\n };\n\n return {\n typeComputed,\n typeComponents,\n data: manager.data,\n busy: manager.busy,\n isEditing,\n submit,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column\">\n <h6>General</h6>\n <APolicyBasicForm :entity=\"data\" />\n\n <template v-if=\"typeComputed\">\n <slot\n name=\"default\"\n :entity=\"entity\"\n >\n <template v-if=\"typeComputed in typeComponents\">\n <component\n :is=\"typeComponents[typeComputed]\"\n :entity=\"entity\"\n />\n </template>\n </slot>\n </template>\n\n <div>\n <AFormSubmit\n :is-invalid=\"vuelidate.$invalid || !typeComputed\"\n :is-busy=\"busy\"\n :is-editing=\"isEditing\"\n @submit=\"submit\"\n />\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { useIsEditing } from '../../../composables';\nimport { extractVuelidateResultsFromChild, injectHTTPClient } from '../../../core';\nimport { AFormSubmit, defineEntityManager } from '../../utility';\nimport APolicyBasicForm from './APolicyBasicForm.vue';\nimport APolicyTypePicker from './APolicyTypePicker.vue';\nimport AAttributeNamesPolicyForm from './attribute-names/AAttributeNamesPolicyForm.vue';\nimport ACompositePolicyForm from './composite/ACompositePolicyForm.vue';\nimport ADatePolicyForm from './date/ADatePolicyForm.vue';\nimport ARealmMatchPolicyForm from './realm-match/ARealmMatchPolicyForm.vue';\nimport ATimePolicyForm from './time/ATimePolicyForm.vue';\nimport AIdentityPolicyForm from './identity/AIdentityPolicyForm.vue';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n APolicyTypePicker,\n APolicyBasicForm, \n },\n props: {\n entity: { type: Object as PropType<Policy> },\n type: { type: String as PropType<string> },\n },\n setup(props, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const typeComponents : Record<string, any> = {\n [BuiltInPolicyType.IDENTITY]: AIdentityPolicyForm,\n [BuiltInPolicyType.REALM_MATCH]: ARealmMatchPolicyForm,\n [BuiltInPolicyType.COMPOSITE]: ACompositePolicyForm,\n [BuiltInPolicyType.DATE]: ADatePolicyForm,\n [BuiltInPolicyType.TIME]: ATimePolicyForm,\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: AAttributeNamesPolicyForm,\n };\n\n const httpClient = injectHTTPClient();\n const manager = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n\n const typeComputed = computed<string | null>(() => {\n if (manager.data.value) {\n return manager.data.value.type;\n }\n\n if (props.type) {\n return props.type;\n }\n\n return null;\n });\n\n const vuelidate = useVuelidate({ $stopPropagation: true });\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n const {\n items = [], \n ...data \n } = {\n ...extractVuelidateResultsFromChild(vuelidate, 'basic'),\n ...extractVuelidateResultsFromChild(vuelidate, 'type'),\n } as Partial<Omit<Policy, 'children'>> & { items: string[] };\n\n if (typeComputed.value) {\n data.type = typeComputed.value;\n }\n\n await manager.createOrUpdate(data);\n\n if (manager.data.value) {\n if (items.length > 0) {\n for (const item of items) {\n await httpClient.policy.update(item, { parent_id: manager.data.value.id });\n }\n }\n }\n };\n\n return {\n typeComputed,\n typeComponents,\n data: manager.data,\n busy: manager.busy,\n isEditing,\n submit,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column\">\n <h6>General</h6>\n <APolicyBasicForm :entity=\"data\" />\n\n <template v-if=\"typeComputed\">\n <slot\n name=\"default\"\n :entity=\"entity\"\n >\n <template v-if=\"typeComputed in typeComponents\">\n <component\n :is=\"typeComponents[typeComputed]\"\n :entity=\"entity\"\n />\n </template>\n </slot>\n </template>\n\n <div>\n <AFormSubmit\n :is-invalid=\"vuelidate.$invalid || !typeComputed\"\n :is-busy=\"busy\"\n :is-editing=\"isEditing\"\n @submit=\"submit\"\n />\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientPermissionAssignment } from '../client-permission';\n\nexport default defineComponent({\n components: { AClients, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientPermissionAssignment } from '../client-permission';\n\nexport default defineComponent({\n components: { AClients, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n permissionId: {\n type: String,\n required: true,\n },\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<PermissionPolicy>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION_POLICY}`,\n setup,\n query: () => ({\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.policy_id === props.policyId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n permission_id: props.permissionId,\n policy_id: props.policyId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n permissionId: {\n type: String,\n required: true,\n },\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<PermissionPolicy>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION_POLICY}`,\n setup,\n query: () => ({\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.policy_id === props.policyId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n permission_id: props.permissionId,\n policy_id: props.policyId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\n/* global document, KeyboardEvent */\nimport type { Policy } from '@authup/core-kit';\nimport {\n computed,\n defineComponent,\n onMounted,\n onUnmounted,\n ref,\n} from 'vue';\nimport APermissionPolicyAssignment from './APermissionPolicyAssignment.vue';\nimport { APolicies } from '../policy';\nimport APolicyInlineInfo from '../policy/APolicyInlineInfo.vue';\nimport APolicySummary from '../policy/APolicySummary.vue';\n\nexport default defineComponent({\n components: {\n APolicies, \n APermissionPolicyAssignment, \n APolicyInlineInfo, \n APolicySummary, \n },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const detailPolicy = ref<Policy | null>(null);\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && detailPolicy.value) {\n detailPolicy.value = null;\n }\n };\n\n onMounted(() => {\n document.addEventListener('keydown', handleKeydown);\n });\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown);\n });\n\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'item')));\n\n return { detailPolicy, forwardedSlots };\n },\n});\n</script>\n<template>\n <div>\n <APolicies :query=\"{ filters: { parent_id: null } }\">\n <template #item=\"{ data }\">\n <div>{{ data.name }}</div>\n <APolicyInlineInfo\n :entity=\"data\"\n @detail=\"detailPolicy = $event\"\n />\n <div class=\"ms-auto\">\n <APermissionPolicyAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :policy-id=\"data.id\"\n />\n </div>\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APolicies>\n\n <Teleport\n v-if=\"detailPolicy\"\n to=\"body\"\n >\n <div\n class=\"modal-backdrop fade show\"\n @click=\"detailPolicy = null\"\n />\n <div\n class=\"modal fade show d-block\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"`policy-detail-modal-${detailPolicy.id}`\"\n >\n <div\n class=\"modal-dialog\"\n role=\"document\"\n @click.stop\n >\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5\n :id=\"`policy-detail-modal-${detailPolicy.id}`\"\n class=\"modal-title\"\n >\n {{ detailPolicy.name }}\n </h5>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n @click=\"detailPolicy = null\"\n />\n </div>\n <div class=\"modal-body\">\n <APolicySummary :entity=\"detailPolicy\" />\n </div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n class=\"btn btn-secondary btn-xs\"\n @click=\"detailPolicy = null\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\n/* global document, KeyboardEvent */\nimport type { Policy } from '@authup/core-kit';\nimport {\n computed,\n defineComponent,\n onMounted,\n onUnmounted,\n ref,\n} from 'vue';\nimport APermissionPolicyAssignment from './APermissionPolicyAssignment.vue';\nimport { APolicies } from '../policy';\nimport APolicyInlineInfo from '../policy/APolicyInlineInfo.vue';\nimport APolicySummary from '../policy/APolicySummary.vue';\n\nexport default defineComponent({\n components: {\n APolicies, \n APermissionPolicyAssignment, \n APolicyInlineInfo, \n APolicySummary, \n },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const detailPolicy = ref<Policy | null>(null);\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && detailPolicy.value) {\n detailPolicy.value = null;\n }\n };\n\n onMounted(() => {\n document.addEventListener('keydown', handleKeydown);\n });\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown);\n });\n\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'item')));\n\n return { detailPolicy, forwardedSlots };\n },\n});\n</script>\n<template>\n <div>\n <APolicies :query=\"{ filters: { parent_id: null } }\">\n <template #item=\"{ data }\">\n <div>{{ data.name }}</div>\n <APolicyInlineInfo\n :entity=\"data\"\n @detail=\"detailPolicy = $event\"\n />\n <div class=\"ms-auto\">\n <APermissionPolicyAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :policy-id=\"data.id\"\n />\n </div>\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APolicies>\n\n <Teleport\n v-if=\"detailPolicy\"\n to=\"body\"\n >\n <div\n class=\"modal-backdrop fade show\"\n @click=\"detailPolicy = null\"\n />\n <div\n class=\"modal fade show d-block\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"`policy-detail-modal-${detailPolicy.id}`\"\n >\n <div\n class=\"modal-dialog\"\n role=\"document\"\n @click.stop\n >\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5\n :id=\"`policy-detail-modal-${detailPolicy.id}`\"\n class=\"modal-title\"\n >\n {{ detailPolicy.name }}\n </h5>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n @click=\"detailPolicy = null\"\n />\n </div>\n <div class=\"modal-body\">\n <APolicySummary :entity=\"detailPolicy\" />\n </div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n class=\"btn btn-secondary btn-xs\"\n @click=\"detailPolicy = null\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n robotId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.robot_id === props.robotId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RobotPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROBOT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n robotId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.robot_id === props.robotId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RobotPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROBOT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const ARobot = defineComponent({\n props: defineEntityVProps<Robot>(),\n emits: defineEntityVEmitOptions<Robot>(),\n slots: Object as SlotsType<EntityVSlots<Robot>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID } from '@authup/kit';\nimport useVuelidate from '@vuelidate/core';\nimport type {\n PropType,\n VNodeArrayChildren,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n reactive,\n ref,\n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Realm, Robot } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n} from '@vuecs/form-controls';\nimport { SlotName } from '@vuecs/list-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n renderToggleButton,\n} from '../../utility';\n\nimport { ARealms } from '../realm';\n\nexport const ARobotForm = defineComponent({\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: {\n type: Object as PropType<Robot>,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Robot>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n realm_id: '',\n secret: '',\n });\n\n const $v = useVuelidate({\n name: {\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n realm_id: { required },\n secret: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n }, form);\n\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed(() => !!props.name && props.name.length > 0);\n const isRealmLocked = computed(() => !!props.realmId);\n const isSecretHashed = computed(\n () => manager.data.value && manager.data.value.secret === form.secret && form.secret.startsWith('$'),\n );\n\n const generateSecret = () => {\n form.secret = createNanoID(64);\n };\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n if (props.realmId) {\n form.realm_id = props.realmId;\n }\n\n assignFormProperties(form, manager.data.value);\n\n if (form.secret.length === 0) {\n generateSecret();\n }\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate({\n ...form,\n secret: isSecretHashed.value ? '' : form.secret,\n });\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.HASHED },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.SECRET },\n ],\n );\n\n const render = () => {\n const name = buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: { disabled: isNameFixed.value },\n }),\n });\n\n const displayName = buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n });\n\n let id : VNodeArrayChildren = [];\n\n if (manager.data.value) {\n id = [\n buildFormGroup({\n label: true,\n labelContent: 'ID',\n content: buildFormInput({\n value: manager.data.value.id,\n props: { disabled: true },\n }),\n }),\n ];\n }\n\n const secret = buildFormGroup({\n validationMessages: translationsValidation.secret.value,\n validationSeverity: getVuelidateSeverity($v.value.secret),\n label: true,\n labelContent: [\n translationsDefault[TranslatorTranslationDefaultKey.SECRET].value,\n isSecretHashed.value ? h('span', { class: 'text-danger font-weight-bold ps-1' }, [\n translationsDefault[TranslatorTranslationDefaultKey.HASHED].value,\n ' ',\n h('i', { class: 'fa fa-exclamation-triangle ps-1' }),\n ]) : '',\n ],\n content: buildFormInput({\n value: $v.value.secret.$model,\n onChange(input) {\n $v.value.secret.$model = input;\n },\n }),\n });\n\n const secretInfo = h('div', [\n h('button', {\n class: 'btn btn-dark btn-xs',\n onClick($event: any) {\n $event.preventDefault();\n\n generateSecret.call(null);\n },\n }, [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n translationsDefault[TranslatorTranslationDefaultKey.GENERATE].value,\n ]),\n ]);\n\n const submitForm = buildFormSubmitWithTranslations({\n busy: busy.value,\n submit,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit);\n\n const leftColumn = h('div', { class: 'col' }, [\n id,\n name,\n displayName,\n secret,\n secretInfo,\n h('hr'),\n submitForm,\n ]);\n\n let rightColumn : VNodeArrayChildren = [];\n\n if (\n !isRealmLocked.value\n ) {\n const realm = h(ARealms, {}, {\n [SlotName.ITEM_ACTIONS]: (\n props: {\n data: Realm,\n busy: boolean \n },\n ) => renderToggleButton({\n value: form.realm_id === props.data.id,\n isBusy: props.busy,\n changed(value) {\n if (value) {\n form.realm_id = props.data.id;\n } else {\n form.realm_id = '';\n }\n },\n }),\n });\n\n rightColumn = [\n h('div', { class: 'col' }, [\n realm,\n ]),\n ];\n }\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, [\n h('div', { class: 'row' }, [\n leftColumn,\n rightColumn,\n ]),\n ]);\n };\n\n return () => render();\n },\n});\n\nexport default ARobotForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Robot } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup, \n TranslatorTranslationVuecsKey, \n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const ARobots = defineComponent({\n props: defineEntityCollectionVProps<Robot>(),\n emits: defineEntityCollectionVEmitOptions<Robot>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Robot>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.ROBOT}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationDefaultKey.ROBOTS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport ARobotPermissionAssignment from '../robot-permission/ARobotPermissionAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport ARobotPermissionAssignment from '../robot-permission/ARobotPermissionAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RolePermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n roleId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RolePermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROLE_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.permission_id === props.permissionId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n role_id: props.roleId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RolePermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROLE_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RolePermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n roleId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RolePermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROLE_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.permission_id === props.permissionId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n role_id: props.roleId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RolePermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROLE_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARolePermissionAssignment from './ARolePermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARolePermissionAssignment from './ARolePermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARolePermissionAssignment } from '../role-permission';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARolePermissionAssignment } from '../role-permission';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n userId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: UserPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.USER_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n userId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: UserPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.USER_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AUserPermissionAssignment from './AUserPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AUserPermissionAssignment from './AUserPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { User } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AUser = defineComponent({\n props: defineEntityVProps<User>(),\n emits: defineEntityVEmitOptions<User>(),\n slots: Object as SlotsType<EntityVSlots<User>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, User } from '@authup/core-kit';\nimport { EntityType, buildUserFakeEmail, isUserFakeEmail } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport { SlotName } from '@vuecs/list-controls';\nimport useVuelidate from '@vuelidate/core';\nimport {\n email, \n maxLength, \n minLength, \n required,\n} from '@vuelidate/validators';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive, \n ref, \n watch,\n} from 'vue';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup, \n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations, \n createFormSubmitTranslations, \n getVuelidateSeverity, \n useTranslationsForGroup, \n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n renderToggleButton,\n} from '../../utility';\nimport { ARealms } from '../realm';\n\nexport const AUserForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<User | null>,\n default: undefined,\n },\n realmId: {\n type: String as PropType<string | null>,\n default: undefined,\n },\n canManage: {\n type: Boolean,\n default: true,\n },\n },\n emits: defineEntityVEmitOptions<User>(),\n async setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n active: true,\n name: '',\n name_locked: false,\n display_name: '',\n email: '',\n realm_id: '',\n });\n\n const $v = useVuelidate({\n active: {},\n name: {\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n name_locked: {},\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n email: {\n minLength: minLength(5),\n maxLength: maxLength(255),\n email,\n required,\n },\n realm_id: { required },\n }, form);\n\n const manager = defineEntityManager({\n type: `${EntityType.USER}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isRealmLocked = computed(() => !!props.realmId);\n\n function initForm() {\n if (props.realmId) {\n form.realm_id = props.realmId;\n }\n\n if (\n !!manager.data.value &&\n typeof manager.data.value.name_locked !== 'undefined'\n ) {\n form.name_locked = manager.data.value.name_locked;\n }\n\n assignFormProperties(form, manager.data.value);\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity ?? undefined;\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.ACTIVE },\n { key: TranslatorTranslationDefaultKey.INACTIVE },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.EMAIL },\n { key: TranslatorTranslationDefaultKey.LOCKED },\n { key: TranslatorTranslationDefaultKey.NOT_LOCKED },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n ],\n );\n\n const render = () => {\n const name = buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n\n if (!$v.value.email.$model || isUserFakeEmail($v.value.email.$model)) {\n $v.value.email.$model = buildUserFakeEmail(input);\n }\n },\n props: { disabled: form.name_locked },\n }),\n });\n\n const displayName = buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n });\n\n const email = buildFormGroup({\n validationMessages: translationsValidation.email.value,\n validationSeverity: getVuelidateSeverity($v.value.email),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.EMAIL].value,\n content: buildFormInput({\n value: $v.value.email.$model,\n props: {\n type: 'email',\n placeholder: '...@...',\n },\n onChange(value) {\n $v.value.email.$model = value;\n },\n }),\n });\n\n let checks : VNodeArrayChildren = [];\n\n if (props.canManage) {\n let nameLock : VNodeArrayChildren = [];\n if (props.entity) {\n nameLock = [\n buildFormInputCheckbox({\n groupClass: 'form-switch mt-3',\n labelContent: h('span', {\n class: {\n 'text-warning': !form.name_locked,\n 'text-success': form.name_locked,\n },\n }, [form.name_locked ?\n translationsDefault[TranslatorTranslationDefaultKey.LOCKED].value :\n translationsDefault[TranslatorTranslationDefaultKey.NOT_LOCKED].value]), // todo: add translation\n value: form.name_locked,\n onChange(input) {\n form.name_locked = input;\n },\n }),\n ];\n }\n\n checks = [\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n buildFormInputCheckbox({\n groupClass: 'form-switch mt-3',\n labelContent: h('span', {\n class: {\n 'text-danger': !form.active,\n 'text-success': form.active,\n },\n }, [form.active ?\n translationsDefault[TranslatorTranslationDefaultKey.ACTIVE].value :\n translationsDefault[TranslatorTranslationDefaultKey.INACTIVE].value]),\n value: form.active,\n onChange(input) {\n form.active = input;\n },\n }),\n ]),\n h('div', { class: 'col' }, [\n nameLock,\n ]),\n ]),\n\n ];\n }\n\n const submitForm = buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit);\n\n const leftColumn = h('div', { class: 'col' }, [\n name,\n displayName,\n email,\n checks,\n h('hr'),\n submitForm,\n ]);\n\n let rightColumn : VNodeArrayChildren = [];\n\n if (\n props.canManage &&\n !isRealmLocked.value\n ) {\n const realm = h(ARealms, {}, {\n [SlotName.ITEM_ACTIONS]: (props: {\n data: Realm,\n busy: boolean \n }) => renderToggleButton({\n value: form.realm_id === props.data.id,\n isBusy: props.busy,\n changed(value) {\n if (value) {\n form.realm_id = props.data.id;\n } else {\n form.realm_id = '';\n }\n },\n }),\n });\n\n rightColumn = [\n h('div', { class: 'col' }, [\n realm,\n ]),\n ];\n }\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, [\n h('div', { class: 'row' }, [\n leftColumn,\n rightColumn,\n ]),\n ]);\n };\n\n return () => render();\n },\n});\n\nexport default AUserForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { User } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const AUsers = defineComponent({\n props: defineEntityCollectionVProps<User>(),\n emits: defineEntityCollectionVEmitOptions<User>(),\n slots: Object as SlotsType<EntityCollectionVSlots<User>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.USER}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.USERS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AUsers;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport useVuelidate from '@vuelidate/core';\nimport {\n maxLength, \n minLength, \n required, \n sameAs,\n} from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport {\n defineComponent, \n h, \n reactive, \n ref, \n toRef,\n} from 'vue';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport {\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations, \n getVuelidateSeverity,\n injectHTTPClient,\n useTranslationsForNestedValidation,\n wrapFnWithBusyState,\n} from '../../../core';\n\nexport const AUserPasswordForm = defineComponent({\n props: {\n id: {\n type: String as PropType<string | null>,\n default: undefined,\n },\n },\n emits: ['created', 'deleted', 'updated', 'failed'],\n setup(props, ctx) {\n const apiClient = injectHTTPClient();\n const busy = ref(false);\n const form = reactive({\n password: '',\n password_repeat: '',\n });\n\n const passwordShow = ref(false);\n const passwordRef = toRef(form, 'password');\n\n const $v = useVuelidate({\n password: {\n required,\n minLength: minLength(5),\n maxLength: maxLength(100),\n },\n password_repeat: {\n minLength: minLength(5),\n maxLength: maxLength(100),\n sameAs: sameAs(passwordRef),\n },\n }, form);\n\n const submit = wrapFnWithBusyState(busy, async () => {\n if (!props.id) {\n return;\n }\n\n try {\n const user = await apiClient.user.update(props.id, {\n password: form.password,\n password_repeat: form.password_repeat,\n });\n\n ctx.emit('updated', user);\n } catch (e) {\n if (e instanceof Error) {\n ctx.emit('failed', e);\n }\n }\n });\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n const submitTranslations = createFormSubmitTranslations();\n\n const render = () => {\n const password = buildFormGroup({\n validationMessages: validationMessages.password.value,\n validationSeverity: getVuelidateSeverity($v.value.password),\n label: true,\n labelContent: 'Password',\n content: buildFormInput({\n value: $v.value.password.$model,\n onChange(input) {\n $v.value.password.$model = input;\n },\n props: {\n type: passwordShow.value ? 'text' : 'password',\n autocomplete: 'new-password',\n },\n }),\n });\n\n const passwordRepeat = buildFormGroup({\n validationMessages: validationMessages.password_repeat.value,\n validationSeverity: getVuelidateSeverity($v.value.password_repeat),\n label: true,\n labelContent: 'Password repeat',\n content: buildFormInput({\n value: $v.value.password_repeat.$model,\n onChange(input) {\n $v.value.password_repeat.$model = input;\n },\n props: {\n type: passwordShow.value ? 'text' : 'password',\n autocomplete: 'new-password',\n },\n }),\n });\n\n const showPassword = buildFormInputCheckbox({\n groupClass: 'mt-3',\n labelContent: [\n 'Password ',\n (passwordShow.value ? 'hide' : 'show'),\n ],\n value: passwordShow.value,\n onChange(input) {\n passwordShow.value = input;\n },\n });\n\n const submitButton = buildFormSubmitWithTranslations({\n submit,\n isEditing: true,\n invalid: $v.value.$invalid,\n }, submitTranslations);\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, [\n password,\n passwordRepeat,\n showPassword,\n submitButton,\n ]);\n };\n\n return () => render();\n },\n});\n\nexport default AUserPasswordForm;\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserPermissionAssignment } from '../user-permission';\nimport { AUsers } from '../user';\n\nexport default defineComponent({\n components: { AUsers, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserPermissionAssignment } from '../user-permission';\nimport { AUsers } from '../user';\n\nexport default defineComponent({\n components: { AUsers, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARobotPermissionAssignment from './ARobotPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARobotPermissionAssignment from './ARobotPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n robotId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.robot_id === props.robotId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n robotId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.robot_id === props.robotId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport ARobotRoleAssignment from './ARobotRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport ARobotRoleAssignment from './ARobotRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientRoleAssignment } from '../client-role';\n\nexport default defineComponent({\n components: { AClients, AClientRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientRoleAssignment } from '../client-role';\n\nexport default defineComponent({\n components: { AClients, AClientRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ARobotRoleAssignment from '../robot-role/ARobotRoleAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ARobotRoleAssignment from '../robot-role/ARobotRoleAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n userId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_ROLE}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n userId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_ROLE}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AUserRoleAssignment from './AUserRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AUserRoleAssignment from './AUserRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserRoleAssignment } from '../user-role';\nimport { AUsers } from '../user/AUsers';\n\nexport default defineComponent({\n components: { AUsers, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserRoleAssignment } from '../user-role';\nimport { AUsers } from '../user/AUsers';\n\nexport default defineComponent({\n components: { AUsers, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientScopeAssignment } from '../client-scope';\n\nexport default defineComponent({\n components: { AClients, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :scope-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientScopeAssignment } from '../client-scope';\n\nexport default defineComponent({\n components: { AClients, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :scope-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport * from './client';\nexport * from './client-permission';\nexport * from './client-role';\nexport * from './client-scope';\nexport * from './identity-provider';\nexport * from './identity-provider-role';\nexport * from './policy';\nexport * from './permission';\nexport * from './permission-client';\nexport * from './permission-policy-binding';\nexport * from './permission-policy';\nexport * from './permission-robot';\nexport * from './permission-role';\nexport * from './permission-user';\nexport * from './realm';\nexport * from './robot';\nexport * from './robot-permission';\nexport * from './robot-role';\nexport * from './role';\nexport * from './role-client';\nexport * from './role-permission';\nexport * from './role-robot';\nexport * from './user-permission';\nexport * from './role-user';\nexport * from './scope';\nexport * from './scope-client';\nexport * from './user';\nexport * from './user-role';\n","/*\n * Copyright (c) 2024-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport installFormControl from '@vuecs/form-controls';\nimport { installStoreManager } from '@vuecs/form-controls/core';\nimport installPagination from '@vuecs/pagination';\nimport type { App, Component } from 'vue';\nimport * as components from './components/entities';\nimport {\n installHTTPClient, \n installHTTPClientAuthenticationHook,\n installSocketManager,\n installStore,\n installTranslator,\n} from './core';\nimport type { Options } from './types';\n\nexport function installComponents(app: App, input?: boolean | string[]) {\n if (typeof input === 'undefined' || input === false) {\n return;\n }\n\n if (typeof input === 'boolean') {\n Object.entries(components)\n .forEach(([componentName, component]) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n app.component(componentName, component as Component);\n });\n\n return;\n }\n\n Object.entries(components)\n .forEach(([componentName, component]) => {\n if (input.includes(componentName)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n app.component(componentName, component as Component);\n }\n });\n}\n\nexport function install(app: App, options: Options): void {\n if (options.realtime) {\n installSocketManager(app, {\n pinia: options.pinia,\n baseURL: options.realtimeURL || options.baseURL,\n });\n }\n\n installStore(app, {\n pinia: options.pinia,\n baseURL: options.baseURL,\n cookieSet: options.cookieSet,\n cookieGet: options.cookieGet,\n cookieUnset: options.cookieUnset,\n });\n\n installHTTPClientAuthenticationHook(app, {\n pinia: options.pinia,\n baseURL: options.baseURL,\n isServer: options.isServer,\n });\n\n installHTTPClient(app, {\n pinia: options.pinia,\n baseURL: options.baseURL,\n isServer: options.isServer,\n });\n\n installTranslator(app, { locale: options.translatorLocale });\n\n installComponents(app, options.components);\n\n installStoreManager(app);\n\n app.use(installFormControl);\n app.use(installPagination);\n}\n","<script lang=\"ts\">\nimport { base64URLEncode } from '@authup/kit';\nimport type { PropType, Ref } from 'vue';\nimport {\n\n computed,\n defineComponent,\n nextTick,\n reactive,\n ref,\n} from 'vue';\nimport type { IdentityProvider, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { IdentityProviderProtocol } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { BuildInput } from 'rapiq';\nimport { injectHTTPClient, injectStore } from '../../core';\nimport { AIdentityProviderIcon, AIdentityProviders, ARealmPicker } from '../entities';\nimport { APagination, ATitle } from '../utility';\n\nexport default defineComponent({\n\n components: {\n\n ARealmPicker,\n APagination,\n ATitle,\n IVuelidate,\n AIdentityProviders,\n AIdentityProviderIcon,\n\n },\n props: { codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> } },\n emits: ['done', 'failed'],\n setup(props, { emit }) {\n const apiClient = injectHTTPClient();\n const store = injectStore();\n\n const form = reactive({\n name: '',\n password: '',\n realm_id: '',\n\n });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n password: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n realm_id: {},\n\n }, form);\n\n const busy = ref(false);\n\n const realmId = computed(() => {\n if (props.codeRequest && props.codeRequest.realm_id) {\n return props.codeRequest.realm_id;\n }\n\n return form.realm_id;\n });\n\n const identityProviderQuery : Ref<BuildInput<IdentityProvider>> = ref({});\n const resetIdentityProviderQuery = () => {\n identityProviderQuery.value = {\n filters: {\n realm_id: realmId.value || '',\n protocol: `!${IdentityProviderProtocol.LDAP}`,\n enabled: true,\n\n },\n };\n };\n\n resetIdentityProviderQuery();\n\n \n const identityProviderRef = ref<null | {\n load:() => Promise<void>,\n [key: string]: unknown\n }>(null);\n const updateIdentityProviderList = () => {\n if (identityProviderRef.value) {\n identityProviderRef.value.load();\n }\n };\n\n const updateRealmId = (realmId: string | string[]) => {\n form.realm_id = Array.isArray(realmId) ? realmId[0] ?? '' : realmId;\n\n resetIdentityProviderQuery();\n\n nextTick(() => {\n updateIdentityProviderList();\n });\n };\n\n const submit = async () => {\n try {\n await store.login({\n name: form.name,\n password: form.password,\n realmId: form.realm_id,\n\n });\n\n emit('done');\n } catch (e: unknown) {\n emit('failed', e instanceof Error ? e.message : 'The login operation failed');\n }\n };\n\n const buildIdentityProviderURL = (id: string) => {\n let authorizeURL = apiClient.identityProvider.getAuthorizeUri(\n id,\n\n );\n\n if (props.codeRequest) {\n const serialized = base64URLEncode(JSON.stringify(props.codeRequest));\n authorizeURL += `?codeRequest=${serialized}`;\n }\n\n return authorizeURL;\n };\n\n return {\n\n updateRealmId,\n\n vuelidate,\n form,\n submit,\n busy,\n\n identityProviderQuery,\n identityProviderRef,\n buildIdentityProviderURL,\n\n };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <h1 class=\"fw-bold\">\n Login\n </h1>\n </div>\n <form @submit.prevent=\"submit\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.password\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Password\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.password.$model\"\n type=\"password\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <VCFormSubmit\n v-model=\"busy\"\n :invalid=\"vuelidate.$invalid\"\n :create-text=\"'Submit'\"\n :create-button-class=\"{value: 'btn btn-sm btn-dark btn-block', presets: { bootstrap: false }}\"\n :create-icon-class=\"'fa-solid fa-right-to-bracket'\"\n :submit=\"submit\"\n />\n\n <hr>\n\n <template v-if=\"!codeRequest || !codeRequest.realm_id\">\n <ARealmPicker\n :value=\"form.realm_id\"\n @change=\"updateRealmId\"\n />\n </template>\n\n <AIdentityProviders\n ref=\"identityProviderRef\"\n :query=\"identityProviderQuery\"\n :footer=\"false\"\n >\n <template #header>\n <ATitle :text=\"'Identity Providers'\" />\n </template>\n <template #footer=\"props\">\n <APagination\n :busy=\"props.busy\"\n :meta=\"props.meta\"\n :load=\"(data?: any) => props.load?.(data)\"\n :total=\"props.total\"\n />\n </template>\n <template #body=\"props\">\n <div class=\"d-flex flex-row\">\n <div\n v-for=\"(item, key) in props.data\"\n :key=\"key\"\n >\n <a\n :href=\"buildIdentityProviderURL(item.id)\"\n class=\"btn btn-dark btn-xs p-2 me-1 identity-provider-box bg-dark\"\n >\n <div class=\"d-flex flex-column\">\n <div class=\"text-center mb-1\">\n <AIdentityProviderIcon\n class=\"fa-2x\"\n :entity=\"item\"\n />\n </div>\n <div>\n {{ item.name }}\n </div>\n </div>\n </a>\n </div>\n </div>\n </template>\n </AIdentityProviders>\n </form>\n </div>\n</template>\n<style scoped>\n.identity-provider-box {\n min-width: 150px;\n}\n</style>\n","<script lang=\"ts\">\nimport { base64URLEncode } from '@authup/kit';\nimport type { PropType, Ref } from 'vue';\nimport {\n\n computed,\n defineComponent,\n nextTick,\n reactive,\n ref,\n} from 'vue';\nimport type { IdentityProvider, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { IdentityProviderProtocol } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { BuildInput } from 'rapiq';\nimport { injectHTTPClient, injectStore } from '../../core';\nimport { AIdentityProviderIcon, AIdentityProviders, ARealmPicker } from '../entities';\nimport { APagination, ATitle } from '../utility';\n\nexport default defineComponent({\n\n components: {\n\n ARealmPicker,\n APagination,\n ATitle,\n IVuelidate,\n AIdentityProviders,\n AIdentityProviderIcon,\n\n },\n props: { codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> } },\n emits: ['done', 'failed'],\n setup(props, { emit }) {\n const apiClient = injectHTTPClient();\n const store = injectStore();\n\n const form = reactive({\n name: '',\n password: '',\n realm_id: '',\n\n });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n password: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n realm_id: {},\n\n }, form);\n\n const busy = ref(false);\n\n const realmId = computed(() => {\n if (props.codeRequest && props.codeRequest.realm_id) {\n return props.codeRequest.realm_id;\n }\n\n return form.realm_id;\n });\n\n const identityProviderQuery : Ref<BuildInput<IdentityProvider>> = ref({});\n const resetIdentityProviderQuery = () => {\n identityProviderQuery.value = {\n filters: {\n realm_id: realmId.value || '',\n protocol: `!${IdentityProviderProtocol.LDAP}`,\n enabled: true,\n\n },\n };\n };\n\n resetIdentityProviderQuery();\n\n \n const identityProviderRef = ref<null | {\n load:() => Promise<void>,\n [key: string]: unknown\n }>(null);\n const updateIdentityProviderList = () => {\n if (identityProviderRef.value) {\n identityProviderRef.value.load();\n }\n };\n\n const updateRealmId = (realmId: string | string[]) => {\n form.realm_id = Array.isArray(realmId) ? realmId[0] ?? '' : realmId;\n\n resetIdentityProviderQuery();\n\n nextTick(() => {\n updateIdentityProviderList();\n });\n };\n\n const submit = async () => {\n try {\n await store.login({\n name: form.name,\n password: form.password,\n realmId: form.realm_id,\n\n });\n\n emit('done');\n } catch (e: unknown) {\n emit('failed', e instanceof Error ? e.message : 'The login operation failed');\n }\n };\n\n const buildIdentityProviderURL = (id: string) => {\n let authorizeURL = apiClient.identityProvider.getAuthorizeUri(\n id,\n\n );\n\n if (props.codeRequest) {\n const serialized = base64URLEncode(JSON.stringify(props.codeRequest));\n authorizeURL += `?codeRequest=${serialized}`;\n }\n\n return authorizeURL;\n };\n\n return {\n\n updateRealmId,\n\n vuelidate,\n form,\n submit,\n busy,\n\n identityProviderQuery,\n identityProviderRef,\n buildIdentityProviderURL,\n\n };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <h1 class=\"fw-bold\">\n Login\n </h1>\n </div>\n <form @submit.prevent=\"submit\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.password\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Password\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.password.$model\"\n type=\"password\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <VCFormSubmit\n v-model=\"busy\"\n :invalid=\"vuelidate.$invalid\"\n :create-text=\"'Submit'\"\n :create-button-class=\"{value: 'btn btn-sm btn-dark btn-block', presets: { bootstrap: false }}\"\n :create-icon-class=\"'fa-solid fa-right-to-bracket'\"\n :submit=\"submit\"\n />\n\n <hr>\n\n <template v-if=\"!codeRequest || !codeRequest.realm_id\">\n <ARealmPicker\n :value=\"form.realm_id\"\n @change=\"updateRealmId\"\n />\n </template>\n\n <AIdentityProviders\n ref=\"identityProviderRef\"\n :query=\"identityProviderQuery\"\n :footer=\"false\"\n >\n <template #header>\n <ATitle :text=\"'Identity Providers'\" />\n </template>\n <template #footer=\"props\">\n <APagination\n :busy=\"props.busy\"\n :meta=\"props.meta\"\n :load=\"(data?: any) => props.load?.(data)\"\n :total=\"props.total\"\n />\n </template>\n <template #body=\"props\">\n <div class=\"d-flex flex-row\">\n <div\n v-for=\"(item, key) in props.data\"\n :key=\"key\"\n >\n <a\n :href=\"buildIdentityProviderURL(item.id)\"\n class=\"btn btn-dark btn-xs p-2 me-1 identity-provider-box bg-dark\"\n >\n <div class=\"d-flex flex-column\">\n <div class=\"text-center mb-1\">\n <AIdentityProviderIcon\n class=\"fa-2x\"\n :entity=\"item\"\n />\n </div>\n <div>\n {{ item.name }}\n </div>\n </div>\n </a>\n </div>\n </div>\n </template>\n </AIdentityProviders>\n </form>\n </div>\n</template>\n<style scoped>\n.identity-provider-box {\n min-width: 150px;\n}\n</style>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n entity: {\n type: Object as PropType<Scope>,\n required: true,\n },\n requested: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n },\n setup(props) {\n const isEnabled = computed(() => props.requested.includes(props.entity.name));\n\n return { isEnabled };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <i\n class=\"fa-solid\"\n :class=\"{\n 'fa-check text-success': isEnabled,\n 'fa-times text-danger': !isEnabled\n }\"\n />\n </div>\n <div>\n <strong>{{ entity.name }}</strong>\n\n <template v-if=\"entity.description\">\n <p>{{ entity.description }}</p>\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n entity: {\n type: Object as PropType<Scope>,\n required: true,\n },\n requested: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n },\n setup(props) {\n const isEnabled = computed(() => props.requested.includes(props.entity.name));\n\n return { isEnabled };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <i\n class=\"fa-solid\"\n :class=\"{\n 'fa-check text-success': isEnabled,\n 'fa-times text-danger': !isEnabled\n }\"\n />\n </div>\n <div>\n <strong>{{ entity.name }}</strong>\n\n <template v-if=\"entity.description\">\n <p>{{ entity.description }}</p>\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, Scope } from '@authup/core-kit';\nimport { deserializeOAuth2Scope } from '@authup/specs';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScope from './AuthorizeScope.vue';\n\nexport default defineComponent({\n components: { AuthorizeScope },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopesAvailable: { type: Array as PropType<Scope[]> },\n scopesRequested: { type: [String, Array] as PropType<string[] | string> },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const scopesRequestedNormalized = computed<string[]>(() => {\n if (!props.scopesRequested) {\n return [];\n }\n\n return Array.isArray(props.scopesRequested) ?\n props.scopesRequested :\n deserializeOAuth2Scope(props.scopesRequested);\n });\n\n const scopesAvailableNormalized = ref<Scope[]>([]);\n\n const resolveScopesAvailable = async () => {\n if (props.scopesAvailable) {\n scopesAvailableNormalized.value = props.scopesAvailable;\n return;\n }\n\n if (props.client.id) {\n const { data: clientScopes } = await httpClient.clientScope.getMany({\n filters: { client_id: props.client.id },\n include: ['scope'],\n });\n\n scopesAvailableNormalized.value = clientScopes.map((clientScope) => clientScope.scope);\n }\n };\n\n Promise.resolve()\n .then(() => resolveScopesAvailable());\n\n return {\n scopesRequestedNormalized,\n scopesAvailableNormalized,\n };\n },\n});\n</script>\n<template>\n <div v-if=\"scopesAvailableNormalized.length > 0\">\n <div>\n This will allow the <strong>{{ client.name }}</strong> application to\n </div>\n <div class=\"flex-column\">\n <template\n v-for=\"item in scopesAvailableNormalized\"\n :key=\"item.id\"\n >\n <AuthorizeScope\n :entity=\"item\"\n class=\"d-flex flex-row gap-1\"\n :requested=\"scopesRequestedNormalized\"\n />\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, Scope } from '@authup/core-kit';\nimport { deserializeOAuth2Scope } from '@authup/specs';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScope from './AuthorizeScope.vue';\n\nexport default defineComponent({\n components: { AuthorizeScope },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopesAvailable: { type: Array as PropType<Scope[]> },\n scopesRequested: { type: [String, Array] as PropType<string[] | string> },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const scopesRequestedNormalized = computed<string[]>(() => {\n if (!props.scopesRequested) {\n return [];\n }\n\n return Array.isArray(props.scopesRequested) ?\n props.scopesRequested :\n deserializeOAuth2Scope(props.scopesRequested);\n });\n\n const scopesAvailableNormalized = ref<Scope[]>([]);\n\n const resolveScopesAvailable = async () => {\n if (props.scopesAvailable) {\n scopesAvailableNormalized.value = props.scopesAvailable;\n return;\n }\n\n if (props.client.id) {\n const { data: clientScopes } = await httpClient.clientScope.getMany({\n filters: { client_id: props.client.id },\n include: ['scope'],\n });\n\n scopesAvailableNormalized.value = clientScopes.map((clientScope) => clientScope.scope);\n }\n };\n\n Promise.resolve()\n .then(() => resolveScopesAvailable());\n\n return {\n scopesRequestedNormalized,\n scopesAvailableNormalized,\n };\n },\n});\n</script>\n<template>\n <div v-if=\"scopesAvailableNormalized.length > 0\">\n <div>\n This will allow the <strong>{{ client.name }}</strong> application to\n </div>\n <div class=\"flex-column\">\n <template\n v-for=\"item in scopesAvailableNormalized\"\n :key=\"item.id\"\n >\n <AuthorizeScope\n :entity=\"item\"\n class=\"d-flex flex-row gap-1\"\n :requested=\"scopesRequestedNormalized\"\n />\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\n/* global window */\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScopes from './AuthorizeScopes.vue';\n\nexport default defineComponent({\n components: { AuthorizeScopes },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopes: { type: Array as PropType<Scope[]> },\n codeRequest: {\n type: Object as PropType<OAuth2AuthorizationCodeRequest>,\n required: true,\n },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const abort = () => {\n const url = new URL(`${props.codeRequest.redirect_uri}`);\n url.searchParams.set('error', 'access_denied');\n url.searchParams.set(\n 'error_description',\n 'The resource owner or authorization server denied the request',\n );\n\n if (props.codeRequest.state) {\n url.searchParams.set('state', props.codeRequest.state);\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = url.href;\n }\n };\n\n const authorize = async () => {\n try {\n const response = await httpClient\n .authorize\n .confirm({\n response_type: props.codeRequest.response_type,\n client_id: props.client.id,\n redirect_uri: props.codeRequest.redirect_uri,\n ...(props.codeRequest.state ? { state: props.codeRequest.state } : {}),\n ...(props.codeRequest.scope ? { scope: props.codeRequest.scope } : {}),\n });\n\n const { url } = response;\n\n if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n } catch {\n // todo: show toast :)\n\n }\n };\n\n return {\n authorize,\n abort,\n };\n },\n});\n</script>\n<template>\n <div class=\"flex-column d-flex gap-2\">\n <div class=\"text-center\">\n <h5 class=\"text-secondary mb-1\">\n Application\n </h5>\n <h1 class=\"fw-bold\">\n {{ client.name }}\n </h1>\n </div>\n\n <AuthorizeScopes\n :client=\"client\"\n :scopes-requested=\"codeRequest.scope\"\n :scopes-available=\"scopes\"\n />\n\n <div class=\"mt-auto\">\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa-solid fa-link\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Once authorized, you will be redirected to: <strong>{{ codeRequest.redirect_uri }}</strong>\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-lock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n This application is governed by the\n <strong>\n {{ client.name }}\n </strong>\n application's Privacy Policy and Terms of Service.\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-clock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Active since {{ client.created_at }}\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-secondary\"\n @click.prevent=\"abort\"\n >\n Abort\n </button>\n </div>\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-primary\"\n @click.prevent=\"authorize\"\n >\n Authorize\n </button>\n </div>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\n/* global window */\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScopes from './AuthorizeScopes.vue';\n\nexport default defineComponent({\n components: { AuthorizeScopes },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopes: { type: Array as PropType<Scope[]> },\n codeRequest: {\n type: Object as PropType<OAuth2AuthorizationCodeRequest>,\n required: true,\n },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const abort = () => {\n const url = new URL(`${props.codeRequest.redirect_uri}`);\n url.searchParams.set('error', 'access_denied');\n url.searchParams.set(\n 'error_description',\n 'The resource owner or authorization server denied the request',\n );\n\n if (props.codeRequest.state) {\n url.searchParams.set('state', props.codeRequest.state);\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = url.href;\n }\n };\n\n const authorize = async () => {\n try {\n const response = await httpClient\n .authorize\n .confirm({\n response_type: props.codeRequest.response_type,\n client_id: props.client.id,\n redirect_uri: props.codeRequest.redirect_uri,\n ...(props.codeRequest.state ? { state: props.codeRequest.state } : {}),\n ...(props.codeRequest.scope ? { scope: props.codeRequest.scope } : {}),\n });\n\n const { url } = response;\n\n if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n } catch {\n // todo: show toast :)\n\n }\n };\n\n return {\n authorize,\n abort,\n };\n },\n});\n</script>\n<template>\n <div class=\"flex-column d-flex gap-2\">\n <div class=\"text-center\">\n <h5 class=\"text-secondary mb-1\">\n Application\n </h5>\n <h1 class=\"fw-bold\">\n {{ client.name }}\n </h1>\n </div>\n\n <AuthorizeScopes\n :client=\"client\"\n :scopes-requested=\"codeRequest.scope\"\n :scopes-available=\"scopes\"\n />\n\n <div class=\"mt-auto\">\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa-solid fa-link\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Once authorized, you will be redirected to: <strong>{{ codeRequest.redirect_uri }}</strong>\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-lock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n This application is governed by the\n <strong>\n {{ client.name }}\n </strong>\n application's Privacy Policy and Terms of Service.\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-clock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Active since {{ client.created_at }}\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-secondary\"\n @click.prevent=\"abort\"\n >\n Abort\n </button>\n </div>\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-primary\"\n @click.prevent=\"authorize\"\n >\n Authorize\n </button>\n </div>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n isError: { type: Boolean },\n message: {\n type: String,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div class=\"flex-column\">\n <div class=\"text-center\">\n <i\n class=\"fa-solid fa-10x\"\n :class=\"{\n 'fa-exclamation text-danger': isError,\n 'fa-info text-info': !isError,\n }\"\n />\n </div>\n <div class=\"text-center fs-6 p-3\">\n {{ message }}\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n isError: { type: Boolean },\n message: {\n type: String,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div class=\"flex-column\">\n <div class=\"text-center\">\n <i\n class=\"fa-solid fa-10x\"\n :class=\"{\n 'fa-exclamation text-danger': isError,\n 'fa-info text-info': !isError,\n }\"\n />\n </div>\n <div class=\"text-center fs-6 p-3\">\n {{ message }}\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { storeToRefs } from 'pinia';\nimport type { PropType, VNodeChild } from 'vue';\nimport {\n Suspense, \n defineComponent, \n h, \n ref,\n} from 'vue';\nimport { injectHTTPClient, injectStore } from '../../../core';\nimport Login from '../Login.vue';\nimport AuthorizeForm from './AuthorizeForm.vue';\nimport AuthorizeText from './AuthorizeText.vue';\n\nconst wrapChild = (child: VNodeChild) => h(\n 'div',\n { class: 'd-flex align-items-center justify-content-center h-100' },\n [\n h(\n 'div',\n { class: 'authorize' },\n [\n child,\n ],\n ),\n ],\n);\n\nexport default defineComponent({\n components: {\n AuthorizeText,\n AuthorizeForm,\n Login,\n },\n props: {\n codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> },\n client: { type: Object as PropType<Client> },\n clientId: { type: String },\n scopes: { type: Array as PropType<Scope[]> },\n error: { type: Object as PropType<Error> },\n },\n emits: ['redirect'],\n setup(props) {\n const httpClient = injectHTTPClient();\n const store = injectStore();\n const { loggedIn } = storeToRefs(store);\n\n const error = ref<Error | null>(null);\n const client = ref<Client | null>(null);\n\n const resolve = async () => {\n if (props.error) {\n error.value = props.error;\n return;\n }\n\n if (props.client) {\n client.value = props.client;\n }\n\n if (props.clientId) {\n try {\n client.value = await httpClient.client.getOne(props.clientId);\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n };\n\n Promise.resolve()\n .then(() => resolve());\n\n return () => {\n if (error.value) {\n return wrapChild(h(AuthorizeText, {\n message: error.value.message,\n isError: true,\n }));\n }\n\n if (!props.codeRequest) {\n return [];\n }\n\n if (!loggedIn.value) {\n return wrapChild(h(Suspense, {}, {\n default: () => h(Login, { codeRequest: props.codeRequest }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n }\n\n if (!client.value) {\n return [];\n }\n\n return wrapChild(h(Suspense, {}, {\n default: () => h(AuthorizeForm, {\n codeRequest: props.codeRequest!,\n client: client.value!,\n scopes: props.scopes,\n }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n };\n },\n});\n</script>\n<style>\n.authorize {\n padding: 1rem;\n background: #E8E8E8;\n min-width: 480px;\n max-width: 100%;\n min-height: 300px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n position: relative;\n border-radius: 5px;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.24);\n}\n</style>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { storeToRefs } from 'pinia';\nimport type { PropType, VNodeChild } from 'vue';\nimport {\n Suspense, \n defineComponent, \n h, \n ref,\n} from 'vue';\nimport { injectHTTPClient, injectStore } from '../../../core';\nimport Login from '../Login.vue';\nimport AuthorizeForm from './AuthorizeForm.vue';\nimport AuthorizeText from './AuthorizeText.vue';\n\nconst wrapChild = (child: VNodeChild) => h(\n 'div',\n { class: 'd-flex align-items-center justify-content-center h-100' },\n [\n h(\n 'div',\n { class: 'authorize' },\n [\n child,\n ],\n ),\n ],\n);\n\nexport default defineComponent({\n components: {\n AuthorizeText,\n AuthorizeForm,\n Login,\n },\n props: {\n codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> },\n client: { type: Object as PropType<Client> },\n clientId: { type: String },\n scopes: { type: Array as PropType<Scope[]> },\n error: { type: Object as PropType<Error> },\n },\n emits: ['redirect'],\n setup(props) {\n const httpClient = injectHTTPClient();\n const store = injectStore();\n const { loggedIn } = storeToRefs(store);\n\n const error = ref<Error | null>(null);\n const client = ref<Client | null>(null);\n\n const resolve = async () => {\n if (props.error) {\n error.value = props.error;\n return;\n }\n\n if (props.client) {\n client.value = props.client;\n }\n\n if (props.clientId) {\n try {\n client.value = await httpClient.client.getOne(props.clientId);\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n };\n\n Promise.resolve()\n .then(() => resolve());\n\n return () => {\n if (error.value) {\n return wrapChild(h(AuthorizeText, {\n message: error.value.message,\n isError: true,\n }));\n }\n\n if (!props.codeRequest) {\n return [];\n }\n\n if (!loggedIn.value) {\n return wrapChild(h(Suspense, {}, {\n default: () => h(Login, { codeRequest: props.codeRequest }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n }\n\n if (!client.value) {\n return [];\n }\n\n return wrapChild(h(Suspense, {}, {\n default: () => h(AuthorizeForm, {\n codeRequest: props.codeRequest!,\n client: client.value!,\n scopes: props.scopes,\n }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n };\n },\n});\n</script>\n<style>\n.authorize {\n padding: 1rem;\n background: #E8E8E8;\n min-width: 480px;\n max-width: 100%;\n min-height: 300px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n position: relative;\n border-radius: 5px;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.24);\n}\n</style>\n","import type { Plugin } from 'vue';\nimport { install } from './module';\nimport type { Options } from './types';\n\nexport * from './components';\nexport * from './composables';\nexport * from './core';\nexport * from './types';\n\nexport { install };\n\nexport default { install } satisfies Plugin<Options | undefined>;\n"],"x_google_ignoreList":[7],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["_inject","sym","sym","storeToRefs","_useTranslation","_useTranslationsForBaseValidation","_useTranslationsForNestedValidations","isObject","buildPagination","_buildPagination","buildPagination","create","create","isObject","isObject","APolicySummary","APolicyInlineInfo","elements","AIdentityProviderOAuth2EndpointFields","AIdentityProviderPicker","components"],"sources":["../src/components/utility/form-input-list/AFormInputListItem.vue","../src/components/utility/form-input-list/AFormInputListItem.vue","../src/core/inject.ts","../src/core/provide.ts","../src/core/http-client/authentication-hook/singleton.ts","../src/core/store/constants.ts","../src/core/store/dispatcher/constants.ts","../../../node_modules/@posva/event-emitter/dist/index.js","../src/core/store/dispatcher/module.ts","../src/core/store/dispatcher/singleton.ts","../src/core/store/create.ts","../src/core/store/singleton.ts","../src/core/store/install.ts","../src/core/store/utils.ts","../src/core/http-client/authentication-hook/install.ts","../src/core/http-client/singleton.ts","../src/core/http-client/install.ts","../src/core/form/properties.ts","../src/core/translator/constants.ts","../src/core/translator/singleton.ts","../src/core/translator/helpers.ts","../src/core/translator/de/client.ts","../src/core/translator/de/default.ts","../src/core/vuelidate.ts","../src/core/translator/de/vuelidate.ts","../src/core/translator/de/vuecs.ts","../src/core/translator/en/client.ts","../src/core/translator/en/default.ts","../src/core/translator/en/vuelidate.ts","../src/core/translator/en/vuecs.ts","../src/core/translator/install.ts","../src/core/form/submit.ts","../src/core/query/sort.ts","../src/core/busy.ts","../src/core/permission-check/module.ts","../src/core/socket-manager/singleton.ts","../src/core/socket-manager/install.ts","../src/core/slot.ts","../src/components/utility/translation/ATranslation.ts","../src/components/utility/translation/ATranslationDefault.vue","../src/components/utility/translation/ATranslationDefault.vue","../src/components/utility/form-input-list/AFormInputList.vue","../src/components/utility/form-input-list/AFormInputList.vue","../src/components/utility/pagination/module.ts","../src/components/utility/pagination/APagination.ts","../src/components/utility/entity/collection/utils/component.ts","../src/components/utility/entity/collection/utils/options.ts","../src/components/utility/entity/collection/utils/handlers.ts","../src/utils/boolable-to-object.ts","../src/components/utility/entity/socket/module.ts","../src/components/utility/entity/collection/module.ts","../src/components/utility/entity/record/error.ts","../src/components/utility/entity/record/helpers.ts","../src/components/utility/entity/record/module.ts","../src/components/utility/toggle-button/AToggleButton.vue","../src/components/utility/toggle-button/AToggleButton.vue","../src/components/utility/toggle-button/module.ts","../src/components/utility/search/module.ts","../src/components/utility/search/ASearch.ts","../src/components/utility/entity/picker/module.ts","../src/components/utility/entity/AEntityDelete.ts","../src/components/utility/title/module.ts","../src/components/utility/title/ATitle.ts","../src/components/utility/LanguageSwitcherDropdown.ts","../src/components/utility/AFormSubmit.ts","../src/components/entities/client/AClient.ts","../src/components/entities/realm/ARealm.ts","../src/composables/is-editing.ts","../src/composables/on-change.ts","../src/composables/updated-at.ts","../src/composables/use-permission-check.ts","../src/components/entities/realm/ARealmForm.ts","../src/components/entities/realm/ARealms.ts","../src/components/entities/realm/ARealmPicker.ts","../src/components/entities/client/AClientForm.vue","../src/components/entities/client/AClientForm.vue","../src/components/entities/client/AClients.ts","../src/components/entities/client/AClientPicker.ts","../src/components/entities/permission/APermission.ts","../src/components/entities/permission/APermissionCheck.ts","../src/components/entities/permission/APermissionForm.ts","../src/components/entities/permission/APermissions.ts","../src/components/entities/policy/APolicies.ts","../src/components/entities/policy/APolicyTypeBadge.vue","../src/components/entities/policy/APolicyTypeBadge.vue","../src/components/entities/policy/APolicyDetailNav.vue","../src/components/entities/policy/APolicyDetailNav.vue","../src/components/entities/policy/APolicyInlineInfo.vue","../src/components/entities/policy/APolicyInlineInfo.vue","../src/components/entities/policy/APolicySummary.vue","../src/components/entities/policy/APolicySummary.vue","../src/components/entities/permission-policy-binding/APermissionPolicyBindingButton.ts","../src/components/entities/client-permission/AClientPermissionAssignment.vue","../src/components/entities/client-permission/AClientPermissionAssignment.vue","../src/components/entities/client-permission/AClientPermissionAssignments.vue","../src/components/entities/client-permission/AClientPermissionAssignments.vue","../src/components/entities/role/ARoleForm.ts","../src/components/entities/role/ARoles.ts","../src/components/entities/role/ARole.ts","../src/components/entities/client-role/AClientRoleAssignment.vue","../src/components/entities/client-role/AClientRoleAssignment.vue","../src/components/entities/client-role/AClientRoleAssignments.vue","../src/components/entities/client-role/AClientRoleAssignments.vue","../src/components/entities/client-scope/AClientScope.ts","../src/components/entities/client-scope/AClientScopes.ts","../src/components/entities/scope/AScopeForm.ts","../src/components/entities/scope/AScopes.ts","../src/components/entities/scope/AScope.ts","../src/components/entities/client-scope/AClientScopeAssignment.vue","../src/components/entities/client-scope/AClientScopeAssignment.vue","../src/components/entities/client-scope/AClientScopeAssignments.vue","../src/components/entities/client-scope/AClientScopeAssignments.vue","../src/components/entities/identity-provider/AIdentityProvider.ts","../src/components/entities/identity-provider/AIdentityProviderBasicFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapConnectionFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapCredentialsFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapGroupFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapUserFields.ts","../src/components/entities/identity-provider/protocol/utils.ts","../src/components/entities/identity-provider/AIdentityProviderProtocol.ts","../src/components/entities/identity-provider/AIdentityProviderLdapForm.ts","../src/components/entities/identity-provider/preset/utils.ts","../src/components/entities/identity-provider/AIdentityProviderPreset.ts","../src/components/entities/identity-provider/AIdentityProviderPicker.vue","../src/components/entities/identity-provider/AIdentityProviderPicker.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2ClientFields.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2Discovery.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2EndpointFields.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2EndpointFields.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2Form.ts","../src/components/entities/identity-provider/AIdentityProviderForm.ts","../src/components/entities/identity-provider/AIdentityProviders.ts","../src/components/entities/identity-provider/AIdentityProviderIcon.vue","../src/components/entities/identity-provider/AIdentityProviderIcon.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignment.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignment.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignments.vue","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignments.vue","../src/components/entities/policy/attribute-names/AAttributeNamesPolicyForm.vue","../src/components/entities/policy/attribute-names/AAttributeNamesPolicyForm.vue","../src/components/entities/policy/APolicyParentAssignment.ts","../src/components/entities/policy/APolicyPicker.vue","../src/components/entities/policy/APolicyPicker.vue","../src/components/entities/policy/composite/ACompositePolicyForm.vue","../src/components/entities/policy/composite/ACompositePolicyForm.vue","../src/components/entities/policy/date/ADatePolicyForm.vue","../src/components/entities/policy/date/ADatePolicyForm.vue","../src/components/entities/policy/identity/AIdentityPolicyForm.vue","../src/components/entities/policy/identity/AIdentityPolicyForm.vue","../src/components/entities/policy/realm-match/ARealmMatchPolicyForm.vue","../src/components/entities/policy/realm-match/ARealmMatchPolicyForm.vue","../src/components/entities/policy/time/ATimePolicyForm.vue","../src/components/entities/policy/time/ATimePolicyForm.vue","../src/components/entities/policy/APolicy.ts","../src/components/entities/policy/APolicyTypePicker.vue","../src/components/entities/policy/APolicyTypePicker.vue","../src/components/entities/policy/APolicyBasicForm.vue","../src/components/entities/policy/APolicyBasicForm.vue","../src/components/entities/policy/APolicyForm.vue","../src/components/entities/policy/APolicyForm.vue","../src/components/entities/permission-client/APermissionClientAssignments.vue","../src/components/entities/permission-client/APermissionClientAssignments.vue","../src/components/entities/permission-policy/APermissionPolicyAssignment.vue","../src/components/entities/permission-policy/APermissionPolicyAssignment.vue","../src/components/entities/permission-policy/APermissionPolicyAssignments.vue","../src/components/entities/permission-policy/APermissionPolicyAssignments.vue","../src/components/entities/robot-permission/ARobotPermissionAssignment.vue","../src/components/entities/robot-permission/ARobotPermissionAssignment.vue","../src/components/entities/robot/ARobot.ts","../src/components/entities/robot/ARobotForm.ts","../src/components/entities/robot/ARobots.ts","../src/components/entities/permission-robot/APermissionRobotAssignments.vue","../src/components/entities/permission-robot/APermissionRobotAssignments.vue","../src/components/entities/role-permission/ARolePermissionAssignment.vue","../src/components/entities/role-permission/ARolePermissionAssignment.vue","../src/components/entities/role-permission/ARolePermissionAssignments.vue","../src/components/entities/role-permission/ARolePermissionAssignments.vue","../src/components/entities/permission-role/APermissionRoleAssignments.vue","../src/components/entities/permission-role/APermissionRoleAssignments.vue","../src/components/entities/user-permission/AUserPermissionAssignment.vue","../src/components/entities/user-permission/AUserPermissionAssignment.vue","../src/components/entities/user-permission/AUserPermissionAssignments.vue","../src/components/entities/user-permission/AUserPermissionAssignments.vue","../src/components/entities/user/AUser.ts","../src/components/entities/user/AUserForm.ts","../src/components/entities/user/AUsers.ts","../src/components/entities/user/AUserPasswordForm.ts","../src/components/entities/permission-user/APermissionUserAssignments.vue","../src/components/entities/permission-user/APermissionUserAssignments.vue","../src/components/entities/robot-permission/ARobotPermissionAssignments.vue","../src/components/entities/robot-permission/ARobotPermissionAssignments.vue","../src/components/entities/robot-role/ARobotRoleAssignment.vue","../src/components/entities/robot-role/ARobotRoleAssignment.vue","../src/components/entities/robot-role/ARobotRoleAssignments.vue","../src/components/entities/robot-role/ARobotRoleAssignments.vue","../src/components/entities/role-client/ARoleClientAssignments.vue","../src/components/entities/role-client/ARoleClientAssignments.vue","../src/components/entities/role-robot/ARoleRobotAssignments.vue","../src/components/entities/role-robot/ARoleRobotAssignments.vue","../src/components/entities/user-role/AUserRoleAssignment.vue","../src/components/entities/user-role/AUserRoleAssignment.vue","../src/components/entities/user-role/AUserRoleAssignments.vue","../src/components/entities/user-role/AUserRoleAssignments.vue","../src/components/entities/role-user/ARoleUserAssignments.vue","../src/components/entities/role-user/ARoleUserAssignments.vue","../src/components/entities/scope-client/AScopeClientAssignments.vue","../src/components/entities/scope-client/AScopeClientAssignments.vue","../src/components/entities/index.ts","../src/module.ts","../src/components/workflows/Login.vue","../src/components/workflows/Login.vue","../src/components/workflows/authorize/AuthorizeScope.vue","../src/components/workflows/authorize/AuthorizeScope.vue","../src/components/workflows/authorize/AuthorizeScopes.vue","../src/components/workflows/authorize/AuthorizeScopes.vue","../src/components/workflows/authorize/AuthorizeForm.vue","../src/components/workflows/authorize/AuthorizeForm.vue","../src/components/workflows/authorize/AuthorizeText.vue","../src/components/workflows/authorize/AuthorizeText.vue","../src/components/workflows/authorize/Authorize.vue","../src/components/workflows/authorize/Authorize.vue","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n<script lang=\"ts\">\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { defineComponent, reactive } from 'vue';\n\nexport default defineComponent({\n components: {\n IVuelidate,\n VCFormInput,\n VCFormGroup, \n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated', 'deleted'],\n setup(props, ctx) {\n const form = reactive({ name: props.name });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(2),\n maxLength: maxLength(512),\n },\n }, form);\n\n const handleUpdated = () => {\n ctx.emit('updated', vuelidate.value.name.$model);\n };\n\n const handleDeleted = () => {\n ctx.emit('deleted');\n };\n\n return {\n handleUpdated,\n handleDeleted,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n >\n <template #groupAppend>\n <button\n :disabled=\"disabled\"\n type=\"button\"\n class=\"btn btn-xs btn-warning\"\n @click.prevent=\"handleDeleted\"\n >\n <i class=\"fa fa-minus\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n<script lang=\"ts\">\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { defineComponent, reactive } from 'vue';\n\nexport default defineComponent({\n components: {\n IVuelidate,\n VCFormInput,\n VCFormGroup, \n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated', 'deleted'],\n setup(props, ctx) {\n const form = reactive({ name: props.name });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(2),\n maxLength: maxLength(512),\n },\n }, form);\n\n const handleUpdated = () => {\n ctx.emit('updated', vuelidate.value.name.$model);\n };\n\n const handleDeleted = () => {\n ctx.emit('deleted');\n };\n\n return {\n handleUpdated,\n handleDeleted,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n >\n <template #groupAppend>\n <button\n :disabled=\"disabled\"\n type=\"button\"\n class=\"btn btn-xs btn-warning\"\n @click.prevent=\"handleDeleted\"\n >\n <i class=\"fa fa-minus\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n</template>\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport { inject as _inject, hasInjectionContext } from 'vue';\n\nexport function inject<T = any>(\n key: string | symbol,\n instance?: App,\n) : T | undefined {\n if (\n instance &&\n instance._context &&\n instance._context.provides &&\n instance._context.provides[key]\n ) {\n return instance._context.provides[key];\n }\n\n if (hasInjectionContext()) {\n return _inject(key, undefined);\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport { provide as _provide } from 'vue';\nimport { inject } from './inject';\n\nexport function provide(\n key: string | symbol,\n value: unknown,\n app?: App,\n) {\n if (typeof app === 'undefined') {\n const val = inject(key);\n if (typeof val !== 'undefined') {\n return;\n }\n\n _provide(key, value);\n\n return;\n }\n\n if (\n app &&\n app._context &&\n app._context.provides &&\n app._context.provides[key]\n ) {\n return;\n }\n\n app.provide(key, value);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport type { ClientAuthenticationHook } from '@authup/core-http-kit';\nimport { inject } from '../../inject';\nimport { provide } from '../../provide';\n\nconst sym = Symbol.for('AuthupHTTPClientAuthenticationHook');\n\nexport function injectHTTPClientAuthenticationHook(app?: App) : ClientAuthenticationHook {\n const instance = inject<ClientAuthenticationHook>(sym, app);\n if (!instance) {\n throw new Error('The http client authentication hook has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function hasHTTPClientAuthenticationHook(app?: App) : boolean {\n try {\n return !!injectHTTPClientAuthenticationHook(app);\n } catch {\n return false;\n }\n}\n\nexport function provideHTTPClientAuthenticationHook(\n refresher: ClientAuthenticationHook,\n app?: App,\n) {\n provide(sym, refresher, app);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const STORE_ID = 'authup';\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum StoreDispatcherEventName {\n LOGGING_IN = 'loggingIn',\n LOGGED_IN = 'loggedIn',\n\n LOGGING_OUT = 'loggingOut',\n LOGGED_OUT = 'loggedOut',\n\n RESOLVING = 'resolving',\n RESOLVED = 'resolved',\n\n ACCESS_TOKEN_UPDATED = 'accessTokenUpdated',\n ACCESS_TOKEN_EXPIRE_DATE_UPDATED = 'accessTokenExpireDateUpdated',\n\n REFRESH_TOKEN_UPDATED = 'refreshTokenUpdated',\n\n USER_UPDATED = 'userUpdated',\n\n REALM_UPDATED = 'realmUpdated',\n REALM_MANAGEMENT_UPDATED = 'realmManagementUpdated',\n}\n","// src/event-emitter.ts\nvar EventEmitter = class {\n /**\n * A Map of event names to registered handler functions.\n */\n all;\n constructor(all) {\n this.all = all || /* @__PURE__ */ new Map();\n }\n on(type, handler) {\n if (!this.all.has(type)) {\n this.all.set(type, []);\n }\n const handlers = this.all.get(type);\n handlers.push(handler);\n return () => handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n }\n off(type, handler) {\n if (!type) {\n return this.all.clear();\n }\n const handlers = this.all.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n this.all.delete(type);\n }\n }\n }\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing `'*'` handlers is not supported.\n *\n * @param type The event type to invoke\n * @param payload Any value to each handler\n */\n emit(type, ...payload) {\n let handlers = this.all.get(type);\n handlers?.slice().map((handler) => {\n handler(...payload);\n });\n handlers = this.all.get(\"*\");\n if (handlers) {\n handlers.slice().map((handler) => {\n handler(type, payload);\n });\n }\n }\n};\nexport {\n EventEmitter\n};\n//# sourceMappingURL=index.js.map","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EventEmitter } from '@posva/event-emitter';\nimport type { StoreDispatcher, StoreDispatcherEvents } from './types';\n\nexport function createStoreDispatcher() : StoreDispatcher {\n return new EventEmitter<StoreDispatcherEvents>();\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport { inject } from '../../inject';\nimport { provide } from '../../provide';\nimport type { StoreDispatcher } from './types';\n\nconst sym = Symbol.for('AuthupStoreEventBus');\n\nexport function injectStoreDispatcher(app?: App) : StoreDispatcher {\n const instance = inject<StoreDispatcher>(sym, app);\n if (!instance) {\n throw new Error('The store dispatcher has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function provideStoreDispatcher(eventBus: StoreDispatcher, app?: App) {\n provide(sym, eventBus, app);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n PermissionEvaluator,\n PermissionMemoryProvider,\n PolicyEngine,\n} from '@authup/access';\nimport { OAuth2Error } from '@authup/specs';\nimport { computed, ref } from 'vue';\nimport type {\n OAuth2TokenGrantResponse,\n OAuth2TokenIntrospectionResponse,\n} from '@authup/specs';\nimport type {\n Realm,\n User,\n} from '@authup/core-kit';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { Client } from '@authup/core-http-kit';\nimport { StoreDispatcherEventName } from './dispatcher';\nimport type { StoreCreateContext, StoreLoginContext } from './types';\n\ntype InputFn = (...args: any[]) => Promise<any>;\ntype OutputFn<F extends InputFn> = (...args: Parameters<F>) => Promise<Awaited<ReturnType<F>>>;\n\nfunction createPromiseShareWrapperFn<F extends InputFn>(\n fn: F,\n) : OutputFn<F> {\n let promise : Promise<Awaited<ReturnType<F>>> | undefined;\n\n return (...args: Parameters<F>) => {\n if (promise) {\n return promise;\n }\n\n promise = new Promise<Awaited<ReturnType<F>>>(\n (resolve, reject) => {\n fn(...args)\n .then((r) => resolve(r))\n .catch((e) => reject(e));\n },\n );\n\n promise.finally(() => {\n setTimeout(() => {\n promise = undefined;\n }, 0);\n });\n\n return promise;\n };\n}\n\ntype RealmMinimal = Pick<Realm, 'id' | 'name'>;\n\nexport function createStore(context: StoreCreateContext) {\n const client = new Client({ baseURL: context.baseURL });\n\n const cookiesRead = ref<boolean>(false);\n const setCookiesRead = (value: boolean) => {\n cookiesRead.value = value;\n };\n\n // --------------------------------------------------------------------\n\n const accessToken = ref<string | null>(null);\n const setAccessToken = (input: string | null) => {\n accessToken.value = input;\n\n context.dispatcher.emit(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n input,\n );\n };\n\n // --------------------------------------------------------------------\n\n const accessTokenExpireDate = ref<Date | null>(null);\n const setAccessTokenExpireDate = (input: Date | number | string | null) => {\n if (typeof input === 'number' || typeof input === 'string') {\n accessTokenExpireDate.value = new Date(input); // verify microseconds or seconds\n } else {\n accessTokenExpireDate.value = input;\n }\n\n context.dispatcher.emit(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n accessTokenExpireDate.value,\n );\n };\n\n // --------------------------------------------------------------------\n\n const refreshToken = ref<string | null>(null);\n const setRefreshToken = (input: string | null) => {\n refreshToken.value = input;\n\n context.dispatcher.emit(\n StoreDispatcherEventName.REFRESH_TOKEN_UPDATED,\n input,\n );\n };\n\n // --------------------------------------------------------------------\n\n const user = ref<User | null>(null);\n const userId = computed<string | null>(() => (user.value ? user.value.id : null));\n\n const setUser = (input: User | null) => {\n user.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.USER_UPDATED, input);\n };\n\n // --------------------------------------------------------------------\n\n const realm = ref<RealmMinimal | null>(null);\n const realmId = computed<string | undefined>(() => (realm.value ? realm.value.id : undefined));\n const realmName = computed<string | undefined>(() => (realm.value ? realm.value.name : undefined));\n const realmIsRoot = computed<boolean>(() => {\n if (realm.value) {\n return realm.value.name === REALM_MASTER_NAME;\n }\n\n return false;\n });\n\n const setRealm = (input: RealmMinimal | null) => {\n realm.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.REALM_UPDATED, input);\n };\n\n const realmManagement = ref<RealmMinimal | null>(null);\n const realmManagementId = computed<string | undefined>(() => (realmManagement.value ? realmManagement.value.id : realmId.value));\n const realmManagementName = computed<string | undefined>(() => (realmManagement.value ? realmManagement.value.name : realmName.value));\n\n const setRealmManagement = (input: RealmMinimal | null) => {\n realmManagement.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, input);\n };\n\n // --------------------------------------------------------------------\n\n const permissionProvider = new PermissionMemoryProvider();\n const permissionEvaluator = new PermissionEvaluator({\n provider: permissionProvider,\n policyEngine: new PolicyEngine(),\n });\n\n // --------------------------------------------------------------------\n\n const cleanup = async () => {\n const tempAccessToken = accessToken.value;\n const tempRefreshToken = refreshToken.value;\n\n setAccessToken(null);\n setAccessTokenExpireDate(null);\n setRefreshToken(null);\n setUser(null);\n setRealm(null);\n setRealmManagement(null);\n\n permissionProvider.setMany([]);\n\n tokenResolved.value = false;\n userResolved.value = false;\n\n try {\n if (tempAccessToken) {\n await client.token.revoke({ token: tempAccessToken });\n }\n } catch {\n // ...\n }\n\n try {\n if (tempRefreshToken) {\n await client.token.revoke({ token: tempRefreshToken });\n }\n } catch {\n // ...\n }\n };\n\n // --------------------------------------------------------------------\n\n const userResolved = ref(false);\n const resolveUser = async () : Promise<void> => {\n if (!accessToken.value || userResolved.value) {\n return Promise.resolve();\n }\n\n userResolved.value = true;\n\n return client.userInfo.get<User>(`Bearer ${accessToken.value}`)\n .then((response) => {\n setUser(response);\n });\n };\n\n // --------------------------------------------------------------------\n\n const tokenResolved = ref(false);\n const resolveToken = async () : Promise<void> => {\n if (!accessToken.value || tokenResolved.value) {\n return Promise.resolve();\n }\n\n tokenResolved.value = true;\n\n return client.token.introspect<OAuth2TokenIntrospectionResponse>({ token: accessToken.value }, {\n authorizationHeader: {\n type: 'Bearer',\n token: accessToken.value,\n },\n })\n .then((response) => {\n if (response.exp) {\n const expireDate = new Date(response.exp * 1000);\n setAccessTokenExpireDate(expireDate);\n }\n\n if (\n response.realm_id &&\n response.realm_name\n ) {\n realm.value = {\n id: response.realm_id,\n name: response.realm_name,\n };\n\n if (!realmManagement.value) {\n setRealmManagement(realm.value);\n }\n }\n\n if (response.permissions) {\n permissionProvider.setMany(response.permissions.map((permission) => ({\n permission: {\n name: permission.name,\n realm_id: permission.realm_id,\n client_id: permission.client_id,\n },\n })));\n }\n });\n };\n\n // --------------------------------------------------------------------\n\n const applyTokenGrantResponse = (\n response: OAuth2TokenGrantResponse,\n ) => {\n const expireDate = new Date(Date.now() + response.expires_in * 1000);\n\n setAccessTokenExpireDate(expireDate);\n setAccessToken(response.access_token);\n\n if (response.refresh_token) {\n setRefreshToken(response.refresh_token);\n } else {\n setRefreshToken(null);\n }\n };\n\n // --------------------------------------------------------------------\n\n const refreshSession = createPromiseShareWrapperFn(\n async (): Promise<void> => {\n if (!refreshToken.value) {\n throw new OAuth2Error('The access token can not be renewed.');\n }\n\n try {\n const response = await client.token.createWithRefreshToken({ refresh_token: refreshToken.value });\n\n applyTokenGrantResponse(response);\n } catch (e) {\n await cleanup();\n\n throw e;\n } finally {\n tokenResolved.value = false;\n userResolved.value = false;\n }\n },\n );\n\n // --------------------------------------------------------------------\n\n // todo: rename to reload() ?\n const resolveInternal = async () : Promise<void> => {\n context.dispatcher.emit(StoreDispatcherEventName.RESOLVING);\n\n try {\n if (\n !accessToken.value &&\n refreshToken.value\n ) {\n await refreshSession();\n }\n\n if (accessToken.value) {\n await resolveToken();\n\n if (!user.value) {\n await resolveUser();\n }\n }\n } catch (e) {\n if (refreshToken.value) {\n await refreshSession();\n await resolveToken();\n await resolveUser();\n } else {\n throw e;\n }\n }\n\n context.dispatcher.emit(StoreDispatcherEventName.RESOLVED);\n };\n\n const resolve = createPromiseShareWrapperFn(resolveInternal);\n\n const loggedIn = computed<boolean>(() => !!accessToken.value);\n const login = async (ctx: StoreLoginContext) => {\n context.dispatcher.emit(StoreDispatcherEventName.LOGGING_IN);\n\n const response = await client.token.createWithPassword({\n username: ctx.name,\n password: ctx.password,\n ...(realmId.value ? { realm_id: ctx.realmId } : {}),\n });\n\n applyTokenGrantResponse(response);\n\n await resolveToken();\n await resolveUser();\n\n context.dispatcher.emit(StoreDispatcherEventName.LOGGED_IN);\n };\n\n const exchangeAuthorizationCode = async (code: string) => {\n const response = await client.token.createWithAuthorizationCode({ code });\n\n await cleanup();\n\n applyTokenGrantResponse(response);\n\n await resolveToken();\n await resolveUser();\n };\n\n const logout = async () => {\n context.dispatcher.emit(StoreDispatcherEventName.LOGGING_OUT);\n\n await cleanup();\n\n context.dispatcher.emit(StoreDispatcherEventName.LOGGED_OUT);\n };\n\n return {\n cookiesRead,\n setCookiesRead,\n\n permissionEvaluator,\n\n login,\n logout,\n loggedIn,\n resolve,\n exchangeAuthorizationCode,\n\n applyTokenGrantResponse,\n accessToken,\n setAccessToken,\n accessTokenExpireDate,\n setAccessTokenExpireDate,\n refreshToken,\n setRefreshToken,\n\n realm,\n realmId,\n realmIsRoot,\n realmName,\n setRealm,\n\n realmManagement,\n realmManagementId,\n realmManagementName,\n setRealmManagement,\n\n user,\n userId,\n setUser,\n };\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Pinia } from 'pinia';\nimport type { App } from 'vue';\nimport { inject } from '../inject';\nimport { provide } from '../provide';\nimport type { Store, StoreDefinition } from './types';\n\nconst sym = Symbol.for('AuthupStore');\n\nexport function injectStore(pinia?: Pinia, app?: App) : Store {\n const instance = injectStoreFactory(app);\n if (!instance) {\n throw new Error('The store has not been injected in the app context.');\n }\n\n return instance(pinia);\n}\n\nexport function injectStoreFactory(app?: App) : StoreDefinition {\n const instance = inject<StoreDefinition>(sym, app);\n if (!instance) {\n throw new Error('The store factory has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function hasStoreFactory(app?: App) : boolean {\n return !!inject(sym, app);\n}\n\nexport function provideStoreFactory(store: StoreDefinition, app?: App) {\n provide(sym, store, app);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { CookieName } from '@authup/core-http-kit';\nimport { useCookies } from '@vueuse/integrations/useCookies';\nimport { defineStore } from 'pinia';\nimport type { App } from 'vue';\nimport type {\n CookieGetFn, \n CookieOptions, \n CookieSetFn, \n CookieUnsetFn,\n} from '../../types';\nimport { STORE_ID } from './constants';\nimport { createStore } from './create';\nimport { StoreDispatcherEventName, createStoreDispatcher, provideStoreDispatcher } from './dispatcher';\nimport { hasStoreFactory, provideStoreFactory } from './singleton';\nimport type { StoreInstallOptions } from './types';\n\nexport function installStore(app: App, options: StoreInstallOptions = {}) {\n if (hasStoreFactory(app)) {\n return;\n }\n\n const storeDispatcher = createStoreDispatcher();\n provideStoreDispatcher(storeDispatcher, app);\n\n const storeFactory = defineStore(\n STORE_ID,\n () => createStore({\n baseURL: options.baseURL,\n dispatcher: storeDispatcher,\n }),\n );\n const store = storeFactory(options.pinia);\n\n let cookieGet : CookieGetFn;\n if (options.cookieGet) {\n cookieGet = options.cookieGet;\n } else {\n const cookies = useCookies();\n cookieGet = cookies.get;\n }\n\n let cookieSet: CookieSetFn;\n if (options.cookieSet) {\n cookieSet = options.cookieSet;\n } else {\n const cookies = useCookies();\n cookieSet = cookies.set;\n }\n\n let cookieUnset : CookieUnsetFn;\n if (options.cookieUnset) {\n cookieUnset = options.cookieUnset;\n } else if (options.cookieSet) {\n cookieUnset = (key: string, opts: CookieOptions) => {\n (options.cookieSet as CookieSetFn)(key, null, opts);\n };\n } else {\n const cookies = useCookies();\n cookieUnset = cookies.remove;\n }\n\n const readCookies = () => {\n if (store.cookiesRead) {\n return;\n }\n\n store.setCookiesRead(true);\n\n const keys = Object.values(CookieName);\n\n let value : any;\n for (const key of keys) {\n value = cookieGet(key);\n if (!value) {\n continue;\n }\n\n switch (key) {\n case CookieName.ACCESS_TOKEN:\n if (!store.accessToken) {\n store.setAccessToken(value);\n }\n break;\n case CookieName.ACCESS_TOKEN_EXPIRE_DATE:\n if (!store.accessTokenExpireDate) {\n store.setAccessTokenExpireDate(value);\n }\n break;\n case CookieName.REFRESH_TOKEN:\n if (!store.refreshToken) {\n store.setRefreshToken(value);\n }\n break;\n case CookieName.USER:\n if (!store.user) {\n store.setUser(value);\n }\n break;\n case CookieName.REALM:\n if (!store.realm) {\n store.setRealm(value);\n }\n break;\n case CookieName.REALM_MANAGEMENT:\n if (!store.realmManagement) {\n store.setRealmManagement(value);\n }\n break;\n }\n }\n };\n\n const maxAgeFn = () => {\n if (!store.accessTokenExpireDate) {\n return undefined;\n }\n\n return Math.floor(\n Math.max(1000, new Date(`${store.accessTokenExpireDate}`).getTime() - Date.now()) /\n 1000,\n );\n };\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.ACCESS_TOKEN_EXPIRE_DATE, input, { maxAge: maxAgeFn() });\n } else {\n cookieUnset(CookieName.ACCESS_TOKEN_EXPIRE_DATE, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n (input) => {\n if (input) {\n const maxAge = maxAgeFn();\n cookieSet(CookieName.ACCESS_TOKEN, input, { maxAge });\n } else {\n cookieUnset(CookieName.ACCESS_TOKEN, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.REFRESH_TOKEN_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.REFRESH_TOKEN, input, {});\n } else {\n cookieUnset(CookieName.REFRESH_TOKEN, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.USER_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.USER, input, {});\n } else {\n cookieUnset(CookieName.USER, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.REALM_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.REALM, input, {});\n } else {\n cookieUnset(CookieName.REALM, {});\n }\n },\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED,\n (input) => {\n if (input) {\n cookieSet(CookieName.REALM_MANAGEMENT, input, {});\n } else {\n cookieUnset(CookieName.REALM_MANAGEMENT, {});\n }\n },\n );\n\n readCookies();\n\n provideStoreFactory(storeFactory, app);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { StoreGeneric, storeToRefs as _storeToRefs } from 'pinia';\nimport {\n isReactive, \n isRef, \n toRaw, \n toRef,\n} from 'vue';\n\nexport type StoreToRefs<T extends StoreGeneric> = ReturnType<typeof _storeToRefs<T>>;\n\nexport function storeToRefs<SS extends StoreGeneric>(\n store: SS,\n): StoreToRefs<SS> {\n store = toRaw(store);\n\n const refs = {} as StoreToRefs<SS>;\n const keys = Object.keys(store);\n for (const key of keys) {\n const value = store[key];\n if (isRef(value) || isReactive(value)) {\n refs[key as (keyof StoreToRefs<SS>)] = toRef(store, key) as any;\n }\n }\n\n return refs;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client, ClientAuthenticationHook, ClientAuthenticationHookEventName } from '@authup/core-http-kit';\nimport type { App } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { hasHTTPClientAuthenticationHook, provideHTTPClientAuthenticationHook } from './singleton';\nimport { StoreDispatcherEventName, injectStoreDispatcher, injectStoreFactory } from '../../store';\nimport type { HTTPClientAuthenticationHookInstallOptions } from './types';\n\nexport function installHTTPClientAuthenticationHook(\n app: App,\n options: HTTPClientAuthenticationHookInstallOptions = {},\n) {\n if (hasHTTPClientAuthenticationHook(app)) {\n return;\n }\n\n const storeFactory = injectStoreFactory(app);\n const store = storeFactory(options.pinia);\n\n const { refreshToken } = storeToRefs(store);\n\n const hook = new ClientAuthenticationHook({\n baseURL: options.baseURL,\n tokenCreator: () => {\n if (!refreshToken.value) {\n throw new Error('No refresh token available.');\n }\n\n const client = new Client({ baseURL: options.baseURL });\n return client.token.createWithRefreshToken({ refresh_token: refreshToken.value });\n },\n timer: !options.isServer,\n });\n\n hook.on(ClientAuthenticationHookEventName.REFRESH_FINISHED, (response) => {\n store.applyTokenGrantResponse(response);\n });\n\n let isSelfCallee = false;\n\n hook.on(ClientAuthenticationHookEventName.HEADER_UNSET, () => {\n if (!isSelfCallee) {\n Promise.resolve()\n .then(() => store.logout());\n }\n });\n\n const storeDispatcher = injectStoreDispatcher(app);\n\n const handleAccessTokenEvent = () => {\n isSelfCallee = true;\n\n if (store.accessToken) {\n hook.enable();\n hook.setAuthorizationHeader({\n type: 'Bearer',\n token: store.accessToken as string,\n });\n } else {\n hook.disable();\n hook.unsetAuthorizationHeader();\n }\n\n isSelfCallee = false;\n };\n\n const handleAccessTokenExpireDateEvent = () => {\n if (store.accessTokenExpireDate) {\n const expiresIn = Math.floor((store.accessTokenExpireDate.getTime() - Date.now()) / 1000);\n hook.setTimer(expiresIn);\n }\n };\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n () => handleAccessTokenEvent(),\n );\n\n storeDispatcher.on(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n () => handleAccessTokenExpireDateEvent(),\n );\n\n handleAccessTokenEvent();\n handleAccessTokenExpireDateEvent();\n\n provideHTTPClientAuthenticationHook(hook, app);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-http-kit';\nimport type { App } from 'vue';\nimport { inject } from '../inject';\nimport { provide } from '../provide';\n\nexport const HTTPClientSymbol = Symbol.for('AuthupHTTPClient');\n\nexport function provideHTTPClient(client: Client, app?: App) {\n provide(HTTPClientSymbol, client, app);\n}\n\nexport function hasHTTPClient(app?: App) : boolean {\n try {\n return !!injectHTTPClient(app);\n } catch {\n return false;\n }\n}\n\nexport function injectHTTPClient(app?: App) {\n const instance = inject<Client>(HTTPClientSymbol, app);\n if (!instance) {\n throw new Error('The api client has not been injected.');\n }\n\n return instance;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client } from '@authup/core-http-kit';\nimport type { App } from 'vue';\nimport { hasHTTPClient, provideHTTPClient } from './singleton';\nimport type { HTTPClientInstallOptions } from './types';\nimport { injectHTTPClientAuthenticationHook } from './authentication-hook';\n\nexport function installHTTPClient(app: App, options: HTTPClientInstallOptions = {}) {\n if (hasHTTPClient(app)) {\n return;\n }\n\n const client = new Client({ baseURL: options.baseURL });\n\n const authenticationHook = injectHTTPClientAuthenticationHook(app);\n authenticationHook.attach(client);\n\n provideHTTPClient(client, app);\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\ntype PartialRecordWithNull<T extends Record<string, any>> = {\n [K in keyof T]?: T[K] | null\n};\n\n/**\n * Assign properties from input to src.\n * 'null' values will be transformed to an empty string.\n *\n * @param src\n * @param input\n */\nexport function assignFormProperties<T extends Record<string, any>>(\n src: T,\n input: PartialRecordWithNull<T> = {},\n) : T {\n const keys : (keyof T)[] = Object.keys(input);\n for (const key of keys) {\n const value = input[key];\n if (value === null) {\n src[key] = '' as T[keyof T];\n } else {\n src[key] = value as T[keyof T];\n }\n }\n\n return src;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum TranslatorTranslationGroup {\n DEFAULT = 'default',\n\n CLIENT = 'authupClient',\n\n VUECS = 'vuecs',\n VUELIDATE = 'vuelidate',\n}\n\nexport enum TranslatorTranslationVuecsKey {\n NO_MORE = 'noMore',\n}\n\nexport enum TranslatorTranslationClientKey {\n NAME_HINT = 'nameHint',\n DESCRIPTION_HINT = 'descriptionHint',\n REDIRECT_URI_HINT = 'redirectURIHint',\n IS_CONFIDENTIAL = 'isConfidential',\n IS_ACTIVE = 'isActive',\n HASH_SECRET = 'hashSecret',\n}\n\nexport enum TranslatorTranslationDefaultKey {\n ADD = 'add',\n CREATE = 'create',\n DELETE = 'delete',\n GENERATE = 'generate',\n UPDATE = 'update',\n\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n\n LOCKED = 'locked',\n NOT_LOCKED = 'notLocked',\n\n VALUE_IS_REGEX = 'valueIsRegex',\n\n CLIENT = 'client',\n CLIENTS = 'clients',\n CLIENT_SCOPES = 'clientScopes',\n DISPLAY_NAME = 'displayName',\n EMAIL = 'email',\n EXTERNAL_ID = 'externalId',\n HASHED = 'hashed',\n OVERVIEW = 'overview',\n IDENTITY_PROVIDERS = 'identityProviders',\n NAME = 'name',\n DECISION_STRATEGY = 'decisionStrategy',\n DESCRIPTION = 'description',\n PERMISSIONS = 'permissions',\n POLICY = 'policy',\n POLICIES = 'policies',\n REALM = 'realm',\n ROBOTS = 'robots',\n REALMS = 'realms',\n ROLES = 'roles',\n SCOPES = 'scopes',\n SECRET = 'secret',\n REDIRECT_URIS = 'redirectUris',\n USERS = 'users',\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n BaseValidationTranslations,\n NestedValidationsTranslations,\n} from '@ilingo/vuelidate';\nimport {\n useTranslationsForBaseValidation as _useTranslationsForBaseValidation,\n useTranslationsForNestedValidations as _useTranslationsForNestedValidations,\n} from '@ilingo/vuelidate';\nimport { useTranslation as _useTranslation, injectLocale } from '@ilingo/vuelidate/vue';\nimport type {\n BaseValidation, \n Validation, \n ValidationArgs, \n ValidationRuleCollection,\n} from '@vuelidate/core';\nimport type { GetContextReactive } from '@ilingo/vue';\nimport type { Ref } from 'vue';\n\nexport function injectTranslatorLocale() : Ref<string> {\n return injectLocale();\n}\n\nexport function useTranslation(input: GetContextReactive) : Ref<string> {\n return _useTranslation(input);\n}\n\nexport function useTranslationsForBaseValidation<\n T = unknown,\n V extends ValidationRuleCollection<T> = ValidationRuleCollection<T>,\n>(\n result: BaseValidation<T, V>,\n) : BaseValidationTranslations {\n return _useTranslationsForBaseValidation(result);\n}\n\nexport function useTranslationsForNestedValidation<\n V extends ValidationArgs = ValidationArgs,\n T = unknown,\n>(validation: Validation<V, T>) : NestedValidationsTranslations<T> {\n return _useTranslationsForNestedValidations<V, T>(validation);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { GetContext } from 'ilingo';\nimport type { Ref } from 'vue';\nimport { useTranslation } from './singleton';\n\ntype Input = Omit<GetContext, 'group'>;\nexport function useTranslationsForGroup<T extends Input>(\n group: string,\n elements: T[],\n) : Record<`${T['key']}`, Ref<string>> {\n const output = {} as Record<string, Ref<string>>;\n for (const element of elements) {\n output[element.key] = useTranslation({\n ...element,\n group,\n });\n }\n\n return output;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationClientKey } from '../constants';\n\nexport const TranslatorTranslationClientGerman : LinesRecord = {\n [TranslatorTranslationClientKey.NAME_HINT]: 'Etwas, das Benutzer erkennen und vertrauen werden',\n [TranslatorTranslationClientKey.DESCRIPTION_HINT]: 'Dies wird allen Benutzern dieser Anwendung angezeigt',\n [TranslatorTranslationClientKey.REDIRECT_URI_HINT]: 'URI-Muster, zu dem ein Browser nach einem erfolgreichen Login weiterleiten kann',\n [TranslatorTranslationClientKey.IS_CONFIDENTIAL]: 'Ist vertraulich?',\n [TranslatorTranslationClientKey.IS_ACTIVE]: 'Ist aktiv?',\n [TranslatorTranslationClientKey.HASH_SECRET]: 'Geheimnis hashen?',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationDefaultKey } from '../constants';\n\nexport const TranslatorTranslationDefaultGerman: LinesRecord = {\n [TranslatorTranslationDefaultKey.ADD]: 'hinzufügen',\n [TranslatorTranslationDefaultKey.CREATE]: 'erstellen',\n [TranslatorTranslationDefaultKey.DELETE]: 'löschen',\n [TranslatorTranslationDefaultKey.GENERATE]: 'generieren',\n [TranslatorTranslationDefaultKey.UPDATE]: 'aktualisieren',\n\n [TranslatorTranslationDefaultKey.ACTIVE]: 'aktiv',\n [TranslatorTranslationDefaultKey.INACTIVE]: 'inaktiv',\n\n [TranslatorTranslationDefaultKey.LOCKED]: 'gesperrt',\n [TranslatorTranslationDefaultKey.NOT_LOCKED]: 'nicht gesperrt',\n\n [TranslatorTranslationDefaultKey.VALUE_IS_REGEX]: 'Wert ist regex pattern?',\n\n [TranslatorTranslationDefaultKey.CLIENT]: 'Client',\n [TranslatorTranslationDefaultKey.CLIENTS]: 'Clients',\n [TranslatorTranslationDefaultKey.CLIENT_SCOPES]: 'Client-Bereiche',\n [TranslatorTranslationDefaultKey.DISPLAY_NAME]: 'Anzeigename',\n [TranslatorTranslationDefaultKey.EMAIL]: 'E-Mail',\n [TranslatorTranslationDefaultKey.EXTERNAL_ID]: 'externe ID',\n [TranslatorTranslationDefaultKey.HASHED]: 'gehasht',\n [TranslatorTranslationDefaultKey.OVERVIEW]: 'Überblick',\n [TranslatorTranslationDefaultKey.IDENTITY_PROVIDERS]: 'Identitätsanbieter',\n [TranslatorTranslationDefaultKey.NAME]: 'Name',\n [TranslatorTranslationDefaultKey.DECISION_STRATEGY]: 'Entscheidungsstrategie',\n [TranslatorTranslationDefaultKey.DESCRIPTION]: 'Beschreibung',\n [TranslatorTranslationDefaultKey.PERMISSIONS]: 'Berechtigungen',\n [TranslatorTranslationDefaultKey.POLICY]: 'Richtlinie',\n [TranslatorTranslationDefaultKey.POLICIES]: 'Richtlinien',\n [TranslatorTranslationDefaultKey.REALM]: 'Organisation',\n [TranslatorTranslationDefaultKey.REALMS]: 'Organisationen',\n [TranslatorTranslationDefaultKey.ROLES]: 'Rollen',\n [TranslatorTranslationDefaultKey.SCOPES]: 'Bereiche',\n [TranslatorTranslationDefaultKey.SECRET]: 'Geheimnis',\n [TranslatorTranslationDefaultKey.REDIRECT_URIS]: 'Weiterleitungs-URIs',\n [TranslatorTranslationDefaultKey.USERS]: 'Benutzer',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from '@authup/kit';\nimport { getSeverity } from '@ilingo/vuelidate';\nimport type { BaseValidation, Validation, ValidationRuleCollection } from '@vuelidate/core';\nimport { helpers } from '@vuelidate/validators';\nimport type { Ref } from 'vue';\n\nexport enum VuelidateCustomRuleKey {\n ALPHA_NUM_HYPHEN_UNDERSCORE = 'alphaNumHyphenUnderscore',\n ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT = 'alphaUpperNumHyphenUnderscoreDot',\n}\n\nexport const VuelidateCustomRule = {\n [VuelidateCustomRuleKey.ALPHA_NUM_HYPHEN_UNDERSCORE]: helpers.regex(/^[a-z0-9-_]*$/),\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: helpers.regex(/^[a-z0-9-_.]*$/),\n};\n\nexport function getVuelidateSeverity<\n T = unknown,\n V extends ValidationRuleCollection<T> = ValidationRuleCollection<T>,\n>(vuelidate: BaseValidation<T, V>) {\n return getSeverity<T, V>(vuelidate);\n}\n\nexport function extractVuelidateResultsFromChild(vuelidate: Ref<Validation>, child: string, keys?: string[]) {\n const childResults = vuelidate.value.$getResultsForChild(child);\n if (!childResults) {\n return {};\n }\n\n const childKeys = keys ?? Object.keys(childResults)\n .filter((key) => !key.startsWith('$'));\n\n const result : Record<string, any> = {};\n for (const childKey of childKeys) {\n if (hasOwnProperty(childResults, childKey)) {\n result[childKey] = (childResults[childKey] as { $model: Record<string, any> }).$model;\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { VuelidateCustomRuleKey } from '../../vuelidate';\n\nexport const TranslatorTranslationVuelidateGerman : LinesRecord = {\n [VuelidateCustomRuleKey.ALPHA_NUM_HYPHEN_UNDERSCORE]: 'Der Eingabewert darf nur aus folgenden Zeichen bestehen: [0-9a-z-_]+',\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: 'Der Eingabewert darf nur aus folgenden Zeichen bestehen: [0-9a-z-_.]+',\n};\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationVuecsKey } from '../constants';\n\nexport const TranslatorTranslationVuecsGerman : LinesRecord = { [TranslatorTranslationVuecsKey.NO_MORE]: 'Keine weiteren {{name}} verfügbar' };\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationClientKey } from '../constants';\n\nexport const TranslatorTranslationClientEnglish : LinesRecord = {\n [TranslatorTranslationClientKey.NAME_HINT]: 'Something users will recognize and trust',\n [TranslatorTranslationClientKey.DESCRIPTION_HINT]: 'Displayed to all users of this application',\n [TranslatorTranslationClientKey.REDIRECT_URI_HINT]: 'URI pattern a browser can redirect to after a successful login',\n [TranslatorTranslationClientKey.IS_CONFIDENTIAL]: 'Is confidential?',\n [TranslatorTranslationClientKey.IS_ACTIVE]: 'Is active?',\n [TranslatorTranslationClientKey.HASH_SECRET]: 'Hash secret?',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationDefaultKey } from '../constants';\n\nexport const TranslatorTranslationDefaultEnglish : LinesRecord = {\n [TranslatorTranslationDefaultKey.ADD]: 'add',\n [TranslatorTranslationDefaultKey.CREATE]: 'create',\n [TranslatorTranslationDefaultKey.DELETE]: 'delete',\n [TranslatorTranslationDefaultKey.GENERATE]: 'generate',\n [TranslatorTranslationDefaultKey.UPDATE]: 'update',\n\n [TranslatorTranslationDefaultKey.ACTIVE]: 'active',\n [TranslatorTranslationDefaultKey.INACTIVE]: 'inactive',\n\n [TranslatorTranslationDefaultKey.LOCKED]: 'locked',\n [TranslatorTranslationDefaultKey.NOT_LOCKED]: 'not locked',\n\n [TranslatorTranslationDefaultKey.VALUE_IS_REGEX]: 'Value is regex pattern?',\n\n [TranslatorTranslationDefaultKey.CLIENT]: 'update',\n [TranslatorTranslationDefaultKey.CLIENTS]: 'clients',\n [TranslatorTranslationDefaultKey.CLIENT_SCOPES]: 'client scopes',\n [TranslatorTranslationDefaultKey.DISPLAY_NAME]: 'display name',\n [TranslatorTranslationDefaultKey.EMAIL]: 'email',\n [TranslatorTranslationDefaultKey.EXTERNAL_ID]: 'external id',\n [TranslatorTranslationDefaultKey.HASHED]: 'hashed',\n [TranslatorTranslationDefaultKey.OVERVIEW]: 'overview',\n [TranslatorTranslationDefaultKey.IDENTITY_PROVIDERS]: 'identity providers',\n [TranslatorTranslationDefaultKey.NAME]: 'name',\n [TranslatorTranslationDefaultKey.DECISION_STRATEGY]: 'decision strategy',\n [TranslatorTranslationDefaultKey.DESCRIPTION]: 'description',\n [TranslatorTranslationDefaultKey.POLICY]: 'policy',\n [TranslatorTranslationDefaultKey.POLICIES]: 'policies',\n [TranslatorTranslationDefaultKey.PERMISSIONS]: 'permissions',\n [TranslatorTranslationDefaultKey.REALM]: 'realm',\n [TranslatorTranslationDefaultKey.REALMS]: 'realms',\n [TranslatorTranslationDefaultKey.ROLES]: 'roles',\n [TranslatorTranslationDefaultKey.SCOPES]: 'scopes',\n [TranslatorTranslationDefaultKey.SECRET]: 'secret',\n [TranslatorTranslationDefaultKey.REDIRECT_URIS]: 'redirect uri(s)',\n [TranslatorTranslationDefaultKey.USERS]: 'users',\n};\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { VuelidateCustomRuleKey } from '../../vuelidate';\n\nexport const TranslatorTranslationVuelidateEnglish : LinesRecord = {\n [VuelidateCustomRuleKey.ALPHA_NUM_HYPHEN_UNDERSCORE]: 'The input value is only allowed to consist of the following characters: [0-9a-z-_]+',\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: 'The input value is only allowed to consist of the following characters: [0-9a-z-_.]+',\n};\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LinesRecord } from 'ilingo';\nimport { TranslatorTranslationVuecsKey } from '../constants';\n\nexport const TranslatorTranslationVuecsEnglish : LinesRecord = { [TranslatorTranslationVuecsKey.NO_MORE]: 'No more {{name}} available' };\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { MemoryStore } from '@ilingo/vuelidate/core';\nimport { install } from '@ilingo/vuelidate';\nimport type { App } from 'vue';\nimport { TranslatorTranslationGroup } from './constants';\nimport {\n TranslatorTranslationClientGerman,\n TranslatorTranslationDefaultGerman,\n TranslatorTranslationVuecsGerman,\n TranslatorTranslationVuelidateGerman,\n} from './de';\nimport {\n TranslatorTranslationClientEnglish,\n TranslatorTranslationDefaultEnglish,\n TranslatorTranslationVuecsEnglish,\n TranslatorTranslationVuelidateEnglish,\n} from './en';\nimport type { TranslatorInstallOptions } from './types';\n\nexport function installTranslator(app: App, options: TranslatorInstallOptions = {}) {\n const store = new MemoryStore({\n data: {\n de: {\n [TranslatorTranslationGroup.CLIENT]: TranslatorTranslationClientGerman,\n [TranslatorTranslationGroup.DEFAULT]: TranslatorTranslationDefaultGerman,\n [TranslatorTranslationGroup.VUECS]: TranslatorTranslationVuecsGerman,\n [TranslatorTranslationGroup.VUELIDATE]: TranslatorTranslationVuelidateGerman,\n },\n en: {\n [TranslatorTranslationGroup.CLIENT]: TranslatorTranslationClientEnglish,\n [TranslatorTranslationGroup.DEFAULT]: TranslatorTranslationDefaultEnglish,\n [TranslatorTranslationGroup.VUECS]: TranslatorTranslationVuecsEnglish,\n [TranslatorTranslationGroup.VUELIDATE]: TranslatorTranslationVuelidateEnglish,\n },\n },\n });\n\n install(app, {\n store,\n locale: options.locale,\n });\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { FormSubmitOptionsInput } from '@vuecs/form-controls';\nimport { buildFormSubmit } from '@vuecs/form-controls';\nimport type { Ref, VNodeChild } from 'vue';\nimport { TranslatorTranslationDefaultKey, TranslatorTranslationGroup, useTranslation } from '../translator';\n\ntype FormSubmitTranslations = {\n createText: Ref<string>,\n updateText: Ref<string>,\n};\n\nexport function createFormSubmitTranslations() : FormSubmitTranslations {\n const updateText = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.UPDATE,\n });\n const createText = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.CREATE,\n });\n\n return {\n createText,\n updateText,\n };\n}\n\nexport function buildFormSubmitWithTranslations(\n options: FormSubmitOptionsInput,\n translations: FormSubmitTranslations,\n) : VNodeChild {\n options.createText = translations.createText.value;\n options.updateText = translations.updateText.value;\n\n return buildFormSubmit(options);\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from 'smob';\nimport type { SortBuildInput } from 'rapiq';\nimport { SortDirection } from 'rapiq';\n\ntype Data = {\n created_at?: string | Date,\n updated_at?: string | Date,\n [key: string]: any\n};\nexport function isQuerySortedDescByDate<T extends Data>(input: SortBuildInput<T>) : boolean {\n if (Array.isArray(input)) {\n return input.some((el) => isQuerySortedDescByDate(el as SortBuildInput<T>));\n }\n\n if (isObject(input)) {\n return input.created_at === SortDirection.DESC ||\n input.updated_at === SortDirection.DESC;\n }\n\n return typeof input === 'string' &&\n (input === '-created_at' || input === '-updated_at');\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Ref } from 'vue';\n\ntype Fn = (...args: any[]) => Promise<void>;\ntype OutputFn<ARGS extends unknown[]> = (...args: ARGS) => Promise<void>;\n\nexport function wrapFnWithBusyState<T extends Fn = Fn>(\n busy: Ref<boolean>,\n fn: T,\n): OutputFn<Parameters<T>> {\n return async (...args: Parameters<T>) => {\n if (busy.value) {\n return Promise.resolve();\n }\n\n busy.value = true;\n\n return fn(...args)\n .finally(() => {\n busy.value = false;\n });\n };\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityPolicyData, PermissionEvaluationContext } from '@authup/access';\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport type { Ref } from 'vue';\nimport {\n onMounted, \n onUnmounted, \n ref, \n watch,\n} from 'vue';\nimport type { Store } from '../store';\nimport { injectStore, storeToRefs } from '../store';\nimport type { PermissionCheckerReactiveFn, PermissionCheckerReactiveFnCreateContext } from './types';\n\nexport function createPermissionCheckerReactiveFn(\n ctx: PermissionCheckerReactiveFnCreateContext = {},\n) : PermissionCheckerReactiveFn {\n let store : Store;\n if (ctx.store) {\n store = ctx.store;\n } else {\n store = injectStore(ctx.pinia, ctx.app);\n }\n\n const storeRefs = storeToRefs(store);\n\n return (ctx: PermissionEvaluationContext) : Ref<boolean> => {\n const data = ref(false);\n\n let computePromise: Promise<boolean> | undefined;\n const compute = async () => {\n if (computePromise) {\n return computePromise;\n }\n\n let identity: IdentityPolicyData | undefined;\n if (storeRefs.userId.value) {\n identity = {\n type: 'user',\n id: storeRefs.userId.value,\n };\n\n if (storeRefs.realmId.value) {\n identity.realmId = storeRefs.realmId.value;\n }\n\n if (storeRefs.realmName.value) {\n identity.realmId = storeRefs.realmName.value;\n }\n }\n\n let outcome: boolean;\n\n const input = ctx.input || new PolicyData();\n input.set(BuiltInPolicyType.IDENTITY, identity);\n\n try {\n computePromise = store.permissionEvaluator\n .preEvaluateOneOf({\n ...ctx,\n input,\n })\n .then(() => true)\n .catch(() => false);\n\n outcome = await computePromise;\n } catch {\n outcome = false;\n } finally {\n computePromise = undefined;\n }\n\n return outcome;\n };\n\n Promise.resolve()\n .then(() => compute())\n .then((outcome) => {\n data.value = outcome;\n });\n\n let removeListener: undefined | CallableFunction;\n onMounted(() => {\n removeListener = watch(storeRefs.loggedIn, () => {\n Promise.resolve()\n .then(() => compute())\n .then((outcome) => {\n data.value = outcome;\n });\n });\n });\n\n onUnmounted(() => {\n if (typeof removeListener !== 'undefined') {\n removeListener();\n }\n });\n\n return data;\n };\n}\n","/*\n * Copyright (c) 2022-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { App } from 'vue';\nimport type { ClientManager } from '@authup/core-realtime-kit';\nimport { inject } from '../inject';\nimport { provide } from '../provide';\n\nexport const SocketClientSymbol = Symbol.for('AuthupSocketManager');\n\nexport function isSocketManagerUsable() {\n return !!inject(SocketClientSymbol);\n}\n\nexport function provideSocketManager(manager: ClientManager, app?: App) {\n provide(SocketClientSymbol, manager, app);\n}\n\nexport function injectSocketManager(app?: App) : ClientManager {\n const manager = inject<ClientManager>(SocketClientSymbol, app);\n if (!manager) {\n throw new Error('The socket manager has not been injected in the app context.');\n }\n\n return manager;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ClientManager } from '@authup/core-realtime-kit';\nimport type { Pinia } from 'pinia';\nimport type { App } from 'vue';\nimport { ref } from 'vue';\nimport { injectStoreFactory, storeToRefs } from '../store';\nimport { provideSocketManager } from './singleton';\n\nexport type SocketManagerInstallOptions = {\n pinia?: Pinia,\n baseURL: string\n};\n\nexport function installSocketManager(app: App, options : SocketManagerInstallOptions) {\n const storeCreator = injectStoreFactory(app);\n const store = storeCreator(options.pinia);\n const { accessToken } = storeToRefs(store);\n\n const manager = new ClientManager({\n url: options.baseURL,\n token: () => accessToken.value ?? undefined,\n });\n\n const oldValue = ref<string | undefined>();\n\n store.$subscribe((\n mutation,\n state,\n ) => {\n const normalizedToken = state.accessToken ?? undefined;\n if (normalizedToken !== oldValue.value) {\n oldValue.value = normalizedToken;\n\n Promise.resolve()\n .then(() => manager.reconnect());\n }\n });\n\n provideSocketManager(manager, app);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from '@authup/kit';\nimport type { Slot, Slots, VNode } from 'vue';\n\n/**\n * Returns true if either scoped or unscoped named slot exists\n *\n * @returns boolean\n *\n * @param name\n * @param $slots\n */\nexport function hasNormalizedSlot(\n name : string,\n $slots : Slots = {},\n) {\n return hasOwnProperty($slots, name);\n}\n\n/**\n * Returns VNodes for named slot either scoped or unscoped\n *\n * @param name\n * @param scope\n * @param $slots\n *\n * @returns {Array} VNodes\n */\nexport function normalizeSlot(\n name : string,\n scope: Record<string, any> = {},\n $slots : Slots = {},\n) : VNode[] | VNode {\n if (hasOwnProperty($slots, name)) {\n return ($slots[name] as Slot)(scope);\n }\n\n return [];\n}\n","import { SlotName } from '@vuecs/list-controls';\nimport { defineComponent } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot, useTranslation } from '../../../core';\n\nexport const ATranslation = defineComponent({\n props: {\n group: {\n type: String,\n required: true,\n },\n name: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const translation = useTranslation({\n group: props.group,\n key: props.name,\n });\n\n return () => {\n if (hasNormalizedSlot(SlotName.DEFAULT, slots)) {\n return normalizeSlot(SlotName.DEFAULT, { data: translation.value }, slots);\n }\n\n return [\n translation.value,\n ];\n };\n },\n});\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { TranslatorTranslationDefaultKey } from '../../../core';\nimport { TranslatorTranslationGroup } from '../../../core';\nimport { ATranslation } from './ATranslation';\n\nexport default defineComponent({\n components: { ATranslation },\n props: {\n name: {\n type: String as PropType<`${TranslatorTranslationDefaultKey}`>,\n required: true,\n },\n },\n setup() {\n return { TranslatorTranslationGroup };\n },\n});\n</script>\n<template>\n <ATranslation\n :group=\"TranslatorTranslationGroup.DEFAULT\"\n :name=\"name\"\n />\n</template>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { TranslatorTranslationDefaultKey } from '../../../core';\nimport { TranslatorTranslationGroup } from '../../../core';\nimport { ATranslation } from './ATranslation';\n\nexport default defineComponent({\n components: { ATranslation },\n props: {\n name: {\n type: String as PropType<`${TranslatorTranslationDefaultKey}`>,\n required: true,\n },\n },\n setup() {\n return { TranslatorTranslationGroup };\n },\n});\n</script>\n<template>\n <ATranslation\n :group=\"TranslatorTranslationGroup.DEFAULT\"\n :name=\"name\"\n />\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n ref,\n} from 'vue';\nimport AFormInputListItem from './AFormInputListItem.vue';\nimport { ATranslationDefault } from '../translation';\n\nexport default defineComponent({\n components: {\n ATranslationDefault,\n AFormInputListItem,\n },\n props: {\n names: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n minItems: {\n type: Number,\n default: 0,\n },\n maxItems: {\n type: Number,\n default: 100,\n },\n },\n emits: ['changed'],\n setup(props, setup) {\n let counter = 0;\n const items = ref<{\n id: number,\n value: string \n }[]>([]);\n\n const add = (item?: string) => {\n items.value.push({\n id: counter++,\n value: item || '',\n });\n };\n\n function assign() {\n items.value = [];\n\n props.names.map((el) => add(el));\n\n if (items.value.length < props.minItems) {\n for (let i = 0; i < props.minItems - items.value.length; i++) {\n add();\n }\n }\n }\n\n setup.expose({ assign });\n\n assign();\n\n const canAdd = computed(() => items.value.length < props.maxItems);\n\n const canDrop = computed(() => items.value.length > props.minItems);\n\n const emitUpdated = () => {\n setup.emit('changed', [\n ...items.value\n .map((el) => el.value)\n .filter(Boolean),\n ]);\n };\n\n const handleUpdated = (id: number, value: string) => {\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1 && items.value[index]) {\n items.value[index].value = value;\n }\n\n emitUpdated();\n };\n\n const handleDeleted = (id: number) => {\n if (items.value.length <= props.minItems) {\n return;\n }\n\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1) {\n items.value.splice(index, 1);\n }\n\n emitUpdated();\n };\n\n return {\n add,\n\n canAdd,\n canDrop,\n\n handleDeleted,\n handleUpdated,\n\n items,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div class=\"d-flex flex-row\">\n <div class=\"align-self-end\">\n <slot name=\"label\">\n Names\n </slot>\n </div>\n <div class=\"ms-auto\">\n <button\n class=\"btn btn-xs btn-primary\"\n type=\"button\"\n :disabled=\"!canAdd\"\n @click.prevent=\"add()\"\n >\n <i class=\"fa fa-plus\" /> <ATranslationDefault :name=\"'add'\" />\n </button>\n </div>\n </div>\n <div class=\"d-flex flex-column gap-1\">\n <template v-if=\"items.length === 0\">\n <slot name=\"noItems\">\n <div class=\"alert alert-sm alert-info\">\n The form list has no items yet\n </div>\n </slot>\n </template>\n <template\n v-for=\"item in items\"\n :key=\"item.id\"\n >\n <slot\n name=\"default\"\n :item=\"item\"\n :updated=\"handleUpdated\"\n :deleted=\"handleDeleted\"\n >\n <AFormInputListItem\n :key=\"item.id\"\n :disabled=\"!canDrop\"\n :name=\"item.value\"\n @updated=\"(input) => { handleUpdated(item.id, input) }\"\n @deleted=\"() => { handleDeleted(item.id) }\"\n />\n </slot>\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n ref,\n} from 'vue';\nimport AFormInputListItem from './AFormInputListItem.vue';\nimport { ATranslationDefault } from '../translation';\n\nexport default defineComponent({\n components: {\n ATranslationDefault,\n AFormInputListItem,\n },\n props: {\n names: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n minItems: {\n type: Number,\n default: 0,\n },\n maxItems: {\n type: Number,\n default: 100,\n },\n },\n emits: ['changed'],\n setup(props, setup) {\n let counter = 0;\n const items = ref<{\n id: number,\n value: string \n }[]>([]);\n\n const add = (item?: string) => {\n items.value.push({\n id: counter++,\n value: item || '',\n });\n };\n\n function assign() {\n items.value = [];\n\n props.names.map((el) => add(el));\n\n if (items.value.length < props.minItems) {\n for (let i = 0; i < props.minItems - items.value.length; i++) {\n add();\n }\n }\n }\n\n setup.expose({ assign });\n\n assign();\n\n const canAdd = computed(() => items.value.length < props.maxItems);\n\n const canDrop = computed(() => items.value.length > props.minItems);\n\n const emitUpdated = () => {\n setup.emit('changed', [\n ...items.value\n .map((el) => el.value)\n .filter(Boolean),\n ]);\n };\n\n const handleUpdated = (id: number, value: string) => {\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1 && items.value[index]) {\n items.value[index].value = value;\n }\n\n emitUpdated();\n };\n\n const handleDeleted = (id: number) => {\n if (items.value.length <= props.minItems) {\n return;\n }\n\n const index = items.value.findIndex((el) => el.id === id);\n if (index > -1) {\n items.value.splice(index, 1);\n }\n\n emitUpdated();\n };\n\n return {\n add,\n\n canAdd,\n canDrop,\n\n handleDeleted,\n handleUpdated,\n\n items,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div class=\"d-flex flex-row\">\n <div class=\"align-self-end\">\n <slot name=\"label\">\n Names\n </slot>\n </div>\n <div class=\"ms-auto\">\n <button\n class=\"btn btn-xs btn-primary\"\n type=\"button\"\n :disabled=\"!canAdd\"\n @click.prevent=\"add()\"\n >\n <i class=\"fa fa-plus\" /> <ATranslationDefault :name=\"'add'\" />\n </button>\n </div>\n </div>\n <div class=\"d-flex flex-column gap-1\">\n <template v-if=\"items.length === 0\">\n <slot name=\"noItems\">\n <div class=\"alert alert-sm alert-info\">\n The form list has no items yet\n </div>\n </slot>\n </template>\n <template\n v-for=\"item in items\"\n :key=\"item.id\"\n >\n <slot\n name=\"default\"\n :item=\"item\"\n :updated=\"handleUpdated\"\n :deleted=\"handleDeleted\"\n >\n <AFormInputListItem\n :key=\"item.id\"\n :disabled=\"!canDrop\"\n :name=\"item.value\"\n @updated=\"(input) => { handleUpdated(item.id, input) }\"\n @deleted=\"() => { handleDeleted(item.id) }\"\n />\n </slot>\n </template>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildPagination as _buildPagination } from '@vuecs/pagination';\nimport type { PaginationOptions } from './type';\n\nexport function buildPagination(\n ctx: PaginationOptions,\n) {\n return _buildPagination({\n load: (pagination) => ctx.load?.({\n ...ctx.meta,\n pagination: {\n limit: pagination.limit,\n offset: pagination.offset,\n },\n }),\n total: ctx.meta?.total ?? ctx.total ?? 0,\n limit: ctx.meta?.pagination?.limit ?? 0,\n offset: ctx.meta?.pagination?.offset ?? 0,\n busy: ctx.meta?.busy ?? ctx.busy,\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { buildPagination } from './module';\nimport type { PaginationLoadFn } from './type';\n\nexport const APagination = defineComponent({\n props: {\n total: { type: Number },\n meta: { type: Object as PropType<Record<string, any>> },\n busy: { type: Boolean },\n load: { type: Function as PropType<PaginationLoadFn> },\n },\n setup(props) {\n return () => buildPagination({\n busy: props.busy,\n load: props.load,\n meta: props.meta,\n total: props.total,\n });\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { BuildInput } from 'rapiq';\nimport type { PropType } from 'vue';\nimport type {\n EntityCollectionVEmitOptions,\n ListBodyOptions, \n ListFooterOptions, \n ListHeaderOptions, \n ListLoadingOptions, \n ListNoMoreOptions,\n} from '../types';\n\nexport function defineEntityCollectionVEmitOptions<T>() : EntityCollectionVEmitOptions<T> {\n return {\n \n created: (_item: T) => true,\n \n deleted: (_item: T) => true,\n \n updated: (_item: T) => true,\n };\n}\nexport function defineEntityCollectionVProps<T>() {\n return {\n query: {\n type: Object as PropType<BuildInput<T extends Record<string, any> ? T : never>>,\n default() {\n return {};\n },\n },\n realmId: {\n type: String,\n default: undefined,\n },\n loadOnSetup: {\n type: Boolean,\n default: true,\n },\n loading: {\n type: [Boolean, Object] as PropType<boolean | ListLoadingOptions<T>>,\n default: true,\n },\n noMore: {\n type: [Boolean, Object] as PropType<boolean | ListNoMoreOptions<T>>,\n default: true,\n },\n footer: {\n type: [Boolean, Object] as PropType<boolean | ListFooterOptions<T>>,\n default: true,\n },\n header: {\n type: [Boolean, Object] as PropType<boolean | ListHeaderOptions<T>>,\n default: true,\n },\n body: { type: Object as PropType<ListBodyOptions<T>> },\n };\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport type { EntityCollectionRenderOptions, EntityCollectionVProps } from '../types';\n\nfunction mergeListOption<T extends boolean | Record<string, any> | undefined>(\n primary: T,\n secondary: T,\n) : T {\n if (typeof secondary === 'undefined') {\n return primary;\n }\n\n if (typeof primary === 'undefined') {\n return secondary;\n }\n\n if (typeof primary === 'boolean' && !primary) {\n return primary;\n }\n\n const primaryRecord = typeof primary === 'boolean' ? {} : primary;\n const secondaryRecord = typeof secondary === 'boolean' ? {} : secondary;\n\n return merge(primaryRecord, secondaryRecord) as T;\n}\n\nexport function mergeEntityCollectionRenderOptions<T>(\n props: EntityCollectionVProps<T>,\n defaults: Partial<EntityCollectionRenderOptions<T>>,\n) : EntityCollectionRenderOptions<T> {\n const output : Partial<EntityCollectionRenderOptions<T>> = {\n body: defaults.body,\n item: defaults.item,\n };\n\n output.header = mergeListOption(props.header, defaults.header);\n output.noMore = mergeListOption(props.noMore, defaults.noMore);\n output.footer = mergeListOption(props.footer, defaults.footer);\n output.loading = mergeListOption(props.loading, defaults.loading);\n\n return output as EntityCollectionRenderOptions<T>;\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { Ref } from 'vue';\n\ntype EntityFn<T> = (entity: T) => void | Promise<void>;\n\ntype Options<T> = {\n created?: EntityFn<T>,\n updated?: EntityFn<T>,\n deleted?: EntityFn<T>,\n};\n\ntype StackItem<T> = {\n data: T,\n operation: 'created' | 'deleted' | 'updated'\n};\n\nexport class ListHandlers<T extends ObjectLiteral> {\n protected data: Ref<T[]>;\n\n protected options : Options<T>;\n\n protected stack : StackItem<T>[];\n\n protected stackProcessing : boolean;\n\n constructor(\n data: Ref<T[]>,\n options: Options<T> = {},\n ) {\n this.data = data;\n this.options = options;\n this.stack = [];\n\n this.stackProcessing = false;\n }\n\n protected process() {\n if (this.stackProcessing) {\n return;\n }\n\n this.stackProcessing = true;\n\n const item = this.stack.shift();\n if (!item) {\n this.stackProcessing = false;\n return;\n }\n\n const index = this.data.value.findIndex(\n (el: T) => (el as Record<string, any>).id === (item.data as Record<string, any>).id,\n );\n\n switch (item.operation) {\n case 'created': {\n if (index === -1) {\n this.data.value.push(item.data);\n\n if (this.options.created) {\n this.options.created(item.data);\n }\n }\n break;\n }\n case 'updated': {\n const existing = index !== -1 ? this.data.value[index] : undefined;\n if (existing) {\n const keys = Object.keys(item.data) as (keyof T)[];\n for (const key of keys) {\n existing[key] = item.data[key];\n }\n\n if (this.options.updated) {\n this.options.updated(existing);\n }\n }\n break;\n }\n case 'deleted': {\n if (index !== -1) {\n const [output] = this.data.value.splice(index, 1);\n\n if (this.options.deleted && output) {\n this.options.deleted(output);\n }\n }\n break;\n }\n }\n\n this.stackProcessing = false;\n\n this.process();\n }\n\n created(item: T) {\n this.stack.push({\n data: item,\n operation: 'created',\n });\n\n this.process();\n }\n\n updated(item: T) {\n this.stack.push({\n data: item,\n operation: 'updated',\n });\n\n this.process();\n }\n\n deleted(item: T) {\n this.stack.push({\n data: item,\n operation: 'deleted',\n });\n\n this.process();\n }\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function boolableToObject<T extends Record<string, any>>(input: T | boolean) : T {\n if (typeof input === 'boolean') {\n return {} as T;\n }\n\n return input;\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityDefaultEventName, REALM_MASTER_NAME, buildEntityChannelName } from '@authup/core-kit';\nimport type {\n EntityType,\n EntityTypeMap,\n EventRecord,\n} from '@authup/core-kit';\nimport type { EventFullName, STCEventContext } from '@authup/core-realtime-kit';\nimport { EventNameSuffix, buildEventFullName } from '@authup/core-realtime-kit';\nimport {\n computed, \n isRef, \n onMounted, \n onUnmounted, \n watch,\n} from 'vue';\nimport { injectStore, storeToRefs } from '../../../../core/store';\nimport type { EntitySocketManager, EntitySocketManagerCreateContext } from './type';\nimport { injectSocketManager, isSocketManagerUsable } from '../../../../core/socket-manager';\n\nfunction create<\n TYPE extends string,\n RECORD extends Record<string, any>,\n>(\n ctx: EntitySocketManagerCreateContext<TYPE, RECORD>,\n) : EntitySocketManager {\n if (!isSocketManagerUsable()) {\n return {\n mount() {\n\n },\n unmount() {\n\n },\n };\n }\n\n const socketManager = injectSocketManager();\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const realmId = computed(() => {\n if (storeRefs.realmName.value === REALM_MASTER_NAME) {\n return undefined;\n }\n\n if (isRef(ctx.realmId)) {\n return ctx.realmId.value;\n }\n\n if (ctx.realmId) {\n return ctx.realmId;\n }\n\n return storeRefs.realmId.value;\n });\n\n const targetId = computed(\n () => (\n isRef(ctx.targetId) ?\n ctx.targetId.value :\n ctx.targetId\n ),\n );\n\n const lockId = computed(\n () => (\n isRef(ctx.lockId) ?\n ctx.lockId.value :\n ctx.lockId\n ),\n );\n\n const processEvent = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) : boolean => {\n if (\n ctx.processEvent &&\n !ctx.processEvent(event, realmId.value)\n ) {\n return false;\n }\n\n const channelName = ctx.buildChannelName ?\n ctx.buildChannelName(targetId.value) :\n buildEntityChannelName(ctx.type, targetId.value);\n\n if (event.meta.roomName !== channelName) {\n return false;\n }\n\n if (ctx.target && (!targetId.value || targetId.value !== event.data.id)) {\n return false;\n }\n\n return event.data.id !== lockId.value;\n };\n\n const handleCreated = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) => {\n if (!processEvent(event)) {\n return;\n }\n\n if (ctx.onCreated) {\n ctx.onCreated(event.data as RECORD);\n }\n };\n\n const handleUpdated = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) => {\n if (!processEvent(event)) {\n return;\n }\n\n if (ctx.onUpdated) {\n ctx.onUpdated(event.data as RECORD);\n }\n };\n const handleDeleted = (\n event: STCEventContext<EventRecord<TYPE, RECORD>>,\n ) => {\n if (!processEvent(event)) {\n return;\n }\n\n if (ctx.onDeleted) {\n ctx.onDeleted(event.data as RECORD);\n }\n };\n\n let mounted = false;\n const mount = async () => {\n if ((ctx.target && !targetId.value) || mounted) {\n return;\n }\n\n mounted = true;\n\n const socket = await socketManager.connect(`/resources#${realmId.value}`);\n\n let event : EventFullName<TYPE, `${EventNameSuffix.SUBSCRIBE}`> | undefined;\n if (ctx.buildSubscribeEventName) {\n event = ctx.buildSubscribeEventName();\n } else {\n event = buildEventFullName(\n ctx.type as TYPE,\n EventNameSuffix.SUBSCRIBE,\n );\n }\n\n socket.emit(\n event,\n targetId.value,\n );\n\n if (ctx.onCreated) {\n socket.on(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.CREATED,\n ), handleCreated);\n }\n\n if (ctx.onUpdated) {\n socket.on(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.UPDATED,\n ), handleUpdated);\n }\n\n if (ctx.onDeleted) {\n socket.on(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.DELETED,\n ), handleDeleted);\n }\n };\n\n const unmount = async () => {\n if ((ctx.target && !targetId.value) || !mounted) {\n return;\n }\n\n mounted = false;\n\n const socket = await socketManager.connect(`/resources#${realmId.value}`);\n\n let event : EventFullName<TYPE, `${EventNameSuffix.UNSUBSCRIBE}`>;\n if (ctx.buildUnsubscribeEventName) {\n event = ctx.buildUnsubscribeEventName();\n } else {\n event = buildEventFullName(\n ctx.type as TYPE,\n EventNameSuffix.UNSUBSCRIBE,\n );\n }\n\n socket.emit(\n event,\n targetId.value,\n );\n\n if (ctx.onCreated) {\n socket.off(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.UPDATED,\n ), handleCreated);\n }\n\n if (ctx.onUpdated) {\n socket.off(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.UPDATED,\n ), handleUpdated);\n }\n\n if (ctx.onDeleted) {\n socket.off(buildEventFullName(\n ctx.type as `${EntityType}`,\n EntityDefaultEventName.DELETED,\n ), handleDeleted);\n }\n };\n\n onMounted(() => mount());\n onUnmounted(() => unmount());\n\n watch(targetId, (val, oldValue) => {\n if (val !== oldValue) {\n Promise.resolve()\n .then(() => unmount())\n .then(() => mount());\n }\n });\n\n return {\n mount,\n unmount,\n };\n}\n\nexport function defineEntitySocketManager<\n A extends keyof EntityTypeMap,\n>(\n ctx: EntitySocketManagerCreateContext<A, EntityTypeMap[A]>,\n) : EntitySocketManager {\n return create(ctx);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from '@authup/kit';\nimport type { EntityAPI } from '@authup/core-http-kit';\nimport type { EntityTypeMap } from '@authup/core-kit';\nimport type { ListFooterBuildOptionsInput, ListHeaderBuildOptionsInput } from '@vuecs/list-controls';\nimport { buildList } from '@vuecs/list-controls';\nimport type { BuildInput, FiltersBuildInput } from 'rapiq';\nimport type { Ref, VNodeChild } from 'vue';\nimport {\n computed,\n isRef,\n ref,\n unref,\n} from 'vue';\nimport { createMerger, isObject } from 'smob';\nimport { boolableToObject } from '../../../../utils';\nimport { injectHTTPClient } from '../../../../core/http-client';\nimport { defineEntitySocketManager } from '../socket';\nimport type { EntitySocketManagerCreateContext } from '../socket';\nimport { isQuerySortedDescByDate } from '../../../../core/query';\nimport type {\n EntityCollectionManager,\n EntityCollectionManagerCreateContext,\n EntityCollectionRenderOptions,\n ListMeta,\n} from './types';\nimport {\n ListHandlers,\n mergeEntityCollectionRenderOptions,\n} from './utils';\n\nconst merger = createMerger({\n array: false,\n inPlace: false,\n priority: 'left',\n});\n\ntype Entity<A> = A extends Record<string, any> ? A : never;\n\nfunction create<\n TYPE extends keyof EntityTypeMap,\n RECORD extends EntityTypeMap[TYPE],\n>(\n context: EntityCollectionManagerCreateContext<TYPE, RECORD>,\n) : EntityCollectionManager<RECORD> {\n const data : Ref<RECORD[]> = ref([]);\n const busy = ref(false);\n const total = ref(0);\n const meta = ref<ListMeta<RECORD>>({ pagination: { limit: 10 } }) as Ref<ListMeta<RECORD>>;\n\n const realmId = computed<string | undefined>(\n () => {\n if (context.realmId) {\n return isRef(context.realmId) ? context.realmId.value : context.realmId;\n }\n\n if (context.props.realmId) {\n return context.props.realmId;\n }\n\n return undefined;\n },\n );\n\n const client = injectHTTPClient();\n\n let domainAPI : EntityAPI<Entity<RECORD>> | undefined;\n if (hasOwnProperty(client, context.type)) {\n domainAPI = client[context.type] as any;\n }\n\n let query : BuildInput<Entity<RECORD>> | undefined;\n\n async function load(input: ListMeta<RECORD> = {}) {\n if (!domainAPI || busy.value) return;\n\n busy.value = true;\n meta.value.busy = true;\n\n try {\n let filters : FiltersBuildInput<Entity<RECORD>> | undefined;\n if (\n context.queryFilters &&\n input.filters &&\n hasOwnProperty(input.filters, 'name') &&\n typeof input.filters.name === 'string'\n ) {\n // todo: queryFilters should customize full filters object!\n filters = context.queryFilters(input.filters.name) as FiltersBuildInput<Entity<RECORD>>;\n }\n\n query = undefined;\n if (context.query) {\n if (typeof context.query === 'function') {\n query = context.query();\n } else {\n query = context.query;\n }\n }\n\n if (context.props.query) {\n if (query) {\n query = merger({}, context.props.query, query);\n } else {\n query = context.props.query;\n }\n }\n\n const nextQuery : ListMeta<RECORD> = merger(\n (filters ? { filters } : {}),\n input || {},\n {\n pagination: {\n limit: meta.value.pagination?.limit,\n offset: meta.value.pagination?.offset,\n },\n },\n query || {},\n );\n\n const response = await domainAPI.getMany(\n nextQuery as BuildInput<Entity<RECORD>>,\n );\n\n meta.value = nextQuery;\n\n if (context.loadAll) {\n data.value.push(...response.data as RECORD[]);\n } else {\n data.value = response.data as RECORD[];\n }\n\n total.value = response.meta.total;\n\n meta.value.total = response.meta.total;\n meta.value.pagination = {\n limit: response.meta.limit,\n offset: response.meta.offset,\n };\n } finally {\n busy.value = false;\n meta.value.busy = false;\n }\n\n if (\n context.loadAll &&\n total.value > data.value.length\n ) {\n await load({\n ...meta.value,\n pagination: {\n ...meta.value.pagination,\n offset: (meta.value.pagination?.offset ?? 0) + (meta.value.pagination?.limit ?? 0),\n },\n });\n }\n }\n\n const handlers = new ListHandlers<RECORD>(data, {\n created: (cbEntity) => {\n total.value++;\n\n if (context.onCreated) {\n context.onCreated(cbEntity, meta.value);\n }\n\n if (context.setup && typeof context.setup.emit === 'function') {\n context.setup.emit('created', cbEntity);\n }\n },\n deleted: (cbEntity) => {\n total.value--;\n\n if (context.setup && typeof context.setup.emit === 'function') {\n context.setup.emit('deleted', cbEntity);\n }\n },\n updated: (cbEntity) => {\n if (context.setup && typeof context.setup.emit === 'function') {\n context.setup.emit('updated', cbEntity);\n }\n },\n });\n\n\n function render(defaults?: EntityCollectionRenderOptions<RECORD>) : VNodeChild {\n let renderOptions : EntityCollectionRenderOptions<RECORD>;\n if (defaults) {\n renderOptions = mergeEntityCollectionRenderOptions(context.props, defaults);\n } else {\n renderOptions = context.props;\n }\n const header : ListHeaderBuildOptionsInput<RECORD> = boolableToObject(renderOptions.header || {});\n const footer : ListFooterBuildOptionsInput<RECORD> = boolableToObject(renderOptions.footer || {});\n\n if (renderOptions.item) {\n if (\n typeof renderOptions.body === 'undefined' ||\n typeof renderOptions.body === 'boolean'\n ) {\n renderOptions.body = { item: renderOptions.item };\n } else {\n renderOptions.body.item = renderOptions.item;\n }\n }\n\n return buildList<RECORD, ListMeta<RECORD>>({\n footer,\n header,\n noMore: renderOptions.noMore,\n body: renderOptions.body,\n loading: renderOptions.loading,\n total: total.value,\n load,\n busy: busy.value,\n data: data.value as Entity<RECORD>[],\n meta: meta.value,\n onCreated: (value: RECORD) => {\n if (context.setup.emit) {\n context.setup.emit('created', value);\n }\n\n handlers.created(value);\n },\n onDeleted: (value: RECORD) => {\n if (context.setup.emit) {\n context.setup.emit('deleted', value);\n }\n\n handlers.deleted(value);\n },\n onUpdated: (value: RECORD) => {\n if (context.setup.emit) {\n context.setup.emit('updated', value);\n }\n\n handlers.updated(value);\n },\n slotItems: context.setup.slots || {},\n });\n }\n\n context.setup.expose({\n handleCreated: (data: RECORD) => handlers.created(data),\n handleDeleted: (data: RECORD) => handlers.deleted(data),\n handleUpdated: (data: RECORD) => handlers.updated(data),\n load,\n data,\n });\n\n let loadOnSetup = true;\n const propLoadOnSetup = unref(context.props.loadOnSetup);\n if (typeof propLoadOnSetup === 'boolean') {\n loadOnSetup = propLoadOnSetup;\n }\n\n if (loadOnSetup) {\n Promise.resolve()\n .then(() => load());\n }\n\n if (\n typeof context.socket !== 'boolean' ||\n typeof context.socket === 'undefined' ||\n context.socket\n ) {\n const socketContext : EntitySocketManagerCreateContext<TYPE, RECORD> = {\n type: context.type,\n ...(isObject(context.socket) ? context.socket : {}),\n };\n\n socketContext.onCreated = (entity) => {\n const isSorted = query &&\n query.sort &&\n isQuerySortedDescByDate(query.sort) &&\n meta.value?.pagination?.offset === 0;\n\n if (isSorted || total.value < (meta.value?.pagination?.limit ?? 0)) {\n handlers.created(entity);\n }\n };\n socketContext.onDeleted = (entity: RECORD) => {\n handlers.deleted(entity);\n };\n socketContext.onUpdated = (entity: RECORD) => {\n handlers.updated(entity);\n };\n socketContext.realmId = realmId;\n\n defineEntitySocketManager(socketContext);\n }\n\n return {\n data,\n busy,\n meta,\n total,\n\n handleCreated: (entity: RECORD) => {\n handlers.updated(entity);\n },\n handleDeleted: (entity: RECORD) => {\n handlers.deleted(entity);\n },\n handleUpdated: (entity: RECORD) => {\n handlers.updated(entity);\n },\n\n render,\n load,\n };\n}\n\nexport function defineEntityCollectionManager<\n A extends keyof EntityTypeMap,\n>(\n context: EntityCollectionManagerCreateContext<A, EntityTypeMap[A]>,\n) : EntityCollectionManager<EntityTypeMap[A]> {\n return create(context);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport class EntityRecordError extends Error {\n static unresolvable() {\n return new this('Entity could not be resolved.');\n }\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { BuildInput, FieldsBuildInput, FiltersBuildInput } from 'rapiq';\nimport { unref } from 'vue';\nimport type { PropType } from 'vue';\nimport type {\n EntityManager,\n EntityVEmitOptions,\n EntityVSlotProps,\n} from './types';\n\nexport function buildEntityVSlotProps<T>(\n input: EntityManager<T>,\n) : EntityVSlotProps<T> {\n return {\n ...input,\n error: unref(input.error),\n busy: unref(input.busy),\n data: unref(input.data),\n lockId: unref(input.lockId),\n };\n}\n\nexport function defineEntityVEmitOptions<T>(): EntityVEmitOptions<T> {\n return {\n \n failed: (_item: Error) => true,\n \n created: (_item: T) => true,\n \n deleted: (_item: T) => true,\n \n updated: (_item: T) => true,\n \n resolved: (_item?: T) => true,\n };\n}\n\nexport function defineEntityVProps<T>() {\n return {\n entity: { type: Object as PropType<T> },\n entityId: { type: String },\n queryFilters: { type: Object as PropType<FiltersBuildInput<T extends Record<string, any> ? T : never>> },\n queryFields: { type: Object as PropType<FieldsBuildInput<T extends Record<string, any> ? T : never>> },\n query: { type: Object as PropType<T extends Record<string, any> ? BuildInput<T> : never> },\n };\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { EntityAPI } from '@authup/core-http-kit';\nimport type { EntityTypeMap } from '@authup/core-kit';\nimport type { ObjectLiteral } from '@authup/kit';\nimport { extendObject, hasOwnProperty } from '@authup/kit';\nimport type { BuildInput } from 'rapiq';\nimport { isObject } from 'smob';\nimport type { Ref, VNodeChild } from 'vue';\nimport {\n computed, \n isRef, \n ref, \n toRef, \n watch,\n} from 'vue';\nimport { hasNormalizedSlot, injectHTTPClient, normalizeSlot } from '../../../../core';\nimport type { EntitySocketManager, EntitySocketManagerCreateContext } from '../socket';\nimport { defineEntitySocketManager } from '../socket';\nimport { EntityRecordError } from './error';\nimport type {\n EntityID,\n EntityManager,\n EntityManagerCreateContext,\n ResourceManagerRenderFn,\n ResourceManagerResolveContext,\n} from './types';\nimport { buildEntityVSlotProps } from './helpers';\n\nfunction create<\n TYPE extends keyof EntityTypeMap,\n RECORD extends EntityTypeMap[TYPE] & ObjectLiteral,\n>(\n ctx: EntityManagerCreateContext<TYPE, RECORD>,\n) : EntityManager<RECORD> {\n const client = injectHTTPClient();\n let domainAPI : EntityAPI<RECORD> | undefined;\n if (hasOwnProperty(client, ctx.type)) {\n domainAPI = client[ctx.type] as any;\n }\n\n const entity : Ref<RECORD | undefined> = ref(undefined);\n const entityId = computed<EntityID<RECORD> | undefined>(\n () => (\n entity.value ? (entity.value as any).id : undefined),\n );\n\n const realmId = computed<string | undefined>(\n () => {\n let realmId : string | undefined;\n\n if (ctx.realmId) {\n if (typeof ctx.realmId === 'function') {\n return ctx.realmId(entity.value);\n }\n\n realmId = isRef(ctx.realmId) ? ctx.realmId.value : ctx.realmId;\n }\n\n if (!realmId && entity.value) {\n if (\n hasOwnProperty(entity.value, 'realm_id') &&\n typeof entity.value.realm_id === 'string'\n ) {\n return entity.value.realm_id;\n }\n }\n\n return realmId;\n },\n );\n\n const lockId = ref(undefined) as Ref<EntityID<RECORD> | undefined>;\n\n if (ctx.props && ctx.props.entity) {\n entity.value = ctx.props.entity;\n }\n\n const created = (value: RECORD) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('created', value);\n }\n\n if (ctx.onCreated) {\n ctx.onCreated(value);\n }\n };\n\n const deleted = (value: RECORD) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('deleted', (value || entity.value) as RECORD);\n }\n\n if (ctx.onDeleted) {\n ctx.onDeleted((value || entity.value) as RECORD);\n }\n };\n\n const updated = (value: Partial<RECORD>) => {\n if (entity.value) {\n extendObject(entity.value, value);\n }\n\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('updated', (entity.value || value) as RECORD);\n }\n\n if (ctx.onUpdated) {\n ctx.onUpdated(entity.value || value);\n }\n };\n\n const resolved = (value?: RECORD) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('resolved', value);\n }\n\n if (ctx.onResolved) {\n ctx.onResolved(value);\n }\n };\n\n const failed = (error: Error) => {\n if (ctx.setup && ctx.setup.emit) {\n ctx.setup.emit('failed', error);\n }\n\n if (ctx.onFailed) {\n ctx.onFailed(error);\n }\n };\n\n const busy = ref(false);\n\n const update = async (data: Partial<RECORD>) => {\n if (!domainAPI || busy.value || !entityId.value) {\n return;\n }\n\n busy.value = true;\n lockId.value = entityId.value;\n\n try {\n const response = await domainAPI.update(\n entityId.value,\n data,\n );\n\n entity.value = response;\n\n updated(response);\n } catch (e) {\n if (e instanceof Error) {\n failed(e);\n }\n } finally {\n busy.value = false;\n lockId.value = undefined;\n }\n };\n\n const remove = async () : Promise<void> => {\n if (!domainAPI || busy.value || !entityId.value) {\n return;\n }\n\n busy.value = true;\n lockId.value = entityId.value;\n\n try {\n const response = await domainAPI.delete(\n entityId.value,\n );\n\n entity.value = undefined;\n\n deleted(response);\n } catch (e) {\n if (e instanceof Error) {\n failed(e);\n }\n } finally {\n busy.value = false;\n lockId.value = undefined;\n }\n };\n\n const create = async (data: Partial<RECORD>) : Promise<void> => {\n if (!domainAPI || busy.value) {\n return;\n }\n\n busy.value = true;\n\n lockId.value = undefined;\n\n try {\n const response = await domainAPI.create(data);\n\n entity.value = response;\n\n created(response);\n } catch (e) {\n if (e instanceof Error) {\n failed(e);\n }\n } finally {\n busy.value = false;\n lockId.value = undefined;\n }\n };\n\n const createOrUpdate = async (data: Partial<RECORD>) : Promise<void> => {\n if (entity.value) {\n await update(data);\n } else {\n await create(data);\n }\n };\n\n let socket : EntitySocketManager | undefined;\n\n if (\n typeof ctx.socket !== 'boolean' ||\n typeof ctx.socket === 'undefined' ||\n typeof ctx.socket === 'function' ||\n ctx.socket\n ) {\n let socketContext : EntitySocketManagerCreateContext<TYPE, RECORD> = { type: ctx.type };\n\n if (isObject(ctx.socket)) {\n socketContext = {\n ...socketContext,\n ...ctx.socket,\n };\n }\n\n socketContext.onCreated = created;\n socketContext.onUpdated = updated;\n socketContext.lockId = lockId;\n socketContext.realmId = realmId;\n socketContext.target = true;\n socketContext.targetId = entityId;\n\n socket = defineEntitySocketManager(socketContext);\n }\n\n const error = ref<Error | undefined>(undefined);\n\n const resolveByProps = () : boolean => {\n if (!ctx.props) {\n return false;\n }\n\n if (ctx.props.entity) {\n entity.value = ctx.props.entity;\n\n if (socket) {\n socket.mount();\n }\n\n resolved(entity.value);\n\n return true;\n }\n\n return false;\n };\n\n if (ctx.props) {\n const propEntityRef = toRef(ctx.props, 'entity');\n const propsEntityId = computed(() => (propEntityRef.value ? propEntityRef.value.id : undefined));\n watch(propsEntityId, (val) => {\n entity.value = propEntityRef.value;\n\n if (val) {\n if (socket) {\n socket.mount();\n }\n } else if (socket) {\n socket.unmount();\n }\n });\n }\n\n resolveByProps();\n\n const resolve = async (rctx: ResourceManagerResolveContext<RECORD> = {}) => {\n if (entity.value) {\n return;\n }\n\n let query : BuildInput<RECORD> | undefined;\n if (rctx.query) {\n query = rctx.query as BuildInput<RECORD>;\n }\n\n let { id } = rctx;\n\n if (ctx.props) {\n if (resolveByProps()) {\n return;\n }\n\n if (ctx.props.entity) {\n entity.value = ctx.props.entity;\n\n if (socket) {\n socket.mount();\n }\n\n resolved(entity.value);\n\n return;\n }\n\n if (ctx.props.queryFilters) {\n query = query || {} as BuildInput<RECORD>;\n (query as any).filters = ctx.props.queryFilters;\n }\n\n if (ctx.props.queryFields) {\n query = query || {} as BuildInput<RECORD>;\n (query as any).fields = ctx.props.queryFields;\n }\n\n if (ctx.props.entityId) {\n id = ctx.props.entityId;\n }\n }\n\n if (!domainAPI) {\n resolved();\n\n return;\n }\n\n if (id) {\n try {\n entity.value = await domainAPI.getOne(id, query as BuildInput<any>);\n\n if (socket) {\n socket.mount();\n }\n\n resolved(entity.value);\n\n return;\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n\n if (query) {\n try {\n const response = await domainAPI.getMany({\n ...query,\n pagination: { limit: 1 },\n } as any);\n\n if (response.data.length === 1) {\n [entity.value] = response.data;\n\n if (socket) {\n socket.mount();\n }\n }\n\n resolved(entity.value);\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n };\n\n const resolveOrFail = async (resolveContext: ResourceManagerResolveContext<RECORD> = {}) => {\n await resolve(resolveContext);\n\n if (typeof entity.value === 'undefined') {\n if (!error.value) {\n throw EntityRecordError.unresolvable();\n }\n\n // eslint-disable-next-line no-throw-literal\n throw error.value as Error;\n }\n };\n\n if (ctx.query) {\n const queryFn = ctx.query;\n let initialized = false;\n\n watch(\n () => JSON.stringify(queryFn()),\n () => {\n if (!initialized) {\n initialized = true;\n return;\n }\n\n entity.value = undefined;\n resolve({ query: queryFn() as any });\n },\n { immediate: true },\n );\n }\n\n const manager : EntityManager<RECORD> = {\n resolve,\n resolveOrFail,\n lockId,\n busy,\n data: entity,\n error,\n\n create,\n createOrUpdate,\n created,\n\n update,\n updated,\n\n delete: remove,\n deleted,\n\n failed,\n\n render: () => undefined,\n renderError: () => undefined,\n };\n\n manager.render = (content?: VNodeChild | ResourceManagerRenderFn): VNodeChild => {\n if (!ctx.setup || !ctx.setup.slots) {\n return typeof content === 'function' ?\n content() :\n content;\n }\n\n if (hasNormalizedSlot('default', ctx.setup.slots)) {\n return normalizeSlot(\n 'default',\n buildEntityVSlotProps(manager),\n ctx.setup.slots,\n );\n }\n\n return typeof content === 'function' ?\n content() :\n content;\n };\n\n manager.renderError = (error: unknown) : VNodeChild => {\n if (!ctx.setup || !ctx.setup.slots) {\n return undefined;\n }\n\n if (\n isObject(error) &&\n hasNormalizedSlot('error', ctx.setup.slots)\n ) {\n return normalizeSlot('error', error, ctx.setup.slots);\n }\n\n return undefined;\n };\n\n return manager;\n}\n\nexport function defineEntityManager<\n TYPE extends keyof EntityTypeMap,\n>(\n ctx: EntityManagerCreateContext<TYPE, EntityTypeMap[TYPE]>,\n) : EntityManager<EntityTypeMap[TYPE]> {\n return create<TYPE, EntityTypeMap[TYPE]>(ctx);\n}\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n value: {\n type: Boolean,\n required: true,\n },\n isBusy: {\n type: Boolean,\n required: true,\n },\n },\n emits: ['changed'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('changed', !props.value);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n :aria-label=\"isBusy ? 'Processing' : (value ? 'Remove' : 'Add')\"\n :class=\"['btn btn-xs', {\n 'btn-dark': isBusy,\n 'btn-success': !isBusy && !value,\n 'btn-danger': !isBusy && value,\n }]\"\n :disabled=\"isBusy\"\n @click=\"handleClick\"\n >\n <i\n aria-hidden=\"true\"\n :class=\"['fa', {\n 'fa-question': isBusy,\n 'fa-plus': !isBusy && !value,\n 'fa-minus': !isBusy && value,\n }]\"\n />\n </button>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n value: {\n type: Boolean,\n required: true,\n },\n isBusy: {\n type: Boolean,\n required: true,\n },\n },\n emits: ['changed'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('changed', !props.value);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n :aria-label=\"isBusy ? 'Processing' : (value ? 'Remove' : 'Add')\"\n :class=\"['btn btn-xs', {\n 'btn-dark': isBusy,\n 'btn-success': !isBusy && !value,\n 'btn-danger': !isBusy && value,\n }]\"\n :disabled=\"isBusy\"\n @click=\"handleClick\"\n >\n <i\n aria-hidden=\"true\"\n :class=\"['fa', {\n 'fa-question': isBusy,\n 'fa-plus': !isBusy && !value,\n 'fa-minus': !isBusy && value,\n }]\"\n />\n </button>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { h } from 'vue';\n\ntype ToggleButtonOptions = {\n value: boolean,\n isBusy: boolean,\n changed: (value: boolean) => void\n};\nexport function renderToggleButton(\n options: ToggleButtonOptions,\n) {\n return h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': options.isBusy,\n 'btn-success': !options.isBusy && !options.value,\n 'btn-danger': !options.isBusy && options.value,\n }],\n disabled: options.isBusy,\n onClick($event: any) {\n $event.preventDefault();\n\n options.changed(!options.value);\n },\n }, [\n h('i', {\n class: ['fa', {\n 'fa-question': options.isBusy,\n 'fa-plus': !options.isBusy && !options.value,\n 'fa-minus': !options.isBusy && options.value,\n }],\n }),\n ]);\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type { FormInputBuildOptionsInput } from '@vuecs/form-controls';\nimport { buildFormInputText } from '@vuecs/form-controls';\nimport type { VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\nimport { ListSearchSlotName } from './constants';\nimport type { SearchOptionsInput } from './type';\n\ntype Fn = (...args: any[]) => Promise<any> | any;\nfunction debounce<T extends Fn>(func: T, timeout = 200) {\n let timer : ReturnType<typeof setTimeout> | undefined;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => { func(...args); }, timeout);\n };\n}\n\nexport function buildListSearch(\n ctx: SearchOptionsInput,\n) {\n ctx.icon = ctx.icon ?? true;\n ctx.iconClass = ctx.iconClass || 'fa fa-search';\n ctx.iconPosition = ctx.iconPosition ?? 'start';\n\n if (hasNormalizedSlot(ListSearchSlotName.DEFAULT, ctx.slots)) {\n return normalizeSlot(ListSearchSlotName.DEFAULT, {\n load: ctx.load,\n busy: ctx.busy,\n icon: ctx.icon,\n iconClass: ctx.iconClass,\n iconPosition: ctx.iconPosition,\n }, ctx.slots);\n }\n\n let iconContent : VNodeChild | undefined;\n if (hasNormalizedSlot(ListSearchSlotName.ICON)) {\n iconContent = normalizeSlot(ListSearchSlotName.ICON, {}, ctx.slots);\n }\n\n const options: FormInputBuildOptionsInput = {};\n\n if (ctx.icon) {\n if (ctx.iconPosition === 'start') {\n options.groupPrepend = true;\n if (iconContent) {\n options.groupPrependContent = iconContent;\n } else {\n options.groupPrependContent = h('i', { class: ctx.iconClass });\n }\n } else {\n options.groupAppend = true;\n if (iconContent) {\n options.groupAppendContent = iconContent;\n } else {\n options.groupAppendContent = h('i', { class: ctx.iconClass });\n }\n }\n }\n\n const handle = debounce((text: string) => {\n if (!ctx.load || ctx.meta?.busy || ctx.busy) {\n return Promise.resolve();\n }\n\n return ctx.load({\n filters: { name: text.length > 0 ? `~${text}` : text as any },\n pagination: { offset: 0 },\n });\n });\n\n return buildFormInputText({\n type: 'text',\n onChange: (text: string) => handle(text),\n props: { placeholder: '...' },\n ...options,\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ListLoadFn } from '@vuecs/list-controls';\nimport type { PropType, SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { ListMeta } from '../entity';\nimport type { SearchSlotProps } from './type';\nimport { buildListSearch } from './module';\n\nexport const ASearch = defineComponent({\n props: {\n // todo: add entity-key prop\n icon: { type: Boolean },\n iconPosition: { type: String as PropType<'start' | 'end'> },\n iconClass: { type: String },\n busy: { type: Boolean },\n load: { type: Function as PropType<ListLoadFn> },\n meta: { type: Object as PropType<ListMeta<any>> },\n },\n slots: Object as SlotsType<{\n default: SearchSlotProps\n }>,\n setup(\n props,\n { slots },\n ) {\n return () => buildListSearch({\n slots,\n icon: props.icon,\n iconPosition: props.iconPosition,\n busy: props.busy,\n load: props.load,\n meta: props.meta,\n });\n },\n});\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { SlotName } from '@vuecs/list-controls';\nimport type { PropType, Ref, VNodeChild } from 'vue';\nimport {\n computed, \n h, \n mergeProps, \n ref, \n toRef, \n watch,\n} from 'vue';\nimport { APagination } from '../../pagination';\nimport { renderToggleButton } from '../../toggle-button';\nimport type { EntityCollectionVSlots } from '../collection';\nimport { defineEntityCollectionVEmitOptions, defineEntityCollectionVProps } from '../collection';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../../core';\nimport { ASearch } from '../../search';\nimport type { EntityPickerContext, EntityPickerVEmitOptions, RecordWithID } from './types';\n\nexport function defineEntityPickerVEmitOptions<T>() : EntityPickerVEmitOptions<T> {\n return {\n \n change: (_values: string[]) => true,\n ...defineEntityCollectionVEmitOptions<T>(),\n };\n}\n\nexport function defineEntityPickerVProps<T extends RecordWithID = RecordWithID>() {\n return {\n value: { type: [Array, String] as PropType<string[] | string | null> },\n multiple: { type: Boolean as PropType<boolean | undefined> },\n ...defineEntityCollectionVProps<T>(),\n };\n}\n\nexport function defineEntityPicker<T extends RecordWithID>({\n props,\n setup,\n component,\n} : EntityPickerContext<T>) {\n const componentRef = ref(null) as Ref<null | Record<string, any>>;\n\n setup.expose({\n load: (...args: any[]) => {\n if (componentRef.value) {\n return componentRef.value.load(...args);\n }\n\n return undefined;\n },\n });\n\n const value = toRef(props, 'value');\n const items = ref<string[]>([]);\n\n const assignItems = (input?: string[] | string | null) => {\n if (Array.isArray(input)) {\n items.value = input;\n } else if (input) {\n items.value = [input];\n } else {\n items.value = [];\n }\n };\n\n const isMultiSelection = computed(() => {\n if (typeof props.multiple === 'boolean') {\n return props.multiple;\n }\n\n return Array.isArray(value.value);\n });\n\n assignItems(value.value);\n\n watch(value, (input) => assignItems(input));\n\n const toggle = (id: string) => {\n const index = items.value!.indexOf(id);\n\n if (index === -1) {\n if (isMultiSelection.value) {\n items.value!.push(id);\n } else {\n items.value = [id];\n }\n } else if (isMultiSelection.value) {\n if (index !== -1) {\n items.value!.splice(index, 1);\n }\n } else {\n items.value = [];\n }\n\n setup.emit('change', [...items.value]);\n };\n\n const render = () => h(\n component,\n mergeProps(\n { ref: componentRef },\n props,\n setup.attrs,\n ),\n {\n [SlotName.HEADER]: (slotProps: EntityCollectionVSlots<RecordWithID>['header']) => [\n h(ASearch, {\n load: (payload: any) => {\n if (slotProps.load) {\n return slotProps.load(payload);\n }\n\n return undefined;\n },\n busy: slotProps.busy,\n }),\n ],\n [SlotName.FOOTER]: (slotProps: EntityCollectionVSlots<RecordWithID>['footer']) => [\n h(APagination, {\n load: (payload: any) => {\n if (slotProps.load) {\n return slotProps.load(payload);\n }\n\n return undefined;\n },\n busy: slotProps.busy,\n meta: slotProps.meta,\n }),\n ],\n [SlotName.ITEM_ACTIONS]: (\n slotProps: EntityCollectionVSlots<RecordWithID>['itemActions'],\n ) => {\n let content : VNodeChild | undefined;\n if (hasNormalizedSlot(SlotName.ITEM_ACTIONS, setup.slots)) {\n content = normalizeSlot(SlotName.ITEM_ACTIONS, {\n ...slotProps,\n toggle,\n }, setup.slots);\n }\n\n if (content) {\n return content;\n }\n\n return renderToggleButton({\n value: items.value.includes(slotProps.data.id),\n isBusy: slotProps.busy,\n changed() {\n toggle(slotProps.data.id);\n },\n });\n },\n },\n );\n\n return { render };\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@authup/kit';\nimport type {\n Component,\n PropType,\n VNodeArrayChildren,\n VNodeProps,\n} from 'vue';\nimport {\n defineComponent, \n getCurrentInstance,\n h,\n mergeProps,\n ref, \n resolveDynamicComponent,\n} from 'vue';\nimport type { EntityType } from '@authup/core-kit';\nimport type { EntityAPISlim } from '@authup/core-http-kit';\nimport {\n TranslatorTranslationDefaultKey, \n TranslatorTranslationGroup, \n injectHTTPClient, \n useTranslation, \n wrapFnWithBusyState,\n} from '../../../core';\n\nenum ElementType {\n BUTTON = 'button',\n LINK = 'link',\n DROP_DOWN_ITEM = 'dropDownItem',\n}\n\nconst AEntityDelete = defineComponent({\n props: {\n elementIcon: {\n type: String,\n default: 'fa-solid fa-trash',\n },\n withText: {\n type: Boolean,\n default: true,\n },\n elementType: {\n type: String as PropType<`${ElementType}`>,\n default: ElementType.BUTTON,\n },\n\n entityId: {\n type: String,\n required: true,\n },\n entityType: {\n type: String as PropType<`${EntityType}`>,\n required: true,\n },\n\n hint: {\n type: String,\n default: undefined,\n },\n },\n emits: ['deleted', 'failed'],\n setup(props, ctx) {\n const apiClient = injectHTTPClient();\n const instance = getCurrentInstance();\n const busy = ref(false);\n\n const submit = wrapFnWithBusyState(busy, async () => {\n const domainAPI = (\n apiClient as Record<string, any>\n )[props.entityType] as EntityAPISlim<any> | undefined;\n\n if (!isObject(domainAPI)) {\n return;\n }\n\n if (typeof domainAPI.delete !== 'function') {\n return;\n }\n\n try {\n const response = await domainAPI.delete(props.entityId);\n response.id = props.entityId;\n ctx.emit('deleted', response);\n } catch (e) {\n ctx.emit('failed', e);\n }\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.DELETE,\n });\n\n const render = () => {\n let tag : Component | string = 'button';\n const data : VNodeProps = {};\n\n switch (props.elementType) {\n case ElementType.LINK:\n tag = 'a';\n break;\n case ElementType.DROP_DOWN_ITEM:\n if (\n instance &&\n typeof instance.appContext.app.component('BDropdownItem') !== 'undefined'\n ) {\n tag = resolveDynamicComponent('BDropdownItem') as Component;\n }\n break;\n }\n\n let icon : VNodeArrayChildren = [];\n if (props.elementIcon) {\n icon = [\n h('i', { class: [props.elementIcon, { 'pe-1': props.withText }] }),\n ];\n }\n\n let text : VNodeArrayChildren = [];\n if (props.withText) {\n text = [\n translation.value,\n ];\n }\n\n return h(\n tag as string,\n mergeProps({\n disabled: busy.value,\n onClick($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, data),\n [\n icon,\n text,\n ],\n );\n };\n\n return () => render();\n },\n});\n\nexport { AEntityDelete };\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type { VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\nimport { TitleSlotName } from './constants';\nimport type { TitleOptions } from './type';\n\nexport function buildTitle(\n ctx: TitleOptions,\n) {\n ctx.tag = ctx.tag || 'h6';\n ctx.icon = ctx.icon ?? true;\n ctx.iconClass = ctx.iconClass || 'fa-solid fa-list';\n ctx.iconPosition = ctx.iconPosition ?? 'start';\n\n if (hasNormalizedSlot(TitleSlotName.DEFAULT, ctx.slots)) {\n return normalizeSlot(TitleSlotName.DEFAULT, {\n tag: ctx.tag,\n icon: ctx.icon,\n iconClass: ctx.iconClass,\n iconPosition: ctx.iconPosition,\n }, ctx.slots);\n }\n\n let icon: VNodeChild;\n\n if (ctx.icon) {\n let iconContent : VNodeChild;\n if (hasNormalizedSlot(TitleSlotName.ICON)) {\n iconContent = normalizeSlot(TitleSlotName.ICON, {}, ctx.slots);\n }\n\n if (iconContent) {\n icon = iconContent;\n } else {\n icon = h(\n 'i',\n { class: [ctx.iconClass, 'pe-1'] },\n );\n }\n }\n\n let content: VNodeChild;\n if (typeof ctx.text === 'function') {\n content = ctx.text();\n } else {\n content = ctx.text || 'Overview';\n }\n\n if (ctx.iconPosition === 'start') {\n return h(ctx.tag, [\n icon,\n content,\n ]);\n }\n\n return h(ctx.tag, [\n content,\n icon,\n ]);\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PropType, SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { TranslatorTranslationDefaultKey, TranslatorTranslationGroup, useTranslation } from '../../../core';\nimport type { TitleSlotProps } from './type';\nimport { buildTitle } from './module';\n\nexport const ATitle = defineComponent({\n props: {\n icon: {\n type: Boolean,\n default: true,\n },\n iconPosition: { type: String as PropType<'start' | 'end'> },\n iconClass: { type: String },\n text: { type: String },\n },\n slots: Object as SlotsType<{\n default: TitleSlotProps\n }>,\n setup(props, { slots }) {\n const translation = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.OVERVIEW,\n });\n\n return () => buildTitle({\n slots,\n icon: props.icon,\n iconPosition: props.iconPosition,\n text: props.text || translation.value,\n });\n },\n});\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { injectLocale } from '@ilingo/vuelidate/vue';\nimport {\n computed, \n defineComponent, \n h, \n ref,\n} from 'vue';\n\nconst LanguageSwitcherDropdown = defineComponent({\n props: {\n linkClassExtra: {\n type: String,\n default: undefined,\n },\n },\n async setup(props) {\n const opened = ref(false);\n\n const locale = injectLocale();\n const locales = ['de', 'en'];\n\n const elements = computed(() => {\n const output = [];\n for (const locale_ of locales) {\n output.push({\n value: locale_,\n active: locale.value === locale_,\n });\n }\n\n return output;\n });\n\n const setLocale = (input: string) => {\n locale.value = input;\n opened.value = false;\n };\n\n return () => [\n h('button', {\n class: [\n 'dropdown-toggle',\n props.linkClassExtra,\n ],\n onClick(event: any) {\n event.preventDefault();\n\n opened.value = !opened.value;\n },\n }, [\n locale.value,\n ]),\n h('div', {\n class: [\n 'dropdown-menu',\n opened.value ? 'show' : '',\n ],\n }, elements.value.map((element) => h('button', {\n onClick(event) {\n event.preventDefault();\n\n setLocale(element.value);\n },\n class: [\n 'dropdown-item',\n element.active ? 'active' : '',\n ],\n }, [element.value]))),\n ];\n },\n});\n\nexport { LanguageSwitcherDropdown };\n","import { defineComponent } from 'vue';\nimport { buildFormSubmitWithTranslations, createFormSubmitTranslations } from '../../core';\n\nexport const AFormSubmit = defineComponent({\n props: {\n isBusy: {\n type: Boolean,\n default: false,\n },\n isEditing: {\n type: Boolean,\n default: false,\n },\n isInvalid: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['submit'],\n setup(props, { emit }) {\n const translationsSubmit = createFormSubmitTranslations();\n\n const render = () => buildFormSubmitWithTranslations({\n submit: () => emit('submit'),\n busy: props.isBusy,\n isEditing: props.isEditing,\n invalid: props.isInvalid,\n }, translationsSubmit);\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Client } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AClient = defineComponent({\n props: defineEntityVProps<Client>(),\n emits: defineEntityVEmitOptions<Client>(),\n slots: Object as SlotsType<EntityVSlots<Client>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT}`,\n setup,\n props,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Realm } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const ARealm = defineComponent({\n props: defineEntityVProps<Realm>(),\n emits: defineEntityVEmitOptions<Realm>(),\n slots: Object as SlotsType<EntityVSlots<Realm>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.REALM}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComputedRef, MaybeRef } from 'vue';\nimport { computed, isRef } from 'vue';\n\ntype ObjectLiteral = {\n id: any\n};\nexport function useIsEditing<T extends ObjectLiteral>(input: MaybeRef<T | undefined>) : ComputedRef<boolean> {\n return computed(() => {\n if (isRef(input)) {\n return !!input.value && !!input.value.id;\n }\n\n return !!input && !!input.id;\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { watch } from 'vue';\nimport type { Ref } from 'vue';\n\nexport function onChange<T>(input: Ref<T>, fn: (item: T) => any) {\n watch(input, (val, oldValue) => {\n if (val !== oldValue) {\n fn(val);\n }\n }, { deep: true });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComputedRef, MaybeRef } from 'vue';\nimport { computed, isRef } from 'vue';\n\ntype ObjectLiteral = {\n updated_at: string | Date | undefined\n};\nexport function useUpdatedAt<T extends ObjectLiteral>(input?: MaybeRef<T | null | undefined>) : ComputedRef<string | Date | undefined> {\n return computed(() => {\n if (isRef(input)) {\n return input.value ? input.value.updated_at : undefined;\n }\n\n return input ? input.updated_at : undefined;\n });\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionEvaluationContext } from '@authup/access';\nimport type { Ref } from 'vue';\nimport { createPermissionCheckerReactiveFn } from '../core';\n\nexport function usePermissionCheck(ctx: PermissionEvaluationContext) : Ref<boolean> {\n const checkFn = createPermissionCheckerReactiveFn();\n\n return checkFn(ctx);\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport { createNanoID } from '@authup/kit';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive, \n ref, \n watch,\n} from 'vue';\nimport type { Realm } from '@authup/core-kit';\nimport { EntityType, REALM_MASTER_NAME } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n buildFormTextarea,\n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\n\nexport const ARealmForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<Realm>,\n required: false,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Realm>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n });\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: VuelidateCustomRule[\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n }, form);\n\n const manager = defineEntityManager({\n type: `${EntityType.REALM}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n const isNameEmpty = computed(() => !form.name || form.name.length === 0);\n\n const generateName = () => {\n form.name = createNanoID();\n };\n\n function initForm() {\n assignFormProperties(form, manager.data.value);\n\n if (form.name.length === 0) {\n generateName();\n }\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n const render = () => {\n const children : VNodeArrayChildren = [];\n children.push(buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: {\n disabled: manager.data.value &&\n manager.data.value.name === REALM_MASTER_NAME,\n },\n }),\n }));\n\n if (!manager.data.value || !manager.data.value.id) {\n children.push([\n h('div', { class: 'mb-3' }, [\n h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': isNameEmpty.value,\n 'btn-warning': !isNameEmpty.value,\n }],\n onClick($event: any) {\n $event.preventDefault();\n\n generateName.call(null);\n },\n }, [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n translationsDefault[TranslatorTranslationDefaultKey.GENERATE].value,\n ]),\n ]),\n ]);\n }\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 4 },\n }),\n }));\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Realm } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const ARealms = defineComponent({\n props: defineEntityCollectionVProps<Realm>(),\n emits: defineEntityCollectionVEmitOptions<Realm>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Realm>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.REALM}`,\n props,\n setup: ctx,\n });\n\n const translationsName = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationDefaultKey.REALMS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationsName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityPicker,\n defineEntityPickerVEmitOptions,\n defineEntityPickerVProps,\n} from '../../utility/entity/picker/module';\nimport type { EntityPickerVSlots } from '../../utility/entity/picker/types';\nimport { ARealms } from './ARealms';\n\nexport const ARealmPicker = defineComponent({\n props: defineEntityPickerVProps<Realm>(),\n emits: defineEntityPickerVEmitOptions<Realm>(),\n slots: Object as SlotsType<EntityPickerVSlots<Realm>>,\n setup(props, setup) {\n const { render } = defineEntityPicker({\n component: ARealms,\n props,\n setup,\n });\n\n return () => render();\n },\n});\n","<!--\n - Copyright (c) 2026.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n watch,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { type Client, EntityType } from '@authup/core-kit';\nimport { createNanoID, isBCryptHash } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { ARealmPicker } from '../realm';\nimport {\n AFormInputList, \n AFormSubmit, \n defineEntityManager, \n defineEntityVEmitOptions,\n} from '../../utility';\nimport {\n TranslatorTranslationClientKey,\n TranslatorTranslationDefaultKey, \n TranslatorTranslationGroup, \n VuelidateCustomRule, \n VuelidateCustomRuleKey,\n assignFormProperties,\n injectStore,\n storeToRefs, \n useTranslationsForGroup,\n} from '../../../core';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n ARealmPicker,\n AFormInputList,\n IVuelidate,\n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: {\n type: Object as PropType<Client>,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Client>(),\n setup(props, ctx) {\n const form = reactive({\n active: true,\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n redirect_uri: '',\n base_url: '',\n root_url: '',\n is_confidential: true,\n secret: '',\n secret_hashed: false,\n });\n\n const vuelidate = useVuelidate({\n active: { required },\n name: {\n required,\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n realm_id: { required },\n redirect_uri: {\n // todo: url is required!\n maxLength: maxLength(2000),\n },\n is_confidential: {},\n secret: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n secret_hashed: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed(() => !!props.name && props.name.length > 0);\n const realmId = computed(() => (manager.data.value ?\n manager.data.value.realm_id :\n storeRefs.realmId.value));\n\n const generateSecret = () => createNanoID('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_!.', 32);\n const isSecretHashed = computed(\n () => {\n if (!manager.data.value || manager.data.value.secret !== form.secret) {\n return false;\n }\n\n return isBCryptHash(form.secret);\n },\n );\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n assignFormProperties(form, manager.data.value);\n\n form.realm_id = realmId.value ?? '';\n\n if (form.secret.length === 0) {\n form.secret = generateSecret();\n }\n }\n\n const isConfidential = computed(() => form.is_confidential);\n watch(isConfidential, (val, oldValue) => {\n if (val === oldValue) return;\n\n if (val) {\n form.secret = manager.data.value?.secret || generateSecret();\n } else {\n form.secret = '';\n }\n });\n\n watch(\n updatedAt,\n (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n },\n );\n\n initForm();\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n\n assignFormProperties(form, manager.data.value);\n };\n\n const translationsClient = useTranslationsForGroup(\n TranslatorTranslationGroup.CLIENT,\n [\n { key: TranslatorTranslationClientKey.NAME_HINT },\n { key: TranslatorTranslationClientKey.DESCRIPTION_HINT },\n { key: TranslatorTranslationClientKey.REDIRECT_URI_HINT },\n { key: TranslatorTranslationClientKey.IS_CONFIDENTIAL },\n { key: TranslatorTranslationClientKey.IS_ACTIVE },\n { key: TranslatorTranslationClientKey.HASH_SECRET },\n ],\n );\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n { key: TranslatorTranslationDefaultKey.REDIRECT_URIS },\n { key: TranslatorTranslationDefaultKey.SECRET },\n ],\n );\n\n const redirectUris = computed(() => (vuelidate.value.redirect_uri.$model ?\n vuelidate.value.redirect_uri.$model.split(',') :\n []));\n\n return {\n translationsDefault,\n translationsClient,\n\n vuelidate,\n data: manager.data,\n isNameFixed,\n isBusy: manager.busy.value,\n isEditing,\n\n isSecretHashed,\n generateSecret,\n\n redirectUris,\n\n submit,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <template v-if=\"data\">\n <VCFormGroup>\n <template #label>\n ID\n </template>\n <VCFormInput\n :model-value=\"data.id\"\n :disabled=\"true\"\n />\n </VCFormGroup>\n </template>\n\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.name }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n <small>{{ translationsClient.nameHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.displayName }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.secret\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.secret }}\n\n <template v-if=\"isSecretHashed\">\n <span class=\"text-danger font-weight-bold\">\n <i class=\"fa fa-exclamation-triangle\" />\n </span>\n </template>\n </template>\n <VCFormInput\n v-model=\"vuelidate.secret.$model\"\n :disabled=\"!vuelidate.is_confidential.$model\"\n >\n <template #groupAppend>\n <button\n class=\"btn\"\n type=\"button\"\n @click.prevent=\"() => vuelidate.secret.$model = generateSecret()\"\n >\n <i class=\"fa fa-refresh\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.is_confidential\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.is_confidential.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isConfidential.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.secret_hashed\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.secret_hashed.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.hashSecret.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.active\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.active.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isActive.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n\n <template v-if=\"!realmId && !isEditing\">\n <hr>\n <IVuelidate :validation=\"vuelidate.realm_id\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.realm }}\n </template>\n <template #default>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(input: string[]) => {\n\n vuelidate.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n }\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </template>\n </div>\n <div class=\"col\">\n <AFormInputList\n :names=\"redirectUris\"\n @changed=\"(value) => {\n if (value.length === 0) {\n vuelidate.redirect_uri.$model = '';\n return;\n }\n vuelidate.redirect_uri.$model = value.join(',');\n }\"\n >\n <template #label>\n {{ translationsDefault.redirectUris }}\n </template>\n </AFormInputList>\n <small>{{ translationsClient.redirectURIHint }}</small>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.description }}\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"7\"\n />\n </VCFormGroup>\n\n <small>{{ translationsClient.descriptionHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <div>\n <AFormSubmit\n :is-busy=\"isBusy\"\n :is-editing=\"isEditing\"\n :is-invalid=\"vuelidate.$invalid\"\n @submit=\"submit\"\n />\n </div>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2026.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n\n<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n watch,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport { type Client, EntityType } from '@authup/core-kit';\nimport { createNanoID, isBCryptHash } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { ARealmPicker } from '../realm';\nimport {\n AFormInputList, \n AFormSubmit, \n defineEntityManager, \n defineEntityVEmitOptions,\n} from '../../utility';\nimport {\n TranslatorTranslationClientKey,\n TranslatorTranslationDefaultKey, \n TranslatorTranslationGroup, \n VuelidateCustomRule, \n VuelidateCustomRuleKey,\n assignFormProperties,\n injectStore,\n storeToRefs, \n useTranslationsForGroup,\n} from '../../../core';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n ARealmPicker,\n AFormInputList,\n IVuelidate,\n },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: {\n type: Object as PropType<Client>,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Client>(),\n setup(props, ctx) {\n const form = reactive({\n active: true,\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n redirect_uri: '',\n base_url: '',\n root_url: '',\n is_confidential: true,\n secret: '',\n secret_hashed: false,\n });\n\n const vuelidate = useVuelidate({\n active: { required },\n name: {\n required,\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n realm_id: { required },\n redirect_uri: {\n // todo: url is required!\n maxLength: maxLength(2000),\n },\n is_confidential: {},\n secret: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n secret_hashed: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed(() => !!props.name && props.name.length > 0);\n const realmId = computed(() => (manager.data.value ?\n manager.data.value.realm_id :\n storeRefs.realmId.value));\n\n const generateSecret = () => createNanoID('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_!.', 32);\n const isSecretHashed = computed(\n () => {\n if (!manager.data.value || manager.data.value.secret !== form.secret) {\n return false;\n }\n\n return isBCryptHash(form.secret);\n },\n );\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n assignFormProperties(form, manager.data.value);\n\n form.realm_id = realmId.value ?? '';\n\n if (form.secret.length === 0) {\n form.secret = generateSecret();\n }\n }\n\n const isConfidential = computed(() => form.is_confidential);\n watch(isConfidential, (val, oldValue) => {\n if (val === oldValue) return;\n\n if (val) {\n form.secret = manager.data.value?.secret || generateSecret();\n } else {\n form.secret = '';\n }\n });\n\n watch(\n updatedAt,\n (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n },\n );\n\n initForm();\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n\n assignFormProperties(form, manager.data.value);\n };\n\n const translationsClient = useTranslationsForGroup(\n TranslatorTranslationGroup.CLIENT,\n [\n { key: TranslatorTranslationClientKey.NAME_HINT },\n { key: TranslatorTranslationClientKey.DESCRIPTION_HINT },\n { key: TranslatorTranslationClientKey.REDIRECT_URI_HINT },\n { key: TranslatorTranslationClientKey.IS_CONFIDENTIAL },\n { key: TranslatorTranslationClientKey.IS_ACTIVE },\n { key: TranslatorTranslationClientKey.HASH_SECRET },\n ],\n );\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n { key: TranslatorTranslationDefaultKey.REDIRECT_URIS },\n { key: TranslatorTranslationDefaultKey.SECRET },\n ],\n );\n\n const redirectUris = computed(() => (vuelidate.value.redirect_uri.$model ?\n vuelidate.value.redirect_uri.$model.split(',') :\n []));\n\n return {\n translationsDefault,\n translationsClient,\n\n vuelidate,\n data: manager.data,\n isNameFixed,\n isBusy: manager.busy.value,\n isEditing,\n\n isSecretHashed,\n generateSecret,\n\n redirectUris,\n\n submit,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <template v-if=\"data\">\n <VCFormGroup>\n <template #label>\n ID\n </template>\n <VCFormInput\n :model-value=\"data.id\"\n :disabled=\"true\"\n />\n </VCFormGroup>\n </template>\n\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.name }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n <small>{{ translationsClient.nameHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.displayName }}\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n :disabled=\"isNameFixed\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.secret\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.secret }}\n\n <template v-if=\"isSecretHashed\">\n <span class=\"text-danger font-weight-bold\">\n <i class=\"fa fa-exclamation-triangle\" />\n </span>\n </template>\n </template>\n <VCFormInput\n v-model=\"vuelidate.secret.$model\"\n :disabled=\"!vuelidate.is_confidential.$model\"\n >\n <template #groupAppend>\n <button\n class=\"btn\"\n type=\"button\"\n @click.prevent=\"() => vuelidate.secret.$model = generateSecret()\"\n >\n <i class=\"fa fa-refresh\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.is_confidential\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.is_confidential.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isConfidential.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.secret_hashed\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.secret_hashed.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.hashSecret.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.active\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.active.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n :label-content=\"translationsClient.isActive.value\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n\n <template v-if=\"!realmId && !isEditing\">\n <hr>\n <IVuelidate :validation=\"vuelidate.realm_id\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.realm }}\n </template>\n <template #default>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(input: string[]) => {\n\n vuelidate.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n }\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </template>\n </div>\n <div class=\"col\">\n <AFormInputList\n :names=\"redirectUris\"\n @changed=\"(value) => {\n if (value.length === 0) {\n vuelidate.redirect_uri.$model = '';\n return;\n }\n vuelidate.redirect_uri.$model = value.join(',');\n }\"\n >\n <template #label>\n {{ translationsDefault.redirectUris }}\n </template>\n </AFormInputList>\n <small>{{ translationsClient.redirectURIHint }}</small>\n\n <hr>\n\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n {{ translationsDefault.description }}\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"7\"\n />\n </VCFormGroup>\n\n <small>{{ translationsClient.descriptionHint }}</small>\n </template>\n </IVuelidate>\n\n <hr>\n\n <div>\n <AFormSubmit\n :is-busy=\"isBusy\"\n :is-editing=\"isEditing\"\n :is-invalid=\"vuelidate.$invalid\"\n @submit=\"submit\"\n />\n </div>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Client } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\n\nexport const AClients = defineComponent({\n props: defineEntityCollectionVProps<Client>(),\n emits: defineEntityCollectionVEmitOptions<Client>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Client>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.CLIENT}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.CLIENTS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AClients;\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityPicker,\n defineEntityPickerVEmitOptions,\n defineEntityPickerVProps,\n} from '../../utility/entity/picker/module';\nimport type { EntityPickerVSlots } from '../../utility/entity/picker/types';\nimport { AClients } from './AClients';\n\nexport const AClientPicker = defineComponent({\n props: defineEntityPickerVProps<Client>(),\n emits: defineEntityPickerVEmitOptions<Client>(),\n slots: Object as SlotsType<EntityPickerVSlots<Client>>,\n setup(props, setup) {\n const { render } = defineEntityPicker({\n component: AClients,\n props,\n setup,\n });\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Permission } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const APermission = defineComponent({\n props: defineEntityVProps<Permission>(),\n emits: defineEntityVEmitOptions<Permission>(),\n slots: Object as SlotsType<EntityVSlots<Permission>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION}`,\n setup,\n props,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionEvaluationOptions } from '@authup/access';\nimport { PolicyData } from '@authup/access';\nimport { SlotName } from '@vuecs/list-controls';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport { createPermissionCheckerReactiveFn, hasNormalizedSlot, normalizeSlot } from '../../../core';\n\nexport const APermissionCheck = defineComponent({\n props: {\n name: {\n type: [String, Array] as PropType<string | string[]>,\n required: true,\n },\n input: { type: Object as PropType<Record<string, any>> },\n options: { type: Object as PropType<PermissionEvaluationOptions> },\n },\n setup(props, { slots }) {\n const fn = createPermissionCheckerReactiveFn();\n\n const isPermitted = computed(() => fn({\n name: props.name,\n input: new PolicyData(props.input),\n options: props.options,\n }));\n\n return () => {\n if (\n isPermitted.value &&\n hasNormalizedSlot(SlotName.DEFAULT, slots)\n ) {\n return normalizeSlot(SlotName.DEFAULT, {}, slots);\n }\n\n return [];\n };\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport { DecisionStrategy } from '@authup/kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n reactive,\n ref,\n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { \n buildFormGroup, \n buildFormInput, \n buildFormSelect, \n buildFormTextarea, \n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n injectStore,\n storeToRefs,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { ARealmPicker } from '../realm';\n\nfunction decisionStrategyHint(value: string) : string {\n switch (value) {\n case DecisionStrategy.AFFIRMATIVE:\n return 'At least one policy must evaluate positively.';\n case DecisionStrategy.CONSENSUS:\n return 'More policies must evaluate positively than negatively.';\n case DecisionStrategy.UNANIMOUS:\n return 'All policies must evaluate positively.';\n default:\n return 'No strategy selected. Defaults to unanimous (all policies must evaluate positively).';\n }\n}\n\nexport const APermissionForm = defineComponent({\n props: { entity: { type: Object as PropType<Permission> } },\n emits: defineEntityVEmitOptions<Permission>(),\n setup(props, ctx) {\n const busy = ref(false);\n\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n decision_strategy: '',\n realm_id: '',\n });\n\n const decisionStrategyOptions : FormSelectOption[] = Object.values(DecisionStrategy)\n .map((value) => ({\n id: value,\n value,\n }));\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n decision_strategy: {},\n realm_id: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION}`,\n setup: ctx,\n props,\n });\n\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return manager.data.value ?\n manager.data.value.realm_id :\n null;\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n function initForm() {\n assignFormProperties(form, manager.data.value);\n\n if (realmId.value) {\n form.realm_id = realmId.value;\n }\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n const data : Record<string, any> = {\n ...form,\n decision_strategy: form.decision_strategy || null,\n };\n\n await manager.createOrUpdate(data);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.DECISION_STRATEGY },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n const render = () => {\n const children : VNodeArrayChildren = [];\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: {\n disabled: manager.data.value &&\n manager.data.value.built_in,\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 4 },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.decision_strategy.value,\n validationSeverity: getVuelidateSeverity($v.value.decision_strategy),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DECISION_STRATEGY].value,\n content: [\n buildFormSelect({\n value: $v.value.decision_strategy.$model,\n onChange(input) {\n $v.value.decision_strategy.$model = input;\n },\n options: decisionStrategyOptions,\n optionDefault: true,\n optionDefaultValue: '-- None (default: unanimous) --',\n }),\n h('div', { class: 'alert alert-sm alert-info mt-1 mb-0' }, decisionStrategyHint($v.value.decision_strategy.$model)),\n ],\n }));\n\n if (!realmId.value && !isEditing.value) {\n children.push(buildFormGroup({\n validationMessages: translationsValidation.realm_id.value,\n validationSeverity: getVuelidateSeverity($v.value.realm_id),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.REALM].value,\n content: h(ARealmPicker, {\n value: $v.value.realm_id.$model,\n multiple: false,\n onChange(input: string[]) {\n $v.value.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n },\n }),\n }));\n }\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n\n return () => render();\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Permission } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const APermissions = defineComponent({\n props: defineEntityCollectionVProps<Permission>(),\n emits: defineEntityCollectionVEmitOptions<Permission>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Permission>>,\n setup(props, setup) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.PERMISSION}`,\n props,\n setup,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.PERMISSIONS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const APolicies = defineComponent({\n props: defineEntityCollectionVProps<Policy>(),\n emits: defineEntityCollectionVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Policy>>,\n setup(props, setup) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.POLICY}`,\n props,\n setup,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.POLICIES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BuiltInPolicyType } from '@authup/access';\n\nconst typeLabels: Record<string, string> = {\n [BuiltInPolicyType.COMPOSITE]: 'Composite',\n [BuiltInPolicyType.DATE]: 'Date',\n [BuiltInPolicyType.TIME]: 'Time',\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: 'Attr Names',\n [BuiltInPolicyType.ATTRIBUTES]: 'Attributes',\n [BuiltInPolicyType.REALM_MATCH]: 'Realm Match',\n [BuiltInPolicyType.IDENTITY]: 'Identity',\n [BuiltInPolicyType.PERMISSION_BINDING]: 'Perm Binding',\n};\n\nexport default defineComponent({\n props: {\n type: {\n type: String,\n required: true,\n },\n },\n setup() {\n return { typeLabels };\n },\n});\n</script>\n<template>\n <span class=\"badge bg-info\">{{ typeLabels[type] || type }}</span>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BuiltInPolicyType } from '@authup/access';\n\nconst typeLabels: Record<string, string> = {\n [BuiltInPolicyType.COMPOSITE]: 'Composite',\n [BuiltInPolicyType.DATE]: 'Date',\n [BuiltInPolicyType.TIME]: 'Time',\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: 'Attr Names',\n [BuiltInPolicyType.ATTRIBUTES]: 'Attributes',\n [BuiltInPolicyType.REALM_MATCH]: 'Realm Match',\n [BuiltInPolicyType.IDENTITY]: 'Identity',\n [BuiltInPolicyType.PERMISSION_BINDING]: 'Perm Binding',\n};\n\nexport default defineComponent({\n props: {\n type: {\n type: String,\n required: true,\n },\n },\n setup() {\n return { typeLabels };\n },\n});\n</script>\n<template>\n <span class=\"badge bg-info\">{{ typeLabels[type] || type }}</span>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: ['click'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('click', props.policyId);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n class=\"btn btn-xs btn-outline-info\"\n title=\"View policy details\"\n aria-label=\"View policy details\"\n @click=\"handleClick\"\n >\n <i class=\"fa fa-eye\" />\n </button>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: ['click'],\n setup(props, { emit }) {\n const handleClick = (e: Event) => {\n e.preventDefault();\n emit('click', props.policyId);\n };\n\n return { handleClick };\n },\n});\n</script>\n<template>\n <button\n type=\"button\"\n class=\"btn btn-xs btn-outline-info\"\n title=\"View policy details\"\n aria-label=\"View policy details\"\n @click=\"handleClick\"\n >\n <i class=\"fa fa-eye\" />\n </button>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\nimport APolicyDetailNav from './APolicyDetailNav.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge, APolicyDetailNav },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n emits: ['detail'],\n setup(props, { emit }) {\n const handleDetail = () => {\n emit('detail', props.entity);\n };\n\n return { handleDetail };\n },\n});\n</script>\n<template>\n <APolicyTypeBadge :type=\"entity.type\" />\n <span\n v-if=\"entity.invert\"\n class=\"badge bg-warning\"\n >Inverted</span>\n <APolicyDetailNav\n :policy-id=\"entity.id\"\n @click=\"handleDetail\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\nimport APolicyDetailNav from './APolicyDetailNav.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge, APolicyDetailNav },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n emits: ['detail'],\n setup(props, { emit }) {\n const handleDetail = () => {\n emit('detail', props.entity);\n };\n\n return { handleDetail };\n },\n});\n</script>\n<template>\n <APolicyTypeBadge :type=\"entity.type\" />\n <span\n v-if=\"entity.invert\"\n class=\"badge bg-warning\"\n >Inverted</span>\n <APolicyDetailNav\n :policy-id=\"entity.id\"\n @click=\"handleDetail\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Name</strong>\n <div>{{ entity.name }}</div>\n </div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Type</strong>\n <div>\n <APolicyTypeBadge :type=\"entity.type\" />\n </div>\n </div>\n <div\n v-if=\"entity.display_name\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Display Name</strong>\n <div>{{ entity.display_name }}</div>\n </div>\n <div\n v-if=\"entity.description\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Description</strong>\n <div>{{ entity.description }}</div>\n </div>\n <div\n v-if=\"entity.invert\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Invert</strong>\n <div>\n <span class=\"badge bg-warning\">Yes</span>\n </div>\n </div>\n <div\n v-if=\"entity.built_in\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Built-in</strong>\n <div>\n <span class=\"badge bg-secondary\">Yes</span>\n </div>\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport APolicyTypeBadge from './APolicyTypeBadge.vue';\n\nexport default defineComponent({\n components: { APolicyTypeBadge },\n props: {\n entity: {\n type: Object as PropType<Policy>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Name</strong>\n <div>{{ entity.name }}</div>\n </div>\n <div class=\"d-flex flex-row gap-2 mb-2\">\n <strong style=\"min-width: 120px\">Type</strong>\n <div>\n <APolicyTypeBadge :type=\"entity.type\" />\n </div>\n </div>\n <div\n v-if=\"entity.display_name\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Display Name</strong>\n <div>{{ entity.display_name }}</div>\n </div>\n <div\n v-if=\"entity.description\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Description</strong>\n <div>{{ entity.description }}</div>\n </div>\n <div\n v-if=\"entity.invert\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Invert</strong>\n <div>\n <span class=\"badge bg-warning\">Yes</span>\n </div>\n </div>\n <div\n v-if=\"entity.built_in\"\n class=\"d-flex flex-row gap-2 mb-2\"\n >\n <strong style=\"min-width: 120px\">Built-in</strong>\n <div>\n <span class=\"badge bg-secondary\">Yes</span>\n </div>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { EntityTypeMap, PermissionRelation, Policy } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport {\n Teleport,\n defineComponent,\n h,\n onMounted,\n onUnmounted,\n ref,\n toRef,\n watch,\n} from 'vue';\nimport { SlotName } from '@vuecs/list-controls';\nimport { hasOwnProperty } from '@authup/kit';\nimport { injectHTTPClient } from '../../../core';\nimport { APolicies } from '../policy/APolicies';\nimport APolicyInlineInfo from '../policy/APolicyInlineInfo.vue';\nimport APolicySummary from '../policy/APolicySummary.vue';\n\ntype PermissionBindingEntity = PermissionRelation & { id: string };\n\nexport const APermissionPolicyBindingButton = defineComponent({\n props: {\n entityType: {\n type: String as PropType<keyof EntityTypeMap>,\n required: true,\n },\n entity: {\n type: Object as PropType<PermissionBindingEntity>,\n required: true,\n },\n },\n emits: ['updated', 'failed'],\n setup(props, { emit }) {\n const client = injectHTTPClient();\n\n const modalOpen = ref(false);\n const busy = ref(false);\n const currentPolicyId = ref<string | null>(props.entity.policy_id);\n const detailPolicy = ref<Policy | null>(null);\n\n const entityRef = toRef(props, 'entity');\n watch(entityRef, (val) => {\n currentPolicyId.value = val.policy_id;\n }, { deep: true });\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (detailPolicy.value) {\n detailPolicy.value = null;\n } else if (modalOpen.value) {\n modalOpen.value = false;\n }\n }\n };\n\n onMounted(() => {\n document.addEventListener('keydown', handleKeydown);\n });\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown);\n });\n\n const handlePolicySelect = async (policyId: string | null) => {\n if (busy.value) return;\n\n const api = hasOwnProperty(client, props.entityType) ?\n client[props.entityType] as any :\n undefined;\n\n if (!api || !api.update) return;\n\n busy.value = true;\n try {\n const response = await api.update(props.entity.id, { policy_id: policyId });\n currentPolicyId.value = policyId;\n emit('updated', response);\n } catch (e) {\n if (e instanceof Error) {\n emit('failed', e);\n }\n } finally {\n busy.value = false;\n }\n };\n\n const modalTitleId = `policy-modal-title-${props.entity.id}`;\n\n return () => {\n const children = [];\n\n children.push(h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': busy.value,\n 'btn-primary': !busy.value && currentPolicyId.value,\n 'btn-secondary': !busy.value && !currentPolicyId.value,\n }],\n disabled: busy.value,\n onClick(e: Event) {\n e.preventDefault();\n modalOpen.value = true;\n },\n }, [\n h('i', { class: 'fa fa-cog' }),\n ]));\n\n if (modalOpen.value) {\n const backdrop = h('div', {\n class: 'modal-backdrop fade show',\n onClick() {\n if (detailPolicy.value) {\n detailPolicy.value = null;\n } else {\n modalOpen.value = false;\n }\n },\n });\n\n let modalTitle: string;\n let modalBody;\n let modalFooter;\n\n if (detailPolicy.value) {\n const policy = detailPolicy.value;\n modalTitle = policy.name;\n modalBody = h(APolicySummary, { entity: policy });\n modalFooter = [\n h('button', {\n type: 'button',\n class: 'btn btn-outline-secondary btn-xs',\n onClick() {\n detailPolicy.value = null;\n },\n }, [\n h('i', { class: 'fa fa-arrow-left me-1' }),\n 'Back',\n ]),\n ];\n } else {\n modalTitle = 'Junction Policy';\n modalBody = h(APolicies, { query: { filters: { parent_id: null } } }, {\n [SlotName.ITEM]: (slotProps: { data: Policy }) => {\n const isSelected = currentPolicyId.value === slotProps.data.id;\n\n return [\n h('div', [slotProps.data.name]),\n h(APolicyInlineInfo, {\n entity: slotProps.data,\n onDetail: (policy: Policy) => {\n detailPolicy.value = policy;\n },\n }),\n h('div', { class: 'ms-auto' }, [\n h('button', {\n class: ['btn btn-xs', {\n 'btn-dark': busy.value,\n 'btn-success': !busy.value && isSelected,\n 'btn-secondary': !busy.value && !isSelected,\n }],\n disabled: busy.value,\n onClick(e: Event) {\n e.preventDefault();\n if (isSelected) {\n handlePolicySelect(null);\n } else {\n handlePolicySelect(slotProps.data.id);\n }\n },\n }, [\n h('i', {\n class: ['fa', {\n 'fa-check': isSelected,\n 'fa-plus': !isSelected,\n }],\n }),\n ]),\n ]),\n ];\n },\n });\n modalFooter = [\n currentPolicyId.value ?\n h('button', {\n type: 'button',\n class: 'btn btn-warning btn-xs',\n disabled: busy.value,\n onClick() {\n handlePolicySelect(null);\n },\n }, 'Reset') :\n undefined,\n h('button', {\n type: 'button',\n class: 'btn btn-secondary btn-xs',\n onClick() {\n modalOpen.value = false;\n },\n }, 'Close'),\n ];\n }\n\n const modal = h('div', {\n class: 'modal fade show d-block',\n tabindex: '-1',\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': modalTitleId,\n }, [\n h('div', {\n class: 'modal-dialog',\n role: 'document',\n onClick(e: Event) {\n e.stopPropagation();\n },\n }, [\n h('div', { class: 'modal-content' }, [\n h('div', { class: 'modal-header' }, [\n h('h5', { class: 'modal-title', id: modalTitleId }, modalTitle),\n h('button', {\n type: 'button',\n class: 'btn-close',\n 'aria-label': 'Close',\n onClick() {\n if (detailPolicy.value) {\n detailPolicy.value = null;\n } else {\n modalOpen.value = false;\n }\n },\n }),\n ]),\n h('div', { class: 'modal-body' }, [modalBody]),\n h('div', { class: 'modal-footer' }, modalFooter),\n ]),\n ]),\n ]);\n\n children.push(h(Teleport, { to: 'body' }, [backdrop, modal]));\n }\n\n return h('span', children);\n };\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n clientId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.client_id === props.clientId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: ClientPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.CLIENT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n clientId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.client_id === props.clientId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: ClientPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.CLIENT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AClientPermissionAssignment from './AClientPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AClientPermissionAssignment from './AClientPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive, \n ref, \n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Role } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n buildFormTextarea,\n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n injectStore,\n storeToRefs,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { ARealmPicker } from '../realm';\n\nexport const ARoleForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<Role>,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Role>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(30),\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.ROLE}`,\n setup: ctx,\n props,\n });\n\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return manager.data.value ?\n manager.data.value.realm_id :\n null;\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n function initForm() {\n assignFormProperties(form, manager.data.value);\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n const render = () => {\n const children : VNodeArrayChildren = [];\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }));\n\n children.push(buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 6 },\n }),\n }));\n\n if (!realmId.value && !isEditing.value) {\n children.push(\n buildFormGroup({\n validationMessages: translationsValidation.realm_id.value,\n validationSeverity: getVuelidateSeverity($v.value.realm_id),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.REALM].value,\n content: h(ARealmPicker, {\n value: $v.value.realm_id.$model,\n onChange: (input: string[]) => {\n $v.value.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n },\n }),\n }),\n );\n }\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n\n return () => render();\n },\n});\n\nexport default ARoleForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Role } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\n\nexport const ARoles = defineComponent({\n props: defineEntityCollectionVProps<Role>(),\n emits: defineEntityCollectionVEmitOptions<Role>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Role>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.ROLE}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationDefaultKey.ROLES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default ARoles;\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Role } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const ARole = defineComponent({\n props: defineEntityVProps<Role>(),\n emits: defineEntityVEmitOptions<Role>(),\n slots: Object as SlotsType<EntityVSlots<Role>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROLE}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n clientId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n clientId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AClientRoleAssignment from './AClientRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AClientRoleAssignment },\n props: {\n entityId: { type: String, required: true },\n realmId: String,\n },\n setup(props, { slots }) {\n const query = computed(() => ({ filters: { realm_id: [...(props.realmId ? [props.realmId] : []), null] } }));\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n\n return { query, forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :query=\"query\">\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AClientRoleAssignment from './AClientRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AClientRoleAssignment },\n props: {\n entityId: { type: String, required: true },\n realmId: String,\n },\n setup(props, { slots }) {\n const query = computed(() => ({ filters: { realm_id: [...(props.realmId ? [props.realmId] : []), null] } }));\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n\n return { query, forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :query=\"query\">\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AClientScope = defineComponent({\n props: defineEntityVProps<ClientScope>(),\n emits: defineEntityVEmitOptions<ClientScope>(),\n slots: Object as SlotsType<EntityVSlots<ClientScope>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const AClientScopes = defineComponent({\n props: defineEntityCollectionVProps<ClientScope>(),\n emits: defineEntityCollectionVEmitOptions<ClientScope>(),\n slots: Object as SlotsType<EntityCollectionVSlots<ClientScope>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n props,\n setup: ctx,\n });\n\n const translationClientScopes = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.CLIENT_SCOPES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationClientScopes },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AClientScopes;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type {\n PropType,\n VNodeArrayChildren,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n reactive,\n ref,\n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Scope } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n buildFormTextarea,\n} from '@vuecs/form-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n injectStore,\n storeToRefs,\n useTranslationsForGroup, \n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { ARealmPicker } from '../realm';\n\nexport const AScopeForm = defineComponent({\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: { type: Object as PropType<Scope> },\n },\n emits: defineEntityVEmitOptions<Scope>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const $v = useVuelidate({\n name: {\n required,\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(3),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form);\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const manager = defineEntityManager({\n type: `${EntityType.SCOPE}`,\n setup: ctx,\n props,\n });\n\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return manager.data.value ?\n manager.data.value.realm_id :\n null;\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed<boolean>(() => {\n if (!!props.name && props.name.length > 0) {\n return true;\n }\n\n return !!(manager.data.value && manager.data.value.built_in);\n });\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n assignFormProperties(form, manager.data.value);\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.REALM },\n ],\n );\n\n return () => {\n const children : VNodeArrayChildren = [\n buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: { disabled: isNameFixed.value },\n }),\n }),\n buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: translationsValidation.description.value,\n validationSeverity: getVuelidateSeverity($v.value.description),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DESCRIPTION].value,\n content: buildFormTextarea({\n value: $v.value.description.$model,\n onChange(input) {\n $v.value.description.$model = input;\n },\n props: { rows: 7 },\n }),\n }),\n ];\n\n if (\n !realmId.value &&\n !isNameFixed.value &&\n !isEditing.value\n ) {\n children.push(buildFormGroup({\n validationMessages: translationsValidation.realm_id.value,\n validationSeverity: getVuelidateSeverity($v.value.realm_id),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.REALM].value,\n content: h(ARealmPicker, {\n value: $v.value.realm_id.$model,\n onChange: (input: string[]) => {\n $v.value.realm_id.$model = input.length > 0 ? input[0] ?? '' : '';\n },\n }),\n }));\n }\n\n children.push(buildFormSubmitWithTranslations({\n submit,\n busy,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit));\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, children);\n };\n },\n});\n\nexport default AScopeForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Scope } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\n\nexport const AScopes = defineComponent({\n props: defineEntityCollectionVProps<Scope>(),\n emits: defineEntityCollectionVEmitOptions<Scope>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Scope>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: EntityType.SCOPE,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.SCOPES,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AScopes;\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Scope } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AScope = defineComponent({\n props: defineEntityVProps<Scope>(),\n emits: defineEntityVEmitOptions<Scope>(),\n slots: Object as SlotsType<EntityVSlots<Scope>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.SCOPE}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n clientId: { type: String, required: true },\n scopeId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientScope>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.scope_id === props.scopeId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n scope_id: props.scopeId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n clientId: { type: String, required: true },\n scopeId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<ClientScope>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.CLIENT_SCOPE}`,\n setup,\n query: () => ({\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.client_id === props.clientId &&\n event.data.scope_id === props.scopeId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n client_id: props.clientId,\n scope_id: props.scopeId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n client_id: props.clientId,\n scope_id: props.scopeId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AScopes } from '../scope';\nimport AClientScopeAssignment from './AClientScopeAssignment.vue';\n\nexport default defineComponent({\n components: { AScopes, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AScopes>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :scope-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AScopes>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AScopes } from '../scope';\nimport AClientScopeAssignment from './AClientScopeAssignment.vue';\n\nexport default defineComponent({\n components: { AScopes, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AScopes>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :client-id=\"entityId\"\n :scope-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AScopes>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AIdentityProvider = defineComponent({\n props: defineEntityVProps<IdentityProvider>(),\n emits: defineEntityVEmitOptions<IdentityProvider>(),\n slots: Object as SlotsType<EntityVSlots<IdentityProvider>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider } from '@authup/core-kit';\nimport { createNanoID } from '@authup/kit';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive,\n} from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey, \n assignFormProperties, \n getVuelidateSeverity, \n useTranslationsForGroup, \n useTranslationsForNestedValidation,\n} from '../../../core';\n\nexport const AIdentityProviderBasicFields = defineComponent({\n props: { entity: { type: Object as PropType<Partial<IdentityProvider>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n name: '',\n display_name: '',\n enabled: true,\n });\n\n const $v = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n [VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT]: VuelidateCustomRule[\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ],\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n enabled: { required },\n }, form, { $registerAs: 'basic' });\n\n const isNameEmpty = computed(() => !form.name || form.name.length === 0);\n\n function generateId() {\n form.name = createNanoID();\n }\n\n const update = () => {\n setup.emit('updated', {\n data: form,\n valid: !$v.value.$invalid,\n });\n };\n\n function assign(data: Partial<IdentityProvider> = {}) {\n assignFormProperties(form, data);\n\n if (isNameEmpty.value) {\n generateId();\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n ],\n );\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n\n return () => {\n const name = buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n }),\n });\n\n const nameGenerator = h('div', { class: 'mb-3' }, [\n h('button', {\n class: 'btn btn-xs btn-dark',\n onClick($event: any) {\n $event.preventDefault();\n\n generateId.call(null);\n update();\n },\n }, [\n h('i', { class: 'fa fa-refresh' }),\n ' ',\n 'Generate',\n ]),\n ]);\n\n const displayName = buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n });\n\n const enabled = buildFormInputCheckbox({\n groupClass: 'form-switch mt-3',\n labelContent: 'Enabled?',\n value: $v.value.enabled.$model,\n onChange(input) {\n $v.value.enabled.$model = input;\n update();\n },\n });\n\n return [\n name,\n nameGenerator,\n displayName,\n enabled,\n ];\n };\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { numeric, required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapConnectionFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n url: '',\n timeout: 0,\n start_tls: true,\n base_dn: '',\n });\n\n const $v = useVuelidate({\n url: { required },\n timeout: { numeric },\n start_tls: { required },\n base_dn: { required },\n }, form, { $registerAs: 'connection' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.url.value,\n validationSeverity: getVuelidateSeverity($v.value.url),\n label: true,\n labelContent: 'URL',\n content: buildFormInput({\n value: $v.value.url.$model,\n onChange(input) {\n $v.value.url.$model = input;\n },\n props: { placeholder: '<scheme>://<address>:<port>' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.timeout.value,\n validationSeverity: getVuelidateSeverity($v.value.timeout),\n label: true,\n labelContent: 'Timeout',\n content: buildFormInput({\n value: $v.value.timeout.$model,\n onChange(input) {\n const intValue = Number.parseInt(input, 10);\n if (!Number.isNaN(intValue)) {\n $v.value.timeout.$model = intValue;\n }\n },\n props: { type: 'number' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.start_tls.value,\n validationSeverity: getVuelidateSeverity($v.value.start_tls),\n label: true,\n labelContent: 'StartTLS',\n content: buildFormInputCheckbox({\n groupClass: 'form-switch',\n labelContent: 'Enable StartTLS process?',\n value: $v.value.start_tls.$model,\n onChange(input) {\n $v.value.start_tls.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.base_dn.value,\n validationSeverity: getVuelidateSeverity($v.value.base_dn),\n label: true,\n labelContent: 'Base DN',\n content: buildFormInput({\n value: $v.value.base_dn.$model,\n onChange(input) {\n $v.value.base_dn.$model = input;\n },\n props: { placeholder: 'e.g. dc=example,dc=com' },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapCredentialsFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n user: '',\n password: '',\n });\n\n const $v = useVuelidate({\n user: { required },\n password: { required },\n }, form, { $registerAs: 'credentials' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.user.value,\n validationSeverity: getVuelidateSeverity($v.value.user),\n label: true,\n labelContent: 'User',\n content: buildFormInput({\n value: $v.value.user.$model,\n onChange(input) {\n $v.value.user.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.password.value,\n validationSeverity: getVuelidateSeverity($v.value.password),\n label: true,\n labelContent: 'Password',\n content: buildFormInput({\n value: $v.value.password.$model,\n onChange(input) {\n $v.value.password.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapGroupFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n group_filter: '',\n group_base_dn: '',\n group_name_attribute: '',\n group_class: '',\n group_member_attribute: '',\n group_member_user_attribute: '',\n });\n\n const $v = useVuelidate({\n group_filter: {},\n group_base_dn: {},\n group_name_attribute: {},\n group_class: {},\n group_member_attribute: {},\n group_member_user_attribute: {},\n }, form, { $registerAs: 'group' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.group_filter.value,\n validationSeverity: getVuelidateSeverity($v.value.group_filter),\n label: true,\n labelContent: 'Filter',\n content: buildFormInput({\n value: $v.value.group_filter.$model,\n onChange(input) {\n $v.value.group_filter.$model = input;\n },\n props: { placeholder: '(member={{dn}})' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_base_dn.value,\n validationSeverity: getVuelidateSeverity($v.value.group_base_dn),\n label: true,\n labelContent: 'Base DN',\n content: buildFormInput({\n value: $v.value.group_base_dn.$model,\n onChange(input) {\n $v.value.group_base_dn.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_class.value,\n validationSeverity: getVuelidateSeverity($v.value.group_class),\n label: true,\n labelContent: 'Class',\n content: buildFormInput({\n value: $v.value.group_class.$model,\n onChange(input) {\n $v.value.group_class.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_name_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.group_name_attribute),\n label: true,\n labelContent: 'Name Attribute',\n content: buildFormInput({\n value: $v.value.group_name_attribute.$model,\n onChange(input) {\n $v.value.group_name_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_member_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.group_member_attribute),\n label: true,\n labelContent: 'Member Attribute',\n content: buildFormInput({\n value: $v.value.group_member_attribute.$model,\n onChange(input) {\n $v.value.group_member_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.group_member_user_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.group_member_user_attribute),\n label: true,\n labelContent: 'Member User Attribute',\n content: buildFormInput({\n value: $v.value.group_member_user_attribute.$model,\n onChange(input) {\n $v.value.group_member_user_attribute.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderLdapUserFields = defineComponent({\n props: {\n entity: { type: Object as PropType<Partial<LdapIdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n user_filter: '',\n user_base_dn: '',\n user_name_attribute: '',\n user_mail_attribute: '',\n user_display_name_attribute: '',\n } satisfies Omit<LdapIdentityProvider, keyof IdentityProvider | 'base_dn' | 'url'>);\n\n const $v = useVuelidate({\n user_filter: {},\n user_base_dn: {},\n user_name_attribute: {},\n user_mail_attribute: {},\n user_display_name_attribute: {},\n }, form, { $registerAs: 'user' });\n\n function init() {\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.user_filter.value,\n validationSeverity: getVuelidateSeverity($v.value.user_filter),\n label: true,\n labelContent: 'Filter',\n content: buildFormInput({\n value: $v.value.user_filter.$model,\n onChange(input) {\n $v.value.user_filter.$model = input;\n },\n props: { placeholder: '(|({name_attribute}={{input}})({mail_attribute}={{input}}))' },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_base_dn.value,\n validationSeverity: getVuelidateSeverity($v.value.user_base_dn),\n label: true,\n labelContent: 'Base DN',\n content: buildFormInput({\n value: $v.value.user_base_dn.$model,\n onChange(input) {\n $v.value.user_base_dn.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_name_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.user_name_attribute),\n label: true,\n labelContent: 'Name Attribute',\n content: buildFormInput({\n value: $v.value.user_name_attribute.$model,\n onChange(input) {\n $v.value.user_name_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_mail_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.user_mail_attribute),\n label: true,\n labelContent: 'Mail Attribute',\n content: buildFormInput({\n value: $v.value.user_mail_attribute.$model,\n onChange(input) {\n $v.value.user_mail_attribute.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.user_display_name_attribute.value,\n validationSeverity: getVuelidateSeverity($v.value.user_display_name_attribute),\n label: true,\n labelContent: 'DisplayName Attribute',\n content: buildFormInput({\n value: $v.value.user_display_name_attribute.$model,\n onChange(input) {\n $v.value.user_display_name_attribute.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { IdentityProviderProtocol } from '@authup/core-kit';\nimport type { IdentityProviderProtocolElement } from './type';\n\nconst elements = {\n [IdentityProviderProtocol.OAUTH2]: {\n name: 'OAuth2',\n icon: 'fa fa-lock',\n },\n [IdentityProviderProtocol.OIDC]: {\n name: 'OpenID Connect',\n icon: 'fas fa-id-card',\n },\n [IdentityProviderProtocol.LDAP]: {\n name: 'LDAP',\n icon: 'fas fa-sitemap',\n },\n};\n\nexport function getIdentityProviderProtocolElement(\n id: `${IdentityProviderProtocol}`,\n) : IdentityProviderProtocolElement | undefined {\n return elements[id];\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderProtocol } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\nimport { getIdentityProviderProtocolElement } from './protocol';\n\nexport const AIdentityProviderProtocol = defineComponent({\n props: {\n id: {\n type: String,\n required: true,\n },\n },\n setup(props, setup) {\n const preset = getIdentityProviderProtocolElement(props.id as IdentityProviderProtocol);\n if (preset) {\n if (hasNormalizedSlot('default', setup.slots)) {\n return () => normalizeSlot('default', preset, setup.slots);\n }\n } else if (hasNormalizedSlot('error', setup.slots)) {\n return () => normalizeSlot('error', {}, setup.slots);\n }\n\n return () => [];\n },\n});\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, LdapIdentityProvider } from '@authup/core-kit';\nimport { EntityType, IdentityProviderProtocol } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport {\n type PropType, \n type VNodeChild, \n defineComponent, \n h, \n ref,\n} from 'vue';\nimport { useIsEditing } from '../../../composables';\nimport {\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n extractVuelidateResultsFromChild,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport { AIdentityProviderBasicFields } from './AIdentityProviderBasicFields';\nimport { AIdentityProviderLdapConnectionFields } from './AIdentityProviderLdapConnectionFields';\nimport { AIdentityProviderLdapCredentialsFields } from './AIdentityProviderLdapCredentialsFields';\nimport { AIdentityProviderLdapGroupFields } from './AIdentityProviderLdapGroupFields';\nimport { AIdentityProviderLdapUserFields } from './AIdentityProviderLdapUserFields';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\nimport type { IdentityProviderProtocolElement } from './protocol';\n\nexport const AIdentityProviderLdapForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: false,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<IdentityProvider>(),\n setup(props, ctx) {\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n\n const busy = ref(false);\n const $v = useVuelidate({ $stopPropagation: true });\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n const data : Partial<IdentityProvider> = {\n ...extractVuelidateResultsFromChild($v, 'basic'),\n ...extractVuelidateResultsFromChild($v, 'connection'),\n ...extractVuelidateResultsFromChild($v, 'credentials'),\n ...extractVuelidateResultsFromChild($v, 'group'),\n ...extractVuelidateResultsFromChild($v, 'user'),\n protocol: IdentityProviderProtocol.LDAP,\n };\n\n await manager.createOrUpdate(data);\n };\n\n const submitTranslations = createFormSubmitTranslations();\n\n return () => {\n const submitNode = buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, submitTranslations);\n\n let headerNode : VNodeChild | undefined;\n if (!manager.data.value) {\n headerNode = h(AIdentityProviderProtocol, {\n key: IdentityProviderProtocol.LDAP,\n id: IdentityProviderProtocol.LDAP,\n }, {\n default: (element: IdentityProviderProtocolElement) => h('div', [\n h('h4', { class: 'mb-3' }, [\n h('i', { class: [element.icon, 'pe-1'] }),\n element.name,\n ]),\n ]),\n });\n }\n\n const basicNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n 'Basic',\n ]),\n h(AIdentityProviderBasicFields, { entity: manager.data.value }),\n ];\n\n const connectionNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa-solid fa-vihara' }),\n ' ',\n 'Connection',\n ]),\n h(AIdentityProviderLdapConnectionFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n const credentialsNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-lock' }),\n ' ',\n 'Security',\n ]),\n h(AIdentityProviderLdapCredentialsFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n const groupNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa-solid fa-theater-masks' }),\n ' ',\n 'Group',\n ]),\n h(AIdentityProviderLdapGroupFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n const userNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fas fa-user' }),\n ' ',\n 'User',\n ]),\n h(AIdentityProviderLdapUserFields, { entity: manager.data.value as LdapIdentityProvider }),\n ];\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.call(null);\n },\n }, [\n headerNode,\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n basicNode,\n ]),\n h('div', { class: 'col' }, [\n credentialsNode,\n ]),\n ]),\n h('hr'),\n connectionNode,\n h('hr'),\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n userNode,\n ]),\n h('div', { class: 'col' }, [\n groupNode,\n ]),\n ]),\n submitNode,\n ]);\n };\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { IdentityProviderPreset } from '@authup/core-kit';\nimport type { IdentityProviderPresetElement } from './type';\n\nconst elements = {\n [IdentityProviderPreset.FACEBOOK]: {\n name: 'Facebook',\n icon: 'fab fa-facebook',\n },\n [IdentityProviderPreset.GITHUB]: {\n name: 'GitHub',\n icon: 'fab fa-github',\n },\n [IdentityProviderPreset.GITLAB]: {\n name: 'GitLab',\n icon: 'fab fa-gitlab',\n },\n [IdentityProviderPreset.GOOGLE]: {\n name: 'Google',\n icon: 'fab fa-google',\n },\n [IdentityProviderPreset.PAYPAL]: {\n name: 'Paypal',\n icon: 'fab fa-paypal',\n },\n [IdentityProviderPreset.INSTAGRAM]: {\n name: 'Instagram',\n icon: 'fab fa-instagram',\n },\n [IdentityProviderPreset.STACKOVERFLOW]: {\n name: 'StackOverflow',\n icon: 'fa fa-code',\n },\n [IdentityProviderPreset.TWITTER]: {\n name: 'Twitter',\n icon: 'fab fa-twitter',\n },\n};\n\nexport function getIdentityProviderPresetElement(\n id: `${IdentityProviderPreset}`,\n) : IdentityProviderPresetElement | undefined {\n return elements[id];\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderPreset } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { getIdentityProviderPresetElement } from './preset';\nimport { hasNormalizedSlot, normalizeSlot } from '../../../core';\n\nexport const AIdentityProviderPreset = defineComponent({\n props: {\n id: {\n type: String,\n required: true,\n },\n },\n setup(props, setup) {\n const preset = getIdentityProviderPresetElement(props.id as IdentityProviderPreset);\n if (preset) {\n if (hasNormalizedSlot('default', setup.slots)) {\n return () => normalizeSlot('default', preset, setup.slots);\n }\n } else if (hasNormalizedSlot('error', setup.slots)) {\n return () => normalizeSlot('error', {}, setup.slots);\n }\n\n return () => [];\n },\n});\n","<script lang=\"ts\">\nimport { IdentityProviderPreset, IdentityProviderProtocol } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: {\n AIdentityProviderPreset,\n AIdentityProviderProtocol,\n },\n props: {\n protocol: { type: String },\n preset: { type: String },\n },\n emits: ['pick'],\n setup(props, setup) {\n const protocols = Object.values(IdentityProviderProtocol);\n const presets = Object.values(IdentityProviderPreset);\n\n const pickProtocol = (protocol: string) => {\n setup.emit('pick', 'protocol', protocol);\n };\n\n const pickPreset = (preset: string) => {\n setup.emit('pick', 'preset', preset);\n };\n\n return {\n protocols,\n presets,\n pickProtocol,\n pickPreset,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Protocols</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in protocols\"\n :key=\"key\"\n >\n <AIdentityProviderProtocol :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === protocol && !preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickProtocol(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderProtocol>\n </template>\n </div>\n </div>\n <div>\n <h6>Presets</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in presets\"\n :key=\"key\"\n >\n <AIdentityProviderPreset :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickPreset(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderPreset>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.identity-provider-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.identity-provider-picker-item.active,\n.identity-provider-picker-item:hover,\n.identity-provider-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","<script lang=\"ts\">\nimport { IdentityProviderPreset, IdentityProviderProtocol } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: {\n AIdentityProviderPreset,\n AIdentityProviderProtocol,\n },\n props: {\n protocol: { type: String },\n preset: { type: String },\n },\n emits: ['pick'],\n setup(props, setup) {\n const protocols = Object.values(IdentityProviderProtocol);\n const presets = Object.values(IdentityProviderPreset);\n\n const pickProtocol = (protocol: string) => {\n setup.emit('pick', 'protocol', protocol);\n };\n\n const pickPreset = (preset: string) => {\n setup.emit('pick', 'preset', preset);\n };\n\n return {\n protocols,\n presets,\n pickProtocol,\n pickPreset,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Protocols</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in protocols\"\n :key=\"key\"\n >\n <AIdentityProviderProtocol :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === protocol && !preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickProtocol(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderProtocol>\n </template>\n </div>\n </div>\n <div>\n <h6>Presets</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in presets\"\n :key=\"key\"\n >\n <AIdentityProviderPreset :id=\"item\">\n <template #default=\"props\">\n <div\n :class=\"{'active': item === preset}\"\n class=\"d-flex flex-column gap-1 text-center identity-provider-picker-item\"\n @click.prevent=\"pickPreset(item)\"\n >\n <div>\n <i\n class=\"fa-2x\"\n :class=\"props.icon\"\n />\n </div>\n <div>\n {{ props.name }}\n </div>\n </div>\n </template>\n </AIdentityProviderPreset>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.identity-provider-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.identity-provider-picker-item.active,\n.identity-provider-picker-item:hover,\n.identity-provider-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, OAuth2IdentityProvider } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\n\nexport const AIdentityProviderOAuth2ClientFields = defineComponent({\n props: { entity: { type: Object as PropType<Partial<OAuth2IdentityProvider>> } },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n client_id: '',\n client_secret: '',\n });\n\n const $v = useVuelidate({\n client_id: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n client_secret: {\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n }, form, { $registerAs: 'client' });\n\n function assign() {\n assignFormProperties(form, props.entity);\n }\n\n const updatedAt = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updatedAt, () => assign());\n\n assign();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n return () => [\n buildFormGroup({\n validationMessages: validationMessages.client_id.value,\n validationSeverity: getVuelidateSeverity($v.value.client_id),\n label: true,\n labelContent: 'Client ID',\n content: buildFormInput({\n value: $v.value.client_id.$model,\n onChange(input) {\n $v.value.client_id.$model = input;\n },\n }),\n }),\n buildFormGroup({\n validationMessages: validationMessages.client_secret.value,\n validationSeverity: getVuelidateSeverity($v.value.client_secret),\n label: true,\n labelContent: 'Client Secret',\n content: buildFormInput({\n value: $v.value.client_secret.$model,\n onChange(input) {\n $v.value.client_secret.$model = input;\n },\n }),\n }),\n ];\n },\n});\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client } from '@authup/core-http-kit';\nimport { isOpenIDProviderMetadata } from '@authup/specs';\nimport { buildFormGroup, buildFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { url } from '@vuelidate/validators';\nimport type { VNodeChild } from 'vue';\nimport {\n defineComponent, \n h, \n reactive, \n ref,\n} from 'vue';\nimport { getVuelidateSeverity, useTranslationsForBaseValidation } from '../../../core';\n\nexport const AIdentityProviderOAuth2Discovery = defineComponent({\n emits: ['lookup', 'failed'],\n setup(_, setup) {\n const busy = ref(false);\n const form = reactive({ url: '' });\n\n const $v = useVuelidate({ url: { url } }, form);\n\n const lookupValid = ref(false);\n\n const message = ref<string | null>(null);\n\n const apiClient = new Client();\n\n const lookup = async () => {\n if (busy.value || $v.value.url.$invalid) {\n return;\n }\n\n try {\n const response = await apiClient.get(form.url);\n if (isOpenIDProviderMetadata(response.data)) {\n setup.emit('lookup', response.data);\n lookupValid.value = true;\n }\n } catch (e) {\n lookupValid.value = false;\n\n if (e instanceof Error) {\n message.value = `Lookup failed with: ${e.message}`;\n setup.emit('failed', e);\n }\n } finally {\n busy.value = false;\n }\n };\n\n const validationMessages = useTranslationsForBaseValidation($v.value.url);\n\n return () => {\n let messageNode : VNodeChild;\n if (message.value) {\n messageNode = h('div', { class: 'alert alert-sm alert-warning' }, message.value);\n }\n\n return [\n buildFormGroup({\n validationMessages: validationMessages.value,\n validationSeverity: getVuelidateSeverity($v.value.url),\n labelContent: 'Discovery',\n content: buildFormInput({\n class: { 'is-valid': lookupValid.value },\n props: { placeholder: 'https://example.com/.well-known/openid-configuration' },\n value: $v.value.url.$model,\n onChange(input) {\n $v.value.url.$model = input;\n },\n }),\n }),\n messageNode,\n h('button', {\n type: 'button',\n class: 'btn btn-xs btn-primary mb-1',\n disabled: !form.url || $v.value.$invalid,\n onClick($event: any) {\n $event.preventDefault();\n\n return lookup();\n },\n }, [\n h('i', { class: 'fa fa-search pe-1' }),\n 'Lookup',\n ]),\n ];\n };\n },\n});\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider, OAuth2IdentityProvider } from '@authup/core-kit';\nimport type { OpenIDProviderMetadata } from '@authup/specs';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { required, url } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\nimport { AIdentityProviderOAuth2Discovery } from './AIdentityProviderOAuth2Discovery';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n AIdentityProviderOAuth2Discovery, \n },\n props: {\n entity: { type: Object as PropType<Partial<OAuth2IdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n token_url: '',\n authorize_url: '',\n user_info_url: '',\n });\n\n const $v = useVuelidate({\n token_url: {\n required,\n url,\n },\n authorize_url: {\n required,\n url,\n },\n user_info_url: { url },\n }, form, { $registerAs: 'endpoint' });\n\n function init() {\n form.token_url = '';\n form.authorize_url = '';\n form.user_info_url = '';\n\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n const handleDiscoveryLookup = (data: OpenIDProviderMetadata) => {\n form.authorize_url = data.authorization_endpoint;\n form.token_url = data.token_endpoint;\n };\n\n return {\n $v,\n validationMessages,\n handleDiscoveryLookup,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <AIdentityProviderOAuth2Discovery\n v-if=\"discovery\"\n @lookup=\"handleDiscoveryLookup\"\n />\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.token_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.token_url)\"\n >\n <template #label>\n Token\n </template>\n <VCFormInput\n v-model=\"$v.token_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.authorize_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.authorize_url)\"\n >\n <template #label>\n Authorize\n </template>\n <VCFormInput\n v-model=\"$v.authorize_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.user_info_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.user_info_url)\"\n >\n <template #label>\n UserInfo\n </template>\n <VCFormInput\n v-model=\"$v.user_info_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n</template>\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider, OAuth2IdentityProvider } from '@authup/core-kit';\nimport type { OpenIDProviderMetadata } from '@authup/specs';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport { required, url } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { assignFormProperties, getVuelidateSeverity, useTranslationsForNestedValidation } from '../../../core';\nimport { AIdentityProviderOAuth2Discovery } from './AIdentityProviderOAuth2Discovery';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n AIdentityProviderOAuth2Discovery, \n },\n props: {\n entity: { type: Object as PropType<Partial<OAuth2IdentityProvider>> },\n discovery: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated'],\n setup(props) {\n const form = reactive({\n token_url: '',\n authorize_url: '',\n user_info_url: '',\n });\n\n const $v = useVuelidate({\n token_url: {\n required,\n url,\n },\n authorize_url: {\n required,\n url,\n },\n user_info_url: { url },\n }, form, { $registerAs: 'endpoint' });\n\n function init() {\n form.token_url = '';\n form.authorize_url = '';\n form.user_info_url = '';\n\n if (!props.entity) return;\n\n assignFormProperties(form, props.entity);\n }\n\n const updated = useUpdatedAt(props.entity as IdentityProvider);\n onChange(updated, () => init());\n\n init();\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n\n const handleDiscoveryLookup = (data: OpenIDProviderMetadata) => {\n form.authorize_url = data.authorization_endpoint;\n form.token_url = data.token_endpoint;\n };\n\n return {\n $v,\n validationMessages,\n handleDiscoveryLookup,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <AIdentityProviderOAuth2Discovery\n v-if=\"discovery\"\n @lookup=\"handleDiscoveryLookup\"\n />\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.token_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.token_url)\"\n >\n <template #label>\n Token\n </template>\n <VCFormInput\n v-model=\"$v.token_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.authorize_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.authorize_url)\"\n >\n <template #label>\n Authorize\n </template>\n <VCFormInput\n v-model=\"$v.authorize_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.user_info_url.value\"\n :validation-severity=\"getVuelidateSeverity($v.user_info_url)\"\n >\n <template #label>\n UserInfo\n </template>\n <VCFormInput\n v-model=\"$v.user_info_url.$model\"\n placeholder=\"https://...\"\n />\n </VCFormGroup>\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport useVuelidate from '@vuelidate/core';\nimport type {\n PropType,\n VNodeArrayChildren, \n VNodeChild,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h, \n nextTick,\n ref,\n} from 'vue';\nimport type {\n IdentityProvider,\n IdentityProviderPreset, \n OAuth2IdentityProvider,\n} from '@authup/core-kit';\nimport { EntityType, IdentityProviderProtocol } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n} from '@vuecs/form-controls';\nimport { onChange, useIsEditing } from '../../../composables';\nimport {\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n extractVuelidateResultsFromChild,\n injectHTTPClient,\n} from '../../../core';\nimport { defineEntityManager, defineEntityVEmitOptions } from '../../utility';\nimport { AIdentityProviderBasicFields } from './AIdentityProviderBasicFields';\nimport { AIdentityProviderOAuth2ClientFields } from './AIdentityProviderOAuth2ClientFields';\nimport AIdentityProviderOAuth2EndpointFields from './AIdentityProviderOAuth2EndpointFields.vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\nimport type { IdentityProviderPresetElement } from './preset';\nimport type { IdentityProviderProtocolElement } from './protocol';\n\nexport const AIdentityProviderOAuth2Form = defineComponent({\n components: {\n IdentityProviderBasicFields: AIdentityProviderBasicFields,\n IdentityProviderClientFields: AIdentityProviderOAuth2ClientFields,\n },\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: false,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n protocol: {\n type: String as PropType<string | null>,\n default: IdentityProviderProtocol.OAUTH2,\n },\n preset: { type: String as PropType<string | null> },\n },\n emits: defineEntityVEmitOptions<IdentityProvider>(),\n setup(props, ctx) {\n const apiClient = injectHTTPClient();\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n setup: ctx,\n props,\n });\n\n const protocol = computed(() => {\n if (manager.data.value) {\n return manager.data.value.protocol;\n }\n\n return props.protocol;\n });\n\n const preset = computed(() => {\n if (manager.data.value) {\n return manager.data.value.preset;\n }\n\n return props.preset;\n });\n\n const busy = ref(false);\n\n const $v = useVuelidate({ $stopPropagation: true });\n\n const isEditing = useIsEditing(manager.data);\n\n const authorizeUri = computed<string>(() => {\n if (!manager.data.value) {\n return '';\n }\n\n return apiClient.identityProvider.getAuthorizeUri(manager.data.value.id);\n });\n\n const basicFieldsNode = ref<null | typeof AIdentityProviderBasicFields>(null);\n\n onChange(preset, () => {\n if (!basicFieldsNode.value) {\n return;\n }\n\n if (preset.value) {\n basicFieldsNode.value.assign({\n name: preset.value,\n slug: preset.value,\n });\n\n return;\n }\n\n basicFieldsNode.value.assign({\n name: '',\n slug: '',\n });\n });\n function initForm() {\n nextTick(() => {\n if (\n !manager.data.value &&\n preset.value &&\n basicFieldsNode.value\n ) {\n basicFieldsNode.value.assign({\n name: preset.value,\n slug: preset.value,\n });\n }\n });\n }\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n const data : Partial<IdentityProvider> = {\n ...extractVuelidateResultsFromChild($v, 'basic'),\n ...extractVuelidateResultsFromChild($v, 'client'),\n ...extractVuelidateResultsFromChild($v, 'endpoint'),\n };\n\n if (protocol.value) {\n data.protocol = protocol.value as IdentityProviderProtocol;\n }\n\n if (preset.value) {\n data.preset = preset.value as IdentityProviderPreset;\n }\n\n await manager.createOrUpdate(data);\n };\n\n const submitTranslations = createFormSubmitTranslations();\n\n return () => {\n let headerNode : VNodeChild;\n\n if (!manager.data.value) {\n if (preset.value) {\n headerNode = h(AIdentityProviderPreset, {\n key: preset.value,\n id: preset.value,\n }, {\n default: (element: IdentityProviderPresetElement) => h('div', [\n h('h4', { class: 'mb-3' }, [\n h('i', { class: [element.icon, 'pe-1'] }),\n element.name,\n ]),\n ]),\n });\n } else {\n headerNode = h(AIdentityProviderProtocol, {\n key: protocol.value!,\n id: protocol.value!,\n }, {\n default: (element: IdentityProviderProtocolElement) => h('div', [\n h('h4', { class: 'mb-3' }, [\n h('i', { class: [element.icon, 'pe-1'] }),\n element.name,\n ]),\n ]),\n });\n }\n }\n\n let detailsNode : VNodeArrayChildren = [];\n if (isEditing.value) {\n detailsNode = [\n h('h6', [\n h('i', { class: 'fas fa-info-circle' }),\n ' ',\n 'Details',\n ]),\n buildFormGroup({\n label: true,\n labelContent: 'Redirect URL',\n content: buildFormInput({\n value: authorizeUri,\n props: { disabled: true },\n }),\n }),\n h('hr'),\n ];\n }\n\n const basicNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n 'Basic',\n ]),\n h(AIdentityProviderBasicFields, {\n ref: basicFieldsNode,\n entity: manager.data.value,\n }),\n ];\n\n const securityNode : VNodeChild = [\n h('h6', [\n h('i', { class: 'fa fa-lock' }),\n ' ',\n 'Security',\n ]),\n h(AIdentityProviderOAuth2ClientFields, { entity: manager.data.value as OAuth2IdentityProvider }),\n ];\n\n let endpointsNode : VNodeChild;\n if (!preset.value) {\n endpointsNode = [\n h('h6', [\n h('i', { class: 'fa-solid fa-vihara' }),\n ' ',\n 'Endpoints',\n ]),\n h(\n AIdentityProviderOAuth2EndpointFields,\n {\n entity: manager.data.value as OAuth2IdentityProvider,\n discovery: protocol.value === IdentityProviderProtocol.OIDC,\n },\n ),\n ];\n }\n\n const submitNode = buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, submitTranslations);\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.call(null);\n },\n }, [\n headerNode,\n detailsNode,\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n basicNode,\n ]),\n h('div', { class: 'col' }, [\n securityNode,\n ]),\n ]),\n h('hr'),\n endpointsNode,\n submitNode,\n ]);\n };\n },\n});\n\nexport default AIdentityProviderOAuth2Form;\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n defineComponent, \n h, \n ref, \n toRef,\n} from 'vue';\nimport { IdentityProviderProtocol, getIdentityProviderProtocolForPreset } from '@authup/core-kit';\nimport type { IdentityProvider, IdentityProviderPreset } from '@authup/core-kit';\nimport type { PropType, VNodeChild } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../composables';\nimport { AIdentityProviderLdapForm } from './AIdentityProviderLdapForm';\nimport AIdentityProviderPicker from './AIdentityProviderPicker.vue';\nimport { AIdentityProviderOAuth2Form } from './AIdentityProviderOAuth2Form';\n\nexport const AIdentityProviderForm = defineComponent({\n props: {\n entity: { type: Object as PropType<IdentityProvider> },\n realmId: { type: String },\n },\n emits: ['created', 'deleted', 'updated', 'failed'],\n setup(props, setup) {\n const protocol = ref<string | null>(null);\n const preset = ref<string | null>(null);\n\n const entity = toRef(props, 'entity');\n const updatedAt = useUpdatedAt(entity);\n\n const set = () => {\n if (entity.value) {\n if (entity.value.preset) {\n preset.value = entity.value.preset;\n }\n\n if (entity.value.protocol) {\n protocol.value = entity.value.protocol;\n }\n }\n };\n\n set();\n\n onChange(updatedAt, () => set());\n\n const renderPicker = () : VNodeChild => h(\n AIdentityProviderPicker,\n {\n protocol: protocol.value ?? undefined,\n preset: preset.value ?? undefined,\n onPick(type: 'protocol' | 'preset', value: string) {\n if (type === 'preset') {\n preset.value = value;\n protocol.value = `${getIdentityProviderProtocolForPreset(value as IdentityProviderPreset)}`;\n return;\n }\n\n protocol.value = value;\n preset.value = null;\n },\n },\n );\n\n const render = (node: VNodeChild) : VNodeChild => {\n if (!entity.value) {\n return [\n renderPicker(),\n h('hr'),\n node,\n ];\n }\n\n return node;\n };\n\n return () => {\n if (!protocol.value && !preset.value) {\n return renderPicker();\n }\n\n if (protocol.value) {\n switch (protocol.value) {\n case IdentityProviderProtocol.OAUTH2:\n case IdentityProviderProtocol.OIDC: {\n return render(h(AIdentityProviderOAuth2Form, {\n entity: entity.value,\n realmId: props.realmId,\n protocol: protocol.value,\n preset: preset.value,\n onCreated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('created', el);\n },\n onUpdated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('updated', el);\n },\n }));\n }\n case IdentityProviderProtocol.LDAP: {\n return render(h(AIdentityProviderLdapForm, {\n entity: entity.value,\n realmId: props.realmId,\n onCreated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('created', el);\n },\n onUpdated: (el: IdentityProvider) => {\n entity.value = el;\n\n setup.emit('updated', el);\n },\n }));\n }\n }\n }\n\n let prefix : string | undefined;\n if (protocol.value) {\n prefix = protocol.value;\n }\n if (preset.value) {\n prefix = preset.value;\n }\n\n return render(h('div', { class: 'alert alert-warning alert-sm' }, [\n `${prefix} is not supported yet :/`,\n ]));\n };\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const AIdentityProviders = defineComponent({\n props: defineEntityCollectionVProps<IdentityProvider>(),\n emits: defineEntityCollectionVEmitOptions<IdentityProvider>(),\n slots: Object as SlotsType<EntityCollectionVSlots<IdentityProvider>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.IDENTITY_PROVIDER}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.IDENTITY_PROVIDERS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AIdentityProviders;\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: { AIdentityProviderPreset, AIdentityProviderProtocol },\n inheritAttrs: false,\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <AIdentityProviderPreset\n v-if=\"entity.preset\"\n :id=\"entity.preset\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderPreset>\n <AIdentityProviderProtocol\n v-else-if=\"entity.protocol\"\n :id=\"entity.protocol\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderProtocol>\n</template>\n","<!--\n Copyright (c) 2023.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { IdentityProvider } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { AIdentityProviderPreset } from './AIdentityProviderPreset';\nimport { AIdentityProviderProtocol } from './AIdentityProviderProtocol';\n\nexport default defineComponent({\n components: { AIdentityProviderPreset, AIdentityProviderProtocol },\n inheritAttrs: false,\n props: {\n entity: {\n type: Object as PropType<IdentityProvider>,\n required: true,\n },\n },\n});\n</script>\n<template>\n <AIdentityProviderPreset\n v-if=\"entity.preset\"\n :id=\"entity.preset\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderPreset>\n <AIdentityProviderProtocol\n v-else-if=\"entity.protocol\"\n :id=\"entity.protocol\"\n >\n <template #default=\"item\">\n <i :class=\"[item.icon, $attrs.class]\" />\n </template>\n </AIdentityProviderProtocol>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive, ref } from 'vue';\nimport type { IdentityProviderRoleMapping, Role } from '@authup/core-kit';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n assignFormProperties,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n VCFormInputCheckbox, \n },\n props: {\n role: {\n type: Object as PropType<Role>,\n required: true,\n },\n entityId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<IdentityProviderRoleMapping>(),\n async setup(props, setup) {\n const display = ref(false);\n const toggleDisplay = () => {\n display.value = !display.value;\n };\n\n const form = reactive({\n name: '',\n value: '',\n value_is_regex: false,\n });\n\n const $v = useVuelidate({\n name: {\n minLength: minLength(3),\n maxLength: maxLength(32),\n },\n value: {\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n value_is_regex: {},\n }, form);\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.VALUE_IS_REGEX },\n ],\n );\n\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER_ROLE_MAPPING}`,\n setup,\n socket: {\n processEvent(event) {\n return event.data.role_id === props.role.id &&\n event.data.provider_id === props.entityId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.role.id,\n provider_id: props.entityId,\n },\n },\n });\n\n if (manager.data.value) {\n assignFormProperties(form, manager.data.value);\n }\n\n const handleSaveOrCreate = (e: Event) => {\n e.preventDefault();\n\n if (manager.data.value) {\n return manager.update(form);\n }\n\n return manager.create({\n ...form,\n provider_id: props.entityId,\n role_id: props.role.id,\n });\n };\n\n const handleDelete = (e: Event) => {\n e.preventDefault();\n\n return manager.delete();\n };\n\n return {\n display,\n toggleDisplay,\n $v,\n validationMessages,\n translationsDefault,\n manager,\n handleSaveOrCreate,\n handleDelete,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <div class=\"list-item flex-column\">\n <div class=\"d-flex flex-row\">\n <div class=\"me-2\">\n <button\n class=\"btn btn-xs btn-dark\"\n @click.prevent=\"toggleDisplay()\"\n >\n <i\n :class=\"['fa', {\n 'fa-chevron-down': !display,\n 'fa-chevron-up': display,\n }]\"\n />\n </button>\n </div>\n <div>\n <h6\n class=\"mb-0\"\n @click.prevent=\"toggleDisplay()\"\n >\n {{ role.name }}\n </h6>\n </div>\n <div class=\"ms-auto\">\n <button\n :class=\"['btn btn-xs', {\n 'btn-primary': !manager.data.value,\n 'btn-dark': !!manager.data.value,\n }]\"\n @click=\"handleSaveOrCreate\"\n >\n <i\n :class=\"['fa', {\n 'fa-plus': !manager.data.value,\n 'fa-save': manager.data.value,\n }]\"\n />\n </button>\n <button\n v-if=\"manager.data.value\"\n class=\"btn btn-xs btn-danger ms-1\"\n :disabled=\"manager.busy.value\"\n @click=\"handleDelete\"\n >\n <i class=\"fa fa-trash\" />\n </button>\n </div>\n </div>\n <div\n v-if=\"display\"\n class=\"mt-2\"\n >\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.name.value\"\n :validation-severity=\"getVuelidateSeverity($v.name)\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"$v.name.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value.value\"\n :validation-severity=\"getVuelidateSeverity($v.value)\"\n >\n <template #label>\n Value\n </template>\n <VCFormInput\n v-model=\"$v.value.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value_is_regex.value\"\n :validation-severity=\"getVuelidateSeverity($v.value_is_regex)\"\n >\n <template #label>\n Regex\n </template>\n <VCFormInputCheckbox\n v-model=\"$v.value_is_regex.$model\"\n group-class=\"form-switch\"\n :label-content=\"translationsDefault.valueIsRegex.value\"\n />\n </VCFormGroup>\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength } from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive, ref } from 'vue';\nimport type { IdentityProviderRoleMapping, Role } from '@authup/core-kit';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n assignFormProperties,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\n\nexport default defineComponent({\n components: {\n VCFormGroup, \n VCFormInput, \n VCFormInputCheckbox, \n },\n props: {\n role: {\n type: Object as PropType<Role>,\n required: true,\n },\n entityId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<IdentityProviderRoleMapping>(),\n async setup(props, setup) {\n const display = ref(false);\n const toggleDisplay = () => {\n display.value = !display.value;\n };\n\n const form = reactive({\n name: '',\n value: '',\n value_is_regex: false,\n });\n\n const $v = useVuelidate({\n name: {\n minLength: minLength(3),\n maxLength: maxLength(32),\n },\n value: {\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n value_is_regex: {},\n }, form);\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.VALUE_IS_REGEX },\n ],\n );\n\n const manager = defineEntityManager({\n type: `${EntityType.IDENTITY_PROVIDER_ROLE_MAPPING}`,\n setup,\n socket: {\n processEvent(event) {\n return event.data.role_id === props.role.id &&\n event.data.provider_id === props.entityId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.role.id,\n provider_id: props.entityId,\n },\n },\n });\n\n if (manager.data.value) {\n assignFormProperties(form, manager.data.value);\n }\n\n const handleSaveOrCreate = (e: Event) => {\n e.preventDefault();\n\n if (manager.data.value) {\n return manager.update(form);\n }\n\n return manager.create({\n ...form,\n provider_id: props.entityId,\n role_id: props.role.id,\n });\n };\n\n const handleDelete = (e: Event) => {\n e.preventDefault();\n\n return manager.delete();\n };\n\n return {\n display,\n toggleDisplay,\n $v,\n validationMessages,\n translationsDefault,\n manager,\n handleSaveOrCreate,\n handleDelete,\n getVuelidateSeverity,\n };\n },\n});\n</script>\n<template>\n <div class=\"list-item flex-column\">\n <div class=\"d-flex flex-row\">\n <div class=\"me-2\">\n <button\n class=\"btn btn-xs btn-dark\"\n @click.prevent=\"toggleDisplay()\"\n >\n <i\n :class=\"['fa', {\n 'fa-chevron-down': !display,\n 'fa-chevron-up': display,\n }]\"\n />\n </button>\n </div>\n <div>\n <h6\n class=\"mb-0\"\n @click.prevent=\"toggleDisplay()\"\n >\n {{ role.name }}\n </h6>\n </div>\n <div class=\"ms-auto\">\n <button\n :class=\"['btn btn-xs', {\n 'btn-primary': !manager.data.value,\n 'btn-dark': !!manager.data.value,\n }]\"\n @click=\"handleSaveOrCreate\"\n >\n <i\n :class=\"['fa', {\n 'fa-plus': !manager.data.value,\n 'fa-save': manager.data.value,\n }]\"\n />\n </button>\n <button\n v-if=\"manager.data.value\"\n class=\"btn btn-xs btn-danger ms-1\"\n :disabled=\"manager.busy.value\"\n @click=\"handleDelete\"\n >\n <i class=\"fa fa-trash\" />\n </button>\n </div>\n </div>\n <div\n v-if=\"display\"\n class=\"mt-2\"\n >\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.name.value\"\n :validation-severity=\"getVuelidateSeverity($v.name)\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"$v.name.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value.value\"\n :validation-severity=\"getVuelidateSeverity($v.value)\"\n >\n <template #label>\n Value\n </template>\n <VCFormInput\n v-model=\"$v.value.$model\"\n />\n </VCFormGroup>\n <VCFormGroup\n :label=\"true\"\n :validation-messages=\"validationMessages.value_is_regex.value\"\n :validation-severity=\"getVuelidateSeverity($v.value_is_regex)\"\n >\n <template #label>\n Regex\n </template>\n <VCFormInputCheckbox\n v-model=\"$v.value_is_regex.$model\"\n group-class=\"form-switch\"\n :label-content=\"translationsDefault.valueIsRegex.value\"\n />\n </VCFormGroup>\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport AIdentityProviderRoleAssignment from './AIdentityProviderRoleAssignment.vue';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, AIdentityProviderRoleAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'body')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :header-title=\"false\">\n <template #body=\"slotProps\">\n <AIdentityProviderRoleAssignment\n v-for=\"item in slotProps.data\"\n :key=\"item.id\"\n :entity-id=\"entityId\"\n :role=\"item\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport AIdentityProviderRoleAssignment from './AIdentityProviderRoleAssignment.vue';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, AIdentityProviderRoleAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'body')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles :header-title=\"false\">\n <template #body=\"slotProps\">\n <AIdentityProviderRoleAssignment\n v-for=\"item in slotProps.data\"\n :key=\"item.id\"\n :entity-id=\"entityId\"\n :role=\"item\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<script lang=\"ts\">\nimport type { AttributeNamesPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ names: string[] }>({ names: [] });\n\n const vuelidate = useVuelidate({ names: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<AttributeNamesPolicy> = {}) {\n form.names = data.names || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.names = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.names.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n />\n</template>\n","<script lang=\"ts\">\nimport type { AttributeNamesPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ names: string[] }>({ names: [] });\n\n const vuelidate = useVuelidate({ names: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<AttributeNamesPolicy> = {}) {\n form.names = data.names || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.names = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.names.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n />\n</template>\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport type { EntityManager } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n renderToggleButton,\n} from '../../utility';\n\nexport const APolicyParentAssignment = defineComponent({\n props: {\n entityId: {\n type: String,\n required: true,\n },\n entity: { type: Object as PropType<Policy> },\n parentId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<Policy>(),\n async setup(props, setup) {\n const manager : EntityManager<Policy> = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup,\n socket: {\n processEvent(event) {\n return event.data.id === props.entityId;\n },\n },\n props: {\n entity: props.entity,\n entityId: props.entityId,\n },\n });\n\n await manager.resolve({ query: { filters: { id: props.entityId } } });\n\n return () => renderToggleButton({\n changed: (value) => {\n if (!manager.data.value) {\n return;\n }\n\n if (value) {\n manager.data.value.parent_id = props.parentId;\n } else {\n manager.data.value.parent_id = null;\n if (manager.data.value.parent) {\n manager.data.value.parent = null;\n }\n }\n\n manager.update(manager.data.value);\n },\n value: !!manager.data.value &&\n manager.data.value.parent_id === props.parentId,\n isBusy: manager.busy.value,\n });\n },\n});\n","<!--\n Copyright (c) 2025.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport { SlotName } from '@vuecs/list-controls';\nimport type { SlotsType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { defineEntityPicker, defineEntityPickerVEmitOptions, defineEntityPickerVProps } from '../../utility';\nimport type { EntityPickerVSlots } from '../../utility';\nimport { APolicies } from './APolicies';\nimport { APolicyParentAssignment } from './APolicyParentAssignment';\n\nexport default defineComponent({\n props: {\n parentId: { type: String },\n ...defineEntityPickerVProps<Policy>(),\n },\n emits: defineEntityPickerVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityPickerVSlots<Policy>>,\n setup(props, {\n slots,\n ...setup\n }) {\n const { render } = defineEntityPicker({\n component: APolicies,\n props,\n setup: {\n ...setup,\n slots: {\n ...(\n props.parentId ? {\n [SlotName.ITEM_ACTIONS]: (\n slotProps: EntityPickerVSlots<Policy>['itemActions'],\n ) => h(APolicyParentAssignment, {\n entity: slotProps.data,\n entityId: slotProps.data.id,\n parentId: props.parentId as string,\n }),\n } : {}\n ),\n ...slots,\n },\n },\n });\n\n return () => render();\n },\n});\n</script>\n","<!--\n Copyright (c) 2025.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport type { Policy } from '@authup/core-kit';\nimport { SlotName } from '@vuecs/list-controls';\nimport type { SlotsType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { defineEntityPicker, defineEntityPickerVEmitOptions, defineEntityPickerVProps } from '../../utility';\nimport type { EntityPickerVSlots } from '../../utility';\nimport { APolicies } from './APolicies';\nimport { APolicyParentAssignment } from './APolicyParentAssignment';\n\nexport default defineComponent({\n props: {\n parentId: { type: String },\n ...defineEntityPickerVProps<Policy>(),\n },\n emits: defineEntityPickerVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityPickerVSlots<Policy>>,\n setup(props, {\n slots,\n ...setup\n }) {\n const { render } = defineEntityPicker({\n component: APolicies,\n props,\n setup: {\n ...setup,\n slots: {\n ...(\n props.parentId ? {\n [SlotName.ITEM_ACTIONS]: (\n slotProps: EntityPickerVSlots<Policy>['itemActions'],\n ) => h(APolicyParentAssignment, {\n entity: slotProps.data,\n entityId: slotProps.data.id,\n parentId: props.parentId as string,\n }),\n } : {}\n ),\n ...slots,\n },\n },\n });\n\n return () => render();\n },\n});\n</script>\n","<script lang=\"ts\">\nimport type { BuildInput, FiltersBuildInput } from 'rapiq';\nimport {\n type PropType,\n computed,\n defineComponent,\n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { DecisionStrategy } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormSelect } from '@vuecs/form-controls';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport APolicyPicker from '../APolicyPicker.vue';\n\nexport default defineComponent({\n components: {\n APolicyChildrenPicker: APolicyPicker,\n VCFormGroup,\n VCFormSelect,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ items: string[], decision_strategy: string }>({\n items: [],\n decision_strategy: '',\n });\n\n const decisionStrategyOptions : FormSelectOption[] = Object.values(DecisionStrategy)\n .map((value) => ({\n id: value,\n value,\n }));\n\n const id = computed(() => {\n if (!props.entity) {\n return undefined;\n }\n\n return props.entity.id;\n });\n\n const vuelidate = useVuelidate({ items: {}, decision_strategy: {} }, form, { $registerAs: 'type' });\n\n const query = computed<BuildInput<Policy & { parent_id?: string | null }>>(() => {\n const filters : FiltersBuildInput<Policy & { parent_id?: string | null }> = {};\n if (props.entity) {\n // todo: maybe respect manual realmId component prop\n if (props.entity.realm_id) {\n filters.realm_id = props.entity.realm_id;\n }\n\n if (props.entity.parent_id) {\n filters.id = [\n `!${props.entity.id}`,\n `!${props.entity.parent_id}`,\n ];\n } else {\n filters.id = `!${props.entity.id}`;\n }\n\n filters.parent_id = [null, `${props.entity.id}`];\n } else {\n filters.parent_id = null;\n }\n\n return {\n filters,\n sort: { name: 'ASC' },\n };\n });\n\n function assign(data: Partial<Policy> = {}) {\n if (data.children) {\n form.items = data.children\n .map((child) => child.id)\n .filter((id): id is string => !!id);\n } else {\n form.items = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const record = data as Record<string, any>;\n if (record.decision_strategy) {\n form.decision_strategy = record.decision_strategy;\n } else {\n form.decision_strategy = '';\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (children: string[]) => {\n form.items = children;\n emitUpdated();\n };\n\n const decisionStrategyHint = computed(() => {\n switch (form.decision_strategy) {\n case DecisionStrategy.AFFIRMATIVE:\n return 'At least one child policy must evaluate positively.';\n case DecisionStrategy.CONSENSUS:\n return 'More child policies must evaluate positively than negatively.';\n case DecisionStrategy.UNANIMOUS:\n return 'All child policies must evaluate positively.';\n default:\n return 'No strategy selected. Defaults to unanimous (all child policies must evaluate positively).';\n }\n });\n\n const handleDecisionStrategyUpdated = () => {\n emitUpdated();\n };\n\n const emitUpdated = () => {\n setup.emit('updated', {\n data: [\n ...form.items,\n ],\n decision_strategy: form.decision_strategy || undefined,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n id,\n\n handleUpdated,\n handleDecisionStrategyUpdated,\n\n decisionStrategyHint,\n decisionStrategyOptions,\n vuelidate,\n\n query,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.decision_strategy\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Decision Strategy\n </template>\n <VCFormSelect\n v-model=\"vuelidate.decision_strategy.$model\"\n :options=\"decisionStrategyOptions\"\n :option-default=\"true\"\n :option-default-value=\"'-- None (default: unanimous) --'\"\n @change=\"handleDecisionStrategyUpdated\"\n />\n <div class=\"alert alert-sm alert-info mt-1 mb-0\">\n {{ decisionStrategyHint }}\n </div>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.items\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Children\n </template>\n <APolicyChildrenPicker\n :parent-id=\"id\"\n :query=\"query\"\n :value=\"vuelidate.items.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { BuildInput, FiltersBuildInput } from 'rapiq';\nimport {\n type PropType,\n computed,\n defineComponent,\n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { DecisionStrategy } from '@authup/kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormSelect } from '@vuecs/form-controls';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport APolicyPicker from '../APolicyPicker.vue';\n\nexport default defineComponent({\n components: {\n APolicyChildrenPicker: APolicyPicker,\n VCFormGroup,\n VCFormSelect,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ items: string[], decision_strategy: string }>({\n items: [],\n decision_strategy: '',\n });\n\n const decisionStrategyOptions : FormSelectOption[] = Object.values(DecisionStrategy)\n .map((value) => ({\n id: value,\n value,\n }));\n\n const id = computed(() => {\n if (!props.entity) {\n return undefined;\n }\n\n return props.entity.id;\n });\n\n const vuelidate = useVuelidate({ items: {}, decision_strategy: {} }, form, { $registerAs: 'type' });\n\n const query = computed<BuildInput<Policy & { parent_id?: string | null }>>(() => {\n const filters : FiltersBuildInput<Policy & { parent_id?: string | null }> = {};\n if (props.entity) {\n // todo: maybe respect manual realmId component prop\n if (props.entity.realm_id) {\n filters.realm_id = props.entity.realm_id;\n }\n\n if (props.entity.parent_id) {\n filters.id = [\n `!${props.entity.id}`,\n `!${props.entity.parent_id}`,\n ];\n } else {\n filters.id = `!${props.entity.id}`;\n }\n\n filters.parent_id = [null, `${props.entity.id}`];\n } else {\n filters.parent_id = null;\n }\n\n return {\n filters,\n sort: { name: 'ASC' },\n };\n });\n\n function assign(data: Partial<Policy> = {}) {\n if (data.children) {\n form.items = data.children\n .map((child) => child.id)\n .filter((id): id is string => !!id);\n } else {\n form.items = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const record = data as Record<string, any>;\n if (record.decision_strategy) {\n form.decision_strategy = record.decision_strategy;\n } else {\n form.decision_strategy = '';\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (children: string[]) => {\n form.items = children;\n emitUpdated();\n };\n\n const decisionStrategyHint = computed(() => {\n switch (form.decision_strategy) {\n case DecisionStrategy.AFFIRMATIVE:\n return 'At least one child policy must evaluate positively.';\n case DecisionStrategy.CONSENSUS:\n return 'More child policies must evaluate positively than negatively.';\n case DecisionStrategy.UNANIMOUS:\n return 'All child policies must evaluate positively.';\n default:\n return 'No strategy selected. Defaults to unanimous (all child policies must evaluate positively).';\n }\n });\n\n const handleDecisionStrategyUpdated = () => {\n emitUpdated();\n };\n\n const emitUpdated = () => {\n setup.emit('updated', {\n data: [\n ...form.items,\n ],\n decision_strategy: form.decision_strategy || undefined,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n id,\n\n handleUpdated,\n handleDecisionStrategyUpdated,\n\n decisionStrategyHint,\n decisionStrategyOptions,\n vuelidate,\n\n query,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.decision_strategy\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Decision Strategy\n </template>\n <VCFormSelect\n v-model=\"vuelidate.decision_strategy.$model\"\n :options=\"decisionStrategyOptions\"\n :option-default=\"true\"\n :option-default-value=\"'-- None (default: unanimous) --'\"\n @change=\"handleDecisionStrategyUpdated\"\n />\n <div class=\"alert alert-sm alert-info mt-1 mb-0\">\n {{ decisionStrategyHint }}\n </div>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.items\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Children\n </template>\n <APolicyChildrenPicker\n :parent-id=\"id\"\n :query=\"query\"\n :value=\"vuelidate.items.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport type { DatePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n });\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<DatePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport type { DatePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n });\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<DatePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"YYYY-MM-DD\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { IdentityPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ types: string[] }>({ types: [] });\n\n const vuelidate = useVuelidate({ types: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<IdentityPolicy> = {}) {\n form.types = data.types || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.types = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.types.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n >\n <template #label>\n Types\n </template>\n </AFormInputList>\n</template>\n","<script lang=\"ts\">\nimport type { IdentityPolicy } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport type { PropType } from 'vue';\nimport { defineComponent, reactive } from 'vue';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: { AFormInputList },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive<{ types: string[] }>({ types: [] });\n\n const vuelidate = useVuelidate({ types: {} }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<IdentityPolicy> = {}) {\n form.types = data.types || [];\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = (data: string[]) => {\n form.types = data;\n setup.emit('updated', data);\n };\n\n return {\n handleUpdated,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <AFormInputList\n :names=\"vuelidate.types.$model\"\n :min-items=\"1\"\n @changed=\"handleUpdated\"\n >\n <template #label>\n Types\n </template>\n </AFormInputList>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup } from '@vuecs/form-controls';\nimport type { RealmMatchPolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: {\n AFormInputList,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n attribute_name_strict: false,\n attribute_null_match_all: false,\n identity_master_match_all: false,\n attribute_name: [] as string[],\n });\n\n const vuelidate = useVuelidate({\n attribute_name_strict: {},\n attribute_null_match_all: {},\n identity_master_match_all: {},\n attribute_name: {},\n }, form, { $registerAs: 'type' });\n\n function assign(input: Partial<RealmMatchPolicy> = {}) {\n const {\n attribute_name, \n ...data \n } = input;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n if (attribute_name) {\n form.attribute_name = typeof attribute_name === 'string' ? [attribute_name] : attribute_name;\n } else {\n form.attribute_name = [];\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleAttributeNameChanged = (data: string[]) => {\n form.attribute_name = data;\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleAttributeNameChanged,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col-7\">\n <IVuelidate :validation=\"vuelidate.attribute_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <AFormInputList\n :names=\"vuelidate.attribute_name.$model\"\n @changed=\"handleAttributeNameChanged\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col-5\">\n <IVuelidate :validation=\"vuelidate.attribute_name_strict\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_name_strict.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Only match if the attribute is strict equal to the name?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.attribute_null_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_null_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Determines if resources with null realm-id/name value should match all identity realms.<br>\n If true, any identity realm can access resources with null realm-id/name values.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.identity_master_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.identity_master_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Specifies whether the master realm of an identity should match all realm-id/name attributes, including null.<br>\n If true, the master realm can access any resource regardless of its realm value.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, reactive } from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup } from '@vuecs/form-controls';\nimport type { RealmMatchPolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\nimport AFormInputList from '../../../utility/form-input-list/AFormInputList.vue';\n\nexport default defineComponent({\n components: {\n AFormInputList,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n attribute_name_strict: false,\n attribute_null_match_all: false,\n identity_master_match_all: false,\n attribute_name: [] as string[],\n });\n\n const vuelidate = useVuelidate({\n attribute_name_strict: {},\n attribute_null_match_all: {},\n identity_master_match_all: {},\n attribute_name: {},\n }, form, { $registerAs: 'type' });\n\n function assign(input: Partial<RealmMatchPolicy> = {}) {\n const {\n attribute_name, \n ...data \n } = input;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n if (attribute_name) {\n form.attribute_name = typeof attribute_name === 'string' ? [attribute_name] : attribute_name;\n } else {\n form.attribute_name = [];\n }\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleAttributeNameChanged = (data: string[]) => {\n form.attribute_name = data;\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleAttributeNameChanged,\n\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col-7\">\n <IVuelidate :validation=\"vuelidate.attribute_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <AFormInputList\n :names=\"vuelidate.attribute_name.$model\"\n @changed=\"handleAttributeNameChanged\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div class=\"col-5\">\n <IVuelidate :validation=\"vuelidate.attribute_name_strict\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_name_strict.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Only match if the attribute is strict equal to the name?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.attribute_null_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.attribute_null_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Determines if resources with null realm-id/name value should match all identity realms.<br>\n If true, any identity realm can access resources with null realm-id/name values.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.identity_master_match_all\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.identity_master_match_all.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Specifies whether the master realm of an identity should match all realm-id/name attributes, including null.<br>\n If true, the master realm can access any resource regardless of its realm value.\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxValue, minValue } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport {\n TimePolicyInterval,\n isIntervalForDayOfMonth,\n isIntervalForDayOfWeek,\n isIntervalForDayOfYear,\n} from '@authup/access';\nimport type { TimePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n interval: '',\n day_of_week: '',\n day_of_month: '',\n day_of_year: '',\n });\n\n const intervalOptions : FormSelectOption[] = Object.values(TimePolicyInterval)\n .map((el) => ({\n id: el,\n value: el,\n } satisfies FormSelectOption));\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n interval: {},\n day_of_week: {\n minValue: minValue(0),\n maxValue: maxValue(6),\n },\n day_of_month: {\n minValue: minValue(1),\n maxValue: maxValue(31),\n },\n day_of_year: {\n minValue: minValue(1),\n maxValue: maxValue(365),\n },\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<TimePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const displayIntervalForDayOfWeek = computed(\n () => isIntervalForDayOfWeek(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfMonth = computed(\n () => isIntervalForDayOfMonth(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfYear = computed(\n () => isIntervalForDayOfYear(vuelidate.value.interval.$model),\n );\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleIntervalUpdated = (value: string) => {\n if (!isIntervalForDayOfWeek(value)) {\n vuelidate.value.day_of_week.$model = '';\n }\n\n if (!isIntervalForDayOfMonth(value)) {\n vuelidate.value.day_of_month.$model = '';\n }\n\n if (!isIntervalForDayOfYear(value)) {\n vuelidate.value.day_of_year.$model = '';\n }\n\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleIntervalUpdated,\n\n intervalOptions,\n vuelidate,\n\n displayIntervalForDayOfWeek,\n displayIntervalForDayOfMonth,\n displayIntervalForDayOfYear,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.interval\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Interval\n </template>\n <VCFormSelect\n v-model=\"vuelidate.interval.$model\"\n :options=\"intervalOptions\"\n @change=\"handleIntervalUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <div class=\"row\">\n <div\n v-if=\"displayIntervalForDayOfWeek\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_week\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Week\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_week.$model\"\n placeholder=\"0-6\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfMonth\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_month\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Month\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_month.$model\"\n placeholder=\"1-31\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfYear\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_year\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Year\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_year.$model\"\n type=\"number\"\n placeholder=\"1-365\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxValue, minValue } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport {\n TimePolicyInterval,\n isIntervalForDayOfMonth,\n isIntervalForDayOfWeek,\n isIntervalForDayOfYear,\n} from '@authup/access';\nimport type { TimePolicy } from '@authup/access';\nimport { assignFormProperties } from '../../../../core';\nimport { onChange, useUpdatedAt } from '../../../../composables';\n\nexport default defineComponent({\n components: {\n VCFormInput,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Partial<Policy>> } },\n emits: ['updated'],\n setup(props, setup) {\n const form = reactive({\n start: '',\n end: '',\n interval: '',\n day_of_week: '',\n day_of_month: '',\n day_of_year: '',\n });\n\n const intervalOptions : FormSelectOption[] = Object.values(TimePolicyInterval)\n .map((el) => ({\n id: el,\n value: el,\n } satisfies FormSelectOption));\n\n const vuelidate = useVuelidate({\n start: {},\n end: {},\n interval: {},\n day_of_week: {\n minValue: minValue(0),\n maxValue: maxValue(6),\n },\n day_of_month: {\n minValue: minValue(1),\n maxValue: maxValue(31),\n },\n day_of_year: {\n minValue: minValue(1),\n maxValue: maxValue(365),\n },\n }, form, { $registerAs: 'type' });\n\n function assign(data: Partial<TimePolicy> = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assignFormProperties(form, data as Record<string, any>);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const displayIntervalForDayOfWeek = computed(\n () => isIntervalForDayOfWeek(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfMonth = computed(\n () => isIntervalForDayOfMonth(vuelidate.value.interval.$model),\n );\n\n const displayIntervalForDayOfYear = computed(\n () => isIntervalForDayOfYear(vuelidate.value.interval.$model),\n );\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n const handleIntervalUpdated = (value: string) => {\n if (!isIntervalForDayOfWeek(value)) {\n vuelidate.value.day_of_week.$model = '';\n }\n\n if (!isIntervalForDayOfMonth(value)) {\n vuelidate.value.day_of_month.$model = '';\n }\n\n if (!isIntervalForDayOfYear(value)) {\n vuelidate.value.day_of_year.$model = '';\n }\n\n handleUpdated();\n };\n\n return {\n handleUpdated,\n handleIntervalUpdated,\n\n intervalOptions,\n vuelidate,\n\n displayIntervalForDayOfWeek,\n displayIntervalForDayOfMonth,\n displayIntervalForDayOfYear,\n };\n },\n});\n</script>\n<template>\n <div>\n <IVuelidate :validation=\"vuelidate.start\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Start\n </template>\n <VCFormInput\n v-model=\"vuelidate.start.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.end\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n End\n </template>\n <VCFormInput\n v-model=\"vuelidate.end.$model\"\n placeholder=\"00:00:00\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.interval\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Interval\n </template>\n <VCFormSelect\n v-model=\"vuelidate.interval.$model\"\n :options=\"intervalOptions\"\n @change=\"handleIntervalUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <div class=\"row\">\n <div\n v-if=\"displayIntervalForDayOfWeek\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_week\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Week\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_week.$model\"\n placeholder=\"0-6\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfMonth\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_month\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Month\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_month.$model\"\n placeholder=\"1-31\"\n type=\"number\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"displayIntervalForDayOfYear\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.day_of_year\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Day of Year\n </template>\n <VCFormInput\n v-model=\"vuelidate.day_of_year.$model\"\n type=\"number\"\n placeholder=\"1-365\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n </div>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Policy } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const APolicy = defineComponent({\n props: defineEntityVProps<Policy>(),\n emits: defineEntityVEmitOptions<Policy>(),\n slots: Object as SlotsType<EntityVSlots<Policy>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup,\n props,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\n\nexport default defineComponent({\n props: {\n type: { type: String },\n types: { type: Array as PropType<(FormSelectOption | string)[]> },\n },\n emits: ['pick'],\n setup(props, setup) {\n const option = ref<string | null>(null);\n const options = computed<FormSelectOption[]>(() => {\n if (props.types) {\n return props.types.map((type) => {\n if (typeof type === 'string') {\n return {\n id: type,\n value: type, \n } satisfies FormSelectOption;\n }\n\n return type;\n });\n }\n\n return Object.values(BuiltInPolicyType)\n .map((type: string) => ({\n id: type,\n value: type,\n } satisfies FormSelectOption));\n });\n\n if (props.type) {\n option.value = props.type;\n }\n\n const pick = (val: string) => {\n option.value = val;\n setup.emit('pick', val);\n };\n\n return {\n option,\n options,\n pick,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Type</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in options\"\n :key=\"key\"\n >\n <div\n :class=\"{'active': item.id === option}\"\n class=\"d-flex flex-column gap-1 text-center a-picker-item\"\n @click.prevent=\"pick(`${item.id}`)\"\n >\n <div>\n {{ item.value }}\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.a-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.a-picker-item.active,\n.a-picker-item:hover,\n.a-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\n\nexport default defineComponent({\n props: {\n type: { type: String },\n types: { type: Array as PropType<(FormSelectOption | string)[]> },\n },\n emits: ['pick'],\n setup(props, setup) {\n const option = ref<string | null>(null);\n const options = computed<FormSelectOption[]>(() => {\n if (props.types) {\n return props.types.map((type) => {\n if (typeof type === 'string') {\n return {\n id: type,\n value: type, \n } satisfies FormSelectOption;\n }\n\n return type;\n });\n }\n\n return Object.values(BuiltInPolicyType)\n .map((type: string) => ({\n id: type,\n value: type,\n } satisfies FormSelectOption));\n });\n\n if (props.type) {\n option.value = props.type;\n }\n\n const pick = (val: string) => {\n option.value = val;\n setup.emit('pick', val);\n };\n\n return {\n option,\n options,\n pick,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column gap-2\">\n <div>\n <h6>Type</h6>\n\n <div class=\"d-flex flex-row gap-2 flex-wrap\">\n <template\n v-for=\"(item, key) in options\"\n :key=\"key\"\n >\n <div\n :class=\"{'active': item.id === option}\"\n class=\"d-flex flex-column gap-1 text-center a-picker-item\"\n @click.prevent=\"pick(`${item.id}`)\"\n >\n <div>\n {{ item.value }}\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.a-picker-item {\n cursor: pointer;\n border-radius: 4px;\n min-width: 120px;\n color: #5b646c;\n background-color: #ececec;\n padding: 0.5rem;\n}\n\n.a-picker-item.active,\n.a-picker-item:hover,\n.a-picker-item:active {\n background-color: #6d7fcc;\n color: #fff;\n}\n</style>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n toRef,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { assignFormProperties, injectStore, storeToRefs } from '../../../core';\nimport { onChange, useIsEditing, useUpdatedAt } from '../../../composables';\nimport { ARealmPicker } from '../realm';\n\nexport default defineComponent({\n components: {\n ARealmPicker,\n VCFormInput,\n VCFormInputCheckbox,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Policy> } },\n emits: ['updated'],\n setup(props, setup) {\n const entity = toRef(props, 'entity');\n const form = reactive({\n name: '',\n invert: false,\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const isEditing = useIsEditing(entity);\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return entity.value ?\n entity.value.realm_id :\n null;\n });\n\n const typeOptions : FormSelectOption[] = [\n ...Object.values(BuiltInPolicyType).map((type) => ({\n id: type,\n value: type, \n })),\n ];\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n invert: {},\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form, { $registerAs: 'basic' });\n\n function assign(data: Partial<Policy> = {}) {\n assignFormProperties(form, data);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n isEditing,\n realmId,\n\n handleUpdated,\n typeOptions,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Display Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Description\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"4\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.invert.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Invert?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"!realmId && !isEditing\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Realm\n </template>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(value: string[]) => { vuelidate.realm_id.$model = value.length > 0 ? value[0] ?? '' : ''; }\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n type PropType, \n computed, \n defineComponent, \n reactive, \n toRef,\n} from 'vue';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Policy } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport type { FormSelectOption } from '@vuecs/form-controls';\nimport { VCFormGroup, VCFormInput, VCFormInputCheckbox } from '@vuecs/form-controls';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { assignFormProperties, injectStore, storeToRefs } from '../../../core';\nimport { onChange, useIsEditing, useUpdatedAt } from '../../../composables';\nimport { ARealmPicker } from '../realm';\n\nexport default defineComponent({\n components: {\n ARealmPicker,\n VCFormInput,\n VCFormInputCheckbox,\n VCFormGroup,\n IVuelidate,\n },\n props: { entity: { type: Object as PropType<Policy> } },\n emits: ['updated'],\n setup(props, setup) {\n const entity = toRef(props, 'entity');\n const form = reactive({\n name: '',\n invert: false,\n display_name: '',\n description: '',\n realm_id: '',\n });\n\n const store = injectStore();\n const storeRefs = storeToRefs(store);\n\n const isEditing = useIsEditing(entity);\n const realmId = computed(() => {\n if (!storeRefs.realmIsRoot) {\n return storeRefs.realmId.value;\n }\n\n return entity.value ?\n entity.value.realm_id :\n null;\n });\n\n const typeOptions : FormSelectOption[] = [\n ...Object.values(BuiltInPolicyType).map((type) => ({\n id: type,\n value: type, \n })),\n ];\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n invert: {},\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n description: {\n minLength: minLength(5),\n maxLength: maxLength(4096),\n },\n realm_id: {},\n }, form, { $registerAs: 'basic' });\n\n function assign(data: Partial<Policy> = {}) {\n assignFormProperties(form, data);\n }\n\n setup.expose({ assign });\n\n const updatedAt = useUpdatedAt(props.entity as Policy);\n onChange(updatedAt, () => assign(props.entity));\n\n assign(props.entity);\n\n const handleUpdated = () => {\n setup.emit('updated', {\n data: form,\n valid: !vuelidate.value.$invalid,\n });\n };\n\n return {\n isEditing,\n realmId,\n\n handleUpdated,\n typeOptions,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"row\">\n <div class=\"col\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.display_name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Display Name\n </template>\n <VCFormInput\n v-model=\"vuelidate.display_name.$model\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.description\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Description\n </template>\n <VCFormTextarea\n v-model=\"vuelidate.description.$model\"\n rows=\"4\"\n @change=\"handleUpdated\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInputCheckbox\n v-model=\"vuelidate.invert.$model\"\n :group-class=\"'form-switch'\"\n :label=\"true\"\n @change=\"handleUpdated\"\n >\n <template #label=\"iProps\">\n <label :for=\"iProps.id\">\n Invert?\n </label>\n </template>\n </VCFormInputCheckbox>\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n <div\n v-if=\"!realmId && !isEditing\"\n class=\"col\"\n >\n <IVuelidate :validation=\"vuelidate.invert\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Realm\n </template>\n <ARealmPicker\n :value=\"vuelidate.realm_id.$model\"\n @change=\"(value: string[]) => { vuelidate.realm_id.$model = value.length > 0 ? value[0] ?? '' : ''; }\"\n />\n </VCFormGroup>\n </template>\n </IVuelidate>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { useIsEditing } from '../../../composables';\nimport { extractVuelidateResultsFromChild, injectHTTPClient } from '../../../core';\nimport { AFormSubmit, defineEntityManager } from '../../utility';\nimport APolicyBasicForm from './APolicyBasicForm.vue';\nimport APolicyTypePicker from './APolicyTypePicker.vue';\nimport AAttributeNamesPolicyForm from './attribute-names/AAttributeNamesPolicyForm.vue';\nimport ACompositePolicyForm from './composite/ACompositePolicyForm.vue';\nimport ADatePolicyForm from './date/ADatePolicyForm.vue';\nimport ARealmMatchPolicyForm from './realm-match/ARealmMatchPolicyForm.vue';\nimport ATimePolicyForm from './time/ATimePolicyForm.vue';\nimport AIdentityPolicyForm from './identity/AIdentityPolicyForm.vue';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n APolicyTypePicker,\n APolicyBasicForm, \n },\n props: {\n entity: { type: Object as PropType<Policy> },\n type: { type: String as PropType<string> },\n },\n setup(props, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const typeComponents : Record<string, any> = {\n [BuiltInPolicyType.IDENTITY]: AIdentityPolicyForm,\n [BuiltInPolicyType.REALM_MATCH]: ARealmMatchPolicyForm,\n [BuiltInPolicyType.COMPOSITE]: ACompositePolicyForm,\n [BuiltInPolicyType.DATE]: ADatePolicyForm,\n [BuiltInPolicyType.TIME]: ATimePolicyForm,\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: AAttributeNamesPolicyForm,\n };\n\n const httpClient = injectHTTPClient();\n const manager = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n\n const typeComputed = computed<string | null>(() => {\n if (manager.data.value) {\n return manager.data.value.type;\n }\n\n if (props.type) {\n return props.type;\n }\n\n return null;\n });\n\n const vuelidate = useVuelidate({ $stopPropagation: true });\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n const {\n items = [], \n ...data \n } = {\n ...extractVuelidateResultsFromChild(vuelidate, 'basic'),\n ...extractVuelidateResultsFromChild(vuelidate, 'type'),\n } as Partial<Omit<Policy, 'children'>> & { items: string[] };\n\n if (typeComputed.value) {\n data.type = typeComputed.value;\n }\n\n await manager.createOrUpdate(data);\n\n if (manager.data.value) {\n if (items.length > 0) {\n for (const item of items) {\n await httpClient.policy.update(item, { parent_id: manager.data.value.id });\n }\n }\n }\n };\n\n return {\n typeComputed,\n typeComponents,\n data: manager.data,\n busy: manager.busy,\n isEditing,\n submit,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column\">\n <h6>General</h6>\n <APolicyBasicForm :entity=\"data\" />\n\n <template v-if=\"typeComputed\">\n <slot\n name=\"default\"\n :entity=\"entity\"\n >\n <template v-if=\"typeComputed in typeComponents\">\n <component\n :is=\"typeComponents[typeComputed]\"\n :entity=\"entity\"\n />\n </template>\n </slot>\n </template>\n\n <div>\n <AFormSubmit\n :is-invalid=\"vuelidate.$invalid || !typeComputed\"\n :is-busy=\"busy\"\n :is-editing=\"isEditing\"\n @submit=\"submit\"\n />\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport type { Policy } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport useVuelidate from '@vuelidate/core';\nimport { BuiltInPolicyType } from '@authup/access';\nimport { useIsEditing } from '../../../composables';\nimport { extractVuelidateResultsFromChild, injectHTTPClient } from '../../../core';\nimport { AFormSubmit, defineEntityManager } from '../../utility';\nimport APolicyBasicForm from './APolicyBasicForm.vue';\nimport APolicyTypePicker from './APolicyTypePicker.vue';\nimport AAttributeNamesPolicyForm from './attribute-names/AAttributeNamesPolicyForm.vue';\nimport ACompositePolicyForm from './composite/ACompositePolicyForm.vue';\nimport ADatePolicyForm from './date/ADatePolicyForm.vue';\nimport ARealmMatchPolicyForm from './realm-match/ARealmMatchPolicyForm.vue';\nimport ATimePolicyForm from './time/ATimePolicyForm.vue';\nimport AIdentityPolicyForm from './identity/AIdentityPolicyForm.vue';\n\nexport default defineComponent({\n components: {\n AFormSubmit,\n APolicyTypePicker,\n APolicyBasicForm, \n },\n props: {\n entity: { type: Object as PropType<Policy> },\n type: { type: String as PropType<string> },\n },\n setup(props, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const typeComponents : Record<string, any> = {\n [BuiltInPolicyType.IDENTITY]: AIdentityPolicyForm,\n [BuiltInPolicyType.REALM_MATCH]: ARealmMatchPolicyForm,\n [BuiltInPolicyType.COMPOSITE]: ACompositePolicyForm,\n [BuiltInPolicyType.DATE]: ADatePolicyForm,\n [BuiltInPolicyType.TIME]: ATimePolicyForm,\n [BuiltInPolicyType.ATTRIBUTE_NAMES]: AAttributeNamesPolicyForm,\n };\n\n const httpClient = injectHTTPClient();\n const manager = defineEntityManager({\n type: `${EntityType.POLICY}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n\n const typeComputed = computed<string | null>(() => {\n if (manager.data.value) {\n return manager.data.value.type;\n }\n\n if (props.type) {\n return props.type;\n }\n\n return null;\n });\n\n const vuelidate = useVuelidate({ $stopPropagation: true });\n\n const submit = async () => {\n if (vuelidate.value.$invalid) {\n return;\n }\n\n const {\n items = [], \n ...data \n } = {\n ...extractVuelidateResultsFromChild(vuelidate, 'basic'),\n ...extractVuelidateResultsFromChild(vuelidate, 'type'),\n } as Partial<Omit<Policy, 'children'>> & { items: string[] };\n\n if (typeComputed.value) {\n data.type = typeComputed.value;\n }\n\n await manager.createOrUpdate(data);\n\n if (manager.data.value) {\n if (items.length > 0) {\n for (const item of items) {\n await httpClient.policy.update(item, { parent_id: manager.data.value.id });\n }\n }\n }\n };\n\n return {\n typeComputed,\n typeComponents,\n data: manager.data,\n busy: manager.busy,\n isEditing,\n submit,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <div class=\"d-flex flex-column\">\n <h6>General</h6>\n <APolicyBasicForm :entity=\"data\" />\n\n <template v-if=\"typeComputed\">\n <slot\n name=\"default\"\n :entity=\"entity\"\n >\n <template v-if=\"typeComputed in typeComponents\">\n <component\n :is=\"typeComponents[typeComputed]\"\n :entity=\"entity\"\n />\n </template>\n </slot>\n </template>\n\n <div>\n <AFormSubmit\n :is-invalid=\"vuelidate.$invalid || !typeComputed\"\n :is-busy=\"busy\"\n :is-editing=\"isEditing\"\n @submit=\"submit\"\n />\n </div>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientPermissionAssignment } from '../client-permission';\n\nexport default defineComponent({\n components: { AClients, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientPermissionAssignment } from '../client-permission';\n\nexport default defineComponent({\n components: { AClients, AClientPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n permissionId: {\n type: String,\n required: true,\n },\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<PermissionPolicy>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION_POLICY}`,\n setup,\n query: () => ({\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.policy_id === props.policyId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n permission_id: props.permissionId,\n policy_id: props.policyId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n permissionId: {\n type: String,\n required: true,\n },\n policyId: {\n type: String,\n required: true,\n },\n },\n emits: defineEntityVEmitOptions<PermissionPolicy>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.PERMISSION_POLICY}`,\n setup,\n query: () => ({\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.policy_id === props.policyId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n permission_id: props.permissionId,\n policy_id: props.policyId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n permission_id: props.permissionId,\n policy_id: props.policyId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\n/* global document, KeyboardEvent */\nimport type { Policy } from '@authup/core-kit';\nimport {\n computed,\n defineComponent,\n onMounted,\n onUnmounted,\n ref,\n} from 'vue';\nimport APermissionPolicyAssignment from './APermissionPolicyAssignment.vue';\nimport { APolicies } from '../policy';\nimport APolicyInlineInfo from '../policy/APolicyInlineInfo.vue';\nimport APolicySummary from '../policy/APolicySummary.vue';\n\nexport default defineComponent({\n components: {\n APolicies, \n APermissionPolicyAssignment, \n APolicyInlineInfo, \n APolicySummary, \n },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const detailPolicy = ref<Policy | null>(null);\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && detailPolicy.value) {\n detailPolicy.value = null;\n }\n };\n\n onMounted(() => {\n document.addEventListener('keydown', handleKeydown);\n });\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown);\n });\n\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'item')));\n\n return { detailPolicy, forwardedSlots };\n },\n});\n</script>\n<template>\n <div>\n <APolicies :query=\"{ filters: { parent_id: null } }\">\n <template #item=\"{ data }\">\n <div>{{ data.name }}</div>\n <APolicyInlineInfo\n :entity=\"data\"\n @detail=\"detailPolicy = $event\"\n />\n <div class=\"ms-auto\">\n <APermissionPolicyAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :policy-id=\"data.id\"\n />\n </div>\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APolicies>\n\n <Teleport\n v-if=\"detailPolicy\"\n to=\"body\"\n >\n <div\n class=\"modal-backdrop fade show\"\n @click=\"detailPolicy = null\"\n />\n <div\n class=\"modal fade show d-block\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"`policy-detail-modal-${detailPolicy.id}`\"\n >\n <div\n class=\"modal-dialog\"\n role=\"document\"\n @click.stop\n >\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5\n :id=\"`policy-detail-modal-${detailPolicy.id}`\"\n class=\"modal-title\"\n >\n {{ detailPolicy.name }}\n </h5>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n @click=\"detailPolicy = null\"\n />\n </div>\n <div class=\"modal-body\">\n <APolicySummary :entity=\"detailPolicy\" />\n </div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n class=\"btn btn-secondary btn-xs\"\n @click=\"detailPolicy = null\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n","<!--\n Copyright (c) 2026.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\n/* global document, KeyboardEvent */\nimport type { Policy } from '@authup/core-kit';\nimport {\n computed,\n defineComponent,\n onMounted,\n onUnmounted,\n ref,\n} from 'vue';\nimport APermissionPolicyAssignment from './APermissionPolicyAssignment.vue';\nimport { APolicies } from '../policy';\nimport APolicyInlineInfo from '../policy/APolicyInlineInfo.vue';\nimport APolicySummary from '../policy/APolicySummary.vue';\n\nexport default defineComponent({\n components: {\n APolicies, \n APermissionPolicyAssignment, \n APolicyInlineInfo, \n APolicySummary, \n },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const detailPolicy = ref<Policy | null>(null);\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && detailPolicy.value) {\n detailPolicy.value = null;\n }\n };\n\n onMounted(() => {\n document.addEventListener('keydown', handleKeydown);\n });\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown);\n });\n\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'item')));\n\n return { detailPolicy, forwardedSlots };\n },\n});\n</script>\n<template>\n <div>\n <APolicies :query=\"{ filters: { parent_id: null } }\">\n <template #item=\"{ data }\">\n <div>{{ data.name }}</div>\n <APolicyInlineInfo\n :entity=\"data\"\n @detail=\"detailPolicy = $event\"\n />\n <div class=\"ms-auto\">\n <APermissionPolicyAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :policy-id=\"data.id\"\n />\n </div>\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APolicies>\n\n <Teleport\n v-if=\"detailPolicy\"\n to=\"body\"\n >\n <div\n class=\"modal-backdrop fade show\"\n @click=\"detailPolicy = null\"\n />\n <div\n class=\"modal fade show d-block\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"`policy-detail-modal-${detailPolicy.id}`\"\n >\n <div\n class=\"modal-dialog\"\n role=\"document\"\n @click.stop\n >\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5\n :id=\"`policy-detail-modal-${detailPolicy.id}`\"\n class=\"modal-title\"\n >\n {{ detailPolicy.name }}\n </h5>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n @click=\"detailPolicy = null\"\n />\n </div>\n <div class=\"modal-body\">\n <APolicySummary :entity=\"detailPolicy\" />\n </div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n class=\"btn btn-secondary btn-xs\"\n @click=\"detailPolicy = null\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n robotId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.robot_id === props.robotId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RobotPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROBOT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n robotId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.robot_id === props.robotId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RobotPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROBOT_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const ARobot = defineComponent({\n props: defineEntityVProps<Robot>(),\n emits: defineEntityVEmitOptions<Robot>(),\n slots: Object as SlotsType<EntityVSlots<Robot>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID } from '@authup/kit';\nimport useVuelidate from '@vuelidate/core';\nimport type {\n PropType,\n VNodeArrayChildren,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n reactive,\n ref,\n watch,\n} from 'vue';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { Realm, Robot } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport {\n buildFormGroup,\n buildFormInput,\n} from '@vuecs/form-controls';\nimport { SlotName } from '@vuecs/list-controls';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations,\n getVuelidateSeverity,\n useTranslationsForGroup,\n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n renderToggleButton,\n} from '../../utility';\n\nimport { ARealms } from '../realm';\n\nexport const ARobotForm = defineComponent({\n props: {\n name: {\n type: String,\n default: undefined,\n },\n entity: {\n type: Object as PropType<Robot>,\n default: undefined,\n },\n realmId: {\n type: String,\n default: undefined,\n },\n },\n emits: defineEntityVEmitOptions<Robot>(),\n setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n name: '',\n display_name: '',\n realm_id: '',\n secret: '',\n });\n\n const $v = useVuelidate({\n name: {\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n realm_id: { required },\n secret: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n }, form);\n\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isNameFixed = computed(() => !!props.name && props.name.length > 0);\n const isRealmLocked = computed(() => !!props.realmId);\n const isSecretHashed = computed(\n () => manager.data.value && manager.data.value.secret === form.secret && form.secret.startsWith('$'),\n );\n\n const generateSecret = () => {\n form.secret = createNanoID(64);\n };\n\n function initForm() {\n if (props.name) {\n form.name = props.name;\n }\n\n if (props.realmId) {\n form.realm_id = props.realmId;\n }\n\n assignFormProperties(form, manager.data.value);\n\n if (form.secret.length === 0) {\n generateSecret();\n }\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity;\n\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate({\n ...form,\n secret: isSecretHashed.value ? '' : form.secret,\n });\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.GENERATE },\n { key: TranslatorTranslationDefaultKey.HASHED },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n { key: TranslatorTranslationDefaultKey.SECRET },\n ],\n );\n\n const render = () => {\n const name = buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n },\n props: { disabled: isNameFixed.value },\n }),\n });\n\n const displayName = buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n });\n\n let id : VNodeArrayChildren = [];\n\n if (manager.data.value) {\n id = [\n buildFormGroup({\n label: true,\n labelContent: 'ID',\n content: buildFormInput({\n value: manager.data.value.id,\n props: { disabled: true },\n }),\n }),\n ];\n }\n\n const secret = buildFormGroup({\n validationMessages: translationsValidation.secret.value,\n validationSeverity: getVuelidateSeverity($v.value.secret),\n label: true,\n labelContent: [\n translationsDefault[TranslatorTranslationDefaultKey.SECRET].value,\n isSecretHashed.value ? h('span', { class: 'text-danger font-weight-bold ps-1' }, [\n translationsDefault[TranslatorTranslationDefaultKey.HASHED].value,\n ' ',\n h('i', { class: 'fa fa-exclamation-triangle ps-1' }),\n ]) : '',\n ],\n content: buildFormInput({\n value: $v.value.secret.$model,\n onChange(input) {\n $v.value.secret.$model = input;\n },\n }),\n });\n\n const secretInfo = h('div', [\n h('button', {\n class: 'btn btn-dark btn-xs',\n onClick($event: any) {\n $event.preventDefault();\n\n generateSecret.call(null);\n },\n }, [\n h('i', { class: 'fa fa-wrench' }),\n ' ',\n translationsDefault[TranslatorTranslationDefaultKey.GENERATE].value,\n ]),\n ]);\n\n const submitForm = buildFormSubmitWithTranslations({\n busy: busy.value,\n submit,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit);\n\n const leftColumn = h('div', { class: 'col' }, [\n id,\n name,\n displayName,\n secret,\n secretInfo,\n h('hr'),\n submitForm,\n ]);\n\n let rightColumn : VNodeArrayChildren = [];\n\n if (\n !isRealmLocked.value\n ) {\n const realm = h(ARealms, {}, {\n [SlotName.ITEM_ACTIONS]: (\n props: {\n data: Realm,\n busy: boolean \n },\n ) => renderToggleButton({\n value: form.realm_id === props.data.id,\n isBusy: props.busy,\n changed(value) {\n if (value) {\n form.realm_id = props.data.id;\n } else {\n form.realm_id = '';\n }\n },\n }),\n });\n\n rightColumn = [\n h('div', { class: 'col' }, [\n realm,\n ]),\n ];\n }\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, [\n h('div', { class: 'row' }, [\n leftColumn,\n rightColumn,\n ]),\n ]);\n };\n\n return () => render();\n },\n});\n\nexport default ARobotForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { Robot } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup, \n TranslatorTranslationVuecsKey, \n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const ARobots = defineComponent({\n props: defineEntityCollectionVProps<Robot>(),\n emits: defineEntityCollectionVEmitOptions<Robot>(),\n slots: Object as SlotsType<EntityCollectionVSlots<Robot>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.ROBOT}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationDefaultKey.ROBOTS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport ARobotPermissionAssignment from '../robot-permission/ARobotPermissionAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport ARobotPermissionAssignment from '../robot-permission/ARobotPermissionAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RolePermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n roleId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RolePermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROLE_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.permission_id === props.permissionId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n role_id: props.roleId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RolePermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROLE_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RolePermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n roleId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RolePermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROLE_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.permission_id === props.permissionId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n role_id: props.roleId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n role_id: props.roleId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: RolePermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.ROLE_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARolePermissionAssignment from './ARolePermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARolePermissionAssignment from './ARolePermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARolePermissionAssignment } from '../role-permission';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARolePermissionAssignment } from '../role-permission';\nimport { ARoles } from '../role';\n\nexport default defineComponent({\n components: { ARoles, ARolePermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARolePermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n userId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: UserPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.USER_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserPermission } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\nimport { APermissionPolicyBindingButton } from '../permission-policy-binding';\n\nexport default defineComponent({\n components: { AToggleButton, APermissionPolicyBindingButton },\n props: {\n userId: { type: String, required: true },\n permissionId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserPermission>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_PERMISSION}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.permission_id === props.permissionId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n permission_id: props.permissionId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n permission_id: props.permissionId,\n });\n }\n\n return manager.delete();\n };\n\n const handleUpdated = (entity: UserPermission) => {\n manager.updated(entity);\n };\n\n return {\n manager,\n handleChanged,\n handleUpdated,\n EntityType,\n };\n },\n});\n</script>\n<template>\n <span class=\"d-flex gap-1\">\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n <APermissionPolicyBindingButton\n v-if=\"manager.data.value\"\n :key=\"manager.data.value.id\"\n :entity-type=\"EntityType.USER_PERMISSION\"\n :entity=\"manager.data.value\"\n @updated=\"handleUpdated\"\n />\n </span>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AUserPermissionAssignment from './AUserPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport AUserPermissionAssignment from './AUserPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { User } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EntityVSlots } from '../../utility';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n defineEntityVProps,\n} from '../../utility';\n\nexport const AUser = defineComponent({\n props: defineEntityVProps<User>(),\n emits: defineEntityVEmitOptions<User>(),\n slots: Object as SlotsType<EntityVSlots<User>>,\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER}`,\n props,\n setup,\n });\n\n try {\n await manager.resolveOrFail();\n\n return () => manager.render();\n } catch (e) {\n return () => manager.renderError(e);\n }\n },\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, User } from '@authup/core-kit';\nimport { EntityType, buildUserFakeEmail, isUserFakeEmail } from '@authup/core-kit';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport { SlotName } from '@vuecs/list-controls';\nimport useVuelidate from '@vuelidate/core';\nimport {\n email, \n maxLength, \n minLength, \n required,\n} from '@vuelidate/validators';\nimport type { PropType, VNodeArrayChildren } from 'vue';\nimport {\n computed, \n defineComponent, \n h, \n reactive, \n ref, \n watch,\n} from 'vue';\nimport { useIsEditing, useUpdatedAt } from '../../../composables';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup, \n VuelidateCustomRule,\n VuelidateCustomRuleKey,\n assignFormProperties,\n buildFormSubmitWithTranslations, \n createFormSubmitTranslations, \n getVuelidateSeverity, \n useTranslationsForGroup, \n useTranslationsForNestedValidation,\n} from '../../../core';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n renderToggleButton,\n} from '../../utility';\nimport { ARealms } from '../realm';\n\nexport const AUserForm = defineComponent({\n props: {\n entity: {\n type: Object as PropType<User | null>,\n default: undefined,\n },\n realmId: {\n type: String as PropType<string | null>,\n default: undefined,\n },\n canManage: {\n type: Boolean,\n default: true,\n },\n },\n emits: defineEntityVEmitOptions<User>(),\n async setup(props, ctx) {\n const busy = ref(false);\n const form = reactive({\n active: true,\n name: '',\n name_locked: false,\n display_name: '',\n email: '',\n realm_id: '',\n });\n\n const $v = useVuelidate({\n active: {},\n name: {\n [\n VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT\n ]: VuelidateCustomRule[VuelidateCustomRuleKey.ALPHA_UPPER_NUM_HYPHEN_UNDERSCORE_DOT],\n required,\n minLength: minLength(3),\n maxLength: maxLength(128),\n },\n name_locked: {},\n display_name: {\n minLength: minLength(3),\n maxLength: maxLength(256),\n },\n email: {\n minLength: minLength(5),\n maxLength: maxLength(255),\n email,\n required,\n },\n realm_id: { required },\n }, form);\n\n const manager = defineEntityManager({\n type: `${EntityType.USER}`,\n setup: ctx,\n props,\n });\n\n const isEditing = useIsEditing(manager.data);\n const updatedAt = useUpdatedAt(props.entity);\n\n const isRealmLocked = computed(() => !!props.realmId);\n\n function initForm() {\n if (props.realmId) {\n form.realm_id = props.realmId;\n }\n\n if (\n !!manager.data.value &&\n typeof manager.data.value.name_locked !== 'undefined'\n ) {\n form.name_locked = manager.data.value.name_locked;\n }\n\n assignFormProperties(form, manager.data.value);\n }\n\n watch(updatedAt, (val, oldVal) => {\n if (val && val !== oldVal) {\n manager.data.value = props.entity ?? undefined;\n initForm();\n }\n });\n\n initForm();\n\n const submit = async () => {\n if ($v.value.$invalid) {\n return;\n }\n\n await manager.createOrUpdate(form);\n };\n\n const translationsValidation = useTranslationsForNestedValidation($v.value);\n const translationsSubmit = createFormSubmitTranslations();\n\n const translationsDefault = useTranslationsForGroup(\n TranslatorTranslationGroup.DEFAULT,\n [\n { key: TranslatorTranslationDefaultKey.ACTIVE },\n { key: TranslatorTranslationDefaultKey.INACTIVE },\n { key: TranslatorTranslationDefaultKey.DISPLAY_NAME },\n { key: TranslatorTranslationDefaultKey.EMAIL },\n { key: TranslatorTranslationDefaultKey.LOCKED },\n { key: TranslatorTranslationDefaultKey.NOT_LOCKED },\n { key: TranslatorTranslationDefaultKey.NAME },\n { key: TranslatorTranslationDefaultKey.DESCRIPTION },\n ],\n );\n\n const render = () => {\n const name = buildFormGroup({\n validationMessages: translationsValidation.name.value,\n validationSeverity: getVuelidateSeverity($v.value.name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.NAME].value,\n content: buildFormInput({\n value: $v.value.name.$model,\n onChange(input) {\n $v.value.name.$model = input;\n\n if (!$v.value.email.$model || isUserFakeEmail($v.value.email.$model)) {\n $v.value.email.$model = buildUserFakeEmail(input);\n }\n },\n props: { disabled: form.name_locked },\n }),\n });\n\n const displayName = buildFormGroup({\n validationMessages: translationsValidation.display_name.value,\n validationSeverity: getVuelidateSeverity($v.value.display_name),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.DISPLAY_NAME].value,\n content: buildFormInput({\n value: $v.value.display_name.$model,\n onChange(input) {\n $v.value.display_name.$model = input;\n },\n }),\n });\n\n const email = buildFormGroup({\n validationMessages: translationsValidation.email.value,\n validationSeverity: getVuelidateSeverity($v.value.email),\n label: true,\n labelContent: translationsDefault[TranslatorTranslationDefaultKey.EMAIL].value,\n content: buildFormInput({\n value: $v.value.email.$model,\n props: {\n type: 'email',\n placeholder: '...@...',\n },\n onChange(value) {\n $v.value.email.$model = value;\n },\n }),\n });\n\n let checks : VNodeArrayChildren = [];\n\n if (props.canManage) {\n let nameLock : VNodeArrayChildren = [];\n if (props.entity) {\n nameLock = [\n buildFormInputCheckbox({\n groupClass: 'form-switch mt-3',\n labelContent: h('span', {\n class: {\n 'text-warning': !form.name_locked,\n 'text-success': form.name_locked,\n },\n }, [form.name_locked ?\n translationsDefault[TranslatorTranslationDefaultKey.LOCKED].value :\n translationsDefault[TranslatorTranslationDefaultKey.NOT_LOCKED].value]), // todo: add translation\n value: form.name_locked,\n onChange(input) {\n form.name_locked = input;\n },\n }),\n ];\n }\n\n checks = [\n h('div', { class: 'row' }, [\n h('div', { class: 'col' }, [\n buildFormInputCheckbox({\n groupClass: 'form-switch mt-3',\n labelContent: h('span', {\n class: {\n 'text-danger': !form.active,\n 'text-success': form.active,\n },\n }, [form.active ?\n translationsDefault[TranslatorTranslationDefaultKey.ACTIVE].value :\n translationsDefault[TranslatorTranslationDefaultKey.INACTIVE].value]),\n value: form.active,\n onChange(input) {\n form.active = input;\n },\n }),\n ]),\n h('div', { class: 'col' }, [\n nameLock,\n ]),\n ]),\n\n ];\n }\n\n const submitForm = buildFormSubmitWithTranslations({\n submit,\n busy: busy.value,\n isEditing: isEditing.value,\n invalid: $v.value.$invalid,\n }, translationsSubmit);\n\n const leftColumn = h('div', { class: 'col' }, [\n name,\n displayName,\n email,\n checks,\n h('hr'),\n submitForm,\n ]);\n\n let rightColumn : VNodeArrayChildren = [];\n\n if (\n props.canManage &&\n !isRealmLocked.value\n ) {\n const realm = h(ARealms, {}, {\n [SlotName.ITEM_ACTIONS]: (props: {\n data: Realm,\n busy: boolean \n }) => renderToggleButton({\n value: form.realm_id === props.data.id,\n isBusy: props.busy,\n changed(value) {\n if (value) {\n form.realm_id = props.data.id;\n } else {\n form.realm_id = '';\n }\n },\n }),\n });\n\n rightColumn = [\n h('div', { class: 'col' }, [\n realm,\n ]),\n ];\n }\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, [\n h('div', { class: 'row' }, [\n leftColumn,\n rightColumn,\n ]),\n ]);\n };\n\n return () => render();\n },\n});\n\nexport default AUserForm;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EntityType } from '@authup/core-kit';\nimport type { SlotsType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { User } from '@authup/core-kit';\nimport type { EntityCollectionVSlots } from '../../utility';\nimport {\n TranslatorTranslationDefaultKey,\n TranslatorTranslationGroup,\n TranslatorTranslationVuecsKey,\n useTranslation,\n} from '../../../core';\nimport {\n defineEntityCollectionManager,\n defineEntityCollectionVEmitOptions,\n defineEntityCollectionVProps,\n} from '../../utility';\n\nexport const AUsers = defineComponent({\n props: defineEntityCollectionVProps<User>(),\n emits: defineEntityCollectionVEmitOptions<User>(),\n slots: Object as SlotsType<EntityCollectionVSlots<User>>,\n setup(props, ctx) {\n const { render } = defineEntityCollectionManager({\n type: `${EntityType.USER}`,\n props,\n setup: ctx,\n });\n\n const translationName = useTranslation({\n group: TranslatorTranslationGroup.DEFAULT,\n key: TranslatorTranslationDefaultKey.USERS,\n });\n\n const translation = useTranslation({\n group: TranslatorTranslationGroup.VUECS,\n key: TranslatorTranslationVuecsKey.NO_MORE,\n data: { name: translationName },\n });\n\n return () => render({ noMore: { content: translation.value } });\n },\n});\n\nexport default AUsers;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport useVuelidate from '@vuelidate/core';\nimport {\n maxLength, \n minLength, \n required, \n sameAs,\n} from '@vuelidate/validators';\nimport type { PropType } from 'vue';\nimport {\n defineComponent, \n h, \n reactive, \n ref, \n toRef,\n} from 'vue';\nimport { buildFormGroup, buildFormInput, buildFormInputCheckbox } from '@vuecs/form-controls';\nimport {\n buildFormSubmitWithTranslations,\n createFormSubmitTranslations, \n getVuelidateSeverity,\n injectHTTPClient,\n useTranslationsForNestedValidation,\n wrapFnWithBusyState,\n} from '../../../core';\n\nexport const AUserPasswordForm = defineComponent({\n props: {\n id: {\n type: String as PropType<string | null>,\n default: undefined,\n },\n },\n emits: ['created', 'deleted', 'updated', 'failed'],\n setup(props, ctx) {\n const apiClient = injectHTTPClient();\n const busy = ref(false);\n const form = reactive({\n password: '',\n password_repeat: '',\n });\n\n const passwordShow = ref(false);\n const passwordRef = toRef(form, 'password');\n\n const $v = useVuelidate({\n password: {\n required,\n minLength: minLength(5),\n maxLength: maxLength(100),\n },\n password_repeat: {\n minLength: minLength(5),\n maxLength: maxLength(100),\n sameAs: sameAs(passwordRef),\n },\n }, form);\n\n const submit = wrapFnWithBusyState(busy, async () => {\n if (!props.id) {\n return;\n }\n\n try {\n const user = await apiClient.user.update(props.id, {\n password: form.password,\n password_repeat: form.password_repeat,\n });\n\n ctx.emit('updated', user);\n } catch (e) {\n if (e instanceof Error) {\n ctx.emit('failed', e);\n }\n }\n });\n\n const validationMessages = useTranslationsForNestedValidation($v.value);\n const submitTranslations = createFormSubmitTranslations();\n\n const render = () => {\n const password = buildFormGroup({\n validationMessages: validationMessages.password.value,\n validationSeverity: getVuelidateSeverity($v.value.password),\n label: true,\n labelContent: 'Password',\n content: buildFormInput({\n value: $v.value.password.$model,\n onChange(input) {\n $v.value.password.$model = input;\n },\n props: {\n type: passwordShow.value ? 'text' : 'password',\n autocomplete: 'new-password',\n },\n }),\n });\n\n const passwordRepeat = buildFormGroup({\n validationMessages: validationMessages.password_repeat.value,\n validationSeverity: getVuelidateSeverity($v.value.password_repeat),\n label: true,\n labelContent: 'Password repeat',\n content: buildFormInput({\n value: $v.value.password_repeat.$model,\n onChange(input) {\n $v.value.password_repeat.$model = input;\n },\n props: {\n type: passwordShow.value ? 'text' : 'password',\n autocomplete: 'new-password',\n },\n }),\n });\n\n const showPassword = buildFormInputCheckbox({\n groupClass: 'mt-3',\n labelContent: [\n 'Password ',\n (passwordShow.value ? 'hide' : 'show'),\n ],\n value: passwordShow.value,\n onChange(input) {\n passwordShow.value = input;\n },\n });\n\n const submitButton = buildFormSubmitWithTranslations({\n submit,\n isEditing: true,\n invalid: $v.value.$invalid,\n }, submitTranslations);\n\n return h('form', {\n onSubmit($event: any) {\n $event.preventDefault();\n\n return submit.apply(null);\n },\n }, [\n password,\n passwordRepeat,\n showPassword,\n submitButton,\n ]);\n };\n\n return () => render();\n },\n});\n\nexport default AUserPasswordForm;\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserPermissionAssignment } from '../user-permission';\nimport { AUsers } from '../user';\n\nexport default defineComponent({\n components: { AUsers, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserPermissionAssignment } from '../user-permission';\nimport { AUsers } from '../user';\n\nexport default defineComponent({\n components: { AUsers, AUserPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserPermissionAssignment\n :key=\"data.id\"\n :permission-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARobotPermissionAssignment from './ARobotPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { APermissions } from '../permission';\nimport ARobotPermissionAssignment from './ARobotPermissionAssignment.vue';\n\nexport default defineComponent({\n components: { APermissions, ARobotPermissionAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <APermissions>\n <template #itemActions=\"{ data }\">\n <ARobotPermissionAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :permission-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </APermissions>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n robotId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.robot_id === props.robotId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n robotId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<RobotRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.ROBOT_ROLE}`,\n setup,\n query: () => ({\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.robot_id === props.robotId &&\n event.data.role_id === props.roleId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n robot_id: props.robotId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n robot_id: props.robotId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport ARobotRoleAssignment from './ARobotRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport ARobotRoleAssignment from './ARobotRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :robot-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientRoleAssignment } from '../client-role';\n\nexport default defineComponent({\n components: { AClients, AClientRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientRoleAssignment } from '../client-role';\n\nexport default defineComponent({\n components: { AClients, AClientRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ARobotRoleAssignment from '../robot-role/ARobotRoleAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ARobotRoleAssignment from '../robot-role/ARobotRoleAssignment.vue';\nimport { ARobots } from '../robot';\n\nexport default defineComponent({\n components: { ARobots, ARobotRoleAssignment },\n props: { entityId: { type: String, required: true } },\n});\n</script>\n<template>\n <ARobots>\n <template #itemActions=\"{ data }\">\n <ARobotRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :robot-id=\"data.id\"\n />\n </template>\n </ARobots>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n userId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_ROLE}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { EntityType } from '@authup/core-kit';\nimport type { UserRole } from '@authup/core-kit';\nimport { defineComponent } from 'vue';\nimport {\n defineEntityManager,\n defineEntityVEmitOptions,\n} from '../../utility';\nimport AToggleButton from '../../utility/toggle-button/AToggleButton.vue';\n\nexport default defineComponent({\n components: { AToggleButton },\n props: {\n roleId: { type: String, required: true },\n userId: { type: String, required: true },\n },\n emits: defineEntityVEmitOptions<UserRole>(),\n async setup(props, setup) {\n const manager = defineEntityManager({\n type: `${EntityType.USER_ROLE}`,\n setup,\n query: () => ({\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n }),\n socket: {\n processEvent(event) {\n return event.data.role_id === props.roleId &&\n event.data.user_id === props.userId;\n },\n },\n });\n\n await manager.resolve({\n query: {\n filters: {\n user_id: props.userId,\n role_id: props.roleId,\n },\n },\n });\n\n const handleChanged = (value: boolean) => {\n if (value) {\n return manager.create({\n user_id: props.userId,\n role_id: props.roleId,\n });\n }\n\n return manager.delete();\n };\n\n return {\n manager,\n handleChanged,\n };\n },\n});\n</script>\n<template>\n <AToggleButton\n :value=\"!!manager.data.value\"\n :is-busy=\"manager.busy.value\"\n @changed=\"handleChanged\"\n />\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AUserRoleAssignment from './AUserRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { ARoles } from '../role';\nimport AUserRoleAssignment from './AUserRoleAssignment.vue';\n\nexport default defineComponent({\n components: { ARoles, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <ARoles>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :user-id=\"entityId\"\n :role-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </ARoles>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserRoleAssignment } from '../user-role';\nimport { AUsers } from '../user/AUsers';\n\nexport default defineComponent({\n components: { AUsers, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AUserRoleAssignment } from '../user-role';\nimport { AUsers } from '../user/AUsers';\n\nexport default defineComponent({\n components: { AUsers, AUserRoleAssignment },\n props: { entityId: { type: String, required: true } },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AUsers>\n <template #itemActions=\"{ data }\">\n <AUserRoleAssignment\n :key=\"data.id\"\n :role-id=\"entityId\"\n :user-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AUsers>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientScopeAssignment } from '../client-scope';\n\nexport default defineComponent({\n components: { AClients, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :scope-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","<!--\n Copyright (c) 2022.\n Author Peter Placzek (tada5hi)\n For the full copyright and license information,\n view the LICENSE file that was distributed with this source code.\n-->\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\nimport { AClients } from '../client';\nimport { AClientScopeAssignment } from '../client-scope';\n\nexport default defineComponent({\n components: { AClients, AClientScopeAssignment },\n props: {\n entityId: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const forwardedSlots = computed(() => Object.fromEntries(Object.entries(slots).filter(([name]) => name !== 'itemActions')));\n return { forwardedSlots };\n },\n});\n</script>\n<template>\n <AClients>\n <template #itemActions=\"{ data }\">\n <AClientScopeAssignment\n :key=\"data.id\"\n :scope-id=\"entityId\"\n :client-id=\"data.id\"\n />\n </template>\n <template\n v-for=\"(_, name) in forwardedSlots\"\n :key=\"name\"\n #[name]=\"slotData\"\n >\n <slot\n :name=\"name\"\n v-bind=\"slotData ?? {}\"\n />\n </template>\n </AClients>\n</template>\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport * from './client';\nexport * from './client-permission';\nexport * from './client-role';\nexport * from './client-scope';\nexport * from './identity-provider';\nexport * from './identity-provider-role';\nexport * from './policy';\nexport * from './permission';\nexport * from './permission-client';\nexport * from './permission-policy-binding';\nexport * from './permission-policy';\nexport * from './permission-robot';\nexport * from './permission-role';\nexport * from './permission-user';\nexport * from './realm';\nexport * from './robot';\nexport * from './robot-permission';\nexport * from './robot-role';\nexport * from './role';\nexport * from './role-client';\nexport * from './role-permission';\nexport * from './role-robot';\nexport * from './user-permission';\nexport * from './role-user';\nexport * from './scope';\nexport * from './scope-client';\nexport * from './user';\nexport * from './user-role';\n","/*\n * Copyright (c) 2024-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport installFormControl from '@vuecs/form-controls';\nimport { installStoreManager } from '@vuecs/form-controls/core';\nimport installPagination from '@vuecs/pagination';\nimport type { App, Component } from 'vue';\nimport * as components from './components/entities';\nimport {\n installHTTPClient, \n installHTTPClientAuthenticationHook,\n installSocketManager,\n installStore,\n installTranslator,\n} from './core';\nimport type { Options } from './types';\n\nexport function installComponents(app: App, input?: boolean | string[]) {\n if (typeof input === 'undefined' || input === false) {\n return;\n }\n\n if (typeof input === 'boolean') {\n Object.entries(components)\n .forEach(([componentName, component]) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n app.component(componentName, component as Component);\n });\n\n return;\n }\n\n Object.entries(components)\n .forEach(([componentName, component]) => {\n if (input.includes(componentName)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n app.component(componentName, component as Component);\n }\n });\n}\n\nexport function install(app: App, options: Options): void {\n if (options.realtime) {\n installSocketManager(app, {\n pinia: options.pinia,\n baseURL: options.realtimeURL || options.baseURL,\n });\n }\n\n installStore(app, {\n pinia: options.pinia,\n baseURL: options.baseURL,\n cookieSet: options.cookieSet,\n cookieGet: options.cookieGet,\n cookieUnset: options.cookieUnset,\n });\n\n installHTTPClientAuthenticationHook(app, {\n pinia: options.pinia,\n baseURL: options.baseURL,\n isServer: options.isServer,\n });\n\n installHTTPClient(app, {\n pinia: options.pinia,\n baseURL: options.baseURL,\n isServer: options.isServer,\n });\n\n installTranslator(app, { locale: options.translatorLocale });\n\n installComponents(app, options.components);\n\n installStoreManager(app);\n\n app.use(installFormControl);\n app.use(installPagination);\n}\n","<script lang=\"ts\">\nimport { base64URLEncode } from '@authup/kit';\nimport type { PropType, Ref } from 'vue';\nimport {\n\n computed,\n defineComponent,\n nextTick,\n reactive,\n ref,\n} from 'vue';\nimport type { IdentityProvider, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { IdentityProviderProtocol } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { BuildInput } from 'rapiq';\nimport { injectHTTPClient, injectStore } from '../../core';\nimport { AIdentityProviderIcon, AIdentityProviders, ARealmPicker } from '../entities';\nimport { APagination, ATitle } from '../utility';\n\nexport default defineComponent({\n\n components: {\n\n ARealmPicker,\n APagination,\n ATitle,\n IVuelidate,\n AIdentityProviders,\n AIdentityProviderIcon,\n\n },\n props: { codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> } },\n emits: ['done', 'failed'],\n setup(props, { emit }) {\n const apiClient = injectHTTPClient();\n const store = injectStore();\n\n const form = reactive({\n name: '',\n password: '',\n realm_id: '',\n\n });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n password: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n realm_id: {},\n\n }, form);\n\n const busy = ref(false);\n\n const realmId = computed(() => {\n if (props.codeRequest && props.codeRequest.realm_id) {\n return props.codeRequest.realm_id;\n }\n\n return form.realm_id;\n });\n\n const identityProviderQuery : Ref<BuildInput<IdentityProvider>> = ref({});\n const resetIdentityProviderQuery = () => {\n identityProviderQuery.value = {\n filters: {\n realm_id: realmId.value || '',\n protocol: `!${IdentityProviderProtocol.LDAP}`,\n enabled: true,\n\n },\n };\n };\n\n resetIdentityProviderQuery();\n\n \n const identityProviderRef = ref<null | {\n load:() => Promise<void>,\n [key: string]: unknown\n }>(null);\n const updateIdentityProviderList = () => {\n if (identityProviderRef.value) {\n identityProviderRef.value.load();\n }\n };\n\n const updateRealmId = (realmId: string | string[]) => {\n form.realm_id = Array.isArray(realmId) ? realmId[0] ?? '' : realmId;\n\n resetIdentityProviderQuery();\n\n nextTick(() => {\n updateIdentityProviderList();\n });\n };\n\n const submit = async () => {\n try {\n await store.login({\n name: form.name,\n password: form.password,\n realmId: form.realm_id,\n\n });\n\n emit('done');\n } catch (e: unknown) {\n emit('failed', e instanceof Error ? e.message : 'The login operation failed');\n }\n };\n\n const buildIdentityProviderURL = (id: string) => {\n let authorizeURL = apiClient.identityProvider.getAuthorizeUri(\n id,\n\n );\n\n if (props.codeRequest) {\n const serialized = base64URLEncode(JSON.stringify(props.codeRequest));\n authorizeURL += `?codeRequest=${serialized}`;\n }\n\n return authorizeURL;\n };\n\n return {\n\n updateRealmId,\n\n vuelidate,\n form,\n submit,\n busy,\n\n identityProviderQuery,\n identityProviderRef,\n buildIdentityProviderURL,\n\n };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <h1 class=\"fw-bold\">\n Login\n </h1>\n </div>\n <form @submit.prevent=\"submit\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.password\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Password\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.password.$model\"\n type=\"password\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <VCFormSubmit\n v-model=\"busy\"\n :invalid=\"vuelidate.$invalid\"\n :create-text=\"'Submit'\"\n :create-button-class=\"{value: 'btn btn-sm btn-dark btn-block', presets: { bootstrap: false }}\"\n :create-icon-class=\"'fa-solid fa-right-to-bracket'\"\n :submit=\"submit\"\n />\n\n <hr>\n\n <template v-if=\"!codeRequest || !codeRequest.realm_id\">\n <ARealmPicker\n :value=\"form.realm_id\"\n @change=\"updateRealmId\"\n />\n </template>\n\n <AIdentityProviders\n ref=\"identityProviderRef\"\n :query=\"identityProviderQuery\"\n :footer=\"false\"\n >\n <template #header>\n <ATitle :text=\"'Identity Providers'\" />\n </template>\n <template #footer=\"props\">\n <APagination\n :busy=\"props.busy\"\n :meta=\"props.meta\"\n :load=\"(data?: any) => props.load?.(data)\"\n :total=\"props.total\"\n />\n </template>\n <template #body=\"props\">\n <div class=\"d-flex flex-row\">\n <div\n v-for=\"(item, key) in props.data\"\n :key=\"key\"\n >\n <a\n :href=\"buildIdentityProviderURL(item.id)\"\n class=\"btn btn-dark btn-xs p-2 me-1 identity-provider-box bg-dark\"\n >\n <div class=\"d-flex flex-column\">\n <div class=\"text-center mb-1\">\n <AIdentityProviderIcon\n class=\"fa-2x\"\n :entity=\"item\"\n />\n </div>\n <div>\n {{ item.name }}\n </div>\n </div>\n </a>\n </div>\n </div>\n </template>\n </AIdentityProviders>\n </form>\n </div>\n</template>\n<style scoped>\n.identity-provider-box {\n min-width: 150px;\n}\n</style>\n","<script lang=\"ts\">\nimport { base64URLEncode } from '@authup/kit';\nimport type { PropType, Ref } from 'vue';\nimport {\n\n computed,\n defineComponent,\n nextTick,\n reactive,\n ref,\n} from 'vue';\nimport type { IdentityProvider, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { IdentityProviderProtocol } from '@authup/core-kit';\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport useVuelidate from '@vuelidate/core';\nimport { maxLength, minLength, required } from '@vuelidate/validators';\nimport type { BuildInput } from 'rapiq';\nimport { injectHTTPClient, injectStore } from '../../core';\nimport { AIdentityProviderIcon, AIdentityProviders, ARealmPicker } from '../entities';\nimport { APagination, ATitle } from '../utility';\n\nexport default defineComponent({\n\n components: {\n\n ARealmPicker,\n APagination,\n ATitle,\n IVuelidate,\n AIdentityProviders,\n AIdentityProviderIcon,\n\n },\n props: { codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> } },\n emits: ['done', 'failed'],\n setup(props, { emit }) {\n const apiClient = injectHTTPClient();\n const store = injectStore();\n\n const form = reactive({\n name: '',\n password: '',\n realm_id: '',\n\n });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n password: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n\n },\n realm_id: {},\n\n }, form);\n\n const busy = ref(false);\n\n const realmId = computed(() => {\n if (props.codeRequest && props.codeRequest.realm_id) {\n return props.codeRequest.realm_id;\n }\n\n return form.realm_id;\n });\n\n const identityProviderQuery : Ref<BuildInput<IdentityProvider>> = ref({});\n const resetIdentityProviderQuery = () => {\n identityProviderQuery.value = {\n filters: {\n realm_id: realmId.value || '',\n protocol: `!${IdentityProviderProtocol.LDAP}`,\n enabled: true,\n\n },\n };\n };\n\n resetIdentityProviderQuery();\n\n \n const identityProviderRef = ref<null | {\n load:() => Promise<void>,\n [key: string]: unknown\n }>(null);\n const updateIdentityProviderList = () => {\n if (identityProviderRef.value) {\n identityProviderRef.value.load();\n }\n };\n\n const updateRealmId = (realmId: string | string[]) => {\n form.realm_id = Array.isArray(realmId) ? realmId[0] ?? '' : realmId;\n\n resetIdentityProviderQuery();\n\n nextTick(() => {\n updateIdentityProviderList();\n });\n };\n\n const submit = async () => {\n try {\n await store.login({\n name: form.name,\n password: form.password,\n realmId: form.realm_id,\n\n });\n\n emit('done');\n } catch (e: unknown) {\n emit('failed', e instanceof Error ? e.message : 'The login operation failed');\n }\n };\n\n const buildIdentityProviderURL = (id: string) => {\n let authorizeURL = apiClient.identityProvider.getAuthorizeUri(\n id,\n\n );\n\n if (props.codeRequest) {\n const serialized = base64URLEncode(JSON.stringify(props.codeRequest));\n authorizeURL += `?codeRequest=${serialized}`;\n }\n\n return authorizeURL;\n };\n\n return {\n\n updateRealmId,\n\n vuelidate,\n form,\n submit,\n busy,\n\n identityProviderQuery,\n identityProviderRef,\n buildIdentityProviderURL,\n\n };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <h1 class=\"fw-bold\">\n Login\n </h1>\n </div>\n <form @submit.prevent=\"submit\">\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Name\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <IVuelidate :validation=\"vuelidate.password\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <template #label>\n Password\n </template>\n <template #default>\n <VCFormInput\n v-model=\"vuelidate.password.$model\"\n type=\"password\"\n />\n </template>\n </VCFormGroup>\n </template>\n </IVuelidate>\n\n <VCFormSubmit\n v-model=\"busy\"\n :invalid=\"vuelidate.$invalid\"\n :create-text=\"'Submit'\"\n :create-button-class=\"{value: 'btn btn-sm btn-dark btn-block', presets: { bootstrap: false }}\"\n :create-icon-class=\"'fa-solid fa-right-to-bracket'\"\n :submit=\"submit\"\n />\n\n <hr>\n\n <template v-if=\"!codeRequest || !codeRequest.realm_id\">\n <ARealmPicker\n :value=\"form.realm_id\"\n @change=\"updateRealmId\"\n />\n </template>\n\n <AIdentityProviders\n ref=\"identityProviderRef\"\n :query=\"identityProviderQuery\"\n :footer=\"false\"\n >\n <template #header>\n <ATitle :text=\"'Identity Providers'\" />\n </template>\n <template #footer=\"props\">\n <APagination\n :busy=\"props.busy\"\n :meta=\"props.meta\"\n :load=\"(data?: any) => props.load?.(data)\"\n :total=\"props.total\"\n />\n </template>\n <template #body=\"props\">\n <div class=\"d-flex flex-row\">\n <div\n v-for=\"(item, key) in props.data\"\n :key=\"key\"\n >\n <a\n :href=\"buildIdentityProviderURL(item.id)\"\n class=\"btn btn-dark btn-xs p-2 me-1 identity-provider-box bg-dark\"\n >\n <div class=\"d-flex flex-column\">\n <div class=\"text-center mb-1\">\n <AIdentityProviderIcon\n class=\"fa-2x\"\n :entity=\"item\"\n />\n </div>\n <div>\n {{ item.name }}\n </div>\n </div>\n </a>\n </div>\n </div>\n </template>\n </AIdentityProviders>\n </form>\n </div>\n</template>\n<style scoped>\n.identity-provider-box {\n min-width: 150px;\n}\n</style>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n entity: {\n type: Object as PropType<Scope>,\n required: true,\n },\n requested: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n },\n setup(props) {\n const isEnabled = computed(() => props.requested.includes(props.entity.name));\n\n return { isEnabled };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <i\n class=\"fa-solid\"\n :class=\"{\n 'fa-check text-success': isEnabled,\n 'fa-times text-danger': !isEnabled\n }\"\n />\n </div>\n <div>\n <strong>{{ entity.name }}</strong>\n\n <template v-if=\"entity.description\">\n <p>{{ entity.description }}</p>\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n entity: {\n type: Object as PropType<Scope>,\n required: true,\n },\n requested: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n },\n setup(props) {\n const isEnabled = computed(() => props.requested.includes(props.entity.name));\n\n return { isEnabled };\n },\n});\n</script>\n<template>\n <div>\n <div class=\"text-center\">\n <i\n class=\"fa-solid\"\n :class=\"{\n 'fa-check text-success': isEnabled,\n 'fa-times text-danger': !isEnabled\n }\"\n />\n </div>\n <div>\n <strong>{{ entity.name }}</strong>\n\n <template v-if=\"entity.description\">\n <p>{{ entity.description }}</p>\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, Scope } from '@authup/core-kit';\nimport { deserializeOAuth2Scope } from '@authup/specs';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScope from './AuthorizeScope.vue';\n\nexport default defineComponent({\n components: { AuthorizeScope },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopesAvailable: { type: Array as PropType<Scope[]> },\n scopesRequested: { type: [String, Array] as PropType<string[] | string> },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const scopesRequestedNormalized = computed<string[]>(() => {\n if (!props.scopesRequested) {\n return [];\n }\n\n return Array.isArray(props.scopesRequested) ?\n props.scopesRequested :\n deserializeOAuth2Scope(props.scopesRequested);\n });\n\n const scopesAvailableNormalized = ref<Scope[]>([]);\n\n const resolveScopesAvailable = async () => {\n if (props.scopesAvailable) {\n scopesAvailableNormalized.value = props.scopesAvailable;\n return;\n }\n\n if (props.client.id) {\n const { data: clientScopes } = await httpClient.clientScope.getMany({\n filters: { client_id: props.client.id },\n include: ['scope'],\n });\n\n scopesAvailableNormalized.value = clientScopes.map((clientScope) => clientScope.scope);\n }\n };\n\n Promise.resolve()\n .then(() => resolveScopesAvailable());\n\n return {\n scopesRequestedNormalized,\n scopesAvailableNormalized,\n };\n },\n});\n</script>\n<template>\n <div v-if=\"scopesAvailableNormalized.length > 0\">\n <div>\n This will allow the <strong>{{ client.name }}</strong> application to\n </div>\n <div class=\"flex-column\">\n <template\n v-for=\"item in scopesAvailableNormalized\"\n :key=\"item.id\"\n >\n <AuthorizeScope\n :entity=\"item\"\n class=\"d-flex flex-row gap-1\"\n :requested=\"scopesRequestedNormalized\"\n />\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, Scope } from '@authup/core-kit';\nimport { deserializeOAuth2Scope } from '@authup/specs';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, ref } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScope from './AuthorizeScope.vue';\n\nexport default defineComponent({\n components: { AuthorizeScope },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopesAvailable: { type: Array as PropType<Scope[]> },\n scopesRequested: { type: [String, Array] as PropType<string[] | string> },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const scopesRequestedNormalized = computed<string[]>(() => {\n if (!props.scopesRequested) {\n return [];\n }\n\n return Array.isArray(props.scopesRequested) ?\n props.scopesRequested :\n deserializeOAuth2Scope(props.scopesRequested);\n });\n\n const scopesAvailableNormalized = ref<Scope[]>([]);\n\n const resolveScopesAvailable = async () => {\n if (props.scopesAvailable) {\n scopesAvailableNormalized.value = props.scopesAvailable;\n return;\n }\n\n if (props.client.id) {\n const { data: clientScopes } = await httpClient.clientScope.getMany({\n filters: { client_id: props.client.id },\n include: ['scope'],\n });\n\n scopesAvailableNormalized.value = clientScopes.map((clientScope) => clientScope.scope);\n }\n };\n\n Promise.resolve()\n .then(() => resolveScopesAvailable());\n\n return {\n scopesRequestedNormalized,\n scopesAvailableNormalized,\n };\n },\n});\n</script>\n<template>\n <div v-if=\"scopesAvailableNormalized.length > 0\">\n <div>\n This will allow the <strong>{{ client.name }}</strong> application to\n </div>\n <div class=\"flex-column\">\n <template\n v-for=\"item in scopesAvailableNormalized\"\n :key=\"item.id\"\n >\n <AuthorizeScope\n :entity=\"item\"\n class=\"d-flex flex-row gap-1\"\n :requested=\"scopesRequestedNormalized\"\n />\n </template>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\n/* global window */\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScopes from './AuthorizeScopes.vue';\n\nexport default defineComponent({\n components: { AuthorizeScopes },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopes: { type: Array as PropType<Scope[]> },\n codeRequest: {\n type: Object as PropType<OAuth2AuthorizationCodeRequest>,\n required: true,\n },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const abort = () => {\n const url = new URL(`${props.codeRequest.redirect_uri}`);\n url.searchParams.set('error', 'access_denied');\n url.searchParams.set(\n 'error_description',\n 'The resource owner or authorization server denied the request',\n );\n\n if (props.codeRequest.state) {\n url.searchParams.set('state', props.codeRequest.state);\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = url.href;\n }\n };\n\n const authorize = async () => {\n try {\n const response = await httpClient\n .authorize\n .confirm({\n response_type: props.codeRequest.response_type,\n client_id: props.client.id,\n redirect_uri: props.codeRequest.redirect_uri,\n ...(props.codeRequest.state ? { state: props.codeRequest.state } : {}),\n ...(props.codeRequest.scope ? { scope: props.codeRequest.scope } : {}),\n });\n\n const { url } = response;\n\n if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n } catch {\n // todo: show toast :)\n\n }\n };\n\n return {\n authorize,\n abort,\n };\n },\n});\n</script>\n<template>\n <div class=\"flex-column d-flex gap-2\">\n <div class=\"text-center\">\n <h5 class=\"text-secondary mb-1\">\n Application\n </h5>\n <h1 class=\"fw-bold\">\n {{ client.name }}\n </h1>\n </div>\n\n <AuthorizeScopes\n :client=\"client\"\n :scopes-requested=\"codeRequest.scope\"\n :scopes-available=\"scopes\"\n />\n\n <div class=\"mt-auto\">\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa-solid fa-link\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Once authorized, you will be redirected to: <strong>{{ codeRequest.redirect_uri }}</strong>\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-lock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n This application is governed by the\n <strong>\n {{ client.name }}\n </strong>\n application's Privacy Policy and Terms of Service.\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-clock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Active since {{ client.created_at }}\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-secondary\"\n @click.prevent=\"abort\"\n >\n Abort\n </button>\n </div>\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-primary\"\n @click.prevent=\"authorize\"\n >\n Authorize\n </button>\n </div>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\n/* global window */\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { injectHTTPClient } from '../../../core';\nimport AuthorizeScopes from './AuthorizeScopes.vue';\n\nexport default defineComponent({\n components: { AuthorizeScopes },\n props: {\n client: {\n type: Object as PropType<Client>,\n required: true,\n },\n scopes: { type: Array as PropType<Scope[]> },\n codeRequest: {\n type: Object as PropType<OAuth2AuthorizationCodeRequest>,\n required: true,\n },\n },\n setup(props) {\n const httpClient = injectHTTPClient();\n\n const abort = () => {\n const url = new URL(`${props.codeRequest.redirect_uri}`);\n url.searchParams.set('error', 'access_denied');\n url.searchParams.set(\n 'error_description',\n 'The resource owner or authorization server denied the request',\n );\n\n if (props.codeRequest.state) {\n url.searchParams.set('state', props.codeRequest.state);\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = url.href;\n }\n };\n\n const authorize = async () => {\n try {\n const response = await httpClient\n .authorize\n .confirm({\n response_type: props.codeRequest.response_type,\n client_id: props.client.id,\n redirect_uri: props.codeRequest.redirect_uri,\n ...(props.codeRequest.state ? { state: props.codeRequest.state } : {}),\n ...(props.codeRequest.scope ? { scope: props.codeRequest.scope } : {}),\n });\n\n const { url } = response;\n\n if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n } catch {\n // todo: show toast :)\n\n }\n };\n\n return {\n authorize,\n abort,\n };\n },\n});\n</script>\n<template>\n <div class=\"flex-column d-flex gap-2\">\n <div class=\"text-center\">\n <h5 class=\"text-secondary mb-1\">\n Application\n </h5>\n <h1 class=\"fw-bold\">\n {{ client.name }}\n </h1>\n </div>\n\n <AuthorizeScopes\n :client=\"client\"\n :scopes-requested=\"codeRequest.scope\"\n :scopes-available=\"scopes\"\n />\n\n <div class=\"mt-auto\">\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa-solid fa-link\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Once authorized, you will be redirected to: <strong>{{ codeRequest.redirect_uri }}</strong>\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-lock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n This application is governed by the\n <strong>\n {{ client.name }}\n </strong>\n application's Privacy Policy and Terms of Service.\n </small>\n </div>\n </div>\n <div class=\"d-flex flex-row\">\n <div>\n <i class=\"fa fa-solid fa-clock\" />\n </div>\n <div class=\"ms-1\">\n <small>\n Active since {{ client.created_at }}\n </small>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-secondary\"\n @click.prevent=\"abort\"\n >\n Abort\n </button>\n </div>\n <div class=\"col-6\">\n <button\n type=\"button\"\n class=\"btn btn-block btn-primary\"\n @click.prevent=\"authorize\"\n >\n Authorize\n </button>\n </div>\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n isError: { type: Boolean },\n message: {\n type: String,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div class=\"flex-column\">\n <div class=\"text-center\">\n <i\n class=\"fa-solid fa-10x\"\n :class=\"{\n 'fa-exclamation text-danger': isError,\n 'fa-info text-info': !isError,\n }\"\n />\n </div>\n <div class=\"text-center fs-6 p-3\">\n {{ message }}\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n props: {\n isError: { type: Boolean },\n message: {\n type: String,\n required: true,\n },\n },\n});\n</script>\n<template>\n <div class=\"flex-column\">\n <div class=\"text-center\">\n <i\n class=\"fa-solid fa-10x\"\n :class=\"{\n 'fa-exclamation text-danger': isError,\n 'fa-info text-info': !isError,\n }\"\n />\n </div>\n <div class=\"text-center fs-6 p-3\">\n {{ message }}\n </div>\n </div>\n</template>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { storeToRefs } from 'pinia';\nimport type { PropType, VNodeChild } from 'vue';\nimport {\n Suspense, \n defineComponent, \n h, \n ref,\n} from 'vue';\nimport { injectHTTPClient, injectStore } from '../../../core';\nimport Login from '../Login.vue';\nimport AuthorizeForm from './AuthorizeForm.vue';\nimport AuthorizeText from './AuthorizeText.vue';\n\nconst wrapChild = (child: VNodeChild) => h(\n 'div',\n { class: 'd-flex align-items-center justify-content-center h-100' },\n [\n h(\n 'div',\n { class: 'authorize' },\n [\n child,\n ],\n ),\n ],\n);\n\nexport default defineComponent({\n components: {\n AuthorizeText,\n AuthorizeForm,\n Login,\n },\n props: {\n codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> },\n client: { type: Object as PropType<Client> },\n clientId: { type: String },\n scopes: { type: Array as PropType<Scope[]> },\n error: { type: Object as PropType<Error> },\n },\n emits: ['redirect'],\n setup(props) {\n const httpClient = injectHTTPClient();\n const store = injectStore();\n const { loggedIn } = storeToRefs(store);\n\n const error = ref<Error | null>(null);\n const client = ref<Client | null>(null);\n\n const resolve = async () => {\n if (props.error) {\n error.value = props.error;\n return;\n }\n\n if (props.client) {\n client.value = props.client;\n }\n\n if (props.clientId) {\n try {\n client.value = await httpClient.client.getOne(props.clientId);\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n };\n\n Promise.resolve()\n .then(() => resolve());\n\n return () => {\n if (error.value) {\n return wrapChild(h(AuthorizeText, {\n message: error.value.message,\n isError: true,\n }));\n }\n\n if (!props.codeRequest) {\n return [];\n }\n\n if (!loggedIn.value) {\n return wrapChild(h(Suspense, {}, {\n default: () => h(Login, { codeRequest: props.codeRequest }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n }\n\n if (!client.value) {\n return [];\n }\n\n return wrapChild(h(Suspense, {}, {\n default: () => h(AuthorizeForm, {\n codeRequest: props.codeRequest!,\n client: client.value!,\n scopes: props.scopes,\n }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n };\n },\n});\n</script>\n<style>\n.authorize {\n padding: 1rem;\n background: #E8E8E8;\n min-width: 480px;\n max-width: 100%;\n min-height: 300px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n position: relative;\n border-radius: 5px;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.24);\n}\n</style>\n","<!--\n - Copyright (c) 2025.\n - Author Peter Placzek (tada5hi)\n - For the full copyright and license information,\n - view the LICENSE file that was distributed with this source code.\n -->\n<script lang=\"ts\">\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { storeToRefs } from 'pinia';\nimport type { PropType, VNodeChild } from 'vue';\nimport {\n Suspense, \n defineComponent, \n h, \n ref,\n} from 'vue';\nimport { injectHTTPClient, injectStore } from '../../../core';\nimport Login from '../Login.vue';\nimport AuthorizeForm from './AuthorizeForm.vue';\nimport AuthorizeText from './AuthorizeText.vue';\n\nconst wrapChild = (child: VNodeChild) => h(\n 'div',\n { class: 'd-flex align-items-center justify-content-center h-100' },\n [\n h(\n 'div',\n { class: 'authorize' },\n [\n child,\n ],\n ),\n ],\n);\n\nexport default defineComponent({\n components: {\n AuthorizeText,\n AuthorizeForm,\n Login,\n },\n props: {\n codeRequest: { type: Object as PropType<OAuth2AuthorizationCodeRequest> },\n client: { type: Object as PropType<Client> },\n clientId: { type: String },\n scopes: { type: Array as PropType<Scope[]> },\n error: { type: Object as PropType<Error> },\n },\n emits: ['redirect'],\n setup(props) {\n const httpClient = injectHTTPClient();\n const store = injectStore();\n const { loggedIn } = storeToRefs(store);\n\n const error = ref<Error | null>(null);\n const client = ref<Client | null>(null);\n\n const resolve = async () => {\n if (props.error) {\n error.value = props.error;\n return;\n }\n\n if (props.client) {\n client.value = props.client;\n }\n\n if (props.clientId) {\n try {\n client.value = await httpClient.client.getOne(props.clientId);\n } catch (e) {\n if (e instanceof Error) {\n error.value = e;\n }\n }\n }\n };\n\n Promise.resolve()\n .then(() => resolve());\n\n return () => {\n if (error.value) {\n return wrapChild(h(AuthorizeText, {\n message: error.value.message,\n isError: true,\n }));\n }\n\n if (!props.codeRequest) {\n return [];\n }\n\n if (!loggedIn.value) {\n return wrapChild(h(Suspense, {}, {\n default: () => h(Login, { codeRequest: props.codeRequest }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n }\n\n if (!client.value) {\n return [];\n }\n\n return wrapChild(h(Suspense, {}, {\n default: () => h(AuthorizeForm, {\n codeRequest: props.codeRequest!,\n client: client.value!,\n scopes: props.scopes,\n }),\n fallback: () => h(AuthorizeText, { message: 'Loading...' }),\n }));\n };\n },\n});\n</script>\n<style>\n.authorize {\n padding: 1rem;\n background: #E8E8E8;\n min-width: 480px;\n max-width: 100%;\n min-height: 300px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n position: relative;\n border-radius: 5px;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.24);\n}\n</style>\n","import type { Plugin } from 'vue';\nimport { install } from './module';\nimport type { Options } from './types';\n\nexport * from './components';\nexport * from './composables';\nexport * from './core';\nexport * from './types';\n\nexport { install };\n\nexport default { install } satisfies Plugin<Options | undefined>;\n"],"x_google_ignoreList":[7],"mappings":"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"}
|