@anzusystems/common-admin 1.47.0-beta.90 → 1.47.0-beta.92

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib-DPp4Rq_S.js","sources":["../src/components/ABooleanValue.vue","../src/components/ACard.vue","../src/utils/common.ts","../src/utils/string.ts","../src/components/injectionKeys.ts","../src/components/AAnzuUserAvatar.vue","../src/components/collab/components/ACollabLockedByUser.vue","../src/components/collab/composables/collabEventBus.ts","../src/components/collab/types/Collab.ts","../src/components/collab/composables/commonAdminCollabOptions.ts","../src/components/collab/composables/collabState.ts","../src/components/collab/composables/collabCurrentUserId.ts","../src/components/collab/composables/collabField.ts","../src/components/form/AFormTextField.vue","../src/components/form/AFormTextarea.vue","../src/components/form/ASystemEntityScope.vue","../src/components/ADatatablePagination.vue","../src/components/ADatatableConfigButton.vue","../src/components/ADatatableOrdering.vue","../src/components/ADialogToolbar.vue","../src/components/ALogData.vue","../node_modules/@kyvg/vue3-notification/dist/index.es.js","../src/plugins/i18n.ts","../src/model/error/AnzuFatalError.ts","../src/composables/statusCodes.ts","../src/model/error/AnzuApiForbiddenError.ts","../src/model/error/AnzuApiValidationError.ts","../src/model/error/AnzuApiResponseCodeError.ts","../src/model/error/AnzuApiForbiddenOperationError.ts","../src/composables/system/alerts.ts","../src/components/ACreateDialog.vue","../src/components/AAdminSwitcher.vue","../node_modules/dayjs/dayjs.min.js","../node_modules/dayjs/plugin/utc.js","../node_modules/dayjs/plugin/customParseFormat.js","../src/utils/datetime.ts","../src/components/ATimeTrackingFields.vue","../src/composables/filter/filterHelpers.ts","../src/components/filter/AFilterString.vue","../src/components/filter/AFilterMixed.vue","../src/components/filter/AFilterInteger.vue","../src/utils/event.ts","../src/components/buttons/filter/AFilterAdvancedButton.vue","../src/components/buttons/filter/AFilterSubmitButton.vue","../src/components/buttons/filter/AFilterResetButton.vue","../src/components/filter/AFilterWrapper.vue","../src/model/valueObject/Grant.ts","../src/components/permission/APermissionGrantEditor.vue","../src/model/valueObject/GrantOrigin.ts","../src/components/permission/APermissionValueChip.vue","../src/composables/auth/authStore.ts","../src/utils/object.ts","../src/types/OwnerAware.ts","../src/types/CreatedByAware.ts","../src/services/api/apiHelper.ts","../src/utils/response.ts","../src/services/api/apiFetchOne.ts","../src/composables/auth/defineAuth.ts","../src/components/permission/Acl.vue","../src/components/datetime/ADatetime.vue","../src/validators/vuelidate/common/useValidateBetween.ts","../src/validators/vuelidate/common/useValidateEmail.ts","../src/validators/vuelidate/common/useValidateMaxLength.ts","../src/validators/vuelidate/common/useValidateMaxValue.ts","../src/validators/vuelidate/common/useValidateMinLength.ts","../src/validators/vuelidate/common/useValidateMinValue.ts","../src/validators/vuelidate/common/useValidateNumeric.ts","../src/validators/vuelidate/common/useValidateRequired.ts","../src/validators/vuelidate/common/useValidateRequiredIf.ts","../src/validators/vuelidate/common/useValidateSlug.ts","../src/validators/vuelidate/common/useValidateStringArrayItemLength.ts","../src/validators/vuelidate/common/useValidateUrl.ts","../src/validators/vuelidate/useValidate.ts","../src/components/datetime/TimePicker.vue","../src/components/datetime/ADatetimePicker.vue","../src/components/form/AFormDatetimePicker.vue","../src/components/form/AFormFlagDatetimePicker.vue","../src/components/filter/AFilterDatetimePicker.vue","../src/composables/system/pagination.ts","../src/components/form/AFormRemoteAutocomplete.vue","../src/components/form/AFormRemoteCheckbox.vue","../src/components/form/AFormSwitch.vue","../src/components/form/AFormRemoteSwitch.vue","../src/components/form/AFormValueObjectOptionsSelect.vue","../src/components/filter/AFilterValueObjectOptionsSelect.vue","../src/components/filter/AFilterRemoteAutocomplete.vue","../src/components/filter/AFilterBooleanGroup.vue","../src/components/filter/AFilterBooleanSelect.vue","../src/model/valueObject/JobStatus.ts","../src/components/job/AJobStatusChip.vue","../src/model/commonConfig.ts","../src/components/ACachedChip.vue","../src/model/valueObject/LogLevel.ts","../src/components/log/ALogLevelChip.vue","../src/utils/number.ts","../src/components/ACopyText.vue","../src/components/AChipNoLink.vue","../src/components/collab/components/ACollabCountdown.vue","../src/components/collab/composables/collabRoom.ts","../src/components/collab/components/ACollabManagement.vue","../src/components/AUserAndTimeTrackingFields.vue","../src/components/buttons/action/AActionCloseButton.vue","../src/components/buttons/action/AActionCreateButton.vue","../src/components/buttons/action/AActionDeleteButton.vue","../src/components/buttons/action/AActionEditButton.vue","../src/components/buttons/action/AActionSaveAndCloseButton.vue","../src/components/buttons/action/AActionSaveButton.vue","../src/components/buttons/table/ATableCopyIdButton.vue","../src/components/buttons/table/ATableDetailButton.vue","../src/components/buttons/table/ATableEditButton.vue","../src/components/buttons/ABtnSplit.vue","../src/composables/themeSettings.ts","../src/components/AThemeSelect.vue","../src/composables/languageSettings.ts","../src/components/flags/FlagEn.vue","../src/components/flags/FlagEmpty.vue","../src/components/flags/FlagCountry.vue","../src/components/ALanguageSelect.vue","../src/components/systemBar/ASystemBarNewVersion.vue","../src/model/error/AnzuNewVersionFetchError.ts","../src/components/systemBar/ASystemBar.vue","../src/components/AAvatarColorPicker.vue","../src/components/ACurrentUserDropdown.vue","../src/components/form/AFormRemoteAutocompleteWithCached.vue","../src/components/view/ALoginView.vue","../src/components/view/ALogoutView.vue","../src/components/view/AUnauthorizedView.vue","../src/components/view/ANotFoundView.vue","../src/components/job/composables/jobPriority.ts","../src/components/job/AJobPriorityChip.vue","../src/components/job/AJobDetailCommon.vue","../src/components/job/AJobBaseCreateForm.vue","../src/model/coreDam/filter/AssetFilter.ts","../src/types/coreDam/AssetSelect.ts","../src/types/coreDam/Asset.ts","../src/services/stores/coreDam/assetSelectStore.ts","../src/components/dam/assetSelect/composables/commonAdminCoreDamOptions.ts","../src/services/api/queryBuilder.ts","../src/types/ApiResponse.ts","../src/services/api/apiFetchList.ts","../src/components/damImage/uploadQueue/api/damAssetLicenceApi.ts","../src/components/damImage/uploadQueue/composables/damAssetCustomFormApi.ts","../src/components/damImage/uploadQueue/composables/damConfigApi.ts","../src/types/coreDam/DamConfig.ts","../src/components/damImage/uploadQueue/composables/damConfigStore.ts","../src/components/damImage/uploadQueue/composables/damConfigState.ts","../src/components/damImage/uploadQueue/api/damAssetApi.ts","../src/components/dam/assetSelect/composables/assetSelectListActions.ts","../src/components/dam/assetSelect/composables/assetSelectItemActions.ts","../src/assets/image/placeholder16x9.jpg","../src/components/dam/assetSelect/components/AssetImagePreview.vue","../src/utils/file.ts","../src/components/dam/assetSelect/components/AssetSelectTableRowItem.vue","../src/components/dam/assetSelect/components/AssetSelectListTable.vue","../src/components/dam/assetSelect/composables/assetSelectGridView.ts","../src/components/dam/assetSelect/composables/assetSelectFilterSidebar.ts","../src/components/dam/assetSelect/components/AssetSelectListBar.vue","../src/components/dam/assetSelect/components/AssetSelectTilesItem.vue","../src/components/dam/assetSelect/components/AssetSelectListTiles.vue","../src/services/api/apiFetchByIds.ts","../src/services/api/apiCreateOne.ts","../src/components/damImage/uploadQueue/api/keywordApi.ts","../src/components/damImage/uploadQueue/keyword/keywordActions.ts","../src/components/damImage/uploadQueue/keyword/KeywordFilter.ts","../src/components/damImage/uploadQueue/keyword/DamKeywordFilterRemoteAutocomplete.vue","../src/components/damImage/uploadQueue/api/authorApi.ts","../src/components/damImage/uploadQueue/author/authorActions.ts","../src/components/damImage/uploadQueue/author/AuthorFilter.ts","../src/components/damImage/uploadQueue/author/DamAuthorFilterRemoteAutocomplete.vue","../src/services/api/apiUpdateOne.ts","../src/components/dam/user/userApi.ts","../src/components/dam/user/damUserSelectActions.ts","../src/components/dam/user/DamUserFilter.ts","../src/components/dam/user/DamUserFilterRemoteAutocomplete.vue","../src/components/dam/assetSelect/components/filter/AssetSelectFilterFormImage.vue","../src/components/dam/assetSelect/components/filter/AssetSelectFilterFormDefault.vue","../src/components/dam/assetSelect/components/filter/AssetSelectFilter.vue","../src/components/damImage/composables/damFilterUserAllowedUploadConfigs.ts","../src/components/dam/assetSelect/AAssetSelect.vue","../node_modules/sortablejs/modular/sortable.esm.js","../node_modules/@vueuse/integrations/useSortable.mjs","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/v1.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/generator.ts","../src/components/sortable/sortableActions.ts","../src/components/sortable/sortableUtils.ts","../src/components/sortable/ASortable.vue","../src/components/sortable/sortableNestedActions.ts","../src/components/sortable/ASortableNestedItem.vue","../src/components/sortable/ASortableNested.vue","../src/components/subjectSelect/ASubjectSelect.vue","../src/components/customDataForm/useCustomDataForm.ts","../src/components/customDataForm/CustomDataFormElementTypes.ts","../src/components/ABooleanSelect.vue","../src/components/customDataForm/ACustomDataFormElement.vue","../src/components/customDataForm/ACustomDataForm.vue","../src/components/file/composables/dropzone.ts","../src/components/file/composables/fileType.ts","../src/components/file/composables/formatAndSizeCheck.ts","../src/components/file/AFileDropzone.vue","../src/components/damImage/composables/commonAdminImageOptions.ts","../src/components/damImage/composables/imageActions.ts","../src/components/damImage/uploadQueue/composables/acceptTypeAndSizeHelper.ts","../src/composables/system/defineCached.ts","../src/components/damImage/uploadQueue/composables/extSystemIdForCached.ts","../src/components/damImage/uploadQueue/author/cachedAuthors.ts","../src/types/coreDam/AssetFile.ts","../src/components/damImage/uploadQueue/composables/UploadQueueItemFactory.ts","../src/components/damImage/uploadQueue/composables/assetSuggestions.ts","../src/components/damImage/uploadQueue/composables/damNotificationsEventBus.ts","../src/components/damImage/uploadQueue/composables/damNotifications.ts","../src/components/damImage/uploadQueue/composables/mimeTypeHelper.ts","../src/types/coreDam/UploadQueue.ts","../src/components/damImage/uploadQueue/composables/damUploadChunkSize.ts","../src/components/damImage/uploadQueue/api/damImageApi.ts","../src/components/damImage/uploadQueue/api/uploadApi.ts","../node_modules/rusha/dist/rusha.js","../src/components/damImage/uploadQueue/composables/uploadService.ts","../src/components/damImage/uploadQueue/keyword/cachedKeywords.ts","../src/components/damImage/uploadQueue/composables/uploadQueuesStore.ts","../src/services/api/apiDeleteOne.ts","../src/components/damImage/uploadQueue/api/imageApi.ts","../src/components/damImage/AImageWidgetSimple.vue","../src/components/damImage/uploadQueue/composables/imageStore.ts","../src/components/damImage/uploadQueue/composables/uploadValidations.ts","../src/components/damImage/uploadQueue/components/ImageDetailDialogMetadata.vue","../src/components/damImage/uploadQueue/composables/assetDetailStore.ts","../src/components/damImage/uploadQueue/components/AssetDetailDialogLoader.vue","../src/composables/datetime/remainingTime.ts","../src/assets/dam-meta-icons/2k.svg","../src/assets/dam-meta-icons/4k.svg","../src/assets/dam-meta-icons/8k.svg","../src/assets/dam-meta-icons/qhd.svg","../src/assets/dam-meta-icons/fhd.svg","../src/assets/dam-meta-icons/slot.svg","../src/assets/dam-meta-icons/low.svg","../src/assets/dam-meta-icons/rss.svg","../src/components/damImage/uploadQueue/composables/assetImageIconsConfig.ts","../src/components/damImage/uploadQueue/components/AssetImageMetaIcons.vue","../src/components/damImage/uploadQueue/components/AssetImage.vue","../src/components/damImage/uploadQueue/composables/assetFileFailReason.ts","../src/components/damImage/uploadQueue/components/AssetFileFailReasonChip.vue","../src/components/damImage/uploadQueue/components/AssetInfobox.vue","../src/components/damImage/uploadQueue/composables/assetDetailSidebarActionbar.ts","../src/components/damImage/uploadQueue/components/AssetDetailSidebarActionsWrapper.vue","../src/components/damImage/uploadQueue/components/AssetCustomMetadataForm.vue","../src/components/dam/AColorBox.vue","../src/components/damImage/uploadQueue/components/AssetMetadataImageAttributes.vue","../src/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteCachedAuthorChip.vue","../src/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue","../src/components/damImage/uploadQueue/author/DamAuthorType.ts","../src/components/damImage/uploadQueue/author/authorValidation.ts","../src/components/damImage/uploadQueue/author/AuthorFactory.ts","../src/components/damImage/uploadQueue/author/AuthorCreateButton.vue","../src/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteWithCached.vue","../src/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteCachedKeywordChip.vue","../src/components/damImage/uploadQueue/keyword/KeywordFactory.ts","../src/components/damImage/uploadQueue/keyword/keywordValidation.ts","../src/components/damImage/uploadQueue/keyword/KeywordCreateButton.vue","../src/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteWithCached.vue","../src/components/damImage/uploadQueue/keyword/damKeywordConfig.ts","../src/components/damImage/uploadQueue/author/damAuthorConfig.ts","../src/components/damImage/uploadQueue/components/AssetMetadata.vue","../src/components/damImage/uploadQueue/components/AssetDetailSidebarMetadata.vue","../src/components/damImage/uploadQueue/composables/imageRoiStore.ts","../src/components/damImage/uploadQueue/components/AssetFileRotate.vue","../src/components/damImage/uploadQueue/api/damImageRoiApi.ts","../src/components/damImage/uploadQueue/components/AssetDetailSidebarROI.vue","../src/components/damImage/uploadQueue/components/AssetDetailSidebarActionsTeleportTarget.vue","../src/components/damImage/uploadQueue/components/AssetDetailDialogSidebar.vue","../src/components/damImage/uploadQueue/composables/cropperJsService.ts","../node_modules/cropperjs/dist/cropper.esm.js","../src/components/ACropperjs.vue","../src/components/damImage/uploadQueue/components/AssetImageRoiSelect.vue","../src/components/damImage/uploadQueue/components/AssetDetailDialog.vue","../src/components/damImage/uploadQueue/composables/uploadQueueDialog.ts","../src/components/damImage/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue","../src/components/damImage/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue","../src/components/damImage/uploadQueue/components/UploadQueueDialogSingleSidebar.vue","../src/components/damImage/uploadQueue/components/UploadQueueButtonStop.vue","../src/components/damImage/uploadQueue/components/UploadQueueDialogSingle.vue","../src/components/file/AFileInput.vue","../src/components/file/AFileInputDialog.vue","../src/components/damImage/composables/imageWidgetInkectionKeys.ts","../src/components/damImage/uploadQueue/components/ImageWidgetInner.vue","../src/components/damImage/AImageWidget.vue","../src/components/damImage/uploadQueue/components/ImageWidgetMultipleItem.vue","../src/components/damImage/uploadQueue/components/UploadQueueItemEditable.vue","../src/components/damImage/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue","../src/components/damImage/uploadQueue/composables/uploadQueueMassOperations.ts","../src/components/damImage/uploadQueue/components/AssetQueueSelectedSidebar.vue","../src/components/damImage/uploadQueue/components/UploadQueueEditable.vue","../src/components/damImage/uploadQueue/components/UploadQueueDialog.vue","../src/components/damImage/uploadQueue/components/ImageWidgetMultipleLimitDialog.vue","../src/components/damImage/uploadQueue/components/ImageWidgetMultipleInner.vue","../src/components/damImage/AImageWidgetMultiple.vue","../src/components/damImage/AImageWidgetMultipleSimple.vue","../src/components/damImage/AImagePublicInput.vue","../src/components/datatable/datatable.ts","../src/components/datatable/ADatatableColumn.vue","../src/components/datatable/ADatatable.vue","../src/composables/system/datatableColumns.ts","../src/components/subjectSelect/useSubjectSelect.ts","../src/components/subjectSelect/selectStrategies.ts","../src/utils/boolean.ts","../src/model/factory/AnzuUserFactory.ts","../src/model/factory/BaseUserFactory.ts","../src/model/factory/PermissionConfigFactory.ts","../src/model/factory/PermissionGroupFactory.ts","../src/services/api/apiAnyRequest.ts","../src/services/api/apiFetchListBatch.ts","../src/composables/system/error.ts","../src/services/api/job/jobApi.ts","../src/model/valueObject/JobBaseResource.ts","../src/AnzuSystemsCommonAdmin.ts","../src/utils/array.ts","../src/utils/history.ts","../src/locales/cs.ts","../src/locales/en.ts","../src/locales/sk.ts","../src/model/commonVuetifyConfig.ts","../src/types/utils.ts","../src/plugins/webfontloader.ts","../src/model/factory/JobFactory.ts","../src/composables/system/loginStatus.ts","../src/components/damImage/uploadQueue/api/damCurrentUserApi.ts","../src/components/collab/composables/collabInit.ts","../src/components/collab/composables/collabHelpers.ts","../src/components/collab/composables/collabAnyDataChange.ts","../src/components/dam/user/assetLicenceApi.ts","../src/components/dam/user/AssetLicenceFilter.ts","../src/components/dam/user/assetLicenceActions.ts","../src/components/dam/user/DamAssetLicenceRemoteAutocomplete.vue","../src/components/dam/user/assetLicenceGroupApi.ts","../src/components/dam/user/assetLicenceGroupActions.ts","../src/components/dam/user/AssetLicenceGroupFilter.ts","../src/components/dam/user/DamAssetLicenceGroupRemoteAutocomplete.vue","../src/components/dam/user/extSystemApi.ts","../src/components/dam/user/extSystemActions.ts","../src/components/dam/user/ExtSystemFilter.ts","../src/components/dam/user/DamExtSystemRemoteAutocomplete.vue","../src/components/dam/user/DamExternalProviderAssetType.ts","../src/components/dam/user/DamExternalProviderAssetSelect.vue","../src/components/dam/user/DamDistributionServiceType.ts","../src/components/dam/user/DamDistributionServiceSelect.vue","../src/composables/system/breadcrumbs.ts"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n value: number | string | boolean\n chip?: boolean\n invertColor?: boolean\n }>(),\n {\n chip: false,\n invertColor: false,\n }\n)\n\nconst { t } = useI18n()\n\nconst booleanValue = computed(() => {\n return props.value === true || props.value === 1 || props.value === 'true'\n})\n\nconst text = computed(() => {\n if (booleanValue.value) {\n return t('common.model.boolean.true')\n }\n return t('common.model.boolean.false')\n})\n\nconst color = computed(() => {\n if (props.invertColor) {\n return booleanValue.value ? 'error' : 'success'\n }\n return booleanValue.value ? 'success' : 'error'\n})\n</script>\n\n<template>\n <VChip\n v-if=\"chip\"\n :color=\"color\"\n label\n size=\"small\"\n >\n {{ text }}\n </VChip>\n <span v-else>{{ text }}</span>\n</template>\n","<script lang=\"ts\" setup>\nimport ACardLoader from '@/components/ACardLoader.vue'\nimport { computed } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n loading?: boolean\n title?: string\n }>(),\n {\n loading: undefined,\n title: undefined,\n }\n)\n\nconst loadingComputed = computed(() => {\n return props.loading ? 'primary' : false\n})\n</script>\n\n<template>\n <VCard\n :title=\"title\"\n variant=\"flat\"\n :loading=\"loadingComputed\"\n >\n <ACardLoader :loading=\"loading\" />\n <slot />\n </VCard>\n</template>\n","import type { DocId } from '@/types/common'\nimport { isProxy, isRef, toRaw, unref } from 'vue'\n\nexport const isUndefined = (value: unknown): value is undefined => {\n return typeof value === 'undefined'\n}\n\nexport const isDefined = <T>(value: T | undefined): value is T => {\n return !isUndefined(value)\n}\n\nexport const isNull = (value: unknown): value is null => {\n return value === null\n}\n\nexport const isNumber = (value: unknown): value is number => {\n return typeof value === 'number'\n}\n\nexport const isString = (value: unknown): value is string => {\n return typeof value === 'string'\n}\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nexport const isArray = <T = unknown>(value: unknown): value is Array<T> => {\n return Array.isArray(value)\n}\n\nexport const isFunction = <T extends (...args: any[]) => any>(value: unknown): value is T => {\n return typeof value === 'function'\n}\n\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === 'boolean'\n}\n\nexport const isDocId = (value: unknown): value is DocId => {\n return isString(value) && /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(value)\n}\n\nexport const isInt = (value: any): value is number => {\n const x = parseFloat(value)\n\n return !isNaN(value) && (x | 0) === x\n}\n\nexport const isObject = (value: unknown): value is object => {\n return typeof value === 'object' && !isArray(value) && !isNull(value)\n}\n\nexport const isEmptyObject = <T>(value: T): value is T => {\n if (isObject(value)) {\n return Object.keys(value).length === 0\n }\n return false\n}\n\nexport const isEmptyArray = (value: unknown): value is [] => {\n return isArray(value) && value.length === 0\n}\n\nexport const isEmpty = (value: unknown): boolean => {\n return (\n isNull(value) || isUndefined(value) || value === '' || value === 0 || isEmptyArray(value) || isEmptyObject(value)\n )\n}\n/**\n * Use only for objects with some primitives like:\n * number, string, boolean, null. Not supported: function, undefined, symbol, ...\n */\nexport const cloneDeep = <T>(object: T) => {\n if (typeof structuredClone === 'function') {\n try {\n if (isProxy(object)) {\n return structuredClone(toRaw(object)) as T\n }\n if (isRef(object)) {\n return structuredClone(unref(object)) as T\n }\n return structuredClone(object) as T\n } catch (error) {\n return JSON.parse(JSON.stringify(object)) as T\n }\n }\n return JSON.parse(JSON.stringify(object)) as T\n}\n","import type { UrlParams } from '@/services/api/apiHelper'\nimport { isNull, isUndefined } from '@/utils/common'\n\nexport const stringToInt = (value: any, fallbackValue = 0): number => {\n let check = fallbackValue\n try {\n check = Number.parseInt(value, 10)\n } catch {\n return fallbackValue\n }\n\n if (Number.isNaN(check)) {\n return fallbackValue\n }\n\n return check\n}\n\nexport const stringToFloat = (value: any, fallbackValue = 0): number => {\n let check = fallbackValue\n try {\n check = Number.parseFloat(value)\n } catch {\n return fallbackValue\n }\n\n if (Number.isNaN(check)) {\n return fallbackValue\n }\n\n return check\n}\n\nexport const stringSplitOnFirstOccurrence = (value: string, delimiter = '') => {\n const index = value.indexOf(delimiter)\n\n return {\n start: value.slice(0, index),\n end: value.slice(index + delimiter.length),\n }\n}\n\nexport const stringToSlug = (value: string) => {\n return value\n .toString()\n .toLowerCase()\n .trim()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/&/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '')\n}\n\ntype Kebab<T extends string, A extends string = ''> = T extends `${infer F}${infer R}`\n ? Kebab<R, `${A}${F extends Lowercase<F> ? '' : '-'}${Lowercase<F>}`>\n : A\n\nexport const stringToKebabCase = <T extends string>(value: T): Kebab<T> =>\n value.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase() as Kebab<T>\n\nexport const stringTrimLength = (value: string, maxLength = 80): string => {\n if (value.length > maxLength) {\n return value.substring(1, maxLength) + '...'\n }\n\n return value\n}\n\n/**\n * Converts colon parameters to real values from params.\n *\n * @param template url containing colon parameters, example: '/:id/edit'\n * @param params object containing real values to be replaced, example: { id:5 }\n */\nexport const stringUrlTemplateReplace = (template: string, params: UrlParams) => {\n if (template.indexOf(':') === -1) return template\n const newParts: string[] = []\n const [path, queryString] = template.split('?')\n const parts = path.split('/')\n parts.forEach((part, index) => {\n newParts[index] = part\n if (!part.startsWith(':')) return\n const key = part.substring(1)\n if (!isUndefined(params[key])) newParts[index] = params[part.substring(1)] + ''\n })\n\n return newParts.join('/') + (queryString ? `?${queryString}` : '')\n}\n\n/**\n * Converts colon parameters to real values from params. Same as above but it additionally supports vue router regexp.\n *\n * @param template url containing colon parameters, example: '/:id(\\\\d+)/edit'\n * @param params object containing real values to be replaced, example: { id:5 }\n */\nexport const stringUrlTemplateReplaceVueRouter = (template: string, params: UrlParams) => {\n if (template.indexOf(':') === -1) return template\n const newParts: string[] = []\n const parts = template.split('/')\n parts.forEach((part: string, index: number) => {\n newParts[index] = part\n if (!part.startsWith(':')) return\n newParts[index] = part.substring(1)\n const regex = /^:([a-zA-Z0-9_-]+).*/\n const match = part.match(regex)\n if (isNull(match) || !match[1]) return\n if (!isUndefined(params[match[1]])) newParts[index] = params[match[1]] + ''\n })\n return newParts.join('/')\n}\n\n/**\n * Slot names with dots are not valid, Vue takes dots as modifiers, so we must replace dots with dash.\n */\nexport const stringNormalizeForSlotName = (name: string) => name.replace('.', '-')\n\nexport const stringIsValidEmail = (email: string): boolean => {\n const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,63}$/\n return emailRegex.test(email)\n}\n","import type { InjectionKey } from 'vue'\nimport type { LanguageCode } from '@/composables/languageSettings'\n\nexport const SystemScopeSymbol: InjectionKey<string | undefined> = Symbol.for('anzu:SystemScope')\nexport const SubjectScopeSymbol: InjectionKey<string | undefined> = Symbol.for('anzu:SubjectScope')\nexport const AvailableLanguagesSymbol: InjectionKey<LanguageCode[] | undefined> = Symbol.for('anzu:AvailableLanguages')\nexport const DefaultLanguageSymbol: InjectionKey<LanguageCode | undefined> = Symbol.for('anzu:DefaultLanguage')\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { AnzuUserMinimal } from '@/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n user?: AnzuUserMinimal | undefined | null\n size?: number\n containerClass?: string\n tooltip?: string | undefined\n }>(),\n {\n user: undefined,\n size: 36,\n containerClass: '',\n tooltip: undefined,\n }\n)\n\nconst color = computed(() => {\n if (props.user?.avatar.color && props.user.avatar.color.length === 7) {\n return props.user.avatar.color\n }\n return '#3f6ad8'\n})\n\nconst fontSize = computed(() => {\n return props.size * 0.5 + 'px'\n})\n\nconst text = computed(() => {\n if (!props.user) return ''\n if (props.user.avatar.text.length > 0) return props.user.avatar.text\n const firstNameLastName = props.user.person.firstName.charAt(0) + props.user.person.lastName.charAt(0)\n if (firstNameLastName.length > 0) return firstNameLastName\n return props.user.email.slice(0, 2)\n})\n</script>\n\n<template>\n <VAvatar\n :color=\"color\"\n class=\"text-uppercase\"\n :class=\"containerClass\"\n :size=\"size\"\n >\n <div\n class=\"d-inline-flex text-white font-weight-light\"\n :style=\"{ fontSize: fontSize }\"\n >\n {{ text }}\n </div>\n <VTooltip\n v-if=\"tooltip\"\n activator=\"parent\"\n >\n {{ tooltip }}\n </VTooltip>\n </VAvatar>\n <div />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/utils/common'\nimport type { CollabCachedUsersMap } from '@/components/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/types/common'\nimport type { AnzuUserMinimal } from '@/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n }>(),\n {}\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n if (item.value) {\n return item.value.person.fullName.length ? item.value.person.fullName : item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n async (newValue) => {\n if (loaded.value) return\n if (isUndefined(newValue) || !newValue._loaded) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <AAnzuUserAvatar\n v-else-if=\"loaded\"\n :user=\"cached ?? undefined\"\n container-class=\"\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </div>\n</template>\n","import type { EventBusKey } from '@vueuse/core'\nimport { useEventBus } from '@vueuse/core'\nimport type { CollabFieldDataEnvelope, CollabRoom, CollabRoomPlainData } from '@/components/collab/types/Collab'\n\nexport interface CollabRoomDataChangedEvent {\n room: CollabRoom\n field: string\n}\n\nexport interface CollabJoinRequestEvent {\n room: CollabRoom\n userId: number\n timestamp: number\n}\n\nexport interface CollabApprovedJoinRequestEvent {\n room: CollabRoom\n}\n\nexport interface CollabRejectedJoinRequestEvent {\n room: CollabRoom\n}\n\nexport interface CollabStartingEvent {\n room: CollabRoom\n startedCallback: (data: CollabRoomPlainData) => void\n}\n\nexport interface CollabGatheringBufferDataEvent {\n room: CollabRoom\n}\n\nexport interface CollabRequestToTakeModerationEvent {\n room: CollabRoom\n userId: number\n timestamp: number\n}\n\nexport interface CollabApprovedRequestToTakeModerationEvent {\n room: CollabRoom\n}\n\nexport interface CollabRejectedRequestToTakeModerationEvent {\n room: CollabRoom\n}\n\nexport interface CollabKickedFromRoomEvent {\n room: CollabRoom\n}\n\nexport const collabRoomDataChangedEventBusKey: EventBusKey<CollabRoomDataChangedEvent> =\n Symbol('anzu:collabRoomDataChanged')\n\nexport const collabReconnectEventBusKey: EventBusKey<'reconnect'> = Symbol('anzu:collabReconnect')\n\nexport const collabStartingEventBusKey: EventBusKey<CollabStartingEvent> = Symbol('anzu:collabStarting')\n\nexport const collabGatheringBufferDataEventBusKey: EventBusKey<CollabGatheringBufferDataEvent> = Symbol(\n 'anzu:collabGatheringBufferData'\n)\n\nexport const collabApprovedJoinRequestEventBusKey: EventBusKey<CollabApprovedJoinRequestEvent> = Symbol(\n 'anzu:collabApprovedJoinRequest'\n)\n\nexport const collabRejectedJoinRequestEventBusKey: EventBusKey<CollabRejectedJoinRequestEvent> = Symbol(\n 'anzu:collabRejectedJoinRequest'\n)\n\nexport const collabJoinRequestEventBusKey: EventBusKey<CollabJoinRequestEvent> = Symbol('anzu:collabJoinRequest')\n\nexport const collabApprovedRequestToTakeModerationEventBusKey: EventBusKey<CollabApprovedRequestToTakeModerationEvent> =\n Symbol('anzu:collabApprovedRequestToTakeModeration')\n\nexport const collabRejectedRequestToTakeModerationEventBusKey: EventBusKey<CollabRejectedRequestToTakeModerationEvent> =\n Symbol('anzu:collabRejectedRequestToTakeModeration')\n\nexport const collabRequestToTakeModerationEventBusKey: EventBusKey<CollabRequestToTakeModerationEvent> = Symbol(\n 'anzu:collabRequestToTakeModeration'\n)\n\nexport const collabKickedFromRoomEventBusKey: EventBusKey<CollabKickedFromRoomEvent> = Symbol(\n 'anzu:collabKickedFromRoom'\n)\n\nexport function useCollabRoomDataChangeEventBus() {\n return useEventBus<CollabRoomDataChangedEvent, CollabFieldDataEnvelope>(collabRoomDataChangedEventBusKey)\n}\n\nexport function useCollabReconnectEventBus() {\n return useEventBus(collabReconnectEventBusKey)\n}\n\nexport function useCollabStartingEventBus() {\n return useEventBus<CollabStartingEvent, { startedCallback: (data: CollabRoomPlainData) => void }>(\n collabStartingEventBusKey\n )\n}\n\nexport function useCollabGatheringBufferDataEventBus() {\n return useEventBus<CollabGatheringBufferDataEvent>(collabGatheringBufferDataEventBusKey)\n}\n\nexport function useCollabApprovedJoinRequestEventBus() {\n return useEventBus<CollabApprovedJoinRequestEvent>(collabApprovedJoinRequestEventBusKey)\n}\n\nexport function useCollabRejectedJoinRequestEventBus() {\n return useEventBus<CollabRejectedJoinRequestEvent>(collabRejectedJoinRequestEventBusKey)\n}\n\nexport function useCollabJoinRequestEventBus() {\n return useEventBus<CollabJoinRequestEvent>(collabJoinRequestEventBusKey)\n}\n\nexport function useCollabApprovedRequestToTakeModerationEventBus() {\n return useEventBus<CollabApprovedRequestToTakeModerationEvent>(collabApprovedRequestToTakeModerationEventBusKey)\n}\n\nexport function useCollabRejectedRequestToTakeModerationEventBus() {\n return useEventBus<CollabRejectedRequestToTakeModerationEvent>(collabRejectedRequestToTakeModerationEventBusKey)\n}\n\nexport function useCollabRequestToTakeModerationEventBus() {\n return useEventBus<CollabRequestToTakeModerationEvent>(collabRequestToTakeModerationEventBusKey)\n}\n\nexport function useCollabKickedFromRoomEventBus() {\n return useEventBus<CollabKickedFromRoomEvent>(collabKickedFromRoomEventBusKey)\n}\n\nexport const CollabFieldLockType = {\n Acquire: 'acquire',\n Release: 'release',\n} as const\nexport type CollabFieldLockTypeType = (typeof CollabFieldLockType)[keyof typeof CollabFieldLockType]\n\nexport const CollabFieldLockStatus = {\n Success: 'success',\n Failure: 'failure',\n} as const\nexport type CollabFieldLockStatusType = (typeof CollabFieldLockStatus)[keyof typeof CollabFieldLockStatus]\n\nexport interface CollabFieldLockStatusPayload {\n type: CollabFieldLockTypeType\n status: CollabFieldLockStatusType\n}\n\nexport const createFieldLockStatusPayload = (\n type: CollabFieldLockTypeType,\n status: CollabFieldLockStatusType\n): CollabFieldLockStatusPayload => ({\n type,\n status,\n})\n\nexport interface CollabFieldLockStatusEvent {\n room: CollabRoom\n field: string\n}\n\nexport const collabFieldLockStatusEventBusKey: EventBusKey<CollabFieldLockStatusEvent> =\n Symbol('anzu:collabFieldLockStatus')\n\nexport function useCollabFieldLockStatusEventBus() {\n return useEventBus<CollabFieldLockStatusEvent, CollabFieldLockStatusPayload>(collabFieldLockStatusEventBusKey)\n}\n","import type { RouteParams } from 'vue-router'\nimport type { CollabCachedUsersMap } from '@/components/collab/composables/collabHelpers'\n\nexport type CollabUserId = number\nexport type CollabUserIdNullable = number | null\n\nexport type CollabRoom = string\n\nexport type CollabComponentConfig =\n | undefined\n | {\n room: CollabRoom\n field: CollabFieldName\n cachedUsers: CollabCachedUsersMap\n }\n\nexport const CollabStatus = {\n Inactive: 'inactive',\n Active: 'active',\n} as const\nexport type CollabStatusType =\n (typeof CollabStatus)[keyof typeof CollabStatus]\n\nexport interface CollabRoomInfo {\n name: CollabRoom\n moderator: CollabUserIdNullable\n users: CollabUserId[]\n status: CollabStatusType\n}\n\nexport interface CollabRoomsInfo extends Record<CollabRoom, CollabRoomInfo> {}\n\nexport interface CollabFieldDataEnvelope {\n type: 'scalar' | 'json'\n user: CollabUserId\n value: CollabFieldData\n}\n\nexport type CollabFieldData = unknown\nexport type CollabFieldName = string\nexport type CollabFieldLock = CollabUserIdNullable\n\nexport interface CollabRoomLocks extends Record<CollabFieldName, CollabFieldLock> {}\n\nexport interface CollabRoomData extends Record<CollabFieldName, CollabFieldDataEnvelope> {}\n\nexport interface CollabRoomPlainData extends Record<CollabFieldName, CollabFieldData> {}\n\nexport const CollabAccessRoomStatus = {\n Ok: 'ok',\n Occupied: 'occupied',\n Failed: 'failed',\n} as const\nexport type CollabAccessRoomStatusType = (typeof CollabAccessRoomStatus)[keyof typeof CollabAccessRoomStatus]\n\nexport interface CollabRoomInfoCallback {\n room: CollabRoomInfo\n}\n\ninterface CollabAccessRoomCallback {\n status: CollabAccessRoomStatusType\n}\n\nexport interface CollabSuccessAccessRoomCallback extends CollabAccessRoomCallback, CollabRoomInfoCallback {\n status: typeof CollabAccessRoomStatus.Ok\n}\n\nexport interface CollabOccupiedAccessRoomCallback extends CollabAccessRoomCallback, CollabRoomInfoCallback {\n status: typeof CollabAccessRoomStatus.Occupied\n}\n\nexport interface CollabFailedAccessRoomCallback extends CollabAccessRoomCallback {\n status: typeof CollabAccessRoomStatus.Failed\n reason: string\n}\n\nexport type CollabAccessRoomCallbackTypes =\n | CollabSuccessAccessRoomCallback\n | CollabOccupiedAccessRoomCallback\n | CollabFailedAccessRoomCallback\n\nexport function isCollabSuccessAccessRoomCallback(\n callback: CollabAccessRoomCallbackTypes\n): callback is CollabSuccessAccessRoomCallback {\n return callback.status === CollabAccessRoomStatus.Ok\n}\n\nexport function isCollabOccupiedAccessRoomCallback(\n callback: CollabAccessRoomCallbackTypes\n): callback is CollabSuccessAccessRoomCallback {\n return callback.status === CollabAccessRoomStatus.Occupied\n}\n\nexport const CollabChangeRoomLockStatus = {\n Ok: 'ok',\n Failed: 'failed',\n} as const\nexport type CollabChangeRoomLockStatusType =\n (typeof CollabChangeRoomLockStatus)[keyof typeof CollabChangeRoomLockStatus]\n\nexport interface CollabRoomLocksInfoCallback {\n locks: CollabRoomLocks\n}\n\ninterface CollabChangeRoomLocksInfoCallback {\n status: CollabChangeRoomLockStatusType\n}\n\nexport interface CollabSuccessChangeRoomLockCallback\n extends CollabChangeRoomLocksInfoCallback,\n CollabRoomLocksInfoCallback {\n status: typeof CollabChangeRoomLockStatus.Ok\n locks: CollabRoomLocks\n}\n\nexport interface CollabFailedChangeRoomLockCallback extends CollabChangeRoomLocksInfoCallback {\n status: typeof CollabChangeRoomLockStatus.Failed\n reason: string\n}\n\nexport type CollabChangeRoomLockCallbackTypes = CollabSuccessChangeRoomLockCallback | CollabFailedChangeRoomLockCallback\n\nexport function isCollabSuccessChangeRoomLockCallback(\n callback: CollabChangeRoomLockCallbackTypes\n): callback is CollabSuccessChangeRoomLockCallback {\n return callback.status === CollabChangeRoomLockStatus.Ok\n}\n\nexport function isCollabFailedChangeRoomLockCallback(\n callback: CollabChangeRoomLockCallbackTypes\n): callback is CollabFailedChangeRoomLockCallback {\n return callback.status === CollabChangeRoomLockStatus.Failed\n}\n\nexport interface CollabFieldLockOptions {\n forceFailure?: boolean\n}\n\nexport const CollabRoomJoinStrategy = {\n Free: 'free',\n Moderated: 'moderated',\n} as const\nexport type CollabRoomJoinStrategyType =\n (typeof CollabRoomJoinStrategy)[keyof typeof CollabRoomJoinStrategy]\n\nexport interface CollabRoomOptions {\n joinStrategy?: CollabRoomJoinStrategyType\n editors?: CollabFieldName[]\n}\n\nexport const CollabRequestToTakeModerationStatus = {\n Ok: 'ok',\n AlreadyRequested: 'alreadyRequested',\n Failed: 'failed',\n} as const\nexport type CollabRequestToTakeModerationStatusType =\n (typeof CollabRequestToTakeModerationStatus)[keyof typeof CollabRequestToTakeModerationStatus]\n\nexport interface CollabRequestToTakeModerationStatusCallback {\n status: CollabRequestToTakeModerationStatusType\n}\n\nexport const CollabRequestToJoinStatus = {\n Ok: 'ok',\n AlreadyRequested: 'alreadyRequested',\n Failed: 'failed',\n} as const\nexport type CollabRequestToJoinStatusType = (typeof CollabRequestToJoinStatus)[keyof typeof CollabRequestToJoinStatus]\n\nexport interface CollabRequestToJoinStatusCallback {\n status: CollabRequestToJoinStatusType\n}\n\nexport interface CollabClientToServerEvents {\n subscribeCollabRoomInfo: (room: CollabRoom, callback: (data: CollabRoomInfoCallback) => void) => void\n unsubscribeCollabRoomInfo: (room: CollabRoom, callback: (data: CollabRoomInfoCallback) => void) => void\n joinCollabRoom: (\n room: CollabRoom,\n options: CollabRoomOptions,\n callback: (data: CollabAccessRoomCallbackTypes) => void\n ) => void\n leaveCollabRoom: (room: CollabRoom, callback: (data: CollabAccessRoomCallbackTypes) => void) => void\n acquireFieldLock: (\n room: CollabRoom,\n field: CollabFieldName,\n options: CollabFieldLockOptions,\n callback: (data: CollabChangeRoomLockCallbackTypes) => void\n ) => void\n releaseFieldLock: (\n room: CollabRoom,\n field: CollabFieldName,\n changedData: unknown,\n options: CollabFieldLockOptions,\n callback: (data: CollabChangeRoomLockCallbackTypes) => void\n ) => void\n changeFieldData: (\n room: CollabRoom,\n field: CollabFieldName,\n changedData: unknown,\n callback: (data: CollabChangeRoomLockCallbackTypes) => void\n ) => void\n requestToJoin: (\n room: CollabRoom,\n timestamp: number,\n callback: (data: CollabRequestToJoinStatusCallback) => void\n ) => void\n approveRequestToJoin: (room: CollabRoom, userId: CollabUserId) => void\n rejectRequestToJoin: (room: CollabRoom, userId: CollabUserId) => void\n enteredCollabRoom: (room: CollabRoom) => void\n requestToTakeModeration: (\n room: CollabRoom,\n timestamp: number,\n callback: (data: CollabRequestToTakeModerationStatusCallback) => void\n ) => void\n approveRequestToTakeModeration: (room: CollabRoom) => void\n rejectRequestToTakeModeration: (room: CollabRoom) => void\n kickUserFromRoom: (room: CollabRoom, userId: CollabUserId) => void\n transferModeration: (room: CollabRoom, userId: CollabUserId) => void\n fetchRoomsInfo: (rooms: CollabRoom[], callback: (data: CollabRoomsInfo) => void) => void\n}\n\nexport interface CollabServerToClientEvents {\n collabRoomChanged: (room: CollabRoomInfo) => void\n collabRoomLocksChanged: (room: CollabRoom, locks: CollabRoomLocks) => void\n collabRoomDataChanged: (room: CollabRoom, data: CollabRoomData) => void\n requestToJoin: (room: CollabRoom, user: CollabUserId, timestamp: number) => void\n approvedRequestToJoin: (room: CollabRoom) => void\n rejectedRequestToJoin: (room: CollabRoom) => void\n startCollab: (room: CollabRoom, callback: (data: CollabRoomPlainData) => void) => void\n requestToTakeModeration: (room: CollabRoom, user: CollabUserId, timestamp: number) => void\n transferredModeration: (room: CollabRoom) => void\n approvedRequestToTakeModeration: (room: CollabRoom) => void\n rejectedRequestToTakeModeration: (room: CollabRoom) => void\n kickedFromRoom: (room: CollabRoom) => void\n}\n\nexport interface CollabConfig {\n room: CollabRoom\n joinStrategy: CollabRoomJoinStrategyType\n occupiedOrKickedRedirectToRoute: string\n editors: CollabFieldName[]\n}\nexport type CollabRouteMeta = (params: RouteParams) => CollabConfig\n\nexport interface CollabDelayedRequest {\n userId: CollabUserId\n timestamp: number\n}\n","import { ref } from 'vue'\nimport type { CommonAdminCollabOptions } from '@/AnzuSystemsCommonAdmin'\nimport { isUndefined } from '@/utils/common'\n\nconst collabOptions = ref<CommonAdminCollabOptions>({\n enabled: false,\n socketUrl: '',\n})\n\nexport function initCommonAdminCollabOptions(data: CommonAdminCollabOptions | undefined) {\n if (isUndefined(data)) return\n collabOptions.value = data\n}\n\nexport function useCommonAdminCollabOptions() {\n if (isUndefined(collabOptions.value)) {\n throw new Error(\"Composable can't be used without properly configured common admin.\")\n }\n\n return {\n collabOptions,\n }\n}\n","import type { Socket } from 'socket.io-client'\nimport type {\n CollabClientToServerEvents,\n CollabFieldData,\n CollabFieldLock,\n CollabFieldName,\n CollabRoom,\n CollabRoomInfo,\n CollabRoomPlainData,\n CollabServerToClientEvents,\n} from '@/components/collab/types/Collab'\nimport { computed, reactive, ref, type Ref, toRaw } from 'vue'\nimport { useCollabGatheringBufferDataEventBus } from '@/components/collab/composables/collabEventBus'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nconst collabConnected = ref(true)\nconst collabSocket: Ref<Socket<CollabServerToClientEvents, CollabClientToServerEvents> | undefined> = ref()\nconst collabRoomInfoState = reactive(new Map<CollabRoom, CollabRoomInfo>())\nconst collabFieldLocksState = reactive(new Map<CollabRoom, Map<CollabFieldName, CollabFieldLock>>())\nconst collabFieldDataBufferState = reactive(new Map<CollabRoom, Map<CollabFieldName, CollabFieldData>>())\n\nexport function useCollabState() {\n const { collabOptions } = useCommonAdminCollabOptions()\n\n const collabReconnecting = computed(() => collabOptions.value.enabled && !collabConnected.value)\n\n const gatherBufferData = (room: CollabRoom): CollabRoomPlainData => {\n const collabGatheringBufferDataEventBus = useCollabGatheringBufferDataEventBus()\n collabGatheringBufferDataEventBus.emit({ room })\n let dataBuffer: CollabRoomPlainData = {}\n const dataBufferMap = collabFieldDataBufferState.get(room)\n if (dataBufferMap) {\n dataBuffer = toRaw(Object.fromEntries(dataBufferMap.entries()))\n collabFieldDataBufferState.delete(room)\n }\n return dataBuffer\n }\n\n return {\n collabReconnecting,\n collabConnected,\n collabSocket,\n collabRoomInfoState,\n collabFieldLocksState,\n collabFieldDataBufferState,\n gatherBufferData,\n }\n}\n","import { ref } from 'vue'\nimport type { IntegerIdNullable } from '@/types/common'\n\nconst currentUserId = ref<IntegerIdNullable>(null)\n\nexport function useCollabCurrentUserId() {\n\n function setCollabUserCurrentId (value: IntegerIdNullable) {\n currentUserId.value = value\n }\n\n return {\n setCollabUserCurrentId,\n currentUserId,\n }\n}\n","import {\n type CollabChangeRoomLockCallbackTypes,\n type CollabFieldData,\n type CollabFieldDataEnvelope,\n type CollabFieldLockOptions,\n type CollabFieldName,\n type CollabRoom,\n CollabStatus,\n isCollabFailedChangeRoomLockCallback,\n isCollabSuccessChangeRoomLockCallback,\n} from '@/components/collab/types/Collab'\nimport { computed, ref } from 'vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusEvent,\n type CollabFieldLockStatusPayload,\n CollabFieldLockType,\n type CollabGatheringBufferDataEvent,\n type CollabRoomDataChangedEvent,\n createFieldLockStatusPayload,\n useCollabFieldLockStatusEventBus,\n useCollabGatheringBufferDataEventBus,\n useCollabRoomDataChangeEventBus,\n} from '@/components/collab/composables/collabEventBus'\nimport { type Fn, tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCollabState } from '@/components/collab/composables/collabState'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\nimport { useCollabCurrentUserId } from '@/components/collab/composables/collabCurrentUserId'\n\nexport function useCollabField(room: CollabRoom, field: CollabFieldName, disableAutoUnsubscribe = false) {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { currentUserId } = useCollabCurrentUserId()\n const { collabSocket, collabFieldLocksState, collabFieldDataBufferState, collabRoomInfoState } = useCollabState()\n\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const unsubscribeCollabFieldDataChangeListener = ref<undefined | Fn>()\n const fieldChangeCallback = ref<undefined | ((payload: CollabFieldDataEnvelope) => void)>()\n\n const fieldLockStatusEventBus = useCollabFieldLockStatusEventBus()\n const unsubscribeCollabFieldLockStatusListener = ref<undefined | Fn>()\n const fieldLockStatusCallback = ref<undefined | ((payload: CollabFieldLockStatusPayload) => void)>()\n\n const collabGatheringBufferDataEventBus = useCollabGatheringBufferDataEventBus()\n const unsubscribeCollabGatheringBufferData = ref<undefined | Fn>()\n const collabGatheringBufferDataCallback = ref<undefined | Fn>()\n\n const fieldChangeEventBusListener = (event: CollabRoomDataChangedEvent, payload?: CollabFieldDataEnvelope) => {\n if (\n event.room !== room ||\n event.field !== field ||\n isUndefined(payload) ||\n isUndefined(fieldChangeCallback.value)\n ) {\n return\n }\n fieldChangeCallback.value(payload)\n }\n\n const fieldLockStatusEventBusListener = (\n event: CollabFieldLockStatusEvent,\n payload?: CollabFieldLockStatusPayload\n ) => {\n if (\n event.room !== room ||\n event.field !== field ||\n isUndefined(payload) ||\n isUndefined(fieldLockStatusCallback.value)\n ) {\n return\n }\n fieldLockStatusCallback.value(payload)\n }\n\n const collabGatheringBufferDataEventBusListener = (event: CollabGatheringBufferDataEvent) => {\n if (event.room === room && isDefined(collabGatheringBufferDataCallback.value)) {\n collabGatheringBufferDataCallback.value()\n }\n }\n\n const addCollabFieldDataChangeListener = (callback: (data: CollabFieldDataEnvelope) => void) => {\n fieldChangeCallback.value = callback\n unsubscribeCollabFieldDataChangeListener.value = changeEventBus.on(fieldChangeEventBusListener)\n }\n const addCollabFieldLockStatusListener = (callback: (data: CollabFieldLockStatusPayload) => void) => {\n fieldLockStatusCallback.value = callback\n unsubscribeCollabFieldLockStatusListener.value = fieldLockStatusEventBus.on(fieldLockStatusEventBusListener)\n }\n\n const addCollabGatheringBufferDataListener = (callback: () => void) => {\n collabGatheringBufferDataCallback.value = callback\n unsubscribeCollabGatheringBufferData.value = collabGatheringBufferDataEventBus.on(\n collabGatheringBufferDataEventBusListener\n )\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeCollabFieldDataChangeListener.value)) {\n unsubscribeCollabFieldDataChangeListener.value()\n }\n if (isDefined(unsubscribeCollabFieldLockStatusListener.value)) {\n unsubscribeCollabFieldLockStatusListener.value()\n }\n if (isDefined(unsubscribeCollabGatheringBufferData.value)) {\n unsubscribeCollabGatheringBufferData.value()\n }\n })\n\n const lockedByUser = computed(() => {\n const roomLockData = collabFieldLocksState.get(room)\n if (roomLockData) {\n const lock = roomLockData.get(field)\n if (lock && currentUserId.value !== lock) {\n return lock\n }\n }\n return null\n })\n\n const acquireCollabFieldLock = (options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value\n ?.timeout(1000)\n .emit('acquireFieldLock', room, field, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n const locks = new Map(Object.entries(response.locks))\n for (const [field, lock] of locks.entries()) {\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const releaseCollabFieldLock = (data: CollabFieldData, options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) {\n if (!collabFieldDataBufferState.has(room)) {\n collabFieldDataBufferState.set(room, new Map())\n }\n collabFieldDataBufferState.get(room)?.set(field, data)\n return\n }\n collabSocket.value\n ?.timeout(1000)\n .emit('releaseFieldLock', room, field, data, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n for (const field of Object.keys(response.locks)) {\n collabFieldLocksState.get(room)?.delete(field)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const changeCollabFieldData = (data: CollabFieldData) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value.emit('changeFieldData', room, field, data, () => {\n return\n })\n }\n\n return {\n addCollabFieldDataChangeListener,\n addCollabFieldLockStatusListener,\n addCollabGatheringBufferDataListener,\n acquireCollabFieldLock,\n releaseCollabFieldLock,\n changeCollabFieldData,\n lockedByUser,\n collabFieldDataBufferState,\n unsubscribeCollabFieldDataChangeListener,\n unsubscribeCollabFieldLockStatusListener,\n unsubscribeCollabGatheringBufferData,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, watch } from 'vue'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport type { VuetifyIconValue } from '@/types/Vuetify'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusPayload,\n CollabFieldLockType,\n} from '@/components/collab/composables/collabEventBus'\nimport type { CollabComponentConfig, CollabFieldData, CollabFieldLockOptions } from '@/components/collab/types/Collab'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport type { IntegerIdNullable } from '@/types/common'\nimport type { VTextField } from 'vuetify/components/VTextField'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string | number | null | undefined\n label?: string\n errorMessage?: string\n required?: boolean\n v?: any\n prependIcon?: VuetifyIconValue\n appendIcon?: VuetifyIconValue\n dataCy?: string\n hideLabel?: boolean\n type?: string\n step?: number\n maxlength?: number | undefined\n collab?: CollabComponentConfig\n disabled?: boolean\n placeholder?: undefined | string\n persistentPlaceholder?: boolean\n help?: string | undefined\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n prependIcon: undefined,\n appendIcon: undefined,\n dataCy: undefined,\n hideLabel: false,\n type: 'text',\n step: undefined,\n maxlength: undefined,\n collab: undefined,\n disabled: undefined,\n placeholder: undefined,\n persistentPlaceholder: false,\n help: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: string | number | null | undefined): void\n (e: 'click:append', data: string | number | null | undefined): void\n (e: 'blur', data: string | number | null | undefined): void\n (e: 'focus', data: string | number | null | undefined): void\n}>()\n\nconst textFieldRef = ref<InstanceType<typeof VTextField> | null>(null)\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData, options?: Partial<CollabFieldLockOptions>) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst acquireFieldLock = ref((options?: Partial<CollabFieldLockOptions>) => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n acquireCollabFieldLock,\n addCollabFieldLockStatusListener,\n addCollabGatheringBufferDataListener,\n lockedByUser,\n\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n addCollabFieldLockStatusListener((data: CollabFieldLockStatusPayload) => {\n if (data.status === CollabFieldLockStatus.Failure && data.type === CollabFieldLockType.Acquire) {\n textFieldRef.value?.blur()\n }\n })\n addCollabGatheringBufferDataListener(() => {\n textFieldRef.value?.blur()\n })\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst onUpdate = (newValue: string) => {\n emit('update:modelValue', newValue)\n}\nconst onBlur = () => {\n emit('blur', props.modelValue)\n props.v?.$touch()\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if (props.v?.required && props.v?.required.$params.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n</script>\n\n<template>\n <VTextField\n ref=\"textFieldRef\"\n :prepend-icon=\"prependIcon\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :model-value=\"modelValue\"\n :required=\"requiredComputed\"\n :type=\"type\"\n :step=\"step\"\n :append-icon=\"appendIcon\"\n :maxlength=\"maxlength\"\n :disabled=\"disabledComputed\"\n :placeholder=\"placeholder\"\n :persistent-placeholder=\"persistentPlaceholder\"\n trim\n @click:append=\"(event: any) => emit('click:append', event)\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @update:model-value=\"onUpdate($event)\"\n >\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ labelComputed\n }}<span\n v-if=\"requiredComputed\"\n class=\"required\"\n />\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.prepend\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <template\n v-if=\"help\"\n #append\n >\n <VIcon\n v-tooltip=\"help\"\n icon=\"mdi-help-circle-outline\"\n />\n </template>\n </VTextField>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, watch } from 'vue'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport { isDefined, isNumber, isUndefined } from '@/utils/common'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport type { VuetifyIconValue } from '@/types/Vuetify'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport type { VTextField } from 'vuetify/components/VTextField'\nimport type { CollabComponentConfig, CollabFieldData, CollabFieldLockOptions } from '@/components/collab/types/Collab'\nimport type { IntegerIdNullable } from '@/types/common'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusPayload,\n CollabFieldLockType,\n} from '@/components/collab/composables/collabEventBus'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string | null | undefined // todo check number and null\n label?: string | undefined\n errorMessage?: string | undefined\n required?: boolean | undefined\n v?: any\n prependIcon?: VuetifyIconValue | undefined\n appendIcon?: VuetifyIconValue | undefined\n dataCy?: string | undefined\n hideLabel?: boolean\n rows?: number\n collab?: CollabComponentConfig | undefined\n disabled?: boolean | undefined\n help?: string | undefined\n suggestedLength?: number | undefined\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n prependIcon: undefined,\n appendIcon: undefined,\n dataCy: undefined,\n hideLabel: false,\n rows: 1,\n collab: undefined,\n disabled: undefined,\n help: undefined,\n suggestedLength: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: string | null | undefined): void\n (e: 'click:append', data: string | null): void\n (e: 'blur', data: string | null | undefined): void\n (e: 'focus', data: string | null | undefined): void\n}>()\n\nconst textareaRef = ref<InstanceType<typeof VTextField> | null>(null)\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst acquireFieldLock = ref((options?: Partial<CollabFieldLockOptions>) => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n acquireCollabFieldLock,\n addCollabFieldLockStatusListener,\n addCollabGatheringBufferDataListener,\n lockedByUser,\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n addCollabFieldLockStatusListener((data: CollabFieldLockStatusPayload) => {\n if (data.status === CollabFieldLockStatus.Failure && data.type === CollabFieldLockType.Acquire) {\n textareaRef.value?.blur()\n }\n })\n addCollabGatheringBufferDataListener(() => {\n textareaRef.value?.blur()\n })\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst onUpdate = (newValue: string) => {\n emit('update:modelValue', newValue)\n}\nconst onBlur = () => {\n emit('blur', props.modelValue)\n props.v?.$touch()\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if (props.v?.required && props.v?.required.$params.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst showCounterWarning = (counterValue: string | number | undefined) => {\n if (isNumber(counterValue) && !isUndefined(props.suggestedLength)) {\n return counterValue > props.suggestedLength\n }\n return false\n}\n</script>\n\n<template>\n <VTextarea\n ref=\"textareaRef\"\n :prepend-icon=\"prependIcon\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :model-value=\"modelValue\"\n :required=\"requiredComputed\"\n :disabled=\"disabledComputed\"\n :rows=\"rows\"\n auto-grow\n :append-icon=\"appendIcon\"\n trim\n @click:append=\"(event: any) => emit('click:append', event)\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @update:model-value=\"onUpdate($event)\"\n >\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ labelComputed\n }}<span\n v-if=\"requiredComputed\"\n class=\"required\"\n />\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.prepend\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <template\n v-if=\"$slots.counter\"\n #counter=\"counterProps\"\n >\n <slot\n name=\"counter\"\n :props=\"counterProps\"\n />\n </template>\n <template\n v-else-if=\"suggestedLength\"\n #counter=\"{ value: counterValue }\"\n >\n <span :class=\"{ 'text-warning': showCounterWarning(counterValue) }\">\n {{ t('common.system.inputSuggestedMax', { current: counterValue, max: suggestedLength }) }}\n </span>\n </template>\n <template\n v-if=\"help\"\n #append\n >\n <VIcon\n v-tooltip=\"help\"\n icon=\"mdi-help-circle-outline\"\n />\n </template>\n </VTextarea>\n</template>\n","<script lang=\"ts\" setup>\nimport { provide } from 'vue'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n system: string\n subject: string\n }>(),\n {}\n)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nprovide<string>(SystemScopeSymbol, props.system)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nprovide<string>(SubjectScopeSymbol, props.subject)\n</script>\n\n<template>\n <slot />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, watch } from 'vue'\nimport { cloneDeep, isNull } from '@/utils/common'\nimport type { Pagination } from '@/types/Pagination'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Pagination\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n (e: 'update:modelValue', data: Pagination): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: Pagination) {\n emit('update:modelValue', cloneDeep(newValue))\n },\n})\n\nconst { t } = useI18n()\n\nconst lastPage = computed(() => {\n return Math.ceil(modelValueComputed.value.totalCount / modelValueComputed.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return modelValueComputed.value.page * modelValueComputed.value.rowsPerPage - modelValueComputed.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n modelValueComputed.value.page * modelValueComputed.value.rowsPerPage -\n modelValueComputed.value.rowsPerPage +\n modelValueComputed.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return modelValueComputed.value.page === 1\n})\n\nconst disabledLast = computed(() => {\n return !isNull(modelValueComputed.value.hasNextPage) || modelValueComputed.value.page === lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(modelValueComputed.value.hasNextPage) && modelValueComputed.value.page === lastPage.value) ||\n modelValueComputed.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(modelValueComputed.value.hasNextPage)) {\n return modelValueComputed.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return modelValueComputed.value.totalCount\n})\n\nconst rowsPerPageComputed = computed(() => {\n return modelValueComputed.value.rowsPerPage\n})\nwatch(rowsPerPageComputed, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n modelValueComputed.value.page = 1\n emit('change')\n }\n})\nconst pageComputed = computed(() => {\n return modelValueComputed.value.page\n})\nwatch(pageComputed, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('change')\n }\n})\n\nconst onClickFirst = () => {\n modelValueComputed.value.page = 1\n}\n\nconst onClickLast = () => {\n modelValueComputed.value.page = lastPage.value\n}\n\nconst onClickPrev = () => {\n modelValueComputed.value.page = modelValueComputed.value.page - 1\n}\n\nconst onClickNext = () => {\n modelValueComputed.value.page = modelValueComputed.value.page + 1\n}\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"modelValueComputed.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === modelValueComputed.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }} {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ modelValueComputed.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport type { ColumnInternalValues } from '@/composables/system/datatableColumns'\nimport { cloneDeep } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n columnsAll: ColumnInternalValues[]\n columnsHidden: Array<string>\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n }>(),\n {\n buttonT: 'common.system.datatable.config',\n buttonClass: 'ml-1',\n dataCy: 'table-settings',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:columnsHidden', data: Array<string>): void\n}>()\n\nconst { t } = useI18n()\n\nconst isVisible = (key: string) => {\n return !props.columnsHidden.includes(key)\n}\n\nconst toggleVisibility = (key: string) => {\n const cloned = cloneDeep(props.columnsHidden)\n const index = cloned.indexOf(key)\n if (index > -1) {\n cloned.splice(index, 1)\n emit('update:columnsHidden', cloned)\n return\n }\n cloned.push(key)\n emit('update:columnsHidden', cloned)\n}\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n color=\"light\"\n icon\n size=\"x-small\"\n variant=\"text\"\n >\n <VIcon icon=\"mdi-cog\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n <VMenu activator=\"parent\">\n <VCard>\n <VList density=\"compact\">\n <VListItem>\n <VListItemTitle>\n <strong>{{ t('common.system.datatable.displayCols') }}</strong>\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-for=\"column in columnsAll\"\n :key=\"column.key\"\n @click.stop=\"toggleVisibility(column.key)\"\n >\n <VListItemTitle>\n <VIcon\n v-if=\"isVisible(column.key)\"\n class=\"mr-2\"\n icon=\"mdi-checkbox-marked\"\n />\n <VIcon\n v-else\n class=\"mr-2\"\n icon=\"mdi-checkbox-blank-outline\"\n />\n {{ column.title }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VCard>\n </VMenu>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { DatatableOrderingOption, DatatableOrderingOptions } from '@/composables/system/datatableColumns'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'default' | 'most-relevant'\n modelValue?: number\n customOptions?: undefined | DatatableOrderingOptions\n }>(),\n {\n variant: 'default',\n modelValue: 1,\n customOptions: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: number): void\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst { t } = useI18n()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst active = ref(props.modelValue)\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: number) {\n active.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst defaultItems: DatatableOrderingOptions = [\n { id: 1, titleT: 'common.system.datatable.ordering.mostRecent', sortBy: { key: 'createdAt', order: 'desc' } },\n { id: 2, titleT: 'common.system.datatable.ordering.oldest', sortBy: { key: 'createdAt', order: 'asc' } },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n { id: 3, titleT: 'common.system.datatable.ordering.mostRelevant' },\n { id: 1, titleT: 'common.system.datatable.ordering.mostRecent', sortBy: { key: 'createdAt', order: 'desc' } },\n { id: 2, titleT: 'common.system.datatable.ordering.oldest', sortBy: { key: 'createdAt', order: 'asc' } },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === active.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n return defaultItems\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValueComputed.value = item.id\n}\n\nwatch(\n active,\n (newValue, oldValue) => {\n if (isUndefined(oldValue) || newValue === oldValue) return\n const found = options.value.find((item: any) => item.id === newValue)\n if (found) emit('sortByChange', found)\n },\n { immediate: true }\n)\n\nwatch(\n modelValueComputed,\n (newValue, oldValue) => {\n if (isUndefined(oldValue) || newValue === oldValue) return\n active.value = newValue\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-caption mr-1\">\n {{ t('common.system.datatable.ordering.title') }}:\n </div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === active }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n","<script setup lang=\"ts\">\nconst emit = defineEmits<{\n (e: 'onCancel'): void\n}>()\n\nconst onCancel = () => {\n emit('onCancel')\n}\n</script>\n\n<template>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n >\n <VToolbarTitle class=\"flex-fill\">\n <slot />\n </VToolbarTitle>\n <VSpacer />\n <VBtn\n class=\"ml-2\"\n icon=\"mdi-close\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"button-close\"\n @click.stop=\"onCancel\"\n />\n </VToolbar>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n data: any\n }>(),\n {}\n)\n\nconst computedData = computed(() => {\n return props.data\n})\n\nwatch(\n computedData,\n (newValue) => {\n console.log(newValue)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div />\n</template>\n","(function(){\"use strict\";var o;try{if(typeof document<\"u\"){var e=document.createElement(\"style\");e.nonce=(o=document.head.querySelector(\"meta[property=csp-nonce]\"))==null?void 0:o.content,e.appendChild(document.createTextNode(\".vue-notification-group{display:block;position:fixed;z-index:5000}.vue-notification-wrapper{display:block;overflow:hidden;width:100%;margin:0;padding:0}.notification-title{font-weight:600}.vue-notification-template{display:block;box-sizing:border-box;background:#fff;text-align:left}.vue-notification{display:block;box-sizing:border-box;text-align:left;font-size:12px;padding:10px;margin:0 5px 5px;color:#fff;background:#44a4fc;border-left:5px solid #187FE7}.vue-notification.warn{background:#ffb648;border-left-color:#f48a06}.vue-notification.error{background:#e54d42;border-left-color:#b82e24}.vue-notification.success{background:#68cd86;border-left-color:#42a85f}.vn-fade-enter-active,.vn-fade-leave-active,.vn-fade-move{transition:all .5s}.vn-fade-enter-from,.vn-fade-leave-to{opacity:0}\")),document.head.appendChild(e)}}catch(n){console.error(\"vite-plugin-css-injected-by-js\",n)}})();\nimport { defineComponent as U, ref as X, computed as g, onMounted as Z, createVNode as l, TransitionGroup as tt, mergeProps as et, Fragment as $, isVNode as nt } from \"vue\";\nconst R = /* @__PURE__ */ new Map();\nfunction ot(t) {\n return { all: t = t || /* @__PURE__ */ new Map(), on: function(o, i) {\n var a = t.get(o);\n a ? a.push(i) : t.set(o, [i]);\n }, off: function(o, i) {\n var a = t.get(o);\n a && (i ? a.splice(a.indexOf(i) >>> 0, 1) : t.set(o, []));\n }, emit: function(o, i) {\n var a = t.get(o);\n a && a.slice().map(function(r) {\n r(i);\n }), (a = t.get(\"*\")) && a.slice().map(function(r) {\n r(o, i);\n });\n } };\n}\nconst v = ot(), T = \"[-+]?[0-9]*.?[0-9]+\", M = [\n {\n name: \"px\",\n regexp: new RegExp(`^${T}px$`)\n },\n {\n name: \"%\",\n regexp: new RegExp(`^${T}%$`)\n },\n /**\n * Fallback option\n * If no suffix specified, assigning \"px\"\n */\n {\n name: \"px\",\n regexp: new RegExp(`^${T}$`)\n }\n], it = (t) => {\n if (t === \"auto\")\n return {\n type: t,\n value: 0\n };\n for (let o = 0; o < M.length; o++) {\n const i = M[o];\n if (i.regexp.test(t))\n return {\n type: i.name,\n value: parseFloat(t)\n };\n }\n return {\n type: \"\",\n value: t\n };\n}, at = (t) => {\n switch (typeof t) {\n case \"number\":\n return { type: \"px\", value: t };\n case \"string\":\n return it(t);\n default:\n return { type: \"\", value: t };\n }\n}, H = {\n x: /* @__PURE__ */ new Set([\"left\", \"center\", \"right\"]),\n y: /* @__PURE__ */ new Set([\"top\", \"bottom\"])\n}, st = /* @__PURE__ */ ((t) => () => t++)(0), rt = (t) => typeof t != \"string\" ? [] : t.split(/\\s+/gi).filter(Boolean), lt = (t) => {\n typeof t == \"string\" && (t = rt(t));\n let o = null, i = null;\n return t.forEach((a) => {\n H.y.has(a) && (i = a), H.x.has(a) && (o = a);\n }), { x: o, y: i };\n}, b = {\n position: [\"top\", \"right\"],\n cssAnimation: \"vn-fade\",\n velocityAnimation: {\n enter: (t) => ({\n height: [t.clientHeight, 0],\n opacity: [1, 0]\n }),\n leave: {\n height: 0,\n opacity: [0, 1]\n }\n }\n}, ct = (t, o) => {\n let i, a, r = o;\n const y = () => {\n a = Date.now(), i = setTimeout(t, r);\n }, m = () => {\n clearTimeout(i), r -= Date.now() - a;\n };\n return y(), {\n start: y,\n stop: m\n };\n};\nfunction ut(t) {\n return typeof t == \"function\" || Object.prototype.toString.call(t) === \"[object Object]\" && !nt(t);\n}\nconst x = {\n IDLE: 0,\n DESTROYED: 2\n}, ft = /* @__PURE__ */ U({\n // eslint-disable-next-line vue/multi-word-component-names\n name: \"notifications\",\n props: {\n group: {\n type: String,\n default: \"\"\n },\n /** \n * Width of notification holder, can be `%`, `px` string or number.\n * @example '100%', '200px', 200 \n * */\n width: {\n type: [Number, String],\n default: 300\n },\n reverse: {\n type: Boolean,\n default: !1\n },\n position: {\n type: [String, Array],\n default: () => b.position\n },\n classes: {\n type: [String, Array],\n default: \"vue-notification\"\n },\n animationType: {\n type: String,\n default: \"css\",\n validator(t) {\n return t === \"css\" || t === \"velocity\";\n }\n },\n animation: {\n type: Object,\n default() {\n return b.velocityAnimation;\n }\n },\n animationName: {\n type: String,\n default: b.cssAnimation\n },\n speed: {\n type: Number,\n default: 300\n },\n /** Time (in ms) to keep the notification on screen (if **negative** - notification will stay **forever** or until clicked) */\n duration: {\n type: Number,\n default: 3e3\n },\n delay: {\n type: Number,\n default: 0\n },\n max: {\n type: Number,\n default: 1 / 0\n },\n ignoreDuplicates: {\n type: Boolean,\n default: !1\n },\n closeOnClick: {\n type: Boolean,\n default: !0\n },\n pauseOnHover: {\n type: Boolean,\n default: !1\n },\n /** Use [v-html](https://vuejs.org/api/built-in-directives.html#v-html) to set `title` and `text` */\n dangerouslySetInnerHtml: {\n type: Boolean,\n default: !1\n }\n },\n emits: {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n click: (t) => !0,\n destroy: (t) => !0,\n start: (t) => !0\n /* eslint-enable @typescript-eslint/no-unused-vars */\n },\n slots: Object,\n setup: (t, {\n emit: o,\n slots: i,\n expose: a\n }) => {\n const r = X([]), y = R.get(\"velocity\"), m = g(() => t.animationType === \"velocity\"), c = g(() => r.value.filter((e) => e.state !== x.DESTROYED)), D = g(() => at(t.width)), S = g(() => {\n const {\n x: e,\n y: n\n } = lt(t.position), s = D.value.value, u = D.value.type, p = {\n width: s + u\n };\n return n && (p[n] = \"0px\"), e && (e === \"center\" ? p.left = `calc(50% - ${+s / 2}${u})` : p[e] = \"0px\"), p;\n }), j = g(() => m.value ? {\n onEnter: G,\n onLeave: W,\n onAfterLeave: O\n } : {}), B = (e) => {\n o(\"click\", e), t.closeOnClick && d(e);\n }, L = (e) => {\n var n;\n t.pauseOnHover && ((n = e.timer) == null || n.stop());\n }, k = (e) => {\n var n;\n t.pauseOnHover && ((n = e.timer) == null || n.start());\n }, C = (e = {}) => {\n if (e.group || (e.group = \"\"), e.data || (e.data = {}), t.group !== e.group)\n return;\n if (e.clean || e.clear) {\n F();\n return;\n }\n const n = typeof e.duration == \"number\" ? e.duration : t.duration, s = typeof e.speed == \"number\" ? e.speed : t.speed, u = typeof e.ignoreDuplicates == \"boolean\" ? e.ignoreDuplicates : t.ignoreDuplicates, {\n title: p,\n text: q,\n type: z,\n data: J,\n id: K\n } = e, f = {\n id: K || st(),\n title: p,\n text: q,\n type: z,\n state: x.IDLE,\n speed: s,\n length: n + 2 * s,\n data: J,\n duplicates: 0\n };\n n >= 0 && (f.timer = ct(() => d(f), f.length));\n const w = \"bottom\" in S.value, Q = t.reverse ? !w : w;\n let h = -1;\n const A = c.value.find((I) => I.title === e.title && I.text === e.text);\n if (u && A) {\n A.duplicates++;\n return;\n }\n Q ? (r.value.push(f), o(\"start\", f), c.value.length > t.max && (h = 0)) : (r.value.unshift(f), o(\"start\", f), c.value.length > t.max && (h = c.value.length - 1)), h !== -1 && d(c.value[h]);\n }, P = (e) => {\n _(e);\n }, Y = (e) => [\"vue-notification-template\", t.classes, e.type || \"\"], V = (e) => m.value ? void 0 : {\n transition: `all ${e.speed}ms`\n }, d = (e) => {\n var n;\n (n = e.timer) == null || n.stop(), e.state = x.DESTROYED, O(), o(\"destroy\", e);\n }, _ = (e) => {\n const n = r.value.find((s) => s.id === e);\n n && d(n);\n }, F = () => {\n c.value.forEach(d);\n }, N = (e, n) => {\n var u;\n const s = (u = t.animation) == null ? void 0 : u[e];\n return typeof s == \"function\" ? s(n) : s;\n }, G = (e, n) => {\n const s = N(\"enter\", e);\n y(e, s, {\n duration: t.speed,\n complete: n\n });\n }, W = (e, n) => {\n const s = N(\"leave\", e);\n y(e, s, {\n duration: t.speed,\n complete: n\n });\n };\n function O() {\n r.value = r.value.filter((e) => e.state !== x.DESTROYED);\n }\n return Z(() => {\n v.on(\"add\", C), v.on(\"close\", P);\n }), () => {\n let e;\n return l(\"div\", {\n class: \"vue-notification-group\",\n style: S.value\n }, [l(tt, et(j.value, {\n tag: \"div\",\n css: !m.value,\n name: t.animationName\n }), ut(e = c.value.map((n) => l(\"div\", {\n key: n.id,\n class: \"vue-notification-wrapper\",\n style: V(n),\n \"data-id\": n.id,\n onMouseenter: () => L(n),\n onMouseleave: () => k(n)\n }, [i.body ? i.body({\n item: n,\n class: [t.classes, n.type],\n close: () => d(n)\n }) : l(\"div\", {\n class: Y(n),\n onClick: () => B(n)\n }, [t.dangerouslySetInnerHtml ? l($, null, [n.title ? l(\"div\", {\n class: \"notification-title\",\n innerHTML: n.title\n }, null) : null, l(\"div\", {\n class: \"notification-content\",\n innerHTML: n.text\n }, null)]) : l($, null, [n.title ? l(\"div\", {\n class: \"notification-title\"\n }, [n.title]) : null, l(\"div\", {\n class: \"notification-content\"\n }, [n.text])])])]))) ? e : {\n default: () => [e]\n })]);\n };\n }\n}), E = (t) => {\n typeof t == \"string\" && (t = { title: \"\", text: t }), typeof t == \"object\" && v.emit(\"add\", t);\n};\nE.close = (t) => {\n v.emit(\"close\", t);\n};\nconst mt = () => ({ notify: E }), dt = \"Notifications\";\nfunction pt(t, o = {}) {\n Object.entries(o).forEach((a) => R.set(...a));\n const i = o.name || \"notify\";\n t.config.globalProperties[\"$\" + i] = E, t.component(o.componentName || dt, ft);\n}\nconst gt = {\n install: pt\n};\nexport {\n ft as Notifications,\n gt as default,\n E as notify,\n mt as useNotification\n};\n","import type { Locale, Path } from 'vue-i18n'\nimport { createI18n } from 'vue-i18n'\nimport type en from '@/locales/en'\n\nexport type MessageSchema = typeof en\n\nconst REQUIRED_LOCALES = ['en', 'sk']\n\nexport const i18n = createI18n<[MessageSchema]>({\n globalInjection: false,\n legacy: false,\n locale: REQUIRED_LOCALES[0],\n fallbackLocale: false,\n missing: (locale: Locale, key: Path) => {\n if (REQUIRED_LOCALES.includes(locale)) {\n console.warn(`Missing ${locale} translation: ${key}`)\n }\n },\n})\n","export const isAnzuFatalError = (error: any): error is AnzuFatalError => {\n return error instanceof AnzuFatalError\n}\n\nexport class AnzuFatalError extends Error {\n constructor(cause?: Error, message = '') {\n super(message)\n this.name = 'AnzuFatalError'\n this.cause = cause\n this.message = message\n }\n}\n","export const HTTP_STATUS_OK = 200\nexport const HTTP_STATUS_CREATED = 201\nexport const HTTP_STATUS_ACCEPTED = 202\nexport const HTTP_STATUS_NO_CONTENT = 204\nexport const HTTP_STATUS_BAD_REQUEST = 400\nexport const HTTP_STATUS_UNAUTHORIZED = 401\nexport const HTTP_STATUS_FORBIDDEN = 403\nexport const HTTP_STATUS_NOT_FOUND = 404\nexport const HTTP_STATUS_UNPROCESSABLE_ENTITY = 422\n\nexport const HTTP_STATUS_VALID_ALL = [HTTP_STATUS_OK, HTTP_STATUS_CREATED, HTTP_STATUS_ACCEPTED, HTTP_STATUS_NO_CONTENT]\n","import axios from 'axios'\nimport { HTTP_STATUS_FORBIDDEN } from '@/composables/statusCodes'\n\nexport const axiosErrorResponseIsForbidden = (error: Error) => {\n return axios.isAxiosError(error) && error.response?.status === HTTP_STATUS_FORBIDDEN\n}\n\nexport const isAnzuApiForbiddenError = (error: any): error is AnzuApiForbiddenError => {\n return error instanceof AnzuApiForbiddenError\n}\n\nexport class AnzuApiForbiddenError extends Error {\n constructor(cause?: Error, message = '') {\n super(message)\n this.name = 'AnzuApiForbiddenError'\n this.cause = cause\n this.message = message\n }\n}\n","import axios, { type AxiosError } from 'axios'\nimport { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '@/composables/statusCodes'\n\ninterface ValidationResponseDataFields {\n [key: string]: string[]\n}\n\nexport interface AnzuApiValidationResponseData {\n contextId: string\n error: string\n fields: ValidationResponseDataFields\n}\n\nexport interface ValidationError {\n field: string\n errors: string[]\n}\n\nconst ERROR_VALIDATION = 'validation_failed'\n\nexport const axiosErrorResponseHasValidationData = (error: Error) => {\n return (\n axios.isAxiosError(error) &&\n error.response?.status === HTTP_STATUS_UNPROCESSABLE_ENTITY &&\n error.response.data?.error === ERROR_VALIDATION &&\n error.response.data?.fields\n )\n}\n\nexport const isAnzuApiValidationError = (error: any): error is AnzuApiValidationError => {\n return error instanceof AnzuApiValidationError\n}\n\nfunction resolveResponseData(axiosError: AxiosError, system: string, entity: string) {\n const data = axiosError.response?.data as AnzuApiValidationResponseData\n const items = [] as ValidationError[]\n for (const [key, values] of Object.entries(data.fields)) {\n items.push({\n field: system + '.' + entity + '.model.' + key,\n errors: values,\n })\n }\n return items\n}\n\nexport class AnzuApiValidationError extends Error {\n fields: ValidationError[]\n\n constructor(axiosError: AxiosError, system: string, entity: string, cause?: Error, message = '') {\n super(message)\n this.name = 'AnzuApiValidationError'\n this.cause = cause\n this.message = message\n this.fields = resolveResponseData(axiosError, system, entity)\n }\n}\n","export const isAnzuApiResponseCodeError = (error: any): error is AnzuApiResponseCodeError => {\n return error instanceof AnzuApiResponseCodeError\n}\n\nexport class AnzuApiResponseCodeError extends Error {\n code: number\n\n constructor(code: number, cause?: Error, message?: string) {\n super(message)\n this.name = 'AnzuApiResponseCodeError'\n this.cause = cause\n this.code = code\n }\n}\n","import axios, { type AxiosError } from 'axios'\nimport { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '@/composables/statusCodes'\n\ninterface ForbiddenOperationResponseData {\n contextId: string\n error: string\n detail: string\n}\n\nconst ERROR_FORBIDDEN_OPERATION = 'forbidden_operation_error'\n\nexport const axiosErrorResponseHasForbiddenOperationData = (error: Error) => {\n return (\n axios.isAxiosError(error) &&\n error.response?.status === HTTP_STATUS_UNPROCESSABLE_ENTITY &&\n error.response.data?.error === ERROR_FORBIDDEN_OPERATION &&\n error.response.data?.detail\n )\n}\n\nexport const isAnzuApiForbiddenOperationError = (error: any): error is AnzuApiForbiddenOperationError => {\n return error instanceof AnzuApiForbiddenOperationError\n}\n\nfunction resolveResponseData(axiosError: AxiosError) {\n const data = axiosError.response?.data as ForbiddenOperationResponseData\n return data.detail\n}\n\nexport class AnzuApiForbiddenOperationError extends Error {\n detail: string\n\n constructor(axiosError: AxiosError, cause?: Error, message = '') {\n super(message)\n this.name = 'AnzuApiForbiddenOperationError'\n this.cause = cause\n this.message = message\n this.detail = resolveResponseData(axiosError)\n }\n}\n","import { notify } from '@kyvg/vue3-notification'\nimport { i18n } from '@/plugins/i18n'\nimport { isAnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { isAnzuApiForbiddenError } from '@/model/error/AnzuApiForbiddenError'\nimport { isAnzuApiValidationError, type ValidationError } from '@/model/error/AnzuApiValidationError'\nimport { isAnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { isAnzuApiForbiddenOperationError } from '@/model/error/AnzuApiForbiddenOperationError'\n\nconst DEFAULT_DURATION_SECONDS = 3\n\nexport const NEW_LINE_MARK = '\\n'\n\nexport type RecordWasType = 'created' | 'deleted' | 'updated' | 'published' | 'unpublished' | 'enabled' | 'disabled'\n\nexport function useAlerts() {\n const showSuccess = (message: string, duration = DEFAULT_DURATION_SECONDS) => {\n notify({\n group: 'alerts',\n text: message,\n duration: duration * 1000,\n type: 'success',\n })\n }\n\n const showSuccessT = (translation: string, duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n showSuccess(t(translation), duration)\n }\n\n const showError = (message: string, duration = DEFAULT_DURATION_SECONDS) => {\n notify({\n group: 'alerts',\n text: message,\n duration: duration * 1000,\n type: 'error',\n })\n }\n\n const showErrorT = (translation: string, duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n showError(t(translation), duration)\n }\n\n const showInfo = (message: string, duration = DEFAULT_DURATION_SECONDS) => {\n notify({\n group: 'alerts',\n text: message,\n duration: duration * 1000,\n type: 'info',\n })\n }\n\n const showInfoT = (translation: string, duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n showInfo(t(translation), duration)\n }\n\n const showWarning = (message: string, duration = DEFAULT_DURATION_SECONDS) => {\n notify({\n group: 'alerts',\n text: message,\n duration: duration * 1000,\n type: 'warning',\n })\n }\n\n const showWarningT = (translation: string, duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n showWarning(t(translation), duration)\n }\n\n const showValidationError = (duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n notify({\n group: 'alerts',\n text: t('common.alert.fixValidationErrors'),\n duration: duration * 1000,\n type: 'error',\n })\n }\n\n const showRecordWas = (variant: RecordWasType, duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n notify({\n group: 'alerts',\n text: t('common.alert.recordWas.' + variant),\n duration: duration * 1000,\n type: 'success',\n })\n }\n\n const showApiValidationError = (errors: ValidationError[], duration = -1, fieldIsTranslated = false) => {\n const { t, te } = i18n.global\n const texts = [t('common.alert.fixApiValidationErrors')]\n\n for (let i = 0; i < errors.length; i++) {\n let fieldText = ''\n if (fieldIsTranslated) {\n fieldText += errors[i].field\n } else if (te(errors[i].field)) {\n fieldText += t(errors[i].field)\n }\n const errorsTexts = new Set<string>()\n for (let j = 0; j < errors[i].errors.length; j++) {\n if (te('error.apiValidation.' + errors[i].errors[j])) {\n errorsTexts.add(t('error.apiValidation.' + errors[i].errors[j]))\n continue\n }\n errorsTexts.add(t('error.apiValidation.noTranslation'))\n }\n if (fieldText.length > 0) {\n texts.push(fieldText + ': ' + Array.from(errorsTexts).join(', '))\n }\n }\n notify({\n group: 'alerts',\n text: texts.join(NEW_LINE_MARK),\n duration: duration * 1000,\n type: 'error',\n })\n }\n\n const showApiForbiddenOperationError = (detail: string, duration = -1) => {\n const { t, te } = i18n.global\n let text = t('error.apiForbiddenOperation.noTranslation')\n if (te('error.apiForbiddenOperation.' + detail)) {\n text = t('error.apiForbiddenOperation.' + detail)\n }\n notify({\n group: 'alerts',\n text: text,\n duration: duration * 1000,\n type: 'error',\n })\n }\n\n const showUnknownError = (duration = -1) => {\n const { t } = i18n.global\n notify({\n group: 'alerts',\n text: t('common.alert.unknownError'),\n duration: duration * 1000,\n type: 'error',\n })\n }\n\n const showForbiddenError = (duration = DEFAULT_DURATION_SECONDS) => {\n const { t } = i18n.global\n notify({\n group: 'alerts',\n text: t('common.alert.forbiddenError'),\n duration: duration * 1000,\n type: 'error',\n })\n }\n\n const showErrorsDefault = (error: any) => {\n if (isAnzuApiForbiddenError(error)) {\n showForbiddenError()\n return true\n }\n if (isAnzuApiValidationError(error)) {\n showApiValidationError(error.fields)\n return true\n }\n if (isAnzuApiForbiddenOperationError(error)) {\n showApiForbiddenOperationError(error.detail)\n return true\n }\n if (isAnzuFatalError(error)) {\n showUnknownError()\n return true\n }\n if (isAnzuApiResponseCodeError(error)) {\n showUnknownError()\n return true\n }\n return false\n }\n\n return {\n showSuccess,\n showSuccessT,\n showError,\n showErrorT,\n showInfo,\n showInfoT,\n showWarning,\n showWarningT,\n showValidationError,\n showRecordWas,\n showApiValidationError,\n showApiForbiddenOperationError,\n showUnknownError,\n showForbiddenError,\n showErrorsDefault,\n }\n}\n","<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n buttonClass?: string\n maxWidth?: number | undefined\n dataCy?: string\n v?: any\n callCreate: () => Promise<any>\n disableRedirect?: boolean\n redirectRouteName?: string | undefined\n redirectParamName?: string\n }>(),\n {\n buttonClass: '',\n maxWidth: undefined,\n dataCy: 'button-create',\n v: undefined,\n disableRedirect: false,\n redirectRouteName: undefined,\n redirectParamName: 'id',\n }\n)\n\nconst emit = defineEmits<{\n (e: 'onConfirm'): void\n (e: 'onOpen'): void\n (e: 'onClose'): void\n (e: 'onError', data: any): void\n (e: 'onSuccess', data: any): void\n}>()\n\nconst modelValue = defineModel<boolean>({ default: false, required: false })\n\nconst { t } = useI18n()\n\nconst buttonLoading = ref(false)\n\nconst onOpen = () => {\n modelValue.value = true\n emit('onOpen')\n}\n\nconst onClose = () => {\n modelValue.value = true\n emit('onClose')\n}\n\nconst router = useRouter()\nconst { showValidationError, showRecordWas, showErrorsDefault } = useAlerts()\n\nconst onConfirm = async () => {\n emit('onConfirm')\n try {\n buttonLoading.value = true\n props.v?.$touch()\n if (!isUndefined(props.v) && props.v.$invalid) {\n showValidationError()\n buttonLoading.value = false\n return\n }\n const res = await props.callCreate()\n emit('onSuccess', res)\n showRecordWas('created')\n onClose()\n if (!isUndefined(res.id) && !props.disableRedirect && props.redirectRouteName) {\n router.push({\n name: props.redirectRouteName,\n params: { [props.redirectParamName]: res[props.redirectParamName] },\n })\n }\n } catch (error) {\n showErrorsDefault(error)\n emit('onError', error)\n } finally {\n buttonLoading.value = false\n }\n}\n</script>\n\n<template>\n <ABtnPrimary\n :class=\"buttonClass\"\n rounded=\"pill\"\n :data-cy=\"dataCy\"\n @click.stop=\"onOpen\"\n >\n <slot name=\"button-title\">\n {{ t('common.button.create') }}\n </slot>\n <VDialog\n :model-value=\"modelValue\"\n :max-width=\"maxWidth\"\n persistent\n @update:model-value=\"modelValue = $event\"\n >\n <VCard\n v-if=\"modelValue\"\n data-cy=\"create-panel\"\n >\n <ADialogToolbar @on-cancel=\"onClose\">\n <slot name=\"title\">\n {{ t('common.button.create') }}\n </slot>\n </ADialogToolbar>\n <VCardText>\n <slot name=\"content\" />\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-cancel\"\n @click.stop=\"onClose\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n :loading=\"buttonLoading\"\n data-cy=\"button-confirm\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.create') }}\n </slot>\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </ABtnPrimary>\n</template>\n","<script lang=\"ts\" setup>\nimport { onMounted, ref } from 'vue'\nimport { useFetch } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n configUrl?: string | undefined | null\n }>(),\n {\n configUrl: null,\n }\n)\n\nconst { t } = useI18n()\n\ninterface AdminConfigItem {\n id: string\n title: string\n url: string\n icon: string\n}\n\nconst config = ref<AdminConfigItem[]>([])\n\nonMounted(async () => {\n if (props.configUrl && props.configUrl.length > 0) {\n try {\n const { data } = await useFetch<AdminConfigItem[]>(props.configUrl).get().json()\n config.value = data.value\n } catch (e) {\n //\n }\n }\n})\n</script>\n\n<template>\n <VBtn\n v-if=\"config.length > 0\"\n variant=\"text\"\n size=\"small\"\n icon\n >\n <VIcon icon=\"mdi-dots-grid\" />\n <VTooltip\n activator=\"parent\"\n location=\"top\"\n >\n {{ t('common.system.adminSwitcher.button') }}\n </VTooltip>\n <VMenu activator=\"parent\">\n <VCard>\n <div class=\"a-admin-switcher__content\">\n <a\n v-for=\"item in config\"\n :key=\"item.id\"\n :href=\"item.url\"\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n class=\"a-admin-switcher__item\"\n >\n <img\n :src=\"item.icon\"\n :alt=\"item.title\"\n >\n <span class=\"a-admin-switcher__item-title\">{{ item.title }}</span>\n </a>\n </div>\n </VCard>\n </VMenu>\n </VBtn>\n</template>\n\n<style lang=\"scss\">\n.a-admin-switcher {\n &__content {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-template-rows: auto;\n padding: 6px;\n }\n\n &__item {\n display: flex;\n width: 96px;\n height: 96px;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n text-decoration: none;\n color: rgba(var(--v-theme-on-surface), var(--v-hover-opacity));\n\n &:hover {\n background-color: rgba(var(--v-theme-on-surface), 10%);\n border-radius: 8px;\n }\n\n &-title {\n display: flex;\n font-weight: normal;\n font-size: 14px;\n line-height: 14px;\n color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity));\n padding: 8px 0;\n }\n\n img {\n display: block;\n width: auto;\n height: 50px;\n }\n }\n}\n</style>\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var o=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),o.call(this,t)};var r=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else r.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s,o=this;if(f)return o.$offset=u,o.$u=0===s,o;if(0!==s){var r=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(o=this.local().add(u+r,t)).$offset=u,o.$x.$localOffset=r}else o=this.utc();return o};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","import type { OpUnitType, QUnitType } from 'dayjs'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { stringToInt } from '@/utils/string'\nimport type { DatetimeUTC, DatetimeUTCNullable } from '@/types/common'\n\ndayjs.extend(utc)\ndayjs.extend(customParseFormat)\n\nexport const SUFFIX = '.000000Z'\nconst FORMAT = 'YYYY-MM-DDTHH:mm:ss'\n\nexport const DATETIME_MIN = '1970-01-01T00:00:00.000000Z'\nexport const DATETIME_MAX = '2100-01-01T00:00:00.000000Z'\n\nexport const dateNow = (): Date => {\n return dayjs().utc().toDate()\n}\n\nexport const dateTimeToDate = (isoDate: DatetimeUTC | DatetimeUTCNullable | string): Date => {\n return dayjs(isoDate).toDate()\n}\nexport const timestampCurrent = (): number => {\n return stringToInt(dayjs().utc().unix())\n}\n\nexport const dateTimeNow = (ignoreFractionalSeconds = true, ignoreSeconds = false): string => {\n if (ignoreFractionalSeconds && !ignoreSeconds) return dayjs().utc().format('YYYY-MM-DDTHH:mm:ss') + SUFFIX\n if (ignoreFractionalSeconds && ignoreSeconds) return dayjs().utc().format('YYYY-MM-DDTHH:mm:00') + SUFFIX\n if (!ignoreFractionalSeconds && ignoreSeconds) return dayjs().utc().format('YYYY-MM-DDTHH:mm:00.SSSSSS') + 'Z'\n return dayjs().utc().format('YYYY-MM-DDTHH:mm:ss.SSSSSS') + 'Z'\n}\n\nexport const dateTimeStartOfDay = (days = 0) => {\n if (days === 0) {\n return dayjs().startOf('day').utc().format(FORMAT) + SUFFIX\n }\n return dayjs().add(days, 'days').startOf('day').utc().format(FORMAT) + SUFFIX\n}\n\nexport const dateTimeEndOfDay = (days = 0) => {\n if (days === 0) {\n return dayjs().endOf('day').utc().format(FORMAT) + SUFFIX\n }\n return dayjs().add(days, 'days').endOf('day').utc().format(FORMAT) + SUFFIX\n}\n\nexport const dateModifyMinutes = (minutes = 0, date: null | Date = null): Date => {\n if (date === null) date = new Date()\n if (minutes === 0) return date\n if (minutes > 0) return dayjs(date).add(minutes, 'minutes').toDate()\n if (minutes < 0) return dayjs(date).subtract(Math.abs(minutes), 'minutes').toDate()\n return date\n}\n\nexport const dateToUtc = (date: dayjs.ConfigType) => {\n return dayjs(date).utc().format('YYYY-MM-DDTHH:mm:ss') + SUFFIX\n}\n\nexport const yearNow = () => {\n return dayjs().utc().format('YYYY')\n}\n\nexport const dateTimePretty = (\n isoDate: DatetimeUTC | DatetimeUTCNullable | string | null,\n edgeDateValue = ''\n): string => {\n if (isoDate === DATETIME_MAX || isoDate === DATETIME_MIN || isoDate === '' || isNull(isoDate) || isUndefined(isoDate))\n return edgeDateValue\n return dayjs(isoDate).format('DD.MM.YYYY HH:mm')\n}\n\nexport const dateTimeFriendly = (isoDate: DatetimeUTC | DatetimeUTCNullable | string | null, edgeDateValue = '') => {\n if (\n isoDate === DATETIME_MAX ||\n isoDate === DATETIME_MIN ||\n isoDate === '' ||\n isNull(isoDate) ||\n isUndefined(isoDate)\n ) {\n return edgeDateValue\n }\n let displayYear = true\n let displayDayMonth = true\n const date = dayjs(isoDate)\n const now = dayjs()\n if (now.format('YYYY') === date.format('YYYY')) {\n displayYear = false\n }\n if (now.format('YYYY-MM-DD') === date.format('YYYY-MM-DD')) {\n displayDayMonth = false\n }\n if (!displayYear && !displayDayMonth) return dayjs(date).format('H:mm')\n if (!displayYear) return dayjs(date).format('D.M. H:mm')\n return dayjs(date).format('D.M.YYYY H:mm')\n}\n\nexport const datePretty = (isoDate: DatetimeUTC | DatetimeUTCNullable | string | null, edgeDateValue = ''): string => {\n if (isoDate === DATETIME_MAX || isoDate === DATETIME_MIN || isoDate === '' || isNull(isoDate) || isUndefined(isoDate))\n return edgeDateValue\n return dayjs(isoDate).format('DD.MM.YYYY')\n}\n\nexport const timePretty = (isoDate: DatetimeUTC | DatetimeUTCNullable | string | null, edgeDateValue = ''): string => {\n if (isoDate === DATETIME_MAX || isoDate === DATETIME_MIN || isoDate === '' || isNull(isoDate) || isUndefined(isoDate))\n return edgeDateValue\n return dayjs(isoDate).format('HH:mm')\n}\n\nexport const dateDiff = (date1: Date, date2: Date, unit: QUnitType | OpUnitType = 'ms') => {\n const date1dayjs = dayjs(date1)\n const date2dayjs = dayjs(date2)\n return date1dayjs.diff(date2dayjs, unit)\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { AnzuUserAndTimeTrackingAware } from '@/types/AnzuUserAndTimeTrackingAware'\nimport { dateTimePretty } from '@/utils/datetime'\nimport ARow from '@/components/ARow.vue'\n\nconst props = withDefaults(\n defineProps<{\n data: AnzuUserAndTimeTrackingAware | any\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n }>(),\n {\n hideCreatedAt: false,\n hideModifiedAt: false,\n }\n)\n\nconst createdAt = computed(() => {\n return dateTimePretty(props.data.createdAt)\n})\nconst modifiedAt = computed(() => {\n return dateTimePretty(props.data.modifiedAt)\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow :title=\"t('common.model.tracking.created')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideCreatedAt\"\n class=\"mr-2\"\n >\n {{ createdAt }}\n </div>\n </div>\n </ARow>\n <ARow :title=\"t('common.model.tracking.modified')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideModifiedAt\"\n class=\"mr-2\"\n >\n {{ modifiedAt }}\n </div>\n </div>\n </ARow>\n</template>\n","import { cloneDeep, isArray, isEmptyArray, isEmptyObject, isNull, isObject, isUndefined } from '@/utils/common'\nimport type { Filter, FilterBag, FilterVariant } from '@/types/Filter'\nimport type { Pagination } from '@/types/Pagination'\nimport type { Ref } from 'vue'\n\nexport interface MakeFilterOptions<T = any> {\n name: string\n variant: FilterVariant\n titleT?: string\n default: T | null\n field: string\n multiple: boolean\n clearable: boolean\n mandatory: boolean\n advanced: boolean\n exclude: boolean\n}\n\ninterface LoadStoredFilterOptions {\n showAdvancedFilter?: Ref<boolean>\n callback?: (containsAdvanced: boolean) => void\n}\n\nexport function makeFilterHelper<T = any>(system?: string, subject?: string) {\n return (options: Partial<MakeFilterOptions<T>> = {}): Filter<T> => {\n const variant = isUndefined(options.variant) ? 'eq' : options.variant\n\n let defaultValue = isUndefined(options.default) ? null : options.default\n if (isUndefined(options.default) && variant === 'in') {\n defaultValue = [] as any\n }\n let titleT = options.titleT\n if (isUndefined(titleT) && system && subject && options.name) {\n titleT = system + '.' + subject + '.filter.' + options.name\n }\n\n return {\n variant,\n titleT,\n default: defaultValue,\n field: isUndefined(options.field) ? '' : options.field,\n multiple: isArray(defaultValue),\n clearable: isUndefined(options.clearable) ? true : options.clearable,\n mandatory: isUndefined(options.mandatory) ? false : options.mandatory,\n advanced: isUndefined(options.advanced) ? false : options.advanced,\n exclude: isUndefined(options.exclude) ? false : options.exclude,\n model: cloneDeep(defaultValue),\n error: '',\n }\n }\n}\n\nexport function useFilterHelpers(storeId: string | undefined = undefined) {\n const clearOne = (filter: Filter) => {\n if (!filter.clearable) return\n filter.model = filter.default\n filter.error = ''\n }\n\n const clearAll = (filterBag: FilterBag) => {\n for (const filterName in filterBag) {\n clearOne(filterBag[filterName])\n }\n }\n\n const clearAllErrors = (filterBag: FilterBag) => {\n for (const filterName in filterBag) {\n filterBag[filterName].error = ''\n }\n }\n\n const loadStoredFilter = (\n filterBag: FilterBag,\n options: LoadStoredFilterOptions = {},\n ) => {\n if (!storeId || !localStorage) return\n const { showAdvancedFilter, callback } = options\n let containsAdvanced = false\n const stored = localStorage.getItem(storeId)\n if (!stored) return\n const storedData = JSON.parse(stored)\n if (!isObject(storedData)) return\n for (const filterName in filterBag) {\n try {\n // @ts-ignore\n if (!isUndefined(storedData[filterName])) {\n // @ts-ignore\n filterBag[filterName].model = storedData[filterName]\n if (filterBag[filterName].advanced) {\n containsAdvanced = true\n }\n }\n } catch (e) {\n //\n }\n }\n if (showAdvancedFilter && containsAdvanced) showAdvancedFilter.value = true\n if (callback) callback(containsAdvanced)\n }\n\n const storeFilter = (filterBag: FilterBag) => {\n if (!storeId || !localStorage) return\n const data: Record<string, any> = {}\n for (const filterName in filterBag) {\n try {\n if (\n !filterName.startsWith('_') &&\n !isUndefined(filterBag[filterName].model) &&\n !isNull(filterBag[filterName].model) &&\n !isEmptyObject(filterBag[filterName].model) &&\n !isEmptyArray(filterBag[filterName].model) &&\n filterBag[filterName].model !== filterBag[filterName].default\n ) {\n data[filterName] = filterBag[filterName].model\n }\n } catch (e) {\n //\n }\n }\n if (isEmptyObject(data)) return\n localStorage.setItem(storeId, JSON.stringify(data))\n }\n\n const resetFilter = (filterBag: FilterBag, pagination: Pagination, callback?: any) => {\n clearAll(filterBag)\n pagination.page = 1\n if (storeId && localStorage) {\n localStorage.removeItem(storeId)\n }\n if (callback) callback()\n }\n\n const submitFilter = (filterBag: FilterBag, pagination: Pagination, callback: () => any) => {\n clearAllErrors(filterBag)\n storeFilter(filterBag)\n pagination.page = 1\n callback()\n }\n\n return {\n clearAllErrors,\n clearAll,\n clearOne,\n resetFilter,\n submitFilter,\n loadStoredFilter,\n }\n}\n","<script lang=\"ts\" setup>\nimport type { Filter } from '@/types/Filter'\nimport { useFilterHelpers } from '@/composables/filter/filterHelpers'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n placeholder?: string | undefined\n dataCy?: string\n }>(),\n {\n placeholder: undefined,\n dataCy: 'filter-string',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: Filter): void\n}>()\n\nconst value = computed({\n get() {\n return props.modelValue.model\n },\n set(newValue) {\n emit('update:modelValue', { ...props.modelValue, ...{ model: newValue } })\n },\n})\n\nconst { clearOne } = useFilterHelpers()\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (props.modelValue.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (props.modelValue.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (props.modelValue.variant === 'contains' || props.modelValue.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n</script>\n\n<template>\n <VTextField\n v-model=\"value\"\n :label=\"label\"\n :placeholder=\"placeholderComputed\"\n :clearable=\"!modelValue.mandatory\"\n :data-cy=\"dataCy\"\n @click:clear.stop=\"clearOne(modelValue)\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport type { Filter } from '@/types/Filter'\nimport type { Ref } from 'vue'\nimport { computed, ref, toRefs, watch } from 'vue'\nimport { isDocId, isEmpty, isInt, isString, isUndefined } from '@/utils/common'\nimport { useFilterHelpers } from '@/composables/filter/filterHelpers'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n filterId?: Filter | undefined\n filterDocId?: Filter | undefined\n filterText?: Filter | undefined\n filterUrl?: Filter | undefined\n filterOverrides?: Filter[] | undefined\n placeholder?: string | undefined\n dataCy?: string\n }>(),\n {\n filterId: undefined,\n filterDocId: undefined,\n filterText: undefined,\n filterUrl: undefined,\n filterOverrides: undefined,\n placeholder: undefined,\n dataCy: 'filter-mixed',\n }\n)\nconst model = ref('')\nconst { filterId, filterText, filterDocId, filterUrl, filterOverrides } = toRefs(props)\nconst { t } = useI18n()\n\nconst filterActive = (filter: Ref<Filter | undefined> | undefined): filter is Ref<Filter> => {\n return !isUndefined(filter) && !isUndefined(filter.value)\n}\nconst { clearOne } = useFilterHelpers()\nconst clearIfActive = (filter: Ref<Filter | undefined> | undefined) => {\n if (filterActive(filter)) {\n clearOne(filter.value)\n }\n}\nconst clearAllActiveExcept = (exceptFilter: Ref<Filter | undefined> | undefined = undefined) => {\n if (exceptFilter?.value?.titleT !== filterId?.value?.titleT) {\n clearIfActive(filterId)\n }\n if (exceptFilter?.value?.titleT !== filterDocId?.value?.titleT) {\n clearIfActive(filterDocId)\n }\n if (exceptFilter?.value?.titleT !== filterText?.value?.titleT) {\n clearIfActive(filterText)\n }\n if (exceptFilter?.value?.titleT !== filterUrl?.value?.titleT) {\n clearIfActive(filterUrl)\n }\n if (!isUndefined(filterOverrides)) {\n filterOverrides.value?.forEach((filter: any) => {\n if (exceptFilter?.value?.titleT !== filter.titleT) {\n clearOne(filter)\n }\n })\n }\n}\nconst overrideFilter: Ref<Filter | undefined> = ref(undefined)\nwatch(overrideFilter, () => {\n if (filterActive(overrideFilter)) {\n overrideFilter.value.model = model.value\n currentFilter.value = overrideFilter.value\n clearAllActiveExcept(overrideFilter)\n return\n }\n setFilters(model.value)\n})\nconst currentFilter: Ref<Filter | undefined> = ref(undefined)\nwatch(model, (newModel: string) => {\n setFilters(newModel)\n})\nconst setFilters = (newModel: string) => {\n if (filterActive(overrideFilter)) {\n overrideFilter.value.model = newModel\n return\n }\n const filter = autodetectFilter(newModel)\n if (!isUndefined(filter)) {\n filter.model = newModel\n }\n currentFilter.value = filter\n clearAllActiveExcept(currentFilter)\n}\nconst autodetectFilter = (newModel: string): Filter | undefined => {\n if (isInt(newModel)) {\n if (filterActive(filterId)) {\n return filterId.value\n }\n }\n if (isDocId(newModel)) {\n if (filterActive(filterDocId)) {\n return filterDocId.value\n }\n }\n if (isString(newModel) && newModel.length > 0) {\n if (filterActive(filterUrl) && newModel.startsWith('http')) {\n return filterUrl.value\n }\n if (filterActive(filterText)) {\n return filterText.value\n }\n }\n return undefined\n}\n\nconst label = computed(() => {\n if (filterActive(overrideFilter)) {\n return t(overrideFilter.value.titleT ?? '')\n }\n if (filterActive(currentFilter)) {\n return t(currentFilter.value.titleT ?? '')\n }\n const filterLabels = []\n if (filterActive(filterId)) {\n filterLabels.push(t(filterId.value.titleT ?? ''))\n }\n if (filterActive(filterDocId)) {\n filterLabels.push(t(filterDocId.value.titleT ?? ''))\n }\n if (filterActive(filterUrl)) {\n filterLabels.push(t(filterUrl.value.titleT ?? ''))\n }\n if (filterActive(filterText)) {\n filterLabels.push(t(filterText.value.titleT ?? ''))\n }\n return filterLabels.join('/')\n})\n\nconst currentFilterModel = computed(() => {\n return currentFilter.value?.model\n})\nwatch(currentFilterModel, (newModel) => {\n if (!isEmpty(model.value) && isEmpty(newModel)) {\n model.value = ''\n }\n})\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (currentFilter.value?.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (currentFilter.value?.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (currentFilter.value?.variant === 'contains' || currentFilter.value?.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n</script>\n\n<template>\n <VTextField\n v-model=\"model\"\n :label=\"label\"\n :data-cy=\"dataCy\"\n :placeholder=\"placeholderComputed\"\n >\n <template\n v-if=\"filterOverrides\"\n #append-inner\n >\n <VBtnToggle\n v-model=\"overrideFilter\"\n divided\n class=\"override-toggle\"\n >\n <VBtn\n v-for=\"(override, index) in filterOverrides\"\n :key=\"index\"\n size=\"small\"\n :value=\"override\"\n >\n {{ t(override.titleT ?? '') }}\n </VBtn>\n </VBtnToggle>\n </template>\n </VTextField>\n</template>\n\n<style lang=\"scss\" scoped>\n.override-toggle {\n height: 80%;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { Filter } from '@/types/Filter'\nimport { useFilterHelpers } from '@/composables/filter/filterHelpers'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { stringToInt } from '@/utils/string'\nimport { isNull } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n dataCy?: string\n }>(),\n {\n dataCy: 'filter-integer',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: Filter): void\n}>()\n\nconst value = computed({\n get() {\n return props.modelValue.model\n },\n set(newValue) {\n emit('update:modelValue', {\n ...props.modelValue,\n ...{ model: isNull(newValue) ? null : stringToInt(newValue + '') },\n })\n },\n})\n\nconst { clearOne } = useFilterHelpers()\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n</script>\n\n<template>\n <VTextField\n v-model=\"value\"\n :label=\"label\"\n :clearable=\"!modelValue.mandatory\"\n :data-cy=\"dataCy\"\n @click:clear.stop=\"clearOne(modelValue)\"\n />\n</template>\n","export const eventClickBlur = (event?: Event): void => {\n if (event?.currentTarget instanceof HTMLElement) {\n event.currentTarget.blur()\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed, ref } from 'vue'\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\n\nwithDefaults(\n defineProps<{\n tooltipT?: string\n buttonClass?: string\n dataCy?: string\n }>(),\n {\n tooltipT: 'common.button.advancedFilters',\n buttonClass: 'mt-1',\n dataCy: 'filter-advanced',\n }\n)\nconst emit = defineEmits<{\n (e: 'advancedFilter'): void\n}>()\n\nconst active = ref(false)\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n active.value = !active.value\n emit('advancedFilter')\n}\n\nconst icon = computed(() => {\n return active.value ? 'mdi-chevron-double-up' : 'mdi-chevron-double-down'\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n size=\"x-small\"\n variant=\"text\"\n @click.stop=\"onClick\"\n >\n <VIcon :icon=\"icon\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(tooltipT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { eventClickBlur } from '@/utils/event'\n\nwithDefaults(\n defineProps<{\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n touched?: boolean\n }>(),\n {\n buttonT: 'common.button.submitFilter',\n buttonClass: '',\n dataCy: 'filter-submit',\n touched: true,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n}>()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n emit('submit')\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n color=\"primary\"\n type=\"submit\"\n :variant=\"touched ? 'flat' : 'text'\"\n @click.stop=\"onClick\"\n >\n {{ t(buttonT) }}\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\n\nwithDefaults(\n defineProps<{\n tooltipT?: string\n buttonClass?: string\n dataCy?: string\n }>(),\n {\n tooltipT: 'common.button.resetFilter',\n buttonClass: 'ml-2',\n dataCy: 'filter-reset',\n }\n)\nconst emit = defineEmits<{\n (e: 'reset'): void\n}>()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n emit('reset')\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n class=\"px-2\"\n :data-cy=\"dataCy\"\n color=\"light\"\n min-width=\"36px\"\n variant=\"flat\"\n @click.stop=\"onClick\"\n >\n <VIcon\n color=\"grey darken-1\"\n icon=\"mdi-filter-remove-outline\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(tooltipT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport AFilterAdvancedButton from '@/components/buttons/filter/AFilterAdvancedButton.vue'\nimport AFilterSubmitButton from '@/components/buttons/filter/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/components/buttons/filter/AFilterResetButton.vue'\n\nwithDefaults(\n defineProps<{\n enableAdvanced?: boolean\n enableTop?: boolean\n hideButtons?: boolean\n touched?: boolean\n }>(),\n {\n enableAdvanced: false,\n enableTop: false,\n hideButtons: false,\n touched: true,\n }\n)\nconst emit = defineEmits<{\n (e: 'resetFilter'): void\n}>()\n\nconst showAdvanced = defineModel<boolean>('showAdvanced', { default: false, required: false })\n\nconst resetFilter = () => {\n emit('resetFilter')\n}\n\nconst toggleAdvancedFilter = () => {\n showAdvanced.value = !showAdvanced.value\n}\n</script>\n\n<template>\n <VRow\n v-if=\"enableTop\"\n dense\n >\n <VCol class=\"\">\n <slot name=\"top\" />\n </VCol>\n </VRow>\n <VRow\n dense\n class=\"a-filter-advanced\"\n :class=\"{ 'a-filter-advanced--active': showAdvanced }\"\n >\n <VCol\n v-if=\"enableAdvanced\"\n class=\"v-col-filters--show-hide\"\n cols=\"auto\"\n >\n <AFilterAdvancedButton\n :button-active=\"showAdvanced\"\n @advanced-filter=\"toggleAdvancedFilter\"\n />\n </VCol>\n <VCol class=\"\">\n <slot name=\"default\" />\n <div\n v-show=\"showAdvanced\"\n class=\"a-filter-advanced__content\"\n >\n <slot name=\"advanced\" />\n </div>\n </VCol>\n <VCol\n v-if=\"!hideButtons\"\n class=\"v-col-filters--buttons text-right\"\n cols=\"auto\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n </slot>\n </VCol>\n </VRow>\n</template>\n","import { ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { useI18n } from 'vue-i18n'\n\nexport const Grant = {\n Deny: 0,\n AllowOwner: 1,\n Allow: 2,\n} as const\nexport type GrantType = (typeof Grant)[keyof typeof Grant]\nexport const GrantDefault = Grant.Deny\n\nexport function useGrant() {\n const { t } = useI18n()\n\n const grantOptions = ref<ValueObjectOption<GrantType>[]>([\n {\n value: Grant.Deny,\n title: t('common.permission.grant.deny'),\n color: 'error',\n },\n {\n value: Grant.AllowOwner,\n title: t('common.permission.grant.allowOwner'),\n color: 'warning',\n },\n {\n value: Grant.Allow,\n title: t('common.permission.grant.allow'),\n color: 'success',\n },\n ])\n\n const getGrantOption = (value: GrantType): ValueObjectOption<GrantType> => {\n return grantOptions.value.find((item) => item.value === value) as ValueObjectOption<GrantType>\n }\n\n return {\n grantOptions,\n getGrantOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { type GrantType, useGrant } from '@/model/valueObject/Grant'\nimport { computed } from 'vue'\n\nconst props = defineProps<{\n availableGrants: GrantType[]\n selectedGrant: GrantType | undefined\n}>()\nconst emit = defineEmits<{\n (e: 'change', data?: GrantType): void\n}>()\nconst selectedGrant = computed({\n get() {\n return props.selectedGrant\n },\n set(newGrant) {\n emit('change', newGrant)\n },\n})\nconst { getGrantOption } = useGrant()\n</script>\n\n<template>\n <VBtnToggle\n v-model=\"selectedGrant\"\n divided\n density=\"compact\"\n variant=\"outlined\"\n class=\"text-disabled\"\n >\n <VBtn\n v-for=\"availableGrant in availableGrants\"\n :key=\"availableGrant\"\n :value=\"availableGrant\"\n :color=\"getGrantOption(availableGrant)?.color\"\n >\n {{ getGrantOption(availableGrant)?.title }}\n </VBtn>\n </VBtnToggle>\n</template>\n","import { ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { useI18n } from 'vue-i18n'\n\nexport const GrantOrigin = {\n Role: 'role',\n Group: 'group',\n User: 'user',\n Default: 'default',\n} as const\nexport type GrantOriginType = (typeof GrantOrigin)[keyof typeof GrantOrigin]\nexport const GrantOriginDefault = GrantOrigin.Default\n\nexport function useGrantOrigin() {\n const { t } = useI18n()\n\n const grantOriginOptions = ref<ValueObjectOption<GrantOriginType>[]>([\n {\n value: GrantOrigin.Role,\n title: t('common.permission.grantOrigin.role'),\n },\n {\n value: GrantOrigin.Group,\n title: t('common.permission.grantOrigin.group'),\n },\n {\n value: GrantOrigin.User,\n title: t('common.permission.grantOrigin.user'),\n },\n {\n value: GrantOriginDefault,\n title: t('common.permission.grantOrigin.defaultGrant'),\n },\n ])\n\n const getGrantOriginOption = (value: GrantOriginType): ValueObjectOption<GrantOriginType> => {\n return grantOriginOptions.value.find((item) => item.value === value) as ValueObjectOption<GrantOriginType>\n }\n\n return {\n grantOriginOptions,\n getGrantOriginOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { type GrantType, useGrant } from '@/model/valueObject/Grant'\nimport { GrantOriginDefault, type GrantOriginType, useGrantOrigin } from '@/model/valueObject/GrantOrigin'\nimport { computed } from 'vue'\n\nconst props = defineProps<{\n grant: GrantType\n grantOrigin: GrantOriginType\n}>()\n\nconst { getGrantOption } = useGrant()\nconst grantOption = computed(() => getGrantOption(props.grant))\n\nconst { getGrantOriginOption } = useGrantOrigin()\nconst grantOriginOption = computed(() => getGrantOriginOption(props.grantOrigin))\n</script>\n\n<template>\n <VChip\n v-if=\"grantOption\"\n :color=\"grantOption.color\"\n label\n size=\"small\"\n >\n {{ grantOption.title }}\n <span\n v-if=\"grantOrigin !== GrantOriginDefault\"\n class=\"ml-1\"\n >({{ grantOriginOption?.title }})</span>\n </VChip>\n</template>\n","import { ref } from 'vue'\nimport type { AnzuUser } from '@/types/AnzuUser'\n\nconst currentUsers = ref<Map<string, AnzuUser | undefined>>(new Map())\nconst currentUsersLoaded = ref<Map<string, undefined | true>>(new Map())\n\nexport const useAuthStore = () => {\n function getCurrentUserBySystem(system: string) {\n return currentUsers.value.get(system)\n }\n\n function isCurrentUserLoadedBySystem(system: string) {\n return currentUsersLoaded.value.get(system)\n }\n\n function reset() {\n currentUsers.value.clear()\n currentUsersLoaded.value.clear()\n }\n\n return {\n currentUsers,\n currentUsersLoaded,\n getCurrentUserBySystem,\n isCurrentUserLoadedBySystem,\n reset,\n }\n}\n","import { isUndefined } from '@/utils/common'\n\nexport const objectDeepFreeze = <T>(obj: T) => {\n const propNames = Object.getOwnPropertyNames(obj)\n for (const name of propNames) {\n const value = (obj as any)[name]\n if (value && typeof value === 'object') {\n objectDeepFreeze(value)\n }\n }\n return Object.freeze(obj)\n}\n\nexport const objectGetValues = <T>(obj: { [key: string]: T }): T[] => {\n return Object.keys(obj).map((k) => obj[k])\n}\n\nexport const objectGetValueByPath = <R = any>(obj: any, path: string, splitChar = '.') => {\n const a = path.split(splitChar)\n let o = obj\n while (a.length) {\n const n = a.shift()\n if (isUndefined(n) || !(n in o)) return\n o = o[n]\n }\n return o as R\n}\n\nexport const objectSetValueByPath = (obj: any, path: string, value: any, splitChar = '.') => {\n const a = path.split(splitChar)\n let o = obj\n while (a.length - 1) {\n const n = a.shift()\n if (isUndefined(n)) return // todo check if correct if\n if (!(n in o)) o[n] = {}\n o = o[n]\n }\n o[a[0]] = value\n}\n\nexport function objectDeletePropertyByPath<T>(obj: T, path: string, splitChar = '.'): T {\n const pathParts = path.split(splitChar)\n const lastIndex = pathParts.length - 1\n\n function recurse(obj: any, index = 0) {\n const key = pathParts[index]\n\n if (index === lastIndex) {\n delete obj[key]\n return\n }\n\n recurse(obj[key], index + 1)\n }\n\n recurse(obj)\n return obj\n}\n\nexport type Immutable<T> = {\n readonly [K in keyof T]: Immutable<T[K]>\n}\n","import type { IntegerId } from '@/types/common'\nimport { isObject } from '@/utils/common'\n\nexport interface OwnerAware {\n owners: IntegerId[]\n}\n\nexport const isOwnerAware = (value: unknown): value is OwnerAware => {\n return isObject(value) && Object.hasOwn(value, 'owners')\n}\n","import type { IntegerIdNullable } from '@/types/common'\n\nexport interface CreatedByAware {\n createdBy: IntegerIdNullable\n}\n\nexport const isCreatedByAware = (value: object): value is CreatedByAware => {\n return Object.hasOwn(value, 'createdBy')\n}\n","import { stringUrlTemplateReplace } from '@/utils/string'\nimport { isEmptyObject } from '@/utils/common'\n\nexport type UrlParams = {\n [key: string]: number | string\n}\n\nexport const replaceUrlParameters = (urlTemplate: string, urlParams: UrlParams, overrideUrlTemplate = '') => {\n if (isEmptyObject(urlParams)) return urlTemplate\n return stringUrlTemplateReplace(overrideUrlTemplate === '' ? urlTemplate : overrideUrlTemplate, urlParams)\n}\n","import { HTTP_STATUS_VALID_ALL } from '@/composables/statusCodes'\n\nexport const isValidHTTPStatus = (statusCode: number) => {\n return HTTP_STATUS_VALID_ALL.includes(statusCode)\n}\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\n/**\n * @template R Response type\n */\nexport const apiFetchOne = <R>(\n client: () => AxiosInstance,\n urlTemplate: string,\n urlParams: UrlParams = {},\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n client()\n .get(replaceUrlParameters(urlTemplate, urlParams), options)\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n return resolve(res.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve(null as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import { computed } from 'vue'\nimport { useAuthStore } from '@/composables/auth/authStore'\nimport { type AxiosInstance } from 'axios'\nimport type { AclValue } from '@/types/Permission'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { objectGetValueByPath } from '@/utils/object'\nimport { Grant } from '@/model/valueObject/Grant'\nimport { isOwnerAware } from '@/types/OwnerAware'\nimport { isCreatedByAware } from '@/types/CreatedByAware'\nimport type { AnzuUser } from '@/types/AnzuUser'\nimport type { UrlParams } from '@/services/api/apiHelper'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\n\nexport const ROLE_SUPER_ADMIN = 'ROLE_SUPER_ADMIN'\n\n/**\n * @param mainCurrentUserSystem - By this system currentUser object is used to get user ID.\n */\nexport function defineAuth<TAclValue extends AclValue>(mainCurrentUserSystem: string) {\n const authStore = useAuthStore()\n\n const getSystemFromAcl = (acl: TAclValue) => {\n const parts = acl.split('_')\n return parts[0]\n }\n\n const isAdmin = (userRoles: string[]) => {\n return userRoles.includes(ROLE_SUPER_ADMIN)\n }\n\n const can = (acl: TAclValue, subject?: object) => {\n const system = getSystemFromAcl(acl)\n const user = authStore.getCurrentUserBySystem(system)\n const userIsLoaded = authStore.isCurrentUserLoadedBySystem(system)\n if (isUndefined(userIsLoaded)) {\n throw new Error('Composable defineAuth must try to load currentUser first to use can function.')\n }\n if (isUndefined(user) || isUndefined(user.id) || isNull(user.id) || user.id === 0) {\n return false\n }\n if (isAdmin(user.roles)) return true\n const permission = objectGetValueByPath(user, 'resolvedPermissions.' + acl)\n if (isUndefined(permission)) return false\n switch (permission) {\n case Grant.Allow:\n return true\n case Grant.Deny:\n return false\n case Grant.AllowOwner:\n if (isUndefined(subject))\n throw new Error(`Required subject for acl \"${acl}\" to determine an ability to access the resource.`)\n return canOwner(subject)\n default:\n return false\n }\n }\n\n function canOwner(subject: object) {\n const user = authStore.getCurrentUserBySystem(mainCurrentUserSystem)\n const userIsLoaded = authStore.isCurrentUserLoadedBySystem(mainCurrentUserSystem)\n if (isUndefined(userIsLoaded)) {\n throw new Error('Composable defineAuth must try to load currentUser first to use canOwner function.')\n }\n if (isUndefined(user) || isUndefined(user.id) || isNull(user.id) || user.id === 0) {\n return false\n }\n if (isOwnerAware(subject)) {\n return subject.owners.includes(user.id)\n }\n if (isCreatedByAware(subject)) {\n return subject.createdBy === user.id\n }\n return false\n }\n\n const canForAll = (acls: TAclValue[], subject?: object) => {\n if (acls.length === 0) {\n return true\n }\n return acls.every((acl) => {\n return can(acl, subject)\n })\n }\n\n const canForSome = (acls: TAclValue[], subject?: object) => {\n if (acls.length === 0) {\n return true\n }\n return acls.some((acl) => {\n return can(acl, subject)\n })\n }\n\n const currentUserId = computed(() => {\n const user = authStore.getCurrentUserBySystem(mainCurrentUserSystem)\n const userIsLoaded = authStore.isCurrentUserLoadedBySystem(mainCurrentUserSystem)\n if (isUndefined(userIsLoaded)) {\n return undefined\n }\n if (isUndefined(user) || isUndefined(user.id) || isNull(user.id) || user.id === 0) {\n return undefined\n }\n return user.id\n })\n\n function useCurrentUser<TCurrentUser extends AnzuUser | undefined>(system: string) {\n const setCurrentUser = (user: TCurrentUser) => {\n authStore.currentUsers.value.set(system, user)\n authStore.currentUsersLoaded.value.set(system, true)\n }\n\n const currentUser = computed((): TCurrentUser | undefined => {\n return authStore.currentUsers.value.get(system) as TCurrentUser | undefined\n })\n\n const isCurrentUserLoaded = computed((): boolean | undefined => {\n return authStore.currentUsersLoaded.value.get(system) as boolean | undefined\n })\n\n const isSuperAdmin = computed(() => {\n if (currentUser.value) {\n return isAdmin(currentUser.value.roles)\n }\n return false\n })\n\n const hasCurrentUser = computed(() => {\n return currentUser.value ?? false\n })\n\n const isAnonymous = computed(() => {\n if (isUndefined(isCurrentUserLoaded.value)) return undefined\n return !hasCurrentUser.value\n })\n\n const fetchCurrentUser = async (\n client: () => AxiosInstance,\n endPoint = '/adm/v1/users/current',\n urlParams: UrlParams | undefined = undefined,\n entity = 'user'\n ) => {\n try {\n const res = await apiFetchOne<TCurrentUser>(client, endPoint, urlParams, system, entity)\n setCurrentUser(res)\n authStore.currentUsersLoaded.value.set(system, true)\n return currentUser.value\n } catch (error) {\n authStore.currentUsersLoaded.value.set(system, true)\n return undefined\n }\n }\n\n return {\n currentUser,\n setCurrentUser,\n isSuperAdmin,\n isAnonymous,\n hasCurrentUser,\n fetchCurrentUser,\n }\n }\n\n return {\n can,\n canForAll,\n canForSome,\n useCurrentUser,\n currentUserId,\n }\n}\n","<script lang=\"ts\" setup generic=\"TAclValue extends AclValue\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport type { AclValue } from '@/types/Permission'\nimport { defineAuth } from '@/composables/auth/defineAuth'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n permission: TAclValue\n subject?: object\n }>(),\n {\n subject: undefined,\n }\n)\n\nconst allowed = ref<boolean>(false)\n\nconst system = computed(() => {\n const parts = props.permission.split('_')\n return parts[0] || ''\n})\n\nonMounted(() => {\n const { can, useCurrentUser } = defineAuth<AclValue>(system.value)\n\n const { currentUser } = useCurrentUser(system.value)\n\n watch(\n currentUser,\n (newValue) => {\n if (!isUndefined(newValue)) {\n allowed.value = can(props.permission, props.subject)\n }\n },\n {\n immediate: true,\n }\n )\n})\n</script>\n\n<template>\n <slot v-if=\"allowed\" />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { dateTimePretty } from '@/utils/datetime'\nimport type { DatetimeUTCNullable } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n dateTime: DatetimeUTCNullable\n edgeDateValue?: string\n }>(),\n {\n edgeDateValue: 'n/a',\n }\n)\n\nconst pretty = computed(() => {\n return dateTimePretty(props.dateTime, props.edgeDateValue)\n})\n</script>\n\n<template>\n {{ pretty }}\n</template>\n","import { between, createI18nMessage } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateBetween() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(between, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.between',\n })\n}\n","import { createI18nMessage, email } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateEmail() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(email, {\n messagePath: () => 'error.jsValidation.email',\n })\n}\n","import { createI18nMessage, maxLength } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateMaxLength() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(maxLength, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.maxLength',\n })\n}\n","import { createI18nMessage, maxValue } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateMaxValue() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(maxValue, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.maxValue',\n })\n}\n","import { createI18nMessage, minLength } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateMinLength() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(minLength, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.minLength',\n })\n}\n","import { createI18nMessage, minValue } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateMinValue() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(minValue, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.minValue',\n })\n}\n","import { createI18nMessage, numeric } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateNumeric() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(numeric, {\n messagePath: () => 'error.jsValidation.numeric',\n })\n}\n","import { createI18nMessage, required } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateRequired() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(required, {\n messagePath: () => 'error.jsValidation.required',\n })\n}\n","import { createI18nMessage, requiredIf } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateRequiredIf() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(requiredIf, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.required',\n })\n}\n","import { createI18nMessage, helpers } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateSlug() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(helpers.regex(/^[a-z\\-0-9]+$/), {\n messagePath: () => 'error.jsValidation.slug',\n })\n}\n","import { createI18nMessage, helpers } from '@vuelidate/validators'\nimport { unref } from 'vue'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateStringArrayItemLength() {\n const withI18nMessage = createI18nMessage({ t })\n\n const stringArrayItemLengthValidator = (min: number, max: number) => {\n return (value: string[]) =>\n !helpers.req(value) || value.every((item) => item.length >= unref(min) && item.length <= unref(max))\n }\n const stringArrayItemLengthHelper = (min: number, max: number) => {\n return {\n $validator: stringArrayItemLengthValidator(min, max),\n // $message not required when using i18n\n // $message: (input: { $params: Record<string, any> }) => {\n // const { $params } = input\n // return `Item length in list must have between ${$params.min} and ${$params.max} characters.`\n // },\n $params: {\n min,\n max,\n type: 'stringArrayItemLength',\n },\n }\n }\n\n return withI18nMessage(stringArrayItemLengthHelper, {\n withArguments: true,\n messagePath: () => 'error.jsValidation.stringArrayItemLength',\n })\n}\n","import { createI18nMessage, url } from '@vuelidate/validators'\nimport { i18n } from '@/plugins/i18n'\n\nconst { t } = i18n.global\n\nexport function useValidateUrl() {\n const withI18nMessage = createI18nMessage({ t })\n\n return withI18nMessage(url, {\n messagePath: () => 'error.jsValidation.url',\n })\n}\n","import { useValidateBetween } from '@/validators/vuelidate/common/useValidateBetween'\nimport { useValidateEmail } from '@/validators/vuelidate/common/useValidateEmail'\nimport { useValidateMaxLength } from '@/validators/vuelidate/common/useValidateMaxLength'\nimport { useValidateMaxValue } from '@/validators/vuelidate/common/useValidateMaxValue'\nimport { useValidateMinLength } from '@/validators/vuelidate/common/useValidateMinLength'\nimport { useValidateMinValue } from '@/validators/vuelidate/common/useValidateMinValue'\nimport { useValidateNumeric } from '@/validators/vuelidate/common/useValidateNumeric'\nimport { useValidateRequired } from '@/validators/vuelidate/common/useValidateRequired'\nimport { useValidateRequiredIf } from '@/validators/vuelidate/common/useValidateRequiredIf'\nimport { useValidateSlug } from '@/validators/vuelidate/common/useValidateSlug'\nimport { useValidateStringArrayItemLength } from '@/validators/vuelidate/common/useValidateStringArrayItemLength'\nimport { useValidateUrl } from '@/validators/vuelidate/common/useValidateUrl'\n\nexport function useValidate() {\n return {\n required: useValidateRequired(),\n requiredIf: useValidateRequiredIf(),\n minLength: useValidateMinLength(),\n maxLength: useValidateMaxLength(),\n minValue: useValidateMinValue(),\n maxValue: useValidateMaxValue(),\n between: useValidateBetween(),\n email: useValidateEmail(),\n numeric: useValidateNumeric(),\n slug: useValidateSlug(),\n url: useValidateUrl(),\n stringArrayItemLength: useValidateStringArrayItemLength(),\n }\n}\n","<script setup lang=\"ts\">\nimport { nextTick, ref, watch } from 'vue'\n\nconst modelValue = defineModel<null | { hours: number; minutes: number }>('modelValue', {\n required: true,\n})\n\nconst hours = ref<string | undefined>(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n modelValue.value ? String(modelValue.value.hours).padStart(2, '0') : '12'\n)\nconst minutes = ref<string | undefined>(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n modelValue.value ? String(modelValue.value.minutes).padStart(2, '0') : '00'\n)\n\nconst hoursRef = ref<HTMLInputElement | null>(null)\n\nconst selectContent = async (event: FocusEvent) => {\n const target = event.target as HTMLInputElement | null\n await nextTick()\n target?.select()\n}\n\nconst onBlurHours = () => {\n const parsedHours = parseInt(hours.value || '0')\n hours.value = parsedHours >= 0 && parsedHours <= 23 ? String(parsedHours).padStart(2, '0') : '00'\n}\n\nconst onBlurMinutes = () => {\n const parsedMinutes = parseInt(minutes.value || '0')\n minutes.value = parsedMinutes >= 0 && parsedMinutes <= 59 ? String(parsedMinutes).padStart(2, '0') : '00'\n}\n\nconst increaseHours = () => {\n const parsedHours = parseInt(hours.value || '0')\n const newHours = isNaN(parsedHours) ? 1 : (parsedHours + 1) % 24\n hours.value = String(newHours).padStart(2, '0')\n}\n\nconst decreaseHours = () => {\n const parsedHours = parseInt(hours.value || '0')\n const newHours = isNaN(parsedHours) ? 23 : (parsedHours - 1 + 24) % 24\n hours.value = String(newHours).padStart(2, '0')\n}\n\nconst increaseMinutes = () => {\n const parsedMinutes = parseInt(minutes.value || '0')\n const newMinutes = isNaN(parsedMinutes) ? 1 : (parsedMinutes + 1) % 60\n minutes.value = String(newMinutes).padStart(2, '0')\n}\n\nconst decreaseMinutes = () => {\n const parsedMinutes = parseInt(minutes.value || '0')\n const newMinutes = isNaN(parsedMinutes) ? 59 : (parsedMinutes - 1 + 60) % 60\n minutes.value = String(newMinutes).padStart(2, '0')\n}\n\nconst focus = () => {\n hoursRef.value?.focus()\n}\n\nwatch([hours, minutes], ([newHours, newMinutes], [oldHours, oldMinutes]) => {\n if (newHours === oldHours && newMinutes === oldMinutes) return\n const hoursInt = parseInt(newHours ?? (modelValue.value ? modelValue.value.hours.toString() : '12'))\n const minutesInt = parseInt(newMinutes ?? (modelValue.value ? modelValue.value.minutes.toString() : '0'))\n if (hoursInt >= 0 && hoursInt <= 23 && minutesInt >= 0 && minutesInt <= 59) {\n modelValue.value = { hours: hoursInt, minutes: minutesInt }\n }\n})\n\ndefineExpose({\n focus,\n})\n</script>\n\n<template>\n <div class=\"a-datetime-picker-time\">\n <div class=\"a-datetime-picker-time__item a-datetime-picker-time__item\">\n <input\n ref=\"hoursRef\"\n v-model=\"hours\"\n class=\"a-datetime-picker-time__input a-datetime-picker-time__input--hours\"\n type=\"number\"\n aria-label=\"Hour\"\n tabindex=\"-1\"\n step=\"1\"\n min=\"0\"\n max=\"23\"\n maxlength=\"2\"\n @focus=\"selectContent\"\n @blur=\"onBlurHours\"\n >\n <div class=\"a-datetime-picker-time__arrows\">\n <VIcon\n icon=\"mdi-chevron-up\"\n class=\"a-datetime-picker-time__arrow-up\"\n @click=\"increaseHours\"\n />\n <VIcon\n icon=\"mdi-chevron-down\"\n class=\"a-datetime-picker-time__arrow-down\"\n @click=\"decreaseHours\"\n />\n </div>\n </div>\n <span class=\"a-datetime-picker-time__separator\">:</span>\n <div class=\"a-datetime-picker-time__item\">\n <input\n v-model=\"minutes\"\n class=\"a-datetime-picker-time__input a-datetime-picker-time__input--minutes\"\n type=\"number\"\n aria-label=\"Minute\"\n tabindex=\"-1\"\n step=\"1\"\n min=\"0\"\n max=\"59\"\n maxlength=\"2\"\n @focus=\"selectContent\"\n @blur=\"onBlurMinutes\"\n >\n <div class=\"a-datetime-picker-time__arrows\">\n <VIcon\n icon=\"mdi-chevron-up\"\n class=\"a-datetime-picker-time__arrow-up\"\n @click=\"increaseMinutes\"\n />\n <VIcon\n icon=\"mdi-chevron-down\"\n class=\"a-datetime-picker-time__arrow-down\"\n @click=\"decreaseMinutes\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n$hover-bg-color: rgba(0 0 0 / 5%);\n\n.a-datetime-picker-time {\n display: flex;\n\n &__item {\n flex-grow: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 40px;\n\n &:hover {\n background-color: $hover-bg-color;\n }\n }\n\n &__separator {\n font-weight: bold;\n font-size: 1.2rem;\n text-align: center;\n font-family: Roboto, sans-serif;\n min-height: 40px;\n padding: 0 5px;\n display: flex;\n align-items: center;\n }\n\n &__arrows {\n display: flex;\n flex-direction: column;\n visibility: hidden;\n\n .a-datetime-picker-time__item:hover & {\n visibility: visible;\n }\n\n .v-icon {\n cursor: pointer;\n\n &:hover {\n background-color: $hover-bg-color;\n }\n }\n }\n\n &__input {\n width: 100%;\n height: 100%;\n display: inline-block;\n background: transparent;\n /* stylelint-disable-next-line */\n -webkit-box-shadow: none;\n box-shadow: none;\n border: 0;\n border-radius: 0;\n text-align: center;\n margin: 0;\n padding: 0;\n line-height: inherit;\n font-size: 1rem;\n position: relative;\n /* stylelint-disable-next-line */\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n /* stylelint-disable-next-line */\n -webkit-appearance: textfield;\n /* stylelint-disable-next-line */\n -moz-appearance: textfield;\n appearance: textfield;\n outline: none;\n\n &--hours {\n font-weight: bold;\n }\n }\n\n &__input::-webkit-inner-spin-button,\n &__input::-webkit-outer-spin-button {\n /* stylelint-disable-next-line */\n -webkit-appearance: none;\n margin: 0;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { DatetimeUTC } from '@/types/common'\nimport { computed, nextTick, ref, toRaw, watch } from 'vue'\nimport { isDefined, isNull, isUndefined } from '@/utils/common'\nimport useVuelidate, { type ErrorObject } from '@vuelidate/core'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport TimePicker from '@/components/datetime/TimePicker.vue'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport { SUFFIX } from '@/utils/datetime'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTC | null | undefined\n type?: 'datetime'\n label?: string\n hideLabel?: boolean\n clearable?: boolean\n disabled?: boolean\n hideDetails?: boolean\n required?: boolean\n hideSetToNow?: boolean\n placeholder?: string\n dataCy?: string\n defaultValue?: DatetimeUTC | null | undefined\n errorMessages?: string[]\n }>(),\n {\n type: 'datetime',\n label: '',\n hideLabel: false,\n clearable: false,\n disabled: false,\n hideDetails: false,\n required: false,\n hideSetToNow: false,\n placeholder: '',\n dataCy: '',\n defaultValue: null,\n errorMessages: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'blur'): void\n (e: 'focus'): void\n (e: 'update:modelValue', data: DatetimeUTC | null | undefined): void\n (e: 'onOpen'): void\n (e: 'onClose'): void\n}>()\n\ndayjs.extend(utc)\ndayjs.extend(customParseFormat)\n\ntype TextFieldRef = null | { $el: HTMLElement }\n\nconst pickerOpened = ref(false)\nconst pickerKey = ref(0)\nconst timeKey = ref(0)\nconst textFieldRef = ref<TextFieldRef>(null)\nconst textFieldValue = ref('')\n\nconst datePickerValue = ref<null | Date>(null)\nconst timePickerValue = ref<null | { hours: number; minutes: number }>(null)\nconst datetimeInternal = ref<null | dayjs.Dayjs>(null)\n\nconst { t } = useI18n()\n\nconst placeholderComputed = computed(() => {\n return props.type === 'datetime' ? 'dd.mm.yyyy hh:mm' : 'dd.mm.yyyy'\n})\n\nconst { requiredIf } = useValidate()\nconst rules = computed(() => {\n return {\n textFieldValue: {\n required: requiredIf(props.required),\n },\n }\n})\nconst v$ = useVuelidate(rules, { textFieldValue })\n\nconst displayFormat = computed(() => {\n return props.type === 'datetime' ? 'DD.MM.YYYY HH:mm' : 'DD.MM.YYYY'\n})\n\nconst updateDateAndTimePickerOnlyWhenChanged = (newValue: dayjs.Dayjs | null) => {\n if (isNull(newValue)) return\n if (\n isNull(timePickerValue.value) ||\n newValue.hour() !== timePickerValue.value.hours ||\n newValue.minute() !== timePickerValue.value.minutes\n ) {\n timePickerValue.value = { hours: newValue.hour(), minutes: newValue.minute() }\n }\n if (\n isNull(datePickerValue.value) ||\n newValue.year() !== datePickerValue.value.getFullYear() ||\n newValue.month() !== datePickerValue.value.getMonth() ||\n newValue.date() !== datePickerValue.value.getDate()\n ) {\n datePickerValue.value = newValue.toDate()\n }\n}\n\nwatch(\n () => props.modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isNull(newValue) || isUndefined(newValue)) {\n datetimeInternal.value = null\n return\n }\n datetimeInternal.value = dayjs(newValue, 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ').millisecond(0)\n },\n { immediate: true }\n)\n\nconst watchDatePicker = (newValue: null | Date, internal: dayjs.Dayjs) => {\n if (isNull(newValue)) return internal\n return internal.set('date', newValue.getDate()).set('month', newValue.getMonth()).set('year', newValue.getFullYear())\n}\n\nconst watchTimePicker = (newValue: null | { hours: number; minutes: number }, internal: dayjs.Dayjs) => {\n if (isNull(newValue)) return internal\n return internal.set('hour', newValue.hours).set('minute', newValue.minutes)\n}\n\nwatch([timePickerValue, datePickerValue], ([newTimePickerValue, newDatePickerValue]) => {\n let newDate: dayjs.Dayjs | null = null\n\n if (!isNull(datetimeInternal.value)) {\n newDate = datetimeInternal.value\n } else if (!isNull(props.modelValue)) {\n newDate = dayjs(props.modelValue, 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ')\n } else {\n newDate = dayjs().hour(0).minute(0).second(0).millisecond(0)\n }\n\n newDate = watchTimePicker(newTimePickerValue, newDate!)\n newDate = watchDatePicker(newDatePickerValue, newDate!)\n if (newDate.isSame(toRaw(datetimeInternal.value))) return\n datetimeInternal.value = newDate\n})\n\nwatch(\n datetimeInternal,\n (newValue) => {\n if (isNull(newValue)) {\n textFieldValue.value = ''\n emit('update:modelValue', null)\n return\n }\n const newUtcValue = newValue.utc().format('YYYY-MM-DDTHH:mm:ss') + SUFFIX\n textFieldValue.value = newValue.format(displayFormat.value)\n updateDateAndTimePickerOnlyWhenChanged(newValue)\n if (newUtcValue === props.modelValue) return\n emit('update:modelValue', newUtcValue)\n },\n { immediate: true }\n)\n\nwatch(pickerOpened, (newValue) => {\n if (newValue) {\n onTextFieldBlur()\n nextTick(() => {\n pickerKey.value++\n })\n emit('onOpen')\n return\n }\n emit('onClose')\n})\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessages)) return props.errorMessages\n if (v$.value.textFieldValue.$errors.length)\n return [v$.value.textFieldValue.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst onTextFieldBlur = () => {\n const filtered = textFieldValue.value.replace(/[^\\s\\d.:]/g, '').trim()\n if (filtered.length === 0 && !props.required) {\n datetimeInternal.value = null\n emit('blur')\n return\n }\n const parsed = dayjs(filtered, ['DD.MM.YYYY HH:mm', 'DD.MM.YYYY'])\n if (parsed.isValid()) {\n // keep seconds from original model\n let seconds = 0\n if(!isNull(props.modelValue)) {\n const modelDate = dayjs(props.modelValue, 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ')\n if (modelDate.isValid()) seconds = modelDate.second()\n }\n datetimeInternal.value = parsed.second(seconds)\n v$.value.textFieldValue.$touch()\n emit('blur')\n return\n }\n if (!isNull(datetimeInternal.value)) {\n textFieldValue.value = datetimeInternal.value.format(displayFormat.value)\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n}\n\nconst onClear = () => {\n if (isNull(props.defaultValue) || isUndefined(props.defaultValue)) {\n datetimeInternal.value = null\n datePickerValue.value = null\n timePickerValue.value = null\n return\n }\n datetimeInternal.value = dayjs(props.defaultValue, 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ')\n}\n\nconst onTextFieldFocus = () => {\n emit('focus')\n}\n\nconst now = () => {\n datetimeInternal.value = dayjs().second(0).millisecond(0)\n nextTick(() => {\n pickerKey.value++\n timeKey.value++\n })\n}\n</script>\n\n<template>\n <VTextField\n ref=\"textFieldRef\"\n v-model=\"textFieldValue\"\n :error-messages=\"errorMessageComputed\"\n :persistent-placeholder=\"true\"\n :placeholder=\"placeholderComputed\"\n class=\"a-datetime-picker\"\n :disabled=\"disabled\"\n @blur=\"onTextFieldBlur\"\n @focus=\"onTextFieldFocus\"\n @keyup.enter=\"onTextFieldBlur\"\n >\n <template #append-inner>\n <VIcon\n v-if=\"clearable && defaultValue !== modelValue\"\n class=\"a-datetime-picker__clearable-icon\"\n icon=\"mdi-close-circle\"\n @click.stop=\"onClear\"\n />\n <VMenu\n v-if=\"!disabled\"\n location=\"bottom end\"\n origin=\"top end\"\n :close-on-content-click=\"false\"\n @update:model-value=\"(value: boolean) => (pickerOpened = value)\"\n >\n <template #activator=\"{ props: menuProps }\">\n <VIcon\n class=\"a-datetime-picker__calendar-icon\"\n icon=\"mdi-calendar\"\n size=\"small\"\n v-bind=\"menuProps\"\n />\n </template>\n\n <VCard v-if=\"pickerOpened\">\n <VDatePicker\n :key=\"pickerKey\"\n v-model=\"datePickerValue\"\n class=\"a-datetime-picker-calendar\"\n color=\"primary\"\n show-adjacent-months\n />\n <TimePicker\n :key=\"timeKey\"\n v-model=\"timePickerValue\"\n />\n <button\n type=\"button\"\n class=\"a-datetime-picker__now-button\"\n tabindex=\"-1\"\n @click=\"now\"\n >\n {{ t('common.time.now') }}\n </button>\n </VCard>\n </VMenu>\n\n <div class=\"ml-1\">\n <slot name=\"append-inner\" />\n </div>\n </template>\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ label\n }}<span\n v-if=\"required\"\n class=\"required\"\n />\n </template>\n </VTextField>\n</template>\n\n<style lang=\"scss\" scoped>\n.a-datetime-picker {\n :deep(.v-field__append-inner .v-icon) {\n cursor: pointer;\n }\n\n &__calendar-icon {\n margin-top: 2px;\n opacity: 0.6 !important;\n }\n\n &__clearable-icon {\n opacity: 0 !important;\n }\n\n &:hover {\n .a-datetime-picker__clearable-icon {\n opacity: 0.6 !important;\n }\n }\n\n &__now-button {\n width: 100%;\n text-align: center;\n font-size: 0.86rem;\n font-family: Roboto, sans-serif;\n font-weight: bold;\n line-height: 1.8;\n padding: 6px 0;\n\n &:hover {\n background-color: rgba(0 0 0 / 5%);\n }\n }\n}\n\n.a-datetime-picker-calendar {\n :deep(.v-picker-title) {\n display: none;\n }\n\n :deep(.v-date-picker-header) {\n padding-top: 12px;\n }\n\n :deep(.v-date-picker-month) {\n padding-bottom: 2px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/types/common'\nimport type { CollabComponentConfig, CollabFieldData } from '@/components/collab/types/Collab'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/components/datetime/ADatetimePicker.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n label?: string\n errorMessage?: string\n required?: boolean\n v?: any\n dataCy?: string\n clearable?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n collab: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null | undefined): void\n (e: 'blur', data: string | number | null | undefined): void\n (e: 'focus', data: string | number | null | undefined): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n changeCollabFieldData,\n acquireCollabFieldLock,\n lockedByUser,\n\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst isOpened = ref(false)\nconst isFocused = ref(false)\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n releaseFieldLock.value(props.modelValue)\n isOpened.value = true\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', isUndefined(props.modelValue) ? null : props.modelValue)\n props.v?.$touch()\n if (isOpened.value === false) releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if (props.v?.required && props.v?.required.$params.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && (isFocused.value || isOpened.value)) {\n changeFieldData.value(newValue)\n }\n})\n</script>\n\n<template>\n <ADatetimePicker\n v-model=\"modelValueComputed\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :required=\"requiredComputed\"\n :disabled=\"disabledComputed\"\n :label=\"labelComputed\"\n :clearable=\"clearable\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @on-open=\"onOpen\"\n @on-close=\"onClose\"\n >\n <template #append-inner>\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n </ADatetimePicker>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport { isDefined, isFunction, isNull, isUndefined } from '@/utils/common'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/types/common'\nimport { dateTimeNow } from '@/utils/datetime'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/components/collab/types/Collab'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/components/datetime/ADatetimePicker.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n label?: string\n errorMessage?: string\n v?: any\n dataCy?: string\n clearable?: boolean\n defaultActivationValue?: DatetimeUTCNullable | 'now' | (() => DatetimeUTCNullable)\n collab?: CollabComponentConfig\n disabled?: boolean\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n defaultActivationValue: 'now',\n collab: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null): void\n (e: 'blur', data: string | number | null): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n changeCollabFieldData,\n acquireCollabFieldLock,\n lockedByUser,\n\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst checkboxModel = ref(false)\nconst isFocused = ref(false)\nconst isOpened = ref(false)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', isUndefined(props.modelValue) ? null : props.modelValue)\n props.v?.$touch()\n if (isOpened.value === false) releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n isFocused.value = true\n acquireFieldLock.value()\n}\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n isOpened.value = false\n releaseFieldLock.value(props.modelValue)\n}\n\nconst errorMessageComputed = computed(() => {\n if (!isUndefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nwatch(\n modelValueComputed,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isNull(newValue) || isUndefined(newValue)) {\n checkboxModel.value = false\n return\n }\n checkboxModel.value = true\n },\n { immediate: true }\n)\n\n/**\n * @param oldValue state before click\n */\nconst onCheckboxClick = (oldValue: boolean) => {\n acquireFieldLock.value()\n setTimeout(() => {\n if (isFocused.value === false) releaseFieldLock.value(props.modelValue)\n }, 500)\n if (oldValue) {\n modelValueComputed.value = null\n return\n }\n if (props.defaultActivationValue === 'now') {\n modelValueComputed.value = dateTimeNow()\n return\n }\n if (isFunction(props.defaultActivationValue)) {\n modelValueComputed.value = props.defaultActivationValue()\n return\n }\n modelValueComputed.value = props.defaultActivationValue\n}\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && (isFocused.value || isOpened.value)) {\n changeFieldData.value(newValue)\n }\n})\n</script>\n\n<template>\n <div class=\"d-flex justify-space-between\">\n <VCheckboxBtn\n v-model=\"checkboxModel\"\n :label=\"labelComputed\"\n :disabled=\"disabledComputed\"\n @click.stop=\"onCheckboxClick(checkboxModel)\"\n />\n <div style=\"opacity: 0.5\">\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </div>\n </div>\n <VExpandTransition>\n <div v-show=\"checkboxModel\">\n <ADatetimePicker\n v-model=\"modelValueComputed\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :clearable=\"clearable\"\n :disabled=\"disabledComputed\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @on-open=\"onOpen\"\n @on-close=\"onClose\"\n >\n <template #append-inner />\n </ADatetimePicker>\n </div>\n </VExpandTransition>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Filter } from '@/types/Filter'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport ADatetimePicker from '@/components/datetime/ADatetimePicker.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n dataCy?: string\n }>(),\n {\n dataCy: 'filter-datepicker',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n}>()\n\nconst value = computed({\n get() {\n return props.modelValue.model\n },\n set(newValue) {\n emit('update:modelValue', { ...props.modelValue, ...{ model: newValue } })\n },\n})\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n</script>\n\n<template>\n <ADatetimePicker\n v-model=\"value\"\n :data-cy=\"dataCy\"\n :clearable=\"!modelValue.mandatory\"\n :default-value=\"modelValue.default\"\n :label=\"label\"\n />\n</template>\n","import { computed, reactive } from 'vue'\nimport type { Pagination } from '@/types/Pagination'\n\nexport function usePagination(sortBy: string | null = 'id') {\n return reactive<Pagination>({\n sortBy: sortBy,\n descending: true,\n page: 1,\n rowsPerPage: 25,\n rowsNumber: 0,\n hasNextPage: null,\n currentViewCount: 0,\n totalCount: 0,\n })\n}\n\nexport function usePaginationAutoHide(pagination: Pagination) {\n const showPagination = computed(() => {\n if (pagination.page === 1 && pagination.currentViewCount < pagination.rowsPerPage) return false\n return true\n })\n\n return {\n showPagination,\n }\n}\n","<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, inject, type Ref, ref, toRefs, watch } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { usePagination } from '@/composables/system/pagination'\nimport { cloneDeep, isArray, isDefined, isNull, isUndefined } from '@/utils/common'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/types/common'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/components/collab/types/Collab'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\ntype fetchItemsByIdsType =\n | ((ids: IntegerId[]) => Promise<ValueObjectOption<IntegerId>[]>)\n | ((ids: DocId[]) => Promise<ValueObjectOption<DocId>[]>)\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: any\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (pagination: Pagination, filterBag: FilterBag) => Promise<ValueObjectOption<string | number>[]>\n fetchItemsByIds: fetchItemsByIdsType\n innerFilter: FilterBag\n filterByField?: string\n filterSortBy?: string | null\n disableInitFetch?: boolean | undefined\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n chips?: boolean\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterByField: 'name',\n filterSortBy: 'createdAt',\n disableInitFetch: false,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: DocId | IntegerId | DocId[] | IntegerId[] | null): void\n (e: 'focus', data: DocId | IntegerId | DocId[] | IntegerId[] | null): void\n}>()\n\nconst modelValue = defineModel<DocId | IntegerId | DocId[] | IntegerId[] | null | any>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<DocId | IntegerId | DocId[] | IntegerId[] | null | any>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueAutocomplete = ref<DocId | IntegerId | DocId[] | IntegerId[] | null | any>(null)\n\nconst apiRequestCounter = ref(0)\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n changeCollabFieldData,\n acquireCollabFieldLock,\n lockedByUser,\n\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst { t } = useI18n()\n\nconst { innerFilter } = toRefs(props)\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item: ErrorObject) => item.$message)\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return props.v?.required && props.v?.required.$params.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.multiple === false) return false\n return true as unknown as undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst pagination = usePagination(props.filterSortBy)\nconst fetchedItems = ref<ValueObjectOption<string | number>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<string | number>[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n selectedItemsCache.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n fetchedItems.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value.title, subtitle: value.subtitle }\n })\n})\n\nconst loadingLocal = ref(false)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n loadingLocal.value = true\n const filterField = innerFilter.value[props.filterByField]\n if (isUndefined(filterField)) {\n throw new Error('AFormRemoteAutocomplete incorrect innerFilter or filterByField setup.')\n }\n filterField.model = query\n const res = await props.fetchItems(pagination, innerFilter.value)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n loadingLocal.value = false\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (value: string | number | string[] | number[]) => {\n let count = 1\n let foundItems = []\n if (isArray(value)) {\n count = value.length\n foundItems = findLocalDataByValues(value)\n } else {\n foundItems = findLocalDataByValues([value])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n loadingLocal.value = true\n const res = await props.fetchItems(pagination, innerFilter.value)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n loadingLocal.value = false\n}\nconst onFocus = () => {\n isFocused.value = true\n clearAutoFetchTimer()\n autoFetch()\n emit('focus', modelValue.value)\n acquireFieldLock.value()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\nconst onSearchUpdate = (query: string) => {\n if (!props.multiple && !isFocused.value && query.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === query) return\n search.value = query\n}\n\nconst onClickClear = async () => {\n fetchedItems.value = await props.fetchItems(pagination, innerFilter.value)\n if (props.multiple) {\n modelValue.value = []\n return\n }\n modelValue.value = null\n}\n\nwatchDebounced(\n search,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n apiRequestCounter.value++\n apiSearch(newValue, apiRequestCounter.value)\n emit('searchChangeDebounced', newValue)\n }\n },\n { debounce: 300 }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst updateSelected = (newValue: any) => {\n if (isArray(newValue)) {\n return newValue.map((id: any) => {\n const foundObject = allItems.value.find((obj) => obj.value === id)\n return foundObject ? foundObject : { title: `${id}`, value: id }\n })\n }\n const found = allItems.value.find((item) => item.value === newValue)\n if (found) return found\n return { value: newValue, title: newValue }\n}\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(newValue) ? [] : null\n modelValueAutocomplete.value = isArray(newValue) ? [] : null\n if (props.disableInitFetch || autoFetched.value === true) return\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 2000)\n return\n }\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n const selectedNewValue = updateSelected(newValue)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return\n }\n if (isArray<IntegerId | DocId>(newValue)) {\n loadingLocal.value = true\n selectedItemsCache.value = await props.fetchItemsByIds(newValue as Array<IntegerId & DocId>)\n const selectedNewValue = updateSelected(newValue)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n loadingLocal.value = false\n return\n }\n loadingLocal.value = true\n selectedItemsCache.value = await props.fetchItemsByIds([newValue as DocId & IntegerId])\n const selectedNewValue = updateSelected(newValue)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n loadingLocal.value = false\n },\n { immediate: true }\n)\n\nconst onAutocompleteModelUpdate = (newValue: any) => {\n modelValueSelected.value = newValue\n if (isNull(newValue)) {\n modelValue.value = null\n return\n }\n if (isArray(newValue)) {\n modelValue.value = newValue.map((item: any) => item.value)\n return\n }\n modelValue.value = newValue.value\n}\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n return-object\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, item }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"item.raw.title\"\n :subtitle=\"item.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, item }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n size=\"small\"\n :text=\"`${item.title} (${item.raw.subtitle})`\"\n :disabled=\"item.props.disabled\"\n >\n {{ item.raw.title }}\n <span\n v-if=\"item.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ item.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"required\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport { isUndefined } from '@/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean\n callbackToTrue: () => Promise<boolean> // return true if successfully changed, otherwise return false\n callbackToFalse: () => Promise<boolean> // return true if successfully changed, otherwise return false\n label?: string | undefined\n hideDetails?: boolean | undefined\n hideLabel?: boolean | undefined\n v?: any\n }>(),\n {\n label: undefined,\n hideDetails: undefined,\n hideLabel: undefined,\n v: null,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n}>()\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst labelComputed = computed(() => {\n if (!isUndefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst loading = ref(false)\nconst hasError = ref(false)\nconst uniqueId = ref('')\n\nconst modelValueComputed = computed(() => {\n return props.modelValue\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst internalModelValue = ref(props.modelValue)\n\nconst onClick = async () => {\n if (loading.value) return\n loading.value = true\n hasError.value = false\n if (internalModelValue.value === true) {\n const success = await props.callbackToFalse()\n emit('update:modelValue', !success)\n internalModelValue.value = !success\n if (!success) hasError.value = true\n loading.value = false\n return\n }\n const success = await props.callbackToTrue()\n emit('update:modelValue', success)\n internalModelValue.value = success\n if (!success) hasError.value = true\n loading.value = false\n}\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n internalModelValue.value = newValue\n hasError.value = false\n }\n})\n\nonMounted(() => {\n uniqueId.value = 'remote-switch-' + Date.now()\n})\n</script>\n\n<template>\n <div class=\"d-flex\">\n <VCheckboxBtn\n :id=\"uniqueId\"\n v-model=\"internalModelValue\"\n :disabled=\"loading\"\n @click.stop=\"onClick\"\n />\n <label\n v-if=\"!hideLabel\"\n :for=\"uniqueId\"\n class=\"v-label v-label--clickable\"\n >\n {{ labelComputed }}\n </label>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport { isDefined } from '@/utils/common'\nimport type { CollabComponentConfig, CollabFieldData } from '@/components/collab/types/Collab'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport type { IntegerIdNullable } from '@/types/common'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean\n label?: string\n dataCy?: string\n hideLabel?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean\n }>(),\n {\n label: undefined,\n dataCy: undefined,\n hideLabel: false,\n collab: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'blur', data: boolean): void\n (e: 'focus', data: boolean): void\n}>()\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n acquireCollabFieldLock,\n lockedByUser,\n\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst onClick = () => {\n acquireFieldLock.value()\n setTimeout(() => {\n releaseFieldLock.value(props.modelValue)\n }, 500)\n}\n\nconst onUpdate = (newValue: boolean) => {\n emit('update:modelValue', newValue)\n}\nconst onBlur = () => {\n emit('blur', props.modelValue)\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n</script>\n\n<template>\n <VSwitch\n :data-cy=\"dataCy\"\n :model-value=\"modelValue\"\n :disabled=\"disabledComputed\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @update:model-value=\"onUpdate($event as unknown as boolean)\"\n @click.stop=\"onClick\"\n >\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ label }}\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n </VSwitch>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport { isUndefined } from '@/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean\n callbackToTrue: () => Promise<boolean> // return true if successfully changed, otherwise return false\n callbackToFalse: () => Promise<boolean> // return true if successfully changed, otherwise return false\n label?: string | undefined\n hideDetails?: boolean | undefined\n hideLabel?: boolean | undefined\n v?: any\n }>(),\n {\n label: undefined,\n hideDetails: undefined,\n hideLabel: undefined,\n v: null,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n}>()\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst labelComputed = computed(() => {\n if (!isUndefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst loading = ref(false)\nconst hasError = ref(false)\nconst uniqueId = ref('')\n\nconst modelValueComputed = computed(() => {\n return props.modelValue\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst internalModelValue = ref(props.modelValue)\n\nconst onClick = async () => {\n if (loading.value) return\n loading.value = true\n hasError.value = false\n if (internalModelValue.value === true) {\n const success = await props.callbackToFalse()\n emit('update:modelValue', !success)\n internalModelValue.value = !success\n if (!success) hasError.value = true\n loading.value = false\n return\n }\n const success = await props.callbackToTrue()\n emit('update:modelValue', success)\n internalModelValue.value = success\n if (!success) hasError.value = true\n loading.value = false\n}\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n internalModelValue.value = newValue\n hasError.value = false\n }\n})\n\nonMounted(() => {\n uniqueId.value = 'a-remote-switch-' + Date.now()\n})\n</script>\n\n<template>\n <div class=\"d-flex\">\n <VBtn\n :id=\"uniqueId\"\n icon\n class=\"a-switch-fix-click\"\n color=\"transparent\"\n :ripple=\"false\"\n :width=\"hideLabel ? 36 : undefined\"\n :height=\"36\"\n @click.stop=\"onClick\"\n >\n <VSwitch\n v-model=\"internalModelValue\"\n :loading=\"loading\"\n :disabled=\"loading\"\n :hide-details=\"hideDetails\"\n density=\"compact\"\n @click.stop=\"onClick\"\n >\n <template\n v-if=\"hasError\"\n #append\n >\n <VIcon\n icon=\"mdi-alert\"\n class=\"ml-5 mt-1\"\n size=\"x-small\"\n color=\"error\"\n />\n </template>\n </VSwitch>\n </VBtn>\n <label\n v-if=\"!hideLabel\"\n :for=\"uniqueId\"\n class=\"v-label v-label--clickable\"\n >\n {{ labelComputed }}\n </label>\n </div>\n</template>\n\n<style lang=\"scss\">\n.v-btn.a-switch-fix-click:hover > .v-btn__overlay {\n opacity: 0;\n max-height: 36px;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, watch } from 'vue'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { cloneDeep, isDefined, isUndefined } from '@/utils/common'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport { useI18n } from 'vue-i18n'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport type { CollabComponentConfig, CollabFieldData } from '@/components/collab/types/Collab'\nimport type { IntegerIdNullable } from '@/types/common'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n items: any[]\n label?: string\n errorMessage?: string\n required?: boolean\n v?: any\n hideLabel?: boolean\n multiple?: boolean\n hideDetails?: boolean\n clearable?: boolean\n dataCy?: string\n collab?: CollabComponentConfig\n disabled?: boolean\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n hideLabel: false,\n multiple: false,\n hideDetails: false,\n clearable: false,\n dataCy: '',\n collab: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'blur', data: any): void\n (e: 'focus', data: any): void\n}>()\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue) {\n emit('update:modelValue', cloneDeep<any>(newValue))\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const {\n releaseCollabFieldLock,\n changeCollabFieldData,\n acquireCollabFieldLock,\n lockedByUser,\n\n } = useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst { t } = useI18n()\n\nconst isFocused = ref(false)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', props.modelValue)\n props.v?.$touch()\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item: ErrorObject) => item.$message)\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if (props.v?.required && props.v?.required.$params.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.multiple === false) return false\n return true as unknown as undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n :items=\"items\"\n item-title=\"title\"\n item-value=\"value\"\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :disabled=\"disabledComputed\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :data-cy=\"dataCy\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n >\n <template #label>\n <span v-if=\"!hideLabel\">{{ labelComputed\n }}<span\n v-if=\"requiredComputed\"\n class=\"required\"\n /></span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n","<script lang=\"ts\" setup>\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Filter } from '@/types/Filter'\nimport { useFilterHelpers } from '@/composables/filter/filterHelpers'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n items: ValueObjectOption<string | number>[]\n }>(),\n {}\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'change'): void\n}>()\nconst { clearOne } = useFilterHelpers()\n\nconst value = computed({\n get() {\n return props.modelValue.model\n },\n set(newValue) {\n emit('update:modelValue', { ...props.modelValue, ...{ model: newValue } })\n emit('change')\n },\n})\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.modelValue.multiple === false) return false\n return true as unknown as undefined\n})\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"value\"\n :items=\"items\"\n :chips=\"modelValue.multiple\"\n :label=\"label\"\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :clearable=\"!modelValue.mandatory\"\n data-cy=\"filter-value\"\n @clear=\"clearOne(modelValue)\"\n @change=\"emit('change')\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, type Ref, ref, toRefs, watch } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Pagination } from '@/types/Pagination'\nimport type { Filter, FilterBag } from '@/types/Filter'\nimport { usePagination } from '@/composables/system/pagination'\nimport { cloneDeep, isArray, isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/types/common'\n\ntype fetchItemsByIdsType =\n | ((ids: IntegerId[]) => Promise<ValueObjectOption<IntegerId>[]>)\n | ((ids: DocId[]) => Promise<ValueObjectOption<DocId>[]>)\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n fetchItems: (pagination: Pagination, filterBag: FilterBag) => Promise<ValueObjectOption<string | number>[]>\n fetchItemsByIds: fetchItemsByIdsType\n innerFilter: FilterBag\n filterByField?: string\n filterSortBy?: string | null\n disableInitFetch?: boolean | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterByField: 'name',\n filterSortBy: 'createdAt',\n disableInitFetch: false,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: Filter): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue.model\n },\n set(newValue: DocId | IntegerId | DocId[] | IntegerId[] | null) {\n emit('update:modelValue', { ...props.modelValue, ...{ model: cloneDeep(newValue) } })\n },\n})\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst { innerFilter } = toRefs(props)\n\nconst onBlur = () => {\n isFocused.value = true\n}\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.modelValue.multiple === false) return false\n return true as unknown as undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst pagination = usePagination(props.filterSortBy)\nconst fetchedItems = ref<ValueObjectOption<string | number>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<string | number>[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n selectedItemsCache.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n fetchedItems.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value.title, subtitle: value.subtitle }\n })\n})\n\nconst loading = ref(false)\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n loading.value = true\n const filterField = innerFilter.value[props.filterByField]\n filterField.model = query\n const res = await props.fetchItems(pagination, innerFilter.value)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n loading.value = false\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (value: string | number | string[] | number[]) => {\n let count = 1\n let foundItems = []\n if (isArray(value)) {\n count = value.length\n foundItems = findLocalDataByValues(value)\n } else {\n foundItems = findLocalDataByValues([value])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n loading.value = true\n const res = await props.fetchItems(pagination, innerFilter.value)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n loading.value = false\n}\nconst onFocus = () => {\n isFocused.value = true\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.modelValue.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\nconst onSearchUpdate = (query: string) => {\n if (!props.modelValue.multiple && !isFocused.value && query.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === query) return\n search.value = query\n}\n\nconst onClickClear = async () => {\n fetchedItems.value = await props.fetchItems(pagination, innerFilter.value)\n if (props.modelValue.multiple) {\n modelValueComputed.value = []\n return\n }\n modelValueComputed.value = null\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (props.modelValue.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (props.modelValue.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (props.modelValue.variant === 'contains' || props.modelValue.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nwatch(\n modelValueComputed,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n selectedItemsCache.value = []\n if (props.disableInitFetch || autoFetched.value === true) return\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n const found = await tryToLoadFromLocalData(newValue)\n if (found) return\n if (isArray<IntegerId | DocId>(newValue)) {\n loading.value = true\n selectedItemsCache.value = await props.fetchItemsByIds(newValue as Array<IntegerId & DocId>)\n loading.value = false\n return\n }\n loading.value = true\n selectedItemsCache.value = await props.fetchItemsByIds([newValue as DocId & IntegerId])\n loading.value = false\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue, oldValue) => {\n apiRequestCounter.value++\n if (newValue !== oldValue) {\n apiRequestCounter.value++\n apiSearch(newValue, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValueComputed\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :clearable=\"!modelValue.mandatory\"\n :label=\"label\"\n :chips=\"modelValue.multiple\"\n :loading=\"loading\"\n @update:search=\"onSearchUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, item }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"item.raw.title\"\n :subtitle=\"item.raw.subtitle\"\n />\n </template>\n </VAutocomplete>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\n\nimport type { Filter } from '@/types/Filter'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n dataCyTrue?: string\n dataCyFalse?: string\n }>(),\n {\n dataCyTrue: 'filter-true',\n dataCyFalse: 'filter-false',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n}>()\n\nconst value = computed({\n get() {\n return props.modelValue.model\n },\n set(newValue) {\n emit('update:modelValue', { ...props.modelValue, ...{ model: newValue } })\n },\n})\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n</script>\n\n<template>\n <div class=\"a-filter-boolean-group d-flex flex-column align-left justify-center mb-2\">\n <VLabel class=\"pr-1\">\n <span>{{ label }}</span>\n </VLabel>\n <VBtnToggle v-model=\"value\">\n <VBtn\n size=\"small\"\n :value=\"true\"\n :data-cy=\"dataCyTrue\"\n :color=\"value === true ? 'secondary' : ''\"\n >\n {{ t('common.model.boolean.true') }}\n </VBtn>\n <VBtn\n size=\"small\"\n :value=\"false\"\n :data-cy=\"dataCyFalse\"\n :color=\"value === false ? 'secondary' : ''\"\n >\n {{ t('common.model.boolean.false') }}\n </VBtn>\n </VBtnToggle>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.a-filter-boolean-group {\n position: relative;\n\n .v-label {\n position: absolute;\n top: -4px;\n left: 0;\n z-index: 2;\n }\n\n .v-btn-group {\n position: relative;\n margin-top: 20px;\n\n .v-btn {\n height: 33px !important;\n }\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\nimport type { Filter } from '@/types/Filter'\nimport { isNull, isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: Filter\n dataCy?: string\n allT?: string\n trueT?: string\n falseT?: string\n }>(),\n {\n dataCy: 'filter-boolean',\n allT: 'common.model.all',\n trueT: 'common.model.boolean.true',\n falseT: 'common.model.boolean.false',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n}>()\n\nconst value = computed({\n get() {\n if (isUndefined(props.modelValue.model) || isNull(props.modelValue.model)) return -1\n return props.modelValue.model ? 1 : 0\n },\n set(newValue) {\n let returnValue: null | boolean = null\n if (newValue === 1) returnValue = true\n if (newValue === 0) returnValue = false\n emit('update:modelValue', { ...props.modelValue, ...{ model: returnValue } })\n },\n})\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return props.modelValue.titleT ? t(props.modelValue.titleT) : undefined\n})\n\nconst items = computed(() => {\n return [\n { value: -1, title: t(props.allT) },\n { value: 1, title: t(props.trueT) },\n { value: 0, title: t(props.falseT) },\n ]\n})\n</script>\n\n<template>\n <VSelect\n v-model=\"value\"\n :data-cy=\"dataCy\"\n :label=\"label\"\n :items=\"items\"\n />\n</template>\n","import { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\nexport const JobStatus = {\n Waiting: 'waiting',\n Processing: 'processing',\n AwaitingBatchProcess: 'awaiting_batch_process',\n Done: 'done',\n Error: 'error',\n} as const\nexport type JobStatusType = (typeof JobStatus)[keyof typeof JobStatus]\nexport const JobStatusDefault = JobStatus.Waiting\n\nexport function useJobStatus() {\n const { t } = useI18n()\n\n const jobStatusOptions = ref<ValueObjectOption<JobStatusType>[]>([\n {\n value: JobStatus.Waiting,\n title: t('common.job.status.waiting'),\n color: 'warning',\n },\n {\n value: JobStatus.Processing,\n title: t('common.job.status.processing'),\n color: 'primary',\n },\n {\n value: JobStatus.AwaitingBatchProcess,\n title: t('common.job.status.awaitingBatchProcess'),\n color: 'primary',\n },\n {\n value: JobStatus.Done,\n title: t('common.job.status.done'),\n color: 'success',\n },\n {\n value: JobStatus.Error,\n title: t('common.job.status.error'),\n color: 'error',\n },\n ])\n\n const getJobStatusOption = (value: JobStatusType): ValueObjectOption<JobStatusType> => {\n return jobStatusOptions.value.find((item) => item.value === value) as ValueObjectOption<JobStatusType>\n }\n\n return {\n jobStatusOptions,\n getJobStatusOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { type JobStatusType, useJobStatus } from '@/model/valueObject/JobStatus'\n\nconst props = defineProps<{\n value: JobStatusType\n}>()\n\nconst { getJobStatusOption } = useJobStatus()\nconst option = computed(() => getJobStatusOption(props.value))\n</script>\n\n<template>\n <VChip\n :color=\"option?.color\"\n label\n size=\"small\"\n >\n {{ option?.title }}\n </VChip>\n</template>\n","import type { Immutable } from '@/utils/object'\nimport { objectDeepFreeze } from '@/utils/object'\n\nconst commonConfig = {\n CHIP: {\n CLASS: {\n NO_LINK: 'v-chip-custom-no-link',\n },\n ICON: {\n LINK: 'mdi-arrow-top-right',\n LINK_EXTERNAL: 'mdi-open-in-new',\n },\n },\n}\n\nexport const COMMON_CONFIG: Immutable<typeof commonConfig> = objectDeepFreeze(commonConfig)\n","<script lang=\"ts\" setup>\nimport { computed, shallowRef, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { objectGetValueByPath } from '@/utils/object'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { COMMON_CONFIG } from '@/model/commonConfig'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'onClose', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst router = useRouter()\nconst cached = shallowRef<undefined | any>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\nconst item = computed(() => {\n return props.getCachedFn(props.id as any)\n})\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\nconst displayTitle = computed(() => {\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n\nwatch(\n item,\n async (newValue) => {\n if (loaded.value) return\n if (isUndefined(newValue) || newValue._loaded === false) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">\n -\n </slot>\n </template>\n <div v-else-if=\"textOnly\">\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"disableClick\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n @click:close=\"() => emit('onClose', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('onClose', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n","import { ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\nexport const LogLevel = {\n Debug: 'DEBUG',\n Info: 'INFO',\n Notice: 'NOTICE',\n Warning: 'WARNING',\n Error: 'ERROR',\n Critical: 'CRITICAL',\n Alert: 'ALERT',\n Emergency: 'EMERGENCY',\n} as const\nexport type LogLevelType = (typeof LogLevel)[keyof typeof LogLevel]\nexport const LogLevelDefault = LogLevel.Info\n\nexport function useLogLevel() {\n const logLevelOptions = ref<ValueObjectOption<LogLevelType>[]>([\n {\n value: LogLevel.Debug,\n title: LogLevel.Debug,\n color: 'blue-grey lighten-5',\n },\n {\n value: LogLevel.Info,\n title: LogLevel.Info,\n color: 'blue-grey lighten-3',\n },\n {\n value: LogLevel.Notice,\n title: LogLevel.Notice,\n color: 'amber lighten-4',\n },\n {\n value: LogLevel.Warning,\n title: LogLevel.Warning,\n color: 'amber',\n },\n {\n value: LogLevel.Error,\n title: LogLevel.Error,\n color: 'red',\n },\n {\n value: LogLevel.Critical,\n title: LogLevel.Critical,\n color: 'red accent-4',\n },\n {\n value: LogLevel.Alert,\n title: LogLevel.Alert,\n color: 'pink',\n },\n {\n value: LogLevel.Emergency,\n title: LogLevel.Emergency,\n color: 'ping darken-4',\n },\n ])\n\n const getLogLevelOption = (value: LogLevelType) => {\n return logLevelOptions.value.find((item) => item.value === value)\n }\n\n return {\n logLevelOptions,\n getLogLevelOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { type LogLevelType, useLogLevel } from '@/model/valueObject/LogLevel'\n\nconst props = withDefaults(\n defineProps<{\n level: LogLevelType\n }>(),\n {}\n)\n\nconst { getLogLevelOption } = useLogLevel()\nconst levelOption = computed(() => {\n return getLogLevelOption(props.level)\n})\n</script>\n\n<template>\n <VChip\n v-if=\"levelOption\"\n :color=\"levelOption.color\"\n label\n size=\"small\"\n >\n {{ levelOption.title }}\n </VChip>\n</template>\n","export const numberToString = (value: number): string => {\n return '' + value\n}\n","<script lang=\"ts\" setup>\nimport { useClipboard } from '@vueuse/core'\nimport { eventClickBlur } from '@/utils/event'\nimport { isNumber, isString } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { numberToString } from '@/utils/number'\nimport { withModifiers } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n value: number | string\n notifyT?: string\n tooltipT?: string\n dataCy?: string\n }>(),\n {\n notifyT: 'common.alert.textWasCopied',\n tooltipT: 'common.button.copy',\n dataCy: 'copy-text',\n }\n)\n\nconst { copy, isSupported } = useClipboard()\nconst { showSuccess } = useAlerts()\nconst { t } = useI18n()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n if (!isSupported) return\n if (isNumber(props.value)) {\n copy(numberToString(props.value)).then(() => {\n showSuccess(t(props.notifyT))\n })\n } else if (isString(props.value) && props.value.length) {\n copy(props.value).then(() => {\n showSuccess(t(props.notifyT))\n })\n }\n}\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{\n onClick: withModifiers((e) => onClick(e), ['stop']),\n disabled: !isSupported,\n }\"\n >\n <div\n :class=\"{ 'cursor-pointer': isSupported }\"\n :data-cy=\"dataCy\"\n class=\"d-inline-flex align-center anzu-copy-text\"\n @click.stop=\"onClick\"\n >\n <span>{{ value }}</span>\n <VIcon\n v-if=\"isSupported\"\n class=\"ml-1\"\n size=\"x-small\"\n icon=\"mdi-content-copy\"\n />\n <VTooltip\n v-if=\"tooltipT\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(tooltipT) }}\n </VTooltip>\n </div>\n </slot>\n</template>\n\n<style lang=\"scss\">\n.anzu-copy-text {\n .v-icon {\n opacity: 0;\n }\n\n &:hover {\n .v-icon {\n opacity: 1;\n }\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n color?: string | undefined\n size?: string\n dataCy?: string | undefined\n }>(),\n {\n color: undefined,\n size: 'small',\n dataCy: undefined,\n }\n)\n\nconst customColorClass = computed(() => {\n return isUndefined(props.color) ? 'a-chip-no-link--custom-color' : ''\n})\n</script>\n\n<template>\n <VChip\n :color=\"color as string\"\n :data-cy=\"dataCy\"\n class=\"a-chip-no-link\"\n :class=\"customColorClass\"\n label\n :size=\"size as string\"\n >\n <slot />\n </VChip>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted, onUnmounted, type Ref, ref, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n label?: string\n seconds?: number\n parentheses?: boolean\n }>(),\n {\n label: '',\n seconds: 60,\n parentheses: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'done'): void\n}>()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst countdown = ref(props.seconds)\nconst countdownTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nwatch(\n countdown,\n (newValue) => {\n if (newValue > 0) {\n countdownTimer.value = setTimeout(() => countdown.value--, 1000)\n } else {\n emit('done')\n }\n },\n { immediate: true }\n)\n\nonMounted(() => {\n countdown.value = props.seconds\n})\n\nonUnmounted(() => {\n clearTimeout(countdownTimer.value)\n countdownTimer.value = undefined\n})\n</script>\n\n<template>\n <span>\n <span v-if=\"parentheses\">(</span>\n <span\n v-if=\"label\"\n class=\"font-weight-bold mr-1\"\n >{{ label }}\n </span>\n <span>{{ countdown }}</span>\n <span v-if=\"parentheses\">)</span>\n </span>\n</template>\n","import {\n type CollabAccessRoomCallbackTypes,\n CollabAccessRoomStatus,\n type CollabAccessRoomStatusType,\n type CollabFieldLock,\n type CollabFieldName,\n CollabRequestToJoinStatus,\n type CollabRequestToJoinStatusCallback,\n type CollabRequestToJoinStatusType,\n CollabRequestToTakeModerationStatus,\n type CollabRequestToTakeModerationStatusCallback,\n type CollabRequestToTakeModerationStatusType,\n type CollabRoom,\n type CollabRoomInfo,\n type CollabRoomInfoCallback,\n type CollabRoomOptions,\n type CollabRoomPlainData,\n type CollabRoomsInfo,\n CollabStatus,\n isCollabSuccessAccessRoomCallback,\n} from '@/components/collab/types/Collab'\nimport { computed, ref, watch } from 'vue'\nimport {\n type CollabApprovedJoinRequestEvent,\n type CollabApprovedRequestToTakeModerationEvent,\n type CollabJoinRequestEvent,\n type CollabKickedFromRoomEvent,\n type CollabRejectedJoinRequestEvent,\n type CollabRejectedRequestToTakeModerationEvent,\n type CollabRequestToTakeModerationEvent,\n type CollabStartingEvent,\n useCollabApprovedJoinRequestEventBus,\n useCollabApprovedRequestToTakeModerationEventBus,\n useCollabJoinRequestEventBus,\n useCollabKickedFromRoomEventBus,\n useCollabReconnectEventBus,\n useCollabRejectedJoinRequestEventBus,\n useCollabRejectedRequestToTakeModerationEventBus,\n useCollabRequestToTakeModerationEventBus,\n useCollabStartingEventBus,\n} from '@/components/collab/composables/collabEventBus'\nimport type { Fn, Promisify } from '@vueuse/core'\nimport { tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCollabState } from '@/components/collab/composables/collabState'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\nimport type { AddToCachedArgs } from '@/composables/system/defineCached'\nimport type { IntegerId } from '@/types/common'\n\nconst alertedOccupiedRooms = ref(new Set<CollabRoom>())\n\nexport function useCollabRoom(\n room: CollabRoom,\n watchForNewUsers: boolean = false,\n addToCachedUsers: ((...args: AddToCachedArgs<IntegerId>) => void) | undefined = undefined,\n fetchCachedUsers: (() => Promisify<Promise<any>>) | undefined = undefined,\n disableAutoUnsubscribe = false\n) {\n const { collabSocket, collabRoomInfoState, collabFieldDataBufferState, collabFieldLocksState } = useCollabState()\n\n const reconnectEventBus = useCollabReconnectEventBus()\n const unsubscribeCollabReconnectListener = ref<undefined | Fn>()\n const reconnectCallback = ref<undefined | Fn>()\n\n const joinRequestEventBus = useCollabJoinRequestEventBus()\n const unsubscribeJoinRequestListener = ref<undefined | Fn>()\n const joinRequestCallback = ref<undefined | ((userId: number, timestamp: number) => void)>()\n\n const approvedJoinRequestEventBus = useCollabApprovedJoinRequestEventBus()\n const unsubscribeApprovedJoinRequestListener = ref<undefined | Fn>()\n const approvedJoinRequestCallback = ref<undefined | Fn>()\n\n const rejectedJoinRequestEventBus = useCollabRejectedJoinRequestEventBus()\n const unsubscribeRejectedJoinRequestListener = ref<undefined | Fn>()\n const rejectedJoinRequestCallback = ref<undefined | Fn>()\n\n const requestToTakeModerationEventBus = useCollabRequestToTakeModerationEventBus()\n const unsubscribeRequestToTakeModerationListener = ref<undefined | Fn>()\n const requestToTakeModerationCallback = ref<undefined | ((userId: number, timestamp: number) => void)>()\n\n const approvedRequestToTakeModerationEventBus = useCollabApprovedRequestToTakeModerationEventBus()\n const unsubscribeApprovedRequestToTakeModerationListener = ref<undefined | Fn>()\n const approvedRequestToTakeModerationCallback = ref<undefined | Fn>()\n\n const rejectedRequestToTakeModerationEventBus = useCollabRejectedRequestToTakeModerationEventBus()\n const unsubscribeRejectedRequestToTakeModerationListener = ref<undefined | Fn>()\n const rejectedRequestToTakeModerationCallback = ref<undefined | Fn>()\n\n const kickedFromRoomEventBus = useCollabKickedFromRoomEventBus()\n const unsubscribeKickedFromRoomListener = ref<undefined | Fn>()\n const kickedFromRoomCallback = ref<undefined | Fn>()\n\n const collabStartingEventBus = useCollabStartingEventBus()\n const unsubscribeCollabStartingListener = ref<undefined | Fn>()\n const collabStartingCallback = ref<undefined | ((startedCallback: (data: CollabRoomPlainData) => void) => void)>()\n\n const reconnectEventBusListener = () => {\n if (isDefined(reconnectCallback.value)) {\n reconnectCallback.value()\n }\n }\n\n const joinRequestEventBusListener = (event: CollabJoinRequestEvent) => {\n if (event.room === room && isDefined(joinRequestCallback.value)) {\n joinRequestCallback.value(event.userId, event.timestamp)\n }\n }\n\n const approvedJoinRequestEventBusListener = (event: CollabApprovedJoinRequestEvent) => {\n if (event.room === room && isDefined(approvedJoinRequestCallback.value)) {\n approvedJoinRequestCallback.value()\n }\n }\n\n const rejectedJoinRequestEventBusListener = (event: CollabRejectedJoinRequestEvent) => {\n if (event.room === room && isDefined(rejectedJoinRequestCallback.value)) {\n rejectedJoinRequestCallback.value()\n }\n }\n\n const requestToTakeModerationEventBusListener = (event: CollabRequestToTakeModerationEvent) => {\n if (event.room === room && isDefined(requestToTakeModerationCallback.value)) {\n requestToTakeModerationCallback.value(event.userId, event.timestamp)\n }\n }\n\n const approvedRequestToTakeModerationEventBusListener = (event: CollabApprovedRequestToTakeModerationEvent) => {\n if (event.room === room && isDefined(approvedRequestToTakeModerationCallback.value)) {\n approvedRequestToTakeModerationCallback.value()\n }\n }\n\n const rejectedRequestToTakeModerationEventBusListener = (event: CollabRejectedRequestToTakeModerationEvent) => {\n if (event.room === room && isDefined(rejectedRequestToTakeModerationCallback.value)) {\n rejectedRequestToTakeModerationCallback.value()\n }\n }\n\n const kickedFromCollabRookEventBusListener = (event: CollabKickedFromRoomEvent) => {\n if (event.room === room && isDefined(kickedFromRoomCallback.value)) {\n kickedFromRoomCallback.value()\n }\n }\n\n const collabStartingEventBusListener = (event: CollabStartingEvent) => {\n if (event.room === room && isDefined(collabStartingCallback.value)) {\n collabStartingCallback.value(event.startedCallback)\n }\n }\n\n const addJoinRequestListener = (callback: (userId: number, timestamp: number) => void) => {\n joinRequestCallback.value = callback\n unsubscribeJoinRequestListener.value = joinRequestEventBus.on(joinRequestEventBusListener)\n }\n\n const addApprovedJoinRequestListener = (callback: () => void) => {\n approvedJoinRequestCallback.value = callback\n unsubscribeApprovedJoinRequestListener.value = approvedJoinRequestEventBus.on(approvedJoinRequestEventBusListener)\n }\n\n const addRejectedJoinRequestListener = (callback: () => void) => {\n rejectedJoinRequestCallback.value = callback\n unsubscribeRejectedJoinRequestListener.value = rejectedJoinRequestEventBus.on(rejectedJoinRequestEventBusListener)\n }\n\n const addRequestToTakeModerationListener = (callback: (userId: number, timestamp: number) => void) => {\n requestToTakeModerationCallback.value = callback\n unsubscribeRequestToTakeModerationListener.value = requestToTakeModerationEventBus.on(\n requestToTakeModerationEventBusListener\n )\n }\n\n const addApprovedRequestToTakeModerationListener = (callback: () => void) => {\n approvedRequestToTakeModerationCallback.value = callback\n unsubscribeApprovedRequestToTakeModerationListener.value = approvedRequestToTakeModerationEventBus.on(\n approvedRequestToTakeModerationEventBusListener\n )\n }\n\n const addRejectedRequestToTakeModerationListener = (callback: () => void) => {\n rejectedRequestToTakeModerationCallback.value = callback\n unsubscribeRejectedRequestToTakeModerationListener.value = rejectedRequestToTakeModerationEventBus.on(\n rejectedRequestToTakeModerationEventBusListener\n )\n }\n\n const addCollabReconnectListener = (callback: () => void) => {\n reconnectCallback.value = callback\n unsubscribeCollabReconnectListener.value = reconnectEventBus.on(reconnectEventBusListener)\n }\n\n const addKickedFromRoomListener = (callback: () => void) => {\n kickedFromRoomCallback.value = callback\n unsubscribeKickedFromRoomListener.value = kickedFromRoomEventBus.on(kickedFromCollabRookEventBusListener)\n }\n\n const addCollabStartingListener = (callback: (startedCallback: (data: CollabRoomPlainData) => void) => void) => {\n collabStartingCallback.value = callback\n unsubscribeCollabStartingListener.value = collabStartingEventBus.on(collabStartingEventBusListener)\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeJoinRequestListener.value)) {\n unsubscribeJoinRequestListener.value()\n }\n if (isDefined(unsubscribeApprovedJoinRequestListener.value)) {\n unsubscribeApprovedJoinRequestListener.value()\n }\n if (isDefined(unsubscribeRejectedJoinRequestListener.value)) {\n unsubscribeRejectedJoinRequestListener.value()\n }\n if (isDefined(unsubscribeRequestToTakeModerationListener.value)) {\n unsubscribeRequestToTakeModerationListener.value()\n }\n if (isDefined(unsubscribeApprovedRequestToTakeModerationListener.value)) {\n unsubscribeApprovedRequestToTakeModerationListener.value()\n }\n if (isDefined(unsubscribeRejectedRequestToTakeModerationListener.value)) {\n unsubscribeRejectedRequestToTakeModerationListener.value()\n }\n if (isDefined(unsubscribeKickedFromRoomListener.value)) {\n unsubscribeKickedFromRoomListener.value()\n }\n if (isDefined(unsubscribeCollabStartingListener.value)) {\n unsubscribeCollabStartingListener.value()\n }\n })\n\n const { collabOptions } = useCommonAdminCollabOptions()\n\n const subscribeCollabRoomInfo = () => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('subscribeCollabRoomInfo', room, (response: CollabRoomInfoCallback) => {\n collabRoomInfoState.set(room, response.room)\n })\n }\n\n const unsubscribeCollabRoomInfo = () => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('unsubscribeCollabRoomInfo', room, (response: CollabRoomInfoCallback) => {\n collabRoomInfoState.set(room, response.room)\n })\n }\n\n const joinCollabRoom = async (options: Partial<CollabRoomOptions> = {}): Promise<CollabAccessRoomStatusType> => {\n return new Promise((resolve, reject) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return reject(CollabAccessRoomStatus.Failed)\n collabSocket.value\n ?.timeout(5000)\n .emit('joinCollabRoom', room, options, (error, response: CollabAccessRoomCallbackTypes) => {\n if (error) {\n return void reject(CollabAccessRoomStatus.Failed)\n }\n if (isCollabSuccessAccessRoomCallback(response)) {\n collabRoomInfoState.set(room, response.room)\n return void resolve(response.status)\n }\n return void reject(response.status)\n })\n })\n }\n\n const leaveCollabRoom = () => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('leaveCollabRoom', room, (response: CollabAccessRoomCallbackTypes) => {\n if (isCollabSuccessAccessRoomCallback(response)) {\n collabRoomInfoState.set(room, response.room)\n }\n })\n }\n\n const enteredCollabRoom = () => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value?.emit('enteredCollabRoom', room)\n }\n\n const requestToJoinCollabRoom = (): Promise<CollabRequestToJoinStatusType> => {\n return new Promise((resolve, reject) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) {\n return reject(CollabRequestToJoinStatus.Failed)\n }\n collabSocket.value\n ?.timeout(2000)\n .emit('requestToJoin', room, new Date().getTime(), (error, response: CollabRequestToJoinStatusCallback) => {\n if (error) {\n return void reject(CollabRequestToJoinStatus.Failed)\n }\n if (response.status === CollabRequestToJoinStatus.Ok) {\n return void resolve(response.status)\n }\n return void reject(response.status)\n })\n })\n }\n\n const approveRequestToJoinCollabRoom = (userId: number) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('approveRequestToJoin', room, userId)\n }\n\n const rejectRequestToJoinCollabRoom = (userId: number) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('rejectRequestToJoin', room, userId)\n }\n\n const requestToTakeModeration = async (): Promise<CollabRequestToTakeModerationStatusType> => {\n return new Promise((resolve, reject) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) {\n return reject(CollabRequestToTakeModerationStatus.Failed)\n }\n collabSocket.value\n ?.timeout(2000)\n .emit(\n 'requestToTakeModeration',\n room,\n new Date().getTime(),\n (error, response: CollabRequestToTakeModerationStatusCallback) => {\n if (error) {\n return void reject(CollabRequestToTakeModerationStatus.Failed)\n }\n if (response.status === CollabRequestToTakeModerationStatus.Ok) {\n return void resolve(response.status)\n }\n return void reject(response.status)\n }\n )\n })\n }\n\n const approveRequestToTakeModeration = () => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('approveRequestToTakeModeration', room)\n }\n\n const rejectRequestToTakeModeration = () => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('rejectRequestToTakeModeration', room)\n }\n\n const kickUserFromRoom = (userId: number) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('kickUserFromRoom', room, userId)\n }\n\n const transferModeration = (userId: number) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('transferModeration', room, userId)\n }\n\n const fetchRoomInfo = async (room: CollabRoom): Promise<CollabRoomInfo> => {\n const baseRoomInfo: CollabRoomInfo = { name: '', status: CollabStatus.Inactive, users: [], moderator: null }\n return new Promise((resolve) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return resolve(baseRoomInfo)\n collabSocket.value?.timeout(500).emit('fetchRoomsInfo', [room], (error, response: CollabRoomsInfo) => {\n if (error) return void resolve(baseRoomInfo)\n const roomInfo = response[room]\n if (isUndefined(roomInfo)) resolve(baseRoomInfo)\n if (!isUndefined(addToCachedUsers)) addToCachedUsers(roomInfo.users)\n if (!isUndefined(fetchCachedUsers)) fetchCachedUsers()\n\n return resolve(roomInfo)\n })\n })\n }\n\n const collabRoomInfo = computed((): CollabRoomInfo => {\n return collabRoomInfoState.get(room) ?? { name: room, moderator: null, users: [], status: CollabStatus.Inactive }\n })\n\n if (watchForNewUsers) {\n watch(\n collabRoomInfo,\n (newValue) => {\n if (newValue.users.length) {\n if (!isUndefined(addToCachedUsers)) addToCachedUsers(newValue.users)\n if (!isUndefined(fetchCachedUsers)) fetchCachedUsers()\n }\n },\n { immediate: true }\n )\n }\n\n const collabRoomLocks = computed((): Map<CollabFieldName, CollabFieldLock> => {\n return collabFieldLocksState.get(room) ?? new Map()\n })\n\n return {\n subscribeCollabRoomInfo,\n unsubscribeCollabRoomInfo,\n joinCollabRoom,\n leaveCollabRoom,\n requestToJoinCollabRoom,\n approveRequestToJoinCollabRoom,\n rejectRequestToJoinCollabRoom,\n addJoinRequestListener,\n addCollabReconnectListener,\n addApprovedJoinRequestListener,\n addRejectedJoinRequestListener,\n requestToTakeModeration,\n approveRequestToTakeModeration,\n rejectRequestToTakeModeration,\n addRequestToTakeModerationListener,\n addApprovedRequestToTakeModerationListener,\n addRejectedRequestToTakeModerationListener,\n enteredCollabRoom,\n kickUserFromRoom,\n transferModeration,\n addKickedFromRoomListener,\n addCollabStartingListener,\n fetchRoomInfo,\n collabRoomInfo,\n collabRoomLocks,\n collabFieldDataBufferState,\n alertedOccupiedRooms,\n unsubscribeJoinRequestListener,\n unsubscribeApprovedJoinRequestListener,\n unsubscribeRejectedJoinRequestListener,\n unsubscribeRequestToTakeModerationListener,\n unsubscribeApprovedRequestToTakeModerationListener,\n unsubscribeRejectedRequestToTakeModerationListener,\n unsubscribeKickedFromRoomListener,\n unsubscribeCollabStartingListener,\n }\n}\n","<script setup lang=\"ts\">\nimport {\n type CollabDelayedRequest,\n CollabRequestToJoinStatus,\n CollabRequestToTakeModerationStatus,\n type CollabRoom,\n CollabStatus,\n type CollabUserId,\n} from '@/components/collab/types/Collab'\nimport { useI18n } from 'vue-i18n'\nimport { computed, type Ref, ref } from 'vue'\nimport ACollabCountdown from '@/components/collab/components/ACollabCountdown.vue'\nimport { useCollabRoom } from '@/components/collab/composables/collabRoom'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useCollabCurrentUserId } from '@/components/collab/composables/collabCurrentUserId'\nimport type { AddToCachedArgs } from '@/composables/system/defineCached'\nimport type { IntegerId } from '@/types/common'\nimport type { Promisify } from '@vueuse/core'\nimport { isDefined } from '@/utils/common'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport type { CollabCachedUsersMap } from '@/components/collab/composables/collabHelpers'\n\nconst props = withDefaults(\n defineProps<{\n collabRoom: CollabRoom\n cachedUsers: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isEdit?: boolean\n addToCachedUsers?: ((...args: AddToCachedArgs<IntegerId>) => void) | undefined\n fetchCachedUsers?: (() => Promisify<Promise<any>>) | undefined\n }>(),\n {\n isEdit: false,\n addToCachedUsers: undefined,\n fetchCachedUsers: undefined,\n }\n)\n\nconst {\n collabRoomInfo,\n addJoinRequestListener,\n requestToJoinCollabRoom,\n approveRequestToJoinCollabRoom,\n rejectRequestToJoinCollabRoom,\n addApprovedJoinRequestListener,\n addRejectedJoinRequestListener,\n requestToTakeModeration,\n approveRequestToTakeModeration,\n rejectRequestToTakeModeration,\n addRequestToTakeModerationListener,\n addApprovedRequestToTakeModerationListener,\n addRejectedRequestToTakeModerationListener,\n kickUserFromRoom,\n transferModeration,\n alertedOccupiedRooms,\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n} = useCollabRoom(props.collabRoom)\n\nconst { t } = useI18n()\nconst { showErrorT, showSuccessT } = useAlerts()\n\nconst { currentUserId } = useCollabCurrentUserId()\n\nconst approveRequestsToCollab = ref<CollabDelayedRequest[]>([])\nconst selectedIdsToCollab = ref<CollabUserId[]>([])\nconst collabUserIds = computed<CollabUserId[]>(() => {\n return collabRoomInfo.value.users.filter((userId) => userId !== currentUserId.value)\n})\nconst moderatorManagementDialog = ref(false)\nconst approveRequestTakeModerationDialog = ref(false)\nconst moderationRequest = ref<null | CollabDelayedRequest>(null)\nconst requestToJoinAccepted = ref<boolean | null>(null)\nconst waitingFroApproval = ref(false)\n\naddJoinRequestListener(async (userId: CollabUserId, timestamp: number) => {\n if (isDefined(props.addToCachedUsers)) props.addToCachedUsers(userId)\n if (isDefined(props.fetchCachedUsers)) props.fetchCachedUsers()\n if (!selectedIdsToCollab.value.includes(userId)) selectedIdsToCollab.value.push(userId)\n approveRequestsToCollab.value.push({ userId, timestamp })\n})\n\naddApprovedJoinRequestListener(() => {\n showSuccessT('common.collab.alert.approvedJoinRequest')\n waitingFroApproval.value = false\n requestToJoinAccepted.value = true\n alertedOccupiedRooms.value.delete(props.collabRoom)\n})\n\naddRejectedJoinRequestListener(() => {\n showErrorT('common.collab.alert.rejectedJoinRequest')\n waitingFroApproval.value = false\n requestToJoinAccepted.value = false\n alertedOccupiedRooms.value.delete(props.collabRoom)\n})\n\naddRequestToTakeModerationListener(async (userId: number, timestamp: number) => {\n if (isDefined(props.addToCachedUsers)) props.addToCachedUsers(userId)\n if (isDefined(props.fetchCachedUsers)) props.fetchCachedUsers()\n moderationRequest.value = { userId, timestamp }\n approveRequestTakeModerationDialog.value = true\n})\n\naddApprovedRequestToTakeModerationListener(() => {\n showSuccessT('common.collab.alert.approvedToTakeModeration')\n waitingFroApproval.value = false\n})\n\naddRejectedRequestToTakeModerationListener(() => {\n showErrorT('common.collab.alert.rejectedToTakeModeration')\n waitingFroApproval.value = false\n})\n\nconst waitingForApprovalTimerDone = () => {\n waitingFroApproval.value = false\n}\n\nconst showRequestToJoinCollabButton = computed(() => {\n return (\n requestToJoinAccepted.value === null &&\n collabRoomInfo.value.users.length &&\n !collabRoomInfo.value.users.includes(currentUserId.value ?? 0) &&\n !waitingFroApproval.value\n )\n})\n\nconst showRequestToTakeModerationButton = computed(() => {\n return (\n props.isEdit &&\n collabRoomInfo.value.status === CollabStatus.Active &&\n collabRoomInfo.value.moderator !== currentUserId.value\n )\n})\n\nconst showModeratorManagementDialog = computed(() => {\n return moderatorManagementDialog.value && collabRoomInfo.value.status === CollabStatus.Active\n})\n\nconst showKickYourselfButton = computed(() => {\n return props.isEdit && collabRoomInfo.value.status === CollabStatus.Active\n})\n\nconst showModeratorManagementButton = computed(() => {\n return (\n props.isEdit &&\n collabRoomInfo.value.moderator === currentUserId.value &&\n collabRoomInfo.value.status === CollabStatus.Active\n )\n})\n\nconst showJoinCollaborationDialog = computed(() => {\n return !props.isEdit && alertedOccupiedRooms.value.has(props.collabRoom) && requestToJoinAccepted.value === null\n})\n\nconst requestToJoinCollabTimerDone = (userId: number) => {\n approveRequestsToCollab.value = approveRequestsToCollab.value.filter((request) => request.userId !== userId)\n selectedIdsToCollab.value = selectedIdsToCollab.value.filter((id) => id !== userId)\n}\n\nconst requestToJoinCollabRoomAction = async () => {\n try {\n await requestToJoinCollabRoom()\n waitingFroApproval.value = true\n } catch (error) {\n if (error === CollabRequestToJoinStatus.AlreadyRequested) {\n return void showErrorT('common.collab.alert.alreadyRequestedToJoin')\n }\n return void showErrorT('common.collab.alert.failedRequestedToJoin')\n }\n}\n\nconst showModeratorManagementDialogAction = () => {\n moderatorManagementDialog.value = true\n}\n\nconst requestToTakeModerationAction = async () => {\n try {\n await requestToTakeModeration()\n waitingFroApproval.value = true\n } catch (error) {\n if (error === CollabRequestToTakeModerationStatus.AlreadyRequested) {\n return void showErrorT('common.collab.alert.alreadyRequestedToTakeModeration')\n }\n return void showErrorT('common.collab.alert.failedRequestToTakeModeration')\n }\n}\n\nconst approveRequestToCollaborate = () => {\n selectedIdsToCollab.value.forEach((selectedId) => {\n approveRequestToJoinCollabRoom(selectedId)\n })\n approveRequestsToCollab.value = approveRequestsToCollab.value.filter(\n (request) => !selectedIdsToCollab.value.includes(request.userId)\n )\n selectedIdsToCollab.value = []\n}\n\nconst rejectRequestToCollaborate = () => {\n selectedIdsToCollab.value.forEach((selectedId) => {\n rejectRequestToJoinCollabRoom(selectedId)\n })\n approveRequestsToCollab.value = approveRequestsToCollab.value.filter(\n (request) => !selectedIdsToCollab.value.includes(request.userId)\n )\n selectedIdsToCollab.value = []\n}\n\nconst resetRequestToTakeModeration = () => {\n moderationRequest.value = null\n approveRequestTakeModerationDialog.value = false\n}\n\nconst rejectRequestToTakeModerationAction = () => {\n rejectRequestToTakeModeration()\n resetRequestToTakeModeration()\n}\n\nconst approveRequestToTakeModerationAction = () => {\n approveRequestToTakeModeration()\n resetRequestToTakeModeration()\n}\n\nconst transferModerationAction = (userId: CollabUserId) => {\n transferModeration(userId)\n moderatorManagementDialog.value = false\n}\n\nconst kickUserAction = (userId: CollabUserId) => {\n kickUserFromRoom(userId)\n moderatorManagementDialog.value = false\n}\n\nconst kickYourselfAction = () => {\n kickUserFromRoom(currentUserId.value ?? 0)\n}\n\nconst calculateWaitingSeconds = (timestamp: number) => {\n return Math.ceil((60000 - (new Date().getTime() - timestamp)) / 1000)\n}\n</script>\n\n<template>\n <div>\n {{ t('common.collab.moderator') }}:\n <ACollabLockedByUser\n v-if=\"collabRoomInfo.moderator\"\n :id=\"collabRoomInfo.moderator\"\n :key=\"collabRoomInfo.moderator\"\n :users=\"cachedUsers\"\n />\n {{ t('common.collab.users') }}:\n <ACollabLockedByUser\n v-for=\"userId in collabRoomInfo.users.filter((user) => user !== collabRoomInfo.moderator)\"\n :id=\"userId\"\n :key=\"userId\"\n :users=\"cachedUsers\"\n class=\"mr-1\"\n />\n <VDivider\n class=\"mx-2\"\n inset\n vertical\n />\n <ABtnSecondary\n v-if=\"showRequestToJoinCollabButton\"\n size=\"small\"\n @click=\"requestToJoinCollabRoomAction\"\n >\n {{ t('common.collab.requestToCollaborate') }}\n </ABtnSecondary>\n <VBtn\n v-if=\"waitingFroApproval\"\n size=\"small\"\n variant=\"text\"\n >\n <VIcon\n class=\"mr-1\"\n icon=\"mdi-loading mdi-spin\"\n />\n {{ t('common.collab.waitingForApprove') }}\n <ACollabCountdown\n parentheses\n @done=\"waitingForApprovalTimerDone\"\n />\n </VBtn>\n <ABtnIcon\n v-if=\"showModeratorManagementButton\"\n size=\"small\"\n @click=\"showModeratorManagementDialogAction\"\n >\n <VIcon icon=\"mdi-account-details-outline\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.collab.moderatorManagement')\"\n />\n </ABtnIcon>\n <VDialog\n v-if=\"approveRequestsToCollab.length\"\n :model-value=\"true\"\n width=\"auto\"\n >\n <VCard v-if=\"approveRequestsToCollab.length\">\n <ADialogToolbar>\n {{ t('common.collab.requestToCollaborateText') }}\n </ADialogToolbar>\n <VCardItem>\n <VList\n v-model:selected=\"selectedIdsToCollab\"\n select-strategy=\"independent\"\n >\n <VListItem\n v-for=\"request in approveRequestsToCollab\"\n :key=\"request.userId\"\n :value=\"request.userId\"\n >\n <template #prepend>\n <ACollabLockedByUser\n :id=\"request.userId\"\n :users=\"cachedUsers\"\n />\n </template>\n <template #title>\n <ACollabCountdown\n class=\"ml-3\"\n :seconds=\"calculateWaitingSeconds(request.timestamp)\"\n :label=\"t('common.collab.approvedAfterCountdown')\"\n @done=\"() => requestToJoinCollabTimerDone(request.userId)\"\n />\n </template>\n <template #append=\"{ isActive, select }\">\n <VCheckboxBtn\n :model-value=\"isActive\"\n color=\"primary\"\n @click=\"() => select(isActive)\"\n />\n </template>\n </VListItem>\n </VList>\n </VCardItem>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n :disabled=\"!selectedIdsToCollab.length\"\n @click=\"rejectRequestToCollaborate\"\n >\n {{ t('common.collab.button.reject') }}\n </ABtnTertiary>\n <ABtnPrimary\n :disabled=\"!selectedIdsToCollab.length\"\n @click.stop=\"approveRequestToCollaborate\"\n >\n {{ t('common.collab.button.accept') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n <VDialog\n v-model=\"showModeratorManagementDialog\"\n width=\"auto\"\n >\n <VCard>\n <ADialogToolbar @on-cancel=\"moderatorManagementDialog = false\">\n {{ t('common.collab.moderatorManagement') }}\n </ADialogToolbar>\n <VCardItem>\n <VList>\n <VListItem\n v-for=\"userId in collabUserIds\"\n :key=\"userId\"\n :link=\"false\"\n >\n <template #title>\n <ACollabLockedByUser\n :id=\"userId\"\n :users=\"cachedUsers\"\n />\n </template>\n <template #append>\n <div class=\"ml-3\">\n <ABtnSecondary\n size=\"small\"\n @click=\"transferModerationAction(userId)\"\n >\n {{ t('common.collab.button.transferModeration') }}\n </ABtnSecondary>\n <ABtnTertiary\n size=\"small\"\n @click=\"kickUserAction(userId)\"\n >\n {{ t('common.collab.button.kickUser') }}\n </ABtnTertiary>\n </div>\n </template>\n </VListItem>\n </VList>\n </VCardItem>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary @click=\"moderatorManagementDialog = false\">\n {{ t('common.button.close') }}\n </ABtnTertiary>\n </VCardActions>\n </VCard>\n </VDialog>\n <ABtnIcon\n v-if=\"showRequestToTakeModerationButton\"\n size=\"small\"\n @click=\"requestToTakeModerationAction\"\n >\n <VIcon icon=\"mdi-account-switch\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.collab.requestToTakeModeration')\"\n />\n </ABtnIcon>\n <ABtnTertiary\n v-if=\"showKickYourselfButton\"\n size=\"small\"\n @click=\"kickYourselfAction\"\n >\n {{ t('common.collab.button.kickYourself') }}\n </ABtnTertiary>\n <VDialog\n v-if=\"moderationRequest\"\n v-model=\"approveRequestTakeModerationDialog\"\n width=\"auto\"\n >\n <VCard>\n <ADialogToolbar>\n {{ t('common.collab.requestToTakeModerationTextTitle') }}\n </ADialogToolbar>\n <VCardItem>\n <VList>\n <VListItem>\n <template #prepend>\n <ACollabLockedByUser\n :id=\"moderationRequest.userId\"\n :users=\"cachedUsers\"\n />\n </template>\n <template #title>\n <span class=\"ml-1\">{{ t('common.collab.requestToTakeModerationText') }}</span>\n </template>\n </VListItem>\n </VList>\n </VCardItem>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary @click=\"rejectRequestToTakeModerationAction\">\n {{ t('common.collab.button.reject') }}\n </ABtnTertiary>\n <ABtnPrimary @click.stop=\"approveRequestToTakeModerationAction\">\n {{ t('common.collab.button.accept') }}\n <ACollabCountdown\n parentheses\n :seconds=\"calculateWaitingSeconds(moderationRequest.timestamp)\"\n @done=\"resetRequestToTakeModeration\"\n />\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n <VDialog\n v-if=\"showJoinCollaborationDialog\"\n :model-value=\"true\"\n width=\"auto\"\n >\n <VCard>\n <ADialogToolbar @on-cancel=\"alertedOccupiedRooms.delete(props.collabRoom)\">\n {{ t('common.collab.occupiedEntityTitle') }}\n </ADialogToolbar>\n <VCardText>{{ t('common.collab.occupiedEntityText') }}</VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary @click=\"alertedOccupiedRooms.delete(props.collabRoom)\">\n {{ t('common.button.close') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"showRequestToJoinCollabButton\"\n @click=\"requestToJoinCollabRoomAction\"\n >\n {{ t('common.collab.requestToCollaborate') }}\n </ABtnPrimary>\n <VBtn\n v-if=\"waitingFroApproval\"\n variant=\"text\"\n >\n <VIcon\n class=\"mr-1\"\n icon=\"mdi-loading mdi-spin\"\n />\n {{ t('common.collab.waitingForApprove') }}\n <ACollabCountdown\n parentheses\n @done=\"waitingForApprovalTimerDone\"\n />\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { AnzuUserAndTimeTrackingAware } from '@/types/AnzuUserAndTimeTrackingAware'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/components/ARow.vue'\nimport ADatetime from '@/components/datetime/ADatetime.vue'\n\n// todo add user details, find generic way for all systems\n\nwithDefaults(\n defineProps<{\n data: AnzuUserAndTimeTrackingAware | any\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n hideCreatedBy?: boolean\n hideModifiedBy?: boolean\n }>(),\n {\n hideCreatedAt: false,\n hideModifiedAt: false,\n hideCreatedBy: false,\n hideModifiedBy: false,\n }\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow\n v-if=\"!hideCreatedAt\"\n :title=\"t('common.model.tracking.created')\"\n >\n <ADatetime :date-time=\"data.createdAt\" />\n </ARow>\n <ARow\n v-if=\"!hideModifiedAt\"\n :title=\"t('common.model.tracking.modified')\"\n >\n <ADatetime :date-time=\"data.modifiedAt\" />\n </ARow>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n routeName?: string\n routeParams?: any | undefined\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n size?: number\n }>(),\n {\n routeName: undefined,\n routeParams: undefined,\n buttonT: 'common.button.close',\n buttonClass: 'ml-2',\n dataCy: 'button-close',\n size: 36,\n }\n)\n\nconst { t } = useI18n()\n\nconst routerToComputed = computed(() => {\n if (isUndefined(props.routeName)) {\n return undefined\n }\n if (!isUndefined(props.routeParams)) {\n return { name: props.routeName, params: { ...props.routeParams } }\n }\n return { name: props.routeName }\n})\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :to=\"routerToComputed\"\n icon\n size=\"small\"\n variant=\"text\"\n :width=\"size\"\n :height=\"size\"\n :active=\"false\"\n >\n <VIcon icon=\"mdi-close\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.close') }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport type { ButtonVariant } from '@/types/commonAdmin'\nimport { computed } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n routeName: string\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n size?: number\n variant?: ButtonVariant\n }>(),\n {\n buttonT: 'common.button.create',\n buttonClass: 'ml-2',\n dataCy: 'button-create',\n size: 36,\n variant: 'primary',\n }\n)\n\nconst { t } = useI18n()\n\nconst variantComputed = computed(() => {\n switch (props.variant) {\n case 'secondary':\n return 'outlined'\n case 'tertiary':\n case 'icon':\n return 'text'\n default:\n return 'flat'\n }\n})\n</script>\n\n<template>\n <VBtn\n v-if=\"variant === 'icon'\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n size=\"small\"\n :variant=\"variantComputed\"\n :to=\"{ name: routeName }\"\n :width=\"size\"\n :height=\"size\"\n >\n <VIcon icon=\"mdi-content-save\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-else\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :variant=\"variantComputed\"\n :to=\"{ name: routeName }\"\n color=\"primary\"\n rounded=\"pill\"\n :height=\"size\"\n >\n {{ t(buttonT) }}\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref } from 'vue'\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport type { ButtonVariant } from '@/types/commonAdmin'\n\nconst props = withDefaults(\n defineProps<{\n variant?: ButtonVariant\n buttonT?: string\n buttonClass?: string\n dialogMessageT?: string\n dialogConfirmButtonT?: string\n dialogCancelButtonT?: string\n dialogConfirmColor?: string\n dialogZIndex?: number\n dialogMaxWidth?: number\n dataCy?: string\n disabled?: boolean\n disableCloseAfterConfirm?: boolean\n loading?: boolean\n color?: string | undefined\n size?: number\n }>(),\n {\n variant: 'icon',\n buttonT: 'common.button.delete',\n buttonClass: 'ml-2',\n dialogMessageT: 'common.system.modal.confirmDelete',\n dialogConfirmButtonT: 'common.button.delete',\n dialogCancelButtonT: 'common.button.cancel',\n dialogConfirmColor: 'primary',\n dialogZIndex: 200,\n dialogMaxWidth: 300,\n dataCy: 'button-delete',\n disabled: false,\n disableCloseAfterConfirm: false,\n color: undefined,\n size: 36,\n }\n)\nconst emit = defineEmits<{\n (e: 'deleteRecord'): void\n}>()\n\nconst dialog = ref(false)\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n dialog.value = true\n}\nconst onConfirm = () => {\n emit('deleteRecord')\n if (!props.disableCloseAfterConfirm) closeDialog()\n}\n\nconst closeDialog = () => {\n dialog.value = false\n}\n\nconst onCancel = () => {\n closeDialog()\n}\n\nconst { t } = useI18n()\n\ndefineExpose({\n closeDialog,\n})\n\nconst variantComputed = computed(() => {\n switch (props.variant) {\n case 'secondary':\n return 'outlined'\n case 'tertiary':\n case 'icon':\n return 'text'\n default:\n return 'flat'\n }\n})\n</script>\n\n<template>\n <VBtn\n v-if=\"variant === 'icon'\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n size=\"small\"\n :variant=\"variantComputed\"\n :disabled=\"disabled\"\n :color=\"color\"\n :loading=\"loading\"\n :width=\"size\"\n :height=\"size\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-trash-can-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-else\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :variant=\"variantComputed\"\n :color=\"color\"\n rounded=\"pill\"\n :height=\"size\"\n @click.stop=\"onClick\"\n >\n {{ t(buttonT) }}\n </VBtn>\n <VDialog\n v-model=\"dialog\"\n persistent\n :width=\"500\"\n no-click-animation\n >\n <VCard\n v-if=\"dialog\"\n data-cy=\"delete-panel\"\n >\n <ADialogToolbar @on-cancel=\"onCancel\">\n {{ t(dialogMessageT) }}\n </ADialogToolbar>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n :disabled=\"loading\"\n data-cy=\"button-cancel\"\n @click.stop=\"onCancel\"\n >\n {{ t(dialogCancelButtonT) }}\n </ABtnTertiary>\n <ABtnPrimary\n :color=\"dialogConfirmColor\"\n :loading=\"loading\"\n data-cy=\"button-confirm-delete\"\n @click.stop=\"onConfirm\"\n >\n {{ t(dialogConfirmButtonT) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script lang=\"ts\" setup>\nimport { useRouter } from 'vue-router'\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport type { ButtonVariant } from '@/types/commonAdmin'\nimport { computed } from 'vue'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n routeName: string\n recordId?: number | string | undefined\n routeParams?: any | undefined\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n loading?: boolean\n size?: number\n variant?: ButtonVariant\n }>(),\n {\n recordId: undefined,\n routeParams: undefined,\n buttonT: 'common.button.edit',\n buttonClass: 'ml-2',\n dataCy: 'button-edit',\n loading: false,\n size: 36,\n variant: 'primary',\n }\n)\nconst emit = defineEmits<{\n (e: 'editRecord'): void\n}>()\n\nconst { t } = useI18n()\n\nconst router = useRouter()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n emit('editRecord')\n router.push(routerToComputed.value)\n}\n\nconst routerToComputed = computed(() => {\n if (!isUndefined(props.routeParams)) {\n return { name: props.routeName, params: { ...props.routeParams } }\n }\n return { name: props.routeName, params: { id: props.recordId } }\n})\n\nconst variantComputed = computed(() => {\n switch (props.variant) {\n case 'secondary':\n return 'outlined'\n case 'tertiary':\n case 'icon':\n return 'text'\n default:\n return 'flat'\n }\n})\n</script>\n\n<template>\n <VBtn\n v-if=\"variant === 'icon'\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n size=\"small\"\n :variant=\"variantComputed\"\n :loading=\"loading\"\n :width=\"size\"\n :height=\"size\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-content-save\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-else\n :class=\"buttonClass\"\n :variant=\"variantComputed\"\n :data-cy=\"dataCy\"\n :loading=\"loading\"\n color=\"primary\"\n rounded=\"pill\"\n :height=\"size\"\n @click.stop=\"onClick\"\n >\n <span>{{ t(buttonT) }}</span>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport AIconGroup from '@/components/AIconGroup.vue'\n\nwithDefaults(\n defineProps<{\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n loading?: boolean\n disabled?: boolean\n }>(),\n {\n buttonT: 'common.button.saveAndClose',\n buttonClass: 'ml-2',\n dataCy: 'button-save-close',\n loading: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'saveRecordAndClose'): void\n}>()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n emit('saveRecordAndClose')\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n color=\"primary\"\n icon=\"\"\n variant=\"outlined\"\n :width=\"36\"\n :height=\"35\"\n @click.stop=\"onClick\"\n >\n <AIconGroup\n main-icon=\"mdi-content-save\"\n secondary-icon=\"mdi-close\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\nimport type { ButtonVariant } from '@/types/commonAdmin'\n\nconst props = withDefaults(\n defineProps<{\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n loading?: boolean\n disabled?: boolean\n size?: number\n variant?: ButtonVariant\n }>(),\n {\n buttonT: 'common.button.save',\n buttonClass: 'ml-2',\n dataCy: 'button-save',\n loading: undefined,\n disabled: undefined,\n size: 36,\n variant: 'primary',\n }\n)\nconst emit = defineEmits<{\n (e: 'saveRecord'): void\n}>()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n emit('saveRecord')\n}\n\nconst { t } = useI18n()\n\nconst variantComputed = computed(() => {\n switch (props.variant) {\n case 'secondary':\n return 'outlined'\n case 'tertiary':\n case 'icon':\n return 'text'\n default:\n return 'flat'\n }\n})\n</script>\n\n<template>\n <VBtn\n v-if=\"variant === 'icon'\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n size=\"small\"\n :variant=\"variantComputed\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :width=\"size\"\n :height=\"size\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-content-save\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-else\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :variant=\"variantComputed\"\n color=\"primary\"\n rounded=\"pill\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :height=\"size\"\n @click.stop=\"onClick\"\n >\n {{ t(buttonT) }}\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { useClipboard } from '@vueuse/core'\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport { isNumber, isString } from '@/utils/common'\nimport { numberToString } from '@/utils/number'\nimport { useAlerts } from '@/composables/system/alerts'\nimport AIconGroup from '@/components/AIconGroup.vue'\n\nconst props = withDefaults(\n defineProps<{\n id: number | string\n buttonT?: string\n buttonClass?: string\n iconT?: string\n notifyT?: string\n dataCy?: string\n size?: 'small' | 'x-small'\n }>(),\n {\n buttonT: 'common.button.copyId',\n buttonClass: 'ml-1',\n iconT: 'common.button.id',\n notifyT: 'common.alert.idWasCopied',\n dataCy: 'table-copy',\n size: 'x-small',\n }\n)\n\nconst { t } = useI18n()\nconst { copy, isSupported } = useClipboard()\nconst { showSuccess } = useAlerts()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n if (isNumber(props.id) && props.id > 0) {\n copy(numberToString(props.id)).then(() => {\n showSuccess(t(props.notifyT))\n })\n } else if (isString(props.id) && props.id.length) {\n copy(props.id).then(() => {\n showSuccess(t(props.notifyT))\n })\n }\n}\n</script>\n\n<template>\n <VBtn\n v-if=\"isSupported\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n :size=\"size\"\n variant=\"text\"\n @click.stop=\"onClick\"\n >\n <AIconGroup\n :secondary-text=\"t(iconT)\"\n main-icon=\"mdi-content-copy\"\n size=\"small\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n routeName: string\n recordId?: number | string | undefined\n routeParams?: any | undefined\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n }>(),\n {\n recordId: undefined,\n routeParams: undefined,\n buttonT: 'common.button.detail',\n buttonClass: 'ml-1',\n dataCy: 'table-detail',\n }\n)\n\nconst { t } = useI18n()\n\nconst routerToComputed = computed(() => {\n if (!isUndefined(props.routeParams)) {\n return { name: props.routeName, params: { ...props.routeParams } }\n }\n return { name: props.routeName, params: { id: props.recordId } }\n})\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :to=\"routerToComputed\"\n icon\n size=\"x-small\"\n variant=\"text\"\n @click.stop=\"() => {}\"\n >\n <VIcon icon=\"mdi-information-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n routeName: string\n recordId?: number | string | undefined\n routeParams?: any | undefined\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n }>(),\n {\n recordId: undefined,\n routeParams: undefined,\n buttonT: 'common.button.edit',\n buttonClass: 'ml-1',\n dataCy: 'table-edit',\n }\n)\n\nconst { t } = useI18n()\n\nconst routerToComputed = computed(() => {\n if (!isUndefined(props.routeParams)) {\n return { name: props.routeName, params: { ...props.routeParams } }\n }\n return { name: props.routeName, params: { id: props.recordId } }\n})\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :to=\"routerToComputed\"\n icon\n size=\"x-small\"\n variant=\"text\"\n @click.stop=\"() => {}\"\n >\n <VIcon icon=\"mdi-pencil\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(buttonT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { eventClickBlur } from '@/utils/event'\nimport type { ButtonVariantText } from '@/types/commonAdmin'\nimport { computed } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n loading?: boolean\n disabled?: boolean\n disableMore?: boolean\n size?: undefined | 'small' | 'x-small'\n variant?: ButtonVariantText\n rounded?: 'pill' | undefined\n color?: string\n }>(),\n {\n buttonT: '',\n buttonClass: 'ml-2',\n dataCy: 'button-save',\n loading: undefined,\n disabled: undefined,\n disableMore: false,\n size: undefined,\n variant: 'primary',\n rounded: undefined,\n color: 'primary',\n }\n)\nconst emit = defineEmits<{\n (e: 'onClick'): void\n}>()\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n emit('onClick')\n}\n\nconst variantComputed = computed(() => {\n switch (props.variant) {\n case 'secondary':\n return 'outlined'\n case 'tertiary':\n return 'text'\n default:\n return 'flat'\n }\n})\n\nconst loadingComputed = computed(() => {\n if (!props.loading) return false\n switch (variantComputed.value) {\n case 'flat':\n return 'white'\n default:\n return 'primary'\n }\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n v-if=\"disableMore\"\n :variant=\"variantComputed\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :color=\"color\"\n :rounded=\"rounded\"\n :size=\"size\"\n :loading=\"loadingComputed\"\n :disabled=\"disabled\"\n @click.stop=\"onClick\"\n >\n <slot name=\"button-content\">\n {{ t(buttonT) }}\n </slot>\n </VBtn>\n <div\n v-else\n class=\"a-button-split d-inline-flex\"\n :class=\"buttonClass + ' a-button-split--' + variant\"\n >\n <VBtn\n class=\"a-button-split__main\"\n :variant=\"variantComputed\"\n :data-cy=\"dataCy\"\n :loading=\"loadingComputed\"\n :disabled=\"disabled\"\n :size=\"size\"\n :rounded=\"rounded\"\n :color=\"color\"\n @click.stop=\"onClick\"\n >\n <slot name=\"button-content\">\n {{ t(buttonT) }}\n </slot>\n </VBtn>\n <div class=\"a-button-split__divider d-inline-flex\" />\n <VDivider\n v-if=\"variant === 'tertiary'\"\n vertical\n class=\"my-2 border-opacity-50\"\n :color=\"color\"\n />\n <VBtn\n :variant=\"variantComputed\"\n :disabled=\"disabled || loading\"\n :data-cy=\"dataCy\"\n :color=\"color\"\n :rounded=\"rounded\"\n :size=\"size\"\n class=\"a-button-split__more\"\n >\n <VIcon icon=\"mdi-chevron-down\" />\n <VMenu\n activator=\"parent\"\n location=\"bottom right\"\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <slot name=\"default\" />\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-button-split {\n .a-button-split__main {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n padding-right: 10px !important;\n }\n\n .a-button-split__more {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n padding: 0 4px 0 0 !important;\n min-width: 32px !important;\n }\n\n .a-button-split__divider {\n display: inline-block;\n width: 1px;\n }\n\n &--secondary {\n .a-button-split__more {\n left: -2px;\n }\n }\n}\n</style>\n","import { computed, readonly, ref } from 'vue'\nimport { useStorage } from '@vueuse/core'\n\nexport const ThemeSettings = {\n Light: 'light',\n Dark: 'dark',\n Auto: 'auto',\n} as const\nexport type ThemeSettingsType = (typeof ThemeSettings)[keyof typeof ThemeSettings]\n\nexport const Theme = {\n Light: 'light',\n Dark: 'dark',\n} as const\nexport type ThemeType = (typeof Theme)[keyof typeof Theme]\n\nconst storedSettings = useStorage('theme', ThemeSettings.Light)\n\nconst QUERY = '(prefers-color-scheme: dark)'\n\nconst settings = ref<ThemeSettingsType>(\n Object.values(ThemeSettings).some((val) => val === storedSettings.value)\n ? <ThemeSettingsType>storedSettings.value\n : ThemeSettings.Light\n)\nconst theme = ref<ThemeType>(Theme.Light)\nconst systemHasDarkPreference = ref(window.matchMedia && window.matchMedia(QUERY).matches)\n\nconst setTheme = () => {\n switch (settings.value) {\n case ThemeSettings.Auto:\n theme.value = systemHasDarkPreference.value ? Theme.Dark : Theme.Light\n break\n case ThemeSettings.Light:\n theme.value = Theme.Light\n break\n case ThemeSettings.Dark:\n theme.value = Theme.Dark\n break\n }\n}\nsetTheme()\n\nconst setThemeSettings = (value: ThemeSettingsType) => {\n settings.value = value\n storedSettings.value = value\n}\n\nwindow.matchMedia(QUERY).addEventListener('change', (event) => {\n systemHasDarkPreference.value = event.matches\n setTheme()\n})\n\nconst toolbarColor = computed(() => {\n return theme.value === Theme.Light ? 'white' : '#1A1A1A'\n})\n\nexport function useTheme() {\n const setThemeAuto = () => {\n setThemeSettings(ThemeSettings.Auto)\n setTheme()\n }\n\n const setThemeDark = () => {\n setThemeSettings(ThemeSettings.Dark)\n setTheme()\n }\n\n const setThemeLight = () => {\n setThemeSettings(ThemeSettings.Light)\n setTheme()\n }\n\n const toggleTheme = () => {\n switch (settings.value) {\n case ThemeSettings.Light:\n setThemeDark()\n break\n case ThemeSettings.Dark:\n setThemeAuto()\n break\n default:\n setThemeLight()\n break\n }\n }\n\n return {\n settings: readonly(settings),\n theme: readonly(theme),\n toolbarColor: readonly(toolbarColor),\n toggleTheme,\n setThemeAuto,\n setThemeDark,\n setThemeLight,\n }\n}\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { ref } from 'vue'\nimport { ThemeSettings, useTheme } from '@/composables/themeSettings'\n\nconst { setThemeDark, setThemeAuto, setThemeLight, settings } = useTheme()\n\nconst { t } = useI18n()\n\nconst isOpen = ref(false)\n</script>\n\n<template>\n <VMenu\n v-model=\"isOpen\"\n close-on-content-click\n >\n <template #activator=\"{ props }\">\n <VBtn\n class=\"pl-1\"\n rounded=\"pill\"\n v-bind=\"props\"\n variant=\"text\"\n data-cy=\"settings-theme\"\n >\n <div v-if=\"settings === ThemeSettings.Auto\">\n <VIcon\n class=\"mr-1\"\n icon=\"mdi-brightness-auto\"\n :size=\"32\"\n />{{ t('common.system.theme.auto') }}\n </div>\n <div v-else-if=\"settings === ThemeSettings.Light\">\n <VIcon\n class=\"mr-1\"\n icon=\"mdi-brightness-7\"\n :size=\"32\"\n />{{ t('common.system.theme.light') }}\n </div>\n <div v-else-if=\"settings === ThemeSettings.Dark\">\n <VIcon\n class=\"mr-1\"\n icon=\"mdi-brightness-4\"\n :size=\"32\"\n />{{ t('common.system.theme.dark') }}\n </div>\n </VBtn>\n </template>\n <VCard>\n <VList density=\"compact\">\n <VListItem\n :title=\"t('common.system.theme.auto')\"\n @click.stop=\"setThemeAuto\"\n >\n <template #prepend>\n <VIcon\n class=\"mr-2\"\n icon=\"mdi-brightness-auto\"\n />\n </template>\n </VListItem>\n <VListItem\n :title=\"t('common.system.theme.light')\"\n @click.stop=\"setThemeLight\"\n >\n <template #prepend>\n <VIcon\n class=\"mr-2\"\n icon=\"mdi-brightness-7\"\n />\n </template>\n </VListItem>\n <VListItem\n :title=\"t('common.system.theme.dark')\"\n @click.stop=\"setThemeDark\"\n >\n <template #prepend>\n <VIcon\n class=\"mr-2\"\n icon=\"mdi-brightness-4\"\n />\n </template>\n </VListItem>\n </VList>\n </VCard>\n </VMenu>\n</template>\n","import { useStorage } from '@vueuse/core'\nimport { readonly } from 'vue'\n// import { useLocale } from 'vuetify'\nimport { i18n } from '@/plugins/i18n'\n\n// use ISO 639-1 codes\nexport type LanguageCode = 'en' | 'sk' | 'cs' | 'xx'\n\nexport interface Language {\n code: LanguageCode\n title: string\n adminOnly?: boolean\n}\n\nexport const ALL_LANGUAGES = [\n {\n code: 'en',\n title: 'English',\n },\n {\n code: 'sk',\n title: 'Slovensky',\n },\n {\n code: 'cs',\n title: 'Česky',\n },\n {\n code: 'xx',\n title: 'Translation ID',\n adminOnly: true,\n },\n] as Language[]\n\nconst storedSettings = useStorage<LanguageCode | 'default'>('language', 'default')\n\nexport function modifyLanguageSettings(configAvailableLanguages: LanguageCode[], configDefaultLanguage: LanguageCode) {\n if (storedSettings.value === 'default') storedSettings.value = configDefaultLanguage\n // const { current } = useLocale()\n\n function addMessages(language: LanguageCode, messages: any) {\n if (!i18n || !i18n.global) return\n // @ts-ignore\n i18n.global.setLocaleMessage(language, messages)\n }\n\n const setLanguage = (code: LanguageCode) => {\n if (!i18n || !i18n.global) return false\n if (configAvailableLanguages.includes(code) || code === 'xx') {\n // current.value = code\n storedSettings.value = code\n // @ts-ignore\n i18n.global.locale.value = code\n\n return code\n }\n return false\n }\n\n const initializeLanguage = () => {\n if (!i18n || !i18n.global || storedSettings.value === 'default') return\n if (configAvailableLanguages.includes(storedSettings.value) || storedSettings.value === 'xx') {\n // current.value = storedSettings.value\n // @ts-ignore\n i18n.global.locale.value = storedSettings.value\n return\n }\n storedSettings.value = configDefaultLanguage\n // current.value = configDefaultLanguage\n // @ts-ignore\n i18n.global.locale.value = configDefaultLanguage\n }\n\n return {\n addMessages,\n initializeLanguage,\n currentLanguageCode: readonly(storedSettings),\n setLanguage,\n allLanguages: ALL_LANGUAGES,\n }\n}\n\nexport function useLanguageSettings() {\n return {\n currentLanguageCode: readonly(storedSettings),\n }\n}\n","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 0 7410 3900\"\n >\n <path\n fill=\"#b22234\"\n d=\"M0 0h7410v3900H0z\"\n />\n <path\n d=\"M0 450h7410m0 600H0m0 600h7410m0 600H0m0 600h7410m0 600H0\"\n stroke=\"#fff\"\n stroke-width=\"300\"\n />\n <path\n fill=\"#3c3b6e\"\n d=\"M0 0h2964v2100H0z\"\n />\n <g fill=\"#fff\">\n <g id=\"d\">\n <g id=\"c\">\n <g id=\"e\">\n <g id=\"b\">\n <path\n id=\"a\"\n d=\"M247 90l70.534 217.082-184.66-134.164h228.253L176.466 307.082z\"\n />\n <use\n xlink:href=\"#a\"\n y=\"420\"\n />\n <use\n xlink:href=\"#a\"\n y=\"840\"\n />\n <use\n xlink:href=\"#a\"\n y=\"1260\"\n />\n </g>\n <use\n xlink:href=\"#a\"\n y=\"1680\"\n />\n </g>\n <use\n xlink:href=\"#b\"\n x=\"247\"\n y=\"210\"\n />\n </g>\n <use\n xlink:href=\"#c\"\n x=\"494\"\n />\n </g>\n <use\n xlink:href=\"#d\"\n x=\"988\"\n />\n <use\n xlink:href=\"#c\"\n x=\"1976\"\n />\n <use\n xlink:href=\"#e\"\n x=\"2470\"\n />\n </g>\n </svg>\n</template>\n","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 900 600\"\n >\n <rect\n width=\"900\"\n height=\"600\"\n fill=\"#cccccc\"\n />\n </svg>\n</template>\n","<script setup lang=\"ts\">\nimport type { LanguageCode } from '@/composables/languageSettings'\nimport { computed } from 'vue'\nimport FlagSk from '@/components/flags/FlagSk.vue'\nimport FlagEn from '@/components/flags/FlagEn.vue'\nimport FlagEmpty from '@/components/flags/FlagEmpty.vue'\n\n// flag source: https://github.com/hampusborgos/country-flags\n\nconst props = withDefaults(\n defineProps<{\n code?: LanguageCode | undefined\n dataCy?: string\n }>(),\n {\n code: 'xx',\n dataCy: 'flag-country',\n }\n)\n\nconst currentFlagComponent = computed(() => {\n switch (props.code) {\n case 'sk':\n return FlagSk\n case 'en':\n return FlagEn\n default:\n return FlagEmpty\n }\n})\n</script>\n\n<template>\n <div class=\"flag\">\n <component\n :is=\"currentFlagComponent\"\n :data-cy=\"dataCy\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Language, LanguageCode } from '@/composables/languageSettings'\nimport { ALL_LANGUAGES, modifyLanguageSettings, useLanguageSettings } from '@/composables/languageSettings'\nimport { computed, inject } from 'vue'\nimport { isUndefined } from '@/utils/common'\nimport FlagCountry from '@/components/flags/FlagCountry.vue'\nimport { AvailableLanguagesSymbol, DefaultLanguageSymbol } from '@/components/injectionKeys'\nimport { defineAuth, ROLE_SUPER_ADMIN } from '@/composables/auth/defineAuth'\nimport type { AclValue } from '@/types/Permission'\n\nconst props = withDefaults(\n defineProps<{\n system: string\n }>(),\n {}\n)\n\nconst emit = defineEmits<{\n (e: 'afterChange', code: LanguageCode): void\n}>()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { useCurrentUser } = defineAuth<AclValue>(props.system)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { currentUser } = useCurrentUser(props.system)\n\nconst configAvailableLanguages = inject(AvailableLanguagesSymbol) as LanguageCode[]\nconst configDefaultLanguage = inject(DefaultLanguageSymbol) as LanguageCode\n// @ts-ignore\nconst { setLanguage } = modifyLanguageSettings(configAvailableLanguages, configDefaultLanguage)\nconst { currentLanguageCode } = useLanguageSettings()\n\nconst onLanguageChange = (code: LanguageCode) => {\n const result = setLanguage(code)\n if (result) emit('afterChange', code)\n}\n\nconst currentLocale = computed(() => {\n const found = ALL_LANGUAGES.find((item) => item.code === currentLanguageCode.value)\n if (isUndefined(found)) {\n return ALL_LANGUAGES[0]\n }\n return found as Language\n})\n\nconst availableLocales = computed(() => {\n return ALL_LANGUAGES.filter(\n (item) =>\n (configAvailableLanguages.includes(item.code) || item.code === 'xx') &&\n (!item.adminOnly || currentUser.value?.roles.includes(ROLE_SUPER_ADMIN))\n )\n})\n</script>\n\n<template>\n <VMenu>\n <template #activator=\"{ props: activatorProps }\">\n <VBtn\n class=\"pl-1\"\n rounded=\"pill\"\n v-bind=\"activatorProps\"\n variant=\"text\"\n data-cy=\"settings-language\"\n >\n <VAvatar\n class=\"mr-1\"\n size=\"30\"\n >\n <FlagCountry :code=\"currentLocale?.code\" />\n </VAvatar>\n {{ currentLocale.title }}\n </VBtn>\n </template>\n <VCard>\n <VList density=\"compact\">\n <VListItem\n v-for=\"locale in availableLocales\"\n :key=\"locale.code\"\n @click.stop=\"onLanguageChange(locale.code)\"\n >\n <VListItemTitle>\n <VAvatar\n class=\"mr-1\"\n size=\"30\"\n >\n <FlagCountry :code=\"locale.code\" />\n </VAvatar>\n {{ locale.title }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VCard>\n </VMenu>\n</template>\n\n<style lang=\"scss\" scoped>\n.flag {\n position: relative;\n width: 30px;\n height: 30px;\n\n :deep(svg) {\n width: 90px;\n height: 60px;\n position: absolute;\n top: -15px;\n left: -27px;\n transform: scale(0.7);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\n\nconst { t } = useI18n()\n\nconst reloadAdmin = () => {\n window.location.reload()\n}\n</script>\n\n<template>\n <span\n v-once\n class=\"system-bar-new-version\"\n >\n {{ t('common.system.newVersionText') }}\n <span\n class=\"text-decoration-underline cursor-pointer\"\n @click.stop=\"reloadAdmin\"\n >\n {{ t('common.system.newVersionReload') }}\n </span>\n </span>\n</template>\n","export const isAnzuApiForbiddenError = (error: unknown): error is AnzuNewVersionFetchError => {\n return error instanceof AnzuNewVersionFetchError\n}\n\nexport class AnzuNewVersionFetchError extends Error {\n constructor(message = '') {\n super(message)\n this.name = 'AnzuNewVersionFetchError'\n this.message = message\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport { useIntervalFn } from '@vueuse/core'\nimport ASystemBarNewVersion from '@/components/systemBar/ASystemBarNewVersion.vue'\nimport { isUndefined } from '@/utils/common'\nimport { AnzuNewVersionFetchError } from '@/model/error/AnzuNewVersionFetchError'\n\nconst props = withDefaults(\n defineProps<{\n currentVersion: string\n checkInterval?: number\n jsonRelativePath?: string\n }>(),\n {\n checkInterval: 60000,\n jsonRelativePath: 'config.json',\n }\n)\n\nconst showSystemBar = ref(false)\n\nconst checkNewVersion = async () => {\n try {\n const res = await fetch(`/${props.jsonRelativePath}?random=${Date.now()}`)\n if (res.ok) {\n const contentType = res.headers.get('content-type')\n if (!contentType || !contentType.includes('application/json')) {\n throw new AnzuNewVersionFetchError('Unable to load env config. Incorrect content type.')\n }\n const json = await res.json()\n if (Object.keys(json).length < 1) {\n throw new AnzuNewVersionFetchError('Unable to load env config. Incorrect response body.')\n }\n showSystemBar.value = !isUndefined(json.appVersion) && json.appVersion !== props.currentVersion\n\n return\n }\n throw new AnzuNewVersionFetchError('Unable to load env config. Incorrect response code.')\n } catch (error) {\n if (error instanceof AnzuNewVersionFetchError) {\n console.log(error.message)\n return\n }\n if (error instanceof SyntaxError) {\n console.log('There was a SyntaxError', error)\n return\n }\n console.log('There was an error in new version fetch', error)\n }\n}\n\nconst systemBarComponent = computed(() => {\n return ASystemBarNewVersion\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pause } = useIntervalFn(() => {\n checkNewVersion()\n}, props.checkInterval)\n\nonBeforeUnmount(() => {\n pause()\n})\n</script>\n\n<template>\n <VAppBar\n v-if=\"showSystemBar\"\n height=\"48\"\n color=\"orange accent-3\"\n elevation=\"0\"\n :order=\"-1\"\n >\n <div class=\"text-center w-100 text-caption pb-1\">\n <component :is=\"systemBarComponent\" />\n </div>\n </VAppBar>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string\n label?: string\n loading?: boolean\n readonly?: boolean\n required?: boolean\n randomColor?: boolean\n hideLabel?: boolean\n }>(),\n {\n label: '',\n loading: false,\n readonly: false,\n required: false,\n randomColor: false,\n hideLabel: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: string): void\n}>()\n\nconst swatches = [\n ['#F44336', '#E91E63', '#9C27B0', '#673AB7'],\n ['#2196F3', '#03A9F4', '#00BCD4', '#009688'],\n ['#4CAF50', '#8BC34A', '#CDDC39', '#F9A825'],\n ['#FF6F00', '#FF5722', '#795548', '#607D8B'],\n ['#757575', '#000000', '#3F51B5'],\n]\nconst generatedColor = ref('')\n\nconst generateRandomColor = () => {\n const randomRow = Math.floor(Math.random() * swatches.length)\n generatedColor.value = swatches[randomRow][Math.floor(Math.random() * swatches[randomRow].length)]\n return generatedColor.value\n}\n\nconst variantComputed = computed(() => {\n return props.modelValue.length > 0 ? 'flat' : 'tonal'\n})\n\nconst buttonColorComputed = computed(() => {\n return props.modelValue.length > 0 ? props.modelValue : undefined\n})\n\nconst onColorPickerChange = (newColor: string) => {\n emit('update:modelValue', newColor)\n}\n\nwatch(\n () => props.modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (newValue.length === 7) return\n if (newValue.length !== 7 && props.randomColor) {\n if (generatedColor.value === '') {\n emit('update:modelValue', generateRandomColor())\n return\n }\n emit('update:modelValue', generatedColor.value)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div>\n <label\n v-if=\"!hideLabel\"\n class=\"v-label mr-2\"\n >\n {{ label }}\n <span\n v-if=\"required\"\n class=\"required\"\n />\n </label>\n <VBtn\n :variant=\"variantComputed\"\n icon\n :color=\"buttonColorComputed\"\n >\n <VMenu\n v-if=\"!readonly\"\n activator=\"parent\"\n >\n <VCard>\n <VColorPicker\n :model-value=\"buttonColorComputed\"\n :swatches=\"swatches\"\n class=\"a-color-picker--hide-controls\"\n elevation=\"0\"\n hide-canvas\n hide-inputs\n show-swatches\n @update:model-value=\"onColorPickerChange\"\n />\n </VCard>\n </VMenu>\n </VBtn>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-color-picker--hide-controls .v-color-picker__controls {\n display: none;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { ref } from 'vue'\nimport type { AnzuUserMinimal } from '@/types/AnzuUser'\nimport AAnzuUserAvatar from '@/components/AAnzuUserAvatar.vue'\n\nwithDefaults(\n defineProps<{\n currentUser: AnzuUserMinimal | undefined | null\n settingsRouteName: string\n logoutRouteName: string\n dataCy?: string\n }>(),\n {\n dataCy: 'navbar-user',\n }\n)\n\nconst { t } = useI18n()\n\nconst logoutDialog = ref(false)\n</script>\n\n<template>\n <VBtn\n variant=\"text\"\n icon\n size=\"small\"\n :data-cy=\"dataCy\"\n >\n <AAnzuUserAvatar\n :size=\"32\"\n :user=\"currentUser\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"top\"\n >\n {{ t('common.system.currentUser.button') }}\n </VTooltip>\n <VMenu\n v-if=\"currentUser\"\n activator=\"parent\"\n >\n <VCard>\n <VList class=\"pb-0\">\n <VListItem\n class=\"pb-6\"\n lines=\"two\"\n >\n <template #prepend>\n <AAnzuUserAvatar\n :user=\"currentUser\"\n :size=\"40\"\n />\n </template>\n <VListItemTitle>{{ currentUser.person.fullName }}</VListItemTitle>\n <VListItemSubtitle>\n {{ currentUser.email }}<br>\n {{ currentUser.id }}\n </VListItemSubtitle>\n </VListItem>\n <VDivider />\n <VListItem\n :active=\"false\"\n prepend-icon=\"mdi-cog\"\n :to=\"{ name: settingsRouteName }\"\n data-cy=\"navbar-user-settings\"\n >\n {{ t('common.system.currentUser.settings') }}\n </VListItem>\n <VListItem\n prepend-icon=\"mdi-logout\"\n data-cy=\"navbar-user-logout\"\n @click.stop=\"logoutDialog = true\"\n >\n {{ t('common.system.currentUser.logout') }}\n <VDialog\n v-model=\"logoutDialog\"\n width=\"auto\"\n >\n <VCard v-if=\"logoutDialog\">\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n >\n <VToolbarTitle class=\"flex-fill\">\n {{ t('common.system.currentUser.logout') }}\n </VToolbarTitle>\n <VSpacer />\n <VBtn\n class=\"ml-2\"\n icon=\"mdi-close\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"button-close\"\n @click.stop=\"logoutDialog = false\"\n />\n </VToolbar>\n <VCardText>{{ t('common.system.currentUser.logoutText') }}</VCardText>\n <VCardActions>\n <VSpacer />\n <VBtn\n color=\"secondary\"\n variant=\"text\"\n data-cy=\"button-cancel\"\n @click.stop=\"logoutDialog = false\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n data-cy=\"button-confirm\"\n :to=\"{ name: logoutRouteName }\"\n >\n {{ t('common.system.currentUser.logoutConfirm') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n </VListItem>\n </VList>\n </VCard>\n </VMenu>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, inject, ref, toRefs, watch } from 'vue'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport type { FilterBag } from '@/types/Filter'\nimport type { Pagination } from '@/types/Pagination'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { cloneDeep, isArray, isNull, isUndefined } from '@/utils/common'\nimport { SubjectScopeSymbol, SystemScopeSymbol } from '@/components/injectionKeys'\nimport { usePagination } from '@/composables/system/pagination'\nimport { stringSplitOnFirstOccurrence } from '@/utils/string'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\n// type FetchItemsByIdsType =\n// | ((ids: IntegerId[]) => Promise<ValueObjectOption<IntegerId>[]>)\n// | ((ids: DocId[]) => Promise<ValueObjectOption<DocId>[]>)\n\ntype FetchItemsMinimalType = (pagination: Pagination, filterBag: FilterBag) => Promise<any[]>\n\ntype UseCachedType = () => {\n fetch: any\n add: any\n addManualMinimal: any\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n label?: string | undefined\n required?: boolean\n multiple?: boolean\n clearable?: boolean\n v?: any\n errorMessage?: string\n hideLabel?: boolean\n fetchItemsMinimal: FetchItemsMinimalType\n innerFilter: FilterBag\n filterByField?: string\n filterSortBy?: string | null\n loading?: boolean\n useCached: UseCachedType\n itemTitle?: string\n itemValue?: string\n minSearchChars?: number\n minSearchText?: string\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideLabel: false,\n filterByField: 'name',\n filterSortBy: 'createdAt',\n loading: false,\n itemTitle: 'name',\n itemValue: 'id',\n minSearchChars: 1,\n minSearchText: '',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'blur', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'focus', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n}>()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetch, add, addManualMinimal } = props.useCached()\n\nconst MIN_SEARCH_CHARS = 3\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (\n fetchedItemsMinimal.value.size === 0 &&\n search.value.length < MIN_SEARCH_CHARS &&\n props.minSearchText.length > 0\n ) {\n return props.minSearchText\n }\n return undefined\n})\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined) {\n emit('update:modelValue', cloneDeep<DocId | IntegerId | DocId[] | IntegerId[] | null | undefined>(newValue))\n },\n})\n\nconst { t } = useI18n()\nconst system = inject<string | undefined>(SystemScopeSymbol, undefined)\nconst subject = inject<string | undefined>(SubjectScopeSymbol, undefined)\n\nconst isFocused = ref(false)\nconst search = ref('')\nconst loadingLocal = ref(false)\nconst { innerFilter } = toRefs(props)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst pagination = usePagination(props.filterSortBy)\n\nconst fetchedItemsMinimal = ref<Map<IntegerId | DocId, any>>(new Map())\n// const fetchedItems = ref<Map<IntegerId | DocId, string>>(new Map())\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', modelValue.value)\n}\n\nconst onBlur = () => {\n isFocused.value = false\n props.v?.$touch()\n emit('blur', modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (!isUndefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item: ErrorObject) => item.$message)\n return []\n})\n\nconst labelComputed = computed(() => {\n if (!isUndefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (!isUndefined(props.required)) return props.required\n return props.v?.required && props.v?.required.$params.type === 'required'\n})\n\nconst onSearchUpdate = (query: string) => {\n // if (!props.multiple && !isFocused.value && query.length === 0) return // vuetify fix\n search.value = query\n}\n\nconst apiSearch = async (query: string) => {\n if (query.length < MIN_SEARCH_CHARS) {\n fetchedItemsMinimal.value.clear()\n return\n }\n loadingLocal.value = true\n const filterField = innerFilter.value[props.filterByField]\n filterField.model = query\n fetchedItemsMinimal.value.clear()\n const res = await props.fetchItemsMinimal(pagination, innerFilter.value)\n res.forEach((item: any) => {\n fetchedItemsMinimal.value.set(item[props.itemValue], item)\n })\n loadingLocal.value = false\n}\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final: Map<IntegerId | DocId, string> = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n if (isArray(modelValue.value)) {\n modelValue.value.forEach((value: any) => {\n final.set(value, '')\n })\n } else if (modelValue.value) {\n final.set(modelValue.value, '')\n }\n fetchedItemsMinimal.value.forEach((value) => {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\n})\n\nconst tryToAddFromFetchedItems = (ids: Set<DocId | IntegerId>) => {\n return new Promise<boolean>((resolve) => {\n fetchedItemsMinimal.value.forEach((value, key) => {\n if (ids.has(key)) {\n addManualMinimal(cloneDeep(value))\n }\n })\n return resolve(true)\n })\n}\n\nconst onClickClear = () => {\n apiSearch('')\n if (props.multiple) {\n modelValue.value = []\n return\n }\n modelValue.value = null\n}\n\n// const deleteWasPressedTime = ref(0)\n// const onKeydownDelete = () => {\n// deleteWasPressedTime.value = Date.now()\n// }\n\nwatchDebounced(\n search,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n apiSearch(newValue)\n emit('searchChangeDebounced', newValue)\n }\n },\n { debounce: 300 }\n)\n\nwatch(search, (newValue, oldValue) => {\n // if (newValue.length === 0 && isFocused.value === true) {\n // const now = Date.now()\n // if (now - deleteWasPressedTime.value > 200) {\n // search.value = oldValue\n // return\n // }\n // }\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nwatch(\n modelValue,\n async (newValue) => {\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n const values = isArray(newValue) ? newValue : [newValue]\n const idsToFetch = new Set(values)\n await tryToAddFromFetchedItems(idsToFetch)\n\n if (idsToFetch.size > 0) {\n add(Array.from(idsToFetch) as Array<DocId & IntegerId>)\n fetch()\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n v-model:search=\"search\"\n chips\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :loading=\"loadingLocal\"\n :no-data-text=\"noDataText\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @update:search=\"onSearchUpdate\"\n @click:clear=\"onClickClear\"\n >\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"required\"\n />\n </span>\n </template>\n <template\n v-if=\"!multiple\"\n #selection\n />\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, item: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, item: itemItem }\">\n <slot\n name=\"item\"\n :props=\"itemProps\"\n :item=\"itemItem\"\n >\n <VListItem :props=\"itemProps\" />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\n\nwithDefaults(\n defineProps<{\n title?: string | undefined\n logoUrl?: string | undefined\n loginUrl?: undefined | (() => string)\n dataCy?: string\n }>(),\n {\n title: undefined,\n logoUrl: undefined,\n loginUrl: undefined,\n dataCy: 'button-login',\n }\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"d-flex justify-center align-center fill-height\">\n <div class=\"d-flex justify-center align-center flex-column\">\n <img\n :src=\"logoUrl\"\n class=\"logo pb-2\"\n alt=\"\"\n >\n <h1\n v-if=\"title\"\n class=\"display-1 my-3\"\n >\n {{ title }}\n </h1>\n <h4 class=\"mb-3 body-1\">\n <span>{{ t('common.system.login.text') }}</span>\n </h4>\n <div class=\"py-5\">\n <VBtn\n v-if=\"loginUrl\"\n :data-cy=\"dataCy\"\n :href=\"loginUrl()\"\n color=\"primary\"\n size=\"large\"\n >\n {{ t('common.system.login.text') }}\n </VBtn>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.logo {\n display: block;\n max-width: 120px;\n height: auto;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { onMounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n logoutUrl?: undefined | (() => string)\n }>(),\n {\n logoutUrl: undefined,\n }\n)\n\nonMounted(() => {\n if (!props.logoutUrl) return\n window.location.href = props.logoutUrl()\n})\n</script>\n\n<template>\n <div />\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\n\nwithDefaults(\n defineProps<{\n returnRouteName: string\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"d-flex justify-center align-center fill-height\">\n <div class=\"d-flex flex-column align-center\">\n <h1 class=\"d-flex justify-center align-center text-primary\">\n <VIcon\n size=\"x-large\"\n icon=\"mdi-emoticon-cry\"\n />\n <span>{{ t('common.system.unauthorized.title') }}</span>\n </h1>\n\n <p class=\"pa-4\">\n {{ t('common.system.unauthorized.text') }}\n </p>\n\n <VBtn\n :to=\"{ name: returnRouteName }\"\n color=\"primary\"\n size=\"large\"\n >\n {{ t('common.system.unauthorized.backButton') }}\n </VBtn>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\n\nwithDefaults(\n defineProps<{\n returnRouteName: string\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"d-flex justify-center align-center fill-height\">\n <div class=\"d-flex flex-column align-center\">\n <h1 class=\"d-flex justify-center align-center text-primary\">\n <VIcon\n size=\"x-large\"\n icon=\"mdi-emoticon-cry\"\n />\n <span>{{ t('common.system.notFound.title') }}</span>\n </h1>\n\n <p class=\"pa-4\">\n {{ t('common.system.notFound.text') }}\n </p>\n\n <VBtn\n :to=\"{ name: returnRouteName }\"\n color=\"primary\"\n size=\"large\"\n >\n {{ t('common.system.notFound.backButton') }}\n </VBtn>\n </div>\n </div>\n</template>\n","import { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { objectGetValueByPath } from '@/lib'\n\nexport const useJobPriority = () => {\n const { t } = useI18n()\n const priorityLabels = computed(() => {\n return {\n 0: t('common.job.meta.priority.low'),\n 1: t('common.job.meta.priority.medium'),\n 2: t('common.job.meta.priority.high'),\n }\n })\n\n const getPriorityColor = (priority: number): string => {\n switch (priority) {\n case 0: return 'amber'\n case 1: return 'primary'\n case 2: return 'red'\n default: return 'default'\n }\n }\n\n const getPriorityLabel = (priority: number): string => {\n return objectGetValueByPath(priorityLabels.value, priority.toString()) ?? priority.toString()\n }\n\n return {\n priorityLabels,\n getPriorityColor,\n getPriorityLabel,\n }\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useJobPriority } from '@/components/job/composables/jobPriority'\nimport AChipNoLink from '@/components/AChipNoLink.vue'\n\nconst props = defineProps<{\n priority: number\n}>()\nconst { getPriorityLabel, getPriorityColor } = useJobPriority()\nconst priorityColor = computed(() => {\n return getPriorityColor(props.priority)\n})\nconst priorityLabel = computed(() => {\n return getPriorityLabel(props.priority)\n})\n\n</script>\n\n<template>\n <AChipNoLink\n :color=\"priorityColor\"\n >\n {{ priorityLabel }}\n </AChipNoLink>\n</template>\n","<script lang=\"ts\" setup>\nimport type { JobBase } from '@/types/Job'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/components/ARow.vue'\nimport AJobStatusChip from '@/components/job/AJobStatusChip.vue'\nimport AJobPriorityChip from '@/components/job/AJobPriorityChip.vue'\nimport ADatetime from '@/components/datetime/ADatetime.vue'\n\nwithDefaults(\n defineProps<{\n job: JobBase\n loading?: boolean\n }>(),\n {\n loading: false,\n }\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div>\n <ARow\n :title=\"t('common.job.model.id')\"\n :value=\"job.id\"\n />\n <ARow :title=\"t('common.job.model._resourceName')\">\n <slot name=\"resource-name\">\n {{ job._resourceName }}\n </slot>\n </ARow>\n <ARow :title=\"t('common.job.model.status')\">\n <AJobStatusChip :value=\"job.status\" />\n </ARow>\n <ARow :title=\"t('common.job.model.priority')\">\n <AJobPriorityChip :priority=\"job.priority\" />\n </ARow>\n <ARow :title=\"t('common.job.model.scheduledAt')\">\n <ADatetime :date-time=\"job.scheduledAt\" />\n </ARow>\n <ARow :title=\"t('common.job.model.startedAt')\">\n <ADatetime :date-time=\"job.startedAt\" />\n </ARow>\n <ARow :title=\"t('common.job.model.finishedAt')\">\n <ADatetime :date-time=\"job.finishedAt\" />\n </ARow>\n <ARow\n :title=\"t('common.job.model.result')\"\n :value=\"job.result\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { JobBase } from '@/types/Job'\nimport { useJobPriority } from '@/components/job/composables/jobPriority'\nimport ARow from '@/components/ARow.vue'\nimport AFormDatetimePicker from '@/components/form/AFormDatetimePicker.vue'\nimport { useI18n } from 'vue-i18n'\n\nconst modelValue = defineModel<JobBase>({ required: true })\nconst { priorityLabels, getPriorityColor } = useJobPriority()\nconst sliderColor = computed(() => {\n return getPriorityColor(modelValue.value.priority)\n})\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow>\n <AFormDatetimePicker\n v-model=\"modelValue.scheduledAt\"\n :label=\"t('common.job.model.scheduledAt')\"\n />\n </ARow>\n <ARow>\n <VSlider\n v-model=\"modelValue.priority\"\n :ticks=\"priorityLabels\"\n :max=\"2\"\n step=\"1\"\n show-ticks=\"always\"\n tick-size=\"3\"\n :color=\"sliderColor\"\n />\n </ARow>\n</template>\n","import { reactive } from 'vue'\nimport { makeFilterHelper } from '@/lib'\n\nconst makeFilter = makeFilterHelper('common', 'assetSelect')\n\nconst filter = reactive({\n _elastic: {\n ...makeFilter({ exclude: true }),\n },\n text: {\n ...makeFilter({ name: 'text', variant: 'search' }),\n },\n type: {\n ...makeFilter({ name: 'type', default: [] }),\n },\n status: {\n ...makeFilter({ name: 'status', default: ['with_file'] }),\n },\n keywordIds: {\n ...makeFilter({ name: 'keywordIds', default: [], multiple: true }),\n },\n assetAndMainFileIds: {\n ...makeFilter({ name: 'assetAndMainFileIds' }),\n },\n authorIds: {\n ...makeFilter({ name: 'authorIds', default: [], multiple: true }),\n },\n createdByIds: {\n ...makeFilter({ name: 'createdByIds', default: [], multiple: true }),\n },\n mostDominantColor: {\n ...makeFilter({ name: 'mostDominantColor', default: [] }),\n },\n closestMostDominantColor: {\n ...makeFilter({ name: 'closestMostDominantColor', default: [] }),\n },\n codecName: {\n ...makeFilter({ name: 'codecName', default: [] }),\n },\n orientation: {\n ...makeFilter({ name: 'orientation', default: [] }),\n },\n described: {\n ...makeFilter({ name: 'described', default: null }),\n },\n visible: {\n ...makeFilter({ name: 'visible', default: true }),\n },\n generatedBySystem: {\n ...makeFilter({ name: 'generatedBySystem', default: false }),\n },\n inPodcast: {\n ...makeFilter({ name: 'inPodcast', default: null }),\n },\n fromRss: {\n ...makeFilter({ name: 'fromRss', default: null }),\n },\n slotNames: {\n ...makeFilter({ name: 'slotNames', default: [] }),\n },\n distributedInServices: {\n ...makeFilter({ name: 'distributedInServices', default: [], multiple: true }),\n },\n licences: {\n ...makeFilter({ name: 'licences', default: [] }),\n },\n shortestDimensionFrom: {\n ...makeFilter({ name: 'shortestDimensionFrom', default: null }),\n },\n shortestDimensionUntil: {\n ...makeFilter({ name: 'shortestDimensionUntil', default: null }),\n },\n pixelSizeFrom: {\n ...makeFilter({ name: 'pixelSizeFrom', default: null }),\n },\n pixelSizeUntil: {\n ...makeFilter({ name: 'pixelSizeUntil', default: null }),\n },\n widthFrom: {\n ...makeFilter({ name: 'widthFrom', default: null }),\n },\n widthUntil: {\n ...makeFilter({ name: 'widthUntil', default: null }),\n },\n heightFrom: {\n ...makeFilter({ name: 'heightFrom', default: null }),\n },\n heightUntil: {\n ...makeFilter({ name: 'heightUntil', default: null }),\n },\n ratioWidthFrom: {\n ...makeFilter({ name: 'ratioWidthFrom', default: null }),\n },\n ratioWidthUntil: {\n ...makeFilter({ name: 'ratioWidthUntil', default: null }),\n },\n ratioHeightFrom: {\n ...makeFilter({ name: 'ratioHeightFrom', default: null }),\n },\n ratioHeightUntil: {\n ...makeFilter({ name: 'ratioHeightUntil', default: null }),\n },\n rotationFrom: {\n ...makeFilter({ name: 'rotationFrom', default: null }),\n },\n rotationUntil: {\n ...makeFilter({ name: 'rotationUntil', default: null }),\n },\n durationFrom: {\n ...makeFilter({ name: 'durationFrom', default: null }),\n },\n durationUntil: {\n ...makeFilter({ name: 'durationUntil', default: null }),\n },\n bitrateFrom: {\n ...makeFilter({ name: 'bitrateFrom', default: null }),\n },\n bitrateUntil: {\n ...makeFilter({ name: 'bitrateUntil', default: null }),\n },\n slotsCountFrom: {\n ...makeFilter({ name: 'slotsCountFrom', default: null }),\n },\n slotsCountUntil: {\n ...makeFilter({ name: 'slotsCountUntil', default: null }),\n },\n createdAtFrom: {\n ...makeFilter({ name: 'createdAtFrom', default: null }),\n },\n createdAtUntil: {\n ...makeFilter({ name: 'createdAtUntil', default: null }),\n },\n mainFileSingleUse: {\n ...makeFilter({ name: 'mainFileSingleUse', default: false }),\n },\n})\n\nexport function useAssetListFilter() {\n return filter\n}\n","import type { DocId } from '@/types/common'\nimport type { AssetSearchListItemDto } from '@/types/coreDam/Asset'\n\nexport const AssetSelectReturnType = {\n MainFileId: 'mainFileId',\n AssetId: 'assetId',\n Asset: 'asset',\n} as const\nexport type AssetSelectReturnTypeType = (typeof AssetSelectReturnType)[keyof typeof AssetSelectReturnType]\n\nexport type AssetSelectReturnData = AssetSelectReturnMainFileId | AssetSelectReturnAssetId | AssetSelectReturnAsset\n\ninterface AssetSelectReturnMainFileId {\n type: typeof AssetSelectReturnType.MainFileId,\n value: Array<DocId>\n}\n\ninterface AssetSelectReturnAssetId {\n type: typeof AssetSelectReturnType.AssetId\n value: Array<DocId>\n}\n\ninterface AssetSelectReturnAsset {\n type: typeof AssetSelectReturnType.Asset\n value: Array<AssetSearchListItemDto>\n}\n","import type { DocId, DocIdNullable, IntegerId } from '@/types/common'\nimport type { AnzuUserAndTimeTrackingAware } from '@/types/AnzuUserAndTimeTrackingAware'\nimport type { ResourceNameSystemAware } from '@/types/ResourceNameSystemAware'\nimport type { AssetFile } from '@/types/coreDam/AssetFile'\n\ninterface Texts {\n displayTitle: string\n}\n\nexport type DamDistributionServiceName = string\n\nexport const DamAssetStatus = {\n Draft: 'draft',\n WithFile: 'with_file',\n Deleting: 'deleting',\n} as const\nexport type DamAssetStatusType = (typeof DamAssetStatus)[keyof typeof DamAssetStatus]\nexport const DamAssetStatusDefault = DamAssetStatus.Draft\n\nexport const DamAssetType = {\n Image: 'image',\n Audio: 'audio',\n Video: 'video',\n Document: 'document',\n} as const\nexport type DamAssetTypeType = (typeof DamAssetType)[keyof typeof DamAssetType]\nexport const DamAssetTypeDefault = DamAssetType.Image\n\ninterface Attributes {\n assetType: DamAssetTypeType\n assetStatus: DamAssetStatusType\n}\n\nexport interface AssetFileProperties {\n distributesInServices: DamDistributionServiceName[]\n slotNames: string[]\n fromRss: boolean\n width: number\n height: number\n}\n\ninterface Flags {\n described: boolean\n visible: boolean\n}\n\nexport interface AssetMetadataSuggestions extends Record<string, Array<string>> {}\n\nexport type AssetCustomData = Record<string, any>\n\ninterface Metadata {\n authorSuggestions: AssetMetadataSuggestions\n keywordSuggestions: AssetMetadataSuggestions\n customData: any\n}\n\nexport interface AssetSearchListItemDto extends AnzuUserAndTimeTrackingAware, ResourceNameSystemAware {\n id: DocId\n texts: Texts\n attributes: Attributes\n flags: Flags\n licence: IntegerId\n mainFile: null | AssetFile\n keywords: DocId[]\n authors: DocId[]\n podcasts: DocId[]\n assetFileProperties: AssetFileProperties\n mainFileSingleUse: Readonly<boolean | null>\n}\n\nexport interface AssetDetailItemDto extends AnzuUserAndTimeTrackingAware, ResourceNameSystemAware {\n id: DocId\n texts: Texts\n attributes: Attributes\n flags: Flags\n licence: IntegerId\n mainFile: null | AssetFile\n keywords: DocId[]\n authors: DocId[]\n podcasts: DocId[]\n metadata: Metadata\n distributionCategory: DocIdNullable\n assetFileProperties: AssetFileProperties\n mainFileSingleUse: Readonly<boolean | null>\n}\n\nexport interface AssetMetadataDto extends AnzuUserAndTimeTrackingAware, ResourceNameSystemAware, Metadata {\n id: DocId\n customData: AssetCustomData\n}\n\nexport type AssetExternalProviderId = string | number\nexport type AssetExternalProviderIdNullable = AssetExternalProviderId | null\n\nexport type AssetExternalProviderMetadata = Record<string, string | number | number[] | string[] | boolean>\n","import { acceptHMRUpdate, defineStore } from 'pinia'\nimport type { AssetSearchListItemDto, DamAssetTypeType } from '@/types/coreDam/Asset'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { computed, ref, toRaw } from 'vue'\nimport {\n type AssetSelectReturnData,\n AssetSelectReturnType,\n type AssetSelectReturnTypeType\n} from '@/types/coreDam/AssetSelect'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { DamAssetTypeDefault } from '@/types/coreDam/Asset'\n\nexport interface AssetSelectListItem {\n asset: AssetSearchListItemDto\n selected: boolean\n}\n\nexport const useAssetSelectStore = defineStore('commonAdminCoreDamAssetSelectStore', () => {\n const assetListItems = ref<Array<AssetSelectListItem>>([])\n const loader = ref(false)\n const selectedLicenceId = ref<IntegerId>(0)\n const selectConfig = ref<DamConfigLicenceExtSystemReturnType[]>([])\n const assetType = ref<DamAssetTypeType>(DamAssetTypeDefault)\n const selectedAssets = ref<Map<DocId, AssetSelectListItem>>(new Map())\n const singleMode = ref(false)\n const minCount = ref(0)\n const maxCount = ref(0)\n\n function showLoader() {\n loader.value = true\n }\n\n function hideLoader() {\n loader.value = false\n }\n\n function setSelectConfig(value: DamConfigLicenceExtSystemReturnType[]) {\n selectConfig.value = value\n if (value.length === 0) {\n selectedLicenceId.value = 0\n return\n }\n selectedLicenceId.value = value[0].licence\n }\n\n function setSingleMode(value: boolean) {\n singleMode.value = value\n }\n\n function setAssetType(value: DamAssetTypeType) {\n assetType.value = value\n }\n\n function setMinCount(value: number) {\n minCount.value = value\n }\n\n function setMaxCount(value: number) {\n maxCount.value = value\n }\n\n function setList(items: AssetSearchListItemDto[]) {\n assetListItems.value = items.map((item) => {\n return {\n asset: item,\n selected: false,\n }\n })\n }\n\n function appendList(items: AssetSearchListItemDto[]) {\n const assets = items.map((asset) => {\n return {\n asset: asset,\n selected: false,\n }\n })\n assetListItems.value = assetListItems.value.concat(assets)\n }\n\n function toggleSelectedByIndex(index: number) {\n if (!assetListItems.value[index]) return\n\n if (!singleMode.value && isSelectedMax.value && !assetListItems.value[index].selected) {\n return\n }\n\n assetListItems.value[index].selected = !assetListItems.value[index].selected\n\n if (singleMode.value && assetListItems.value[index].selected) {\n unselectAllExcept(index)\n clearSelected()\n addToSelected(assetListItems.value[index])\n return\n }\n\n if (!singleMode.value && assetListItems.value[index].selected) {\n addToSelected(assetListItems.value[index])\n return\n }\n\n removeFromSelected(assetListItems.value[index].asset.id)\n }\n\n function unselectAllExcept(ignoreIndex: number) {\n const items = assetListItems.value\n for (let i = 0; i < items.length; i++) {\n if (items[i].selected && i !== ignoreIndex) {\n items[i].selected = false\n }\n }\n }\n\n function clearSelected() {\n selectedAssets.value.clear()\n }\n\n function addToSelected(assetItem: AssetSelectListItem) {\n if (!selectedAssets.value.has(assetItem.asset.id)) {\n selectedAssets.value.set(assetItem.asset.id, assetItem)\n }\n }\n\n function removeFromSelected(assetId: DocId) {\n if (selectedAssets.value.has(assetId)) {\n selectedAssets.value.delete(assetId)\n }\n }\n\n function getSelectedMainFileIds(): DocId[] {\n const fileIds: Set<DocId> = new Set()\n for (const value of selectedAssets.value.values()) {\n if (value.asset.mainFile?.id) {\n fileIds.add(value.asset.mainFile.id)\n }\n }\n return Array.from(fileIds)\n }\n\n function getSelectedAssetIds(): DocId[] {\n return Array.from(selectedAssets.value.keys())\n }\n\n function getSelectedAssets(): AssetSearchListItemDto[] {\n const assets: Array<AssetSearchListItemDto> = []\n for (const value of selectedAssets.value.values()) {\n assets.push(toRaw(value.asset))\n }\n return assets\n }\n\n function getSelectedData(type: AssetSelectReturnTypeType): AssetSelectReturnData {\n switch (type) {\n case AssetSelectReturnType.AssetId:\n return {\n type: AssetSelectReturnType.AssetId,\n value: getSelectedAssetIds(),\n }\n case AssetSelectReturnType.Asset:\n return {\n type: AssetSelectReturnType.Asset,\n value: getSelectedAssets(),\n }\n case AssetSelectReturnType.MainFileId:\n default:\n return {\n type: AssetSelectReturnType.MainFileId,\n value: getSelectedMainFileIds(),\n }\n }\n }\n\n const isSelectedMax = computed(() => {\n return selectedCount.value >= maxCount.value\n })\n\n const selectedCount = computed(() => {\n return selectedAssets.value.size\n })\n\n function reset() {\n assetListItems.value = []\n loader.value = false\n clearSelected()\n }\n\n const selectedSelectConfig = computed(() => {\n const found = selectConfig.value.find((configItem ) => configItem.licence === selectedLicenceId.value)\n if (found) return found\n return selectConfig.value[0]\n })\n\n return {\n selectedLicenceId,\n selectConfig,\n assetType,\n singleMode,\n minCount,\n maxCount,\n selectedCount,\n selectedAssets,\n loader,\n assetListItems,\n getSelectedData,\n setAssetType,\n setSelectConfig,\n setSingleMode,\n setMinCount,\n setMaxCount,\n showLoader,\n hideLoader,\n setList,\n appendList,\n toggleSelectedByIndex,\n clearSelected,\n reset,\n selectedSelectConfig,\n }\n})\n\nif (import.meta.hot) {\n import.meta.hot.accept(acceptHMRUpdate(useAssetSelectStore, import.meta.hot))\n}\n","import { ref } from 'vue'\nimport type { CommonAdminCoreDamOptions } from '@/AnzuSystemsCommonAdmin'\n\nimport { isUndefined } from '@/utils/common'\n\nconst commonAdminCoreDamOptions = ref<CommonAdminCoreDamOptions | undefined>(undefined)\n\nexport function initCommonAdminCoreDamOptions(data: CommonAdminCoreDamOptions) {\n commonAdminCoreDamOptions.value = data\n}\n\nexport function useCommonAdminCoreDamOptions(configName: string = 'default') {\n if (\n isUndefined(commonAdminCoreDamOptions.value) ||\n isUndefined(commonAdminCoreDamOptions.value.configs) ||\n isUndefined(commonAdminCoreDamOptions.value.configs[configName])\n ) {\n throw new Error(\"Composable can't be used without properly configured common admin.\")\n }\n\n return {\n damClient: commonAdminCoreDamOptions.value.configs[configName].damClient,\n }\n}\n\nexport function useCommonAdminCoreDamOptionsGlobal() {\n if (\n isUndefined(commonAdminCoreDamOptions.value) ||\n isUndefined(commonAdminCoreDamOptions.value.configs)\n ) {\n throw new Error(\"Composable can't be used without properly configured common admin.\")\n }\n\n return {\n apiTimeout: commonAdminCoreDamOptions.value.apiTimeout,\n uploadStatusFallback: commonAdminCoreDamOptions.value.uploadStatusFallback,\n notification: commonAdminCoreDamOptions.value.notification,\n }\n}\n","import { ref } from 'vue'\nimport { isArray, isBoolean, isNull, isNumber, isString, isUndefined } from '@/utils/common'\nimport type { Filter, FilterBag, FilterVariant } from '@/types/Filter'\n\n/**\n * Docs: /doc/Admin-Cms-Doc/Filters.md\n */\nexport function useApiQueryBuilder() {\n const q = ref<string[]>([])\n\n const querySetLimit = (value: number): void => {\n queryAdd('limit', value)\n }\n\n const querySetOffset = (page: number, limit: number): void => {\n queryAdd('offset', page * limit - limit)\n }\n\n const querySetOrder = (field: string | null, desc: boolean): void => {\n if (!isNull(field) && field.length > 0) queryAdd('order[' + field + ']', desc ? 'desc' : 'asc')\n }\n\n const formatValue = (value: string | number | boolean): string | number => {\n if (isBoolean(value)) {\n return value ? '1' : '0'\n }\n return value\n }\n\n const queryAddFilter = (filterVariant: FilterVariant, field: string, value: string | number | boolean): void => {\n if (isString(value) && value.length === 0) return\n q.value.push('filter_' + filterVariant + '[' + field + ']=' + formatValue(value))\n }\n\n const getValue = (filter: Filter): string | number | boolean | null => {\n const model = filter.model\n if (isNull(model)) {\n if (filter.mandatory) {\n filter.model = filter.default\n return filter.default\n }\n return null\n }\n if (isString(model)) {\n if (model.length === 0) {\n if (filter.mandatory) {\n filter.model = filter.default\n return filter.default\n }\n return null\n }\n return encodeURIComponent(model)\n }\n if (isArray(model)) {\n if (model.length === 0) {\n if (filter.mandatory) {\n filter.model = filter.default\n return filter.default\n }\n return null\n }\n return model.map((item) => (isString(item) ? encodeURIComponent(item) : item)).join(',')\n }\n if (isNumber(model) || isBoolean(model)) {\n return model\n }\n\n return null\n }\n\n const queryAdd = (key: string, value: any): void => {\n q.value.push(key + '=' + value)\n }\n\n const queryBuild = (): string => {\n return '?' + q.value.join('&')\n }\n\n const querySetFilters = (filterBag: FilterBag): void => {\n const isSearchApi = !isUndefined(filterBag._elastic)\n for (const filterName in filterBag) {\n const filter = filterBag[filterName]\n const field = filter.field || filterName\n if (filter.exclude) {\n continue\n }\n const value = getValue(filter)\n if (isNull(value)) {\n continue\n }\n if (isSearchApi) {\n queryAdd(field, value)\n continue\n }\n queryAddFilter(filter.variant, field, value)\n }\n }\n\n return {\n querySetLimit,\n querySetOffset,\n querySetOrder,\n queryAddFilter,\n querySetFilters,\n queryAdd,\n queryBuild,\n }\n}\n","import { isObject } from '@/utils/common'\n\nexport interface ApiResponseList<T> {\n totalCount: number\n data: T\n}\n\nexport interface ApiInfiniteResponseList<T> {\n hasNextPage: boolean\n data: T\n}\n\nexport const isApiResponseList = <T>(value: unknown): value is ApiResponseList<T> => {\n return isObject(value) && Object.hasOwn(value, 'totalCount')\n}\n\nexport const isApiInfiniteResponseList = <T>(value: unknown): value is ApiInfiniteResponseList<T> => {\n return isObject(value) && Object.hasOwn(value, 'hasNextPage')\n}\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { FilterBag } from '@/types/Filter'\nimport type { Pagination } from '@/types/Pagination'\nimport { isUndefined } from '@/utils/common'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { useApiQueryBuilder } from '@/services/api/queryBuilder'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport type { ApiInfiniteResponseList, ApiResponseList } from '@/types/ApiResponse'\nimport { isApiInfiniteResponseList, isApiResponseList } from '@/types/ApiResponse'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\nexport const apiGenerateListQuery = (pagination: Pagination, filterBag: FilterBag): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, querySetFilters } = useApiQueryBuilder()\n querySetLimit(pagination.rowsPerPage)\n querySetOffset(pagination.page, pagination.rowsPerPage)\n querySetOrder(pagination.sortBy, pagination.descending)\n querySetFilters(filterBag)\n return queryBuild()\n}\n\n/**\n * @template R Response type override, optional\n */\nexport const apiFetchList = <R>(\n client: () => AxiosInstance,\n urlTemplate: string,\n urlParams: UrlParams = {},\n pagination: Pagination,\n filterBag: FilterBag,\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n const searchApi = isUndefined(filterBag._elastic) ? '' : '/search'\n client()\n .get(\n replaceUrlParameters(urlTemplate, urlParams) + searchApi + apiGenerateListQuery(pagination, filterBag),\n options\n )\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n const resData = res.data as unknown as ApiResponseList<R> | ApiInfiniteResponseList<R>\n if (isApiInfiniteResponseList(resData)) {\n pagination.hasNextPage = res.data.hasNextPage\n } else if (isApiResponseList(resData)) {\n pagination.totalCount = resData.totalCount\n }\n pagination.currentViewCount = res.data.data.length\n return resolve(res.data.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve([] as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import type { DamAssetLicence } from '@/types/coreDam/AssetLicence'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\n\nconst END_POINT = '/adm/v1/asset-licence'\n\nexport const fetchDamAssetLicence = (client: () => AxiosInstance, id: IntegerId) =>\n apiFetchOne<DamAssetLicence>(client, END_POINT + '/:id', { id }, 'coreDam', 'assetLicence')\n","import type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\nimport type { DamAssetTypeType, DamDistributionServiceName } from '@/types/coreDam/Asset'\nimport type { CustomDataFormElement } from '@/components/customDataForm/CustomDataForm'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\n\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\n\nconst END_POINT = '/adm/v1/asset-custom-form'\nconst ENTITY = 'assetCustomForm'\n\n// todo limit set to 100 for now, add load for pagination?\nexport const fetchAssetCustomFormElements = (\n damClient: () => AxiosInstance,\n extSystem: IntegerId,\n assetType: DamAssetTypeType\n) =>\n apiFetchOne<{ data: CustomDataFormElement[] }>(\n damClient,\n END_POINT + '/ext-system/:extSystem/type/:assetType/element?order[position]=asc&limit=100',\n { extSystem, assetType },\n SYSTEM_CORE_DAM,\n ENTITY\n )\n\n// todo limit set to 100 for now, add load for pagination?\nexport const fetchDistributionCustomFormElements = (\n damClient: () => AxiosInstance,\n distributionService: DamDistributionServiceName\n) =>\n apiFetchOne<{ data: CustomDataFormElement[] }>(\n damClient,\n END_POINT + '/distribution-service/:distributionService/element?order[position]=asc&limit=100',\n { distributionService },\n SYSTEM_CORE_DAM,\n ENTITY\n )\n","import type { DamExtSystemConfig, DamPrvConfig, DamPubConfig } from '@/types/coreDam/DamConfig'\nimport type { AxiosInstance } from 'axios'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport type { IntegerId } from '@/types/common'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\n\nconst END_POINT = '/adm/v1/configuration'\nconst PUB_END_POINT_PREFIX = '/pub'\nconst PUB_END_POINT = PUB_END_POINT_PREFIX + '/v1/configuration'\nconst ENTITY = 'settings'\n\nexport const fetchPubConfiguration = (damClient: () => AxiosInstance) =>\n apiFetchOne<DamPubConfig>(damClient, PUB_END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchConfiguration = (damClient: () => AxiosInstance) =>\n apiFetchOne<DamPrvConfig>(damClient, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchExtSystemConfiguration = (extSystem: IntegerId, damClient: () => AxiosInstance) =>\n apiFetchOne<DamExtSystemConfig>(damClient, END_POINT + '/ext-system/' + extSystem, {}, SYSTEM_CORE_DAM, ENTITY)\n","import type { DamAssetTypeType, DamDistributionServiceName } from '@/types/coreDam/Asset'\nimport type { IntegerId } from '@/types/common'\n\nexport interface DamPrvConfig {\n assetExternalProviders: {\n [key: string]: { title: string }\n }\n distributionServices: {\n [key: string]: {\n title: string\n iconPath: string\n type: DamDistributionServiceTypeType\n allowedRedistributeStatuses: Array<DamDistributionStatusType>\n }\n }\n colorSet: {\n [key: string]: string\n }\n settings: {\n aclCheckEnabled: boolean\n adminAllowListName: string\n allowSelectExtSystem: boolean\n allowSelectLicenceId: boolean\n defaultAssetLicenceId: number\n defaultExtSystemId: number\n imageChunkConfig: {\n minSize: number\n maxSize: number\n }\n maxBulkItemCount: number\n }\n}\n\nexport interface DamExtSystemConfig extends Record<DamAssetTypeType, DamExtSystemConfigItem> {\n assetExternalProviders: DamExternalProviderAssetConfig\n audio: DamExtSystemConfigItem\n video: DamExtSystemConfigItem\n image: DamExtSystemConfigItem\n document: DamExtSystemConfigItem\n}\n\nexport interface DamConfigLicenceExtSystem {\n extSystem: IntegerId\n name: string\n}\n\nexport interface DamConfigLicenceExtSystemReturnType {\n licence: IntegerId\n extSystem: IntegerId\n licenceName: string\n extSystemConfig: DamExtSystemConfig\n}\n\nexport interface DamExtSystemConfigItem {\n sizeLimit: number\n defaultFileVersion: string\n versions: Array<string>\n mimeTypes: Array<string>\n distribution: DamDistributionConfig\n authors: DamExtSystemAssetTypeExifMetadata\n keywords: DamExtSystemAssetTypeExifMetadata\n customMetadataPinnedAmount: number\n slots: string[]\n}\n\nexport type DamExternalProviderAssetConfig = Record<\n DamExternalProviderAssetName,\n {\n listingLimit: number\n title: string\n }\n>\n\nexport type DamExternalProviderAssetName = string\n\nexport interface DamDistributionConfig {\n distributionServices: Array<DamDistributionServiceName>\n distributionRequirements: Record<DamDistributionServiceName, DamDistributionRequirementsConfig>\n}\n\nexport interface DamDistributionRequirementsConfig {\n title: string\n requiredAuth: boolean\n blockedBy: Array<DamDistributionServiceName>\n categorySelect: DamDistributionRequirementsCategorySelectConfig\n strategy: DamDistributionRequirementStrategyType\n}\n\nexport const DamDistributionRequirementStrategy = {\n None: 'none',\n AtLeastOne: 'at_least_one',\n OneFromType: 'one_from_type',\n WaitForAll: 'wait_for_all',\n} as const\nexport type DamDistributionRequirementStrategyType =\n (typeof DamDistributionRequirementStrategy)[keyof typeof DamDistributionRequirementStrategy]\nexport const DamDistributionRequirementStrategyDefault = DamDistributionRequirementStrategy.None\n\nexport interface DamDistributionRequirementsCategorySelectConfig {\n enabled: boolean\n required: boolean\n}\n\nexport interface DamExtSystemAssetTypeExifMetadata {\n enabled: boolean\n required: boolean\n}\n\nexport const DamDistributionServiceType = {\n Youtube: 'youtubeDistribution',\n Jw: 'jwDistribution',\n Custom: 'customDistribution',\n} as const\nexport type DamDistributionServiceTypeType =\n (typeof DamDistributionServiceType)[keyof typeof DamDistributionServiceType]\n\nexport const DamDistributionStatus = {\n Waiting: 'waiting',\n Distributing: 'distributing',\n RemoteProcessing: 'remote_processing',\n Distributed: 'distributed',\n Failed: 'failed',\n} as const\nexport type DamDistributionStatusType = (typeof DamDistributionStatus)[keyof typeof DamDistributionStatus]\nexport const DamDistributionStatusDefault = DamDistributionStatus.Waiting\n\nexport interface DamPubConfig {\n userAuthType: UserAuthTypeType\n}\n\nexport const UserAuthType = {\n JsonCredentials: 'json_credentials',\n OAuth2: 'oauth2',\n} as const\nexport type UserAuthTypeType = (typeof UserAuthType)[keyof typeof UserAuthType]\nexport const UserAuthTypeDefault = UserAuthType.JsonCredentials\n","import { acceptHMRUpdate, defineStore } from 'pinia'\nimport { reactive, shallowRef } from 'vue'\nimport {\n type DamConfigLicenceExtSystem,\n type DamExtSystemConfig,\n type DamPrvConfig,\n type DamPubConfig,\n UserAuthType,\n} from '@/types/coreDam/DamConfig'\nimport type { IntegerId } from '@/types/common'\nimport { type DamAssetTypeType, type DamDistributionServiceName } from '@/types/coreDam/Asset'\nimport type { CustomDataFormElement } from '@/components/customDataForm/CustomDataForm'\n\nconst damPubConfigDefault = () => ({\n userAuthType: UserAuthType.JsonCredentials,\n})\nconst damPrvConfigDefault = () => ({\n colorSet: {},\n assetExternalProviders: {},\n distributionServices: {},\n settings: {\n aclCheckEnabled: true,\n adminAllowListName: 'root',\n allowSelectExtSystem: false,\n allowSelectLicenceId: false,\n defaultAssetLicenceId: 0,\n defaultExtSystemId: 0,\n imageChunkConfig: {\n minSize: 0,\n maxSize: 0,\n },\n maxBulkItemCount: 0,\n },\n})\n\nexport const useDamConfigStore = defineStore('commonAdminDamConfigStore', () => {\n const initialized = reactive<{\n damPubConfig: boolean\n damPrvConfig: boolean\n }>({\n damPubConfig: false,\n damPrvConfig: false,\n })\n const damPubConfig = shallowRef<DamPubConfig>(damPubConfigDefault())\n const damPrvConfig = shallowRef<DamPrvConfig>(damPrvConfigDefault())\n const damConfigExtSystem = shallowRef(new Map<IntegerId, DamExtSystemConfig>())\n const damConfigLicenceExtSystem = shallowRef(new Map<IntegerId, DamConfigLicenceExtSystem>())\n const damConfigAssetCustomFormElements = shallowRef(\n new Map<IntegerId, { [key in DamAssetTypeType]: CustomDataFormElement[] }>()\n )\n const damConfigDistributionCustomFormElements = shallowRef(\n new Map<DamDistributionServiceName, CustomDataFormElement[]>()\n )\n\n function reset() {\n damPubConfig.value = damPubConfigDefault()\n damPrvConfig.value = damPrvConfigDefault()\n damConfigExtSystem.value.clear()\n damConfigLicenceExtSystem.value.clear()\n damConfigAssetCustomFormElements.value.clear()\n damConfigDistributionCustomFormElements.value.clear()\n initialized.damPrvConfig = false\n initialized.damPubConfig = false\n }\n\n return {\n initialized,\n damPubConfig,\n damPrvConfig,\n damConfigExtSystem,\n damConfigLicenceExtSystem,\n damConfigAssetCustomFormElements,\n damConfigDistributionCustomFormElements,\n reset,\n }\n})\n\nif (import.meta.hot) {\n import.meta.hot.accept(acceptHMRUpdate(useDamConfigStore, import.meta.hot))\n}\n","import type { CustomDataFormElement } from '@/components/customDataForm/CustomDataForm'\nimport { fetchDamAssetLicence } from '@/components/damImage/uploadQueue/api/damAssetLicenceApi'\nimport {\n fetchAssetCustomFormElements,\n fetchDistributionCustomFormElements,\n} from '@/components/damImage/uploadQueue/composables/damAssetCustomFormApi'\nimport {\n fetchConfiguration,\n fetchExtSystemConfiguration,\n fetchPubConfiguration,\n} from '@/components/damImage/uploadQueue/composables/damConfigApi'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\nimport type { IntegerId } from '@/types/common'\nimport { DamAssetType, type DamDistributionServiceName } from '@/types/coreDam/Asset'\nimport type {\n DamConfigLicenceExtSystemReturnType,\n DamExtSystemConfig,\n DamPrvConfig,\n DamPubConfig,\n} from '@/types/coreDam/DamConfig'\nimport { cloneDeep, isNull, isUndefined } from '@/utils/common'\nimport type { AxiosInstance } from 'axios'\n\nexport function useDamConfigState(client: undefined | (() => AxiosInstance) = undefined) {\n const damConfigStore = useDamConfigStore()\n\n function onConfigError(error: Error) {\n console.error(error)\n }\n\n function loadDamPubConfig() {\n return new Promise((resolve, reject) => {\n damConfigStore.initialized.damPubConfig = false\n if (isUndefined(client)) {\n reject(false)\n return\n }\n fetchPubConfiguration(client)\n .then((config) => {\n if (Object.keys(config).length < 1) {\n throw new Error('Unable to load pub config. Incorrect response body.')\n }\n setDamPubConfig(config)\n resolve(true)\n })\n .catch((err) => {\n onConfigError(err)\n reject(false)\n })\n })\n }\n\n function setDamPubConfig(data: DamPubConfig) {\n try {\n damConfigStore.damPubConfig.userAuthType = data.userAuthType\n damConfigStore.initialized.damPubConfig = true\n } catch (err) {\n throw new Error('Unable to load dam pub config. Incorrect fields in json.')\n }\n }\n\n function loadDamPrvConfig() {\n return new Promise((resolve, reject) => {\n damConfigStore.initialized.damPubConfig = false\n if (isUndefined(client)) {\n reject(false)\n return\n }\n fetchConfiguration(client)\n .then((config) => {\n if (Object.keys(config).length < 1) {\n throw new Error('Unable to load dam prv config. Incorrect response body.')\n }\n setDamPrvConfig(config)\n resolve(true)\n })\n .catch((err) => {\n onConfigError(err)\n reject(false)\n })\n })\n }\n\n function setDamPrvConfig(data: DamPrvConfig) {\n try {\n damConfigStore.damPrvConfig.settings = data.settings\n damConfigStore.damPrvConfig.colorSet = data.colorSet\n damConfigStore.damPrvConfig.assetExternalProviders = data.assetExternalProviders\n damConfigStore.damPrvConfig.distributionServices = data.distributionServices\n damConfigStore.initialized.damPrvConfig = true\n } catch (err) {\n throw new Error('Unable to load dam config. Incorrect fields in json.')\n }\n }\n\n function loadDamConfigExtSystem(extSystemId: IntegerId) {\n return new Promise((resolve, reject) => {\n if (isUndefined(client)) {\n reject(false)\n return\n }\n fetchExtSystemConfiguration(extSystemId, client)\n .then((config) => {\n if (Object.keys(config).length < 1) {\n throw new Error('Unable to load dam ext system config. Incorrect response body.')\n }\n setDamConfigExtSystem(config, extSystemId)\n resolve(true)\n })\n .catch((err) => {\n onConfigError(err)\n reject(false)\n })\n })\n }\n\n function setDamConfigExtSystem(data: DamExtSystemConfig, extSystemId: IntegerId) {\n try {\n const config = {\n assetExternalProviders: data.assetExternalProviders,\n audio: data.audio,\n document: data.document,\n image: data.image,\n video: data.video,\n }\n damConfigStore.damConfigExtSystem.set(extSystemId, config)\n } catch (err) {\n throw new Error('Unable to load dam ext system config. Incorrect fields in json.')\n }\n }\n\n function loadDamConfigAssetCustomFormElements(extSystemId: IntegerId) {\n return new Promise((resolve, reject) => {\n if (isUndefined(client)) {\n reject(false)\n return\n }\n const promises = [\n fetchAssetCustomFormElements(client, extSystemId, DamAssetType.Image),\n fetchAssetCustomFormElements(client, extSystemId, DamAssetType.Audio),\n fetchAssetCustomFormElements(client, extSystemId, DamAssetType.Video),\n fetchAssetCustomFormElements(client, extSystemId, DamAssetType.Document),\n ]\n\n Promise.all(promises)\n .then((responses) => {\n if (\n responses.length !== 4 ||\n Object.keys(responses[0]).length < 1 ||\n Object.keys(responses[1]).length < 1 ||\n Object.keys(responses[2]).length < 1 ||\n Object.keys(responses[3]).length < 1\n ) {\n throw new Error('Unable to load asset custom form config. Incorrect response body.')\n }\n setDamConfigAssetCustomFormElements(responses, extSystemId)\n resolve(true)\n })\n .catch((err) => {\n onConfigError(err)\n reject(false)\n })\n })\n }\n\n function setDamConfigAssetCustomFormElements(\n responses: Awaited<{\n data: CustomDataFormElement[]\n }>[],\n extSystemId: IntegerId\n ) {\n try {\n const config = {\n image: responses[0].data,\n audio: responses[1].data,\n video: responses[2].data,\n document: responses[3].data,\n }\n damConfigStore.damConfigAssetCustomFormElements.set(extSystemId, config)\n } catch (err) {\n throw new Error('Unable to load asset custom form config. Incorrect fields in json.')\n }\n }\n\n function loadDamConfigDistributionCustomFormElements(distributionServiceName: DamDistributionServiceName) {\n return new Promise((resolve, reject) => {\n if (isUndefined(client)) {\n reject(false)\n return\n }\n if (damConfigStore.damConfigDistributionCustomFormElements.has(distributionServiceName)) {\n resolve(true)\n return\n }\n fetchDistributionCustomFormElements(client, distributionServiceName)\n .then((res) => {\n damConfigStore.damConfigDistributionCustomFormElements.set(distributionServiceName, res.data)\n resolve(true)\n return\n })\n .catch((error) => {\n reject(error)\n return\n })\n })\n }\n\n function isDamPubConfigLoaded() {\n return damConfigStore.initialized.damPubConfig\n }\n\n function isDamPrvConfigLoaded() {\n return damConfigStore.initialized.damPrvConfig\n }\n\n function getDamConfigExtSystem(extSystemId: IntegerId) {\n return damConfigStore.damConfigExtSystem.get(extSystemId)\n }\n\n function getDamConfigAssetCustomFormElements(extSystemId: IntegerId) {\n return damConfigStore.damConfigAssetCustomFormElements.get(extSystemId)\n }\n\n async function getOrLoadDamConfigExtSystemByLicences(\n licences: IntegerId[]\n ): Promise<DamConfigLicenceExtSystemReturnType[]> {\n const promises = licences.map((licence) =>\n getOrLoadDamConfigExtSystemByLicence(licence).catch((error) => {\n console.error(`Error fetching licence ${licence}:`, error)\n return undefined\n })\n )\n\n const responses = await Promise.allSettled(promises)\n\n return responses\n .filter(\n (result): result is PromiseFulfilledResult<DamConfigLicenceExtSystemReturnType> =>\n result.status === 'fulfilled' && !isUndefined(result.value)\n )\n .map((result) => result.value)\n }\n\n async function getOrLoadDamConfigExtSystemByLicence(\n licence: IntegerId\n ): Promise<DamConfigLicenceExtSystemReturnType | undefined> {\n if (isUndefined(client)) {\n console.warn('Client is undefined')\n return undefined\n }\n\n let foundLicenceConfig = damConfigStore.damConfigLicenceExtSystem.get(licence)\n\n if (isUndefined(foundLicenceConfig)) {\n try {\n const licenceRes = await fetchDamAssetLicence(client, licence)\n if (isNull(licenceRes.extSystem)) return undefined\n\n foundLicenceConfig = {\n extSystem: licenceRes.extSystem,\n name: licenceRes.name,\n }\n damConfigStore.damConfigLicenceExtSystem.set(licence, foundLicenceConfig)\n } catch (error) {\n console.error(`Error fetching asset licence for ${licence}:`, error)\n return undefined\n }\n }\n\n let foundExtSystemConfig = damConfigStore.damConfigExtSystem.get(foundLicenceConfig.extSystem)\n\n if (isUndefined(foundExtSystemConfig)) {\n try {\n await loadDamConfigExtSystem(foundLicenceConfig.extSystem)\n foundExtSystemConfig = damConfigStore.damConfigExtSystem.get(foundLicenceConfig.extSystem)\n } catch (error) {\n console.error(`Error loading extension system ${foundLicenceConfig.extSystem}:`, error)\n return undefined\n }\n }\n\n if (isUndefined(foundExtSystemConfig)) return undefined\n\n return {\n licence,\n extSystem: foundLicenceConfig.extSystem,\n licenceName: foundLicenceConfig.name,\n extSystemConfig: cloneDeep(foundExtSystemConfig),\n }\n }\n\n return {\n getOrLoadDamConfigExtSystemByLicences,\n getOrLoadDamConfigExtSystemByLicence,\n loadDamPrvConfig,\n loadDamPubConfig,\n loadDamConfigExtSystem,\n loadDamConfigAssetCustomFormElements,\n loadDamConfigDistributionCustomFormElements,\n isDamPubConfigLoaded,\n isDamPrvConfigLoaded,\n getDamConfigExtSystem,\n getDamConfigAssetCustomFormElements,\n }\n}\n","import type { AxiosInstance, AxiosResponse } from 'axios'\nimport type { DocId, IntegerId } from '@/types/common'\nimport type { AssetDetailItemDto, AssetSearchListItemDto, DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport type { UploadQueueItem } from '@/types/coreDam/UploadQueue'\nimport { HTTP_STATUS_OK } from '@/composables/statusCodes'\nimport { isNull, isUndefined } from '@/utils/common'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport {\n AnzuApiValidationError,\n type AnzuApiValidationResponseData,\n axiosErrorResponseHasValidationData,\n type ValidationError,\n} from '@/model/error/AnzuApiValidationError'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\n\nconst END_POINT = '/adm/v1/asset'\nconst BULK_METADATA_LIMIT = 10\nexport const ENTITY = 'asset'\nexport const SYSTEM_CORE_DAM = 'coreDam'\nexport const SYSTEM_DAM = 'dam'\nconst FETCH_BY_IDS_MAX_LIMIT = 25\n\nexport interface AssetMetadataBulkItem {\n id: DocId\n keywords: DocId[]\n authors: DocId[]\n described: boolean\n customData: AssetCustomData\n mainFileSingleUse: boolean | null\n}\n\nexport declare type AssetCustomData = Record<string, any>\n\nexport const fetchAssetList = (\n client: () => AxiosInstance,\n licenceId: number,\n pagination: Pagination,\n filterBag: FilterBag\n) =>\n apiFetchList<AssetSearchListItemDto[]>(\n client,\n END_POINT + '/licence/:licenceId',\n { licenceId },\n pagination,\n filterBag,\n SYSTEM_CORE_DAM,\n ENTITY\n )\n\nexport const fetchAsset = (client: () => AxiosInstance, id: DocId) =>\n apiFetchOne<AssetDetailItemDto>(client, END_POINT + '/:id', { id }, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchAssetByFileId = (client: () => AxiosInstance, assetFileId: DocId) =>\n apiFetchOne<AssetDetailItemDto>(client, END_POINT + '/asset-file/:id', { id: assetFileId }, SYSTEM_CORE_DAM, ENTITY)\n\nexport const bulkUpdateAssetsMetadata = (\n client: () => AxiosInstance,\n items: UploadQueueItem[],\n mainFileSingleUseOverride: boolean | undefined = undefined\n) => {\n return new Promise<AssetMetadataBulkItem[]>((resolve, reject) => {\n const bulkItems = listItemsToMetadataBulkItems(items, mainFileSingleUseOverride)\n updateMetadataSequence(client, bulkItems)\n .then((responses) => {\n if (bulkItems.length === 0) {\n return resolve([])\n } else if (responses.length === 0) {\n return reject(responses)\n } else if (\n responses.every((res) => {\n return res.status === HTTP_STATUS_OK\n })\n ) {\n const bulkItemsRes: AssetMetadataBulkItem[] = responses.flatMap((response) => response.data)\n return resolve(bulkItemsRes)\n } else {\n return reject(responses)\n }\n })\n .catch((err) => {\n //\n return reject(err)\n })\n })\n}\n\nasync function fetchAssetListByIdsSequence(client: () => AxiosInstance, ids: DocId[], licenceId: number) {\n if (ids.length === 0) return Promise.resolve([])\n const totalCalls = Math.ceil(ids.length / FETCH_BY_IDS_MAX_LIMIT)\n const responses = []\n\n for (let i = 0; i < totalCalls; i++) {\n const offset = i * FETCH_BY_IDS_MAX_LIMIT\n const reduced = ids.slice(offset, offset + FETCH_BY_IDS_MAX_LIMIT)\n const res = await client().get(END_POINT + `/licence/${licenceId}/ids/${reduced.join(',')}`)\n responses.push(res)\n }\n return responses\n}\n\nexport const fetchAssetListByIds: (\n client: () => AxiosInstance,\n ids: DocId[],\n licenceId: number\n) => Promise<AssetDetailItemDto[]> = (client: () => AxiosInstance, ids: DocId[], licenceId: number) => {\n return new Promise((resolve, reject) => {\n fetchAssetListByIdsSequence(client, ids, licenceId)\n .then((responses) => {\n if (ids.length === 0) {\n return resolve([])\n } else if (responses.length === 0) {\n reject(responses)\n } else if (\n responses.every((res) => {\n return res.status === HTTP_STATUS_OK\n })\n ) {\n const final = []\n for (let i = 0; i < responses.length; i++) {\n final.push(...responses[i].data.data)\n }\n resolve(final as AssetDetailItemDto[])\n } else {\n reject(responses)\n }\n })\n .catch((err) => {\n //\n reject(err)\n })\n })\n}\n\nasync function updateMetadataSequence(client: () => AxiosInstance, bulkItems: AssetMetadataBulkItem[]) {\n const totalCalls = Math.ceil(bulkItems.length / BULK_METADATA_LIMIT)\n const responses: AxiosResponse[] = []\n if (bulkItems.length === 0) return Promise.resolve([])\n\n for (let i = 0; i < totalCalls; i++) {\n const offset = i * BULK_METADATA_LIMIT\n const reduced = bulkItems.slice(offset, offset + BULK_METADATA_LIMIT)\n const res = await client().patch(END_POINT + '/metadata-bulk-update', JSON.stringify(reduced))\n responses.push(res)\n }\n return responses\n}\n\nfunction listItemsToMetadataBulkItems(\n items: UploadQueueItem[],\n mainFileSingleUseOverride: boolean | undefined = undefined\n) {\n const dtoItems: AssetMetadataBulkItem[] = []\n items.forEach((item) => {\n if (!isNull(item.assetId) && item.canEditMetadata) {\n dtoItems.push({\n id: item.assetId,\n keywords: item.keywords,\n authors: item.authors,\n described: true,\n customData: item.customData,\n mainFileSingleUse: isUndefined(mainFileSingleUseOverride) ? item.mainFileSingleUse : mainFileSingleUseOverride,\n })\n }\n })\n\n return dtoItems\n}\n\nconst { showUnknownError, showApiValidationError } = useAlerts()\n\nconst handleMetadataValidationError = (error: any, assetType: DamAssetTypeType, extSystem: IntegerId) => {\n const { getDamConfigAssetCustomFormElements } = useDamConfigState()\n const configAssetCustomFormElements = getDamConfigAssetCustomFormElements(extSystem)\n if (isUndefined(configAssetCustomFormElements)) {\n throw new Error('Custom form elements must be initialised.')\n }\n if (!error || !error.response || !error.response.data) return\n const data = error.response.data as AnzuApiValidationResponseData\n const items = [] as ValidationError[]\n for (const [key, values] of Object.entries(data.fields)) {\n const field = key.split('.').pop()\n const found = configAssetCustomFormElements[assetType].find((item) => item.property === field)\n if (found) {\n items.push({\n field: found.name,\n errors: values,\n })\n }\n }\n if (items.length) {\n showApiValidationError(items, -1, true)\n return\n }\n showUnknownError()\n}\n\nexport const updateAssetMetadata = (\n client: () => AxiosInstance,\n asset: AssetDetailItemDto,\n extSystem: IntegerId,\n mainFileSingleUse: boolean | null\n) => {\n return new Promise((resolve, reject) => {\n const data: AssetMetadataBulkItem = {\n id: asset.id,\n keywords: asset.keywords,\n authors: asset.authors,\n described: true,\n customData: asset.metadata.customData,\n mainFileSingleUse: mainFileSingleUse,\n }\n client()\n .patch(END_POINT + '/metadata-bulk-update', JSON.stringify([data]))\n .then((res) => {\n if (res.status === HTTP_STATUS_OK) {\n resolve(res.data)\n } else {\n //\n reject()\n }\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n handleMetadataValidationError(err, asset.attributes.assetType, extSystem)\n return reject(new AnzuApiValidationError(err, SYSTEM_CORE_DAM, ENTITY, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import { useAssetListFilter } from '@/model/coreDam/filter/AssetFilter'\nimport { type AssetSelectListItem, useAssetSelectStore } from '@/services/stores/coreDam/assetSelectStore'\nimport { storeToRefs } from 'pinia'\nimport type { Ref } from 'vue'\nimport { ref } from 'vue'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { usePagination } from '@/composables/system/pagination'\nimport { useFilterHelpers } from '@/composables/filter/filterHelpers'\nimport { useAlerts } from '@/composables/system/alerts'\nimport type { DocId } from '@/types/common'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { fetchAssetList as apiFetchAssetList } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\n\nconst filter = useAssetListFilter()\nconst pagination = usePagination()\nconst filterIsTouched = ref(false)\n\nexport function useAssetSelectActions(configName = 'default') {\n const { damClient } = useCommonAdminCoreDamOptions(configName)\n\n const assetSelectStore = useAssetSelectStore()\n const { selectedCount, selectedAssets, assetListItems, loader } = storeToRefs(assetSelectStore)\n\n const { resetFilter } = useFilterHelpers()\n const { showErrorsDefault } = useAlerts()\n\n const fetchAssetList = async () => {\n pagination.page = 1\n try {\n assetSelectStore.showLoader()\n assetSelectStore.setList(\n await apiFetchAssetList(damClient, assetSelectStore.selectedLicenceId, pagination, filter)\n )\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n assetSelectStore.hideLoader()\n }\n }\n const fetchNextPage = async () => {\n pagination.page = pagination.page + 1\n try {\n assetSelectStore.showLoader()\n assetSelectStore.appendList(\n await apiFetchAssetList(damClient, assetSelectStore.selectedLicenceId, pagination, filter)\n )\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n assetSelectStore.hideLoader()\n }\n }\n\n const onItemClick = (data: { assetId: DocId; index: number }) => {\n assetSelectStore.toggleSelectedByIndex(data.index)\n }\n\n const resetAssetList = async () => {\n assetSelectStore.reset()\n filter.type.default = [assetSelectStore.assetType]\n resetFilter(filter, pagination, fetchAssetList)\n }\n\n const filterTouch = () => {\n filterIsTouched.value = true\n }\n const filterUnTouch = () => {\n filterIsTouched.value = false\n }\n\n const initStoreContext = (\n selectConfig: DamConfigLicenceExtSystemReturnType[],\n assetType: DamAssetTypeType,\n singleMode: boolean,\n minCount: number,\n maxCount: number\n ): void => {\n assetSelectStore.clearSelected()\n assetSelectStore.setAssetType(assetType)\n assetSelectStore.setSelectConfig(selectConfig)\n assetSelectStore.setSingleMode(singleMode)\n assetSelectStore.setMinCount(minCount)\n assetSelectStore.setMaxCount(maxCount)\n }\n\n return {\n damClient,\n filterIsTouched,\n filter,\n selectedCount,\n selectedAssets,\n pagination,\n loader,\n assetListItems: assetListItems as Ref<Array<AssetSelectListItem>>,\n getSelectedData: assetSelectStore.getSelectedData,\n onItemClick,\n fetchAssetList,\n fetchNextPage,\n resetAssetList,\n filterTouch,\n filterUnTouch,\n initStoreContext,\n }\n}\n","import { computed, type Ref } from 'vue'\nimport type { AssetSearchListItemDto } from '@/types/coreDam/Asset'\nimport type { AssetSelectListItem } from '@/services/stores/coreDam/assetSelectStore'\n\nconst IMAGE_HEIGHT = 200\nconst IMAGE_BG_COLOR_DEFAULT = '#ccc'\n\nexport function useAssetItemActions(item: Readonly<Ref<AssetSelectListItem>>) {\n const asset = computed<AssetSearchListItemDto>(() => {\n return item.value.asset\n })\n\n const assetType = computed(() => {\n return asset.value.attributes.assetType\n })\n\n const assetStatus = computed(() => {\n return asset.value.attributes.assetStatus\n })\n\n const imageProperties = computed(() => {\n if (asset.value.mainFile && asset.value.mainFile.links && asset.value.mainFile.links.image_list) {\n return {\n url: asset.value.mainFile.links.image_list.url,\n width: asset.value.mainFile.links.image_list.width,\n height: asset.value.mainFile.links.image_list.height,\n bgColor: IMAGE_BG_COLOR_DEFAULT,\n }\n }\n return {\n url: undefined,\n width: undefined,\n height: IMAGE_HEIGHT,\n bgColor: IMAGE_BG_COLOR_DEFAULT,\n }\n })\n\n const tableImageProperties = computed(() => {\n if (asset.value.mainFile && asset.value.mainFile.links && asset.value.mainFile.links.image_table) {\n return {\n url: asset.value.mainFile.links.image_table.url,\n width: asset.value.mainFile.links.image_table.width,\n height: asset.value.mainFile.links.image_table.height,\n bgColor: IMAGE_BG_COLOR_DEFAULT,\n }\n }\n return {\n url: undefined,\n width: undefined,\n height: IMAGE_HEIGHT,\n bgColor: IMAGE_BG_COLOR_DEFAULT,\n }\n })\n\n return {\n asset,\n assetType,\n assetStatus,\n imageProperties,\n tableImageProperties,\n }\n}\n","export default \"data:image/jpeg;base64,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ADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANVAAAABgAAAAAAAAAAAAADhAAABkAAAAAQAHAAbABhAGMAZQBoAG8AbABkAGUAcgAtADEANgAtADkAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABkAAAAOEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAOEAAAAAFJnaHRsb25nAAAGQAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAADhAAAAABSZ2h0bG9uZwAABkAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxp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Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iMjc4M0ZDMUFGQTdBRThFREUyRDE3MjI5NTdCNEExQjAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MGVlZDBlZGUtOGM3MC00OTljLWEyYjUtMzMwZmFmNWYxMjZmIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9IjI3ODNGQzFBRkE3QUU4RURFMkQxNzIyOTU3QjRBMUIwIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHBob3Rvc2hvcDpMZWdhY3lJUFRDRGlnZXN0PSJDNzVEMTdFNTc0QjU2RUY1REJCRTM5OTRDMEU5Nzk1QyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9IiIgeG1wOkNyZWF0ZURhdGU9IjIwMTctMDQtMjFUMTI6MTk6MTkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE3LTA0LTI2VDE0OjIzOjU0KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE3LTA0LTI2VDE0OjIzOjU0KzAxOjAwIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChNYWNpbnRvc2gpIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NDU2NTBiMjEtMjM4Zi00MGNjLTlkNGEtNDZiZTMyOWUzYWExIiBzdEV2dDp3aGVuPSIyMDE3LTA0LTIxVDEyOjE5OjU3KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MGVlZDBlZGUtOGM3MC00OTljLWEyYjUtMzMwZmFmNWYxMjZmIiBzdEV2dDp3aGVuPSIyMDE3LTA0LTI2VDE0OjIzOjU0KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAcFBwsGBgsOCggKDhEODg4OERYTExMTExYRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBwkJEwwTIhMTIhQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIA4QGQAMBEQACEQEDEQH/3QAEAMj/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/AO4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1u4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq3xJ7Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFXcT4Yq7ifDFWsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9HuGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrJZViUvIeKKKknsMVYrqPm+SQlLEcE/nPU+4H7OKpNJqV1KavM5P+sf4Yqt+uT/79f/gjirvrk/8Av1/+COKu+uT/AO/X/wCCOKu+uT/79f8A4I4q765P/v1/+COKu+uT/wC/X/4I4q765P8A79f/AII4q765P/v1/wDgjirvrk/+/X/4I4q765P/AL9f/gjirvrk/wDv1/8Agjirvrk/+/X/AOCOKu+uT/79f/gjirvrk/8Av1/+COKu+uT/AO/X/wCCOKu+uT/79f8A4I4q765P/v1/+COKu+uT/wC/X/4I4q765P8A79f/AII4q765P/v1/wDgjirvrk/+/X/4I4q765P/AL9f/gjirvrk/wDv1/8Agjirvrk/+/X/AOCOKu+uT/79f/gjirvrk/8Av1/+COKu+uT/AO/X/wCCOKu+uT/79f8A4I4q765P/v1/+COKu+uT/wC/X/4I4q765P8A79f/AII4q765P/v1/wDgjirvrk/+/X/4I4q765P/AL9f/gjirvrk/wDv1/8Agjirvrk/+/X/AOCOKu+uT/79f/gjirvrk/8Av1/+COKuF5cD/dr/APBHFUZaeYb22NBJzX+V9x/zVirK9H1qLUlIUcJV+0h/Wv8AMuKpjirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/AP/S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirEPNmqGab6nGfgj3b/Kb/mwYqkOKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVfBO1s6zREq6GoOKvQrC8W8gS4Xo43Hge4xVEYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/0+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWj2xV5tcyGWV5G6sxP44qsxVuONpGCICzHoB1xVX/AEbdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4q79G3X++ZP8AgTirv0bdf75k/wCBOKu/Rt1/vmT/AIE4qsltJoRyljZV8SKb4qo4q3irLfJkpa2kjJ2WTb6RirIMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/AP/U7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVaxV5o/2j8z+vFWsVR2gml9D/r4qz8HFW64q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4qkPnE/6Gv/GQfqOKsOGKt4qyryUP3U//ABkX9WKsjxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv//V7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqRecf8AeNf+Mg/UcVYcOmKt4qyryV/cz/8AGRf1YqyPFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//9buGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvM3+0fmf14q1iqO0L/e6H/XxVn4xV2KuxVw36Yql15r1naMVkkBYfsr8R/DFUJ/i6yHaT/gf7cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFXf4vsv+LP+BH9cVd/i+y/4s/4Ef1xV3+L7L/iz/gR/XFUt8wa9b6hbiGEPyDg/EKbCuKsfGKt4qnXlzWoNOSRZ+VXYEcRXoPniqb/AOL7L/iz/gR/XFXf4vsvCT/gf7cVXR+bbJjQl19yv9Diqa211FdLzgcOPbFVXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//1+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8zf7R+Z/XirWKo7Qv97of9fFWfjFXYq7FWH675ia4Zra2YrCNmYdWPen+TiqRAU6Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqvt7mW1cSwMUYeH8R3xVnOi6uupRVNFmSgdR/xIe2KpjirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//0O4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8zf7R+Z/XirWKo7Qv97of9fFWfjFXYqlnmS8a1smKGjueCnwr1/wCFxVggFP4Yq3irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVR2h3htLyNx9ljwb5NtirPz1pirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//R7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHfOjEQwDsZG/VirFMVd336YqnWieXk1GAzPIyEMVooB/XiqYf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFXf4Li/wB/Sf8AAjFWv8Fxf7/f/gRirHdQtRaXEkAJYI1ATtXFVDFW0+0PmP14q9MrXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9LuGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvM3+0fmf14q1iqO0L/e6H/XxVn4xV2Ksc86/3MH/GRv1YqxXFWj0xVmPk3/eNv+Mh/UMVT3FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXHFWAa9/vfP/r4qgcVbT7S/MfrxV6YMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/0+4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8zf7R+Z/XirWKo7Qv97of9fFWfjFXYqxzzr/cwf8ZG/VirFcVabpirMfJv+8bf8ZD+oYqnuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku9sVdirsVdirsVdirsVdirjirAde/wB7pv8AXxVAYq2n2l+Y/Xir0wYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//U7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUq1LzJbWRMY/eyj9leg/1mxVIJ/N17L9jjGPACp+/FUL/AIg1CtfXb7hiqKt/Nl5Gf3nGVfAih+8Yqn+meY7e+IjNY5j+y3Q/JsVTWlOuKuxV2KuxV2KuxVxxVgOvf73Tf6+KoDFW0+0vzH68VemDFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/1e4Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8zf7R+Z/XirWKo7Qv97of9fFWfjFXYqxzzr/cwf8ZG/VirFcVabpirMfJv+8bf8ZD+oYqnuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV3XbFWLeYvMLcmtLQ0A2dx4/yp/xtirGqAbDpireKuxV2KtUrirJ/LnmFnZbK7apOyOe/+S2Ksn98VdirsVdirsVccVYDr3+903+viqAxVtPtL8x+vFXpgxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV/9buGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvM3+0fmf14q1iqO0L/e6H/XxVn4xV2Ksc86/3MH/GRv1YqxXFWm6YqzHyb/vG3/GQ/qGKp7irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVS3zDqP1G0ZlP7x/hX5nq3+xGKsDpireKuxV2KuxV2Ktd69D4+GKs+0LUfr9qsjf3q/A/wAx3/2WKphirsVdirsVccVYDr3+903+viqAxVtPtL8x+vFXpgxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWJecrgvcRwjoicvvxVj+KuxV2KuxV2KuxV2Ksh8mTH1ZYezKGH0bYqywYq7FXYq7FXHFWA69/vdN/r4qgMVbT7S/MfrxV6YMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Q7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq44qwrzcCL817op+6uKpPirsVdirsVdirsVdiqd+UP97Sewjav4YqzIYq7FXYq7FXHFWA69/vdN/r4qgMVbT7S/MfrxV6YMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//R7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYq7FXYq7FXYq7FXYq7FXYqsmmSFfUlIVQQKn3xVdXemKt4q7FXYq7FXYq7FXYq7FXYq7FXYqxbzrbHnFcDoQUJ+W64qxvFXYq7FXYq7FXYq7FWTeS7U/vbk9NkH62xVk9KbYq7FXYq7FXHFWA69/vdN/r4qgMVbT7S/MfrxV6YMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7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nh+0vaux8a4qz/T76O+hWeLodiO4PcYqiMVdirsVdirsVdirsVdirsVdirsVdirsVS7Wdai01KP8Ux+yn8W/ycVYRd3kt5IZpzyc/cPliqlirKvJX9zP/wAZF/VirI8VccVYDr3+903+viqAxVtPtL8x+vFXpgxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYq7FXYq7FUq8xamLK2IU0mkqq+w/afFWDYq3irsVdirsVdirsVdirsVdirsVR+jaq2mzcxvE2zj2/m/2OKs7SZZVWSM8kcVB8cVX4q7FXYq7FXYq7FXYq7FXYq7FXYqk2u+YksAYIKNc/gvz/wAr/JxVhskryuZJCWdtyTiq3FXYqyryV/cz/wDGRf1YqyPFXHFWA69/vdN/r4qgMVbT7S/MfrxV6YMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/T7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV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sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYqgNa1EadbtMPtt8Ke5P/NOKsBJJJLGpJrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVR+jaq+nTch8Ub7Ovt/MP8AKGKsi/xhZeEn3D+uKu/xhZeEn3f24qtl842oUmNHZ+wIoK++KsVu72a9kM1weTdvAey4qpYq7FXYq7FXYq7FXYq7FWVeSv7mf/jIv6sVZHirjirAde/3um/18VQGKtp9pfmP14q9MGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv//Q7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzN/tH5n9eKtYqjtC/3uh/18VZ+MVdirHPOv9zB/xkb9WKsVxVpumKsx8m/7xt/xkP6hiqe4q7FXYqwTX9U+v3BK/wB1HVV9/wCZ/wDZYqluKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtcRiruIxV1BireKuxV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3+Cp/wDfsf3HFXf4Kn/37H9xxV3+Cp/9+x/ccVd/gqf/AH7H9xxV3+Cp/wDfsf3HFXf4Kn/37H9xxV3+Cp/9+x/ccVd/gqf/AH7H9xxV3+Cp/wDfsf3HFXf4Kn/37H9xxV3+Cp/9+x/ccVd/gqf/AH7H9xxV3+Cp/wDfsf3HFXf4Kn/37H9xxV3+Cp/9+x/ccVd/gqf/AH7H9xxV3+Cp/wDfsf3HFXf4Kn/37H9xxVr/AAVcf79T7jiq6PyVJX95MtPZTX8cVTjTfL9tYEOg5yD9tuv+xH7OKpnirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//W7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/Q7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/R7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/T7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/U7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/W7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/Q7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/R7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/T7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/U7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/W7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/Q7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/R7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/T7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/U7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/W7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/Q7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/R7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/S7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/T7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/U7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/W7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/X7hirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/Z\"","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { DamAssetStatus, type DamAssetStatusType, DamAssetType, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport placeholder16x9 from '@/assets/image/placeholder16x9.jpg'\nimport { isUndefined } from '@/lib'\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n assetType?: DamAssetTypeType\n assetStatus?: DamAssetStatusType\n backgroundColor?: string\n width?: number\n height?: number\n fallbackHeight?: number\n iconSize?: number\n iconColor?: string\n }>(),\n {\n assetType: DamAssetType.Image,\n assetStatus: DamAssetStatus.WithFile,\n src: undefined,\n backgroundColor: '#ccc',\n width: undefined,\n height: undefined,\n fallbackHeight: 200,\n iconSize: 80,\n iconColor: '#505050',\n }\n)\nconst emit = defineEmits<{\n (e: 'error'): void\n}>()\n\nconst onError = () => {\n emit('error')\n}\n\nconst icon = computed(() => {\n if (props.assetStatus === DamAssetStatus.Deleting) return 'mdi-trash-can'\n switch (props.assetType) {\n case DamAssetType.Audio:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-music' : 'mdi-music-off'\n case DamAssetType.Document:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-note' : 'mdi-note-off'\n case DamAssetType.Video:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-video' : 'mdi-video-off'\n case DamAssetType.Image:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-image' : 'mdi-image-off'\n default:\n return ''\n }\n})\n\nconst srcComputed = computed(() => {\n return isUndefined(props.src) ? placeholder16x9 : props.src\n})\n\nconst showIconComputed = computed(() => {\n if (props.assetType === DamAssetType.Image && props.src) return false\n return true\n})\n</script>\n\n<template>\n <div\n v-if=\"assetStatus === DamAssetStatus.WithFile && src\"\n class=\"anzu-common-asset-image anzu-common-asset-image--img position-relative\"\n :style=\"{ width: width + 'px' }\"\n >\n <img\n class=\"anzu-common-asset-image__img\"\n :src=\"srcComputed\"\n :width=\"width\"\n :height=\"height\"\n alt=\"\"\n :style=\"'background-color:' + backgroundColor\"\n @onerror=\"onError\"\n >\n <div\n v-if=\"showIconComputed\"\n class=\"anzu-common-asset-image__icon-wrapper\"\n >\n <div\n class=\"anzu-common-asset-image__icon-circle\"\n :style=\"{ padding: iconSize / 4 + 'px' }\"\n >\n <VIcon\n v-if=\"icon.length\"\n :size=\"iconSize\"\n :icon=\"icon\"\n :color=\"iconColor\"\n class=\"anzu-common-asset-image__icon\"\n />\n </div>\n </div>\n </div>\n <div\n v-else\n :style=\"{ height: fallbackHeight + 'px', backgroundColor: backgroundColor }\"\n style=\"width: 100%\"\n class=\"asset-image asset-image--placeholder d-flex align-center justify-center\"\n >\n <div\n v-if=\"showIconComputed\"\n class=\"asset-image__icon-wrapper\"\n >\n <div\n class=\"asset-image__icon-circle\"\n :style=\"{ padding: iconSize / 4 + 'px' }\"\n >\n <VIcon\n v-if=\"icon.length\"\n :size=\"iconSize\"\n :icon=\"icon\"\n :color=\"iconColor\"\n class=\"asset-image__icon\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-common-asset-image {\n position: relative;\n\n &__icon-wrapper {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__icon-circle {\n border-radius: 100%;\n background-color: rgba(204 204 204 / 50%);\n }\n}\n</style>\n","export const prettyBytes = (bytes: number, decimals = 2) => {\n if (bytes === 0) {\n return '0 Bytes'\n }\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]\n}\n","<script lang=\"ts\" setup>\nimport type { AssetSelectListItem } from '@/services/stores/coreDam/assetSelectStore'\nimport { useI18n } from 'vue-i18n'\nimport { useAssetItemActions } from '@/components/dam/assetSelect/composables/assetSelectItemActions'\nimport AssetImagePreview from '@/components/dam/assetSelect/components/AssetImagePreview.vue'\nimport type { DocId } from '@/types/common'\nimport { prettyBytes } from '@/utils/file'\nimport ADatetime from '@/components/datetime/ADatetime.vue'\nimport { toRef } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n item: AssetSelectListItem\n showMetaIcons?: boolean\n }>(),\n {\n showMetaIcons: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'itemClick', data: { assetId: DocId; index: number }): void\n}>()\n\nconst { t } = useI18n()\n\nconst IMAGE_HEIGHT = 72\nconst IMAGE_WIDTH = 128\n\nconst item = toRef(props, 'item')\n\nconst { asset, tableImageProperties, assetType, assetStatus } = useAssetItemActions(item)\n\nconst onItemClick = () => {\n emit('itemClick', { assetId: asset.value.id, index: props.index })\n}\n</script>\n\n<template>\n <tr\n class=\"a-datatable__row\"\n :class=\"{ 'a-datatable__row--selected': item.selected }\"\n @click.stop.exact=\"onItemClick\"\n >\n <td>\n <VIcon\n v-if=\"item.selected\"\n icon=\"mdi-checkbox-outline\"\n :size=\"20\"\n />\n <VIcon\n v-else\n icon=\"mdi-checkbox-blank-outline\"\n :size=\"20\"\n />\n </td>\n <td>\n <AssetImagePreview\n :asset-type=\"assetType\"\n :asset-status=\"assetStatus\"\n :src=\"tableImageProperties.url\"\n :background-color=\"tableImageProperties.bgColor\"\n :width=\"IMAGE_WIDTH\"\n :height=\"IMAGE_HEIGHT\"\n :icon-size=\"20\"\n :fallback-height=\"IMAGE_HEIGHT\"\n />\n </td>\n <td>\n {{ asset.texts.displayTitle || t('commonCoreDam.asset.list.noTitle') }}\n </td>\n <td>\n <ADatetime :date-time=\"asset.createdAt\" />\n </td>\n <td>\n {{ asset.mainFile?.fileAttributes.mimeType }}\n </td>\n <td>\n {{ prettyBytes(asset.mainFile?.fileAttributes.size || 0) }}\n </td>\n </tr>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport AssetSelectTableRowItem from '@/components/dam/assetSelect/components/AssetSelectTableRowItem.vue'\nimport { useAssetSelectActions } from '@/components/dam/assetSelect/composables/assetSelectListActions'\n\nconst { t } = useI18n()\n\nconst { onItemClick, assetListItems, loader } = useAssetSelectActions()\n</script>\n\n<template>\n <VTable\n class=\"a-datatable a-datatable--dialog-sticky-fix\"\n fixed-header\n >\n <thead>\n <tr>\n <th class=\"text-left\" />\n <th class=\"text-left\">\n {{ t('common.assetSelect.meta.table.image') }}\n </th>\n <th class=\"text-left\">\n {{ t('common.assetSelect.model.texts.displayTitle') }}\n </th>\n <th class=\"text-left\">\n {{ t('common.model.tracking.created') }}\n </th>\n <th class=\"text-left\">\n {{ t('common.assetSelect.model.mainFile.fileAttributes.mimeType') }}\n </th>\n <th class=\"text-left\">\n {{ t('common.assetSelect.model.mainFile.fileAttributes.size') }}\n </th>\n </tr>\n </thead>\n <tbody>\n <AssetSelectTableRowItem\n v-for=\"(item, index) in assetListItems\"\n :key=\"item.asset.id\"\n :index=\"index\"\n :item=\"item\"\n @item-click=\"onItemClick\"\n />\n <tr v-if=\"!loader && assetListItems.length === 0\">\n <td\n colspan=\"6\"\n class=\"text-center\"\n >\n {{ t('common.assetSelect.meta.texts.noItemsFound') }}\n </td>\n </tr>\n </tbody>\n </VTable>\n</template>\n","import { readonly, ref } from 'vue'\n\nexport const AssetSelectGridView = {\n Masonry: 'masonry',\n Thumbnail: 'thumbnail',\n Table: 'table',\n} as const\nexport type AssetSelectGridViewType = (typeof AssetSelectGridView)[keyof typeof AssetSelectGridView]\nexport const AssetSelectGridViewDefault = AssetSelectGridView.Masonry\n\nconst gridView = ref<AssetSelectGridViewType>(AssetSelectGridViewDefault)\n\nexport function useGridView() {\n const setGridView = (value: AssetSelectGridViewType) => {\n gridView.value = value\n }\n\n return {\n gridView: readonly(gridView),\n setGridView,\n }\n}\n","import { ref } from 'vue'\n\nconst sidebarLeft = ref(false)\n\nexport function useSidebar() {\n const toggleSidebar = () => {\n sidebarLeft.value ? closeSidebar() : openSidebar()\n }\n\n const openSidebar = () => {\n sidebarLeft.value = true\n }\n\n const closeSidebar = () => {\n sidebarLeft.value = false\n }\n\n return {\n sidebarLeft,\n toggleSidebar,\n openSidebar,\n }\n}\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { AssetSelectGridView, useGridView } from '@/components/dam/assetSelect/composables/assetSelectGridView'\nimport { useSidebar } from '@/components/dam/assetSelect/composables/assetSelectFilterSidebar'\n\nconst { t } = useI18n()\nconst { setGridView } = useGridView()\nconst { toggleSidebar } = useSidebar()\n</script>\n\n<template>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"system-border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.assetSelect.meta.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n <VBtn\n size=\"x-small\"\n icon\n variant=\"text\"\n @click.stop=\"setGridView(AssetSelectGridView.Masonry)\"\n >\n <VIcon icon=\"mdi-view-compact\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.assetSelect.meta.grid.masonry') }}\n </VTooltip>\n </VBtn>\n <VBtn\n icon\n size=\"x-small\"\n variant=\"text\"\n @click.stop=\"setGridView(AssetSelectGridView.Thumbnail)\"\n >\n <VIcon icon=\"mdi-view-grid\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.assetSelect.meta.grid.thumbnail') }}\n </VTooltip>\n </VBtn>\n <VBtn\n size=\"x-small\"\n icon\n variant=\"text\"\n @click.stop=\"setGridView(AssetSelectGridView.Table)\"\n >\n <VIcon icon=\"mdi-view-headline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.assetSelect.meta.grid.table') }}\n </VTooltip>\n </VBtn>\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport type { AssetSelectListItem } from '@/services/stores/coreDam/assetSelectStore'\nimport { useAssetItemActions } from '@/components/dam/assetSelect/composables/assetSelectItemActions'\nimport AssetImagePreview from '@/components/dam/assetSelect/components/AssetImagePreview.vue'\nimport type { DocId } from '@/types/common'\nimport { toRef } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n item: AssetSelectListItem\n showMetaIcons?: boolean\n }>(),\n {\n showMetaIcons: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'itemClick', data: { assetId: DocId; index: number }): void\n}>()\n\nconst { t } = useI18n()\n\nconst IMAGE_HEIGHT = 200\n\nconst onItemClick = () => {\n emit('itemClick', { assetId: asset.value.id, index: props.index })\n}\n\nconst item = toRef(props, 'item')\n\nconst { asset, assetType, assetStatus, imageProperties } = useAssetItemActions(item)\n</script>\n\n<template>\n <div\n class=\"asset-list-tiles__item asset-list-tiles__item--pointer\"\n :class=\"{ 'asset-list-tiles__item--selected': item.selected }\"\n @click.stop.exact=\"onItemClick\"\n >\n <div class=\"asset-list-tiles__item-card\">\n <div\n v-if=\"item.selected\"\n class=\"asset-list-tiles__selected-triangle\"\n >\n <div class=\"asset-list-tiles__selected-triangle__bg\" />\n <VIcon\n class=\"asset-list-tiles__selected-triangle__icon\"\n icon=\"mdi-check\"\n color=\"white\"\n size=\"x-small\"\n />\n </div>\n <AssetImagePreview\n :asset-type=\"assetType\"\n :asset-status=\"assetStatus\"\n :src=\"imageProperties.url\"\n :background-color=\"imageProperties.bgColor\"\n :width=\"imageProperties.width\"\n :height=\"imageProperties.height\"\n :fallback-height=\"IMAGE_HEIGHT\"\n :asset-file-properties=\"item.asset.assetFileProperties\"\n :show-meta-icons=\"showMetaIcons\"\n />\n <div class=\"asset-list-tiles__item-text text-caption px-2 py-1\">\n <div class=\"d-flex align-center justify-space-between position-relative\">\n <div class=\"line-clamp-1\">\n {{ asset.texts.displayTitle || t('commonCoreDam.asset.list.noTitle') }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport AssetSelectTilesItem from '@/components/dam/assetSelect/components/AssetSelectTilesItem.vue'\nimport { useGridView } from '@/components/dam/assetSelect/composables/assetSelectGridView'\nimport { useAssetSelectActions } from '@/components/dam/assetSelect/composables/assetSelectListActions'\nimport { useI18n } from 'vue-i18n'\n\nconst { gridView } = useGridView()\nconst { onItemClick, assetListItems, loader } = useAssetSelectActions()\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n class=\"asset-list-tiles\"\n :class=\"'asset-list-tiles--' + gridView\"\n >\n <AssetSelectTilesItem\n v-for=\"(item, index) in assetListItems\"\n :key=\"item.asset.id\"\n :index=\"index\"\n :item=\"item\"\n @item-click=\"onItemClick\"\n />\n </div>\n <div\n v-if=\"!loader && assetListItems.length === 0\"\n class=\"text-h6 text-medium-emphasis d-flex w-100 h-100 align-center justify-center\"\n >\n {{ t('common.assetSelect.meta.texts.noItemsFound') }}\n </div>\n</template>\n\n<style lang=\"scss\">\n// css similar to '.dam-image-grid' in admin-dam, for now renamed here to new class to avoid conflicts\n// consider refactor later according how much different both versions will be\n\n$class-name-root: 'asset-list-tiles';\n$bg-color-light: #f9f9f9;\n$bg-color-dark: #1e1e1e;\n$border-color-light: #e8e9ea;\n$border-color-dark: #2c2c2c;\n$shadow-color-light: #959595;\n$shadow-color-dark: #3d3d3d;\n$bg-color-actions-light: #fff;\n$bg-color-actions-dark: #1a1a1a;\n\n.#{$class-name-root} {\n display: flex;\n flex-wrap: wrap;\n max-width: 100%;\n padding: 2px;\n\n &__item {\n user-select: none;\n flex-grow: 2;\n max-width: 800px;\n padding: 10px;\n position: relative;\n overflow: hidden;\n min-width: 200px;\n\n &-card {\n border-radius: 5px;\n overflow: hidden;\n\n img.anzu-common-asset-image__img {\n display: block;\n height: 200px;\n min-width: 100%;\n object-fit: cover;\n width: 100%;\n }\n\n &:hover {\n .#{$class-name-root}__item-card-actions {\n display: block;\n }\n }\n\n &-actions {\n border-radius: 4px;\n position: absolute;\n top: -2px;\n right: -5px;\n display: none;\n overflow: hidden;\n }\n }\n\n &-text,\n &-text .line-clamp-1 {\n font-weight: 500;\n line-height: 30px;\n min-height: 38px;\n max-height: 38px;\n }\n\n &--pointer {\n cursor: pointer;\n }\n }\n\n &--thumbnail {\n display: grid;\n grid-template-columns: repeat(6, auto);\n\n .#{$class-name-root}__item {\n img:not(.img-svg) {\n object-fit: contain;\n padding-left: 6px;\n padding-right: 6px;\n padding-top: 6px;\n background-color: transparent !important;\n }\n }\n }\n\n .#{$class-name-root}__selected-triangle {\n position: absolute;\n top: 11px;\n right: 11px;\n z-index: 1;\n\n &__bg {\n content: '';\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 0 30px 30px 0;\n border-color: transparent #608a32 transparent transparent;\n top: 0;\n right: 0;\n position: absolute;\n }\n\n &__icon {\n position: absolute;\n display: block;\n width: 16px;\n height: 16px;\n top: -3px;\n right: 0;\n }\n }\n}\n\n.v-theme--light {\n .#{$class-name-root} {\n &__item {\n &-card {\n background-color: $bg-color-light;\n border: 1px solid $border-color-light;\n\n &:hover {\n box-shadow: 0 0 3px 1px $shadow-color-light;\n }\n\n &-actions {\n background-color: $bg-color-actions-light;\n }\n }\n\n &--selected {\n .#{$class-name-root}__item-card {\n border-color: #608a32;\n }\n }\n\n &--active {\n .#{$class-name-root}__item-card {\n border-color: blue;\n }\n }\n }\n }\n}\n\n.v-theme--dark {\n .#{$class-name-root} {\n &__item {\n &-card {\n background-color: $bg-color-dark;\n border: 1px solid $border-color-dark;\n\n &:hover {\n box-shadow: 0 0 3px 1px $shadow-color-dark;\n }\n\n &-actions {\n background-color: $bg-color-actions-dark;\n }\n }\n\n &--selected {\n .#{$class-name-root}__item-card {\n border-color: #608a32;\n }\n }\n\n &--active {\n .#{$class-name-root}__item-card {\n border-color: blue;\n }\n }\n }\n }\n}\n</style>\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { useApiQueryBuilder } from '@/services/api/queryBuilder'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nconst generateByIdsApiQuery = (ids: number[] | string[], isSearchApi: boolean): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, queryAddFilter, queryAdd } = useApiQueryBuilder()\n const limit = ids.length\n querySetLimit(limit)\n querySetOffset(1, limit)\n querySetOrder('id', false)\n if (isSearchApi) queryAdd('id', ids.join(','))\n else queryAddFilter('in', 'id', ids.join(','))\n\n return queryBuild()\n}\n\nexport const apiFetchByIds = <T, R = T>(\n client: () => AxiosInstance,\n ids: string[] | number[],\n urlTemplate: string,\n urlParams: UrlParams = {},\n system: string,\n entity: string,\n options: AxiosRequestConfig = {},\n isSearchApi = false\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n client()\n .get(replaceUrlParameters(urlTemplate, urlParams) + generateByIdsApiQuery(ids, isSearchApi), options)\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data?.data) {\n return resolve(res.data.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve(null as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nexport const apiCreateOne = <T, R = T>(\n client: () => AxiosInstance,\n object: T | Record<string, never> = {},\n urlTemplate: string,\n urlParams: UrlParams = {},\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n client()\n .post(replaceUrlParameters(urlTemplate, urlParams), JSON.stringify(object), options)\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n return resolve(res.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve(null as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import type { AxiosInstance } from 'axios'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport type { DamKeyword } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { apiCreateOne } from '@/services/api/apiCreateOne'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\n\nconst END_POINT = '/adm/v1/keyword'\nconst END_POINT_LIST = END_POINT + '/ext-system/:extSystemId'\nexport const ENTITY = 'keyword'\n\nexport const fetchKeywordListByIds = (client: () => AxiosInstance, extSystemId: number, ids: string[]) =>\n apiFetchByIds<DamKeyword[]>(\n client,\n ids,\n END_POINT_LIST + '/search',\n { extSystemId },\n SYSTEM_CORE_DAM,\n ENTITY,\n {},\n true\n )\n\nexport const fetchKeywordList = (\n client: () => AxiosInstance,\n extSystemId: number,\n pagination: Pagination,\n filterBag: FilterBag\n) => apiFetchList<DamKeyword[]>(client, END_POINT_LIST, { extSystemId }, pagination, filterBag, SYSTEM_CORE_DAM, ENTITY)\n\nexport const createKeyword = (client: () => AxiosInstance, data: DamKeyword) =>\n apiCreateOne<DamKeyword>(client, data, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\n","import { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { isUndefined } from '@/utils/common'\nimport type { DamKeyword, DamKeywordMinimal } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { fetchKeywordList, fetchKeywordListByIds } from '@/components/damImage/uploadQueue/api/keywordApi'\nimport type { IntegerId } from '@/types/common'\n\nexport const useKeywordSelectActions = (extSystem: IntegerId) => {\n const { damClient } = useCommonAdminCoreDamOptions()\n const { getDamConfigExtSystem } = useDamConfigState()\n\n const configExtSystem = getDamConfigExtSystem(extSystem)\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n\n const mapToValueObject = (keyword: DamKeyword): ValueObjectOption<string> => ({\n title: keyword.name,\n value: keyword.id,\n })\n\n const mapToMinimal = (keyword: DamKeyword): DamKeywordMinimal => ({\n id: keyword.id,\n name: keyword.name,\n })\n\n const mapToValueObjects = (keywords: DamKeyword[]): ValueObjectOption<string>[] => {\n return keywords.map((keyword: DamKeyword) => mapToValueObject(keyword))\n }\n\n const mapToMinimals = (keywords: DamKeyword[]): DamKeywordMinimal[] => {\n return keywords.map((keyword: DamKeyword) => mapToMinimal(keyword))\n }\n\n const fetchItems = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToValueObjects(await fetchKeywordList(damClient, extSystem, pagination, filterBag))\n }\n\n const fetchItemsMinimal = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToMinimals(await fetchKeywordList(damClient, extSystem, pagination, filterBag))\n }\n\n const fetchItemsByIds = async (ids: string[]) => {\n return mapToValueObjects(await fetchKeywordListByIds(damClient, extSystem, ids))\n }\n\n return {\n mapToValueObject,\n fetchItems,\n fetchItemsByIds,\n fetchItemsMinimal,\n }\n}\n","import { reactive } from 'vue'\nimport { makeFilterHelper } from '@/composables/filter/filterHelpers'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { ENTITY } from '@/components/damImage/uploadQueue/api/keywordApi'\n\nconst makeFilter = makeFilterHelper(SYSTEM_CORE_DAM, ENTITY)\n\nconst filter = reactive({\n _elastic: {\n ...makeFilter({ exclude: true }),\n },\n id: {\n ...makeFilter({ name: 'id' }),\n },\n text: {\n ...makeFilter({ name: 'text' }),\n },\n reviewed: {\n ...makeFilter({ name: 'reviewed' }),\n },\n})\n\nexport function useKeywordListFilter() {\n return filter\n}\n\nexport function useKeywordFilter() {\n return reactive({\n _elastic: {\n ...makeFilter({ exclude: true }),\n },\n text: {\n ...makeFilter({ name: 'text' }),\n },\n })\n}\n","<script lang=\"ts\" setup>\nimport { useKeywordSelectActions } from '@/components/damImage/uploadQueue/keyword/keywordActions'\nimport { useKeywordListFilter } from '@/components/damImage/uploadQueue/keyword/KeywordFilter'\nimport type { Filter } from '@/types/Filter'\nimport AFilterRemoteAutocomplete from '@/components/filter/AFilterRemoteAutocomplete.vue'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n }>(),\n {\n }\n)\n\nconst modelValue = defineModel<Filter>({ required: true })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItems, fetchItemsByIds } = useKeywordSelectActions(props.extSystem)\n\nconst innerFilter = useKeywordListFilter()\n</script>\n\n<template>\n <AFilterRemoteAutocomplete\n v-model=\"modelValue\"\n :fetch-items=\"fetchItems\"\n :fetch-items-by-ids=\"fetchItemsByIds\"\n :inner-filter=\"innerFilter\"\n filter-by-field=\"text\"\n :filter-sort-by=\"null\"\n />\n</template>\n","import type { AxiosInstance } from 'axios'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport type { DamAuthor } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { apiCreateOne } from '@/services/api/apiCreateOne'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\n\nconst END_POINT = '/adm/v1/author'\nconst END_POINT_LIST = END_POINT + '/ext-system/:extSystemId'\nexport const ENTITY = 'author'\n\nexport const fetchAuthorListByIds = (client: () => AxiosInstance, extSystemId: number, ids: string[]) =>\n apiFetchByIds<DamAuthor[]>(\n client,\n ids,\n END_POINT_LIST + '/search',\n {\n extSystemId,\n },\n SYSTEM_CORE_DAM,\n ENTITY,\n {},\n true\n )\n\nexport const fetchAuthorList = (\n client: () => AxiosInstance,\n extSystemId: number,\n pagination: Pagination,\n filterBag: FilterBag\n) =>\n apiFetchList<DamAuthor[]>(\n client,\n END_POINT_LIST,\n {\n extSystemId,\n },\n pagination,\n filterBag,\n SYSTEM_CORE_DAM,\n ENTITY\n )\n\nexport const createAuthor = (client: () => AxiosInstance, data: DamAuthor) =>\n apiCreateOne<DamAuthor>(client, data, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\n","import { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { isUndefined } from '@/utils/common'\nimport type { DamAuthor, DamAuthorMinimal } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { fetchAuthorList, fetchAuthorListByIds } from '@/components/damImage/uploadQueue/api/authorApi'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { IntegerId } from '@/types/common'\n\nexport const useAuthorSelectActions = (extSystem: IntegerId) => {\n const { damClient } = useCommonAdminCoreDamOptions()\n const { getDamConfigExtSystem } = useDamConfigState()\n\n const configExtSystem = getDamConfigExtSystem(extSystem)\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n\n const mapToMinimal = (author: DamAuthor): DamAuthorMinimal => ({\n id: author.id,\n name: author.name,\n identifier: author.identifier,\n reviewed: author.flags.reviewed,\n })\n\n const mapToValueObject = (author: DamAuthor): ValueObjectOption<string> => ({\n title: author.name + (author.identifier ? ` (${author.identifier})` : ''),\n value: author.id,\n })\n\n const mapToValueObjects = (authors: DamAuthor[]): ValueObjectOption<string>[] => {\n return authors.map((author: DamAuthor) => mapToValueObject(author))\n }\n\n const mapToMinimals = (authors: DamAuthor[]): DamAuthorMinimal[] => {\n return authors.map((author: DamAuthor) => mapToMinimal(author))\n }\n\n const fetchItems = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToValueObjects(await fetchAuthorList(damClient, extSystem, pagination, filterBag))\n }\n\n const fetchItemsMinimal = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToMinimals(await fetchAuthorList(damClient, extSystem, pagination, filterBag))\n }\n\n const fetchItemsByIds = async (ids: string[]) => {\n return mapToValueObjects(await fetchAuthorListByIds(damClient, extSystem, ids))\n }\n\n return {\n mapToValueObject,\n fetchItems,\n fetchItemsByIds,\n fetchItemsMinimal,\n }\n}\n","import { reactive } from 'vue'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { makeFilterHelper } from '@/composables/filter/filterHelpers'\n\nconst makeFilter = makeFilterHelper(SYSTEM_CORE_DAM, 'author')\n\nexport function useAuthorFilter() {\n return reactive({\n _elastic: {\n ...makeFilter({ exclude: true }),\n },\n text: {\n ...makeFilter({ name: 'text' }),\n },\n })\n}\n","<script lang=\"ts\" setup>\nimport type { Filter } from '@/types/Filter'\nimport AFilterRemoteAutocomplete from '@/components/filter/AFilterRemoteAutocomplete.vue'\nimport { useAuthorSelectActions } from '@/components/damImage/uploadQueue/author/authorActions'\nimport { useAuthorFilter } from '@/components/damImage/uploadQueue/author/AuthorFilter'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n }>(),\n {\n }\n)\n\nconst modelValue = defineModel<Filter>({ required: true })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItems, fetchItemsByIds } = useAuthorSelectActions(props.extSystem)\n\nconst innerFilter = useAuthorFilter()\n</script>\n\n<template>\n <AFilterRemoteAutocomplete\n v-model=\"modelValue\"\n :fetch-items=\"fetchItems\"\n :fetch-items-by-ids=\"fetchItemsByIds\"\n :inner-filter=\"innerFilter\"\n filter-by-field=\"text\"\n :filter-sort-by=\"null\"\n />\n</template>\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nexport const apiUpdateOne = <T, R = T>(\n client: () => AxiosInstance,\n object: T | Record<string, never> = {},\n urlTemplate: string,\n urlParams: UrlParams = {},\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n client()\n .put(replaceUrlParameters(urlTemplate, urlParams), JSON.stringify(object), options)\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n return resolve(res.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve(null as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import type { AxiosInstance } from 'axios'\nimport type { DamUser, DamUserUpdateDto } from '@/components/dam/user/DamUser'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport { apiUpdateOne } from '@/services/api/apiUpdateOne'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\n\nconst END_POINT = '/adm/v1/user'\nexport const ENTITY = 'user'\n\nexport const fetchDamUserListByIds = (client: () => AxiosInstance, ids: number[]) =>\n apiFetchByIds<DamUser[]>(client, ids, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchDamUserList = (client: () => AxiosInstance, pagination: Pagination, filterBag: FilterBag) =>\n apiFetchList<DamUser[]>(client, END_POINT, {}, pagination, filterBag, SYSTEM_CORE_DAM, ENTITY)\n\nexport const updateDamUser = (client: () => AxiosInstance, id: number, data: DamUserUpdateDto) =>\n apiUpdateOne<DamUserUpdateDto, DamUser>(client, data, END_POINT + '/:id', { id }, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchDamUser = (client: () => AxiosInstance, id: number) =>\n apiFetchOne<DamUser>(client, END_POINT + '/:id', { id }, SYSTEM_CORE_DAM, ENTITY)\n","import type { AxiosInstance } from 'axios'\nimport type { DamUser } from '@/components/dam/user/DamUser'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { IntegerId } from '@/types/common'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { fetchDamUserList, fetchDamUserListByIds } from '@/components/dam/user/userApi'\n\nexport const useDamUserSelectAction = (client: () => AxiosInstance) => {\n const mapToValueObject = (user: DamUser): ValueObjectOption<IntegerId> => ({\n title: '' === user.person.fullName ? user.email : user.person.fullName,\n value: user.id,\n })\n\n const mapToValueObjects = (users: DamUser[]): ValueObjectOption<IntegerId>[] => {\n return users.map((user: DamUser) => mapToValueObject(user))\n }\n\n const fetchItems = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToValueObjects(await fetchDamUserList(client, pagination, filterBag))\n }\n\n const fetchItemsByIds = async (ids: IntegerId[]) => {\n return mapToValueObjects(await fetchDamUserListByIds(client, ids))\n }\n\n return {\n mapToValueObject,\n fetchItems,\n fetchItemsByIds,\n }\n}\n","import { reactive } from 'vue'\nimport { makeFilterHelper } from '@/composables/filter/filterHelpers'\n\nconst makeFilter = makeFilterHelper('dam', 'user')\n\nconst filter = reactive({\n id: {\n ...makeFilter({ name: 'id', default: null }),\n },\n email: {\n ...makeFilter({ name: 'email', variant: 'startsWith' }),\n },\n enabled: {\n ...makeFilter({ name: 'enabled' }),\n },\n lastName: {\n ...makeFilter({ name: 'lastName', variant: 'startsWith', field: 'person.lastName' }),\n },\n permissionGroups: {\n ...makeFilter({ name: 'permissionGroups', variant: 'custom', multiple: true, default: [] }),\n },\n})\n\nexport function useDamUserFilter() {\n return filter\n}\n","<script lang=\"ts\" setup>\nimport type { Filter } from '@/types/Filter'\nimport { useDamUserSelectAction } from '@/components/dam/user/damUserSelectActions'\nimport { useDamUserFilter } from '@/components/dam/user/DamUserFilter'\nimport AFilterRemoteAutocomplete from '@/components/filter/AFilterRemoteAutocomplete.vue'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\n\nconst props = withDefaults(\n defineProps<{\n configName?: string\n }>(),\n {\n configName: 'default'\n }\n)\n\nconst modelValue = defineModel<Filter>({ required: true })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { damClient } = useCommonAdminCoreDamOptions(props.configName)\n\nconst { fetchItems, fetchItemsByIds } = useDamUserSelectAction(damClient)\n\nconst innerFilter = useDamUserFilter()\n</script>\n\n<template>\n <AFilterRemoteAutocomplete\n v-model=\"modelValue\"\n :fetch-items=\"fetchItems\"\n :fetch-items-by-ids=\"fetchItemsByIds\"\n :inner-filter=\"innerFilter\"\n filter-by-field=\"lastName\"\n :filter-sort-by=\"null\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { useAssetSelectActions } from '@/components/dam/assetSelect/composables/assetSelectListActions'\nimport AFilterString from '@/components/filter/AFilterString.vue'\nimport AFilterBooleanSelect from '@/components/filter/AFilterBooleanSelect.vue'\nimport DamKeywordFilterRemoteAutocomplete from '@/components/damImage/uploadQueue/keyword/DamKeywordFilterRemoteAutocomplete.vue'\nimport DamAuthorFilterRemoteAutocomplete from '@/components/damImage/uploadQueue/author/DamAuthorFilterRemoteAutocomplete.vue'\nimport DamUserFilterRemoteAutocomplete from '@/components/dam/user/DamUserFilterRemoteAutocomplete.vue'\nimport { computed, watch } from 'vue'\nimport { useAssetSelectStore } from '@/services/stores/coreDam/assetSelectStore'\nimport { storeToRefs } from 'pinia'\n\nconst { filter, filterTouch, filterUnTouch, fetchAssetList } = useAssetSelectActions()\n\nconst assetSelectStore = useAssetSelectStore()\nconst { selectConfig, selectedLicenceId } = storeToRefs(assetSelectStore)\n\nconst extSystem = computed(() => {\n const found = selectConfig.value.find((config) => config.licence === selectedLicenceId.value)\n if (found) {\n return found.extSystem\n }\n return undefined\n})\n\nconst onAnyFilterUpdate = () => {\n filterTouch()\n}\n\nconst submitFilter = () => {\n filterUnTouch()\n fetchAssetList()\n}\n\nwatch(extSystem, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n filter.keywordIds.model = []\n filter.authorIds.model = []\n }\n})\n</script>\n\n<template>\n <VRow>\n <VCol :cols=\"12\">\n <AFilterString\n v-model=\"filter.text\"\n @update:model-value=\"onAnyFilterUpdate\"\n @keydown.enter=\"submitFilter\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol :cols=\"12\">\n <AFilterString\n v-model=\"filter.assetAndMainFileIds\"\n @update:model-value=\"onAnyFilterUpdate\"\n @keydown.enter=\"submitFilter\"\n />\n </VCol>\n </VRow>\n <VRow v-if=\"extSystem\">\n <VCol :cols=\"12\">\n <DamKeywordFilterRemoteAutocomplete\n :key=\"extSystem\"\n v-model=\"filter.keywordIds\"\n :ext-system=\"extSystem\"\n @update:model-value=\"onAnyFilterUpdate\"\n />\n </VCol>\n </VRow>\n <VRow v-if=\"extSystem\">\n <VCol :cols=\"12\">\n <DamAuthorFilterRemoteAutocomplete\n :key=\"extSystem\"\n v-model=\"filter.authorIds\"\n :ext-system=\"extSystem\"\n @update:model-value=\"onAnyFilterUpdate\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol :cols=\"12\">\n <DamUserFilterRemoteAutocomplete\n v-model=\"filter.createdByIds\"\n @update:model-value=\"onAnyFilterUpdate\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol :cols=\"12\">\n <AFilterBooleanSelect\n v-model=\"filter.described\"\n @update:model-value=\"onAnyFilterUpdate\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol :cols=\"12\">\n <AFilterBooleanSelect\n v-model=\"filter.visible\"\n @update:model-value=\"onAnyFilterUpdate\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol>\n <AFilterBooleanSelect\n v-model=\"filter.generatedBySystem\"\n @update:model-value=\"onAnyFilterUpdate\"\n />\n </VCol>\n </VRow>\n</template>\n","<script lang=\"ts\" setup>\nimport { useAssetSelectActions } from '@/components/dam/assetSelect/composables/assetSelectListActions'\nimport AFilterString from '@/components/filter/AFilterString.vue'\n\nconst { filter, fetchAssetList, filterTouch, filterUnTouch } = useAssetSelectActions()\n\nconst submitFilter = () => {\n filterUnTouch()\n fetchAssetList()\n}\n\nconst onAnyFilterUpdate = () => {\n filterTouch()\n}\n</script>\n\n<template>\n <VRow>\n <VCol :cols=\"12\">\n <AFilterString\n v-model=\"filter.text\"\n @update:model-value=\"onAnyFilterUpdate\"\n @keydown.enter=\"submitFilter\"\n />\n </VCol>\n </VRow>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { useAssetSelectActions } from '@/components/dam/assetSelect/composables/assetSelectListActions'\nimport { computed, watch } from 'vue'\nimport { useAssetSelectStore } from '@/services/stores/coreDam/assetSelectStore'\nimport { DamAssetType } from '@/types/coreDam/Asset'\nimport AssetSelectFilterFormImage from '@/components/dam/assetSelect/components/filter/AssetSelectFilterFormImage.vue'\nimport AssetSelectFilterFormDefault from '@/components/dam/assetSelect/components/filter/AssetSelectFilterFormDefault.vue'\nimport { storeToRefs } from 'pinia'\n\nconst { t } = useI18n()\nconst { fetchAssetList, resetAssetList, filterUnTouch, filterIsTouched } = useAssetSelectActions()\n\nconst assetSelectStore = useAssetSelectStore()\nconst { selectedLicenceId, selectConfig } = storeToRefs(assetSelectStore)\n\nconst submitFilter = () => {\n filterUnTouch()\n fetchAssetList()\n}\n\nconst resetFilter = () => {\n resetAssetList()\n filterUnTouch()\n}\n\nconst componentComputed = computed(() => {\n switch (assetSelectStore.assetType) {\n case DamAssetType.Image:\n return AssetSelectFilterFormImage\n default:\n return AssetSelectFilterFormDefault\n }\n})\n\nwatch(\n selectedLicenceId,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n submitFilter()\n },\n { immediate: false }\n)\n</script>\n\n<template>\n <div class=\"subject-select-filter\">\n <div class=\"subject-select-filter__content\">\n <VForm\n name=\"search2\"\n class=\"px-2 pt-4\"\n @submit.prevent=\"submitFilter\"\n >\n <VRow v-if=\"selectConfig.length > 1\">\n <VCol :cols=\"12\">\n <VSelect\n v-model=\"selectedLicenceId\"\n :label=\"t('common.assetSelect.filter.licence')\"\n :items=\"selectConfig\"\n item-title=\"licenceName\"\n item-value=\"licence\"\n />\n </VCol>\n </VRow>\n <component :is=\"componentComputed\" />\n </VForm>\n </div>\n <div class=\"subject-select-filter__actions\">\n <VBtn\n color=\"primary\"\n class=\"mx-2\"\n :variant=\"filterIsTouched ? 'flat' : 'text'\"\n size=\"small\"\n @click.stop=\"submitFilter\"\n >\n {{ t('common.button.submitFilter') }}\n </VBtn>\n <VBtn\n class=\"px-2\"\n color=\"light\"\n min-width=\"36px\"\n variant=\"flat\"\n size=\"small\"\n @click.stop=\"resetFilter\"\n >\n <VIcon icon=\"mdi-filter-remove-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.resetFilter') }}\n </VTooltip>\n </VBtn>\n </div>\n </div>\n</template>\n","import { cloneDeep, isUndefined } from '@/utils/common'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { defineAuth } from '@/composables/auth/defineAuth'\nimport type { AclValue } from '@/types/Permission'\nimport type { DamCurrentUserDto } from '@/types/coreDam/DamCurrentUser'\nimport { SYSTEM_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\n\nexport function filterAllowedImageWidgetSelectConfigs(values: DamConfigLicenceExtSystemReturnType[]) {\n const { useCurrentUser } = defineAuth<AclValue>(SYSTEM_DAM)\n const { currentUser: damCurrentUser, isSuperAdmin: damCurrentUserIsSuperAdmin } =\n useCurrentUser<DamCurrentUserDto>(SYSTEM_DAM)\n\n if (damCurrentUserIsSuperAdmin.value) return cloneDeep(values)\n const currentUser = damCurrentUser.value\n if (isUndefined(currentUser)) return []\n\n const adminToExtSystems = currentUser.adminToExtSystems\n const assetLicences = currentUser.resolvedAssetLicences.map((assetLicenceValue) => assetLicenceValue.id)\n const allowed: DamConfigLicenceExtSystemReturnType[] = []\n values.forEach((value) => {\n if (adminToExtSystems.includes(value.extSystem)) {\n allowed.push(value)\n return\n }\n if (assetLicences.includes(value.licence)) {\n allowed.push(value)\n }\n })\n return allowed\n}\n\nexport function isImageWidgetUploadConfigAllowed(value: DamConfigLicenceExtSystemReturnType) {\n const { useCurrentUser } = defineAuth<AclValue>(SYSTEM_DAM)\n const { currentUser: damCurrentUser, isSuperAdmin: damCurrentUserIsSuperAdmin } =\n useCurrentUser<DamCurrentUserDto>(SYSTEM_DAM)\n\n if (damCurrentUserIsSuperAdmin.value) return true\n\n const currentUser = damCurrentUser.value\n if (isUndefined(currentUser)) return []\n\n const adminToExtSystems = currentUser.adminToExtSystems\n if (adminToExtSystems.includes(value.extSystem)) {\n return true\n }\n\n const assetLicences = currentUser.resolvedAssetLicences.map((assetLicenceValue) => assetLicenceValue.id)\n if (assetLicences.includes(value.licence)) {\n return true\n }\n\n return false\n}\n","<script lang=\"ts\" setup>\nimport { computed, onMounted, onUnmounted, ref, shallowRef, watch, withModifiers } from 'vue'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { useAssetSelectActions } from '@/components/dam/assetSelect/composables/assetSelectListActions'\nimport AssetSelectListTable from '@/components/dam/assetSelect/components/AssetSelectListTable.vue'\nimport AssetSelectListBar from '@/components/dam/assetSelect/components/AssetSelectListBar.vue'\nimport { AssetSelectGridView, useGridView } from '@/components/dam/assetSelect/composables/assetSelectGridView'\nimport AssetSelectListTiles from '@/components/dam/assetSelect/components/AssetSelectListTiles.vue'\nimport { useSidebar } from '@/components/dam/assetSelect/composables/assetSelectFilterSidebar'\nimport AssetSelectFilter from '@/components/dam/assetSelect/components/filter/AssetSelectFilter.vue'\nimport {\n type AssetSelectReturnData,\n AssetSelectReturnType,\n type AssetSelectReturnTypeType,\n} from '@/types/coreDam/AssetSelect'\nimport { filterAllowedImageWidgetSelectConfigs } from '@/components/damImage/composables/damFilterUserAllowedUploadConfigs'\nimport { useAlerts } from '@/composables/system/alerts'\nimport type { IntegerId } from '@/types/common'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { cloneDeep } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n assetType: DamAssetTypeType\n minCount: number\n maxCount: number\n selectLicences: IntegerId[]\n returnType?: AssetSelectReturnTypeType\n configName?: string\n skipCurrentUserCheck?: boolean\n }>(),\n {\n returnType: AssetSelectReturnType.MainFileId,\n configName: 'default',\n skipCurrentUserCheck: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'onConfirm', data: AssetSelectReturnData): void\n}>()\n\nconst modelValue = defineModel<boolean>({ default: false, required: false })\nconst loading = ref(false)\n\nconst { t } = useI18n()\n\nconst {\n damClient,\n selectedCount,\n loader,\n pagination,\n fetchNextPage,\n resetAssetList,\n getSelectedData,\n initStoreContext,\n} = useAssetSelectActions()\n\nconst { getOrLoadDamConfigExtSystemByLicences } = useDamConfigState(damClient)\n\nconst selectConfigs = shallowRef<DamConfigLicenceExtSystemReturnType[]>([])\n\nconst { openSidebar, sidebarLeft } = useSidebar()\nconst { showErrorT } = useAlerts()\n\nconst onOpen = () => {\n let selectConfigLocal = cloneDeep(selectConfigs.value)\n if (!props.skipCurrentUserCheck) {\n selectConfigLocal = filterAllowedImageWidgetSelectConfigs(selectConfigs.value)\n }\n if (selectConfigLocal.length === 0) {\n showErrorT('common.assetSelect.error.unallowedLicence')\n return\n }\n\n initStoreContext(\n selectConfigLocal,\n props.assetType,\n 1 === props.minCount && props.minCount === props.maxCount,\n props.minCount,\n props.maxCount\n )\n resetAssetList()\n openSidebar()\n modelValue.value = true\n}\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue || !newValue) return\n onOpen()\n },\n { immediate: true }\n)\n\nconst onClose = () => {\n modelValue.value = false\n}\n\nconst onConfirm = () => {\n emit('onConfirm', getSelectedData(props.returnType))\n onClose()\n}\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && pagination.hasNextPage === true) {\n fetchNextPage()\n }\n}\n\nconst { gridView } = useGridView()\n\nconst componentComputed = computed(() => {\n switch (gridView.value) {\n case AssetSelectGridView.Table:\n return AssetSelectListTable\n default:\n case AssetSelectGridView.Masonry:\n case AssetSelectGridView.Thumbnail:\n return AssetSelectListTiles\n }\n})\n\nconst disabledSubmit = computed(() => {\n return selectedCount.value < props.minCount || selectedCount.value > props.maxCount\n})\n\nonMounted(async () => {\n loading.value = true\n selectConfigs.value = await getOrLoadDamConfigExtSystemByLicences(props.selectLicences)\n loading.value = false\n})\n\nonUnmounted(() => {\n selectConfigs.value = []\n})\n\ndefineExpose({\n open: onOpen,\n})\n</script>\n\n<template>\n <div\n v-if=\"loading\"\n class=\"w-100 d-flex align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <template v-else-if=\"selectConfigs.length > 0\">\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-model=\"modelValue\"\n fullscreen\n class=\"subject-select\"\n >\n <VCard\n v-if=\"modelValue\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar system-border-b\"\n @on-cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t('common.assetSelect.meta.texts.title') }}\n </slot>\n </ADialogToolbar>\n <AssetSelectListBar />\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar system-border-r\">\n <AssetSelectFilter />\n </div>\n <div class=\"subject-select__content\">\n <component :is=\"componentComputed\" />\n <div class=\"d-flex w-100 align-center justify-center pa-4\">\n <ABtnSecondary\n v-show=\"pagination.hasNextPage || loader\"\n v-intersect=\"autoloadOnIntersect\"\n :loading=\"loader\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n </div>\n </div>\n <div class=\"subject-select__actions system-border-t\">\n <div v-if=\"props.minCount === props.maxCount\">\n {{ t('common.assetSelect.meta.texts.pickExactCount', { count: props.minCount, selected: selectedCount }) }}\n </div>\n <div v-else>\n {{\n t('common.assetSelect.meta.texts.pickRangeCount', {\n minCount: props.minCount,\n maxCount: props.maxCount,\n selected: selectedCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n </template>\n <div v-else>\n Error, no select licence.\n </div>\n</template>\n","/**!\n * Sortable 1.15.3\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.3\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","import { tryOnMounted, tryOnScopeDispose, toValue, unrefElement, defaultDocument } from '@vueuse/core';\nimport Sortable from 'sortablejs';\nimport { isRef, nextTick } from 'vue-demi';\n\nfunction useSortable(el, list, options = {}) {\n let sortable;\n const { document = defaultDocument, ...resetOptions } = options;\n const defaultOptions = {\n onUpdate: (e) => {\n moveArrayElement(list, e.oldIndex, e.newIndex);\n }\n };\n const start = () => {\n const target = typeof el === \"string\" ? document == null ? void 0 : document.querySelector(el) : unrefElement(el);\n if (!target || sortable !== void 0)\n return;\n sortable = new Sortable(target, { ...defaultOptions, ...resetOptions });\n };\n const stop = () => {\n sortable == null ? void 0 : sortable.destroy();\n sortable = void 0;\n };\n const option = (name, value) => {\n if (value !== void 0)\n sortable == null ? void 0 : sortable.option(name, value);\n else\n return sortable == null ? void 0 : sortable.option(name);\n };\n tryOnMounted(start);\n tryOnScopeDispose(stop);\n return {\n stop,\n start,\n option\n };\n}\nfunction moveArrayElement(list, from, to) {\n const _valueIsRef = isRef(list);\n const array = _valueIsRef ? [...toValue(list)] : toValue(list);\n if (to >= 0 && to < array.length) {\n const element = array.splice(from, 1)[0];\n nextTick(() => {\n array.splice(to, 0, element);\n if (_valueIsRef)\n list.value = array;\n });\n }\n}\n\nexport { moveArrayElement, useSortable };\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5naWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZ2lmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFNckMsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0FBRS9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFNekQsT0FBTyxDQUNMLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixHQUFHO1FBQ0gsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUM1QixDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQU8xQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEIsTUFBTSxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsZUFBZSxTQUFTLENBQUMifQ==","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm5nLWJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm5nLWJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsSUFBSSxlQUEwRCxDQUFDO0FBRS9ELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxPQUFPLFVBQVUsR0FBRztJQUV6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwwR0FBMEcsQ0FDM0csQ0FBQztRQUNKLENBQUM7UUFFRCxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUMifQ==","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nconst _state = {};\nfunction v1(options, buf, offset) {\n let bytes;\n const isV6 = options?._v6 ?? false;\n if (options) {\n const optionsKeys = Object.keys(options);\n if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') {\n options = undefined;\n }\n }\n if (options) {\n bytes = v1Bytes(options.random ?? options.rng?.() ?? rng(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset);\n }\n else {\n const now = Date.now();\n const rnds = rng();\n updateV1State(_state, now, rnds);\n bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset);\n }\n return buf ? bytes : unsafeStringify(bytes);\n}\nexport function updateV1State(state, now, rnds) {\n state.msecs ??= -Infinity;\n state.nsecs ??= 0;\n if (now === state.msecs) {\n state.nsecs++;\n if (state.nsecs >= 10000) {\n state.node = undefined;\n state.nsecs = 0;\n }\n }\n else if (now > state.msecs) {\n state.nsecs = 0;\n }\n else if (now < state.msecs) {\n state.node = undefined;\n }\n if (!state.node) {\n state.node = rnds.slice(10, 16);\n state.node[0] |= 0x01;\n state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n }\n state.msecs = now;\n return state;\n}\nfunction v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) {\n if (!buf) {\n buf = new Uint8Array(16);\n offset = 0;\n }\n msecs ??= Date.now();\n nsecs ??= 0;\n clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n node ??= rnds.slice(10, 16);\n msecs += 12219292800000;\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n buf[offset++] = (tl >>> 24) & 0xff;\n buf[offset++] = (tl >>> 16) & 0xff;\n buf[offset++] = (tl >>> 8) & 0xff;\n buf[offset++] = tl & 0xff;\n const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;\n buf[offset++] = (tmh >>> 8) & 0xff;\n buf[offset++] = tmh & 0xff;\n buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10;\n buf[offset++] = (tmh >>> 16) & 0xff;\n buf[offset++] = (clockseq >>> 8) | 0x80;\n buf[offset++] = clockseq & 0xff;\n for (let n = 0; n < 6; ++n) {\n buf[offset++] = node[n];\n }\n return buf;\n}\nexport default v1;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdjEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXNCakQsTUFBTSxNQUFNLEdBQVksRUFBRSxDQUFDO0FBSTNCLFNBQVMsRUFBRSxDQUFDLE9BQXlCLEVBQUUsR0FBZ0IsRUFBRSxNQUFlO0lBQ3RFLElBQUksS0FBaUIsQ0FBQztJQUd0QixNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQztJQUNuQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN6RCxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVaLEtBQUssR0FBRyxPQUFPLENBQ2IsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFDMUMsT0FBTyxDQUFDLEtBQUssRUFDYixPQUFPLENBQUMsS0FBSyxFQUNiLE9BQU8sQ0FBQyxRQUFRLEVBQ2hCLE9BQU8sQ0FBQyxJQUFJLEVBQ1osR0FBRyxFQUNILE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFFTixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFbkIsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFD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","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlLWJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkYsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDIn0=","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJakQsU0FBUyxFQUFFLENBQUMsT0FBeUIsRUFBRSxHQUFnQixFQUFFLE1BQWU7SUFDdEUsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBRXhCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFHdEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBR2xDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDUixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDNUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxlQUFlLEVBQUUsQ0FBQyJ9","// @ts-ignore // todo\nimport { v1 as uuidv1, v4 as uuidv4 } from 'uuid'\n\nexport const generateUUIDv1 = () => {\n return uuidv1()\n}\n\nexport const generateUUIDv4 = () => {\n return uuidv4()\n}\n","import { computed, type ComputedRef, nextTick, type Ref, ref } from 'vue'\nimport type { UseSortableReturn } from '@vueuse/integrations/useSortable'\nimport type { SortableItemDataAware, SortableItemNewPositions } from '@/components/sortable/sortableUtils'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { cloneDeep, isNull, isUndefined } from '@/utils/common'\nimport { generateUUIDv1 } from '@/utils/generator'\nimport { objectSetValueByPath } from '@/utils/object'\n\nexport const HANDLE_CLASS = 'a-sortable-widget__handle'\nexport const GHOST_CLASS = 'a-sortable-widget__ghost'\nexport const DRAG_CLASS = 'a-sortable-widget__drag'\nexport const CHOSEN_CLASS = 'a-sortable-widget__chosen'\nexport const GROUP_CLASS = 'a-sortable-widget__group'\n\nexport type SortablePropItem<TItem = any> = SortableItemDataAware & TItem\n\nexport interface SortableItem<TItem = any> {\n key: DocId | IntegerId\n index: number\n raw: SortablePropItem<TItem>\n}\n\nexport interface SortableEmit {\n (e: 'update:modelValue', data: SortablePropItem[]): void\n\n (e: 'update:dirty', data: Array<DocId | IntegerId>): void\n\n (e: 'onStart'): void\n\n (e: 'onEnd', data: SortableItemNewPositions): void\n\n (e: 'onAddAfter', data: SortableItem): void\n\n (e: 'onAddLast', data: SortablePropItem | null): void\n\n (e: 'onEdit', data: SortableItem): void\n\n (e: 'onDelete', data: SortableItem): void\n}\n\nexport interface SortableActionsProps {\n dirty: Set<DocId | IntegerId>\n keyField: string\n positionField: string\n updatePosition: boolean\n positionMultiplier: number\n}\n\nexport function useSortableActions(\n model: Readonly<Ref<SortablePropItem[]>>,\n initSortableCallback: () => void,\n props: SortableActionsProps,\n emit: SortableEmit\n): {\n removeByIndex: (index: number) => SortableItemNewPositions\n updateDataAtIndex: (index: number, data: SortablePropItem, position: number | null, dirty?: boolean | null) => void\n onRemoveDialogConfirm: () => void\n removeById: (id: DocId | IntegerId) => SortableItemNewPositions\n updateData: (id: DocId | IntegerId, data: SortablePropItem, position: number | null, dirty?: boolean | null) => void\n refresh: () => void\n destroy: () => void\n removeDialog: Ref<boolean>\n addAfterId: (targetId: DocId | IntegerId | null, data: SortablePropItem) => SortableItemNewPositions\n forceRerender: Ref<number>\n dirtyLocal: Ref<Set<DocId | IntegerId>>\n widgetEl: Ref<HTMLElement | null>\n itemToRemove: Ref<SortableItem | null>\n sortableInstance: Ref<UseSortableReturn | null>\n randomUuid: Ref<string>\n items: ComputedRef<SortableItem[]>\n moveArrayElement: (from: number, to: number) => SortableItemNewPositions\n addAfterIndex: (targetIndex: number | null, data: SortablePropItem) => SortableItemNewPositions\n} {\n const removeDialog = ref(false)\n const itemToRemove = ref<null | SortableItem>(null)\n const widgetEl = ref<HTMLElement | null>(null)\n const randomUuid = ref<string>(generateUUIDv1())\n const sortableInstance = ref<UseSortableReturn | null>(null)\n const forceRerender = ref(0)\n const dirtyLocal = ref(props.dirty)\n\n function transformItem(item: SortablePropItem, index: number): SortableItem {\n return {\n key: item[props.keyField],\n index,\n raw: item,\n }\n }\n\n const items = computed(() => {\n return model.value.map((item, index) => transformItem(item, index))\n })\n\n const forceRerenderWidgetHtml = (emitData: SortablePropItem[] | undefined = undefined) => {\n forceRerender.value++\n if (!isUndefined(emitData)) {\n emit('update:modelValue', emitData)\n }\n nextTick(() => {\n initSortableCallback()\n })\n }\n\n const touchDirty = (id: DocId | IntegerId) => {\n dirtyLocal.value.add(id)\n }\n\n const untouchDirty = (id: DocId | IntegerId) => {\n dirtyLocal.value.delete(id)\n }\n\n const updatePositions = (\n items: SortablePropItem[],\n oldIndex: number,\n newIndex: number,\n updatedPositions: SortableItemNewPositions = []\n ) => {\n const start = oldIndex > newIndex ? newIndex : oldIndex\n let position = (props.positionMultiplier * start) + (props.positionMultiplier * 1)\n for (let i = start; i < items.length; i++) {\n objectSetValueByPath(items[i], props.positionField, position)\n touchDirty(items[i][props.keyField])\n position = position + (props.positionMultiplier * 1)\n updatedPositions.push({\n id: items[i].id,\n position: items[i].position,\n })\n }\n return updatedPositions\n }\n\n const moveArrayElement = (from: number, to: number): SortableItemNewPositions => {\n const clonedData = cloneDeep(model.value)\n if (to >= 0 && to < clonedData.length) {\n let returnData: SortableItemNewPositions = []\n const element = clonedData.splice(from, 1)[0]\n clonedData.splice(to, 0, element)\n if (!isUndefined(props.updatePosition)) {\n returnData = updatePositions(clonedData, from, to)\n }\n forceRerenderWidgetHtml()\n emit('update:modelValue', clonedData)\n return returnData\n }\n return []\n }\n\n const findItemIndexById = (id: DocId | IntegerId, items: SortablePropItem[]) => {\n const idx = items.findIndex((item) => item[props.keyField] === id)\n if (idx === -1) return null\n return idx\n }\n\n const updateDataCommon = (\n item: SortablePropItem,\n data: SortablePropItem,\n position: number | null,\n dirty: null | boolean = null\n ) => {\n item.data = cloneDeep(data)\n if (!isNull(position)) item.data.position = position\n if (!isNull(dirty)) touchDirty(data.id)\n }\n\n /**\n * @param id - id of item\n * @param data - item data\n * @param position - item position, use null to skip update and keep original data\n * @param dirty - item dirty, use null to skip update and keep original data\n */\n const updateData = (\n id: DocId | IntegerId,\n data: SortablePropItem,\n position: number | null = null,\n dirty: null | boolean = null\n ) => {\n const clonedData = cloneDeep(model.value)\n const foundIndex = findItemIndexById(id, clonedData)\n if (!isNull(foundIndex) && clonedData[foundIndex]) {\n updateDataCommon(clonedData[foundIndex], data, position, dirty)\n forceRerenderWidgetHtml(clonedData)\n }\n }\n\n const updateDataAtIndex = (\n index: number,\n data: SortablePropItem,\n position: number | null,\n dirty: null | boolean = null\n ) => {\n const clonedData = cloneDeep(model.value)\n if (clonedData[index]) {\n updateDataCommon(clonedData[index], data, position, dirty)\n forceRerenderWidgetHtml(clonedData)\n }\n }\n\n /**\n * @template targetIndex null value is when push as last item\n */\n const addAfterIndex = (targetIndex: number | null, data: SortablePropItem): SortableItemNewPositions => {\n const clonedData = cloneDeep(model.value)\n\n if (isNull(targetIndex)) {\n clonedData.push(cloneDeep(data))\n forceRerenderWidgetHtml(clonedData)\n return []\n }\n\n const returnData: SortableItemNewPositions = []\n\n if (clonedData[targetIndex]) {\n clonedData.splice(targetIndex + 1, 0, data)\n updatePositions(clonedData, targetIndex + 1, targetIndex + 1, returnData)\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n return []\n }\n\n /**\n * @template targetId null value is when push as last item\n */\n const addAfterId = (targetId: DocId | IntegerId | null, data: SortablePropItem): SortableItemNewPositions => {\n const clonedData = cloneDeep(model.value)\n\n if (isNull(targetId)) {\n clonedData.push(cloneDeep(data))\n forceRerenderWidgetHtml(clonedData)\n return []\n }\n\n const foundIndex = findItemIndexById(targetId, clonedData)\n const returnData: SortableItemNewPositions = []\n\n if (!isNull(foundIndex) && clonedData[foundIndex]) {\n clonedData.splice(foundIndex + 1, 0, data)\n updatePositions(clonedData, foundIndex + 1, foundIndex + 1, returnData)\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n\n return []\n }\n\n const removeById = (id: DocId | IntegerId): SortableItemNewPositions => {\n const clonedData = cloneDeep(model.value)\n const foundIndex = findItemIndexById(id, clonedData)\n\n const returnData: SortableItemNewPositions = []\n\n if (!isNull(foundIndex) && clonedData[foundIndex]) {\n clonedData.splice(foundIndex, 1)\n updatePositions(clonedData, foundIndex, foundIndex, returnData)\n untouchDirty(id)\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n return []\n }\n\n const removeByIndex = (index: number): SortableItemNewPositions => {\n const clonedData = cloneDeep(model.value)\n\n const returnData: SortableItemNewPositions = []\n\n if (clonedData[index]) {\n const id = clonedData[index][props.keyField]\n clonedData.splice(index, 1)\n updatePositions(clonedData, index, index, returnData)\n untouchDirty(id)\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n return []\n }\n\n const destroy = () => {\n if (!widgetEl.value) return\n if (!sortableInstance.value) return\n sortableInstance.value.stop()\n sortableInstance.value = null\n }\n\n const refresh = () => {\n destroy()\n initSortableCallback()\n }\n\n const onRemoveDialogConfirm = () => {\n if (isNull(itemToRemove.value)) return\n emit('onDelete', itemToRemove.value)\n removeDialog.value = false\n }\n\n return {\n items,\n forceRerender,\n dirtyLocal,\n widgetEl,\n randomUuid,\n removeDialog,\n itemToRemove,\n sortableInstance,\n refresh,\n onRemoveDialogConfirm,\n destroy,\n moveArrayElement,\n addAfterId,\n addAfterIndex,\n removeById,\n removeByIndex,\n updateData,\n updateDataAtIndex,\n }\n}\n","import type { DocId, IntegerId } from '@/types/common'\n\nexport const WIDGET_HTML_ID_PREFIX = 'a-sortable-'\n\nexport interface SortableItemDataAware {\n id?: DocId | IntegerId\n position: number\n}\n\nexport interface SortableItemWithParentDataAware {\n id: DocId | IntegerId\n position: number\n parent: DocId | IntegerId | null // if null, no parent\n}\n\nexport interface SortableItemNewPosition {\n id?: DocId | IntegerId\n position: number\n}\n\nexport type SortableItemNewPositions = Array<SortableItemNewPosition>\n","<script setup lang=\"ts\">\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport type { SortableEvent } from 'sortablejs'\nimport { computed, nextTick, onBeforeUnmount, toRef, watch, withModifiers } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { SortableEmit, SortableItem, SortablePropItem } from '@/components/sortable/sortableActions'\nimport {\n CHOSEN_CLASS,\n DRAG_CLASS,\n GHOST_CLASS,\n GROUP_CLASS,\n HANDLE_CLASS,\n useSortableActions,\n} from '@/components/sortable/sortableActions'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { cloneDeep, isUndefined } from '@/utils/common'\nimport { WIDGET_HTML_ID_PREFIX } from '@/components/sortable/sortableUtils'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: SortablePropItem[] | any\n dirty?: Set<DocId | IntegerId>\n keyField?: string\n disableDraggable?: boolean\n rootClassName?: string\n widgetIdentifierId?: string | undefined\n disableDefaultSort?: boolean\n updatePosition?: boolean\n positionField?: string\n positionMultiplier?: number\n showAddAfterButton?: boolean\n showAddLastButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n addLastButtonT?: string\n chips?: boolean\n chipSize?: string\n disableDeleteDialog?: boolean\n }>(),\n {\n dirty: () => new Set<DocId | IntegerId>(),\n keyField: 'position',\n disableDraggable: false,\n rootClassName: 'a-sortable-widget',\n widgetIdentifierId: undefined,\n disableDefaultSort: false,\n updatePosition: false,\n positionField: 'position',\n positionMultiplier: 1,\n showAddAfterButton: false,\n showAddLastButton: false,\n showDeleteButton: false,\n showEditButton: false,\n addLastButtonT: 'common.sortable.addNewAtEnd',\n chips: false,\n chipSize: 'small',\n disableDeleteDialog: false,\n }\n)\nconst emit = defineEmits<SortableEmit>()\n\nconst model = toRef(() => props.modelValue)\n\nconst { t } = useI18n()\n\nconst onAddAfterClick = (data: SortableItem) => {\n emit('onAddAfter', data)\n}\n\nconst onDeleteClick = (data: SortableItem) => {\n itemToRemove.value = data\n if (props.disableDeleteDialog) {\n onRemoveDialogConfirm()\n return\n }\n removeDialog.value = true\n}\n\nconst onEditClick = (data: SortableItem) => {\n emit('onEdit', data)\n}\n\nconst onAddLastClick = () => {\n if (props.modelValue.length > 0) {\n emit('onAddLast', cloneDeep(props.modelValue[props.modelValue.length - 1]))\n return\n }\n emit('onAddLast', null)\n}\n\nconst widgetHtmlId = computed(() => {\n return isUndefined(props.widgetIdentifierId) ? WIDGET_HTML_ID_PREFIX + randomUuid.value : props.widgetIdentifierId\n})\n\nconst rootClassNameComputed = computed(() => {\n return props.rootClassName + ' ' + (props.chips ? props.rootClassName + '--chips' : '')\n})\n\nconst initSortable = () => {\n if (props.disableDraggable) return\n if (!widgetEl.value) return\n const nestedSortable = widgetEl.value.querySelector<HTMLElement>('.' + GROUP_CLASS)\n if (!nestedSortable) return\n sortableInstance.value = useSortable(nestedSortable, [], {\n handle: '.' + HANDLE_CLASS,\n ghostClass: GHOST_CLASS,\n dragClass: DRAG_CLASS,\n chosenClass: CHOSEN_CLASS,\n onEnd: async (event: SortableEvent) => {\n if (props.disableDefaultSort || isUndefined(event.oldIndex) || isUndefined(event.newIndex)) return\n const needsRefresh = moveArrayElement(event.oldIndex, event.newIndex)\n emit('onEnd', needsRefresh)\n },\n onStart() {\n emit('onStart')\n },\n })\n}\n\nconst {\n items,\n forceRerender,\n dirtyLocal,\n moveArrayElement,\n itemToRemove,\n removeDialog,\n destroy,\n refresh,\n onRemoveDialogConfirm,\n sortableInstance,\n widgetEl,\n randomUuid,\n addAfterId,\n removeById,\n updateData,\n addAfterIndex,\n removeByIndex,\n updateDataAtIndex,\n} = useSortableActions(model, initSortable, props, emit)\n\nonBeforeUnmount(() => {\n destroy()\n})\n\nnextTick(() => {\n widgetEl.value = document.querySelector('#' + widgetHtmlId.value)\n initSortable()\n})\n\nwatch(\n () => props.disableDraggable,\n async (newValue) => {\n destroy()\n if (newValue === false) initSortable()\n }\n)\n\nwatch(\n () => props.dirty,\n (newValue) => {\n dirtyLocal.value = newValue\n }\n)\n\ndefineExpose({\n refresh,\n addAfterId,\n addAfterIndex,\n removeById,\n removeByIndex,\n updateData,\n updateDataAtIndex,\n})\n</script>\n\n<template>\n <div>\n <div\n :id=\"widgetHtmlId\"\n :class=\"rootClassNameComputed\"\n >\n <div\n :key=\"forceRerender\"\n :class=\"GROUP_CLASS\"\n >\n <template\n v-for=\"item of items\"\n :key=\"item.key\"\n >\n <VChip\n v-if=\"chips\"\n :size=\"chipSize\"\n class=\"mr-1\"\n :prepend-icon=\"disableDraggable ? undefined : 'mdi-drag'\"\n :append-icon=\"showDeleteButton ? 'mdi-drag': undefined\"\n @click:close=\"onDeleteClick(item)\"\n >\n <template\n v-if=\"!disableDraggable\"\n #prepend\n >\n <VIcon\n :class=\"{\n [HANDLE_CLASS]: true,\n [HANDLE_CLASS + '--disabled']: disableDraggable,\n }\"\n icon=\"mdi-drag\"\n />\n </template>\n <template\n v-if=\"showDeleteButton\"\n #append\n >\n <VIcon\n class=\"ml-2\"\n icon=\"mdi-close-circle\"\n size=\"large\"\n @click.stop=\"onDeleteClick(item)\"\n />\n </template>\n <slot\n name=\"item\"\n :item=\"item\"\n />\n </VChip>\n <div v-else>\n <div class=\"a-sortable-widget__before\">\n <slot\n name=\"itemBefore\"\n :item=\"item\"\n />\n </div>\n <div\n class=\"a-sortable-widget__item\"\n >\n <VIcon\n :class=\"{\n [HANDLE_CLASS]: true,\n [HANDLE_CLASS + '--disabled']: disableDraggable,\n }\"\n icon=\"mdi-drag\"\n />\n <div class=\"a-sortable-widget__content\">\n <slot\n name=\"item\"\n :item=\"item\"\n />\n </div>\n <div class=\"a-sortable-widget__buttons\">\n <VBtn\n v-if=\"showEditButton\"\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n @click.stop=\"onEditClick(item)\"\n >\n <VIcon icon=\"mdi-pencil\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n text=\"Edit\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton\"\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n @click.stop=\"onDeleteClick(item)\"\n >\n <VIcon icon=\"mdi-trash-can-outline\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n text=\"Remove\"\n />\n </VBtn>\n <slot\n name=\"buttons\"\n :item=\"item\"\n />\n <VBtn\n v-if=\"showAddAfterButton\"\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n >\n <VIcon icon=\"mdi-dots-vertical\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n text=\"More options\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem\n v-if=\"showAddAfterButton\"\n @click.stop=\"onAddAfterClick(item)\"\n >\n Add new item after\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n </div>\n <div class=\"a-sortable-widget__after\">\n <slot\n name=\"itemAfter\"\n :item=\"item\"\n />\n </div>\n </div>\n </template>\n </div>\n </div>\n <slot\n name=\"add-last-activator\"\n :props=\"{ onClick: withModifiers(() => onAddLastClick(), ['stop']) }\"\n >\n <VBtn\n v-if=\"showAddLastButton\"\n size=\"small\"\n prepend-icon=\"mdi-plus\"\n class=\"ma-1\"\n @click.stop=\"onAddLastClick\"\n >\n {{ t(addLastButtonT) }}\n </VBtn>\n </slot>\n <VDialog\n v-model=\"removeDialog\"\n :width=\"500\"\n >\n <VCard v-if=\"removeDialog\">\n <ADialogToolbar @on-cancel=\"removeDialog = false\">\n {{ t('common.system.modal.confirmDelete') }}\n </ADialogToolbar>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary @click.stop=\"removeDialog = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary @click.stop=\"onRemoveDialogConfirm\">\n {{ t('common.button.delete') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use 'sass:color';\n\n// todo dark theme colors\n\n$class-name-root: 'a-sortable-widget';\n$bg-color: #fff;\n$border-color: lightgray;\n$border-color-hover: gray;\n$ghost-bg-color: color.scale(#3f6ad8, $lightness: 95%);\n\n.#{$class-name-root} {\n &__item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 6px 0 6px 4px;\n background-color: $bg-color;\n border: 1px solid $border-color;\n border-bottom: none;\n\n &:first-child {\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n }\n\n &:last-child {\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n border-bottom: 1px solid $border-color;\n }\n\n &:hover {\n border-color: $border-color-hover;\n\n .#{$class-name-root}__buttons {\n opacity: 1;\n }\n }\n\n &:hover + & {\n border-top: 1px solid $border-color-hover;\n }\n }\n\n &__content {\n width: 100%;\n }\n\n &__before {\n width: 100%;\n }\n\n &__after {\n width: 100%;\n }\n\n &__handle {\n cursor: move;\n margin: 6px;\n\n &--disabled {\n opacity: 0;\n cursor: default;\n }\n }\n\n &__ghost {\n background-color: $ghost-bg-color;\n }\n\n &__buttons {\n opacity: 0;\n display: flex;\n }\n}\n</style>\n","import { type InjectionKey, nextTick, type Ref, ref } from 'vue'\nimport type { UseSortableReturn } from '@vueuse/integrations/useSortable'\nimport type { SortableItemNewPositions, SortableItemWithParentDataAware } from '@/components/sortable/sortableUtils'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { generateUUIDv1 } from '@/utils/generator'\nimport { cloneDeep, isNull, isUndefined } from '@/utils/common'\nimport type { DocId, IntegerId } from '@/types/common'\n\nexport const NESTED_HANDLE_CLASS = 'a-sortable-nested-widget__handle'\nexport const NESTED_GHOST_CLASS = 'a-sortable-nested-widget__ghost'\nexport const NESTED_DRAG_CLASS = 'a-sortable-nested-widget__drag'\nexport const NESTED_CHOSEN_CLASS = 'a-sortable-nested-widget__chosen'\nexport const NESTED_GROUP_CLASS = 'a-sortable-nested-widget__group'\nexport const SortableLevel: InjectionKey<number> = Symbol.for('anzu:SortableLevel')\n\nexport interface SortableNestedItem<TData extends SortableItemWithParentDataAware = any> {\n data: TData\n children?: Array<SortableNestedItem> | undefined // if undefined, no nested allowed\n meta: {\n dirty: boolean\n }\n}\n\nexport interface SortableNested<TData extends SortableItemWithParentDataAware = any> {\n children: Array<SortableNestedItem<TData>>\n meta: {\n dirty: boolean\n }\n}\n\nexport interface SortableNestedEmit {\n (e: 'update:modelValue', data: SortableNested): void\n\n (e: 'onEnd', data: SortableItemNewPositions): void\n\n (e: 'onAddAfter', data: SortableNestedItem): void\n\n (e: 'onAddChild', data: SortableNestedItem): void\n\n (e: 'onAddLast', data: SortableNestedItem | null): void\n\n (e: 'onEdit', data: SortableNestedItem): void\n\n (e: 'onDelete', data: SortableNestedItem): void\n}\n\nexport function useSortableNestedActions(\n model: Readonly<Ref<SortableNested>>,\n initSortablesCallback: () => void,\n emit: SortableNestedEmit\n): {\n onRemoveDialogConfirm: () => void\n removeById: (id: DocId | IntegerId) => SortableItemNewPositions\n updateData: (\n id: DocId | IntegerId,\n data: any,\n children: Array<SortableNestedItem> | undefined | null,\n position: number | null,\n dirty?: boolean | null,\n parent?: DocId | IntegerId | null | undefined\n ) => void\n refresh: () => void\n destroy: () => void\n removeDialog: Ref<boolean>\n sortableInstances: Ref<Array<UseSortableReturn>>\n addChildToId: (targetId: DocId | IntegerId, data: any, childrenAllowed: boolean) => void\n addAfterId: (targetId: DocId | IntegerId | null, data: any, childrenAllowed: boolean) => SortableItemNewPositions\n forceRerender: Ref<number>\n dragging: Ref<boolean>\n widgetEl: Ref<HTMLElement | null>\n itemToRemove: Ref<SortableNestedItem | null>\n randomUuid: Ref<string>\n moveArrayElement: (\n currentId: DocId | IntegerId,\n targetId: DocId | IntegerId | null,\n newIndex: number,\n oldIndex: number,\n maxDepth: number\n ) => SortableItemNewPositions\n} {\n const { showWarningT } = useAlerts()\n\n const sortableInstances = ref<Array<UseSortableReturn>>([])\n const forceRerender = ref(0)\n const removeDialog = ref(false)\n const itemToRemove = ref<null | SortableNestedItem>(null)\n const dragging = ref(false)\n const widgetEl = ref<HTMLElement | null>(null)\n const randomUuid = ref<string>(generateUUIDv1())\n\n const forceRerenderWidgetHtml = (emitData: SortableNested | undefined = undefined) => {\n forceRerender.value++\n if (!isUndefined(emitData)) {\n emit('update:modelValue', emitData)\n }\n nextTick(() => {\n initSortablesCallback()\n })\n }\n\n const refresh = () => {\n destroy()\n initSortablesCallback()\n }\n\n const onRemoveDialogConfirm = () => {\n if (isNull(itemToRemove.value)) return\n emit('onDelete', itemToRemove.value)\n removeDialog.value = false\n }\n\n const destroy = () => {\n if (!widgetEl.value) return\n sortableInstances.value.forEach((item) => {\n item.stop()\n })\n sortableInstances.value = []\n }\n\n const touchDirty = (item: SortableNestedItem, nestedData: SortableNested) => {\n item.meta.dirty = true\n nestedData.meta.dirty = true\n }\n\n const updatePositionsSameParent = (\n items: SortableNestedItem[],\n oldIndex: number,\n newIndex: number,\n clonedData: SortableNested,\n updatedPositions: SortableItemNewPositions = []\n ) => {\n const start = oldIndex > newIndex ? newIndex : oldIndex\n let position = start + 1\n for (let i = start; i < items.length; i++) {\n if (items[i].data.position !== position) {\n items[i].data.position = position\n touchDirty(items[i], clonedData)\n updatedPositions.push({\n id: items[i].data.id,\n position: items[i].data.position,\n })\n }\n position++\n }\n }\n const updatePositionsDifferentParent = (\n itemsTarget: SortableNestedItem[],\n itemsSource: SortableNestedItem[],\n indexTarget: number,\n indexSource: number,\n clonedData: SortableNested,\n updatedPositions: SortableItemNewPositions = []\n ) => {\n if (itemsTarget.length > 0) {\n let position = indexTarget + 1\n for (let i = indexTarget; i < itemsTarget.length; i++) {\n if (itemsTarget[i].data.position !== position) {\n itemsTarget[i].data.position = position\n touchDirty(itemsTarget[i], clonedData)\n updatedPositions.push({\n id: itemsTarget[i].data.id,\n position: itemsTarget[i].data.position,\n })\n }\n position++\n }\n }\n if (itemsSource.length > 0) {\n let position = indexSource + 1\n for (let i = indexSource; i < itemsSource.length; i++) {\n if (itemsSource[i].data.position !== position) {\n itemsSource[i].data.position = position\n touchDirty(itemsSource[i], clonedData)\n updatedPositions.push({\n id: itemsSource[i].data.id,\n position: itemsSource[i].data.position,\n })\n }\n position++\n }\n }\n }\n\n const calculateParentDepth = (\n parent: DocId | IntegerId | null,\n items: Array<SortableNestedItem>,\n depth: number = 0\n ): number => {\n if (parent === null) return depth\n const parentItem = items.find((item) => item.data.id === parent)\n if (!parentItem) return depth\n depth++\n return calculateParentDepth(parentItem.data.parent, items, depth)\n }\n\n const calculateChildDepth = (children: Array<SortableNestedItem> | undefined, depth: number = 0): number => {\n let childDepth = depth\n if (children && children.length) {\n depth++\n for (const child of children) {\n const currentDepth = calculateChildDepth(child.children, depth)\n childDepth = Math.max(childDepth, currentDepth)\n }\n }\n return childDepth\n }\n\n /**\n * @return number - Max depth of array, root = 1\n */\n const calculateNodeMaxDepth = (\n item: SortableNestedItem,\n items: Array<SortableNestedItem>,\n depth: number = 1\n ): number => {\n const parentDepth = calculateParentDepth(item.data.parent, items)\n const childDepth = calculateChildDepth(item.children, depth)\n return parentDepth + childDepth\n }\n\n const findItemById = (\n id: DocId | IntegerId,\n arr: SortableNestedItem[],\n parent: SortableNestedItem | null = null\n ): { itemFound: SortableNestedItem | null; parentItem: SortableNestedItem | null } => {\n for (const item of arr) {\n if (item.data.id === id) {\n return {\n itemFound: item,\n parentItem: parent,\n }\n }\n if (item.children) {\n const foundInChildren = findItemById(id, item.children, item)\n if (foundInChildren.itemFound !== null) {\n return foundInChildren\n }\n }\n }\n\n return {\n itemFound: null,\n parentItem: null,\n }\n }\n\n // todo refactor\n const moveArrayElement = (\n currentId: DocId | IntegerId,\n targetId: DocId | IntegerId | null,\n newIndex: number,\n oldIndex: number,\n maxDepth: number\n ): SortableItemNewPositions => {\n const clonedData: SortableNested = cloneDeep(model.value)\n\n const { itemFound: itemToMove, parentItem: itemToMoveParentItem } = findItemById(currentId, clonedData.children)\n\n if (!itemToMove) {\n console.error('ASortableNested error.')\n return []\n }\n\n const returnData: SortableItemNewPositions = []\n\n // moving to root\n if (targetId === null) {\n if (isNull(itemToMoveParentItem) && newIndex === oldIndex) {\n // moving item from root to root, but same place, skip\n return []\n }\n if (isNull(itemToMoveParentItem)) {\n // moving item from root to root\n const idx = clonedData.children.indexOf(itemToMove)\n if (idx !== -1) {\n const element = clonedData.children.splice(idx, 1)[0]\n clonedData.children.splice(newIndex, 0, element)\n updatePositionsSameParent(clonedData.children, idx, newIndex, clonedData, returnData)\n forceRerenderWidgetHtml(clonedData)\n return []\n }\n console.error('ASortableNested error.')\n return []\n }\n if (!isNull(itemToMoveParentItem) && itemToMoveParentItem.children) {\n // moving from non-root to root\n const idx = itemToMoveParentItem.children.indexOf(itemToMove)\n if (idx !== -1) {\n itemToMove.data.parent = null\n const element = itemToMoveParentItem.children.splice(idx, 1)[0]\n clonedData.children.splice(newIndex, 0, element)\n updatePositionsDifferentParent(\n clonedData.children,\n itemToMoveParentItem.children,\n newIndex,\n idx,\n clonedData,\n returnData\n )\n forceRerenderWidgetHtml(clonedData)\n return []\n }\n console.error('ASortableNested error.')\n return []\n }\n console.error('ASortableNested error.')\n return []\n }\n // moving to specific array element\n const { itemFound: targetItem } = findItemById(targetId, clonedData.children)\n\n if (!targetItem || !targetItem.children) {\n // moving item to undefined children is not allowed by this implementation but allowed by sortablejs\n // so rerender is needed\n forceRerenderWidgetHtml()\n return []\n }\n\n if (!isNull(itemToMoveParentItem) && itemToMoveParentItem.data.id === targetItem.data.id && newIndex === oldIndex) {\n // moving item from/to same parent and same position, skip\n return []\n }\n\n if (itemToMoveParentItem && itemToMoveParentItem.children && targetItem.data.id === itemToMoveParentItem.data.id) {\n // moving item inside same parent\n const idx = itemToMoveParentItem.children.indexOf(itemToMove)\n if (idx !== -1) {\n const element = itemToMoveParentItem.children.splice(idx, 1)[0]\n targetItem.children.splice(newIndex, 0, element)\n updatePositionsSameParent(targetItem.children, idx, newIndex, clonedData, returnData)\n }\n } else if (\n itemToMoveParentItem &&\n itemToMoveParentItem.children &&\n targetItem.data.id !== itemToMoveParentItem.data.id\n ) {\n // moving item between two different parents\n const idx = itemToMoveParentItem.children.indexOf(itemToMove)\n if (idx !== -1) {\n itemToMove.data.parent = targetItem.data.id\n const element = itemToMoveParentItem.children.splice(idx, 1)[0]\n targetItem.children.splice(newIndex, 0, element)\n updatePositionsDifferentParent(\n targetItem.children,\n itemToMoveParentItem.children,\n newIndex,\n idx,\n clonedData,\n returnData\n )\n }\n } else {\n // moving from root to non-root\n const idx = clonedData.children.indexOf(itemToMove)\n if (idx !== -1) {\n itemToMove.data.parent = targetItem.data.id\n const element = clonedData.children.splice(idx, 1)[0]\n targetItem.children.splice(newIndex, 0, element)\n updatePositionsDifferentParent(targetItem.children, clonedData.children, newIndex, idx, clonedData, returnData)\n }\n }\n\n if (calculateNodeMaxDepth(targetItem, clonedData.children) > maxDepth) {\n showWarningT('common.sortable.error.maxDeepExceed')\n forceRerenderWidgetHtml()\n return []\n }\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n\n const removeById = (id: DocId | IntegerId): SortableItemNewPositions => {\n const clonedData: SortableNested = cloneDeep(model.value)\n const { itemFound, parentItem } = findItemById(id, clonedData.children)\n if (!itemFound) {\n return []\n }\n\n const returnData: SortableItemNewPositions = []\n\n if (parentItem && parentItem.children) {\n const idx = parentItem.children.indexOf(itemFound)\n if (idx !== -1) {\n parentItem.children.splice(idx, 1)\n updatePositionsSameParent(parentItem.children, idx, idx, clonedData, returnData)\n }\n } else {\n const idx = clonedData.children.indexOf(itemFound)\n if (idx !== -1) {\n clonedData.children.splice(idx, 1)\n updatePositionsSameParent(clonedData.children, idx, idx, clonedData, returnData)\n }\n }\n\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n\n /**\n * @param id - id of item\n * @param data - item data\n * @param children - item children, use null to skip update and keep original data\n * @param position - item position, use null to skip update and keep original data\n * @param dirty - item dirty, use null to skip update and keep original data\n * @param parent - item parent id, use undefined to skip update and keep original data\n */\n const updateData = (\n id: DocId | IntegerId,\n data: any,\n children: Array<SortableNestedItem> | undefined | null = null,\n position: number | null = null,\n dirty: null | boolean = null,\n parent: DocId | IntegerId | null | undefined = undefined\n ) => {\n const clonedData: SortableNested = cloneDeep(model.value)\n\n const { itemFound } = findItemById(id, clonedData.children)\n if (!itemFound) {\n return\n }\n itemFound.data = cloneDeep(data)\n if (!isNull(children)) itemFound.children = children\n if (!isNull(position)) itemFound.data.position = position\n if (!isNull(dirty)) itemFound.meta.dirty = dirty\n if (!isNull(dirty) && dirty === true) clonedData.meta.dirty = true\n if (!isUndefined(parent)) itemFound.data.parent = parent\n forceRerenderWidgetHtml(clonedData)\n }\n\n /**\n * @template targetId null value is when push as last item\n */\n const addAfterId = (\n targetId: DocId | IntegerId | null,\n data: any,\n childrenAllowed: boolean\n ): SortableItemNewPositions => {\n const clonedData: SortableNested = cloneDeep(model.value)\n\n const insertData: SortableNestedItem = {\n data: cloneDeep(data),\n children: childrenAllowed ? [] : undefined,\n meta: {\n dirty: false,\n },\n }\n\n if (isNull(targetId)) {\n clonedData.children.push(insertData)\n forceRerenderWidgetHtml(clonedData)\n return []\n }\n\n const { itemFound: targetItem, parentItem: targetItemParentItem } = findItemById(targetId, clonedData.children)\n\n if (!targetItem) {\n showWarningT('common.sortable.error.unableToAdd')\n return []\n }\n insertData.data.position = targetItem.data.position + 1\n insertData.data.parent = targetItem.data.parent\n\n const returnData: SortableItemNewPositions = []\n\n if (!isNull(targetItemParentItem) && targetItemParentItem.children) {\n const idx = targetItemParentItem.children.indexOf(targetItem) + 1\n if (idx !== -1) {\n targetItemParentItem.children.splice(idx, 0, insertData)\n updatePositionsSameParent(targetItemParentItem.children, idx, idx, clonedData, returnData)\n }\n } else {\n // insert to root\n const idx = clonedData.children.indexOf(targetItem) + 1\n if (idx !== -1) {\n clonedData.children.splice(idx, 0, insertData)\n updatePositionsSameParent(clonedData.children, idx, idx, clonedData, returnData)\n }\n }\n\n forceRerenderWidgetHtml(clonedData)\n return returnData\n }\n\n const addChildToId = (targetId: DocId | IntegerId, data: any, childrenAllowed: boolean) => {\n const clonedData: SortableNested = cloneDeep(model.value)\n\n const { itemFound: targetItem } = findItemById(targetId, clonedData.children)\n\n if (!targetItem) {\n showWarningT('common.sortable.error.unableToAdd')\n return\n }\n const insertData: SortableNestedItem = {\n data: cloneDeep(data),\n children: childrenAllowed ? [] : undefined,\n meta: {\n dirty: false,\n },\n }\n insertData.data.id = data.id\n insertData.data.position =\n targetItem.children && targetItem.children.length > 0 ? targetItem.children.length + 1 : 1\n insertData.data.parent = targetItem.data.id\n\n if (!isUndefined(targetItem.children) && targetItem.children.length === 0) {\n targetItem.children.push(insertData)\n forceRerenderWidgetHtml(clonedData)\n }\n }\n\n return {\n dragging,\n widgetEl,\n randomUuid,\n removeDialog,\n itemToRemove,\n sortableInstances,\n forceRerender,\n refresh,\n onRemoveDialogConfirm,\n destroy,\n moveArrayElement,\n addAfterId,\n addChildToId,\n removeById,\n updateData,\n }\n}\n","<script setup lang=\"ts\">\nimport { inject, provide } from 'vue'\nimport { computed } from 'vue'\nimport type { SortableNestedItem } from '@/components/sortable/sortableNestedActions'\nimport { cloneDeep, isUndefined } from '@/utils/common'\nimport { NESTED_HANDLE_CLASS, SortableLevel } from '@/components/sortable/sortableNestedActions'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n item: SortableNestedItem | any\n disableDraggable: boolean\n maxDepth: number\n showAddAfterButton: boolean\n showAddChildButton: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n }>(),\n {}\n)\nconst emit = defineEmits<{\n (e: 'onAddAfter', item: SortableNestedItem): void\n (e: 'onAddChild', item: SortableNestedItem): void\n (e: 'onDelete', item: SortableNestedItem): void\n (e: 'onEdit', item: SortableNestedItem): void\n}>()\n\nconst onDeleteClick = (item: SortableNestedItem | MouseEvent | KeyboardEvent) => {\n if ('data' in item) {\n emit('onDelete', item)\n return\n }\n emit('onDelete', cloneDeep(props.item))\n}\n\nconst onEditClick = (item: SortableNestedItem | MouseEvent | KeyboardEvent) => {\n if ('data' in item) {\n emit('onEdit', item)\n return\n }\n emit('onEdit', cloneDeep(props.item))\n}\n\nconst onAddAfterClick = (item: SortableNestedItem | MouseEvent | KeyboardEvent) => {\n if ('data' in item) {\n emit('onAddAfter', item)\n return\n }\n emit('onAddAfter', cloneDeep(props.item))\n}\n\nconst onAddChildClick = (item: SortableNestedItem | MouseEvent | KeyboardEvent) => {\n if ('data' in item) {\n emit('onAddChild', item)\n return\n }\n emit('onAddChild', cloneDeep(props.item))\n}\n\nconst level = inject<number>(SortableLevel, 1)\nprovide<number>(SortableLevel, level + 1)\n\nconst showAddChildButtonComputed = computed(() => {\n return (\n props.showAddChildButton &&\n !isUndefined(props.item.children) &&\n props.item.children.length === 0 &&\n level < props.maxDepth\n )\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n class=\"a-sortable-nested-widget__container\"\n :class=\"'a-sortable-nested-widget__container--level-' + level\"\n :data-id=\"item.data.id\"\n >\n <div class=\"a-sortable-nested-widget__nested\">\n <div class=\"a-sortable-nested-widget__item\">\n <VIcon\n :class=\"{\n [NESTED_HANDLE_CLASS]: true,\n [NESTED_HANDLE_CLASS + '--disabled']: disableDraggable,\n }\"\n icon=\"mdi-drag\"\n />\n <div class=\"a-sortable-nested-widget__content\">\n <slot\n name=\"item\"\n :item=\"item\"\n />\n </div>\n <div class=\"a-sortable-nested-widget__buttons\">\n <VBtn\n v-if=\"showEditButton\"\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n @click.stop=\"onEditClick\"\n >\n <VIcon icon=\"mdi-pencil\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton\"\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n @click.stop=\"onDeleteClick\"\n >\n <VIcon icon=\"mdi-trash-can-outline\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.sortable.remove')\"\n />\n </VBtn>\n <slot\n name=\"buttons\"\n :item=\"item\"\n />\n <VBtn\n v-if=\"showAddAfterButton || showAddChildButtonComputed\"\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n >\n <VIcon icon=\"mdi-dots-vertical\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem\n v-if=\"showAddAfterButton\"\n @click.stop=\"onAddAfterClick\"\n >\n {{ t('common.sortable.addAfter') }}\n </VListItem>\n <VListItem\n v-if=\"showAddChildButtonComputed\"\n @click.stop=\"onAddChildClick\"\n >\n {{ t('common.sortable.addChild') }}\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n </div>\n <div\n v-if=\"level < maxDepth && !isUndefined(item.children)\"\n class=\"a-sortable-nested-widget__group\"\n :class=\"{ 'a-sortable-nested-widget__group--empty': item.children.length === 0 }\"\n :data-id=\"item.data.id\"\n >\n <ASortableNestedItem\n v-for=\"child of item.children\"\n :key=\"child.data.id\"\n :item=\"child\"\n :disable-draggable=\"disableDraggable\"\n :max-depth=\"maxDepth\"\n :show-add-after-button=\"showAddAfterButton\"\n :show-add-child-button=\"showAddChildButton\"\n :show-delete-button=\"showDeleteButton\"\n :show-edit-button=\"showEditButton\"\n @on-add-after=\"onAddAfterClick\"\n @on-add-child=\"onAddChildClick\"\n @on-delete=\"onDeleteClick\"\n @on-edit=\"onEditClick\"\n >\n <!-- @vue-ignore -->\n <template #item=\"{ item: itemSlot }\">\n <slot\n name=\"item\"\n :item=\"itemSlot as any\"\n />\n </template>\n <!-- @vue-ignore -->\n <template #buttons=\"{ item: buttonSlot }\">\n <slot\n name=\"buttons\"\n :item=\"buttonSlot as any\"\n />\n </template>\n </ASortableNestedItem>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { SortableEvent } from 'sortablejs'\nimport { computed, nextTick, onBeforeUnmount, toRef, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type {\n SortableNested,\n SortableNestedEmit,\n SortableNestedItem,\n} from '@/components/sortable/sortableNestedActions'\nimport { cloneDeep, isNull, isUndefined } from '@/utils/common'\nimport { WIDGET_HTML_ID_PREFIX } from '@/components/sortable/sortableUtils'\nimport {\n NESTED_CHOSEN_CLASS,\n NESTED_DRAG_CLASS,\n NESTED_GHOST_CLASS,\n NESTED_GROUP_CLASS,\n NESTED_HANDLE_CLASS,\n useSortableNestedActions,\n} from '@/components/sortable/sortableNestedActions'\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport { stringToInt } from '@/utils/string'\nimport ASortableNestedItem from '@/components/sortable/ASortableNestedItem.vue'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: SortableNested\n maxDepth: number\n disableDraggable?: boolean\n rootClassName?: string\n widgetIdentifierId?: string | undefined\n disableDefaultSort?: boolean\n showAddAfterButton?: boolean\n showAddLastButton?: boolean\n showAddChildButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n }>(),\n {\n disableDraggable: false,\n rootClassName: 'a-sortable-nested-widget',\n widgetIdentifierId: undefined,\n disableDefaultSort: false,\n showAddAfterButton: false,\n showAddLastButton: false,\n showAddChildButton: false,\n showDeleteButton: false,\n showEditButton: false,\n }\n)\nconst emit = defineEmits<SortableNestedEmit>()\n\nconst model = toRef(() => props.modelValue)\n\nconst onAddAfterClick = (data: SortableNestedItem) => {\n emit('onAddAfter', data)\n}\n\nconst onAddChildClick = (data: SortableNestedItem) => {\n emit('onAddChild', data)\n}\n\nconst onDeleteClick = (data: SortableNestedItem) => {\n itemToRemove.value = data\n removeDialog.value = true\n}\n\nconst onEditClick = (data: SortableNestedItem) => {\n emit('onEdit', data)\n}\n\nconst onAddLastClick = () => {\n if (props.modelValue.children.length > 0) {\n emit('onAddLast', cloneDeep(props.modelValue.children[props.modelValue.children.length - 1]))\n return\n }\n emit('onAddLast', null)\n}\n\nconst { t } = useI18n()\n\nconst widgetHtmlId = computed(() => {\n return isUndefined(props.widgetIdentifierId) ? WIDGET_HTML_ID_PREFIX + randomUuid.value : props.widgetIdentifierId\n})\n\nconst widgetClass = computed(() => {\n return props.rootClassName + ' ' + (dragging.value ? props.rootClassName + '--dragging' : '')\n})\n\nconst initSortables = () => {\n if (props.disableDraggable) return\n if (!widgetEl.value) return\n const nestedSortables = Array.from(widgetEl.value.querySelectorAll<HTMLElement>('.' + NESTED_GROUP_CLASS))\n sortableInstances.value = []\n for (let i = 0; i < nestedSortables.length; i++) {\n sortableInstances.value[i] = useSortable(nestedSortables[i], [], {\n group: {\n name: 'nested',\n pull: true,\n put: true,\n },\n handle: '.' + NESTED_HANDLE_CLASS,\n ghostClass: NESTED_GHOST_CLASS,\n dragClass: NESTED_DRAG_CLASS,\n chosenClass: NESTED_CHOSEN_CLASS,\n fallbackOnBody: true,\n swapThreshold: 0.65,\n forceFallback: true,\n fallbackTolerance: 3,\n onUpdate: () => {},\n onStart: () => {\n dragging.value = true\n },\n onEnd: (event: SortableEvent) => {\n dragging.value = false\n nextTick(() => {\n const id = stringToInt(event.item.getAttribute('data-id') ?? '0')\n if (id < 1) return\n const newIndex = event.newIndex\n if (isUndefined(newIndex)) return\n const oldIndex = event.oldIndex\n if (isUndefined(oldIndex)) return\n let parentId: number | null = null\n const parentEl = event.item.parentElement\n if (!isNull(parentEl)) {\n parentId = stringToInt(parentEl.getAttribute('data-id') ?? '0')\n if (parentId === 0) parentId = null\n }\n const needsRefresh = moveArrayElement(id, parentId, newIndex, oldIndex, props.maxDepth)\n emit('onEnd', needsRefresh)\n })\n },\n })\n }\n}\n\nconst {\n dragging,\n widgetEl,\n randomUuid,\n removeDialog,\n itemToRemove,\n forceRerender,\n moveArrayElement,\n addAfterId,\n addChildToId,\n removeById,\n updateData,\n destroy,\n refresh,\n onRemoveDialogConfirm,\n sortableInstances,\n} = useSortableNestedActions(model, initSortables, emit)\n\nonBeforeUnmount(() => {\n destroy()\n})\n\nnextTick(() => {\n widgetEl.value = document.querySelector('#' + widgetHtmlId.value)\n initSortables()\n})\n\nwatch(\n () => props.disableDraggable,\n async (newValue) => {\n destroy()\n if (newValue === false) initSortables()\n }\n)\n\ndefineExpose({\n refresh,\n addAfterId,\n addChildToId,\n removeById,\n updateData,\n})\n</script>\n\n<template>\n <div>\n <div\n :id=\"widgetHtmlId\"\n :class=\"widgetClass\"\n >\n <div\n :key=\"forceRerender\"\n :class=\"NESTED_GROUP_CLASS\"\n >\n <ASortableNestedItem\n v-for=\"item of modelValue.children\"\n :key=\"item.data.id\"\n :item=\"item\"\n :disable-draggable=\"disableDraggable\"\n :max-depth=\"maxDepth\"\n :show-add-after-button=\"showAddAfterButton\"\n :show-add-child-button=\"showAddChildButton\"\n :show-delete-button=\"showDeleteButton\"\n :show-edit-button=\"showEditButton\"\n @on-add-after=\"onAddAfterClick\"\n @on-add-child=\"onAddChildClick\"\n @on-delete=\"onDeleteClick\"\n @on-edit=\"onEditClick\"\n >\n <template #item=\"{ item: itemSlot }\">\n <slot\n name=\"item\"\n :item=\"itemSlot\"\n />\n </template>\n <template #buttons=\"{ item: buttonsSlot }\">\n <slot\n name=\"buttons\"\n :item=\"buttonsSlot\"\n />\n </template>\n </ASortableNestedItem>\n </div>\n </div>\n <VBtn\n v-if=\"showAddLastButton\"\n size=\"small\"\n prepend-icon=\"mdi-plus\"\n @click.stop=\"onAddLastClick\"\n >\n {{ t('common.sortable.addNewAtEnd') }}\n </VBtn>\n <VDialog\n v-model=\"removeDialog\"\n :width=\"500\"\n >\n <VCard v-if=\"removeDialog\">\n <ADialogToolbar @on-cancel=\"removeDialog = false\">\n {{ t('common.system.modal.confirmDelete') }}\n </ADialogToolbar>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary @click.stop=\"removeDialog = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary @click.stop=\"onRemoveDialogConfirm\">\n {{ t('common.button.delete') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use 'sass:color';\n\n// todo dark theme colors\n\n$class-name-root: 'a-sortable-nested-widget';\n$bg-color: #fff;\n$border-color: lightgray;\n$border-color-hover: gray;\n$ghost-bg-color: color.scale(#3f6ad8, $lightness: 95%);\n$item-space: 10px;\n$ident: 40px;\n\n.#{$class-name-root} {\n &__container {\n position: relative;\n background-color: $bg-color;\n margin-left: ($ident + $item-space);\n\n &::before {\n content: '';\n position: absolute;\n top: -($item-space);\n left: -($ident);\n border-left: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n width: $ident;\n height: ($ident + $item-space);\n }\n\n &::after {\n position: absolute;\n content: '';\n top: ($ident - 1px);\n left: -($ident);\n border-left: 1px solid $border-color;\n border-top: 1px solid $border-color;\n width: $ident;\n height: 100%;\n }\n\n &:last-child::after {\n display: none;\n }\n\n &--level-2 {\n .#{$class-name-root}__item {\n background-color: color.scale($bg-color, $lightness: -4%);\n }\n }\n\n &--level-3 {\n .#{$class-name-root}__item {\n background-color: color.scale($bg-color, $lightness: -8%);\n }\n }\n\n &--level-4 {\n .#{$class-name-root}__item {\n background-color: color.scale($bg-color, $lightness: -12%);\n }\n }\n\n &--level-5 {\n .#{$class-name-root}__item {\n background-color: color.scale($bg-color, $lightness: -16%);\n }\n }\n }\n\n > .#{$class-name-root}__group > .#{$class-name-root}__container:first-child:before {\n border-bottom: none;\n }\n\n &__item {\n width: 100%;\n display: flex;\n border: 1px solid $border-color;\n align-items: center;\n justify-content: space-between;\n padding: 6px 10px;\n border-radius: 5px;\n margin-bottom: 10px;\n\n &:hover {\n border-color: $border-color-hover;\n\n .#{$class-name-root}__buttons {\n opacity: 1;\n }\n }\n\n &:hover + div {\n div {\n border-color: $border-color-hover;\n\n &::after,\n &::before {\n border-color: $border-color-hover;\n }\n }\n }\n }\n\n &__content {\n width: 100%;\n }\n\n &__nested {\n width: 100%;\n }\n\n &__handle {\n cursor: move;\n margin-right: 6px;\n\n &--disabled {\n opacity: 0;\n cursor: default;\n }\n }\n\n &__ghost {\n .#{$class-name-root}__item {\n background-color: $ghost-bg-color !important;\n }\n }\n\n &__buttons {\n opacity: 0;\n display: flex;\n }\n\n &--dragging {\n .#{$class-name-root}__group--empty {\n padding-bottom: 20px;\n }\n }\n\n &__chosen {\n .#{$class-name-root}__container {\n margin-left: 0;\n }\n }\n\n &__drag {\n &::before,\n &::after {\n opacity: 0;\n }\n }\n}\n</style>\n","<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport type { Pagination } from '@/types/Pagination'\nimport ADatatablePagination from '@/components/ADatatablePagination.vue'\nimport type { Fn } from '@vueuse/core'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n submitFilter: Fn\n resetFilter: Fn\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'onOpen'): void\n (e: 'onPageChange'): void\n (e: 'onConfirm', data: Array<TItem>): void\n (e: 'onFetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst sidebarLeft = ref(true)\nconst filterTouched = ref(false)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('onOpen')\n sidebarLeft.value = true\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'onConfirm',\n props.selectedItems.map((item) => toRaw(item))\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('onFetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('onPageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\nconst hasNextPage = computed(() => {\n return !(\n (isNull(paginationComputed.value.hasNextPage) && paginationComputed.value.page === lastPage.value) ||\n paginationComputed.value.hasNextPage === false\n )\n})\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && hasNextPage.value && !props.loading) {\n fetchNextPage()\n }\n}\n\ndefineExpose({\n open: onOpen,\n})\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-bind=\"$attrs\"\n :model-value=\"dialog\"\n fullscreen\n class=\"subject-select\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <VCard\n v-if=\"dialog\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar system-border-b\"\n @on-cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t(dialogTitleT) }}\n </slot>\n </ADialogToolbar>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"system-border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.subjectSelect.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar system-border-r\">\n <div class=\"subject-select-filter\">\n <div class=\"subject-select-filter__content\">\n <VForm\n name=\"search2\"\n class=\"px-2 pt-4\"\n @submit.prevent=\"submitFilter\"\n >\n <slot name=\"filter\" />\n </VForm>\n </div>\n <div class=\"subject-select-filter__actions\">\n <VBtn\n color=\"primary\"\n class=\"mx-2\"\n :variant=\"filterTouched ? 'flat' : 'text'\"\n size=\"small\"\n @click.stop=\"submitFilter\"\n >\n {{ t('common.button.submitFilter') }}\n </VBtn>\n <VBtn\n class=\"px-2\"\n color=\"light\"\n min-width=\"36px\"\n variant=\"flat\"\n size=\"small\"\n @click.stop=\"resetFilter\"\n >\n <VIcon icon=\"mdi-filter-remove-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.resetFilter') }}\n </VTooltip>\n </VBtn>\n </div>\n </div>\n </div>\n <div class=\"subject-select__content\">\n <slot name=\"content\" />\n <div\n v-if=\"paginationMode === 'more'\"\n class=\"d-flex w-100 align-center justify-center pa-4\"\n >\n <ABtnSecondary\n v-show=\"hasNextPage || loading\"\n v-intersect.quiet=\"autoloadOnIntersect\"\n :loading=\"loading\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n <ADatatablePagination\n v-else\n v-model=\"paginationComputed\"\n @change=\"onPageChange\"\n />\n </div>\n </div>\n <div class=\"subject-select__actions system-border-t\">\n <div v-if=\"props.minCount === props.maxCount\">\n {{ t('common.subjectSelect.texts.pickExactCount', { count: props.minCount, selected: selectedItemsCount }) }}\n </div>\n <div v-else>\n {{\n t('common.subjectSelect.texts.pickRangeCount', {\n minCount: props.minCount,\n maxCount: props.maxCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n</template>\n","import { ref } from 'vue'\n\nconst showAll = ref(false)\n\nexport function useCustomDataForm() {\n const toggleForm = () => {\n showAll.value = !showAll.value\n }\n\n return {\n showAll,\n toggleForm,\n }\n}\n","import { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\nexport const CustomDataFormElementType = {\n String: 'string',\n Integer: 'integer',\n StringArray: 'stringArray',\n StringArrayLegacy: 'string_array', // todo: remove\n Boolean: 'boolean',\n} as const\nexport const CustomDataFormElementTypeDefault = CustomDataFormElementType.String\nexport type CustomDataFormElementTypeType = (typeof CustomDataFormElementType)[keyof typeof CustomDataFormElementType]\n\nexport function useCustomDataFormElementType() {\n const { t } = useI18n()\n const customDataFormElementTypeOptions = ref<ValueObjectOption<CustomDataFormElementTypeType>[]>([\n {\n value: CustomDataFormElementType.String,\n title: t('common.customFormElement.type.string'),\n },\n {\n value: CustomDataFormElementType.Integer,\n title: t('common.customFormElement.type.integer'),\n },\n {\n value: CustomDataFormElementType.StringArray,\n title: t('common.customFormElement.type.C'),\n },\n {\n value: CustomDataFormElementType.StringArrayLegacy,\n title: t('common.customFormElement.type.stringArrayLegacy'),\n },\n {\n value: CustomDataFormElementType.Boolean,\n title: t('common.customFormElement.type.boolean'),\n },\n ])\n\n const getCustomDataFormElementTypeOption = (value: CustomDataFormElementTypeType) => {\n return customDataFormElementTypeOptions.value.find((item) => item.value === value)\n }\n\n return {\n customDataFormElementTypeOptions,\n getCustomDataFormElementTypeOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed } from 'vue'\nimport { isNull } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean | null\n dataCy?: string\n label?: string | undefined\n allT?: string\n trueT?: string\n falseT?: string\n }>(),\n {\n dataCy: 'optional-boolean',\n label: undefined,\n allT: 'common.model.all',\n trueT: 'common.model.boolean.true',\n falseT: 'common.model.boolean.false',\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean | null): void\n}>()\n\nconst value = computed({\n get() {\n if (isNull(props.modelValue)) return -1\n return props.modelValue ? 1 : 0\n },\n set(newValue) {\n let returnValue: null | boolean = null\n if (newValue === 1) returnValue = true\n if (newValue === 0) returnValue = false\n emit('update:modelValue', returnValue )\n },\n})\n\nconst { t } = useI18n()\n\nconst items = computed(() => {\n return [\n { value: -1, title: t(props.allT) },\n { value: 1, title: t(props.trueT) },\n { value: 0, title: t(props.falseT) },\n ]\n})\n</script>\n\n<template>\n <VSelect\n v-model=\"value\"\n :data-cy=\"dataCy\"\n :label=\"label\"\n :items=\"items\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, isProxy, ref, toRaw } from 'vue'\nimport type { ErrorObject } from '@vuelidate/core'\nimport { useVuelidate } from '@vuelidate/core'\nimport type { CustomDataFormElement } from '@/components/customDataForm/CustomDataForm'\nimport type { ValidationScope } from '@/types/Validation'\nimport { CustomDataFormElementType } from '@/components/customDataForm/CustomDataFormElementTypes'\nimport { isEmptyObject } from '@/utils/common'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport ABooleanSelect from '@/components/ABooleanSelect.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n config: CustomDataFormElement\n validationScope?: ValidationScope\n }>(),\n {\n validationScope: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: { property: string; value: any }): void\n (e: 'blur', data: any): void\n}>()\n\nconst fixValue = (value: any) => {\n if (props.config.attributes.type === CustomDataFormElementType.Integer) {\n return parseInt(value)\n }\n return value\n}\n\nconst updateModelValue = (value: any) => {\n emit('update:modelValue', { property: props.config.property, value: fixValue(value) })\n}\n\nconst modelValueComputed = computed(() => {\n const value = isProxy(props.modelValue) ? toRaw(props.modelValue) : props.modelValue\n if (\n (props.config.attributes.type === CustomDataFormElementType.StringArray ||\n props.config.attributes.type === CustomDataFormElementType.StringArrayLegacy) &&\n isEmptyObject(value)\n )\n return []\n return value\n})\n\nconst { maxLength, minLength, requiredIf, minValue, maxValue, stringArrayItemLength } = useValidate()\n\nconst rules = computed(() => {\n const dynamicRules: Record<string, any> = {\n modelValueComputed: {\n required: requiredIf(props.config.attributes.required),\n },\n }\n switch (props.config.attributes.type) {\n case CustomDataFormElementType.String:\n dynamicRules.modelValueComputed.minLength = minLength(\n props.config.attributes.minValue ? props.config.attributes.minValue : 0\n )\n dynamicRules.modelValueComputed.maxLength = maxLength(\n props.config.attributes.maxValue ? props.config.attributes.maxValue : 256\n )\n break\n case CustomDataFormElementType.Integer:\n dynamicRules.modelValueComputed.minValue = minValue(\n props.config.attributes.minValue ? props.config.attributes.minValue : 0\n )\n dynamicRules.modelValueComputed.maxValue = maxValue(\n props.config.attributes.maxValue ? props.config.attributes.maxValue : 9999\n )\n break\n case CustomDataFormElementType.StringArray:\n dynamicRules.modelValueComputed.minLength = minLength(\n props.config.attributes.minCount ? props.config.attributes.minCount : 0\n )\n dynamicRules.modelValueComputed.maxLength = maxLength(\n props.config.attributes.maxCount ? props.config.attributes.maxCount : 32\n )\n dynamicRules.modelValueComputed.stringArrayItemLength = stringArrayItemLength(\n props.config.attributes.minValue ? props.config.attributes.minValue : 0,\n props.config.attributes.maxValue ? props.config.attributes.maxValue : 256\n )\n break\n }\n\n return dynamicRules\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst v$ = useVuelidate(rules, { modelValueComputed }, { $scope: props.validationScope })\n\nconst errorMessageComputed = computed(() => {\n if (v$.value.$errors.length) return [v$.value.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst counter = ref<number | undefined>(undefined)\ncounter.value = props.config.attributes.maxValue ?? undefined\n\nconst onBlur = () => {\n emit('blur', props.modelValue)\n v$.value.$touch()\n}\n</script>\n\n<template>\n <VTextarea\n v-if=\"config.attributes.type === CustomDataFormElementType.String\"\n :model-value=\"modelValue\"\n auto-grow\n :rows=\"1\"\n :label=\"config.name\"\n :error-messages=\"errorMessageComputed\"\n :counter=\"counter\"\n :readonly=\"config.attributes.readonly\"\n :data-cy=\"'custom-field-' + config.property\"\n @update:model-value=\"updateModelValue\"\n @blur=\"onBlur\"\n >\n <template #label>\n {{ config.name\n }}<span\n v-if=\"config.attributes.required\"\n class=\"required\"\n />\n </template>\n </VTextarea>\n <VTextField\n v-else-if=\"config.attributes.type === CustomDataFormElementType.Integer\"\n :model-value=\"modelValueComputed\"\n type=\"number\"\n :label=\"config.name\"\n :error-messages=\"errorMessageComputed\"\n :readonly=\"config.attributes.readonly\"\n :data-cy=\"'custom-field-' + config.property\"\n @update:model-value=\"updateModelValue\"\n @blur=\"onBlur\"\n >\n <template #label>\n {{ config.name\n }}<span\n v-if=\"config.attributes.required\"\n class=\"required\"\n />\n </template>\n </VTextField>\n <VCombobox\n v-else-if=\"\n config.attributes.type === CustomDataFormElementType.StringArray ||\n config.attributes.type === CustomDataFormElementType.StringArrayLegacy\n \"\n :model-value=\"modelValueComputed\"\n :label=\"config.name\"\n multiple\n chips\n :readonly=\"config.attributes.readonly\"\n :error-messages=\"errorMessageComputed\"\n :data-cy=\"'custom-field-' + config.property\"\n @update:model-value=\"updateModelValue\"\n @blur=\"onBlur\"\n >\n <template #label>\n {{ config.name\n }}<span\n v-if=\"config.attributes.required\"\n class=\"required\"\n />\n </template>\n </VCombobox>\n <VSwitch\n v-if=\"config.attributes.type === CustomDataFormElementType.Boolean && config.attributes.required === true\"\n :label=\"config.name\"\n :model-value=\"modelValueComputed\"\n :readonly=\"config.attributes.readonly\"\n :data-cy=\"'custom-field-' + config.property\"\n @update:model-value=\"updateModelValue\"\n />\n <ABooleanSelect\n v-if=\"config.attributes.type === CustomDataFormElementType.Boolean && config.attributes.required === false\"\n :model-value=\"modelValueComputed\"\n :label=\"config.name\"\n :data-cy=\"'custom-field-' + config.property\"\n :readonly=\"config.attributes.readonly\"\n @update:model-value=\"updateModelValue\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport useVuelidate from '@vuelidate/core'\nimport type { CustomDataFormElement } from '@/components/customDataForm/CustomDataForm'\nimport type { ValidationScope } from '@/types/Validation'\nimport { useCustomDataForm } from '@/components/customDataForm/useCustomDataForm'\nimport ACustomFormElement from '@/components/customDataForm/ACustomDataFormElement.vue'\nimport ARow from '@/components/ARow.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: { [key: string]: any }\n elements: CustomDataFormElement[]\n validationScope?: ValidationScope\n pinnedCount?: number\n readonly?: boolean\n }>(),\n {\n validationScope: undefined,\n pinnedCount: 1000,\n readonly: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'anyChange'): void\n}>()\n\nconst { t } = useI18n()\n\nconst { showAll, toggleForm } = useCustomDataForm()\n\nconst updateModelValue = (data: { property: string; value: any }) => {\n const updated = {} as { [key: string]: any }\n updated[data.property] = data.value\n emit('update:modelValue', { ...props.modelValue, ...updated })\n emit('anyChange')\n}\n\nconst elementsPinned = computed(() => {\n return props.elements.slice(0, props.pinnedCount)\n})\n\nconst elementsOther = computed(() => {\n return props.elements.slice(props.pinnedCount)\n})\n\nconst showHideButtonText = computed(() => {\n return showAll.value\n ? t('common.damImage.asset.detail.metadataToggle.show')\n : t('common.damImage.asset.detail.metadataToggle.hide')\n})\nconst showHideButtonIcon = computed(() => {\n return showAll.value ? 'mdi-minus' : 'mdi-plus'\n})\n\nconst enableShowHide = computed(() => {\n return props.elements.length > props.pinnedCount\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst v$ = useVuelidate({ $scope: props.validationScope })\n\nconst validate = (): Promise<boolean> => {\n return v$.value.$validate()\n}\n\ndefineExpose({\n validate,\n})\n</script>\n\n<template>\n <div class=\"w-100\">\n <slot name=\"before-pinned\" />\n <VRow\n v-for=\"element in elementsPinned\"\n :key=\"element.id\"\n dense\n class=\"mt-1\"\n >\n <VCol>\n <ARow\n v-if=\"readonly\"\n :title=\"element.name\"\n >\n {{ modelValue[element.property] }}\n </ARow>\n <ACustomFormElement\n v-else\n :config=\"element\"\n :model-value=\"modelValue[element.property]\"\n :validation-scope=\"validationScope\"\n @update:model-value=\"updateModelValue\"\n />\n </VCol>\n </VRow>\n <slot name=\"after-pinned\" />\n </div>\n <div\n v-show=\"showAll\"\n class=\"w-100\"\n >\n <VRow\n v-for=\"element in elementsOther\"\n :key=\"element.id\"\n dense\n class=\"mt-1\"\n >\n <VCol>\n <ARow\n v-if=\"readonly\"\n :title=\"element.name\"\n >\n {{ modelValue[element.property] }}\n </ARow>\n <ACustomFormElement\n v-else\n :config=\"element\"\n :model-value=\"modelValue[element.property]\"\n @update:model-value=\"updateModelValue\"\n />\n </VCol>\n </VRow>\n </div>\n <VBtn\n v-if=\"enableShowHide\"\n variant=\"text\"\n size=\"small\"\n class=\"my-2\"\n @click=\"toggleForm\"\n >\n <VIcon :icon=\"showHideButtonIcon\" />\n {{ showHideButtonText }}\n </VBtn>\n</template>\n","import { type Ref, ref } from 'vue'\n\nconst isDraggingFile = ref(false)\nconst draggingTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nexport function useDropzoneGlobalDragState() {\n const dragoverHandler = (event: DragEvent) => {\n event.preventDefault()\n checkReallyDraggingEnded(event, true)\n }\n const dragleaveHandler = (event: DragEvent) => {\n event.preventDefault()\n checkReallyDraggingEnded(event, false)\n }\n const dropHandler = (event: DragEvent) => {\n event.preventDefault()\n checkReallyDraggingEnded(event, false)\n }\n const checkReallyDraggingEnded = (event: DragEvent, dragging: boolean) => {\n if (!dragEventContainsFiles(event)) {\n return\n }\n if (dragging) {\n isDraggingFile.value = true\n clearTimeout(draggingTimer.value)\n } else {\n clearTimeout(draggingTimer.value)\n draggingTimer.value = setTimeout(() => {\n isDraggingFile.value = false\n }, 100)\n }\n }\n const dragEventContainsFiles = (event: DragEvent) => {\n if (event.dataTransfer?.types) {\n for (let i = 0; i < event.dataTransfer.types.length; i++) {\n if (event.dataTransfer.types[i] === 'Files') {\n return true\n }\n }\n }\n\n return false\n }\n\n const initGlobalDragState = () => {\n window.document.addEventListener('dragover', dragoverHandler)\n window.document.addEventListener('dragleave', dragleaveHandler)\n window.document.addEventListener('drop', dropHandler)\n }\n\n const destroyGlobalDragState = () => {\n window.document.removeEventListener('dragover', dragoverHandler)\n window.document.removeEventListener('dragleave', dragleaveHandler)\n window.document.removeEventListener('drop', dropHandler)\n }\n\n return {\n isDraggingFile,\n initGlobalDragState,\n destroyGlobalDragState,\n }\n}\n","export const damFileTypeFix = (file: File | null | undefined) => {\n if (!file) return ''\n if (file.type && file.type.length > 0) {\n return file.type\n }\n const extension = file.name.split('.').pop()?.toLowerCase()\n switch (extension) {\n case 'mov':\n return 'video/quicktime'\n default:\n return ''\n }\n}\n","import { useAlerts } from '@/composables/system/alerts'\nimport { damFileTypeFix } from '@/components/file/composables/fileType'\nimport { isUndefined } from '@/utils/common'\nimport { computed } from 'vue'\nimport { i18n } from '@/plugins/i18n'\n\n/**\n * @param accept example: 'image/*,.jpg'\n * @param maxSizes example: { 'image/*': 20000 } or { 'image/png': 20000, 'image/jpg': 20000 } or\n * { '.jpg': 20000, '.png': 20000 } or { '*': 20000, }\n */\nexport function useFormatAndSizeCheck(accept: string | undefined, maxSizes: Record<string, number> | undefined) {\n const acceptKeys = computed(() => {\n if (isUndefined(accept)) {\n return []\n }\n return accept.split(',')\n })\n\n const maxSizeKeys = computed(() => {\n if (isUndefined(maxSizes)) {\n return []\n }\n return Object.keys(maxSizes)\n })\n\n const checkFormatsAndSizes = (files: File[], disableAlert = false) => {\n const incorrectFileNames: string[] = []\n const validFiles = files.filter((file) => {\n const isFileValid = checkFormats(file, acceptKeys.value) && checkSizes(file, maxSizeKeys.value, maxSizes)\n if (!isFileValid) {\n incorrectFileNames.push(file.name)\n }\n return isFileValid\n })\n if (incorrectFileNames.length && !disableAlert) {\n const { showWarning } = useAlerts()\n const { t } = i18n.global\n showWarning(t('system.upload.incorrectFormatSize') + ':' + incorrectFileNames.join(', '))\n }\n\n return validFiles\n }\n\n const checkFormats = (file: File, accepts: string[]) => {\n if (accepts.length === 0) {\n return true\n }\n for (let i = 0; i < accepts.length; i++) {\n if (accepts[i].startsWith('.')) {\n // .format\n if (file.name.toLowerCase().endsWith(accepts[i])) {\n return true\n }\n } else {\n // type\n const splitType = accepts[i].split('/')\n if (splitType[1] === '*' && damFileTypeFix(file).startsWith(splitType[0] + '/')) {\n return true\n } else if (accepts[i] === damFileTypeFix(file)) {\n return true\n }\n }\n }\n return false\n }\n\n const checkSizes = (file: File, keys: Array<string>, sizes: Record<string, number> | undefined) => {\n if (keys.length === 0 || isUndefined(sizes)) {\n return true\n }\n for (let j = 0; j < keys.length; j++) {\n if (keys[j] === '*' && sizes[keys[j]] <= file.size) {\n // *\n return true\n } else if (keys[j].startsWith('.') && sizes[keys[j]] <= file.size) {\n // .format\n return true\n } else {\n // type\n const splitType = keys[j].split('/')\n if (splitType[1] === '*' && damFileTypeFix(file).startsWith(splitType[0] + '/') && sizes[keys[j]] > file.size) {\n return true\n } else if (keys[j] === damFileTypeFix(file) && sizes[keys[j]] > file.size) {\n return true\n }\n }\n }\n return false\n }\n\n return {\n checkFormatsAndSizes,\n }\n}\n","<script setup lang=\"ts\">\nimport { useDropZone } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { useDropzoneGlobalDragState } from '@/components/file/composables/dropzone'\nimport { isNull } from '@/utils/common'\nimport { useFormatAndSizeCheck } from '@/components/file/composables/formatAndSizeCheck'\nimport { useI18n } from 'vue-i18n'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n variant?: 'fill' | 'default' | 'fullscreen'\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n disabled?: boolean\n transparent?: boolean\n size?: 'small' | 'default' | 'large'\n hoverOnly?: boolean\n hideText?: boolean\n }>(),\n {\n variant: 'default',\n accept: undefined,\n maxSizes: undefined,\n disabled: false,\n transparent: false,\n size: 'default',\n hoverOnly: false,\n hideText: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'onDrop', files: File[]): void\n (e: 'onClick'): void\n}>()\n\nconst dropZoneRef = ref<HTMLDivElement>()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(props.accept, props.maxSizes)\n\nfunction onDrop(files: File[] | null) {\n if (props.disabled) return\n if (isNull(files) || files.length === 0) return\n emit('onDrop', checkFormatsAndSizes(files))\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, onDrop)\n\nconst { isDraggingFile } = useDropzoneGlobalDragState()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"a-file-dropzone\"\n :class=\"{\n 'a-file-dropzone--bg': !transparent,\n 'a-file-dropzone--over': isOverDropZone && isDraggingFile,\n 'a-file-dropzone--possibility': isDraggingFile,\n [`a-file-dropzone--${variant}`]: true,\n [`a-file-dropzone--${size}`]: true,\n [`a-file-dropzone--hover-only`]: hoverOnly,\n [`a-file-dropzone--hide-text`]: hideText,\n }\"\n @click.stop=\"emit('onClick')\"\n >\n <div\n v-if=\"disabled\"\n class=\"text\"\n />\n <div\n v-else-if=\"isDraggingFile\"\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropHere') }}\n </div>\n <div\n v-else\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropPossibility') }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n$class-name-root: 'a-file-dropzone';\n\n.#{$class-name-root} {\n outline-offset: -4px;\n position: relative;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .text {\n padding: 6px;\n pointer-events: none;\n user-select: none;\n text-align: center;\n border-radius: 5px;\n }\n\n &--fill {\n position: absolute !important;\n inset: 0;\n }\n\n &--bg {\n width: 100%;\n }\n\n &--fullscreen {\n inset: 0;\n position: fixed;\n z-index: 9999;\n }\n\n &--small {\n min-height: 70px;\n }\n\n &--default {\n min-height: 140px;\n }\n\n &--large {\n min-height: 210px;\n }\n\n &--hover-only {\n display: none;\n }\n\n &--hide-text .text {\n display: none;\n }\n\n &.#{$class-name-root}--hover-only.#{$class-name-root}--possibility {\n display: flex;\n }\n}\n\n.v-theme--light {\n .#{$class-name-root} {\n .text {\n background-color: rgba(212 212 212 / 50%);\n }\n\n &--bg {\n background-color: #d4d4d4;\n }\n\n &--over:not(&--disabled) {\n background-color: #dcedc8;\n outline: 2px dashed #7cb342;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #e5edf1;\n outline: 2px dashed #bacfd4;\n }\n }\n}\n\n.v-theme--dark {\n .#{$class-name-root} {\n .text {\n background-color: rgba(57 57 57 / 50%);\n }\n\n &--bg {\n background-color: #393939;\n }\n\n &--over:not(&--disabled) {\n background-color: #283121;\n outline: 2px dashed #333e28;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #212531;\n outline: 2px dashed #01579b;\n }\n }\n}\n</style>\n","import { ref } from 'vue'\nimport type { CommonAdminImageOptions } from '@/AnzuSystemsCommonAdmin'\nimport { isUndefined } from '@/utils/common'\n\nconst imageOptions = ref<CommonAdminImageOptions>(undefined)\n\nexport function initCommonAdminImageOptions(data: CommonAdminImageOptions) {\n imageOptions.value = data\n}\n\nexport function useCommonAdminImageOptions(configName: string = 'default') {\n if (\n isUndefined(imageOptions.value) ||\n isUndefined(imageOptions.value.configs) ||\n isUndefined(imageOptions.value.configs[configName])\n ) {\n throw new Error(\"Composable can't be used without properly configured common admin.\")\n }\n\n return {\n imageClient: imageOptions.value.configs[configName].imageClient,\n previewDomain: imageOptions.value.configs[configName].previewDomain,\n imageWidth: imageOptions.value.configs[configName].width,\n imageHeight: imageOptions.value.configs[configName].height,\n }\n}\n","import type { ImageAware, ImageCreateUpdateAware } from '@/types/ImageAware'\nimport type { useCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\nimport type { DocId } from '@/types/common'\n\nexport function useImageActions(config: ReturnType<typeof useCommonAdminImageOptions>) {\n const widgetImageToDamImageUrl = (\n image: ImageAware | ImageCreateUpdateAware,\n width = config.imageWidth,\n height = config.imageHeight,\n random = true\n ) => {\n return (\n config.previewDomain +\n '/image/w' +\n width +\n '-h' +\n height +\n (image.dam.regionPosition > 0 ? '-c' + image.dam.regionPosition : '') +\n '/' +\n image.dam.damId +\n '.jpg' +\n (random ? '?random=' + Date.now() : '')\n )\n }\n\n const widgetImageToDamImageOriginalUrl = (\n image: ImageAware | ImageCreateUpdateAware,\n random = true\n ) => {\n return (\n config.previewDomain +\n '/image/original/' +\n image.dam.damId +\n '.jpg' +\n (random ? '?random=' + Date.now() : '')\n )\n }\n\n const damImageIdToDamImageUrl = (\n imageId: DocId,\n width = config.imageWidth,\n height = config.imageHeight,\n random = true\n ) => {\n return (\n config.previewDomain +\n '/image/w' +\n width +\n '-h' +\n height +\n '/' +\n imageId +\n '.jpg' +\n (random ? '?random=' + Date.now() : '')\n )\n }\n\n const damImageIdToDamImageOriginalUrl = (\n imageId: DocId,\n random = true\n ) => {\n return (\n config.previewDomain +\n '/image/original/' +\n imageId +\n '.jpg' +\n (random ? '?random=' + Date.now() : '')\n )\n }\n\n return {\n widgetImageToDamImageUrl,\n widgetImageToDamImageOriginalUrl,\n damImageIdToDamImageUrl,\n damImageIdToDamImageOriginalUrl,\n }\n}\n","import { DamAssetType, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { computed } from 'vue'\nimport type { DamExtSystemConfig } from '@/types/coreDam/DamConfig'\n\nexport function useDamAcceptTypeAndSizeHelper(\n assetType: undefined | DamAssetTypeType = undefined,\n damConfigExtSystem: DamExtSystemConfig\n) {\n const createSizesByAssetType = (assetType: DamAssetTypeType) => {\n const sizes: Record<string, number> = {}\n for (let i = 0; i < damConfigExtSystem[assetType].mimeTypes.length; i++) {\n sizes[damConfigExtSystem[assetType].mimeTypes[i]] = damConfigExtSystem[assetType].sizeLimit\n }\n return sizes\n }\n\n const uploadSizes = computed(() => {\n if (assetType) {\n return {\n ...createSizesByAssetType(assetType),\n }\n }\n return {\n ...createSizesByAssetType(DamAssetType.Image),\n ...createSizesByAssetType(DamAssetType.Audio),\n ...createSizesByAssetType(DamAssetType.Video),\n ...createSizesByAssetType(DamAssetType.Document),\n }\n })\n\n const uploadAccept = computed(() => {\n return Object.keys(uploadSizes.value).join(',')\n })\n\n return {\n uploadSizes,\n uploadAccept,\n }\n}\n\n","import { type Ref, ref } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { isArray, isNull, isUndefined } from '@/utils/common'\n\nexport type CachedItem<T extends object> = T & { _loaded: boolean }\n\nexport type AddToCachedArgs<T extends DocId | IntegerId> =\n | Array<T | null | undefined>\n | Array<Array<T | null | undefined> | T | null | undefined>\n\n/**\n * @template I Identifier type\n * @template T Source type\n * @template M Minimal type\n */\nexport function defineCached<\n I extends DocId | IntegerId,\n T extends Record<DocId | IntegerId, any>,\n M extends Record<DocId | IntegerId, any>,\n>(\n mapFullToMinimal: (source: T) => M,\n mapIdToMinimal: (id: I) => M,\n fetchCallback: (ids: I[]) => Promise<T[]>,\n idProp = 'id',\n maxLimit = 1000\n) {\n const cache: Ref<Map<I, CachedItem<M>>> = ref(new Map()) // todo check\n const toFetch = ref(new Set()) as Ref<Set<I>> // todo check\n\n const add = (...args: AddToCachedArgs<I>) => {\n const toAdd = <Set<I>>new Set()\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (isNull(arg) || isUndefined(arg)) continue\n if (isArray(arg)) {\n for (let j = 0; j < arg.length; j++) {\n const item = arg[j]\n if (isNull(item) || isUndefined(item)) continue\n if (!cache.value.has(item)) toAdd.add(item)\n }\n continue\n }\n if (!cache.value.has(arg)) toAdd.add(arg)\n }\n toAdd.forEach((id) => {\n cache.value.set(id, { ...mapIdToMinimal(id), ...{ _loaded: false } })\n toFetch.value.add(id)\n })\n }\n\n const addManual = (data: T) => {\n if (data[idProp]) {\n cache.value.set(data[idProp] as I, { ...mapFullToMinimal(data), ...{ _loaded: true } })\n }\n }\n\n const addManualMinimal = (data: M) => {\n if (data[idProp]) {\n cache.value.set(data[idProp] as I, { ...data, ...{ _loaded: true } })\n }\n }\n\n const updateMap = (data: T[]) => {\n if (cache.value.size >= maxLimit) {\n cache.value.clear()\n }\n for (let i = 0; i < data.length; i += 1) {\n cache.value.set(data[i][idProp] as I, { ...mapFullToMinimal(data[i]), ...{ _loaded: true } })\n }\n }\n\n const updateToFetch = (ids: Array<I>) => {\n for (let i = 0; i < ids.length; i += 1) {\n toFetch.value.delete(ids[i])\n }\n }\n\n async function apiFetch() {\n if (toFetch.value.size > 0) {\n const ids = Array.from(toFetch.value)\n const res = await fetchCallback(ids)\n updateToFetch(ids)\n updateMap(res)\n return res\n }\n return []\n }\n\n const debouncedFetch = useDebounceFn(\n async () => {\n return await apiFetch()\n },\n 1500,\n { maxWait: 5000 }\n )\n\n /**\n * Debounced fetch for best performance.\n * For general usage.\n */\n const fetch = () => {\n return debouncedFetch()\n }\n\n /**\n * Immediate fetch with no debounce and with result in promise.\n * Use for special cases.\n */\n const immediateFetch = () => {\n return apiFetch()\n }\n\n const get = (id: I | null | undefined) => {\n if (!id) return undefined\n return cache.value.get(id)\n }\n\n const has = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.has(id)\n }\n\n const clear = () => {\n return cache.value.clear()\n }\n\n const isLoaded = (id: I | null | undefined): boolean => {\n if (!id) return false\n const item = cache.value.get(id)\n if (!item) return false\n return item._loaded\n }\n\n return {\n cache,\n toFetch,\n fetch,\n immediateFetch,\n add,\n addManual,\n addManualMinimal,\n has,\n get,\n clear,\n isLoaded,\n }\n}\n","import { ref } from 'vue'\nimport type { IntegerId } from '@/types/common'\n\nconst cachedExtSystemId = ref<IntegerId>(0)\n\nexport function useExtSystemIdForCached () {\n return {\n cachedExtSystemId,\n }\n}\n","import type { DocId } from '@/types/common'\nimport { defineCached } from '@/composables/system/defineCached'\nimport type { DamAuthor, DamAuthorMinimal } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { fetchAuthorListByIds } from '@/components/damImage/uploadQueue/api/authorApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { useExtSystemIdForCached } from '@/components/damImage/uploadQueue/composables/extSystemIdForCached'\n\nconst mapFullToMinimal = (author: DamAuthor): DamAuthorMinimal => ({\n id: author.id,\n name: author.name,\n identifier: author.identifier,\n reviewed: author.flags.reviewed\n})\n\nconst mapIdToMinimal = (id: DocId): DamAuthorMinimal => {\n return { id: id, name: '', identifier: '', reviewed: false }\n}\n\nconst { cache, toFetch, fetch, add, addManual, addManualMinimal, has, get, isLoaded } = defineCached<\n DocId,\n DamAuthor,\n DamAuthorMinimal\n>(mapFullToMinimal, mapIdToMinimal, (ids) => {\n const { cachedExtSystemId } = useExtSystemIdForCached()\n const { damClient } = useCommonAdminCoreDamOptions()\n return fetchAuthorListByIds(damClient, cachedExtSystemId.value, ids)\n})\n\nexport const useDamCachedAuthors = () => {\n return {\n addManualToCachedAuthors: addManual,\n addManualMinimalToCachedAuthors: addManualMinimal,\n addToCachedAuthors: add,\n fetchCachedAuthors: fetch,\n toFetchCachedAuthors: toFetch,\n cachedAuthors: cache,\n hasCachedAuthor: has,\n getCachedAuthor: get,\n isLoadedCachedAuthor: isLoaded,\n }\n}\n\nexport const useDamCachedAuthorsForRemoteAutocomplete = () => {\n return {\n fetch,\n add,\n addManualMinimal,\n }\n}\n","import type { DocId, DocIdNullable } from '@/types/common'\nimport type { AnzuUserAndTimeTrackingAware } from '@/types/AnzuUserAndTimeTrackingAware'\n\nexport const AssetFileProcessStatus = {\n Uploading: 'uploading', // file entity created and ready to receive chunks\n Uploaded: 'uploaded', // all chunks were sent\n Stored: 'stored', // File is stored and ready to processing\n Duplicate: 'duplicate', // AssetFile is duplicate of another asset\n Processed: 'processed', // file processed and ready to serve\n Failed: 'failed',\n} as const\nexport type AssetFileProcessStatusType = (typeof AssetFileProcessStatus)[keyof typeof AssetFileProcessStatus]\n\nexport const AssetFileFailReason = {\n None: 'none',\n Unknown: 'unknown',\n InvalidChecksum: 'invalid_checksum',\n InvalidMimeType: 'invalid_mime_type',\n DownloadFailed: 'download_failed',\n InvalidSize: 'invalid_size',\n} as const\nexport type AssetFileFailReasonType = (typeof AssetFileFailReason)[keyof typeof AssetFileFailReason]\nexport const AssetFileFailReasonDefault = AssetFileFailReason.None\n\nexport const AssetFileRouteStatus = {\n Disabled: 'disabled',\n Active: 'active',\n} as const\nexport type AssetFileRouteStatusType = (typeof AssetFileRouteStatus)[keyof typeof AssetFileRouteStatus]\nexport const AssetFileRouteStatusDefault = AssetFileRouteStatus.Disabled\n\ninterface FileAttributes {\n status: AssetFileProcessStatusType\n mimeType: string\n size: number\n originFileName: string\n originUrl: string\n failReason: AssetFileFailReasonType\n}\n\nexport const AssetFileLinkType = {\n Image: 'image',\n Audio: 'audio',\n} as const\nexport type AssetFileLinkTypeType = (typeof AssetFileLinkType)[keyof typeof AssetFileLinkType]\n\nexport interface AssetFileLink {\n width: number\n height: number\n requestedWidth: number\n requestedHeight: number\n url: string\n title: string\n type: AssetFileLinkTypeType\n}\n\nexport interface AssetFileRoute {\n id: DocId\n status: AssetFileRouteStatusType\n main: boolean\n publicUrl: string\n _resourceName: 'assetFileRoute'\n}\n\nexport interface AssetFileMainRouteAware {\n mainRoute?: AssetFileRoute\n}\n\nexport type AssetFileLinks =\n | Record<'image_list' | 'image_table' | 'image_detail' | 'image_animated' | 'audio', AssetFileLink>\n | Record<string, never>\n\nexport interface AssetFileAware {\n flags: {\n public: boolean\n singleUse: boolean\n }\n}\n\nexport interface AssetFileImage extends AssetFileAware, AnzuUserAndTimeTrackingAware, AssetFileMainRouteAware {\n id: DocId\n asset: DocId\n fileAttributes: FileAttributes\n imageAttributes: ImageAttributes\n originAssetFile: DocIdNullable\n links?: AssetFileLinks\n metadata: Metadata\n _resourceName: 'imageFile'\n}\n\nexport interface AssetFileAudio extends AssetFileAware, AnzuUserAndTimeTrackingAware, AssetFileMainRouteAware {\n id: DocId\n asset: DocId\n fileAttributes: FileAttributes\n audioAttributes: AudioAttributes\n originAssetFile: DocIdNullable\n links?: AssetFileLinks\n imagePreview: AssetFileImagePreviewNullable\n _resourceName: 'audioFile'\n}\n\nexport interface AssetFileVideo extends AssetFileAware, AnzuUserAndTimeTrackingAware {\n id: DocId\n asset: DocId\n fileAttributes: FileAttributes\n videoAttributes: VideoAttributes\n originAssetFile: DocIdNullable\n links?: AssetFileLinks\n imagePreview: AssetFileImagePreviewNullable\n _resourceName: 'videoFile'\n}\n\nexport interface AssetFileDocument extends AssetFileAware, AnzuUserAndTimeTrackingAware, AssetFileMainRouteAware {\n id: DocId\n asset: DocId\n fileAttributes: FileAttributes\n documentAttributes: DocumentAttributes\n originAssetFile: DocIdNullable\n links?: AssetFileLinks\n _resourceName: 'documentFile'\n}\n\nexport interface AssetFileDownloadLink extends AnzuUserAndTimeTrackingAware {\n id: DocId\n link: string\n _system: string\n _resourceName: 'imageFile'\n}\n\nexport type AssetFile = AssetFileImage | AssetFileAudio | AssetFileVideo | AssetFileDocument\n\nexport type AssetFileNullable = AssetFileImage | AssetFileAudio | AssetFileVideo | AssetFileDocument | null\n\nexport const assetFileIsImageFile = (value: any): value is AssetFileImage => {\n if (!value || !value._resourceName) return false\n return value._resourceName === 'imageFile'\n}\n\nexport const assetFileIsVideoFile = (value: any): value is AssetFileVideo => {\n if (!value || !value._resourceName) return false\n return value._resourceName === 'videoFile'\n}\n\nexport const assetFileIsAudioFile = (value: any): value is AssetFileAudio => {\n if (!value || !value._resourceName) return false\n return value._resourceName === 'audioFile'\n}\n\nexport const assetFileIsDocumentFile = (value: any): value is AssetFileDocument => {\n if (!value || !value._resourceName) return false\n return value._resourceName === 'documentFile'\n}\n\ninterface ImageAttributes {\n ratioWidth: number\n ratioHeight: number\n width: number\n height: number\n rotation: number\n mostDominantColor: string\n animated: boolean\n}\n\ninterface Metadata {\n exifData: [] // todo check\n id: string\n createdAt: string\n modifiedAt: string\n createdBy: number\n modifiedBy: number\n}\n\ninterface AudioAttributes {\n duration: number\n codecName: string\n bitrate: number\n}\n\ninterface DocumentAttributes {\n pageCount: number\n}\n\ninterface VideoAttributes {\n bitrate: number\n codecName: string\n duration: number\n height: number\n ratioHeight: number\n ratioWidth: number\n rotation: number\n width: number\n}\n\nexport interface AssetFileImagePreview {\n imageFile: DocId\n position: number\n}\n\nexport type AssetFileImagePreviewNullable = AssetFileImagePreview | null\n","import type { UploadQueueItem, UploadQueueItemStatusType, UploadQueueItemTypeType } from '@/types/coreDam/UploadQueue'\nimport type { IntegerId } from '@/types/common'\nimport { DamAssetStatusDefault, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { AssetFileFailReasonDefault } from '@/types/coreDam/AssetFile'\n\nexport function useUploadQueueItemFactory() {\n const createDefault = (\n key: string,\n type: UploadQueueItemTypeType,\n status: UploadQueueItemStatusType,\n assetType: DamAssetTypeType,\n chunkSize: number,\n licenceId: IntegerId\n ): UploadQueueItem => {\n return {\n key: key,\n type: type,\n file: null,\n status: status,\n isDuplicate: false,\n duplicateAssetId: null,\n assetType: assetType,\n assetStatus: DamAssetStatusDefault,\n displayTitle: '',\n assetId: null,\n fileId: null,\n externalProviderAssetId: null,\n externalProviderName: null,\n externalProviderMetadata: {},\n keywords: [],\n authors: [],\n authorConflicts: [],\n customData: {},\n latestChunkCancelToken: null,\n chunkSize: chunkSize,\n currentChunkIndex: 0,\n chunkTotalCount: 0,\n licenceId: licenceId,\n imagePreview: undefined,\n progress: {\n remainingTime: null,\n progressPercent: null,\n speed: null,\n },\n canEditMetadata: false,\n error: {\n hasError: false,\n message: '',\n assetFileFailReason: AssetFileFailReasonDefault,\n },\n notificationFallbackTimer: undefined,\n notificationFallbackTry: 1,\n slotName: null,\n image: undefined,\n mainFileSingleUse: null,\n }\n }\n\n return {\n createDefault,\n }\n}\n","import type { AssetMetadataSuggestions } from '@/types/coreDam/Asset'\nimport { isArray, isEmptyObject } from '@/utils/common'\nimport type { DocId } from '@/types/common'\n\nexport function useAssetSuggestions() {\n const updateNewNames = (suggestions: AssetMetadataSuggestions, newNames: Set<string>) => {\n for (const [key, value] of Object.entries(suggestions)) {\n if (isEmptyObject(value)) {\n newNames.add(key)\n }\n }\n }\n\n const getAuthorConflicts = (suggestions: AssetMetadataSuggestions) => {\n const conflicts: Array<DocId> = []\n for (const value of Object.values(suggestions)) {\n if (isArray(value) && value.length > 1) {\n value.forEach((id) => {\n conflicts.push(id)\n })\n }\n }\n return conflicts\n }\n\n return {\n updateNewNames,\n getAuthorConflicts,\n }\n}\n\n","import { type EventBusKey, useEventBus } from '@vueuse/core'\nimport type { DocId } from '@/types/common'\nimport type { AssetFileFailReasonType, AssetFileProcessStatusType } from '@/types/coreDam/AssetFile'\nimport type { DamAssetTypeType, DamDistributionServiceName } from '@/types/coreDam/Asset'\nimport type { DamDistributionStatusType } from '@/types/coreDam/DamConfig'\n\nexport const damNotificationsEventBusKey: EventBusKey<DamNotification> = Symbol('anzu:damNotificationsEventBusKey')\n\nexport function useDamNotificationsEventBus() {\n return useEventBus<DamNotification>(damNotificationsEventBusKey)\n}\n\nexport const DamNotificationName = {\n AssetFileProcessed: 'asset_file_processed',\n AssetFileFailed: 'asset_file_failed',\n AssetFileDuplicate: 'asset_file_duplicate',\n AssetFileUploaded: 'asset_file_uploaded',\n AssetFileDeleted: 'asset_file_deleted',\n AssetMetadataProcessed: 'asset_metadata_processed',\n AssetDeleted: 'asset_deleted',\n DistributionDistributing: 'distribution_distributing',\n DistributionRemoteProcessing: 'distribution_remote_processing',\n DistributionDistributed: 'distribution_distributed',\n DistributionFailed: 'distribution_failed',\n DistributionAuthorized: 'distribution_authorized',\n UserUpdated: 'user_updated',\n} as const\n\nexport type DamNotificationNameType = (typeof DamNotificationName)[keyof typeof DamNotificationName]\n\ntype DamNotificationEvent<T extends DamNotificationNameType, P> = {\n name: T\n data: P\n}\n\ninterface DamNotificationAssetFileData {\n id: DocId\n asset: DocId\n}\n\ninterface DamNotificationAssetFileStatusData {\n id: DocId\n asset: DocId\n status: AssetFileProcessStatusType\n failReason: AssetFileFailReasonType\n assetType: DamAssetTypeType\n originAssetFile: DocId\n}\n\ninterface DamNotificationDistributionData {\n id: DocId\n asset: DocId\n assetFile: DocId\n status: DamDistributionStatusType\n}\n\ninterface DamNotificationAssetData {\n asset: DocId\n}\n\ntype DamNotificationAssetFileProcessed = DamNotificationEvent<\n typeof DamNotificationName.AssetFileProcessed,\n DamNotificationAssetFileStatusData\n>\n\ntype DamNotificationAssetFileFailed = DamNotificationEvent<\n typeof DamNotificationName.AssetFileFailed,\n DamNotificationAssetFileStatusData\n>\n\ntype DamNotificationAssetFileDuplicate = DamNotificationEvent<\n typeof DamNotificationName.AssetFileDuplicate,\n DamNotificationAssetFileStatusData\n>\n\ntype DamNotificationAssetFileUploaded = DamNotificationEvent<\n typeof DamNotificationName.AssetFileUploaded,\n DamNotificationAssetFileStatusData\n>\n\ntype DamNotificationAssetFileDeleted = DamNotificationEvent<\n typeof DamNotificationName.AssetFileDeleted,\n DamNotificationAssetFileData\n>\n\ntype DamNotificationAssetMetadataProcessed = DamNotificationEvent<\n typeof DamNotificationName.AssetMetadataProcessed,\n DamNotificationAssetFileStatusData\n>\n\ntype DamNotificationAssetDeleted = DamNotificationEvent<\n typeof DamNotificationName.AssetDeleted,\n DamNotificationAssetData\n>\n\ntype DamNotificationDistributionDistributing = DamNotificationEvent<\n typeof DamNotificationName.DistributionDistributing,\n DamNotificationDistributionData\n>\n\ntype DamNotificationDistributionRemoteProcessing = DamNotificationEvent<\n typeof DamNotificationName.DistributionRemoteProcessing,\n DamNotificationDistributionData\n>\n\ntype DamNotificationDistributionDistributed = DamNotificationEvent<\n typeof DamNotificationName.DistributionDistributed,\n DamNotificationDistributionData\n>\n\ntype DamNotificationDistributionFailed = DamNotificationEvent<\n typeof DamNotificationName.DistributionFailed,\n DamNotificationDistributionData\n>\n\ntype DamNotificationDistributionAuthorized = DamNotificationEvent<\n typeof DamNotificationName.DistributionAuthorized,\n {\n distributionService: DamDistributionServiceName\n success: boolean\n }\n>\n\ntype DamNotificationUserUpdated = DamNotificationEvent<typeof DamNotificationName.UserUpdated, undefined>\n\nexport type DamNotification =\n | DamNotificationAssetFileProcessed\n | DamNotificationAssetFileFailed\n | DamNotificationAssetFileDuplicate\n | DamNotificationAssetFileUploaded\n | DamNotificationAssetFileDeleted\n | DamNotificationAssetMetadataProcessed\n | DamNotificationAssetDeleted\n | DamNotificationDistributionDistributing\n | DamNotificationDistributionRemoteProcessing\n | DamNotificationDistributionDistributed\n | DamNotificationDistributionFailed\n | DamNotificationDistributionAuthorized\n | DamNotificationUserUpdated\n","import { useWebSocket } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { i18n } from '@/plugins/i18n'\nimport {\n type DamNotification,\n useDamNotificationsEventBus,\n} from '@/components/damImage/uploadQueue/composables/damNotificationsEventBus'\nimport { useCommonAdminCoreDamOptionsGlobal } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { useAlerts } from '@/composables/system/alerts'\n\nconst { t } = i18n.global || i18n\n\nconst damNotificationsInitialized = ref(false)\n\nexport function initDamNotifications() {\n const { notification } = useCommonAdminCoreDamOptionsGlobal()\n\n const enabled = notification.enabled && notification.webSocketUrl.length > 0\n\n const eventBus = useDamNotificationsEventBus()\n\n const { open } = useWebSocket(notification.webSocketUrl, {\n immediate: false,\n autoClose: false,\n autoReconnect: {\n retries: 5,\n delay: 5000,\n onFailed() {\n if (!enabled) return\n const { showWarning } = useAlerts()\n setTimeout(() => {\n showWarning(t('common.damImage.notificationsNotConnected'))\n }, 3000)\n },\n },\n onMessage(ws, event) {\n if (!enabled) return\n const message = JSON.parse(event.data as string)\n const data = message.data.length ? JSON.parse(message.data) : undefined\n eventBus.emit({ name: message.eventName, data })\n },\n })\n\n const openConnection = () => {\n damNotificationsInitialized.value = true\n if (!enabled) return\n open()\n }\n\n return {\n openConnection,\n damNotificationsInitialized,\n }\n}\n\nexport function useDamNotifications() {\n const eventBus = useDamNotificationsEventBus()\n\n const addDamNotificationListener = (callback: (event: DamNotification) => void) => {\n return eventBus.on(callback)\n }\n\n return {\n addDamNotificationListener,\n }\n}\n","import { DamAssetType, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport type { DamExtSystemConfig } from '@/types/coreDam/DamConfig'\n\nexport const getAssetTypeByMimeType = (\n mimeType: string,\n damConfigExtSystem: DamExtSystemConfig\n): DamAssetTypeType | null => {\n for (const [key, values] of Object.entries(damConfigExtSystem)) {\n if (!Object.values(DamAssetType).includes(key as DamAssetTypeType)) continue\n for (let i = 0; i < values.mimeTypes.length; i++) {\n if (mimeType === values.mimeTypes[i]) return key as DamAssetTypeType\n }\n }\n return null\n}\n","import type { CancelTokenSource } from 'axios'\nimport type { DocId, DocIdNullable, IntegerId } from '@/types/common'\nimport type {\n AssetExternalProviderIdNullable,\n AssetExternalProviderMetadata,\n DamAssetStatusType,\n DamAssetTypeType,\n} from '@/types/coreDam/Asset'\nimport type { AssetFileFailReasonType, AssetFileLink } from '@/types/coreDam/AssetFile'\nimport type { ImageAware } from '@/types/ImageAware'\n\nexport type UploadQueueKey = string\n\nexport interface UploadQueue {\n items: UploadQueueItem[]\n totalCount: number\n processedCount: number\n fileInputKey: number // used to reset html input file element\n\n suggestions: {\n newKeywordNames: Set<string>\n newAuthorNames: Set<string>\n }\n}\n\nexport const UploadQueueItemType = {\n File: 'file',\n Asset: 'asset',\n ExternalProviderAsset: 'externalProviderAsset',\n SlotFile: 'slotFile',\n} as const\nexport type UploadQueueItemTypeType = (typeof UploadQueueItemType)[keyof typeof UploadQueueItemType]\n\nexport const UploadQueueItemStatus = {\n Loading: 'loading', // loading additional api data\n Waiting: 'waiting', // waiting to be uploaded\n Uploading: 'uploading', // uploading right now\n Processing: 'processing', // all data sent by FE, server processing, waiting for notification, todo\n Failed: 'failed', // any error\n Uploaded: 'uploaded', // uploaded/ready after loading\n Stop: 'stop', // after hitting stop upload\n} as const\nexport type UploadQueueItemStatusType = (typeof UploadQueueItemStatus)[keyof typeof UploadQueueItemStatus]\n\nexport interface UploadQueueItem {\n key: string\n file: File | null\n status: UploadQueueItemStatusType\n assetStatus: DamAssetStatusType\n isDuplicate: boolean\n type: UploadQueueItemTypeType\n assetType: DamAssetTypeType\n displayTitle: string\n assetId: DocIdNullable\n duplicateAssetId: DocIdNullable\n fileId: DocIdNullable\n externalProviderAssetId: AssetExternalProviderIdNullable\n externalProviderName: string | null\n externalProviderMetadata: AssetExternalProviderMetadata\n latestChunkCancelToken: CancelTokenSource | null\n chunkSize: number\n currentChunkIndex: number\n chunkTotalCount: number\n licenceId: IntegerId\n imagePreview?: AssetFileLink\n canEditMetadata: boolean\n keywords: DocId[]\n authors: DocId[]\n customData: any\n authorConflicts: DocId[]\n progress: {\n remainingTime: null | number\n progressPercent: null | number\n speed: null | number\n }\n error: {\n hasError: boolean\n message: string\n assetFileFailReason: AssetFileFailReasonType\n }\n notificationFallbackTimer: ReturnType<typeof setTimeout> | undefined\n notificationFallbackTry: number\n slotName: string | null\n image: undefined | ImageAware // todo check\n mainFileSingleUse: boolean | null\n}\n\nexport interface DamUploadStartResponse {\n id: DocId\n asset: DocId\n}\n","import { ref } from 'vue'\nimport { isNull } from '@/utils/common'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\n\nconst chunkSize = ref<number | undefined>(undefined)\n\nexport function useDamUploadChunkSize(apiTimeout: number = 30) {\n const damConfigStore = useDamConfigStore()\n const lastChunkSize = ref(chunkSize.value || damConfigStore.damPrvConfig.settings.imageChunkConfig.minSize)\n\n const minUploadTimeThreshold = apiTimeout / 5\n const idealUploadTimeThreshold = apiTimeout / 4\n const maxUploadTimeThreshold = apiTimeout / 2\n\n const updateChunkSize = (speed: number | null) => {\n if (isNull(speed)) {\n return false\n }\n\n const expectedChunkUploadSpeed = lastChunkSize.value / speed\n if (expectedChunkUploadSpeed > maxUploadTimeThreshold) {\n lastChunkSize.value = returnFromRange(maxUploadTimeThreshold * speed)\n chunkSize.value = lastChunkSize.value\n\n return true\n }\n if (expectedChunkUploadSpeed < minUploadTimeThreshold) {\n lastChunkSize.value = returnFromRange(idealUploadTimeThreshold * speed)\n chunkSize.value = lastChunkSize.value\n\n return true\n }\n\n return false\n }\n\n const returnFromRange = (value: number) => {\n if (value > damConfigStore.damPrvConfig.settings.imageChunkConfig.maxSize) {\n return damConfigStore.damPrvConfig.settings.imageChunkConfig.maxSize\n }\n if (value < damConfigStore.damPrvConfig.settings.imageChunkConfig.minSize) {\n return damConfigStore.damPrvConfig.settings.imageChunkConfig.minSize\n }\n\n return value\n }\n\n return {\n lastChunkSize,\n updateChunkSize,\n }\n}\n","import type { AxiosInstance } from 'axios'\nimport { type UploadQueueItem, UploadQueueItemType } from '@/types/coreDam/UploadQueue'\nimport type { DocId } from '@/types/common'\nimport { HTTP_STATUS_CREATED, HTTP_STATUS_OK } from '@/composables/statusCodes'\nimport { damFileTypeFix } from '@/components/file/composables/fileType'\nimport type { AssetFileImage } from '@/types/coreDam/AssetFile'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\n\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\n\nconst END_POINT = '/adm/v1/image'\nconst CHUNK_UPLOAD_TIMEOUT = 420\n\nexport const fetchImageFile = (client: () => AxiosInstance, id: DocId) =>\n apiFetchOne<AssetFileImage>(client, END_POINT + '/:id', { id }, SYSTEM_CORE_DAM, 'asset')\n\nexport const imageUploadStart = (client: () => AxiosInstance, item: UploadQueueItem) => {\n return new Promise((resolve, reject) => {\n let url = END_POINT + '/licence/' + item.licenceId\n if (item.type === UploadQueueItemType.SlotFile && item.slotName && item.assetId) {\n url = END_POINT + '/asset/' + item.assetId + '/slot-name/' + item.slotName\n }\n client()\n .post(\n url,\n JSON.stringify({\n mimeType: damFileTypeFix(item.file),\n size: item.file?.size,\n })\n )\n .then((res) => {\n if (res.status === HTTP_STATUS_CREATED) {\n resolve(res.data)\n } else {\n //\n reject()\n }\n })\n .catch((err) => {\n //\n reject(err)\n })\n })\n}\n\nexport const imageUploadChunk = (\n client: (timeout?: number) => AxiosInstance,\n item: UploadQueueItem,\n imageId: DocId,\n buffer: string,\n size: number,\n offset: number,\n onUploadProgressCallback: ((progressEvent: any) => void) | undefined = undefined\n) => {\n return new Promise((resolve, reject) => {\n const formData = new FormData()\n const url = END_POINT + '/' + imageId + '/chunk'\n formData.append('file', buffer)\n formData.append(\n 'chunk',\n JSON.stringify({\n offset: offset,\n size: size,\n })\n )\n\n client(CHUNK_UPLOAD_TIMEOUT)\n .post(url, formData, {\n cancelToken: item.latestChunkCancelToken ? item.latestChunkCancelToken.token : undefined,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress: onUploadProgressCallback,\n })\n .then((res) => {\n if (res.status === HTTP_STATUS_CREATED) {\n resolve(res.data)\n } else {\n //\n reject()\n }\n })\n .catch((err) => {\n //\n reject(err)\n })\n })\n}\n\nexport const imageUploadFinish = (client: () => AxiosInstance, item: UploadQueueItem, sha: string) => {\n return new Promise((resolve, reject) => {\n const url = END_POINT + '/' + item.fileId + '/uploaded'\n client()\n .patch(\n url,\n JSON.stringify({\n checksum: sha,\n })\n )\n .then((res) => {\n if (res.status === HTTP_STATUS_OK) {\n resolve(res.data)\n } else {\n //\n reject()\n }\n })\n .catch((err) => {\n //\n reject(err)\n })\n })\n}\n\nexport const rotateImage = (client: () => AxiosInstance, imageId: DocId, angle: 90 | 270) => {\n return new Promise((resolve, reject) => {\n const url = END_POINT + '/' + imageId + '/rotate/' + angle\n client()\n .patch(url)\n .then((res) => {\n if (res.status === HTTP_STATUS_OK) {\n resolve(res.data)\n } else {\n //\n reject()\n }\n })\n .catch((err) => {\n //\n reject(err)\n })\n })\n}\n","import { DamAssetType } from '@/types/coreDam/Asset'\nimport { type DamUploadStartResponse, type UploadQueueItem, UploadQueueItemStatus } from '@/types/coreDam/UploadQueue'\nimport {\n imageUploadChunk,\n imageUploadFinish,\n imageUploadStart,\n} from '@/components/damImage/uploadQueue/api/damImageApi'\nimport type { AxiosInstance } from 'axios'\nimport type { DocId } from '@/types/common'\nimport { AssetFileProcessStatus } from '@/types/coreDam/AssetFile'\nimport { fetchAsset } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\n\nconst NOTIFICATION_FALLBACK_TIMER_CHECK_SECONDS = 10\nconst NOTIFICATION_FALLBACK_MAX_TRIES = 3\n\nexport const damUploadStart: (client: () => AxiosInstance, item: UploadQueueItem) => Promise<DamUploadStartResponse> = (\n client: () => AxiosInstance,\n item: UploadQueueItem\n) => {\n return new Promise((resolve, reject) => {\n if (item.assetType !== DamAssetType.Image) {\n reject()\n return\n }\n imageUploadStart(client, item)\n .then((res) => {\n resolve(res as DamUploadStartResponse)\n return\n })\n .catch((err) => reject(err))\n })\n}\n\nexport const damUploadChunk = (\n client: () => AxiosInstance,\n item: UploadQueueItem,\n imageId: DocId,\n buffer: string,\n size: number,\n offset: number,\n onUploadProgressCallback: any\n) => {\n return new Promise((resolve, reject) => {\n if (item.assetType !== DamAssetType.Image) {\n reject()\n return\n }\n imageUploadChunk(client, item, imageId, buffer, size, offset, onUploadProgressCallback)\n .then((res) => {\n resolve(res)\n })\n .catch((err) => {\n reject(err)\n })\n })\n}\n\nexport const damUploadFinish = (\n client: () => AxiosInstance,\n item: UploadQueueItem,\n sha: string,\n uploadStatusFallback: boolean\n) => {\n return new Promise((resolve, reject) => {\n if (item.assetType !== DamAssetType.Image) {\n reject()\n return\n }\n imageUploadFinish(client, item, sha)\n .then((res) => {\n item.status = UploadQueueItemStatus.Processing\n if (uploadStatusFallback) {\n item.notificationFallbackTimer = setTimeout(function () {\n notificationFallbackCallback(client, item)\n }, calculateFallbackTime(item))\n }\n resolve(res)\n })\n .catch((err) => reject(err))\n })\n}\n\nfunction calculateFallbackTime(item: UploadQueueItem) {\n return NOTIFICATION_FALLBACK_TIMER_CHECK_SECONDS * 1000 * item.notificationFallbackTry * item.notificationFallbackTry\n}\n\nasync function notificationFallbackCallback(client: () => AxiosInstance, item: UploadQueueItem) {\n clearTimeout(item.notificationFallbackTimer)\n if (item.status === UploadQueueItemStatus.Uploaded) return\n if (item.notificationFallbackTry > NOTIFICATION_FALLBACK_MAX_TRIES) return\n if (!item.assetId) return\n const asset = await fetchAsset(client, item.assetId)\n if (asset && asset.mainFile && asset.mainFile.fileAttributes) {\n const uploadQueuesStore = useUploadQueuesStore()\n if (asset.mainFile.fileAttributes.status === AssetFileProcessStatus.Processed) {\n uploadQueuesStore.queueItemProcessed(asset.id)\n return\n } else if (asset.mainFile.fileAttributes.status === AssetFileProcessStatus.Duplicate) {\n uploadQueuesStore.queueItemDuplicate(asset.id)\n return\n } else if (asset.mainFile.fileAttributes.status === AssetFileProcessStatus.Failed) {\n uploadQueuesStore.queueItemFailed(asset.id, asset.mainFile.fileAttributes.failReason)\n return\n }\n }\n item.notificationFallbackTry++\n item.notificationFallbackTimer = setTimeout(function () {\n notificationFallbackCallback(client, item)\n }, calculateFallbackTime(item))\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Rusha\"] = factory();\n\telse\n\t\troot[\"Rusha\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-env commonjs, browser */\n\nvar RushaCore = __webpack_require__(5);\n\nvar _require = __webpack_require__(1),\n toHex = _require.toHex,\n ceilHeapSize = _require.ceilHeapSize;\n\nvar conv = __webpack_require__(6);\n\n// Calculate the length of buffer that the sha1 routine uses\n// including the padding.\nvar padlen = function (len) {\n for (len += 9; len % 64 > 0; len += 1) {}\n return len;\n};\n\nvar padZeroes = function (bin, len) {\n var h8 = new Uint8Array(bin.buffer);\n var om = len % 4,\n align = len - om;\n switch (om) {\n case 0:\n h8[align + 3] = 0;\n case 1:\n h8[align + 2] = 0;\n case 2:\n h8[align + 1] = 0;\n case 3:\n h8[align + 0] = 0;\n }\n for (var i = (len >> 2) + 1; i < bin.length; i++) {\n bin[i] = 0;\n }\n};\n\nvar padData = function (bin, chunkLen, msgLen) {\n bin[chunkLen >> 2] |= 0x80 << 24 - (chunkLen % 4 << 3);\n // To support msgLen >= 2 GiB, use a float division when computing the\n // high 32-bits of the big-endian message length in bits.\n bin[((chunkLen >> 2) + 2 & ~0x0f) + 14] = msgLen / (1 << 29) | 0;\n bin[((chunkLen >> 2) + 2 & ~0x0f) + 15] = msgLen << 3;\n};\n\nvar getRawDigest = function (heap, padMaxChunkLen) {\n var io = new Int32Array(heap, padMaxChunkLen + 320, 5);\n var out = new Int32Array(5);\n var arr = new DataView(out.buffer);\n arr.setInt32(0, io[0], false);\n arr.setInt32(4, io[1], false);\n arr.setInt32(8, io[2], false);\n arr.setInt32(12, io[3], false);\n arr.setInt32(16, io[4], false);\n return out;\n};\n\nvar Rusha = function () {\n function Rusha(chunkSize) {\n _classCallCheck(this, Rusha);\n\n chunkSize = chunkSize || 64 * 1024;\n if (chunkSize % 64 > 0) {\n throw new Error('Chunk size must be a multiple of 128 bit');\n }\n this._offset = 0;\n this._maxChunkLen = chunkSize;\n this._padMaxChunkLen = padlen(chunkSize);\n // The size of the heap is the sum of:\n // 1. The padded input message size\n // 2. The extended space the algorithm needs (320 byte)\n // 3. The 160 bit state the algoritm uses\n this._heap = new ArrayBuffer(ceilHeapSize(this._padMaxChunkLen + 320 + 20));\n this._h32 = new Int32Array(this._heap);\n this._h8 = new Int8Array(this._heap);\n this._core = new RushaCore({ Int32Array: Int32Array }, {}, this._heap);\n }\n\n Rusha.prototype._initState = function _initState(heap, padMsgLen) {\n this._offset = 0;\n var io = new Int32Array(heap, padMsgLen + 320, 5);\n io[0] = 1732584193;\n io[1] = -271733879;\n io[2] = -1732584194;\n io[3] = 271733878;\n io[4] = -1009589776;\n };\n\n Rusha.prototype._padChunk = function _padChunk(chunkLen, msgLen) {\n var padChunkLen = padlen(chunkLen);\n var view = new Int32Array(this._heap, 0, padChunkLen >> 2);\n padZeroes(view, chunkLen);\n padData(view, chunkLen, msgLen);\n return padChunkLen;\n };\n\n Rusha.prototype._write = function _write(data, chunkOffset, chunkLen, off) {\n conv(data, this._h8, this._h32, chunkOffset, chunkLen, off || 0);\n };\n\n Rusha.prototype._coreCall = function _coreCall(data, chunkOffset, chunkLen, msgLen, finalize) {\n var padChunkLen = chunkLen;\n this._write(data, chunkOffset, chunkLen);\n if (finalize) {\n padChunkLen = this._padChunk(chunkLen, msgLen);\n }\n this._core.hash(padChunkLen, this._padMaxChunkLen);\n };\n\n Rusha.prototype.rawDigest = function rawDigest(str) {\n var msgLen = str.byteLength || str.length || str.size || 0;\n this._initState(this._heap, this._padMaxChunkLen);\n var chunkOffset = 0,\n chunkLen = this._maxChunkLen;\n for (chunkOffset = 0; msgLen > chunkOffset + chunkLen; chunkOffset += chunkLen) {\n this._coreCall(str, chunkOffset, chunkLen, msgLen, false);\n }\n this._coreCall(str, chunkOffset, msgLen - chunkOffset, msgLen, true);\n return getRawDigest(this._heap, this._padMaxChunkLen);\n };\n\n Rusha.prototype.digest = function digest(str) {\n return toHex(this.rawDigest(str).buffer);\n };\n\n Rusha.prototype.digestFromString = function digestFromString(str) {\n return this.digest(str);\n };\n\n Rusha.prototype.digestFromBuffer = function digestFromBuffer(str) {\n return this.digest(str);\n };\n\n Rusha.prototype.digestFromArrayBuffer = function digestFromArrayBuffer(str) {\n return this.digest(str);\n };\n\n Rusha.prototype.resetState = function resetState() {\n this._initState(this._heap, this._padMaxChunkLen);\n return this;\n };\n\n Rusha.prototype.append = function append(chunk) {\n var chunkOffset = 0;\n var chunkLen = chunk.byteLength || chunk.length || chunk.size || 0;\n var turnOffset = this._offset % this._maxChunkLen;\n var inputLen = void 0;\n\n this._offset += chunkLen;\n while (chunkOffset < chunkLen) {\n inputLen = Math.min(chunkLen - chunkOffset, this._maxChunkLen - turnOffset);\n this._write(chunk, chunkOffset, inputLen, turnOffset);\n turnOffset += inputLen;\n chunkOffset += inputLen;\n if (turnOffset === this._maxChunkLen) {\n this._core.hash(this._maxChunkLen, this._padMaxChunkLen);\n turnOffset = 0;\n }\n }\n return this;\n };\n\n Rusha.prototype.getState = function getState() {\n var turnOffset = this._offset % this._maxChunkLen;\n var heap = void 0;\n if (!turnOffset) {\n var io = new Int32Array(this._heap, this._padMaxChunkLen + 320, 5);\n heap = io.buffer.slice(io.byteOffset, io.byteOffset + io.byteLength);\n } else {\n heap = this._heap.slice(0);\n }\n return {\n offset: this._offset,\n heap: heap\n };\n };\n\n Rusha.prototype.setState = function setState(state) {\n this._offset = state.offset;\n if (state.heap.byteLength === 20) {\n var io = new Int32Array(this._heap, this._padMaxChunkLen + 320, 5);\n io.set(new Int32Array(state.heap));\n } else {\n this._h32.set(new Int32Array(state.heap));\n }\n return this;\n };\n\n Rusha.prototype.rawEnd = function rawEnd() {\n var msgLen = this._offset;\n var chunkLen = msgLen % this._maxChunkLen;\n var padChunkLen = this._padChunk(chunkLen, msgLen);\n this._core.hash(padChunkLen, this._padMaxChunkLen);\n var result = getRawDigest(this._heap, this._padMaxChunkLen);\n this._initState(this._heap, this._padMaxChunkLen);\n return result;\n };\n\n Rusha.prototype.end = function end() {\n return toHex(this.rawEnd().buffer);\n };\n\n return Rusha;\n}();\n\nmodule.exports = Rusha;\nmodule.exports._core = RushaCore;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n/* eslint-env commonjs, browser */\n\n//\n// toHex\n//\n\nvar precomputedHex = new Array(256);\nfor (var i = 0; i < 256; i++) {\n precomputedHex[i] = (i < 0x10 ? '0' : '') + i.toString(16);\n}\n\nmodule.exports.toHex = function (arrayBuffer) {\n var binarray = new Uint8Array(arrayBuffer);\n var res = new Array(arrayBuffer.byteLength);\n for (var _i = 0; _i < res.length; _i++) {\n res[_i] = precomputedHex[binarray[_i]];\n }\n return res.join('');\n};\n\n//\n// ceilHeapSize\n//\n\nmodule.exports.ceilHeapSize = function (v) {\n // The asm.js spec says:\n // The heap object's byteLength must be either\n // 2^n for n in [12, 24) or 2^24 * n for n ≥ 1.\n // Also, byteLengths smaller than 2^16 are deprecated.\n var p = 0;\n // If v is smaller than 2^16, the smallest possible solution\n // is 2^16.\n if (v <= 65536) return 65536;\n // If v < 2^24, we round up to 2^n,\n // otherwise we round up to 2^24 * n.\n if (v < 16777216) {\n for (p = 1; p < v; p = p << 1) {}\n } else {\n for (p = 16777216; p < v; p += 16777216) {}\n }\n return p;\n};\n\n//\n// isDedicatedWorkerScope\n//\n\nmodule.exports.isDedicatedWorkerScope = function (self) {\n var isRunningInWorker = 'WorkerGlobalScope' in self && self instanceof self.WorkerGlobalScope;\n var isRunningInSharedWorker = 'SharedWorkerGlobalScope' in self && self instanceof self.SharedWorkerGlobalScope;\n var isRunningInServiceWorker = 'ServiceWorkerGlobalScope' in self && self instanceof self.ServiceWorkerGlobalScope;\n\n // Detects whether we run inside a dedicated worker or not.\n //\n // We can't just check for `DedicatedWorkerGlobalScope`, since IE11\n // has a bug where it only supports `WorkerGlobalScope`.\n //\n // Therefore, we consider us as running inside a dedicated worker\n // when we are running inside a worker, but not in a shared or service worker.\n //\n // When new types of workers are introduced, we will need to adjust this code.\n return isRunningInWorker && !isRunningInSharedWorker && !isRunningInServiceWorker;\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* eslint-env commonjs, worker */\n\nmodule.exports = function () {\n var Rusha = __webpack_require__(0);\n\n var hashData = function (hasher, data, cb) {\n try {\n return cb(null, hasher.digest(data));\n } catch (e) {\n return cb(e);\n }\n };\n\n var hashFile = function (hasher, readTotal, blockSize, file, cb) {\n var reader = new self.FileReader();\n reader.onloadend = function onloadend() {\n if (reader.error) {\n return cb(reader.error);\n }\n var buffer = reader.result;\n readTotal += reader.result.byteLength;\n try {\n hasher.append(buffer);\n } catch (e) {\n cb(e);\n return;\n }\n if (readTotal < file.size) {\n hashFile(hasher, readTotal, blockSize, file, cb);\n } else {\n cb(null, hasher.end());\n }\n };\n reader.readAsArrayBuffer(file.slice(readTotal, readTotal + blockSize));\n };\n\n var workerBehaviourEnabled = true;\n\n self.onmessage = function (event) {\n if (!workerBehaviourEnabled) {\n return;\n }\n\n var data = event.data.data,\n file = event.data.file,\n id = event.data.id;\n if (typeof id === 'undefined') return;\n if (!file && !data) return;\n var blockSize = event.data.blockSize || 4 * 1024 * 1024;\n var hasher = new Rusha(blockSize);\n hasher.resetState();\n var done = function (err, hash) {\n if (!err) {\n self.postMessage({ id: id, hash: hash });\n } else {\n self.postMessage({ id: id, error: err.name });\n }\n };\n if (data) hashData(hasher, data, done);\n if (file) hashFile(hasher, 0, blockSize, file, done);\n };\n\n return function () {\n workerBehaviourEnabled = false;\n };\n};\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* eslint-env commonjs, browser */\n\nvar work = __webpack_require__(4);\nvar Rusha = __webpack_require__(0);\nvar createHash = __webpack_require__(7);\nvar runWorker = __webpack_require__(2);\n\nvar _require = __webpack_require__(1),\n isDedicatedWorkerScope = _require.isDedicatedWorkerScope;\n\nvar isRunningInDedicatedWorker = typeof self !== 'undefined' && isDedicatedWorkerScope(self);\n\nRusha.disableWorkerBehaviour = isRunningInDedicatedWorker ? runWorker() : function () {};\n\nRusha.createWorker = function () {\n var worker = work(/*require.resolve*/(2));\n var terminate = worker.terminate;\n worker.terminate = function () {\n URL.revokeObjectURL(worker.objectURL);\n terminate.call(worker);\n };\n return worker;\n};\n\nRusha.createHash = createHash;\n\nmodule.exports = Rusha;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction webpackBootstrapFunc (modules) {\n/******/ // The module cache\n/******/ var installedModules = {};\n\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId])\n/******/ return installedModules[moduleId].exports;\n\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n\n/******/ // identity function for calling harmony imports with the correct context\n/******/ __webpack_require__.i = function(value) { return value; };\n\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n\n/******/ // define __esModule on exports\n/******/ __webpack_require__.r = function(exports) {\n/******/ Object.defineProperty(exports, '__esModule', { value: true });\n/******/ };\n\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"/\";\n\n/******/ // on error function for async loading\n/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n var f = __webpack_require__(__webpack_require__.s = ENTRY_MODULE)\n return f.default || f // try to call default if defined to also support babel esmodule exports\n}\n\nvar moduleNameReqExp = '[\\\\.|\\\\-|\\\\+|\\\\w|\\/|@]+'\nvar dependencyRegExp = '\\\\((\\/\\\\*.*?\\\\*\\/)?\\s?.*?(' + moduleNameReqExp + ').*?\\\\)' // additional chars when output.pathinfo is true\n\n// http://stackoverflow.com/a/2593661/130442\nfunction quoteRegExp (str) {\n return (str + '').replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&')\n}\n\nfunction getModuleDependencies (sources, module, queueName) {\n var retval = {}\n retval[queueName] = []\n\n var fnString = module.toString()\n var wrapperSignature = fnString.match(/^function\\s?\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/)\n if (!wrapperSignature) return retval\n var webpackRequireName = wrapperSignature[1]\n\n // main bundle deps\n var re = new RegExp('(\\\\\\\\n|\\\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g')\n var match\n while ((match = re.exec(fnString))) {\n if (match[3] === 'dll-reference') continue\n retval[queueName].push(match[3])\n }\n\n // dll deps\n re = new RegExp('\\\\(' + quoteRegExp(webpackRequireName) + '\\\\(\"(dll-reference\\\\s(' + moduleNameReqExp + '))\"\\\\)\\\\)' + dependencyRegExp, 'g')\n while ((match = re.exec(fnString))) {\n if (!sources[match[2]]) {\n retval[queueName].push(match[1])\n sources[match[2]] = __webpack_require__(match[1]).m\n }\n retval[match[2]] = retval[match[2]] || []\n retval[match[2]].push(match[4])\n }\n\n return retval\n}\n\nfunction hasValuesInQueues (queues) {\n var keys = Object.keys(queues)\n return keys.reduce(function (hasValues, key) {\n return hasValues || queues[key].length > 0\n }, false)\n}\n\nfunction getRequiredModules (sources, moduleId) {\n var modulesQueue = {\n main: [moduleId]\n }\n var requiredModules = {\n main: []\n }\n var seenModules = {\n main: {}\n }\n\n while (hasValuesInQueues(modulesQueue)) {\n var queues = Object.keys(modulesQueue)\n for (var i = 0; i < queues.length; i++) {\n var queueName = queues[i]\n var queue = modulesQueue[queueName]\n var moduleToCheck = queue.pop()\n seenModules[queueName] = seenModules[queueName] || {}\n if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck]) continue\n seenModules[queueName][moduleToCheck] = true\n requiredModules[queueName] = requiredModules[queueName] || []\n requiredModules[queueName].push(moduleToCheck)\n var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName)\n var newModulesKeys = Object.keys(newModules)\n for (var j = 0; j < newModulesKeys.length; j++) {\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || []\n modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]])\n }\n }\n }\n\n return requiredModules\n}\n\nmodule.exports = function (moduleId, options) {\n options = options || {}\n var sources = {\n main: __webpack_require__.m\n }\n\n var requiredModules = options.all ? { main: Object.keys(sources) } : getRequiredModules(sources, moduleId)\n\n var src = ''\n\n Object.keys(requiredModules).filter(function (m) { return m !== 'main' }).forEach(function (module) {\n var entryModule = 0\n while (requiredModules[module][entryModule]) {\n entryModule++\n }\n requiredModules[module].push(entryModule)\n sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })'\n src = src + 'var ' + module + ' = (' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(entryModule)) + ')({' + requiredModules[module].map(function (id) { return '' + JSON.stringify(id) + ': ' + sources[module][id].toString() }).join(',') + '});\\n'\n })\n\n src = src + '(' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(moduleId)) + ')({' + requiredModules.main.map(function (id) { return '' + JSON.stringify(id) + ': ' + sources.main[id].toString() }).join(',') + '})(self);'\n\n var blob = new window.Blob([src], { type: 'text/javascript' })\n if (options.bare) { return blob }\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL\n\n var workerUrl = URL.createObjectURL(blob)\n var worker = new window.Worker(workerUrl)\n worker.objectURL = workerUrl\n\n return worker\n}\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n// The low-level RushCore module provides the heart of Rusha,\n// a high-speed sha1 implementation working on an Int32Array heap.\n// At first glance, the implementation seems complicated, however\n// with the SHA1 spec at hand, it is obvious this almost a textbook\n// implementation that has a few functions hand-inlined and a few loops\n// hand-unrolled.\nmodule.exports = function RushaCore(stdlib$840, foreign$841, heap$842) {\n 'use asm';\n var H$843 = new stdlib$840.Int32Array(heap$842);\n function hash$844(k$845, x$846) {\n // k in bytes\n k$845 = k$845 | 0;\n x$846 = x$846 | 0;\n var i$847 = 0, j$848 = 0, y0$849 = 0, z0$850 = 0, y1$851 = 0, z1$852 = 0, y2$853 = 0, z2$854 = 0, y3$855 = 0, z3$856 = 0, y4$857 = 0, z4$858 = 0, t0$859 = 0, t1$860 = 0;\n y0$849 = H$843[x$846 + 320 >> 2] | 0;\n y1$851 = H$843[x$846 + 324 >> 2] | 0;\n y2$853 = H$843[x$846 + 328 >> 2] | 0;\n y3$855 = H$843[x$846 + 332 >> 2] | 0;\n y4$857 = H$843[x$846 + 336 >> 2] | 0;\n for (i$847 = 0; (i$847 | 0) < (k$845 | 0); i$847 = i$847 + 64 | 0) {\n z0$850 = y0$849;\n z1$852 = y1$851;\n z2$854 = y2$853;\n z3$856 = y3$855;\n z4$858 = y4$857;\n for (j$848 = 0; (j$848 | 0) < 64; j$848 = j$848 + 4 | 0) {\n t1$860 = H$843[i$847 + j$848 >> 2] | 0;\n t0$859 = ((y0$849 << 5 | y0$849 >>> 27) + (y1$851 & y2$853 | ~y1$851 & y3$855) | 0) + ((t1$860 + y4$857 | 0) + 1518500249 | 0) | 0;\n y4$857 = y3$855;\n y3$855 = y2$853;\n y2$853 = y1$851 << 30 | y1$851 >>> 2;\n y1$851 = y0$849;\n y0$849 = t0$859;\n H$843[k$845 + j$848 >> 2] = t1$860;\n }\n for (j$848 = k$845 + 64 | 0; (j$848 | 0) < (k$845 + 80 | 0); j$848 = j$848 + 4 | 0) {\n t1$860 = (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) << 1 | (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) >>> 31;\n t0$859 = ((y0$849 << 5 | y0$849 >>> 27) + (y1$851 & y2$853 | ~y1$851 & y3$855) | 0) + ((t1$860 + y4$857 | 0) + 1518500249 | 0) | 0;\n y4$857 = y3$855;\n y3$855 = y2$853;\n y2$853 = y1$851 << 30 | y1$851 >>> 2;\n y1$851 = y0$849;\n y0$849 = t0$859;\n H$843[j$848 >> 2] = t1$860;\n }\n for (j$848 = k$845 + 80 | 0; (j$848 | 0) < (k$845 + 160 | 0); j$848 = j$848 + 4 | 0) {\n t1$860 = (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) << 1 | (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) >>> 31;\n t0$859 = ((y0$849 << 5 | y0$849 >>> 27) + (y1$851 ^ y2$853 ^ y3$855) | 0) + ((t1$860 + y4$857 | 0) + 1859775393 | 0) | 0;\n y4$857 = y3$855;\n y3$855 = y2$853;\n y2$853 = y1$851 << 30 | y1$851 >>> 2;\n y1$851 = y0$849;\n y0$849 = t0$859;\n H$843[j$848 >> 2] = t1$860;\n }\n for (j$848 = k$845 + 160 | 0; (j$848 | 0) < (k$845 + 240 | 0); j$848 = j$848 + 4 | 0) {\n t1$860 = (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) << 1 | (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) >>> 31;\n t0$859 = ((y0$849 << 5 | y0$849 >>> 27) + (y1$851 & y2$853 | y1$851 & y3$855 | y2$853 & y3$855) | 0) + ((t1$860 + y4$857 | 0) - 1894007588 | 0) | 0;\n y4$857 = y3$855;\n y3$855 = y2$853;\n y2$853 = y1$851 << 30 | y1$851 >>> 2;\n y1$851 = y0$849;\n y0$849 = t0$859;\n H$843[j$848 >> 2] = t1$860;\n }\n for (j$848 = k$845 + 240 | 0; (j$848 | 0) < (k$845 + 320 | 0); j$848 = j$848 + 4 | 0) {\n t1$860 = (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) << 1 | (H$843[j$848 - 12 >> 2] ^ H$843[j$848 - 32 >> 2] ^ H$843[j$848 - 56 >> 2] ^ H$843[j$848 - 64 >> 2]) >>> 31;\n t0$859 = ((y0$849 << 5 | y0$849 >>> 27) + (y1$851 ^ y2$853 ^ y3$855) | 0) + ((t1$860 + y4$857 | 0) - 899497514 | 0) | 0;\n y4$857 = y3$855;\n y3$855 = y2$853;\n y2$853 = y1$851 << 30 | y1$851 >>> 2;\n y1$851 = y0$849;\n y0$849 = t0$859;\n H$843[j$848 >> 2] = t1$860;\n }\n y0$849 = y0$849 + z0$850 | 0;\n y1$851 = y1$851 + z1$852 | 0;\n y2$853 = y2$853 + z2$854 | 0;\n y3$855 = y3$855 + z3$856 | 0;\n y4$857 = y4$857 + z4$858 | 0;\n }\n H$843[x$846 + 320 >> 2] = y0$849;\n H$843[x$846 + 324 >> 2] = y1$851;\n H$843[x$846 + 328 >> 2] = y2$853;\n H$843[x$846 + 332 >> 2] = y3$855;\n H$843[x$846 + 336 >> 2] = y4$857;\n }\n return { hash: hash$844 };\n};\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\nvar _this = this;\n\n/* eslint-env commonjs, browser */\n\nvar reader = void 0;\nif (typeof self !== 'undefined' && typeof self.FileReaderSync !== 'undefined') {\n reader = new self.FileReaderSync();\n}\n\n// Convert a binary string and write it to the heap.\n// A binary string is expected to only contain char codes < 256.\nvar convStr = function (str, H8, H32, start, len, off) {\n var i = void 0,\n om = off % 4,\n lm = (len + om) % 4,\n j = len - lm;\n switch (om) {\n case 0:\n H8[off] = str.charCodeAt(start + 3);\n case 1:\n H8[off + 1 - (om << 1) | 0] = str.charCodeAt(start + 2);\n case 2:\n H8[off + 2 - (om << 1) | 0] = str.charCodeAt(start + 1);\n case 3:\n H8[off + 3 - (om << 1) | 0] = str.charCodeAt(start);\n }\n if (len < lm + (4 - om)) {\n return;\n }\n for (i = 4 - om; i < j; i = i + 4 | 0) {\n H32[off + i >> 2] = str.charCodeAt(start + i) << 24 | str.charCodeAt(start + i + 1) << 16 | str.charCodeAt(start + i + 2) << 8 | str.charCodeAt(start + i + 3);\n }\n switch (lm) {\n case 3:\n H8[off + j + 1 | 0] = str.charCodeAt(start + j + 2);\n case 2:\n H8[off + j + 2 | 0] = str.charCodeAt(start + j + 1);\n case 1:\n H8[off + j + 3 | 0] = str.charCodeAt(start + j);\n }\n};\n\n// Convert a buffer or array and write it to the heap.\n// The buffer or array is expected to only contain elements < 256.\nvar convBuf = function (buf, H8, H32, start, len, off) {\n var i = void 0,\n om = off % 4,\n lm = (len + om) % 4,\n j = len - lm;\n switch (om) {\n case 0:\n H8[off] = buf[start + 3];\n case 1:\n H8[off + 1 - (om << 1) | 0] = buf[start + 2];\n case 2:\n H8[off + 2 - (om << 1) | 0] = buf[start + 1];\n case 3:\n H8[off + 3 - (om << 1) | 0] = buf[start];\n }\n if (len < lm + (4 - om)) {\n return;\n }\n for (i = 4 - om; i < j; i = i + 4 | 0) {\n H32[off + i >> 2 | 0] = buf[start + i] << 24 | buf[start + i + 1] << 16 | buf[start + i + 2] << 8 | buf[start + i + 3];\n }\n switch (lm) {\n case 3:\n H8[off + j + 1 | 0] = buf[start + j + 2];\n case 2:\n H8[off + j + 2 | 0] = buf[start + j + 1];\n case 1:\n H8[off + j + 3 | 0] = buf[start + j];\n }\n};\n\nvar convBlob = function (blob, H8, H32, start, len, off) {\n var i = void 0,\n om = off % 4,\n lm = (len + om) % 4,\n j = len - lm;\n var buf = new Uint8Array(reader.readAsArrayBuffer(blob.slice(start, start + len)));\n switch (om) {\n case 0:\n H8[off] = buf[3];\n case 1:\n H8[off + 1 - (om << 1) | 0] = buf[2];\n case 2:\n H8[off + 2 - (om << 1) | 0] = buf[1];\n case 3:\n H8[off + 3 - (om << 1) | 0] = buf[0];\n }\n if (len < lm + (4 - om)) {\n return;\n }\n for (i = 4 - om; i < j; i = i + 4 | 0) {\n H32[off + i >> 2 | 0] = buf[i] << 24 | buf[i + 1] << 16 | buf[i + 2] << 8 | buf[i + 3];\n }\n switch (lm) {\n case 3:\n H8[off + j + 1 | 0] = buf[j + 2];\n case 2:\n H8[off + j + 2 | 0] = buf[j + 1];\n case 1:\n H8[off + j + 3 | 0] = buf[j];\n }\n};\n\nmodule.exports = function (data, H8, H32, start, len, off) {\n if (typeof data === 'string') {\n return convStr(data, H8, H32, start, len, off);\n }\n if (data instanceof Array) {\n return convBuf(data, H8, H32, start, len, off);\n }\n // Safely doing a Buffer check using \"this\" to avoid Buffer polyfill to be included in the dist\n if (_this && _this.Buffer && _this.Buffer.isBuffer(data)) {\n return convBuf(data, H8, H32, start, len, off);\n }\n if (data instanceof ArrayBuffer) {\n return convBuf(new Uint8Array(data), H8, H32, start, len, off);\n }\n if (data.buffer instanceof ArrayBuffer) {\n return convBuf(new Uint8Array(data.buffer, data.byteOffset, data.byteLength), H8, H32, start, len, off);\n }\n if (data instanceof Blob) {\n return convBlob(data, H8, H32, start, len, off);\n }\n throw new Error('Unsupported data type.');\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-env commonjs, browser */\n\nvar Rusha = __webpack_require__(0);\n\nvar _require = __webpack_require__(1),\n toHex = _require.toHex;\n\nvar Hash = function () {\n function Hash() {\n _classCallCheck(this, Hash);\n\n this._rusha = new Rusha();\n this._rusha.resetState();\n }\n\n Hash.prototype.update = function update(data) {\n this._rusha.append(data);\n return this;\n };\n\n Hash.prototype.digest = function digest(encoding) {\n var digest = this._rusha.rawEnd().buffer;\n if (!encoding) {\n return digest;\n }\n if (encoding === 'hex') {\n return toHex(digest);\n }\n throw new Error('unsupported digest encoding');\n };\n\n _createClass(Hash, [{\n key: 'state',\n get: function () {\n return this._rusha.getState();\n },\n set: function (state) {\n this._rusha.setState(state);\n }\n }]);\n\n return Hash;\n}();\n\nmodule.exports = function () {\n return new Hash();\n};\n\n/***/ })\n/******/ ]);\n});","import { ref } from 'vue'\nimport type { CancelTokenSource } from 'axios'\nimport axios from 'axios'\nimport { i18n } from '@/plugins/i18n'\nimport {\n type AnzuApiValidationResponseData,\n axiosErrorResponseHasValidationData,\n} from '@/model/error/AnzuApiValidationError'\nimport { type UploadQueueItem, UploadQueueItemStatus } from '@/types/coreDam/UploadQueue'\nimport { NEW_LINE_MARK } from '@/composables/system/alerts'\nimport { isUndefined } from '@/utils/common'\nimport { useDamUploadChunkSize } from '@/components/damImage/uploadQueue/composables/damUploadChunkSize'\nimport { damUploadChunk, damUploadFinish, damUploadStart } from '@/components/damImage/uploadQueue/api/uploadApi'\nimport {\n useCommonAdminCoreDamOptions,\n useCommonAdminCoreDamOptionsGlobal,\n} from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport rusha from 'rusha'\n\n// const CHUNK_MAX_RETRY = 6\nconst CHUNK_MAX_RETRY = 4\nconst SPEED_CHECK_INTERVAL = 1000\nconst CHUNK_RETRY_INTERVAL = 1000\nconst CHUNK_RETRY_MULTIPLY = 3\n\nconst failUpload = async (queueItem: UploadQueueItem, error: unknown = null) => {\n throw error\n}\n\nconst finishUpload = async (queueItem: UploadQueueItem, sha: string) => {\n const { damClient } = useCommonAdminCoreDamOptions()\n const { uploadStatusFallback } = useCommonAdminCoreDamOptionsGlobal()\n return await damUploadFinish(damClient, queueItem, sha, uploadStatusFallback)\n}\n\nconst handleValidationErrorMessage = (error: Error | any) => {\n const { t } = i18n.global || i18n\n if (!error || !error.response || !error.response.data) {\n // @ts-ignore\n return t('common.damImage.uploadErrors.unknownError')\n }\n const data = error.response.data as AnzuApiValidationResponseData\n const errorMessages: string[] = []\n for (const [key, values] of Object.entries(data.fields)) {\n switch (key) {\n case 'size':\n errorMessages.push(t('common.damImage.uploadErrors.size'))\n break\n case 'offset':\n errorMessages.push(t('common.damImage.uploadErrors.offset'))\n break\n case 'mimeType':\n errorMessages.push(t('common.damImage.uploadErrors.mimeType'))\n break\n default:\n // @ts-ignore\n errorMessages.push(t('common.damImage.uploadErrors.systemError') + ': ' + key + ' - ' + values.join(','))\n }\n }\n return errorMessages.length > 0 ? errorMessages.join(NEW_LINE_MARK) : t('common.damImage.uploadErrors.unknownError')\n}\n\nconst readFile = async (offset: number, size: number, file: File): Promise<{ data: string; offset: number }> => {\n return new Promise((resolve, reject) => {\n const partial = file.slice(offset, offset + size)\n const reader = new FileReader()\n reader.onload = function (e) {\n if (e.target?.readyState === FileReader.DONE) {\n resolve({ data: e.target.result as string, offset: offset })\n }\n }\n reader.onerror = function (e) {\n reject(e)\n }\n reader.readAsArrayBuffer(partial)\n })\n}\n\nconst sleep = (ms: number) => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function useUpload(queueItem: UploadQueueItem, uploadCallback: any = undefined) {\n const { damClient } = useCommonAdminCoreDamOptions()\n const fileSize = ref(0)\n\n const progress = ref(0)\n\n let speedStack: any[] = []\n let lastTimestamp = 0\n let endTimestamp = 0\n let lastLoaded = 0\n const sha = rusha.createHash()\n const { updateChunkSize, lastChunkSize } = useDamUploadChunkSize()\n\n const getCurrentTimestamp = () => {\n return Date.now() / 1000\n }\n\n // @ts-ignore\n function progressCallback(progressEvent) {\n const currentStamp = getCurrentTimestamp()\n if (lastTimestamp === 0) {\n lastTimestamp = currentStamp\n\n return\n }\n\n const dataSent = lastLoaded > 0 ? progressEvent.loaded - lastLoaded : progressEvent.loaded\n lastLoaded = progressEvent.total === progressEvent.loaded ? 0 : progressEvent.loaded\n speedStack.push(dataSent / (currentStamp - lastTimestamp))\n\n lastTimestamp = currentStamp\n }\n\n const uploadChunk = async (chunkFile: File, offset: number) => {\n return new Promise((resolve, reject) => {\n if (!queueItem.fileId) {\n reject()\n return\n }\n damUploadChunk(\n damClient,\n queueItem,\n queueItem.fileId,\n chunkFile as unknown as string, // todo check\n chunkFile.size,\n offset,\n progressCallback\n )\n .then((result) => {\n resolve(result)\n })\n .catch((exception) => {\n reject(exception)\n })\n })\n }\n\n const processAndUploadChunk = async (offset: number): Promise<File> => {\n updateChunkSize(queueItem.progress.speed)\n let arrayBuffer: { data: string; offset: number } = await readFile(offset, lastChunkSize.value, queueItem.file!)\n let chunkFile = new File([arrayBuffer.data], queueItem.file!.name)\n\n queueItem.currentChunkIndex = offset\n const cancelToken = axios.CancelToken\n queueItem.latestChunkCancelToken = cancelToken.source()\n\n let sleepTime = CHUNK_RETRY_INTERVAL\n let attempt = 0\n do {\n attempt++\n try {\n await uploadChunk(chunkFile, offset)\n sha.update(arrayBuffer.data)\n\n return chunkFile\n } catch (error) {\n // in error recompute\n if (axiosErrorResponseHasValidationData(error as Error)) {\n attempt = CHUNK_MAX_RETRY\n queueItem.error.message = handleValidationErrorMessage(error)\n return Promise.reject(error)\n }\n\n if (updateChunkSize(queueItem.progress.speed)) {\n arrayBuffer = await readFile(offset, lastChunkSize.value, queueItem.file!)\n chunkFile = new File([arrayBuffer.data], queueItem.file!.name)\n }\n\n await sleep(sleepTime)\n attempt === CHUNK_MAX_RETRY - 1 ? (sleepTime = 1) : (sleepTime *= CHUNK_RETRY_MULTIPLY)\n }\n } while (attempt < CHUNK_MAX_RETRY)\n return Promise.reject('Unable to upload chunk, max tries exceeded')\n }\n\n function speedCheck() {\n function speedCheckRun() {\n speedStack = speedStack.slice(-15)\n if (speedStack.length > 0) {\n const avgSpeed = Math.ceil(speedStack.reduce((sum, current) => sum + current) / speedStack.length)\n const remainingBytes = Math.ceil(fileSize.value * ((100 - progress.value) / 100))\n\n uploadCallback(progress.value, avgSpeed, Math.ceil(remainingBytes / avgSpeed))\n }\n\n if (endTimestamp === 0) {\n setTimeout(function () {\n speedCheckRun()\n }, SPEED_CHECK_INTERVAL)\n }\n }\n\n speedCheckRun()\n }\n\n const uploadInit = async () => {\n return new Promise((resolve, reject) => {\n if (!queueItem.file || queueItem.file.size < 1) {\n failUpload(queueItem)\n return\n }\n fileSize.value = queueItem.file.size\n queueItem.status = UploadQueueItemStatus.Uploading\n damUploadStart(damClient, queueItem)\n .then((res) => {\n queueItem.assetId = res.asset\n queueItem.fileId = res.id\n resolve(queueItem)\n })\n .catch((err) => {\n reject(err)\n })\n })\n }\n\n const upload = async () => {\n if (uploadCallback) {\n speedCheck()\n }\n\n const filesize = queueItem.file?.size\n if (isUndefined(filesize)) return Promise.reject()\n\n let i = 0\n while (i < filesize) {\n const uploadedChunk = await processAndUploadChunk(i)\n i += uploadedChunk.size\n progress.value = (i / filesize) * 100\n }\n\n endTimestamp = Date.now() / 1000\n return await finishUpload(queueItem, sha.digest('hex'))\n }\n\n return {\n uploadInit,\n upload,\n }\n}\n\nexport const uploadStop = (cancelTokenSource: CancelTokenSource) => {\n // todo stop speed check\n cancelTokenSource.cancel('axios request cancelled')\n}\n","import type { DocId } from '@/types/common'\nimport { defineCached } from '@/composables/system/defineCached'\nimport type { DamKeyword, DamKeywordMinimal } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport { fetchKeywordListByIds } from '@/components/damImage/uploadQueue/api/keywordApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { useExtSystemIdForCached } from '@/components/damImage/uploadQueue/composables/extSystemIdForCached'\n\nconst mapFullToMinimal = (keyword: DamKeyword): DamKeywordMinimal => ({\n id: keyword.id,\n name: keyword.name,\n})\n\nconst mapIdToMinimal = (id: DocId): DamKeywordMinimal => {\n return { id: id, name: '' }\n}\n\nconst { cache, toFetch, fetch, add, addManual, addManualMinimal, has, get, isLoaded } = defineCached<\n DocId,\n DamKeyword,\n DamKeywordMinimal\n>(mapFullToMinimal, mapIdToMinimal, (ids) => {\n const { cachedExtSystemId } = useExtSystemIdForCached()\n const { damClient } = useCommonAdminCoreDamOptions()\n return fetchKeywordListByIds(damClient, cachedExtSystemId.value, ids)\n})\n\nexport const useDamCachedKeywords = () => {\n return {\n addManualToCachedKeywords: addManual,\n addManualMinimalToCachedKeywords: addManualMinimal,\n addToCachedKeywords: add,\n fetchCachedKeywords: fetch,\n toFetchCachedKeywords: toFetch,\n cachedKeywords: cache,\n hasCachedKeyword: has,\n getCachedKeyword: get,\n isLoadedCachedKeyword: isLoaded,\n }\n}\n\nexport const useCachedKeywordsForRemoteAutocomplete = () => {\n return {\n fetch,\n add,\n addManualMinimal,\n }\n}\n","import { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { fetchAsset, fetchAssetByFileId } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useDamCachedAuthors } from '@/components/damImage/uploadQueue/author/cachedAuthors'\nimport { useUploadQueueItemFactory } from '@/components/damImage/uploadQueue/composables/UploadQueueItemFactory'\nimport { useAssetSuggestions } from '@/components/damImage/uploadQueue/composables/assetSuggestions'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { useDamNotifications } from '@/components/damImage/uploadQueue/composables/damNotifications'\nimport { DamNotificationName } from '@/components/damImage/uploadQueue/composables/damNotificationsEventBus'\nimport { getAssetTypeByMimeType } from '@/components/damImage/uploadQueue/composables/mimeTypeHelper'\nimport { uploadStop, useUpload } from '@/components/damImage/uploadQueue/composables/uploadService'\nimport { useDamCachedKeywords } from '@/components/damImage/uploadQueue/keyword/cachedKeywords'\nimport { damFileTypeFix } from '@/components/file/composables/fileType'\nimport type { DocId, DocIdNullable, IntegerId } from '@/types/common'\nimport { type AssetDetailItemDto, DamAssetType, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport type { AssetFileFailReasonType } from '@/types/coreDam/AssetFile'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n UploadQueueItemType,\n type UploadQueueKey,\n} from '@/types/coreDam/UploadQueue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { defineStore } from 'pinia'\nimport { ref } from 'vue'\n\nconst QUEUE_MAX_PARALLEL_UPLOADS = 2\nconst QUEUE_CHUNK_SIZE = 10485760\n\nexport const useUploadQueuesStore = defineStore('commonUploadQueuesStore', () => {\n const { addToCachedKeywords, fetchCachedKeywords } = useDamCachedKeywords()\n const { addToCachedAuthors, fetchCachedAuthors } = useDamCachedAuthors()\n\n const queues = ref<Map<UploadQueueKey, UploadQueue>>(new Map())\n\n const { createDefault } = useUploadQueueItemFactory()\n\n const { damClient } = useCommonAdminCoreDamOptions()\n const { addDamNotificationListener } = useDamNotifications()\n addDamNotificationListener((event) => {\n switch (event.name) {\n case DamNotificationName.AssetFileProcessed:\n queueItemProcessed(event.data.asset)\n break\n case DamNotificationName.AssetFileFailed:\n queueItemFailed(event.data.asset, event.data.failReason)\n break\n case DamNotificationName.AssetFileDuplicate:\n queueItemDuplicate(event.data.asset, event.data.originAssetFile, event.data.assetType)\n break\n case DamNotificationName.AssetMetadataProcessed:\n queueItemMetadataProcessed(event.data.asset)\n break\n }\n })\n\n function getQueue(queueKey: UploadQueueKey) {\n if (queues.value.has(queueKey)) {\n return queues.value.get(queueKey)\n }\n return null\n }\n\n function getQueueItems(queueKey: UploadQueueKey) {\n if (queues.value.has(queueKey)) {\n return queues.value.get(queueKey)?.items || []\n }\n return []\n }\n\n async function addByFiles(queueKey: UploadQueueKey, extSystem: IntegerId, assetLicence: IntegerId, files: File[]) {\n const { getDamConfigExtSystem } = useDamConfigState()\n\n const configExtSystem = getDamConfigExtSystem(extSystem)\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n for await (const file of files) {\n const type = getAssetTypeByMimeType(damFileTypeFix(file), configExtSystem)\n if (!type || type !== DamAssetType.Image) continue // only image now\n const queueItem = createDefault(\n 'file_' + file.name,\n UploadQueueItemType.File,\n UploadQueueItemStatus.Waiting,\n type,\n QUEUE_CHUNK_SIZE,\n assetLicence\n )\n queueItem.file = file\n queueItem.displayTitle = file.name\n createQueue(queueKey)\n addQueueItem(queueKey, queueItem)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n }\n }\n\n function addQueueItem(queueKey: UploadQueueKey, item: UploadQueueItem) {\n const queue = queues.value.get(queueKey)\n if (!queue) return\n queue.items.push(item)\n }\n\n function createQueue(queueKey: UploadQueueKey) {\n if (!queues.value.has(queueKey)) {\n queues.value.set(queueKey, {\n items: [],\n totalCount: 0,\n processedCount: 0,\n fileInputKey: 0,\n suggestions: { newKeywordNames: new Set<string>(), newAuthorNames: new Set<string>() },\n })\n }\n }\n\n function recalculateQueueCounts(queueKey: UploadQueueKey) {\n const queue = queues.value.get(queueKey)\n if (!queue) return\n queue.totalCount = queue.items.length\n queue.processedCount =\n getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploaded).length +\n getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Failed).length\n }\n\n function getQueueItemsByStatus(queueKey: UploadQueueKey, status: UploadQueueItemStatusType) {\n const queue = queues.value.get(queueKey)\n if (!queue) return []\n return queue.items.filter((item) => item.status === status)\n }\n\n function processUpload(queueKey: UploadQueueKey) {\n const waitingItems = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Waiting)\n if (waitingItems.length === 0) {\n // upload finished\n return\n }\n const uploadingCount = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploading).length\n if (uploadingCount === QUEUE_MAX_PARALLEL_UPLOADS) {\n // wait for empty upload slot\n return\n }\n for (let i = 0; i < QUEUE_MAX_PARALLEL_UPLOADS; i++) {\n if (waitingItems[i]) queueItemUploadStart(waitingItems[i], queueKey)\n }\n }\n\n async function queueItemUploadStart(item: UploadQueueItem, queueKey: UploadQueueKey) {\n const { upload, uploadInit } = useUpload(item, (progress: number, speed: number, estimate: number) => {\n setUploadSpeed(item, progress, speed, estimate)\n })\n try {\n await uploadInit()\n await upload()\n processUpload(queueKey)\n } catch (e) {\n item.error.hasError = true\n item.status = UploadQueueItemStatus.Failed\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n }\n }\n\n function setUploadSpeed(item: UploadQueueItem, progress: number, speed: number, estimate: number) {\n item.progress.progressPercent = progress\n item.progress.remainingTime = estimate\n item.progress.speed = speed\n }\n\n async function queueItemProcessed(assetId: DocId) {\n try {\n const asset = await fetchAsset(damClient, assetId)\n if (!asset) return\n queues.value.forEach((queue, queueKey) => {\n queue.items.forEach((item) => {\n if (item.assetId === asset.id && asset.mainFile) {\n clearTimeout(item.notificationFallbackTimer)\n item.status = UploadQueueItemStatus.Uploaded\n item.assetStatus = asset.attributes.assetStatus\n if (asset.mainFile.links?.image_detail) {\n item.imagePreview = asset.mainFile.links.image_detail\n }\n item.mainFileSingleUse = asset.mainFileSingleUse\n processUpload(queueKey)\n }\n })\n recalculateQueueCounts(queueKey)\n })\n } catch (e) {\n //\n }\n }\n\n async function queueItemDuplicate(\n assetId: DocId,\n originAssetFile: DocIdNullable = null,\n assetType: DamAssetTypeType | null = null\n ) {\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n if (!originAssetFile || !assetType || assetType !== DamAssetType.Image) return\n let assetRes: null | AssetDetailItemDto = null\n try {\n assetRes = await fetchAssetByFileId(damClient, originAssetFile)\n } catch (e) {\n throw new Error('Fatal error')\n }\n queues.value.forEach((queue, queueKey) => {\n queue.items.forEach((item) => {\n if (isNull(assetRes)) return\n if (item.assetId === assetId) {\n clearTimeout(item.notificationFallbackTimer)\n item.isDuplicate = true\n item.status = UploadQueueItemStatus.Uploaded\n item.fileId = originAssetFile\n item.duplicateAssetId = assetRes.id\n item.assetStatus = assetRes.attributes.assetStatus\n if (assetRes.mainFile?.links?.image_detail) {\n item.imagePreview = assetRes.mainFile.links.image_detail\n }\n item.keywords = assetRes.keywords\n item.authors = assetRes.authors\n item.customData = assetRes.metadata.customData\n updateNewNames(assetRes.metadata.authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(assetRes.metadata.keywordSuggestions, queue.suggestions.newKeywordNames)\n item.authorConflicts = getAuthorConflicts(assetRes!.metadata.authorSuggestions)\n addToCachedKeywords(item.keywords)\n addToCachedAuthors(item.authors)\n addToCachedAuthors(item.authorConflicts)\n item.assetId = assetRes.id\n item.mainFileSingleUse = assetRes.mainFileSingleUse\n item.canEditMetadata = true\n processUpload(queueKey)\n }\n })\n recalculateQueueCounts(queueKey)\n fetchCachedAuthors()\n fetchCachedKeywords()\n })\n }\n\n async function queueItemFailed(assetId: DocId, failReason: AssetFileFailReasonType) {\n try {\n const asset = await fetchAsset(damClient, assetId)\n queues.value.forEach((queue, queueKey) => {\n queue.items.forEach((item) => {\n if (item.assetId === asset.id) {\n clearTimeout(item.notificationFallbackTimer)\n item.error.hasError = true\n item.status = UploadQueueItemStatus.Failed\n item.error.assetFileFailReason = failReason\n item.canEditMetadata = false\n processUpload(queueKey)\n }\n })\n recalculateQueueCounts(queueKey)\n })\n } catch (e) {\n //\n }\n }\n\n async function queueItemMetadataProcessed(assetId: DocId) {\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n try {\n const asset = await fetchAsset(damClient, assetId)\n queues.value.forEach((queue, queueKey) => {\n queue.items.forEach((item) => {\n if (item.assetId === asset.id && item.type) {\n clearTimeout(item.notificationFallbackTimer)\n item.keywords = asset.keywords\n item.authors = asset.authors\n item.customData = asset.metadata.customData\n item.mainFileSingleUse = asset.mainFileSingleUse\n updateNewNames(asset.metadata.authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(asset.metadata.keywordSuggestions, queue.suggestions.newKeywordNames)\n item.authorConflicts = getAuthorConflicts(asset.metadata.authorSuggestions)\n addToCachedKeywords(item.keywords)\n addToCachedAuthors(item.authors)\n addToCachedAuthors(item.authorConflicts)\n item.canEditMetadata = true\n }\n })\n recalculateQueueCounts(queueKey)\n fetchCachedAuthors()\n fetchCachedKeywords()\n })\n } catch (e) {\n //\n }\n }\n\n function removeByIndex(queueKey: UploadQueueKey, index: number) {\n const queue = queues.value.get(queueKey)\n if (!queue || !queue.items[index]) return\n queue.items.splice(index, 1)\n recalculateQueueCounts(queueKey)\n }\n\n async function stopItemUpload(queueKey: UploadQueueKey, queueItem: UploadQueueItem, index: number) {\n const queue = queues.value.get(queueKey)\n if (!queue || queue.items.length === 0) return\n queueItem.status = UploadQueueItemStatus.Stop\n if (queueItem.latestChunkCancelToken) {\n uploadStop(queueItem.latestChunkCancelToken)\n }\n removeByIndex(queueKey, index)\n processUpload(queueKey)\n }\n\n async function updateFromDetail(asset: AssetDetailItemDto) {\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n try {\n const assetRes = await fetchAsset(damClient, asset.id)\n queues.value.forEach((queue, queueKey) => {\n queue.items.forEach((item) => {\n if (item.assetId === assetRes.id && item.type) {\n clearTimeout(item.notificationFallbackTimer)\n item.keywords = assetRes.keywords\n item.authors = assetRes.authors\n item.customData = assetRes.metadata.customData\n updateNewNames(assetRes.metadata.authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(assetRes.metadata.keywordSuggestions, queue.suggestions.newKeywordNames)\n item.authorConflicts = getAuthorConflicts(assetRes.metadata.authorSuggestions)\n addToCachedKeywords(item.keywords)\n addToCachedAuthors(item.authors)\n addToCachedAuthors(item.authorConflicts)\n }\n })\n recalculateQueueCounts(queueKey)\n fetchCachedAuthors()\n fetchCachedKeywords()\n })\n } catch (e) {\n //\n }\n }\n\n function getQueueTotalCount(queueKey: UploadQueueKey) {\n const queue = queues.value.get(queueKey)\n if (!queue) return 0\n return queue.totalCount\n }\n\n function getQueueProcessedCount(queueKey: UploadQueueKey) {\n const queue = queues.value.get(queueKey)\n if (!queue) return 0\n return queue.processedCount\n }\n\n function stopUpload(queueKey: UploadQueueKey) {\n const queue = queues.value.get(queueKey)\n if (!queue || queue.items.length === 0) return\n const currentItems = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploading)\n queue.items.forEach((item) => {\n item.status = UploadQueueItemStatus.Stop\n })\n if (currentItems.length > 0) {\n currentItems.forEach((item) => {\n if (item.latestChunkCancelToken) {\n uploadStop(item.latestChunkCancelToken)\n }\n })\n }\n clearQueue(queueKey)\n forceReloadFileInput(queueKey)\n }\n\n function forceReloadFileInput(queueKey: UploadQueueKey) {\n createQueue(queueKey)\n const queue = queues.value.get(queueKey)\n if (!queue) return\n queue.fileInputKey++\n }\n\n function getQueueFileInputKey(queueKey: UploadQueueKey) {\n const queue = queues.value.get(queueKey)\n if (!queue) return -1\n return queue.fileInputKey\n }\n\n function clearQueue(queueKey: UploadQueueKey) {\n const queue = queues.value.get(queueKey)\n if (!queue) return\n queues.value.set(queueKey, {\n items: [],\n totalCount: 0,\n processedCount: 0,\n fileInputKey: getQueueFileInputKey(queueKey) + 1,\n suggestions: { newKeywordNames: new Set<string>(), newAuthorNames: new Set<string>() },\n })\n }\n\n function getQueueItemsTypes(queueKey: UploadQueueKey) {\n const types: Array<DamAssetTypeType> = []\n const queue = queues.value.get(queueKey)\n if (!queue) return types\n if (queue.items.length > 0) {\n for (let i = 0; i < queue.items.length; i++) {\n if (types.includes(queue.items[i].assetType)) {\n continue\n }\n types.push(queue.items[i].assetType)\n }\n }\n return types\n }\n\n return {\n getQueue,\n getQueueItems,\n addByFiles,\n queueItemProcessed,\n queueItemDuplicate,\n queueItemFailed,\n removeByIndex,\n stopItemUpload,\n getQueueTotalCount,\n getQueueProcessedCount,\n stopUpload,\n getQueueItemsTypes,\n updateFromDetail,\n forceReloadFileInput,\n }\n})\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nexport const apiDeleteOne = <T, R = T>(\n client: () => AxiosInstance,\n urlTemplate: string,\n urlParams: UrlParams = {},\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n client()\n .delete(replaceUrlParameters(urlTemplate, urlParams), options)\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n return resolve(res.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve(null as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import type { AxiosInstance, AxiosResponse } from 'axios'\nimport { apiCreateOne } from '@/services/api/apiCreateOne'\nimport { apiUpdateOne } from '@/services/api/apiUpdateOne'\nimport { apiDeleteOne } from '@/services/api/apiDeleteOne'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport type { IntegerId } from '@/types/common'\nimport type { ImageAware, ImageCreateUpdateAware } from '@/types/ImageAware'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport { HTTP_STATUS_OK } from '@/composables/statusCodes'\n\nconst END_POINT = '/adm/v1/image'\nexport const ENTITY = 'image'\nexport const SYSTEM_CMS = 'cms'\n\nconst BULK_METADATA_LIMIT = 20\n\nexport const fetchImageListByIds = (client: () => AxiosInstance, ids: IntegerId[]) =>\n apiFetchByIds<ImageAware[]>(client, ids, END_POINT, {}, SYSTEM_CMS, ENTITY)\n\nexport const fetchImage = (client: () => AxiosInstance, id: IntegerId) =>\n apiFetchOne<ImageAware>(client, END_POINT + '/:id', { id }, SYSTEM_CMS, ENTITY)\n\nexport const createImage = (client: () => AxiosInstance, data: ImageCreateUpdateAware) =>\n apiCreateOne<ImageCreateUpdateAware, ImageAware>(client, data, END_POINT, {}, SYSTEM_CMS, ENTITY)\n\nexport const updateImage = (client: () => AxiosInstance, id: IntegerId, data: ImageCreateUpdateAware) =>\n apiUpdateOne<ImageCreateUpdateAware, ImageAware>(client, data, END_POINT + '/:id', { id }, SYSTEM_CMS, ENTITY)\n\nexport const deleteImage = (client: () => AxiosInstance, id: IntegerId) =>\n apiDeleteOne<ImageAware>(client, END_POINT + '/:id', { id }, SYSTEM_CMS, ENTITY)\n\nexport const bulkUpdateImages = (client: () => AxiosInstance, items: ImageCreateUpdateAware[]) => {\n return new Promise<ImageAware[]>((resolve, reject) => {\n updateImagesSequence(client, items)\n .then((responses) => {\n if (items.length === 0) {\n return resolve([])\n } else if (responses.length === 0) {\n return reject(responses)\n } else if (\n responses.every((res) => {\n return res.status === HTTP_STATUS_OK\n })\n ) {\n const images: ImageAware[] = responses.flatMap(response => response.data.images)\n return resolve(images)\n } else {\n return reject(responses)\n }\n })\n .catch((err) => {\n //\n return reject(err)\n })\n })\n}\n\nasync function updateImagesSequence(client: () => AxiosInstance, items: ImageCreateUpdateAware[]) {\n const totalCalls = Math.ceil(items.length / BULK_METADATA_LIMIT)\n const responses: AxiosResponse[] = []\n if (items.length === 0) return Promise.resolve([])\n\n for (let i = 0; i < totalCalls; i++) {\n const offset = i * BULK_METADATA_LIMIT\n const reduced = items.slice(offset, offset + BULK_METADATA_LIMIT)\n const reqData = { images: reduced }\n const res = await client().put(END_POINT, JSON.stringify(reqData))\n responses.push(res)\n }\n return responses\n}\n","<script lang=\"ts\" setup>\nimport { ref, toRefs, watch } from 'vue'\nimport imagePlaceholderPath from '@/assets/image/placeholder16x9.jpg'\nimport type { ImageAware, ImageCreateUpdateAware } from '@/types/ImageAware'\nimport { cloneDeep, isNumber } from '@/utils/common'\nimport { useCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\nimport { useImageActions } from '@/components/damImage/composables/imageActions'\nimport type { IntegerIdNullable } from '@/types/common'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { fetchImage } from '@/components/damImage/uploadQueue/api/imageApi'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerIdNullable | undefined\n image?: ImageAware | ImageCreateUpdateAware | undefined | null // optional, if available, no need to fetch image data\n configName?: string\n label?: string | undefined\n width?: number | undefined\n disableAspectRatio?: boolean\n aspectRatio?: number | string\n showDescription?: boolean\n showSource?: boolean\n damWidth?: undefined | number\n damHeight?: undefined | number\n }>(),\n {\n configName: 'default',\n label: undefined,\n image: undefined,\n width: undefined,\n disableAspectRatio: false,\n aspectRatio: 1.777, // 16/9\n showDescription: false,\n showSource: false,\n damWidth: undefined,\n damHeight: undefined,\n }\n)\n\nconst { showErrorsDefault } = useAlerts()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst imageOptions = useCommonAdminImageOptions(props.configName)\nconst { imageClient } = imageOptions\nconst { widgetImageToDamImageUrl } = useImageActions(imageOptions)\n\nconst resImage = ref<null | ImageAware | ImageCreateUpdateAware>(null)\n\nconst { image, modelValue } = toRefs(props)\n\nconst resolvedSrc = ref('')\n\nconst { t } = useI18n()\n\nconst getImageUrl = (image: ImageAware | ImageCreateUpdateAware) => {\n if (isNumber(props.damWidth) && isNumber(props.damHeight)) {\n return widgetImageToDamImageUrl(image, props.damWidth, props.damHeight)\n }\n return widgetImageToDamImageUrl(image)\n}\n\nwatch(\n [image, modelValue],\n async ([newImage, newImageId]) => {\n resImage.value = null\n resolvedSrc.value = imagePlaceholderPath\n if (newImage) {\n resImage.value = cloneDeep(newImage)\n if (resImage.value) {\n resolvedSrc.value = getImageUrl(resImage.value)\n }\n return\n }\n if (newImageId) {\n try {\n resImage.value = await fetchImage(imageClient, newImageId)\n } catch (error) {\n showErrorsDefault(error)\n }\n if (resImage.value) {\n resolvedSrc.value = getImageUrl(resImage.value)\n }\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <h4\n v-if=\"label\"\n class=\"font-weight-bold text-subtitle-2\"\n >\n {{ label }}\n </h4>\n <VImg\n :lazy-src=\"imagePlaceholderPath\"\n :src=\"resolvedSrc\"\n :width=\"width\"\n cover\n max-width=\"100%\"\n class=\"disable-radius\"\n :aspect-ratio=\"disableAspectRatio ? undefined : aspectRatio\"\n >\n <template #placeholder>\n <div class=\"d-flex align-center justify-center h-100\">\n <VProgressCircular\n indeterminate\n color=\"grey-lighten-4\"\n />\n </div>\n </template>\n </VImg>\n <div class=\"pa-2\">\n <VRow\n v-if=\"showDescription && resImage\"\n dense\n >\n <VCol>\n <span class=\"text-caption text-medium-emphasis\">{{ t('common.damImage.image.model.texts.description') }}:</span>\n <br>{{ resImage.texts.description }}\n </VCol>\n </VRow>\n <VRow\n v-if=\"showSource && resImage\"\n dense\n >\n <VCol>\n <span class=\"text-caption text-medium-emphasis\"> {{ t('common.damImage.image.model.texts.source') }}:</span>\n <br>{{ resImage.texts.source }}\n </VCol>\n </VRow>\n </div>\n <slot\n name=\"append\"\n :image=\"resImage\"\n />\n</template>\n\n<style lang=\"scss\">\n.v-img.disable-radius .v-img__img {\n border-radius: 0;\n}\n</style>\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport type { ImageCreateUpdateAware, ImageCreateUpdateAwareKeyed } from '@/types/ImageAware'\nimport { cloneDeep, isNull } from '@/utils/common'\n\nexport const useImageStore = defineStore('commonImageStore', () => {\n const images = ref<ImageCreateUpdateAwareKeyed[]>([])\n const imageDetail = ref<ImageCreateUpdateAware | null>(null)\n const maxPosition = ref(0)\n\n function setImageDetail(data: ImageCreateUpdateAware | null) {\n if (isNull(data)) imageDetail.value = null\n imageDetail.value = cloneDeep(data)\n }\n\n function setImages(data: ImageCreateUpdateAwareKeyed[]) {\n images.value = data\n }\n\n function addImages(data: ImageCreateUpdateAwareKeyed[]) {\n images.value.push(...data)\n }\n\n function updateMaxPositionIfGreater(newPosition: number) {\n if (newPosition > maxPosition.value) {\n maxPosition.value = newPosition\n }\n }\n\n function removeImageByIndex(index: number) {\n images.value.splice(index, 1)\n }\n\n function reset() {\n images.value = []\n imageDetail.value = null\n }\n\n return {\n images,\n imageDetail,\n maxPosition,\n setImages,\n addImages,\n setImageDetail,\n updateMaxPositionIfGreater,\n removeImageByIndex,\n reset,\n }\n})\n","import type { Ref } from 'vue'\nimport { computed } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport type { ImageCreateUpdateAware } from '@/types/ImageAware'\n\nexport const ADamAssetMetadataValidationScopeSymbol = Symbol.for('anzu:common:asset-metadata-validation-scope')\n\nexport const AImageMetadataValidationScopeSymbol = Symbol.for('anzu:common:image-validation-scope')\n\nexport const ADamKeywordCreateValidationScopeSymbol = Symbol.for('anzu:common:keyword-create-validation-scope')\n\nexport const ADamAuthorCreateValidationScopeSymbol = Symbol.for('anzu:common:author-create-validation-scope')\n\nconst { required, maxLength } = useValidate()\n\nexport function useImageValidation(\n image: Ref<ImageCreateUpdateAware | null>,\n) {\n const rules = computed(() => ({\n image: {\n texts: {\n source: {\n required,\n maxLength: maxLength(255),\n },\n },\n },\n }))\n const v$ = useVuelidate(rules, { image }, { $scope: AImageMetadataValidationScopeSymbol })\n\n return {\n v$,\n }\n}\n","<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport AImageWidgetSimple from '@/components/damImage/AImageWidgetSimple.vue'\nimport AFormTextarea from '@/components/form/AFormTextarea.vue'\nimport { useImageStore } from '@/components/damImage/uploadQueue/composables/imageStore'\nimport { storeToRefs } from 'pinia'\nimport type { DocId } from '@/types/common'\nimport { isNull } from '@/utils/common'\nimport { useImageValidation } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport { useAlerts } from '@/composables/system/alerts'\n\nwithDefaults(\n defineProps<{\n modelValue: boolean\n saving: boolean\n loading: boolean\n expand?: boolean\n }>(),\n {\n expand: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'editAsset', data: DocId): void\n (e: 'onConfirm'): void\n (e: 'onClose'): void\n}>()\n\nconst { t } = useI18n()\nconst imageStore = useImageStore()\nconst { imageDetail } = storeToRefs(imageStore)\n\nconst { v$ } = useImageValidation(imageDetail)\n\nconst { showValidationError } = useAlerts()\n\nconst onConfirm = () => {\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n return\n }\n emit('onConfirm')\n}\n\nconst onDialogModelUpdate = (newValue: boolean) => {\n if (newValue) return\n emit('onClose')\n}\n\nconst onEditAsset = () => {\n if (isNull(imageDetail.value)) return\n emit('editAsset', imageDetail.value.dam.damId)\n}\n\ndefineExpose({\n confirm: onConfirm,\n})\n</script>\n\n<template>\n <div v-if=\"expand\">\n <VRow v-if=\"loading\">\n <VCol>\n <div class=\"d-flex align-center justify-center\">\n <VProgressCircular indeterminate />\n </div>\n </VCol>\n </VRow>\n <VRow v-if=\"imageDetail\">\n <VCol>\n <VBtn @click.stop=\"onEditAsset\">\n {{ t('common.damImage.image.button.editAsset') }}\n </VBtn>\n </VCol>\n </VRow>\n <VRow v-if=\"imageDetail\">\n <VCol>\n <AFormTextarea\n v-model=\"imageDetail.texts.description\"\n :label=\"t('common.damImage.image.model.texts.description')\"\n :help=\"t('common.damImage.image.help.texts.description')\"\n />\n </VCol>\n </VRow>\n <VRow v-if=\"imageDetail\">\n <VCol>\n <AFormTextarea\n v-model=\"imageDetail.texts.source\"\n :label=\"t('common.damImage.image.model.texts.source')\"\n :v=\"v$.image.texts.source\"\n />\n </VCol>\n </VRow>\n </div>\n <VDialog\n v-else\n :model-value=\"modelValue\"\n :max-width=\"500\"\n eager\n @update:model-value=\"onDialogModelUpdate\"\n >\n <VCard v-if=\"modelValue\">\n <ADialogToolbar @on-cancel=\"onDialogModelUpdate(false)\">\n {{ t('common.damImage.image.meta.edit') }}\n </ADialogToolbar>\n <VCardText>\n <div\n v-if=\"loading\"\n class=\"d-flex align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <div\n v-else-if=\"imageDetail\"\n class=\"position-relative\"\n >\n <div class=\"my-4\">\n <AImageWidgetSimple\n :model-value=\"imageDetail.id\"\n :image=\"imageDetail\"\n />\n </div>\n <VRow>\n <VCol>\n <VBtn @click.stop=\"onEditAsset\">\n {{ t('common.damImage.image.button.editAsset') }}\n </VBtn>\n </VCol>\n </VRow>\n <VRow>\n <VCol>\n <AFormTextarea\n v-model=\"imageDetail.texts.description\"\n :label=\"t('common.damImage.image.model.texts.description')\"\n :help=\"t('common.damImage.image.help.texts.description')\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol>\n <AFormTextarea\n v-model=\"imageDetail.texts.source\"\n :label=\"t('common.damImage.image.model.texts.source')\"\n :v=\"v$.image.texts.source\"\n />\n </VCol>\n </VRow>\n </div>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnPrimary\n :loading=\"saving\"\n :disabled=\"loading\"\n @click.stop=\"onConfirm\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport type { AssetDetailItemDto } from '@/types/coreDam/Asset'\nimport type { DocId } from '@/types/common'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nexport const AssetDetailTabImageWithRoi = {\n Info: 'meta',\n ROI: 'roi',\n} as const\nexport type AssetDetailTabImageWithRoiType =\n (typeof AssetDetailTabImageWithRoi)[keyof typeof AssetDetailTabImageWithRoi]\nexport const AssetDetailTabImageWithRoiDefault = AssetDetailTabImageWithRoi.Info\n\nexport const useAssetDetailStore = defineStore('commonAssetDetailStore', () => {\n const asset = ref<AssetDetailItemDto | null>(null)\n const authorConflicts = ref<DocId[]>([])\n const dialog = ref<null | UploadQueueKey>(null)\n const loading = ref(false)\n const metadataAreTouched = ref(false)\n const activeTab = ref<AssetDetailTabImageWithRoiType>(AssetDetailTabImageWithRoiDefault)\n const updateUploadStore = ref(false)\n const mainFileSingleUse = ref(false)\n\n function setAsset(data: AssetDetailItemDto | null) {\n asset.value = data\n mainFileSingleUse.value = data?.mainFileSingleUse || false\n }\n\n function reset() {\n asset.value = null\n mainFileSingleUse.value = false\n }\n\n return {\n metadataAreTouched,\n authorConflicts,\n asset,\n loading,\n dialog,\n activeTab,\n updateUploadStore,\n mainFileSingleUse,\n setAsset,\n reset,\n }\n})\n","<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/themeSettings'\n\nconst emit = defineEmits<{\n (e: 'closeDialog'): void\n}>()\n\nconst { toolbarColor } = useTheme()\n\nconst closeDialog = () => {\n emit('closeDialog')\n}\n</script>\n\n<template>\n <VCard class=\"dam-image-detail\">\n <div class=\"d-flex flex-column w-100 h-100\">\n <VToolbar\n :color=\"toolbarColor\"\n density=\"compact\"\n :height=\"64\"\n class=\"system-border-b\"\n >\n <div class=\"text-subtitle-2 d-flex\" />\n <VSpacer />\n <div>\n <VBtn\n icon\n variant=\"text\"\n :width=\"36\"\n :height=\"36\"\n class=\"mr-1\"\n @click.stop=\"closeDialog\"\n >\n <VIcon icon=\"mdi-close\" />\n </VBtn>\n </div>\n </VToolbar>\n <div class=\"d-flex w-100 h-100 justify-center align-center\">\n <VProgressCircular\n indeterminate\n color=\"primary\"\n />\n </div>\n </div>\n </VCard>\n</template>\n","import { useI18n } from 'vue-i18n'\n\nconst MINUTE_IN_SECONDS = 60\nconst HOUR_IN_SECONDS = 3600\nconst DAY_IN_SECONDS = 86400\n\nexport function useRemainingTime() {\n const { t } = useI18n()\n\n const remainingTime = (seconds: number, short: boolean): string => {\n const prefix = short ? 'common.time.short.' : 'common.time.long.'\n if (seconds > DAY_IN_SECONDS) {\n return t(prefix + 'remainingDays', { value: Math.floor(seconds / DAY_IN_SECONDS) })\n }\n if (seconds > HOUR_IN_SECONDS) {\n return t(prefix + 'remainingHours', { value: Math.floor(seconds / HOUR_IN_SECONDS) })\n }\n if (seconds > MINUTE_IN_SECONDS) {\n return t(prefix + 'remainingMinutes', { value: Math.floor(seconds / MINUTE_IN_SECONDS) })\n }\n return t(prefix + 'remainingSeconds', { value: seconds })\n }\n\n const remainingTimeShort = (seconds: number): string => {\n return remainingTime(seconds, true)\n }\n\n const remainingTimeLong = (seconds: number): string => {\n return remainingTime(seconds, false)\n }\n\n return {\n remainingTimeShort,\n remainingTimeLong,\n }\n}\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='_2K'%20data-name='2K'%20transform='translate(-10480%20-9321)'%3e%3cg%20id='Group_2714'%20data-name='Group%202714'%20transform='translate(4751%201906)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5729%207415)'%20opacity='0.5'/%3e%3c/g%3e%3cpath%20id='Path_7179'%20data-name='Path%207179'%20d='M-13.982,7.587a11.158,11.158,0,0,1,1.1-4.668q1-2.375,4.717-5.028A34.591,34.591,0,0,0-3.991-5.417,4.889,4.889,0,0,0-2.534-8.824a3.774,3.774,0,0,0-.835-2.506,2.942,2.942,0,0,0-2.391-1,2.916,2.916,0,0,0-2.9,1.589,7.879,7.879,0,0,0-.524,2.915H-13.72a11.461,11.461,0,0,1,1.1-4.9q1.869-3.554,6.64-3.554a8.425,8.425,0,0,1,6,2.088A7.216,7.216,0,0,1,2.249-8.66,7.473,7.473,0,0,1,.673-3.976a15.678,15.678,0,0,1-3.4,3.03L-4.594.381Q-6.35,1.625-7,2.182A5.279,5.279,0,0,0-8.086,3.476H2.282V7.587ZM6.261-16.554h4.963v9.946l9.327-9.946H27.07L17.163-6.625,27.578,7.587H21.092L13.654-2.951,11.224-.487V7.587H6.261Z'%20transform='translate(10522.981%209375.554)'%20fill='%23fff'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='_4K'%20data-name='4K'%20transform='translate(-10580%20-9321)'%3e%3cg%20id='Group_2715'%20data-name='Group%202715'%20transform='translate(4851%201906)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5729%207415)'%20opacity='0.5'/%3e%3c/g%3e%3cpath%20id='Path_7180'%20data-name='Path%207180'%20d='M2.562,2.477H-.124v5.11H-4.693V2.477h-9.4V-1.6l8.73-14.412H-.124V-1.175H2.562ZM-4.693-1.175V-11.4L-10.621-1.175ZM6.313-16.554h4.963v9.946L20.6-16.554h6.518L17.214-6.625,27.629,7.587H21.143L13.705-2.951,11.275-.487V7.587H6.313Z'%20transform='translate(10623.095%209375.554)'%20fill='%23fff'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='_8K'%20data-name='8K'%20transform='translate(-10680%20-9321)'%3e%3cg%20id='Group_2716'%20data-name='Group%202716'%20transform='translate(4951%201906)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5729%207415)'%20opacity='0.5'/%3e%3c/g%3e%3cpath%20id='Path_7181'%20data-name='Path%207181'%20d='M-9.246.692A3.814,3.814,0,0,0-8.337,3.41a3.284,3.284,0,0,0,2.514.966A3.284,3.284,0,0,0-3.309,3.41,3.814,3.814,0,0,0-2.4.692a3.78,3.78,0,0,0-.925-2.76,3.342,3.342,0,0,0-2.5-.942,3.342,3.342,0,0,0-2.5.942A3.78,3.78,0,0,0-9.246.692ZM-14.094,1a7.31,7.31,0,0,1,.9-3.619,5.734,5.734,0,0,1,2.645-2.44A5.548,5.548,0,0,1-12.79-7.538a6.929,6.929,0,0,1-.518-2.5,5.823,5.823,0,0,1,1.953-4.414A7.769,7.769,0,0,1-5.84-16.275,7.769,7.769,0,0,1-.324-14.449a5.823,5.823,0,0,1,1.953,4.414,6.952,6.952,0,0,1-.516,2.5A4.77,4.77,0,0,1-1.123-5.221a6.6,6.6,0,0,1,2.649,2.6A7.406,7.406,0,0,1,2.415,1,6.768,6.768,0,0,1,.193,6.1a8.664,8.664,0,0,1-6.205,2.1q-3.984,0-6.033-2.1A7.043,7.043,0,0,1-14.094,1ZM-8.837-9.511A2.9,2.9,0,0,0-8.04-7.4a2.939,2.939,0,0,0,2.209.819A2.906,2.906,0,0,0-3.623-7.4a2.937,2.937,0,0,0,.78-2.113,3.009,3.009,0,0,0-.78-2.2,2.956,2.956,0,0,0-2.209-.794,2.99,2.99,0,0,0-2.209.794A2.972,2.972,0,0,0-8.837-9.511Zm15.15-7.042h4.963v9.946L20.6-16.554h6.518L17.214-6.625,27.629,7.587H21.143L13.705-2.951,11.275-.487V7.587H6.313Z'%20transform='translate(10723.095%209375.554)'%20fill='%23fff'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='QHD'%20transform='translate(-10380%20-9321)'%3e%3cg%20id='Group_2713'%20data-name='Group%202713'%20transform='translate(4651%201906)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5729%207415)'%20opacity='0.5'/%3e%3c/g%3e%3cpath%20id='Path_7178'%20data-name='Path%207178'%20d='M-12.888,4.215A6.477,6.477,0,0,0-11.217,4a8.316,8.316,0,0,0,1.131-.41L-12.53,1.267l2.592-2.706L-7.485.872a11.391,11.391,0,0,0,.8-2.063,11.878,11.878,0,0,0,.36-3.095,10.307,10.307,0,0,0-1.662-6.28,5.692,5.692,0,0,0-4.856-2.219,5.922,5.922,0,0,0-4.782,2.129q-1.785,2.129-1.785,6.371,0,4.962,2.556,7.108A5.958,5.958,0,0,0-12.888,4.215Zm11.61-8.86A16.059,16.059,0,0,1-2.065.76,8.992,8.992,0,0,1-3.942,4.209l2.772,2.61L-3.8,9.564-6.7,6.813A12.165,12.165,0,0,1-9,7.947a12.314,12.314,0,0,1-3.885.543,11.121,11.121,0,0,1-7.8-2.817q-3.738-3.39-3.738-9.957,0-6.616,3.832-10.007a11.313,11.313,0,0,1,7.78-2.768,11.157,11.157,0,0,1,7.861,2.932Q-1.278-10.737-1.278-4.645ZM2.538,7.818v-24.14H7.549v9.2h9.385v-9.2h5.012V7.818H16.934V-2.958H7.549V7.818ZM31.691-12.129V3.626H36.35A5.031,5.031,0,0,0,41.336.1a12.4,12.4,0,0,0,.771-4.6,11.315,11.315,0,0,0-1.156-5.658q-1.156-1.973-4.6-1.973ZM37.2-16.322a12.707,12.707,0,0,1,3.737.524,7.976,7.976,0,0,1,4.114,3.063,10.738,10.738,0,0,1,1.721,3.9,18.7,18.7,0,0,1,.459,4A16.034,16.034,0,0,1,45.3,3.314a8.728,8.728,0,0,1-8.1,4.5H26.794v-24.14Z'%20transform='translate(10418.421%209375.059)'%20fill='%23fff'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='Full_HD'%20data-name='Full%20HD'%20transform='translate(-10280%20-9321)'%3e%3cg%20id='Group_2712'%20data-name='Group%202712'%20transform='translate(4551%201906)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5729%207415)'%20opacity='0.5'/%3e%3c/g%3e%3cpath%20id='Path_7177'%20data-name='Path%207177'%20d='M-21.883-16.521H-4.669v4.242h-12.2v5.552H-6.176v4.193H-16.871V7.587h-5.012ZM-1.426,7.587v-24.14H3.585v9.2H12.97v-9.2h5.012V7.587H12.97V-3.19H3.585V7.587ZM27.727-12.361V3.394h4.659A5.031,5.031,0,0,0,37.372-.127a12.4,12.4,0,0,0,.771-4.6,11.315,11.315,0,0,0-1.156-5.658q-1.156-1.973-4.6-1.973Zm5.511-4.193a12.707,12.707,0,0,1,3.737.524,7.976,7.976,0,0,1,4.114,3.063,10.738,10.738,0,0,1,1.721,3.9,18.7,18.7,0,0,1,.459,4,16.034,16.034,0,0,1-1.934,8.156,8.728,8.728,0,0,1-8.1,4.5H22.83v-24.14Z'%20transform='translate(10318.883%209375.554)'%20fill='%23fff'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='Slot'%20transform='translate(-10080%20-9321)'%3e%3cg%20id='Group_2710'%20data-name='Group%202710'%20transform='translate(10080%209321)'%3e%3cg%20id='Group_2668'%20data-name='Group%202668'%20transform='translate(0%200)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20opacity='0.5'/%3e%3c/g%3e%3c/g%3e%3cg%20id='Group_2711'%20data-name='Group%202711'%20transform='translate(10108.517%209349.516)'%3e%3cg%20id='Layer_2'%20data-name='Layer%202'%20transform='translate(0%200)'%3e%3cpath%20id='Path_7172'%20data-name='Path%207172'%20d='M18.322,17H9.371A5.371,5.371,0,0,0,4,22.371v8.951a5.371,5.371,0,0,0,5.371,5.371h8.951a5.371,5.371,0,0,0,5.371-5.371V22.371A5.371,5.371,0,0,0,18.322,17Zm1.79,14.322a1.79,1.79,0,0,1-1.79,1.79H9.371a1.79,1.79,0,0,1-1.79-1.79V22.371a1.79,1.79,0,0,1,1.79-1.79h8.951a1.79,1.79,0,0,1,1.79,1.79Z'%20transform='translate(-4%206.273)'%20fill='%23fff'/%3e%3cpath%20id='Path_7173'%20data-name='Path%207173'%20d='M31.322,17H22.371A5.371,5.371,0,0,0,17,22.371v8.951a5.371,5.371,0,0,0,5.371,5.371h8.951a5.371,5.371,0,0,0,5.371-5.371V22.371A5.371,5.371,0,0,0,31.322,17Zm1.79,14.322a1.79,1.79,0,0,1-1.79,1.79H22.371a1.79,1.79,0,0,1-1.79-1.79V22.371a1.79,1.79,0,0,1,1.79-1.79h8.951a1.79,1.79,0,0,1,1.79,1.79Z'%20transform='translate(6.273%206.273)'%20fill='%23fff'/%3e%3cpath%20id='Path_7174'%20data-name='Path%207174'%20d='M18.322,4H9.371A5.371,5.371,0,0,0,4,9.371v8.951a5.371,5.371,0,0,0,5.371,5.371h8.951a5.371,5.371,0,0,0,5.371-5.371V9.371A5.371,5.371,0,0,0,18.322,4Zm1.79,14.322a1.79,1.79,0,0,1-1.79,1.79H9.371a1.79,1.79,0,0,1-1.79-1.79V9.371a1.79,1.79,0,0,1,1.79-1.79h8.951a1.79,1.79,0,0,1,1.79,1.79Z'%20transform='translate(-4%20-4)'%20fill='%23fff'/%3e%3cpath%20id='Path_7175'%20data-name='Path%207175'%20d='M18.79,15.637h6.266V21.9a1.79,1.79,0,1,0,3.581,0V15.637H34.9a1.79,1.79,0,1,0,0-3.581H28.637V5.79a1.79,1.79,0,0,0-3.581,0v6.266H18.79a1.79,1.79,0,0,0,0,3.581Z'%20transform='translate(6.273%20-4)'%20fill='%23fff'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cg%20id='Low'%20transform='translate(-10180%20-9321)'%3e%3cg%20id='Group_2709'%20data-name='Group%202709'%20transform='translate(4451%201906)'%3e%3ccircle%20id='Ellipse_18'%20data-name='Ellipse%2018'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5729%207415)'%20opacity='0.5'/%3e%3c/g%3e%3cpath%20id='Path_7176'%20data-name='Path%207176'%20d='M-14.218-16.322h5.044v19.8H2.881v4.34h-17.1ZM16.9,4.215A6.477,6.477,0,0,0,18.574,4a8.316,8.316,0,0,0,1.131-.41L17.261,1.267l2.592-2.706L22.306.872a11.391,11.391,0,0,0,.8-2.063,11.878,11.878,0,0,0,.36-3.095,10.307,10.307,0,0,0-1.662-6.28,5.692,5.692,0,0,0-4.856-2.219,5.922,5.922,0,0,0-4.782,2.129q-1.785,2.129-1.785,6.371,0,4.962,2.556,7.108A5.958,5.958,0,0,0,16.9,4.215Zm11.61-8.86a16.059,16.059,0,0,1-.786,5.4,8.992,8.992,0,0,1-1.877,3.449l2.772,2.61L25.99,9.564l-2.9-2.751A12.165,12.165,0,0,1,20.8,7.947a12.314,12.314,0,0,1-3.885.543,11.121,11.121,0,0,1-7.8-2.817Q5.37,2.283,5.37-4.285,5.37-10.9,9.2-14.291a11.313,11.313,0,0,1,7.78-2.768,11.157,11.157,0,0,1,7.861,2.932Q28.513-10.737,28.513-4.645Z'%20transform='translate(10222.799%209374.746)'%20fill='%23fff'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%3e%3cdefs%3e%3cclipPath%20id='clip-path'%3e%3cpath%20id='Path_7158'%20data-name='Path%207158'%20d='M0,349.208A5.911,5.911,0,1,0,5.911,343.3,5.911,5.911,0,0,0,0,349.208'%20transform='translate(0%20-343.297)'%20fill='%23fff'/%3e%3c/clipPath%3e%3cclipPath%20id='clip-path-2'%3e%3cpath%20id='Path_7159'%20data-name='Path%207159'%20d='M0,167.86a20.2,20.2,0,0,1,20.2,20.2h8.375A28.572,28.572,0,0,0,0,159.485Z'%20transform='translate(-0.001%20-159.485)'%20fill='%23fff'/%3e%3c/clipPath%3e%3cclipPath%20id='clip-path-3'%3e%3cpath%20id='Path_7160'%20data-name='Path%207160'%20d='M0,0V8.621A34.483,34.483,0,0,1,34.484,43.1h8.621A43.1,43.1,0,0,0,0,0Z'%20transform='translate(-0.001%200)'%20fill='%23fff'/%3e%3c/clipPath%3e%3c/defs%3e%3cg%20id='RSS'%20transform='translate(-5652%20-7415)'%3e%3ccircle%20id='Ellipse_16'%20data-name='Ellipse%2016'%20cx='50'%20cy='50'%20r='50'%20transform='translate(5652%207415)'%20opacity='0.5'/%3e%3cg%20id='Group_2625'%20data-name='Group%202625'%20transform='translate(5683.674%207441.939)'%3e%3cg%20id='Group_2624'%20data-name='Group%202624'%20transform='translate(0)'%3e%3cg%20id='Group_2619'%20data-name='Group%202619'%20transform='translate(0%2031.281)'%3e%3cg%20id='Group_2618'%20data-name='Group%202618'%20clip-path='url(%23clip-path)'%3e%3crect%20id='Rectangle_2677'%20data-name='Rectangle%202677'%20width='11.823'%20height='11.823'%20fill='%23fff'/%3e%3c/g%3e%3c/g%3e%3cg%20id='Group_2621'%20data-name='Group%202621'%20transform='translate(0%2014.532)'%3e%3cg%20id='Group_2620'%20data-name='Group%202620'%20clip-path='url(%23clip-path-2)'%3e%3crect%20id='Rectangle_2678'%20data-name='Rectangle%202678'%20width='28.572'%20height='28.572'%20transform='translate(0%200)'%20fill='%23fff'/%3e%3c/g%3e%3c/g%3e%3cg%20id='Group_2623'%20data-name='Group%202623'%20transform='translate(0)'%3e%3cg%20id='Group_2622'%20data-name='Group%202622'%20clip-path='url(%23clip-path-3)'%3e%3crect%20id='Rectangle_2679'%20data-name='Rectangle%202679'%20width='43.104'%20height='43.104'%20transform='translate(0)'%20fill='%23fff'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import svg2k from '@/assets/dam-meta-icons/2k.svg'\nimport svg4k from '@/assets/dam-meta-icons/4k.svg'\nimport svg8k from '@/assets/dam-meta-icons/8k.svg'\nimport svgqhd from '@/assets/dam-meta-icons/qhd.svg'\nimport svgfhd from '@/assets/dam-meta-icons/fhd.svg'\nimport svgslot from '@/assets/dam-meta-icons/slot.svg'\nimport svglow from '@/assets/dam-meta-icons/low.svg'\nimport svgrss from '@/assets/dam-meta-icons/rss.svg'\n\nexport const DIMENSIONS_CONFIG = [\n {\n titleT: 'common.damImage.asset.metaIcons.fullHd',\n width: 1920,\n height: 1080,\n svgSrc: svgfhd,\n },\n {\n titleT: 'common.damImage.asset.metaIcons.2k',\n width: 2048,\n height: 1080,\n svgSrc: svg2k,\n },\n {\n titleT: 'common.damImage.asset.metaIcons.qhd',\n width: 2560,\n height: 1440,\n svgSrc: svgqhd,\n },\n {\n titleT: 'common.damImage.asset.metaIcons.4k',\n width: 3840,\n height: 2160,\n svgSrc: svg4k,\n },\n {\n titleT: 'common.damImage.asset.metaIcons.8k',\n width: 7680,\n height: 4320,\n svgSrc: svg8k,\n },\n]\nexport const ICON_SLOTS = svgslot\nexport const ICON_RSS = svgrss\nexport const ICON_LOW = svglow\nexport const LOW_DIMENSION = 600\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { type AssetFileProperties, DamAssetType, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport {\n DIMENSIONS_CONFIG,\n ICON_LOW,\n ICON_RSS,\n ICON_SLOTS,\n LOW_DIMENSION,\n} from '@/components/damImage/uploadQueue/composables/assetImageIconsConfig'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\n\nconst props = withDefaults(\n defineProps<{\n assetType: DamAssetTypeType\n assetFileProperties: AssetFileProperties\n disableAbsolute?: boolean\n }>(),\n {\n disableAbsolute: false,\n }\n)\n\nconst { t } = useI18n()\n\nconst checkDimensions = (icons: string[], titles: string[]) => {\n if (props.assetFileProperties.width === 0 || props.assetFileProperties.height === 0) {\n return\n }\n if (props.assetFileProperties.width < LOW_DIMENSION || props.assetFileProperties.height < LOW_DIMENSION) {\n icons.push(ICON_LOW)\n titles.push(t('common.damImage.asset.metaIcons.low'))\n return\n }\n if (props.assetType !== DamAssetType.Video) return\n for (let i = 0; i < DIMENSIONS_CONFIG.length; i++) {\n if (\n props.assetFileProperties.width === DIMENSIONS_CONFIG[i].width &&\n props.assetFileProperties.height === DIMENSIONS_CONFIG[i].height\n ) {\n icons.push(DIMENSIONS_CONFIG[i].svgSrc)\n titles.push(t(DIMENSIONS_CONFIG[i].titleT))\n break\n }\n }\n}\n\nconst checkDistributions = (icons: string[], titles: string[]) => {\n const damConfigStore = useDamConfigStore()\n for (let i = 0; i < props.assetFileProperties.distributesInServices.length; i++) {\n const iconPath =\n damConfigStore.damPrvConfig.distributionServices[props.assetFileProperties.distributesInServices[i]]?.iconPath\n if (iconPath.length > 0 && !icons.includes(iconPath)) {\n icons.push(iconPath)\n titles.push(\n damConfigStore.damPrvConfig.distributionServices[props.assetFileProperties.distributesInServices[i]].title\n )\n }\n }\n}\n\nconst data = computed(() => {\n const icons: string[] = []\n const titles: string[] = []\n\n if (props.assetFileProperties.slotNames.length > 1) {\n icons.push(ICON_SLOTS)\n titles.push(t('common.damImage.asset.metaIcons.slots'))\n }\n if (props.assetFileProperties.fromRss) {\n icons.push(ICON_RSS)\n titles.push(t('common.damImage.asset.metaIcons.rss'))\n }\n checkDimensions(icons, titles)\n checkDistributions(icons, titles)\n\n return { icons, titles }\n})\n</script>\n\n<template>\n <div\n v-show=\"data.icons.length > 0\"\n class=\"asset-image__meta-icons\"\n :class=\"{ 'asset-image__meta-icons-absolute': !disableAbsolute }\"\n >\n <img\n v-for=\"(item, index) in data.icons\"\n :key=\"item\"\n class=\"img-svg\"\n :src=\"item\"\n alt=\"\"\n :title=\"data.titles[index] || ''\"\n >\n </div>\n</template>\n\n<style lang=\"scss\">\n.asset-image__meta-icons-absolute {\n position: absolute;\n left: 6px;\n top: 163px;\n}\n\n.asset-image__meta-icons {\n display: flex;\n\n img.img-svg {\n height: 30px;\n padding: 2px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport placeholder16x9 from '@/assets/image/placeholder16x9.jpg'\nimport {\n type AssetFileProperties,\n DamAssetStatus,\n type DamAssetStatusType,\n DamAssetType,\n type DamAssetTypeType\n} from '@/types/coreDam/Asset'\nimport { isUndefined } from '@/utils/common'\nimport { useRemainingTime } from '@/composables/datetime/remainingTime'\nimport AssetImageMetaIcons from '@/components/damImage/uploadQueue/components/AssetImageMetaIcons.vue'\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n assetType?: DamAssetTypeType\n assetStatus?: DamAssetStatusType\n backgroundColor?: string\n width?: number\n height?: number\n fallbackHeight?: number\n iconSize?: number\n useComponent?: boolean\n cover?: boolean\n aspectRatio?: number\n showUploading?: boolean\n showProcessing?: boolean\n showWaiting?: boolean\n showDone?: boolean\n uploadingColor?: string\n processingColor?: string\n disableProcessingText?: boolean\n uploadingProgress?: number | null\n remainingTime?: number | null\n hideIcon?: boolean\n showMetaIcons?: boolean\n assetFileProperties?: AssetFileProperties\n }>(),\n {\n assetType: DamAssetType.Image,\n assetStatus: DamAssetStatus.WithFile,\n src: undefined,\n backgroundColor: '#ccc',\n width: undefined,\n height: undefined,\n fallbackHeight: 200,\n iconSize: 80,\n useComponent: false,\n cover: false,\n aspectRatio: undefined,\n showUploading: false,\n showProcessing: false,\n showWaiting: false,\n showDone: false,\n uploadingColor: 'primary',\n processingColor: 'primary',\n disableProcessingText: false,\n uploadingProgress: null,\n remainingTime: null,\n hideIcon: false,\n showMetaIcons: false,\n assetFileProperties: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'load'): void\n (e: 'error'): void\n}>()\n\nconst { t } = useI18n()\n\nconst onLoad = () => {\n emit('load')\n}\nconst onError = () => {\n emit('error')\n}\n\nconst icon = computed(() => {\n if (props.assetStatus === DamAssetStatus.Deleting) return 'mdi-trash-can'\n switch (props.assetType) {\n case DamAssetType.Audio:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-music' : 'mdi-music-off'\n case DamAssetType.Document:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-note' : 'mdi-note-off'\n case DamAssetType.Video:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-video' : 'mdi-video-off'\n case DamAssetType.Image:\n return props.assetStatus === DamAssetStatus.WithFile ? 'mdi-image' : 'mdi-image-off'\n default:\n return ''\n }\n})\n\nconst uploadingPercentage = computed(() => {\n if (!props.uploadingProgress) return '0%'\n const value = Math.ceil(props.uploadingProgress)\n return value > 100 ? '100%' : value + '%'\n})\n\nconst backgroundColorComputed = computed(() => {\n const grayBackgroundStatuses: readonly DamAssetStatusType[] = [DamAssetStatus.Deleting, DamAssetStatus.Draft]\n return grayBackgroundStatuses.includes(props.assetStatus) ? '#ccc' : props.backgroundColor\n})\n\nconst iconColor = computed(() => {\n return props.assetStatus === DamAssetStatus.WithFile ? '#505050' : '#8f8f8f'\n})\n\nconst srcComputed = computed(() => {\n return isUndefined(props.src) ? placeholder16x9 : props.src\n})\n\nconst showIconComputed = computed(() => {\n if (props.hideIcon) return false\n else if (props.assetType === DamAssetType.Image && props.src) return false\n return true\n})\n\nconst { remainingTimeShort } = useRemainingTime()\n</script>\n\n<template>\n <VImg\n v-if=\"showUploading || showProcessing || showWaiting\"\n :aspect-ratio=\"aspectRatio\"\n :src=\"srcComputed\"\n :width=\"width\"\n :height=\"height\"\n :cover=\"cover\"\n class=\"asset-image asset-image--loading-bg\"\n @error=\"onError\"\n @load=\"onLoad\"\n >\n <template #placeholder />\n <template #default>\n <div\n v-if=\"showWaiting\"\n class=\"asset-image__progress\"\n >\n <VProgressCircular\n indeterminate\n :size=\"iconSize\"\n :width=\"iconSize / 10\"\n />\n <div class=\"text-caption text-center\">\n {{ t('common.damImage.upload.waiting') }}\n </div>\n </div>\n <div\n v-if=\"showProcessing\"\n class=\"asset-image__progress\"\n >\n <VProgressCircular\n :color=\"processingColor\"\n indeterminate\n :size=\"iconSize\"\n :width=\"iconSize / 10\"\n class=\"ml-auto mr-auto\"\n />\n <div\n v-if=\"!disableProcessingText\"\n class=\"text-caption text-center\"\n >\n {{ t('common.damImage.upload.processing') }}\n </div>\n </div>\n <div\n v-else-if=\"showUploading\"\n class=\"asset-image__progress\"\n >\n <VProgressCircular\n :color=\"uploadingColor\"\n :size=\"iconSize\"\n :width=\"iconSize / 10\"\n class=\"ml-auto mr-auto\"\n :model-value=\"uploadingProgress === null ? undefined : uploadingProgress\"\n >\n {{ uploadingPercentage }}\n </VProgressCircular>\n <div class=\"text-caption text-center\">\n {{ t('common.damImage.upload.uploading') }}\n <span\n v-if=\"remainingTime\"\n class=\"font-weight-bold\"\n >\n {{ remainingTimeShort(remainingTime) }}\n </span>\n </div>\n </div>\n </template>\n </VImg>\n <VImg\n v-else-if=\"assetStatus === DamAssetStatus.WithFile && src && useComponent\"\n :src=\"srcComputed\"\n :width=\"width\"\n :height=\"height\"\n class=\"asset-image asset-image--component position-relative\"\n :cover=\"cover\"\n :aspect-ratio=\"aspectRatio\"\n @load=\"onLoad\"\n @error=\"onError\"\n >\n <template #placeholder />\n <template #default>\n <div\n v-if=\"showIconComputed\"\n class=\"asset-image__icon-wrapper\"\n >\n <div\n class=\"asset-image__icon-circle\"\n :style=\"{ padding: iconSize / 4 + 'px' }\"\n >\n <VIcon\n v-if=\"icon.length\"\n :size=\"iconSize\"\n :icon=\"icon\"\n :color=\"iconColor\"\n />\n </div>\n </div>\n <div\n v-if=\"showDone\"\n class=\"asset-image__progress asset-image__progress--animate-done\"\n >\n <VIcon\n icon=\"mdi-check-circle\"\n color=\"success\"\n :size=\"iconSize\"\n />\n <div class=\"text-caption text-center\">\n {{ t('common.damImage.upload.done') }}\n </div>\n </div>\n <AssetImageMetaIcons\n v-if=\"showMetaIcons && assetFileProperties\"\n :asset-file-properties=\"assetFileProperties\"\n :asset-type=\"assetType\"\n />\n </template>\n </VImg>\n <div\n v-else-if=\"assetStatus === DamAssetStatus.WithFile && src\"\n class=\"asset-image asset-image--img position-relative\"\n >\n <img\n :src=\"srcComputed\"\n :width=\"width\"\n :height=\"height\"\n alt=\"\"\n :style=\"'background-color:' + backgroundColorComputed\"\n @onerror=\"onError\"\n >\n <div\n v-if=\"showIconComputed\"\n class=\"asset-image__icon-wrapper\"\n >\n <div\n class=\"asset-image__icon-circle\"\n :style=\"{ padding: iconSize / 4 + 'px' }\"\n >\n <VIcon\n v-if=\"icon.length\"\n :size=\"iconSize\"\n :icon=\"icon\"\n :color=\"iconColor\"\n class=\"asset-image__icon\"\n />\n </div>\n </div>\n <AssetImageMetaIcons\n v-if=\"showMetaIcons && assetFileProperties\"\n :asset-file-properties=\"assetFileProperties\"\n :asset-type=\"assetType\"\n />\n </div>\n <div\n v-else\n :style=\"{ height: fallbackHeight + 'px', backgroundColor: backgroundColorComputed, width: width + 'px' }\"\n class=\"asset-image asset-image--placeholder d-flex align-center justify-center\"\n >\n <div\n v-if=\"showIconComputed\"\n class=\"asset-image__icon-wrapper\"\n >\n <div\n class=\"asset-image__icon-circle\"\n :style=\"{ padding: iconSize / 4 + 'px' }\"\n >\n <VIcon\n v-if=\"icon.length\"\n :size=\"iconSize\"\n :icon=\"icon\"\n :color=\"iconColor\"\n class=\"asset-image__icon\"\n />\n </div>\n </div>\n <div\n v-if=\"showDone\"\n class=\"asset-image__progress asset-image__progress--animate-done\"\n >\n <VIcon\n icon=\"mdi-check-circle\"\n color=\"success\"\n :size=\"iconSize\"\n />\n <div class=\"text-caption text-center\">\n {{ t('common.damImage.upload.done') }}\n </div>\n </div>\n <AssetImageMetaIcons\n v-if=\"showMetaIcons && assetFileProperties\"\n :asset-file-properties=\"assetFileProperties\"\n :asset-type=\"assetType\"\n />\n </div>\n</template>\n","import { useI18n } from 'vue-i18n'\nimport { ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { AssetFileFailReason, type AssetFileFailReasonType } from '@/types/coreDam/AssetFile'\n\nexport function useAssetFileFailReason() {\n const { t } = useI18n()\n\n const assetFileFailReasonOptions = ref<ValueObjectOption<AssetFileFailReasonType>[]>([\n {\n value: AssetFileFailReason.None,\n title: t('common.damImage.asset.assetFileFailReason.none'),\n },\n {\n value: AssetFileFailReason.Unknown,\n title: t('common.damImage.asset.assetFileFailReason.unknown'),\n },\n {\n value: AssetFileFailReason.InvalidChecksum,\n title: t('common.damImage.asset.assetFileFailReason.invalidChecksum'),\n },\n {\n value: AssetFileFailReason.InvalidMimeType,\n title: t('common.damImage.asset.assetFileFailReason.invalidMimeType'),\n },\n {\n value: AssetFileFailReason.DownloadFailed,\n title: t('common.damImage.asset.assetFileFailReason.downloadFailed'),\n },\n {\n value: AssetFileFailReason.InvalidSize,\n title: t('common.damImage.asset.assetFileFailReason.invalidSize'),\n },\n ])\n\n const getAssetFileFailReasonOption = (value: AssetFileFailReasonType) => {\n return assetFileFailReasonOptions.value.find((item) => item.value === value)\n }\n\n return {\n assetFileFailReasonOptions,\n getAssetFileFailReasonOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { AssetFileFailReasonType } from '@/types/coreDam/AssetFile'\nimport { useAssetFileFailReason } from '@/components/damImage/uploadQueue/composables/assetFileFailReason'\nimport AChipNoLink from '@/components/AChipNoLink.vue'\n\nconst props = withDefaults(\n defineProps<{\n reason: AssetFileFailReasonType\n }>(),\n {}\n)\n\nconst { getAssetFileFailReasonOption } = useAssetFileFailReason()\nconst reasonOption = computed(() => {\n return getAssetFileFailReasonOption(props.reason)\n})\n</script>\n\n<template>\n <AChipNoLink v-if=\"reasonOption\">\n {{ reasonOption.title }}\n </AChipNoLink>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport {\n type AssetFileFailReasonType,\n AssetFileProcessStatus,\n type AssetFileProcessStatusType,\n} from '@/types/coreDam/AssetFile'\nimport { DamAssetStatus, type DamAssetStatusType } from '@/types/coreDam/Asset'\nimport AssetFileFailReasonChip from '@/components/damImage/uploadQueue/components/AssetFileFailReasonChip.vue'\n\nwithDefaults(\n defineProps<{\n assetStatus: DamAssetStatusType\n assetMainFileStatus?: AssetFileProcessStatusType | undefined\n assetMainFileFailReason?: AssetFileFailReasonType | undefined\n }>(),\n {\n assetMainFileStatus: undefined,\n assetMainFileFailReason: undefined,\n }\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n v-if=\"assetMainFileStatus && assetMainFileStatus === AssetFileProcessStatus.Duplicate\"\n class=\"w-100 pa-2 text-caption\"\n >\n <VAlert\n dark\n type=\"warning\"\n >\n {{ t('common.damImage.asset.detail.info.status.duplicate') }}\n </VAlert>\n </div>\n <div\n v-if=\"assetMainFileStatus && assetMainFileStatus === AssetFileProcessStatus.Failed\"\n class=\"w-100 pa-2 text-caption\"\n >\n <VAlert\n dark\n type=\"error\"\n >\n {{ t('common.damImage.asset.detail.info.status.failed') }}\n <div v-if=\"assetMainFileFailReason\">\n <br>\n <AssetFileFailReasonChip :reason=\"assetMainFileFailReason\" />\n </div>\n </VAlert>\n </div>\n <div\n v-else-if=\"assetStatus === DamAssetStatus.Deleting\"\n class=\"w-100 pa-2 text-caption\"\n >\n <VAlert\n dark\n type=\"error\"\n >\n {{ t('common.damImage.asset.detail.info.status.deleting') }}\n </VAlert>\n </div>\n <div\n v-else-if=\"assetStatus === DamAssetStatus.Draft\"\n class=\"w-100 pa-2 text-caption\"\n >\n <VAlert\n dark\n type=\"warning\"\n >\n {{ t('common.damImage.asset.detail.info.status.draft') }}\n </VAlert>\n </div>\n</template>\n","import { computed, ref } from 'vue'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nexport const CLASS_PREFIX = 'teleport-target-'\n\nconst mountedDivClasses = ref(new Set<string>())\n\nexport function useAssetDetailSidebarActionbar(uploadKey: UploadQueueKey) {\n const mounted = () => {\n mountedDivClasses.value.add(CLASS_PREFIX + uploadKey)\n }\n\n const unMounted = () => {\n mountedDivClasses.value.delete(CLASS_PREFIX + uploadKey)\n }\n\n const canTeleport = computed(() => {\n return mountedDivClasses.value.has(CLASS_PREFIX + uploadKey)\n })\n\n const divClassName = computed(() => {\n return CLASS_PREFIX + uploadKey\n })\n\n return {\n divClassName,\n canTeleport,\n mounted,\n unMounted,\n }\n}\n","<script lang=\"ts\" setup>\nimport { useAssetDetailSidebarActionbar } from '@/components/damImage/uploadQueue/composables/assetDetailSidebarActionbar'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n }>(),\n {\n }\n)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { canTeleport, divClassName } = useAssetDetailSidebarActionbar(props.queueKey)\n</script>\n\n<template>\n <Teleport\n v-if=\"canTeleport\"\n :to=\"'.' + divClassName\"\n >\n <div class=\"w-100 text-right\">\n <slot />\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport ACustomDataForm from '@/components/customDataForm/ACustomDataForm.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport type { IntegerId } from '@/types/common'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n assetType: DamAssetTypeType\n extSystem: IntegerId\n modelValue: { [key: string]: any }\n dataCy?: string\n }>(),\n {\n dataCy: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'anyChange'): void\n}>()\n\nconst { getDamConfigAssetCustomFormElements, getDamConfigExtSystem } = useDamConfigState()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst configAssetCustomFormElements = getDamConfigAssetCustomFormElements(props.extSystem)\nif (isUndefined(configAssetCustomFormElements)) {\n throw new Error('Custom form elements must be initialised.')\n}\n\nconst elements = computed(() => {\n return configAssetCustomFormElements[props.assetType]\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst configExtSystem = getDamConfigExtSystem(props.extSystem)\n\nif (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n}\n\nconst pinnedCount = computed(() => {\n return configExtSystem[props.assetType].customMetadataPinnedAmount\n})\n</script>\n\n<template>\n <ACustomDataForm\n :model-value=\"modelValue\"\n :pinned-count=\"pinnedCount\"\n :elements=\"elements\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @any-change=\"emit('anyChange')\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <template #after-pinned>\n <slot name=\"after-pinned\" />\n </template>\n <template #before-pinned>\n <slot name=\"before-pinned\" />\n </template>\n </ACustomDataForm>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n color?: string | null\n width?: number\n height?: number\n }>(),\n {\n color: null,\n width: 20,\n height: 20,\n }\n)\n\nconst style = computed(() => {\n return `background-color: ${props.color ? props.color : 'transparent'}; width: ${props.width}px; height: ${\n props.height\n }px;`\n})\n</script>\n\n<template>\n <div :style=\"style\">\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ color }}\n </VTooltip>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport AColorBox from '@/components/dam/AColorBox.vue'\nimport type { AssetFileImage } from '@/types/coreDam/AssetFile'\nimport ABooleanValue from '@/components/ABooleanValue.vue'\n\nwithDefaults(\n defineProps<{\n file: AssetFileImage\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VRow>\n <VCol>{{ t('common.damImage.asset.detail.info.field.dominantColor') }}</VCol>\n <VCol cols=\"9\">\n <AColorBox :color=\"file.imageAttributes.mostDominantColor\" />\n </VCol>\n </VRow>\n <VRow>\n <VCol>{{ t('common.damImage.asset.detail.info.field.width') }}</VCol>\n <VCol cols=\"9\">\n {{ file.imageAttributes.width }} px\n </VCol>\n </VRow>\n <VRow>\n <VCol>{{ t('common.damImage.asset.detail.info.field.height') }}</VCol>\n <VCol cols=\"9\">\n {{ file.imageAttributes.height }} px\n </VCol>\n </VRow>\n <VRow>\n <VCol>{{ t('common.damImage.asset.detail.info.field.ratio') }}</VCol>\n <VCol cols=\"9\">\n {{ file.imageAttributes.ratioWidth }} / {{ file.imageAttributes.ratioHeight }}\n </VCol>\n </VRow>\n <VRow>\n <VCol>{{ t('common.damImage.asset.detail.info.field.animated') }}</VCol>\n <VCol cols=\"9\">\n <ABooleanValue :value=\"file.imageAttributes.animated\" />\n </VCol>\n </VRow>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, shallowRef, watch } from 'vue'\nimport { useDamCachedAuthors } from '@/components/damImage/uploadQueue/author/cachedAuthors'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { CachedItem } from '@/composables/system/defineCached'\nimport type { DamAuthorMinimal } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { isNull, isUndefined } from '@/utils/common'\nimport type { DocId } from '@/types/common'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | DocId | undefined\n title?: string\n queueId?: string | undefined\n forceRounded?: boolean\n textOnly?: boolean\n size?: string\n containerClass?: undefined | string\n forceReviewed?: undefined | boolean\n }>(),\n {\n queueId: undefined,\n title: '',\n forceRounded: false,\n textOnly: false,\n size: 'small',\n containerClass: 'd-inline-flex',\n forceReviewed: undefined\n }\n)\n\nconst { getCachedAuthor } = useDamCachedAuthors()\nconst uploadQueuesStore = useUploadQueuesStore()\n\nconst cached = shallowRef<undefined | CachedItem<DamAuthorMinimal>>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\nconst item = computed(() => {\n return getCachedAuthor(props.id)\n})\n\nconst displayNewIcon = computed(() => {\n if (!props.queueId) return undefined\n const queue = uploadQueuesStore.getQueue(props.queueId)\n if (!queue || !cached.value) return undefined\n if (queue.suggestions.newAuthorNames.has(cached.value.name)) return 'mdi-new-box'\n return undefined\n})\n\nconst displayTitle = computed(() => {\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return cached.value.name + (cached.value.identifier?.length > 0 ? ` (${cached.value.identifier})` : '')\n }\n return ''\n})\n\nconst displayReviewed = computed(() => {\n if (props.forceReviewed) return true\n if (item.value?.reviewed) return true\n return false\n})\n\nwatch(\n item,\n async (newValue) => {\n if (loaded.value) return\n if (isUndefined(newValue) || newValue._loaded === false) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div :class=\"containerClass\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\"> - </slot>\n </template>\n <div v-else-if=\"textOnly\">\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n <VIcon\n v-if=\"displayReviewed\"\n icon=\"mdi-shield-check\"\n size=\"small\"\n class=\"text-success ml-1\"\n :title=\"t('common.damImage.author.model.flags.reviewed')\"\n />\n </div>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"displayNewIcon\"\n :label=\"forceRounded ? undefined : true\"\n :title=\"displayReviewed ? t('common.damImage.author.model.flags.reviewed') : undefined\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n <VIcon\n v-if=\"displayReviewed\"\n icon=\"mdi-shield-check\"\n class=\"text-success ml-1\"\n size=\"small\"\n :title=\"t('common.damImage.author.model.flags.reviewed')\"\n />\n </VChip>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, shallowRef, watch } from 'vue'\nimport type { DocId } from '@/types/common'\nimport { useDamCachedAuthors } from '@/components/damImage/uploadQueue/author/cachedAuthors'\nimport type { CachedItem } from '@/composables/system/defineCached'\nimport type { DamAuthorMinimal } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n id: null | DocId | undefined\n queueId?: string | undefined\n }>(),\n {\n queueId: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'addAuthor', data: DocId | null | undefined): void\n}>()\n\nconst clickClose = () => {\n emit('addAuthor', props.id)\n}\n\nconst { getCachedAuthor } = useDamCachedAuthors()\n\nconst cached = shallowRef<undefined | CachedItem<DamAuthorMinimal>>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\nconst item = computed(() => {\n return getCachedAuthor(props.id)\n})\n\nconst displayTitle = computed(() => {\n if (cached.value) {\n return cached.value.name + (cached.value.identifier?.length > 0 ? ` (${cached.value.identifier})` : '')\n }\n return ''\n})\n\nwatch(\n item,\n async (newValue) => {\n if (loaded.value) return\n if (isUndefined(newValue) || newValue._loaded === false) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VChip\n size=\"small\"\n closable\n close-icon=\"mdi-plus\"\n @click:close=\"clickClose\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n</template>\n","import { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\nexport const DamAuthorType = {\n None: 'none',\n Internal: 'internal',\n External: 'external',\n Agency: 'agency',\n} as const\nexport type DamAuthorTypeType = (typeof DamAuthorType)[keyof typeof DamAuthorType]\nexport const DamAuthorTypeDefault = DamAuthorType.None\n\nexport function useDamAuthorType() {\n const { t } = useI18n()\n\n const authorTypeOptions = ref<ValueObjectOption<DamAuthorTypeType>[]>([\n {\n value: DamAuthorType.None,\n title: t('common.damImage.author.authorType.none'),\n },\n {\n value: DamAuthorType.Internal,\n title: t('common.damImage.author.authorType.internal'),\n },\n {\n value: DamAuthorType.External,\n title: t('common.damImage.author.authorType.external'),\n },\n {\n value: DamAuthorType.Agency,\n title: t('common.damImage.author.authorType.agency'),\n },\n ])\n\n const getAuthorTypeOption = (value: DamAuthorTypeType) => {\n return authorTypeOptions.value.find((item) => item.value === value)\n }\n\n return {\n authorTypeOptions,\n getAuthorTypeOption,\n }\n}\n","import type { Ref } from 'vue'\nimport { computed } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport type { DamAuthor } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport type { ValidationScope } from '@/types/Validation'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\n\nconst { required, minLength } = useValidate()\n\nexport function useAuthorValidation(author: Ref<DamAuthor>, validationScope: ValidationScope = undefined) {\n const rules = computed(() => ({\n author: {\n name: {\n required,\n minLength: minLength(3),\n },\n identifier: {\n minLength: minLength(3),\n },\n },\n }))\n const v$ = useVuelidate(rules, { author }, { $scope: validationScope })\n\n return {\n v$,\n }\n}\n","import type { DamAuthor } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { DamAuthorTypeDefault } from '@/components/damImage/uploadQueue/author/DamAuthorType'\nimport { dateTimeNow } from '@/utils/datetime'\nimport { ENTITY } from '@/components/damImage/uploadQueue/api/authorApi'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\n\nexport function useDamAuthorFactory() {\n const createDefault = (extSystemId: number, reviewed?: boolean): DamAuthor => {\n return {\n id: '',\n name: '',\n identifier: '',\n extSystem: extSystemId,\n flags: {\n reviewed: reviewed ?? false,\n },\n type: DamAuthorTypeDefault,\n createdAt: dateTimeNow(),\n modifiedAt: dateTimeNow(),\n createdBy: 0,\n modifiedBy: 0,\n _resourceName: ENTITY,\n _system: SYSTEM_CORE_DAM,\n }\n }\n\n return {\n createDefault,\n }\n}\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { ValidationScope } from '@/types/Validation'\nimport { ADamAuthorCreateValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport type { DamAuthor } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { useDamAuthorType } from '@/components/damImage/uploadQueue/author/DamAuthorType'\nimport { isUndefined } from '@/utils/common'\nimport { useAuthorValidation } from '@/components/damImage/uploadQueue/author/authorValidation'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { createAuthor } from '@/components/damImage/uploadQueue/api/authorApi'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { useDamAuthorFactory } from '@/components/damImage/uploadQueue/author/AuthorFactory'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport ASystemEntityScope from '@/components/form/ASystemEntityScope.vue'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport ARow from '@/components/ARow.vue'\nimport AFormTextField from '@/components/form/AFormTextField.vue'\nimport AFormValueObjectOptionsSelect from '@/components/form/AFormValueObjectOptionsSelect.vue'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n initialValue?: string\n disableRedirect?: boolean\n variant?: 'button' | 'icon'\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n disabled?: boolean | undefined\n validationScope?: ValidationScope\n }>(),\n {\n initialValue: '',\n disableRedirect: false,\n variant: 'button',\n buttonT: 'common.button.create',\n buttonClass: 'ml-2',\n dataCy: undefined,\n disabled: undefined,\n validationScope: ADamAuthorCreateValidationScopeSymbol,\n }\n)\nconst emit = defineEmits<{\n (e: 'onSuccess', data: DamAuthor): void\n}>()\n\nconst { damClient } = useCommonAdminCoreDamOptions()\nconst { getDamConfigExtSystem } = useDamConfigState()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst configExtSystem = getDamConfigExtSystem(props.extSystem)\nif (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n}\n\nconst { createDefault } = useDamAuthorFactory()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst author = ref<DamAuthor>(createDefault(props.extSystem))\nconst dialog = ref(false)\nconst buttonLoading = ref(false)\n\nconst onClick = () => {\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n author.value = createDefault(props.extSystem, true)\n author.value.name = props.initialValue\n dialog.value = true\n}\n\nconst onCancel = () => {\n dialog.value = false\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { v$ } = useAuthorValidation(author, props.validationScope)\nconst { t } = useI18n()\nconst { showValidationError, showRecordWas, showErrorsDefault } = useAlerts()\n\nconst onConfirm = async () => {\n if (buttonLoading.value) return\n try {\n buttonLoading.value = true\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n buttonLoading.value = false\n return\n }\n const res = await createAuthor(damClient, author.value)\n emit('onSuccess', res)\n showRecordWas('created')\n dialog.value = false\n if (!isUndefined(res.id) && !props.disableRedirect) {\n // router.push({ name: ROUTE.DAM.AUTHOR.DETAIL, params: { id: res.id } })\n }\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n buttonLoading.value = false\n }\n}\n\nconst { authorTypeOptions } = useDamAuthorType()\n</script>\n\n<template>\n <ABtnPrimary\n v-if=\"variant === 'button'\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :disabled=\"disabled\"\n rounded=\"pill\"\n @click.stop=\"onClick\"\n >\n {{ t(buttonT) }}\n </ABtnPrimary>\n <VBtn\n v-else\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n :disabled=\"disabled\"\n variant=\"text\"\n size=\"small\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-plus\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.author.button.add') }}\n </VTooltip>\n </VBtn>\n <VDialog v-model=\"dialog\">\n <VCard\n v-if=\"dialog\"\n width=\"500\"\n class=\"mt-0 mr-auto ml-auto\"\n data-cy=\"create-panel\"\n >\n <ADialogToolbar @on-cancel=\"onCancel\">\n {{ t('common.damImage.author.meta.create') }}\n </ADialogToolbar>\n <VCardText>\n <ASystemEntityScope\n :system=\"SYSTEM_CORE_DAM\"\n subject=\"author\"\n >\n <ARow>\n <AFormTextField\n v-model=\"author.name\"\n :label=\"t('common.damImage.author.model.name')\"\n :v=\"v$.author.name\"\n required\n data-cy=\"author-name\"\n @keyup.enter=\"onConfirm\"\n />\n </ARow>\n <ARow>\n <AFormTextField\n v-model=\"author.identifier\"\n :label=\"t('common.damImage.author.model.identifier')\"\n :v=\"v$.author.identifier\"\n data-cy=\"author-identifier\"\n @keyup.enter=\"onConfirm\"\n />\n </ARow>\n <ARow>\n <AFormValueObjectOptionsSelect\n v-model=\"author.type\"\n :label=\"t('common.damImage.author.model.type')\"\n :items=\"authorTypeOptions\"\n data-cy=\"author-type\"\n @keyup.enter=\"onConfirm\"\n />\n </ARow>\n </ASystemEntityScope>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-cancel\"\n @click.stop=\"onCancel\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n :loading=\"buttonLoading\"\n data-cy=\"button-confirm\"\n @click.stop=\"onConfirm\"\n >\n {{ t(buttonT) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script lang=\"ts\" setup>\nimport type { DocId, IntegerId } from '@/types/common'\nimport type { ValidationScope } from '@/types/Validation'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport useVuelidate from '@vuelidate/core'\nimport {\n useDamCachedAuthors,\n useDamCachedAuthorsForRemoteAutocomplete,\n} from '@/components/damImage/uploadQueue/author/cachedAuthors'\nimport type { DamAuthor } from '@/components/damImage/uploadQueue/author/DamAuthor'\nimport { isArray } from '@/utils/common'\nimport AFormRemoteAutocompleteWithCached from '@/components/form/AFormRemoteAutocompleteWithCached.vue'\nimport AuthorRemoteAutocompleteCachedAuthorChip from '@/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteCachedAuthorChip.vue'\nimport AuthorRemoteAutocompleteCachedAuthorChipConflicts from '@/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue'\nimport { useAuthorSelectActions } from '@/components/damImage/uploadQueue/author/authorActions'\nimport { useAuthorFilter } from '@/components/damImage/uploadQueue/author/AuthorFilter'\nimport AuthorCreateButton from '@/components/damImage/uploadQueue/author/AuthorCreateButton.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DocId | null | DocId[] | any\n extSystem: IntegerId\n queueId?: string | undefined\n label?: string | undefined\n required?: boolean | null\n disabled?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n authorConflicts?: DocId[]\n dataCy?: string\n validationScope?: ValidationScope\n }>(),\n {\n label: undefined,\n queueId: undefined,\n required: null,\n disabled: undefined,\n multiple: false,\n clearable: false,\n authorConflicts: undefined,\n dataCy: undefined,\n validationScope: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DocId | null | DocId[]): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue) {\n emit('update:modelValue', [...newValue])\n },\n})\n\nconst { t } = useI18n()\n\nconst requiredComputed = computed(() => !!props.required)\n\nconst { requiredIf } = useValidate()\n\nconst rules = {\n modelValueComputed: {\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n required: requiredIf(requiredComputed.value),\n },\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst v$ = useVuelidate(rules, { modelValueComputed }, { $scope: props.validationScope })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItemsMinimal } = useAuthorSelectActions(props.extSystem)\n\nconst innerFilter = useAuthorFilter()\n\nconst addAuthor = async (id: null | DocId | undefined) => {\n if (!id) return\n if (!modelValueComputed.value.includes(id)) {\n modelValueComputed.value = [...modelValueComputed.value, ...[id]]\n }\n}\n\nconst addNewAuthorText = ref('')\n\nconst searchChange = (newValue: string) => {\n if (newValue.length > 0) addNewAuthorText.value = newValue\n}\n\nconst { addManualToCachedAuthors } = useDamCachedAuthors()\n\nconst afterCreate = (author: DamAuthor) => {\n addManualToCachedAuthors(author)\n if (isArray(modelValueComputed.value)) {\n modelValueComputed.value = [...modelValueComputed.value, author.id]\n return\n }\n modelValueComputed.value = author.id\n}\n\nconst itemSlotIsSelected = (item: DocId) => {\n if (isArray(modelValueComputed.value)) {\n return modelValueComputed.value.includes(item)\n } else if (modelValueComputed.value) {\n return modelValueComputed.value === item\n }\n return false\n}\n\nonMounted(() => {\n //\n})\n</script>\n\n<template>\n <div class=\"d-flex\">\n <AFormRemoteAutocompleteWithCached\n v-model=\"modelValueComputed\"\n :use-cached=\"useDamCachedAuthorsForRemoteAutocomplete\"\n :v=\"v$\"\n :required=\"requiredComputed\"\n :label=\"label\"\n :fetch-items-minimal=\"fetchItemsMinimal\"\n :inner-filter=\"innerFilter\"\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n filter-by-field=\"text\"\n :filter-sort-by=\"null\"\n :data-cy=\"dataCy\"\n item-title=\"name\"\n item-value=\"id\"\n :min-search-chars=\"3\"\n min-search-text=\"common.damImage.author.filterMinChars\"\n @search-change=\"searchChange\"\n >\n <template #item=\"{ props: itemSlotProps, item: itemSlotItem }\">\n <VListItem\n v-bind=\"itemSlotProps\"\n @click.prevent=\"\"\n >\n <template\n v-if=\"multiple\"\n #prepend\n >\n <VCheckboxBtn\n :model-value=\"itemSlotIsSelected(itemSlotItem.value)\"\n :ripple=\"false\"\n />\n </template>\n <template #title>\n <AuthorRemoteAutocompleteCachedAuthorChip\n :id=\"itemSlotItem.value\"\n :key=\"itemSlotItem.value\"\n :queue-id=\"queueId\"\n :title=\"itemSlotItem.title\"\n text-only\n :force-reviewed=\"itemSlotItem.raw?.raw?.reviewed\"\n />\n </template>\n </VListItem>\n </template>\n <template #chip=\"{ item: chipSlotItem }\">\n <AuthorRemoteAutocompleteCachedAuthorChip\n :id=\"chipSlotItem.value\"\n :key=\"chipSlotItem.value\"\n :queue-id=\"queueId\"\n :title=\"chipSlotItem.title\"\n force-rounded\n />\n </template>\n </AFormRemoteAutocompleteWithCached>\n <div>\n <AuthorCreateButton\n variant=\"icon\"\n :ext-system=\"extSystem\"\n data-cy=\"add-author\"\n :initial-value=\"addNewAuthorText\"\n disable-redirect\n :disabled=\"disabled\"\n @on-success=\"afterCreate\"\n />\n </div>\n </div>\n <div\n v-if=\"!disabled && authorConflicts && authorConflicts.length > 0\"\n class=\"d-flex flex-column\"\n >\n <div>\n <span class=\"text-caption\">{{ t('common.damImage.author.conflicts') }}</span>\n </div>\n <div>\n <AuthorRemoteAutocompleteCachedAuthorChipConflicts\n v-for=\"authorId in authorConflicts\"\n :id=\"authorId\"\n :key=\"authorId\"\n class=\"mr-1 mt-1\"\n @add-author=\"addAuthor(authorId)\"\n />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, shallowRef, watch } from 'vue'\nimport type { DocId } from '@/types/common'\nimport { useDamCachedKeywords } from '@/components/damImage/uploadQueue/keyword/cachedKeywords'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { CachedItem } from '@/composables/system/defineCached'\nimport type { DamKeywordMinimal } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport { isNull, isUndefined } from '@/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n id: null | DocId | undefined\n title?: string\n queueId?: string | undefined\n forceRounded?: boolean\n textOnly?: boolean\n size?: string\n containerClass?: undefined | string\n }>(),\n {\n queueId: undefined,\n title: '',\n forceRounded: false,\n textOnly: false,\n size: 'small',\n containerClass: 'd-inline-flex',\n }\n)\n\nconst { getCachedKeyword } = useDamCachedKeywords()\nconst uploadQueuesStore = useUploadQueuesStore()\n\nconst cached = shallowRef<undefined | CachedItem<DamKeywordMinimal>>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\nconst item = computed(() => {\n return getCachedKeyword(props.id)\n})\n\nconst displayNewIcon = computed(() => {\n if (!props.queueId) return undefined\n const queue = uploadQueuesStore.getQueue(props.queueId)\n if (!queue || !cached.value) return undefined\n if (queue.suggestions.newKeywordNames.has(cached.value.name)) return 'mdi-new-box'\n return undefined\n})\n\nconst displayTitle = computed(() => {\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return cached.value.name\n }\n return ''\n})\n\nwatch(\n item,\n async (newValue) => {\n if (loaded.value) return\n if (isUndefined(newValue) || newValue._loaded === false) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div :class=\"containerClass\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">\n -\n </slot>\n </template>\n <div v-else-if=\"textOnly\">\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"displayNewIcon\"\n :label=\"forceRounded ? undefined : true\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n","import type { DamKeyword } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport { dateTimeNow } from '@/utils/datetime'\nimport { ENTITY } from '@/components/damImage/uploadQueue/api/keywordApi'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\n\nexport function useDamKeywordFactory() {\n const createDefault = (extSystemId: number, reviewed?: boolean): DamKeyword => {\n return {\n id: '',\n name: '',\n extSystem: extSystemId,\n flags: {\n reviewed: reviewed ?? false,\n },\n createdAt: dateTimeNow(),\n modifiedAt: dateTimeNow(),\n createdBy: 1,\n modifiedBy: 1,\n _resourceName: ENTITY,\n _system: SYSTEM_CORE_DAM,\n }\n }\n\n return {\n createDefault,\n }\n}\n","import type { Ref } from 'vue'\nimport { computed } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport type { DamKeyword } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport type { ValidationScope } from '@/types/Validation'\n\nconst { required, minLength } = useValidate()\n\nexport function useKeywordValidation(keyword: Ref<DamKeyword>, validationScope: ValidationScope = undefined) {\n const rules = computed(() => ({\n keyword: {\n name: {\n required,\n minLength: minLength(3),\n },\n },\n }))\n const v$ = useVuelidate(rules, { keyword }, { $scope: validationScope })\n\n return {\n v$,\n }\n}\n","<script lang=\"ts\" setup>\nimport type { ValidationScope } from '@/types/Validation'\nimport { ADamKeywordCreateValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport type { DamKeyword } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { isUndefined } from '@/utils/common'\nimport { useDamKeywordFactory } from '@/components/damImage/uploadQueue/keyword/KeywordFactory'\nimport { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useKeywordValidation } from '@/components/damImage/uploadQueue/keyword/keywordValidation'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { createKeyword, ENTITY } from '@/components/damImage/uploadQueue/api/keywordApi'\nimport ASystemEntityScope from '@/components/form/ASystemEntityScope.vue'\nimport ARow from '@/components/ARow.vue'\nimport AFormTextField from '@/components/form/AFormTextField.vue'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n initialValue?: string\n disableRedirect?: boolean\n variant?: 'button' | 'icon'\n buttonT?: string\n buttonClass?: string\n dataCy?: string\n disabled?: boolean | undefined\n validationScope?: ValidationScope\n }>(),\n {\n initialValue: '',\n disableRedirect: false,\n variant: 'button',\n buttonT: 'common.button.create',\n buttonClass: 'ml-2',\n dataCy: undefined,\n disabled: undefined,\n validationScope: ADamKeywordCreateValidationScopeSymbol,\n }\n)\nconst emit = defineEmits<{\n (e: 'onSuccess', data: DamKeyword): void\n}>()\n\nconst { damClient } = useCommonAdminCoreDamOptions()\nconst { getDamConfigExtSystem } = useDamConfigState()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst configExtSystem = getDamConfigExtSystem(props.extSystem)\nif (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n}\n\nconst { createDefault } = useDamKeywordFactory()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst keyword = ref<DamKeyword>(createDefault(props.extSystem))\nconst dialog = ref(false)\nconst buttonLoading = ref(false)\n\nconst onClick = () => {\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n keyword.value = createDefault(props.extSystem, true)\n keyword.value.name = props.initialValue\n dialog.value = true\n}\n\nconst onCancel = () => {\n dialog.value = false\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { v$ } = useKeywordValidation(keyword, props.validationScope)\nconst { t } = useI18n()\nconst { showValidationError, showRecordWas, showErrorsDefault } = useAlerts()\n\nconst onConfirm = async () => {\n if (buttonLoading.value) return\n try {\n buttonLoading.value = true\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n buttonLoading.value = false\n return\n }\n const res = await createKeyword(damClient, keyword.value)\n emit('onSuccess', res)\n showRecordWas('created')\n dialog.value = false\n if (!isUndefined(res.id) && !props.disableRedirect) {\n // router.push({ name: ROUTE.DAM.KEYWORD.DETAIL, params: { id: res.id } })\n }\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n buttonLoading.value = false\n }\n}\n</script>\n\n<template>\n <ABtnPrimary\n v-if=\"variant === 'button'\"\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n :disabled=\"disabled\"\n rounded=\"pill\"\n @click.stop=\"onClick\"\n >\n {{ t(buttonT) }}\n </ABtnPrimary>\n <VBtn\n v-else\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n :disabled=\"disabled\"\n variant=\"text\"\n size=\"small\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-plus\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.keyword.button.add') }}\n </VTooltip>\n </VBtn>\n <VDialog v-model=\"dialog\">\n <VCard\n v-if=\"dialog\"\n width=\"500\"\n class=\"mt-0 mr-auto ml-auto\"\n data-cy=\"create-panel\"\n >\n <ADialogToolbar @on-cancel=\"onCancel\">\n {{ t('common.damImage.keyword.meta.create') }}\n </ADialogToolbar>\n <VCardText>\n <ASystemEntityScope\n :system=\"SYSTEM_CORE_DAM\"\n :subject=\"ENTITY\"\n >\n <ARow>\n <AFormTextField\n v-model=\"keyword.name\"\n :label=\"t('common.damImage.keyword.model.name')\"\n :v=\"v$.keyword.name\"\n required\n data-cy=\"keyword-name\"\n @keyup.enter=\"onConfirm\"\n />\n </ARow>\n </ASystemEntityScope>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-cancel\"\n @click.stop=\"onCancel\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n :loading=\"buttonLoading\"\n data-cy=\"button-confirm\"\n @click.stop=\"onConfirm\"\n >\n {{ t(buttonT) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script lang=\"ts\" setup>\nimport type { DocId, IntegerId } from '@/types/common'\nimport type { ValidationScope } from '@/types/Validation'\nimport { computed, ref } from 'vue'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport useVuelidate from '@vuelidate/core'\nimport { useKeywordSelectActions } from '@/components/damImage/uploadQueue/keyword/keywordActions'\nimport { useKeywordFilter } from '@/components/damImage/uploadQueue/keyword/KeywordFilter'\nimport { useDamCachedKeywords } from '@/components/damImage/uploadQueue/keyword/cachedKeywords'\nimport type { DamKeyword } from '@/components/damImage/uploadQueue/keyword/DamKeyword'\nimport { isArray } from '@/utils/common'\nimport AFormRemoteAutocompleteWithCached from '@/components/form/AFormRemoteAutocompleteWithCached.vue'\nimport { useCachedKeywordsForRemoteAutocomplete } from '@/components/damImage/uploadQueue/keyword/cachedKeywords'\nimport KeywordRemoteAutocompleteCachedKeywordChip from '@/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteCachedKeywordChip.vue'\nimport KeywordCreateButton from '@/components/damImage/uploadQueue/keyword/KeywordCreateButton.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DocId | null | DocId[] | any\n extSystem: IntegerId\n queueId?: string | undefined\n label?: string | undefined\n required?: boolean | null\n disabled?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n dataCy?: string\n validationScope?: ValidationScope\n }>(),\n {\n label: undefined,\n queueId: undefined,\n required: null,\n disabled: undefined,\n multiple: false,\n clearable: false,\n dataCy: undefined,\n validationScope: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DocId | null | DocId[]): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue) {\n emit('update:modelValue', [...newValue])\n },\n})\n\nconst requiredComputed = computed(() => !!props.required)\n\nconst { requiredIf } = useValidate()\n\nconst rules = {\n modelValueComputed: {\n required: requiredIf(requiredComputed),\n },\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst v$ = useVuelidate(rules, { modelValueComputed }, { $scope: props.validationScope })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItemsMinimal } = useKeywordSelectActions(props.extSystem)\n\nconst innerFilter = useKeywordFilter()\n\nconst addNewKeywordText = ref('')\n\nconst searchChange = (newValue: string) => {\n if (newValue.length > 0) addNewKeywordText.value = newValue\n}\n\nconst { addManualToCachedKeywords } = useDamCachedKeywords()\n\nconst afterCreate = (keyword: DamKeyword) => {\n addManualToCachedKeywords(keyword)\n if (isArray(modelValueComputed.value)) {\n modelValueComputed.value = [...modelValueComputed.value, keyword.id]\n return\n }\n modelValueComputed.value = keyword.id\n}\n\nconst itemSlotIsSelected = (item: DocId) => {\n if (isArray(modelValueComputed.value)) {\n return modelValueComputed.value.includes(item)\n } else if (modelValueComputed.value) {\n return modelValueComputed.value === item\n }\n return false\n}\n</script>\n\n<template>\n <div class=\"d-flex\">\n <AFormRemoteAutocompleteWithCached\n v-model=\"modelValueComputed\"\n :use-cached=\"useCachedKeywordsForRemoteAutocomplete\"\n :v=\"v$\"\n :required=\"requiredComputed\"\n :label=\"label\"\n :fetch-items-minimal=\"fetchItemsMinimal\"\n :inner-filter=\"innerFilter\"\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n filter-by-field=\"text\"\n :filter-sort-by=\"null\"\n item-title=\"name\"\n item-value=\"id\"\n :data-cy=\"dataCy\"\n :min-search-chars=\"3\"\n min-search-text=\"common.damImage.keyword.filterMinChars\"\n @search-change=\"searchChange\"\n >\n <template #item=\"{ props: itemSlotProps, item: itemSlotItem }\">\n <VListItem\n v-bind=\"itemSlotProps\"\n @click.prevent=\"\"\n >\n <template\n v-if=\"multiple\"\n #prepend\n >\n <VCheckboxBtn\n :model-value=\"itemSlotIsSelected(itemSlotItem.value)\"\n :ripple=\"false\"\n />\n </template>\n <template #title>\n <KeywordRemoteAutocompleteCachedKeywordChip\n :id=\"itemSlotItem.value\"\n :key=\"itemSlotItem.value\"\n :queue-id=\"queueId\"\n :title=\"itemSlotItem.title\"\n text-only\n />\n </template>\n </VListItem>\n </template>\n <template #chip=\"{ item: chipSlotItem }\">\n <KeywordRemoteAutocompleteCachedKeywordChip\n :id=\"chipSlotItem.value\"\n :key=\"chipSlotItem.value\"\n :queue-id=\"queueId\"\n :title=\"chipSlotItem.title\"\n force-rounded\n />\n </template>\n </AFormRemoteAutocompleteWithCached>\n <div>\n <KeywordCreateButton\n variant=\"icon\"\n data-cy=\"add-keyword\"\n :ext-system=\"extSystem\"\n :initial-value=\"addNewKeywordText\"\n disable-redirect\n :disabled=\"disabled\"\n @on-success=\"afterCreate\"\n />\n </div>\n </div>\n</template>\n","import { computed } from 'vue'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport type { IntegerId } from '@/types/common'\nimport { isUndefined } from '@/utils/common'\n\nexport const useDamKeywordAssetTypeConfig = (assetType: DamAssetTypeType, extSystem: IntegerId) => {\n const { getDamConfigExtSystem } = useDamConfigState()\n\n const configExtSystem = getDamConfigExtSystem(extSystem)\n\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n\n const keywordEnabled = computed(() => {\n return configExtSystem[assetType].keywords.enabled\n })\n\n const keywordRequired = computed(() => {\n return configExtSystem[assetType].keywords.required\n })\n\n return {\n keywordEnabled,\n keywordRequired,\n }\n}\n","import { computed } from 'vue'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport type { IntegerId } from '@/types/common'\nimport { isUndefined } from '@/utils/common'\n\nexport const useDamAuthorAssetTypeConfig = (assetType: DamAssetTypeType, extSystem: IntegerId) => {\n const { getDamConfigExtSystem } = useDamConfigState()\n const configExtSystem = getDamConfigExtSystem(extSystem)\n\n if (isUndefined(configExtSystem)) {\n throw new Error('Ext system must be initialised.')\n }\n\n const authorEnabled = computed(() => {\n return configExtSystem[assetType].authors.enabled\n })\n\n const authorRequired = computed(() => {\n return configExtSystem[assetType].authors.required\n })\n\n return {\n authorEnabled,\n authorRequired,\n }\n}\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, ref } from 'vue'\nimport { DamAssetType, DamAssetTypeDefault } from '@/types/coreDam/Asset'\nimport { type AssetFile, assetFileIsImageFile } from '@/types/coreDam/AssetFile'\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetCustomMetadataForm from '@/components/damImage/uploadQueue/components/AssetCustomMetadataForm.vue'\nimport ACopyText from '@/components/ACopyText.vue'\nimport { prettyBytes } from '@/utils/file'\nimport AssetMetadataImageAttributes from '@/components/damImage/uploadQueue/components/AssetMetadataImageAttributes.vue'\nimport ASystemEntityScope from '@/components/form/ASystemEntityScope.vue'\nimport { dateTimePretty } from '@/utils/datetime'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport AuthorRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteWithCached.vue'\nimport { useDamKeywordAssetTypeConfig } from '@/components/damImage/uploadQueue/keyword/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/components/damImage/uploadQueue/author/damAuthorConfig'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n\nconst panels = ref(['metadata', 'file'])\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, authorConflicts, metadataAreTouched, mainFileSingleUse } = storeToRefs(assetDetailStore)\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\nconst isTypeImage = computed(() => {\n return assetType.value === DamAssetType.Image\n})\n\nconst assetMainFile = computed<null | AssetFile>(() => {\n return asset.value && asset.value.mainFile ? (asset.value.mainFile as AssetFile) : null\n})\n\nconst onAnyMetadataChange = () => {\n metadataAreTouched.value = true\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss,vue/no-ref-object-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(assetType.value, props.extSystem)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss,vue/no-ref-object-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(assetType.value, props.extSystem)\n</script>\n\n<template>\n <VExpansionPanels\n v-if=\"asset\"\n v-model=\"panels\"\n multiple\n class=\"v-expansion-panels--compact\"\n >\n <VExpansionPanel\n elevation=\"0\"\n :title=\"t('common.damImage.asset.detail.info.metadata')\"\n value=\"metadata\"\n >\n <VExpansionPanelText>\n <AssetCustomMetadataForm\n v-if=\"asset\"\n v-model=\"asset.metadata.customData\"\n :ext-system=\"extSystem\"\n :asset-type=\"assetType\"\n @any-change=\"onAnyMetadataChange\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <KeywordRemoteAutocompleteWithCached\n v-model=\"asset.keywords\"\n :ext-system=\"extSystem\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n data-cy=\"custom-field-keywords\"\n clearable\n multiple\n :required=\"keywordRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"authorEnabled\"\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <AuthorRemoteAutocompleteWithCached\n v-model=\"asset.authors\"\n :ext-system=\"extSystem\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :author-conflicts=\"authorConflicts\"\n data-cy=\"custom-field-authors\"\n clearable\n multiple\n :required=\"authorRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n dense\n class=\"my-2\"\n >\n <VCol>\n <VSwitch\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n v-model=\"mainFileSingleUse\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VExpansionPanelText>\n </VExpansionPanel>\n <VExpansionPanel\n elevation=\"0\"\n :title=\"t('common.damImage.asset.detail.info.file')\"\n value=\"file\"\n >\n <VExpansionPanelText class=\"text-caption\">\n <!-- all types -->\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.id') }}\n </VCol>\n <VCol cols=\"9\">\n <ACopyText :value=\"asset.id\" />\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.type') }}\n </VCol>\n <VCol cols=\"9\">\n {{ asset.attributes.assetType }}\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.model.tracking.created') }}\n </VCol>\n <VCol cols=\"9\">\n {{ dateTimePretty(asset.createdAt) }}\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.model.tracking.modified') }}\n </VCol>\n <VCol cols=\"9\">\n {{ dateTimePretty(asset.modifiedAt) }}\n </VCol>\n </VRow>\n <div v-if=\"assetMainFile\">\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.mainFileId') }}\n </VCol>\n <VCol cols=\"9\">\n <ACopyText :value=\"assetMainFile.id\" />\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.mimeType') }}\n </VCol>\n <VCol cols=\"9\">\n {{ assetMainFile.fileAttributes.mimeType }}\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.size') }}\n </VCol>\n <VCol cols=\"9\">\n {{ prettyBytes(assetMainFile.fileAttributes.size) }}\n </VCol>\n </VRow>\n <AssetMetadataImageAttributes\n v-if=\"isTypeImage && assetFileIsImageFile(assetMainFile)\"\n :file=\"assetMainFile\"\n />\n </div>\n </VExpansionPanelText>\n </VExpansionPanel>\n </VExpansionPanels>\n</template>\n","<script lang=\"ts\" setup>\nimport AssetDetailSidebarActionsWrapper from '@/components/damImage/uploadQueue/components/AssetDetailSidebarActionsWrapper.vue'\nimport { isNull } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { ref } from 'vue'\nimport { useAlerts } from '@/composables/system/alerts'\nimport useVuelidate from '@vuelidate/core'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetMetadata from '@/components/damImage/uploadQueue/components/AssetMetadata.vue'\nimport { updateAssetMetadata } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n isActive: boolean\n dataCy?: string\n assetType: DamAssetTypeType\n extSystem: IntegerId\n }>(),\n {\n dataCy: undefined,\n }\n)\n\nconst { t } = useI18n()\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, updateUploadStore, mainFileSingleUse } = storeToRefs(assetDetailStore)\nconst uploadQueueStore = useUploadQueuesStore()\n\nconst saveButtonLoading = ref(false)\n\nconst { showRecordWas, showValidationError, showErrorsDefault } = useAlerts()\n\nconst v$ = useVuelidate({ $scope: ADamAssetMetadataValidationScopeSymbol, $stopPropagation: true })\n\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst onSave = async () => {\n if (isNull(asset.value)) return\n saveButtonLoading.value = true\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n saveButtonLoading.value = false\n return\n }\n try {\n await updateAssetMetadata(damClient, asset.value, props.extSystem, mainFileSingleUse.value)\n if (updateUploadStore.value && !isNull(asset.value)) {\n await uploadQueueStore.updateFromDetail(asset.value)\n }\n showRecordWas('updated')\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n saveButtonLoading.value = false\n }\n}\n</script>\n\n<template>\n <AssetDetailSidebarActionsWrapper\n v-if=\"isActive\"\n :queue-key=\"queueKey\"\n >\n <ABtnPrimary\n type=\"submit\"\n class=\"ml-2\"\n data-cy=\"button-save\"\n :loading=\"saveButtonLoading\"\n @click.stop=\"onSave\"\n >\n {{ t('common.button.save') }}\n </ABtnPrimary>\n </AssetDetailSidebarActionsWrapper>\n <AssetMetadata :ext-system=\"extSystem\" />\n</template>\n","import { acceptHMRUpdate, defineStore } from 'pinia'\nimport type { AssetFileImage } from '@/types/coreDam/AssetFile'\nimport type { RegionOfInterest } from '@/types/coreDam/Roi'\nimport { ref } from 'vue'\n\nexport const useImageRoiStore = defineStore('damImageRoiStore', () => {\n const imageFile = ref<null | AssetFileImage>(null)\n const loader = ref(false)\n const roi = ref<null | RegionOfInterest>(null)\n const timestampCropper = ref(Date.now())\n const timestampRoiPreviews = ref(Date.now())\n\n function setImageFile(newFile: AssetFileImage | null) {\n imageFile.value = newFile\n }\n\n function setRoi(newRoi: RegionOfInterest | null) {\n roi.value = newRoi\n }\n\n function showLoader() {\n loader.value = true\n }\n\n function hideLoader() {\n loader.value = false\n }\n\n function forceReloadRoiPreviews() {\n timestampRoiPreviews.value = Date.now()\n }\n\n function forceReloadCropper() {\n timestampCropper.value = Date.now()\n }\n\n function reset() {\n imageFile.value = null\n loader.value = false\n roi.value = null\n timestampCropper.value = Date.now()\n timestampRoiPreviews.value = Date.now()\n }\n\n return {\n imageFile,\n loader,\n roi,\n timestampCropper,\n timestampRoiPreviews,\n setImageFile,\n setRoi,\n showLoader,\n hideLoader,\n forceReloadRoiPreviews,\n forceReloadCropper,\n reset,\n }\n})\n\nif (import.meta.hot) {\n import.meta.hot.accept(acceptHMRUpdate(useImageRoiStore, import.meta.hot))\n}\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId } from '@/types/common'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { rotateImage } from '@/components/damImage/uploadQueue/api/damImageApi'\n\nconst props = withDefaults(\n defineProps<{\n imageId: DocId\n dataCy?: string\n }>(),\n {\n dataCy: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'afterRotate'): void\n}>()\n\nconst { showRecordWas, showErrorsDefault } = useAlerts()\n\nconst loading = ref(false)\n\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst rotate = async (angle: 90 | 270) => {\n try {\n loading.value = true\n await rotateImage(damClient, props.imageId, angle)\n showRecordWas('updated')\n emit('afterRotate')\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n}\nconst { t } = useI18n()\n</script>\n\n<template>\n <div>\n <div class=\"text-caption\">\n {{ t('common.damImage.asset.detail.roi.rotate.rotateMainFileImage') }}\n </div>\n <div\n v-if=\"loading\"\n class=\"w-100 d-flex align-center justify-center\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n />\n </div>\n <div v-else>\n <ABtnTertiary\n prepend-icon=\"mdi-rotate-right\"\n class=\"mr-2\"\n data-cy=\"button-rotate-right\"\n @click.stop=\"rotate(90)\"\n >\n {{ t('common.damImage.asset.detail.roi.rotate.rotateClockwise') }}\n </ABtnTertiary>\n <ABtnTertiary\n prepend-icon=\"mdi-rotate-left\"\n data-cy=\"button-rotate-left\"\n @click.stop=\"rotate(270)\"\n >\n {{ t('common.damImage.asset.detail.roi.rotate.rotateCounterclockwise') }}\n </ABtnTertiary>\n </div>\n </div>\n</template>\n","import type { RegionOfInterest } from '@/types/coreDam/Roi'\nimport type { AxiosInstance } from 'axios'\nimport type { DocId } from '@/types/common'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport { apiUpdateOne } from '@/services/api/apiUpdateOne'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\n\n// export interface AssetMetadataBulkItem {\n// id: DocId\n// title: string\n// description: string\n// described: boolean\n// }\n\nconst END_POINT = '/adm/v1/roi'\nconst END_POINT_IMAGE_ROI = '/adm/v1/image/:id/roi'\nexport const ENTITY = 'asset'\n\nexport const fetchRoi = (client: () => AxiosInstance, id: DocId) =>\n apiFetchOne<RegionOfInterest>(client, END_POINT + '/:id', { id }, 'coreDam', ENTITY)\n\nexport const updateRoi = (client: () => AxiosInstance, id: DocId, data: RegionOfInterest) =>\n apiUpdateOne<RegionOfInterest>(client, data, END_POINT + '/:id', { id }, 'coreDam', ENTITY)\n\nexport const fetchImageRoiList = (\n client: () => AxiosInstance,\n imageId: DocId,\n pagination: Pagination,\n filterBag: FilterBag\n) => apiFetchList<any[]>(client, END_POINT_IMAGE_ROI, { id: imageId }, pagination, filterBag, 'coreDam', ENTITY)\n","<script lang=\"ts\" setup>\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { useImageRoiStore } from '@/components/damImage/uploadQueue/composables/imageRoiStore'\nimport { useI18n } from 'vue-i18n'\nimport { usePagination } from '@/composables/system/pagination'\nimport { assetFileIsImageFile } from '@/types/coreDam/AssetFile'\nimport { cloneDeep } from '@/utils/common'\nimport { onMounted } from 'vue'\nimport AssetDetailSidebarActionsWrapper from '@/components/damImage/uploadQueue/components/AssetDetailSidebarActionsWrapper.vue'\nimport AssetFileRotate from '@/components/damImage/uploadQueue/components/AssetFileRotate.vue'\nimport { fetchImageRoiList, fetchRoi } from '@/components/damImage/uploadQueue/api/damImageRoiApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nwithDefaults(\n defineProps<{\n isActive: boolean\n queueKey: UploadQueueKey\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n\nconst imageRoiStore = useImageRoiStore()\nconst assetDetailStore = useAssetDetailStore()\n\nconst pagination = usePagination()\n\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst loadRois = async () => {\n if (imageRoiStore.imageFile) {\n imageRoiStore.showLoader()\n const res = await fetchImageRoiList(damClient, imageRoiStore.imageFile.id, pagination, {})\n if (res.length > 0 && res[0].id) {\n const roi = await fetchRoi(damClient, res[0].id)\n imageRoiStore.setRoi(roi)\n imageRoiStore.hideLoader()\n return\n }\n imageRoiStore.setRoi(null)\n imageRoiStore.hideLoader()\n return\n }\n imageRoiStore.setRoi(null)\n imageRoiStore.hideLoader()\n}\n\nconst afterRotate = async () => {\n await loadRois()\n imageRoiStore.forceReloadRoiPreviews()\n imageRoiStore.forceReloadCropper()\n}\n\n// const activeSlotChange = async (slot: null | AssetSlot) => {\n// imageRoiStore.setRoi(null)\n// if (!slot || !assetFileIsImageFile(slot.assetFile)) return\n// imageRoiStore.showLoader()\n// const imageFileDetail = await fetchImageFile(slot.assetFile.id)\n// imageRoiStore.setImageFile(cloneDeep(imageFileDetail))\n// await loadRois()\n// imageRoiStore.forceReloadRoiPreviews()\n// imageRoiStore.forceReloadCropper()\n// }\n\nonMounted(async () => {\n imageRoiStore.reset()\n imageRoiStore.showLoader()\n if (\n assetDetailStore.asset &&\n assetDetailStore.asset.mainFile &&\n assetFileIsImageFile(assetDetailStore.asset.mainFile)\n ) {\n imageRoiStore.setImageFile(cloneDeep(assetDetailStore.asset.mainFile))\n await loadRois()\n }\n imageRoiStore.hideLoader()\n})\n</script>\n\n<template>\n <AssetDetailSidebarActionsWrapper\n v-if=\"isActive\"\n :queue-key=\"queueKey\"\n >\n <ABtnTertiary\n v-if=\"!imageRoiStore.loader\"\n @click.stop=\"imageRoiStore.forceReloadRoiPreviews()\"\n >\n {{ t('common.damImage.asset.detail.roi.refresh') }}\n </ABtnTertiary>\n </AssetDetailSidebarActionsWrapper>\n <div class=\"px-3\">\n <!-- <AssetDetailSlotSelect-->\n <!-- class=\"mt-4\"-->\n <!-- @active-slot-change=\"activeSlotChange\"-->\n <!-- />-->\n <div class=\"v-expansion-panel-title px-0\">\n {{ t('common.damImage.asset.detail.roi.title') }}\n </div>\n <div class=\"text-caption\">\n {{ t('common.damImage.asset.detail.roi.description') }}\n </div>\n </div>\n <div\n v-if=\"imageRoiStore.loader\"\n class=\"w-100 h-100 d-flex align-center justify-center\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n />\n </div>\n <div\n v-else-if=\"imageRoiStore.roi\"\n class=\"crop-preview pa-2\"\n >\n <div\n v-for=\"item in imageRoiStore.roi?.links.image_roi_example\"\n :key=\"item.url\"\n class=\"pb-2\"\n >\n <div class=\"text-subtitle-2\">\n {{ item.title }}\n </div>\n <img\n :src=\"item.url + '?timestamp=' + imageRoiStore.timestampRoiPreviews\"\n :width=\"item.width\"\n :height=\"item.height\"\n alt=\"\"\n >\n </div>\n </div>\n <AssetFileRotate\n v-if=\"imageRoiStore.imageFile\"\n :image-id=\"imageRoiStore.imageFile.id\"\n class=\"mx-2\"\n @after-rotate=\"afterRotate\"\n />\n</template>\n\n<style lang=\"scss\">\n.crop-preview {\n width: 100%;\n\n img {\n max-width: 100%;\n height: auto;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted } from 'vue'\nimport { useAssetDetailSidebarActionbar } from '@/components/damImage/uploadQueue/composables/assetDetailSidebarActionbar'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n }>(),\n {\n }\n)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { mounted, unMounted, divClassName } = useAssetDetailSidebarActionbar(props.queueKey)\n\nonMounted(async () => {\n await nextTick()\n mounted()\n})\n\nonBeforeUnmount(() => {\n unMounted()\n})\n</script>\n\n<template>\n <div :class=\"divClassName\" />\n</template>\n","<script setup lang=\"ts\">\nimport {\n AssetDetailTabImageWithRoi,\n useAssetDetailStore,\n} from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport type { DocId, IntegerId } from '@/types/common'\nimport type { DamAssetStatusType, DamAssetTypeType } from '@/types/coreDam/Asset'\nimport type { AssetFileFailReasonType, AssetFileProcessStatusType } from '@/types/coreDam/AssetFile'\nimport { useI18n } from 'vue-i18n'\nimport AssetInfobox from '@/components/damImage/uploadQueue/components/AssetInfobox.vue'\nimport AssetDetailSidebarMetadata from '@/components/damImage/uploadQueue/components/AssetDetailSidebarMetadata.vue'\nimport AssetDetailSidebarROI from '@/components/damImage/uploadQueue/components/AssetDetailSidebarROI.vue'\nimport AssetDetailSidebarActionsTeleportTarget from '@/components/damImage/uploadQueue/components/AssetDetailSidebarActionsTeleportTarget.vue'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nwithDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n extSystem: IntegerId\n assetId: DocId\n isVideo: boolean\n isAudio: boolean\n isImage: boolean\n isDocument: boolean\n dataCy?: string\n assetStatus: DamAssetStatusType\n assetType: DamAssetTypeType\n assetMainFileStatus?: AssetFileProcessStatusType | undefined\n assetMainFileFailReason?: AssetFileFailReasonType | undefined\n }>(),\n {\n assetMainFileStatus: undefined,\n assetMainFileFailReason: undefined,\n dataCy: undefined,\n }\n)\n\nconst { t } = useI18n()\n\nconst assetDetailStore = useAssetDetailStore()\nconst { activeTab } = storeToRefs(assetDetailStore)\n</script>\n\n<template>\n <div class=\"sidebar-info d-flex w-100 h-100 flex-column\">\n <div class=\"w-100 d-flex flex-column\">\n <VTabs\n v-model=\"activeTab\"\n show-arrows\n class=\"sidebar-info__tabs\"\n >\n <VTab\n :value=\"AssetDetailTabImageWithRoi.Info\"\n data-cy=\"button-meta\"\n >\n {{ t('common.damImage.asset.detail.tabs.info') }}\n </VTab>\n <VTab\n v-if=\"isImage\"\n :value=\"AssetDetailTabImageWithRoi.ROI\"\n data-cy=\"button-focus\"\n >\n {{ t('common.damImage.asset.detail.tabs.roi') }}\n </VTab>\n </VTabs>\n\n <div class=\"sidebar-info__content\">\n <AssetInfobox\n :asset-status=\"assetStatus\"\n :asset-main-file-status=\"assetMainFileStatus\"\n :asset-main-file-fail-reason=\"assetMainFileFailReason\"\n />\n <div\n v-if=\"activeTab === AssetDetailTabImageWithRoi.Info\"\n class=\"py-2\"\n >\n <AssetDetailSidebarMetadata\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n :is-active=\"activeTab === AssetDetailTabImageWithRoi.Info\"\n :asset-type=\"assetType\"\n />\n </div>\n <div\n v-if=\"isImage && activeTab === AssetDetailTabImageWithRoi.ROI\"\n class=\"py-2\"\n >\n <AssetDetailSidebarROI\n :is-active=\"activeTab === AssetDetailTabImageWithRoi.ROI\"\n :queue-key=\"queueKey\"\n />\n </div>\n </div>\n <div class=\"sidebar-info__actions px-2\">\n <AssetDetailSidebarActionsTeleportTarget :queue-key=\"queueKey\" />\n </div>\n </div>\n </div>\n</template>\n","import type { RegionOfInterest } from '@/types/coreDam/Roi'\nimport type Cropper from 'cropperjs'\nimport { stringToFloat, stringToInt } from '@/utils/string'\n\nconst PRECISION = 3\n\nexport const regionToCrop = function (\n cropper: Cropper,\n regionOfInterest: RegionOfInterest,\n originalImageWidth: number,\n originalImageHeight: number\n) {\n const imageData = cropper.getImageData()\n const ratio = imageData.naturalHeight / originalImageHeight\n\n return {\n x: regionOfInterest.pointX * ratio,\n y: regionOfInterest.pointY * ratio,\n width: regionOfInterest.percentageWidth * imageData.naturalWidth,\n height: regionOfInterest.percentageHeight * imageData.naturalHeight,\n rotate: 0,\n scaleX: 1,\n scaleY: 1,\n }\n}\n\nexport const cropToRegion = function (\n cropper: Cropper,\n regionOfInterest: RegionOfInterest,\n originalImageWidth: number,\n originalImageHeight: number\n) {\n const imageData = cropper.getImageData()\n const data = cropper.getData()\n const ratio = imageData.naturalHeight / originalImageHeight\n\n let pointX = stringToInt((data.x / ratio).toFixed(PRECISION))\n if (pointX < 0) pointX = 0\n\n let pointY = stringToInt((data.y / ratio).toFixed(PRECISION))\n if (pointY < 0) pointY = 0\n\n let percentageWidth = stringToFloat((data.width / imageData.naturalWidth).toFixed(PRECISION))\n const validateWidth = percentageWidth * originalImageWidth + pointX\n if (validateWidth > originalImageWidth) {\n percentageWidth = percentageWidth - ((validateWidth - originalImageWidth) * 100) / originalImageWidth\n }\n\n let percentageHeight = stringToFloat((data.height / imageData.naturalHeight).toFixed(PRECISION))\n const validateHeight = percentageHeight * originalImageHeight + pointY\n if (validateHeight > originalImageHeight) {\n percentageHeight = percentageHeight - ((validateHeight - originalImageHeight) * 100) / originalImageHeight\n }\n\n regionOfInterest.pointX = pointX\n regionOfInterest.pointY = pointY\n regionOfInterest.percentageWidth = percentageWidth\n regionOfInterest.percentageHeight = percentageHeight\n\n return regionOfInterest\n}\n","/*!\n * Cropper.js v1.6.2\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-04-21T07:43:05.335Z\n */\n\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nfunction _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nvar WINDOW = IS_BROWSER ? window : {};\nvar IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\nvar HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\nvar NAMESPACE = 'cropper';\n\n// Actions\nvar ACTION_ALL = 'all';\nvar ACTION_CROP = 'crop';\nvar ACTION_MOVE = 'move';\nvar ACTION_ZOOM = 'zoom';\nvar ACTION_EAST = 'e';\nvar ACTION_WEST = 'w';\nvar ACTION_SOUTH = 's';\nvar ACTION_NORTH = 'n';\nvar ACTION_NORTH_EAST = 'ne';\nvar ACTION_NORTH_WEST = 'nw';\nvar ACTION_SOUTH_EAST = 'se';\nvar ACTION_SOUTH_WEST = 'sw';\n\n// Classes\nvar CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\nvar CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\nvar CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\nvar CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\nvar CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\nvar CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\nvar CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n\n// Data keys\nvar DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\nvar DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\");\n\n// Drag modes\nvar DRAG_MODE_CROP = 'crop';\nvar DRAG_MODE_MOVE = 'move';\nvar DRAG_MODE_NONE = 'none';\n\n// Events\nvar EVENT_CROP = 'crop';\nvar EVENT_CROP_END = 'cropend';\nvar EVENT_CROP_MOVE = 'cropmove';\nvar EVENT_CROP_START = 'cropstart';\nvar EVENT_DBLCLICK = 'dblclick';\nvar EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\nvar EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\nvar EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\nvar EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\nvar EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\nvar EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\nvar EVENT_READY = 'ready';\nvar EVENT_RESIZE = 'resize';\nvar EVENT_WHEEL = 'wheel';\nvar EVENT_ZOOM = 'zoom';\n\n// Mime types\nvar MIME_TYPE_JPEG = 'image/jpeg';\n\n// RegExps\nvar REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\nvar REGEXP_DATA_URL = /^data:/;\nvar REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\nvar REGEXP_TAG_NAME = /^img|canvas$/i;\n\n// Misc\n// Inspired by the default width and height of a canvas element.\nvar MIN_CONTAINER_WIDTH = 200;\nvar MIN_CONTAINER_HEIGHT = 100;\n\nvar DEFAULTS = {\n // Define the view mode of the cropper\n viewMode: 0,\n // 0, 1, 2, 3\n\n // Define the dragging mode of the cropper\n dragMode: DRAG_MODE_CROP,\n // 'crop', 'move' or 'none'\n\n // Define the initial aspect ratio of the crop box\n initialAspectRatio: NaN,\n // Define the aspect ratio of the crop box\n aspectRatio: NaN,\n // An object with the previous cropping result data\n data: null,\n // A selector for adding extra containers to preview\n preview: '',\n // Re-render the cropper when resize the window\n responsive: true,\n // Restore the cropped area after resize the window\n restore: true,\n // Check if the current image is a cross-origin image\n checkCrossOrigin: true,\n // Check the current image's Exif Orientation information\n checkOrientation: true,\n // Show the black modal\n modal: true,\n // Show the dashed lines for guiding\n guides: true,\n // Show the center indicator for guiding\n center: true,\n // Show the white modal to highlight the crop box\n highlight: true,\n // Show the grid background\n background: true,\n // Enable to crop the image automatically when initialize\n autoCrop: true,\n // Define the percentage of automatic cropping area when initializes\n autoCropArea: 0.8,\n // Enable to move the image\n movable: true,\n // Enable to rotate the image\n rotatable: true,\n // Enable to scale the image\n scalable: true,\n // Enable to zoom the image\n zoomable: true,\n // Enable to zoom the image by dragging touch\n zoomOnTouch: true,\n // Enable to zoom the image by wheeling mouse\n zoomOnWheel: true,\n // Define zoom ratio when zoom the image by wheeling mouse\n wheelZoomRatio: 0.1,\n // Enable to move the crop box\n cropBoxMovable: true,\n // Enable to resize the crop box\n cropBoxResizable: true,\n // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n toggleDragModeOnDblclick: true,\n // Size limitation\n minCanvasWidth: 0,\n minCanvasHeight: 0,\n minCropBoxWidth: 0,\n minCropBoxHeight: 0,\n minContainerWidth: MIN_CONTAINER_WIDTH,\n minContainerHeight: MIN_CONTAINER_HEIGHT,\n // Shortcuts of events\n ready: null,\n cropstart: null,\n cropmove: null,\n cropend: null,\n crop: null,\n zoom: null\n};\n\nvar TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\n\n/**\n * Check if the given value is not a number.\n */\nvar isNaN = Number.isNaN || WINDOW.isNaN;\n\n/**\n * Check if the given value is a number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n */\nfunction isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n}\n\n/**\n * Check if the given value is a positive number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n */\nvar isPositiveNumber = function isPositiveNumber(value) {\n return value > 0 && value < Infinity;\n};\n\n/**\n * Check if the given value is undefined.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n */\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\n\n/**\n * Check if the given value is an object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n */\nfunction isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Check if the given value is a plain object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n */\nfunction isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\n try {\n var _constructor = value.constructor;\n var prototype = _constructor.prototype;\n return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Check if the given value is a function.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n */\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nvar slice = Array.prototype.slice;\n\n/**\n * Convert array-like or iterable object to an array.\n * @param {*} value - The value to convert.\n * @returns {Array} Returns a new array.\n */\nfunction toArray(value) {\n return Array.from ? Array.from(value) : slice.call(value);\n}\n\n/**\n * Iterate the given data.\n * @param {*} data - The data to iterate.\n * @param {Function} callback - The process function for each element.\n * @returns {*} The original data.\n */\nfunction forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n toArray(data).forEach(function (value, key) {\n callback.call(data, value, key, data);\n });\n } else if (isObject(data)) {\n Object.keys(data).forEach(function (key) {\n callback.call(data, data[key], key, data);\n });\n }\n }\n return data;\n}\n\n/**\n * Extend the given object.\n * @param {*} target - The target object to extend.\n * @param {*} args - The rest objects for merging to the target object.\n * @returns {Object} The extended object.\n */\nvar assign = Object.assign || function assign(target) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (isObject(target) && args.length > 0) {\n args.forEach(function (arg) {\n if (isObject(arg)) {\n Object.keys(arg).forEach(function (key) {\n target[key] = arg[key];\n });\n }\n });\n }\n return target;\n};\nvar REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n\n/**\n * Normalize decimal number.\n * Check out {@link https://0.30000000000000004.com/}\n * @param {number} value - The value to normalize.\n * @param {number} [times=100000000000] - The times for normalizing.\n * @returns {number} Returns the normalized number.\n */\nfunction normalizeDecimalNumber(value) {\n var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n}\nvar REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n\n/**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\nfunction setStyle(element, styles) {\n var style = element.style;\n forEach(styles, function (value, property) {\n if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n value = \"\".concat(value, \"px\");\n }\n style[property] = value;\n });\n}\n\n/**\n * Check if the given element has a special class.\n * @param {Element} element - The element to check.\n * @param {string} value - The class to search.\n * @returns {boolean} Returns `true` if the special class was found.\n */\nfunction hasClass(element, value) {\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n}\n\n/**\n * Add classes to the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be added.\n */\nfunction addClass(element, value) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n var className = element.className.trim();\n if (!className) {\n element.className = value;\n } else if (className.indexOf(value) < 0) {\n element.className = \"\".concat(className, \" \").concat(value);\n }\n}\n\n/**\n * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\nfunction removeClass(element, value) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\n }\n}\n\n/**\n * Add or remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be toggled.\n * @param {boolean} added - Add only.\n */\nfunction toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n }\n\n // IE10-11 doesn't support the second parameter of `classList.toggle`\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n}\nvar REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n\n/**\n * Transform the given string from camelCase to kebab-case\n * @param {string} value - The value to transform.\n * @returns {string} The transformed value.\n */\nfunction toParamCase(value) {\n return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n}\n\n/**\n * Get data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to get.\n * @returns {string} The data value.\n */\nfunction getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n if (element.dataset) {\n return element.dataset[name];\n }\n return element.getAttribute(\"data-\".concat(toParamCase(name)));\n}\n\n/**\n * Set data to the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to set.\n * @param {string} data - The data value.\n */\nfunction setData(element, name, data) {\n if (isObject(data)) {\n element[name] = data;\n } else if (element.dataset) {\n element.dataset[name] = data;\n } else {\n element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n }\n}\n\n/**\n * Remove data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to remove.\n */\nfunction removeData(element, name) {\n if (isObject(element[name])) {\n try {\n delete element[name];\n } catch (error) {\n element[name] = undefined;\n }\n } else if (element.dataset) {\n // #128 Safari not allows to delete dataset property\n try {\n delete element.dataset[name];\n } catch (error) {\n element.dataset[name] = undefined;\n }\n } else {\n element.removeAttribute(\"data-\".concat(toParamCase(name)));\n }\n}\nvar REGEXP_SPACES = /\\s\\s*/;\nvar onceSupported = function () {\n var supported = false;\n if (IS_BROWSER) {\n var once = false;\n var listener = function listener() {};\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\n /**\n * This setter can fix a `TypeError` in strict mode\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n * @param {boolean} value - The value to set\n */\n set: function set(value) {\n once = value;\n }\n });\n WINDOW.addEventListener('test', listener, options);\n WINDOW.removeEventListener('test', listener, options);\n }\n return supported;\n}();\n\n/**\n * Remove event listener from the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\nfunction removeListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (!onceSupported) {\n var listeners = element.listeners;\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n element.removeEventListener(event, handler, options);\n });\n}\n\n/**\n * Add event listener to the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\nfunction addListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var _handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (options.once && !onceSupported) {\n var _element$listeners = element.listeners,\n listeners = _element$listeners === void 0 ? {} : _element$listeners;\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n listener.apply(element, args);\n };\n if (!listeners[event]) {\n listeners[event] = {};\n }\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n element.addEventListener(event, _handler, options);\n });\n}\n\n/**\n * Dispatch event on the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Object} data - The additional event data.\n * @returns {boolean} Indicate if the event is default prevented or not.\n */\nfunction dispatchEvent(element, type, data) {\n var event;\n\n // Event and CustomEvent on IE9-11 are global objects, not constructors\n if (isFunction(Event) && isFunction(CustomEvent)) {\n event = new CustomEvent(type, {\n detail: data,\n bubbles: true,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, data);\n }\n return element.dispatchEvent(event);\n}\n\n/**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\nfunction getOffset(element) {\n var box = element.getBoundingClientRect();\n return {\n left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n };\n}\nvar location = WINDOW.location;\nvar REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n\n/**\n * Check if the given URL is a cross origin URL.\n * @param {string} url - The target URL.\n * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n */\nfunction isCrossOriginURL(url) {\n var parts = url.match(REGEXP_ORIGINS);\n return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n}\n\n/**\n * Add timestamp to the given URL.\n * @param {string} url - The target URL.\n * @returns {string} The result URL.\n */\nfunction addTimestamp(url) {\n var timestamp = \"timestamp=\".concat(new Date().getTime());\n return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n}\n\n/**\n * Get transforms base on the given object.\n * @param {Object} obj - The target object.\n * @returns {string} A string contains transform values.\n */\nfunction getTransforms(_ref) {\n var rotate = _ref.rotate,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n translateX = _ref.translateX,\n translateY = _ref.translateY;\n var values = [];\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n }\n\n // Rotate should come first before scale to match orientation transform\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\n };\n}\n\n/**\n * Get the max ratio of a group of pointers.\n * @param {string} pointers - The target pointers.\n * @returns {number} The result ratio.\n */\nfunction getMaxZoomRatio(pointers) {\n var pointers2 = _objectSpread2({}, pointers);\n var maxRatio = 0;\n forEach(pointers, function (pointer, pointerId) {\n delete pointers2[pointerId];\n forEach(pointers2, function (pointer2) {\n var x1 = Math.abs(pointer.startX - pointer2.startX);\n var y1 = Math.abs(pointer.startY - pointer2.startY);\n var x2 = Math.abs(pointer.endX - pointer2.endX);\n var y2 = Math.abs(pointer.endY - pointer2.endY);\n var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n var ratio = (z2 - z1) / z1;\n if (Math.abs(ratio) > Math.abs(maxRatio)) {\n maxRatio = ratio;\n }\n });\n });\n return maxRatio;\n}\n\n/**\n * Get a pointer from an event object.\n * @param {Object} event - The target event object.\n * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n * @returns {Object} The result pointer contains start and/or end point coordinates.\n */\nfunction getPointer(_ref2, endOnly) {\n var pageX = _ref2.pageX,\n pageY = _ref2.pageY;\n var end = {\n endX: pageX,\n endY: pageY\n };\n return endOnly ? end : _objectSpread2({\n startX: pageX,\n startY: pageY\n }, end);\n}\n\n/**\n * Get the center point coordinate of a group of pointers.\n * @param {Object} pointers - The target pointers.\n * @returns {Object} The center point coordinate.\n */\nfunction getPointersCenter(pointers) {\n var pageX = 0;\n var pageY = 0;\n var count = 0;\n forEach(pointers, function (_ref3) {\n var startX = _ref3.startX,\n startY = _ref3.startY;\n pageX += startX;\n pageY += startY;\n count += 1;\n });\n pageX /= count;\n pageY /= count;\n return {\n pageX: pageX,\n pageY: pageY\n };\n}\n\n/**\n * Get the max sizes in a rectangle under the given aspect ratio.\n * @param {Object} data - The original sizes.\n * @param {string} [type='contain'] - The adjust type.\n * @returns {Object} The result sizes.\n */\nfunction getAdjustedSizes(_ref4) {\n var aspectRatio = _ref4.aspectRatio,\n height = _ref4.height,\n width = _ref4.width;\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n var isValidWidth = isPositiveNumber(width);\n var isValidHeight = isPositiveNumber(height);\n if (isValidWidth && isValidHeight) {\n var adjustedWidth = height * aspectRatio;\n if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n } else if (isValidWidth) {\n height = width / aspectRatio;\n } else if (isValidHeight) {\n width = height * aspectRatio;\n }\n return {\n width: width,\n height: height\n };\n}\n\n/**\n * Get the new sizes of a rectangle after rotated.\n * @param {Object} data - The original sizes.\n * @returns {Object} The result sizes.\n */\nfunction getRotatedSizes(_ref5) {\n var width = _ref5.width,\n height = _ref5.height,\n degree = _ref5.degree;\n degree = Math.abs(degree) % 180;\n if (degree === 90) {\n return {\n width: height,\n height: width\n };\n }\n var arc = degree % 90 * Math.PI / 180;\n var sinArc = Math.sin(arc);\n var cosArc = Math.cos(arc);\n var newWidth = width * cosArc + height * sinArc;\n var newHeight = width * sinArc + height * cosArc;\n return degree > 90 ? {\n width: newHeight,\n height: newWidth\n } : {\n width: newWidth,\n height: newHeight\n };\n}\n\n/**\n * Get a canvas which drew the given image.\n * @param {HTMLImageElement} image - The image for drawing.\n * @param {Object} imageData - The image data.\n * @param {Object} canvasData - The canvas data.\n * @param {Object} options - The options.\n * @returns {HTMLCanvasElement} The result canvas.\n */\nfunction getSourceCanvas(image, _ref6, _ref7, _ref8) {\n var imageAspectRatio = _ref6.aspectRatio,\n imageNaturalWidth = _ref6.naturalWidth,\n imageNaturalHeight = _ref6.naturalHeight,\n _ref6$rotate = _ref6.rotate,\n rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n _ref6$scaleX = _ref6.scaleX,\n scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n _ref6$scaleY = _ref6.scaleY,\n scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n var aspectRatio = _ref7.aspectRatio,\n naturalWidth = _ref7.naturalWidth,\n naturalHeight = _ref7.naturalHeight;\n var _ref8$fillColor = _ref8.fillColor,\n fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n _ref8$maxWidth = _ref8.maxWidth,\n maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n _ref8$maxHeight = _ref8.maxHeight,\n maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n _ref8$minWidth = _ref8.minWidth,\n minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n _ref8$minHeight = _ref8.minHeight,\n minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight));\n\n // Note: should always use image's natural sizes for drawing as\n // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n var destMaxSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var destMinSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = fillColor;\n context.fillRect(0, 0, width, height);\n context.save();\n context.translate(width / 2, height / 2);\n context.rotate(rotate * Math.PI / 180);\n context.scale(scaleX, scaleY);\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n context.imageSmoothingQuality = imageSmoothingQuality;\n context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n context.restore();\n return canvas;\n}\nvar fromCharCode = String.fromCharCode;\n\n/**\n * Get string from char code in data view.\n * @param {DataView} dataView - The data view for read.\n * @param {number} start - The start index.\n * @param {number} length - The read length.\n * @returns {string} The read result.\n */\nfunction getStringFromCharCode(dataView, start, length) {\n var str = '';\n length += start;\n for (var i = start; i < length; i += 1) {\n str += fromCharCode(dataView.getUint8(i));\n }\n return str;\n}\nvar REGEXP_DATA_URL_HEAD = /^data:.*,/;\n\n/**\n * Transform Data URL to array buffer.\n * @param {string} dataURL - The Data URL to transform.\n * @returns {ArrayBuffer} The result array buffer.\n */\nfunction dataURLToArrayBuffer(dataURL) {\n var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n var binary = atob(base64);\n var arrayBuffer = new ArrayBuffer(binary.length);\n var uint8 = new Uint8Array(arrayBuffer);\n forEach(uint8, function (value, i) {\n uint8[i] = binary.charCodeAt(i);\n });\n return arrayBuffer;\n}\n\n/**\n * Transform array buffer to Data URL.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n * @param {string} mimeType - The mime type of the Data URL.\n * @returns {string} The result Data URL.\n */\nfunction arrayBufferToDataURL(arrayBuffer, mimeType) {\n var chunks = [];\n\n // Chunk Typed Array for better performance (#435)\n var chunkSize = 8192;\n var uint8 = new Uint8Array(arrayBuffer);\n while (uint8.length > 0) {\n // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n // eslint-disable-next-line prefer-spread\n chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n uint8 = uint8.subarray(chunkSize);\n }\n return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n}\n\n/**\n * Get orientation value from given array buffer.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n * @returns {number} The read orientation value.\n */\nfunction resetAndGetOrientation(arrayBuffer) {\n var dataView = new DataView(arrayBuffer);\n var orientation;\n\n // Ignores range error when the image does not have correct Exif information\n try {\n var littleEndian;\n var app1Start;\n var ifdStart;\n\n // Only handle JPEG image (start by 0xFFD8)\n if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n var length = dataView.byteLength;\n var offset = 2;\n while (offset + 1 < length) {\n if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n app1Start = offset;\n break;\n }\n offset += 1;\n }\n }\n if (app1Start) {\n var exifIDCode = app1Start + 4;\n var tiffOffset = app1Start + 10;\n if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n var endianness = dataView.getUint16(tiffOffset);\n littleEndian = endianness === 0x4949;\n if (littleEndian || endianness === 0x4D4D /* bigEndian */) {\n if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n if (firstIFDOffset >= 0x00000008) {\n ifdStart = tiffOffset + firstIFDOffset;\n }\n }\n }\n }\n }\n if (ifdStart) {\n var _length = dataView.getUint16(ifdStart, littleEndian);\n var _offset;\n var i;\n for (i = 0; i < _length; i += 1) {\n _offset = ifdStart + i * 12 + 2;\n if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) {\n // 8 is the offset of the current tag's value\n _offset += 8;\n\n // Get the original orientation value\n orientation = dataView.getUint16(_offset, littleEndian);\n\n // Override the orientation with its default value\n dataView.setUint16(_offset, 1, littleEndian);\n break;\n }\n }\n }\n } catch (error) {\n orientation = 1;\n }\n return orientation;\n}\n\n/**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\nfunction parseOrientation(orientation) {\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n switch (orientation) {\n // Flip horizontal\n case 2:\n scaleX = -1;\n break;\n\n // Rotate left 180°\n case 3:\n rotate = -180;\n break;\n\n // Flip vertical\n case 4:\n scaleY = -1;\n break;\n\n // Flip vertical and rotate right 90°\n case 5:\n rotate = 90;\n scaleY = -1;\n break;\n\n // Rotate right 90°\n case 6:\n rotate = 90;\n break;\n\n // Flip horizontal and rotate right 90°\n case 7:\n rotate = 90;\n scaleX = -1;\n break;\n\n // Rotate left 90°\n case 8:\n rotate = -90;\n break;\n }\n return {\n rotate: rotate,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n\nvar render = {\n render: function render() {\n this.initContainer();\n this.initCanvas();\n this.initCropBox();\n this.renderCanvas();\n if (this.cropped) {\n this.renderCropBox();\n }\n },\n initContainer: function initContainer() {\n var element = this.element,\n options = this.options,\n container = this.container,\n cropper = this.cropper;\n var minWidth = Number(options.minContainerWidth);\n var minHeight = Number(options.minContainerHeight);\n addClass(cropper, CLASS_HIDDEN);\n removeClass(element, CLASS_HIDDEN);\n var containerData = {\n width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n };\n this.containerData = containerData;\n setStyle(cropper, {\n width: containerData.width,\n height: containerData.height\n });\n addClass(element, CLASS_HIDDEN);\n removeClass(cropper, CLASS_HIDDEN);\n },\n // Canvas (image wrapper)\n initCanvas: function initCanvas() {\n var containerData = this.containerData,\n imageData = this.imageData;\n var viewMode = this.options.viewMode;\n var rotated = Math.abs(imageData.rotate) % 180 === 90;\n var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n var aspectRatio = naturalWidth / naturalHeight;\n var canvasWidth = containerData.width;\n var canvasHeight = containerData.height;\n if (containerData.height * aspectRatio > containerData.width) {\n if (viewMode === 3) {\n canvasWidth = containerData.height * aspectRatio;\n } else {\n canvasHeight = containerData.width / aspectRatio;\n }\n } else if (viewMode === 3) {\n canvasHeight = containerData.width / aspectRatio;\n } else {\n canvasWidth = containerData.height * aspectRatio;\n }\n var canvasData = {\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n width: canvasWidth,\n height: canvasHeight\n };\n this.canvasData = canvasData;\n this.limited = viewMode === 1 || viewMode === 2;\n this.limitCanvas(true, true);\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n canvasData.left = (containerData.width - canvasData.width) / 2;\n canvasData.top = (containerData.height - canvasData.height) / 2;\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n this.initialCanvasData = assign({}, canvasData);\n },\n limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var viewMode = options.viewMode;\n var aspectRatio = canvasData.aspectRatio;\n var cropped = this.cropped && cropBoxData;\n if (sizeLimited) {\n var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n if (viewMode > 1) {\n minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n if (viewMode === 3) {\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n } else if (viewMode > 0) {\n if (minCanvasWidth) {\n minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n } else if (minCanvasHeight) {\n minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n } else if (cropped) {\n minCanvasWidth = cropBoxData.width;\n minCanvasHeight = cropBoxData.height;\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n }\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minCanvasWidth,\n height: minCanvasHeight\n });\n minCanvasWidth = _getAdjustedSizes.width;\n minCanvasHeight = _getAdjustedSizes.height;\n canvasData.minWidth = minCanvasWidth;\n canvasData.minHeight = minCanvasHeight;\n canvasData.maxWidth = Infinity;\n canvasData.maxHeight = Infinity;\n }\n if (positionLimited) {\n if (viewMode > (cropped ? 0 : 1)) {\n var newCanvasLeft = containerData.width - canvasData.width;\n var newCanvasTop = containerData.height - canvasData.height;\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n if (cropped && this.limited) {\n canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n canvasData.maxLeft = cropBoxData.left;\n canvasData.maxTop = cropBoxData.top;\n if (viewMode === 2) {\n if (canvasData.width >= containerData.width) {\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n }\n if (canvasData.height >= containerData.height) {\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n }\n }\n }\n } else {\n canvasData.minLeft = -canvasData.width;\n canvasData.minTop = -canvasData.height;\n canvasData.maxLeft = containerData.width;\n canvasData.maxTop = containerData.height;\n }\n }\n },\n renderCanvas: function renderCanvas(changed, transformed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n if (transformed) {\n var _getRotatedSizes = getRotatedSizes({\n width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n degree: imageData.rotate || 0\n }),\n naturalWidth = _getRotatedSizes.width,\n naturalHeight = _getRotatedSizes.height;\n var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n canvasData.left -= (width - canvasData.width) / 2;\n canvasData.top -= (height - canvasData.height) / 2;\n canvasData.width = width;\n canvasData.height = height;\n canvasData.aspectRatio = naturalWidth / naturalHeight;\n canvasData.naturalWidth = naturalWidth;\n canvasData.naturalHeight = naturalHeight;\n this.limitCanvas(true, false);\n }\n if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n canvasData.left = canvasData.oldLeft;\n }\n if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n canvasData.top = canvasData.oldTop;\n }\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n this.limitCanvas(false, true);\n canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n setStyle(this.canvas, assign({\n width: canvasData.width,\n height: canvasData.height\n }, getTransforms({\n translateX: canvasData.left,\n translateY: canvasData.top\n })));\n this.renderImage(changed);\n if (this.cropped && this.limited) {\n this.limitCropBox(true, true);\n }\n },\n renderImage: function renderImage(changed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n assign(imageData, {\n width: width,\n height: height,\n left: (canvasData.width - width) / 2,\n top: (canvasData.height - height) / 2\n });\n setStyle(this.image, assign({\n width: imageData.width,\n height: imageData.height\n }, getTransforms(assign({\n translateX: imageData.left,\n translateY: imageData.top\n }, imageData))));\n if (changed) {\n this.output();\n }\n },\n initCropBox: function initCropBox() {\n var options = this.options,\n canvasData = this.canvasData;\n var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n var autoCropArea = Number(options.autoCropArea) || 0.8;\n var cropBoxData = {\n width: canvasData.width,\n height: canvasData.height\n };\n if (aspectRatio) {\n if (canvasData.height * aspectRatio > canvasData.width) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n this.cropBoxData = cropBoxData;\n this.limitCropBox(true, true);\n\n // Initialize auto crop area\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n\n // The width/height of auto crop area must large than \"minWidth/Height\"\n cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n this.initialCropBoxData = assign({}, cropBoxData);\n },\n limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData,\n limited = this.limited;\n var aspectRatio = options.aspectRatio;\n if (sizeLimited) {\n var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height;\n\n // The min/maxCropBoxWidth/Height must be less than container's width/height\n minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n if (aspectRatio) {\n if (minCropBoxWidth && minCropBoxHeight) {\n if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n } else if (minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else if (minCropBoxHeight) {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n } else {\n maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n }\n }\n\n // The minWidth/Height must be less than maxWidth/Height\n cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n cropBoxData.maxWidth = maxCropBoxWidth;\n cropBoxData.maxHeight = maxCropBoxHeight;\n }\n if (positionLimited) {\n if (limited) {\n cropBoxData.minLeft = Math.max(0, canvasData.left);\n cropBoxData.minTop = Math.max(0, canvasData.top);\n cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n } else {\n cropBoxData.minLeft = 0;\n cropBoxData.minTop = 0;\n cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n cropBoxData.maxTop = containerData.height - cropBoxData.height;\n }\n }\n },\n renderCropBox: function renderCropBox() {\n var options = this.options,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData;\n if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n cropBoxData.left = cropBoxData.oldLeft;\n }\n if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n cropBoxData.top = cropBoxData.oldTop;\n }\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n this.limitCropBox(false, true);\n cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n if (options.movable && options.cropBoxMovable) {\n // Turn to move the canvas when the crop box is equal to the container\n setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n }\n setStyle(this.cropBox, assign({\n width: cropBoxData.width,\n height: cropBoxData.height\n }, getTransforms({\n translateX: cropBoxData.left,\n translateY: cropBoxData.top\n })));\n if (this.cropped && this.limited) {\n this.limitCanvas(true, true);\n }\n if (!this.disabled) {\n this.output();\n }\n },\n output: function output() {\n this.preview();\n dispatchEvent(this.element, EVENT_CROP, this.getData());\n }\n};\n\nvar preview = {\n initPreview: function initPreview() {\n var element = this.element,\n crossOrigin = this.crossOrigin;\n var preview = this.options.preview;\n var url = crossOrigin ? this.crossOriginUrl : this.url;\n var alt = element.alt || 'The image to preview';\n var image = document.createElement('img');\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n image.src = url;\n image.alt = alt;\n this.viewBox.appendChild(image);\n this.viewBoxImage = image;\n if (!preview) {\n return;\n }\n var previews = preview;\n if (typeof preview === 'string') {\n previews = element.ownerDocument.querySelectorAll(preview);\n } else if (preview.querySelector) {\n previews = [preview];\n }\n this.previews = previews;\n forEach(previews, function (el) {\n var img = document.createElement('img');\n\n // Save the original size for recover\n setData(el, DATA_PREVIEW, {\n width: el.offsetWidth,\n height: el.offsetHeight,\n html: el.innerHTML\n });\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n img.src = url;\n img.alt = alt;\n\n /**\n * Override img element styles\n * Add `display:block` to avoid margin top issue\n * Add `height:auto` to override `height` attribute on IE8\n * (Occur only when margin-top <= -height)\n */\n img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n el.innerHTML = '';\n el.appendChild(img);\n });\n },\n resetPreview: function resetPreview() {\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n setStyle(element, {\n width: data.width,\n height: data.height\n });\n element.innerHTML = data.html;\n removeData(element, DATA_PREVIEW);\n });\n },\n preview: function preview() {\n var imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var cropBoxWidth = cropBoxData.width,\n cropBoxHeight = cropBoxData.height;\n var width = imageData.width,\n height = imageData.height;\n var left = cropBoxData.left - canvasData.left - imageData.left;\n var top = cropBoxData.top - canvasData.top - imageData.top;\n if (!this.cropped || this.disabled) {\n return;\n }\n setStyle(this.viewBoxImage, assign({\n width: width,\n height: height\n }, getTransforms(assign({\n translateX: -left,\n translateY: -top\n }, imageData))));\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n var originalWidth = data.width;\n var originalHeight = data.height;\n var newWidth = originalWidth;\n var newHeight = originalHeight;\n var ratio = 1;\n if (cropBoxWidth) {\n ratio = originalWidth / cropBoxWidth;\n newHeight = cropBoxHeight * ratio;\n }\n if (cropBoxHeight && newHeight > originalHeight) {\n ratio = originalHeight / cropBoxHeight;\n newWidth = cropBoxWidth * ratio;\n newHeight = originalHeight;\n }\n setStyle(element, {\n width: newWidth,\n height: newHeight\n });\n setStyle(element.getElementsByTagName('img')[0], assign({\n width: width * ratio,\n height: height * ratio\n }, getTransforms(assign({\n translateX: -left * ratio,\n translateY: -top * ratio\n }, imageData))));\n });\n }\n};\n\nvar events = {\n bind: function bind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n if (isFunction(options.cropstart)) {\n addListener(element, EVENT_CROP_START, options.cropstart);\n }\n if (isFunction(options.cropmove)) {\n addListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n if (isFunction(options.cropend)) {\n addListener(element, EVENT_CROP_END, options.cropend);\n }\n if (isFunction(options.crop)) {\n addListener(element, EVENT_CROP, options.crop);\n }\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom);\n }\n addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n if (options.zoomable && options.zoomOnWheel) {\n addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n passive: false,\n capture: true\n });\n }\n if (options.toggleDragModeOnDblclick) {\n addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\n addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n if (options.responsive) {\n addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n }\n },\n unbind: function unbind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n if (isFunction(options.cropstart)) {\n removeListener(element, EVENT_CROP_START, options.cropstart);\n }\n if (isFunction(options.cropmove)) {\n removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n if (isFunction(options.cropend)) {\n removeListener(element, EVENT_CROP_END, options.cropend);\n }\n if (isFunction(options.crop)) {\n removeListener(element, EVENT_CROP, options.crop);\n }\n if (isFunction(options.zoom)) {\n removeListener(element, EVENT_ZOOM, options.zoom);\n }\n removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n if (options.toggleDragModeOnDblclick) {\n removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n }\n removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n if (options.responsive) {\n removeListener(window, EVENT_RESIZE, this.onResize);\n }\n }\n};\n\nvar handlers = {\n resize: function resize() {\n if (this.disabled) {\n return;\n }\n var options = this.options,\n container = this.container,\n containerData = this.containerData;\n var ratioX = container.offsetWidth / containerData.width;\n var ratioY = container.offsetHeight / containerData.height;\n var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY;\n\n // Resize when width changed or height changed\n if (ratio !== 1) {\n var canvasData;\n var cropBoxData;\n if (options.restore) {\n canvasData = this.getCanvasData();\n cropBoxData = this.getCropBoxData();\n }\n this.render();\n if (options.restore) {\n this.setCanvasData(forEach(canvasData, function (n, i) {\n canvasData[i] = n * ratio;\n }));\n this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n cropBoxData[i] = n * ratio;\n }));\n }\n }\n },\n dblclick: function dblclick() {\n if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n return;\n }\n this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n },\n wheel: function wheel(event) {\n var _this = this;\n var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n var delta = 1;\n if (this.disabled) {\n return;\n }\n event.preventDefault();\n\n // Limit wheel speed to prevent zoom too fast (#21)\n if (this.wheeling) {\n return;\n }\n this.wheeling = true;\n setTimeout(function () {\n _this.wheeling = false;\n }, 50);\n if (event.deltaY) {\n delta = event.deltaY > 0 ? 1 : -1;\n } else if (event.wheelDelta) {\n delta = -event.wheelDelta / 120;\n } else if (event.detail) {\n delta = event.detail > 0 ? 1 : -1;\n }\n this.zoom(-delta * ratio, event);\n },\n cropStart: function cropStart(event) {\n var buttons = event.buttons,\n button = event.button;\n if (this.disabled\n\n // Handle mouse event and pointer event and ignore touch event\n || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n // No primary button (Usually the left button)\n isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n // Open context menu\n || event.ctrlKey)) {\n return;\n }\n var options = this.options,\n pointers = this.pointers;\n var action;\n if (event.changedTouches) {\n // Handle touch event\n forEach(event.changedTouches, function (touch) {\n pointers[touch.identifier] = getPointer(touch);\n });\n } else {\n // Handle mouse event and pointer event\n pointers[event.pointerId || 0] = getPointer(event);\n }\n if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n action = ACTION_ZOOM;\n } else {\n action = getData(event.target, DATA_ACTION);\n }\n if (!REGEXP_ACTIONS.test(action)) {\n return;\n }\n if (dispatchEvent(this.element, EVENT_CROP_START, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n\n // This line is required for preventing page zooming in iOS browsers\n event.preventDefault();\n this.action = action;\n this.cropping = false;\n if (action === ACTION_CROP) {\n this.cropping = true;\n addClass(this.dragBox, CLASS_MODAL);\n }\n },\n cropMove: function cropMove(event) {\n var action = this.action;\n if (this.disabled || !action) {\n return;\n }\n var pointers = this.pointers;\n event.preventDefault();\n if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n // The first parameter should not be undefined (#432)\n assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n });\n } else {\n assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n }\n this.change(event);\n },\n cropEnd: function cropEnd(event) {\n if (this.disabled) {\n return;\n }\n var action = this.action,\n pointers = this.pointers;\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n delete pointers[touch.identifier];\n });\n } else {\n delete pointers[event.pointerId || 0];\n }\n if (!action) {\n return;\n }\n event.preventDefault();\n if (!Object.keys(pointers).length) {\n this.action = '';\n }\n if (this.cropping) {\n this.cropping = false;\n toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n }\n dispatchEvent(this.element, EVENT_CROP_END, {\n originalEvent: event,\n action: action\n });\n }\n};\n\nvar change = {\n change: function change(event) {\n var options = this.options,\n canvasData = this.canvasData,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData,\n pointers = this.pointers;\n var action = this.action;\n var aspectRatio = options.aspectRatio;\n var left = cropBoxData.left,\n top = cropBoxData.top,\n width = cropBoxData.width,\n height = cropBoxData.height;\n var right = left + width;\n var bottom = top + height;\n var minLeft = 0;\n var minTop = 0;\n var maxWidth = containerData.width;\n var maxHeight = containerData.height;\n var renderable = true;\n var offset;\n\n // Locking aspect ratio in \"free mode\" by holding shift key\n if (!aspectRatio && event.shiftKey) {\n aspectRatio = width && height ? width / height : 1;\n }\n if (this.limited) {\n minLeft = cropBoxData.minLeft;\n minTop = cropBoxData.minTop;\n maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n }\n var pointer = pointers[Object.keys(pointers)[0]];\n var range = {\n x: pointer.endX - pointer.startX,\n y: pointer.endY - pointer.startY\n };\n var check = function check(side) {\n switch (side) {\n case ACTION_EAST:\n if (right + range.x > maxWidth) {\n range.x = maxWidth - right;\n }\n break;\n case ACTION_WEST:\n if (left + range.x < minLeft) {\n range.x = minLeft - left;\n }\n break;\n case ACTION_NORTH:\n if (top + range.y < minTop) {\n range.y = minTop - top;\n }\n break;\n case ACTION_SOUTH:\n if (bottom + range.y > maxHeight) {\n range.y = maxHeight - bottom;\n }\n break;\n }\n };\n switch (action) {\n // Move crop box\n case ACTION_ALL:\n left += range.x;\n top += range.y;\n break;\n\n // Resize crop box\n case ACTION_EAST:\n if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n check(ACTION_EAST);\n width += range.x;\n if (width < 0) {\n action = ACTION_WEST;\n width = -width;\n left -= width;\n }\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n break;\n case ACTION_NORTH:\n if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n if (height < 0) {\n action = ACTION_SOUTH;\n height = -height;\n top -= height;\n }\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n break;\n case ACTION_WEST:\n if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n if (width < 0) {\n action = ACTION_EAST;\n width = -width;\n left -= width;\n }\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n break;\n case ACTION_SOUTH:\n if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n check(ACTION_SOUTH);\n height += range.y;\n if (height < 0) {\n action = ACTION_NORTH;\n height = -height;\n top -= height;\n }\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n break;\n case ACTION_NORTH_EAST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n } else {\n check(ACTION_NORTH);\n check(ACTION_EAST);\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_NORTH_WEST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n left += cropBoxData.width - width;\n } else {\n check(ACTION_NORTH);\n check(ACTION_WEST);\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_SOUTH_WEST:\n if (aspectRatio) {\n if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_WEST);\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_SOUTH_EAST:\n if (aspectRatio) {\n if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n check(ACTION_EAST);\n width += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_EAST);\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n top -= height;\n }\n break;\n\n // Move canvas\n case ACTION_MOVE:\n this.move(range.x, range.y);\n renderable = false;\n break;\n\n // Zoom canvas\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), event);\n renderable = false;\n break;\n\n // Create crop box\n case ACTION_CROP:\n if (!range.x || !range.y) {\n renderable = false;\n break;\n }\n offset = getOffset(this.cropper);\n left = pointer.startX - offset.left;\n top = pointer.startY - offset.top;\n width = cropBoxData.minWidth;\n height = cropBoxData.minHeight;\n if (range.x > 0) {\n action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n } else if (range.x < 0) {\n left -= width;\n action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n }\n if (range.y < 0) {\n top -= height;\n }\n\n // Show the crop box if is hidden\n if (!this.cropped) {\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.cropped = true;\n if (this.limited) {\n this.limitCropBox(true, true);\n }\n }\n break;\n }\n if (renderable) {\n cropBoxData.width = width;\n cropBoxData.height = height;\n cropBoxData.left = left;\n cropBoxData.top = top;\n this.action = action;\n this.renderCropBox();\n }\n\n // Override\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n }\n};\n\nvar methods = {\n // Show the crop box manually\n crop: function crop() {\n if (this.ready && !this.cropped && !this.disabled) {\n this.cropped = true;\n this.limitCropBox(true, true);\n if (this.options.modal) {\n addClass(this.dragBox, CLASS_MODAL);\n }\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.setCropBoxData(this.initialCropBoxData);\n }\n return this;\n },\n // Reset the image and crop box to their initial states\n reset: function reset() {\n if (this.ready && !this.disabled) {\n this.imageData = assign({}, this.initialImageData);\n this.canvasData = assign({}, this.initialCanvasData);\n this.cropBoxData = assign({}, this.initialCropBoxData);\n this.renderCanvas();\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n return this;\n },\n // Clear the crop box\n clear: function clear() {\n if (this.cropped && !this.disabled) {\n assign(this.cropBoxData, {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n });\n this.cropped = false;\n this.renderCropBox();\n this.limitCanvas(true, true);\n\n // Render canvas after crop box rendered\n this.renderCanvas();\n removeClass(this.dragBox, CLASS_MODAL);\n addClass(this.cropBox, CLASS_HIDDEN);\n }\n return this;\n },\n /**\n * Replace the image's src and rebuild the cropper\n * @param {string} url - The new URL.\n * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n * @returns {Cropper} this\n */\n replace: function replace(url) {\n var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!this.disabled && url) {\n if (this.isImg) {\n this.element.src = url;\n }\n if (hasSameSize) {\n this.url = url;\n this.image.src = url;\n if (this.ready) {\n this.viewBoxImage.src = url;\n forEach(this.previews, function (element) {\n element.getElementsByTagName('img')[0].src = url;\n });\n }\n } else {\n if (this.isImg) {\n this.replaced = true;\n }\n this.options.data = null;\n this.uncreate();\n this.load(url);\n }\n }\n return this;\n },\n // Enable (unfreeze) the cropper\n enable: function enable() {\n if (this.ready && this.disabled) {\n this.disabled = false;\n removeClass(this.cropper, CLASS_DISABLED);\n }\n return this;\n },\n // Disable (freeze) the cropper\n disable: function disable() {\n if (this.ready && !this.disabled) {\n this.disabled = true;\n addClass(this.cropper, CLASS_DISABLED);\n }\n return this;\n },\n /**\n * Destroy the cropper and remove the instance from the image\n * @returns {Cropper} this\n */\n destroy: function destroy() {\n var element = this.element;\n if (!element[NAMESPACE]) {\n return this;\n }\n element[NAMESPACE] = undefined;\n if (this.isImg && this.replaced) {\n element.src = this.originalUrl;\n }\n this.uncreate();\n return this;\n },\n /**\n * Move the canvas with relative offsets\n * @param {number} offsetX - The relative offset distance on the x-axis.\n * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n * @returns {Cropper} this\n */\n move: function move(offsetX) {\n var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n var _this$canvasData = this.canvasData,\n left = _this$canvasData.left,\n top = _this$canvasData.top;\n return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n },\n /**\n * Move the canvas to an absolute point\n * @param {number} x - The x-axis coordinate.\n * @param {number} [y=x] - The y-axis coordinate.\n * @returns {Cropper} this\n */\n moveTo: function moveTo(x) {\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n var canvasData = this.canvasData;\n var changed = false;\n x = Number(x);\n y = Number(y);\n if (this.ready && !this.disabled && this.options.movable) {\n if (isNumber(x)) {\n canvasData.left = x;\n changed = true;\n }\n if (isNumber(y)) {\n canvasData.top = y;\n changed = true;\n }\n if (changed) {\n this.renderCanvas(true);\n }\n }\n return this;\n },\n /**\n * Zoom the canvas with a relative ratio\n * @param {number} ratio - The target ratio.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoom: function zoom(ratio, _originalEvent) {\n var canvasData = this.canvasData;\n ratio = Number(ratio);\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n },\n /**\n * Zoom the canvas to an absolute ratio\n * @param {number} ratio - The target ratio.\n * @param {Object} pivot - The zoom pivot point coordinate.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n var options = this.options,\n canvasData = this.canvasData;\n var width = canvasData.width,\n height = canvasData.height,\n naturalWidth = canvasData.naturalWidth,\n naturalHeight = canvasData.naturalHeight;\n ratio = Number(ratio);\n if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n if (dispatchEvent(this.element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: width / naturalWidth,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\n if (_originalEvent) {\n var pointers = this.pointers;\n var offset = getOffset(this.cropper);\n var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n pageX: _originalEvent.pageX,\n pageY: _originalEvent.pageY\n };\n\n // Zoom from the triggering point of the event\n canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n } else {\n // Zoom from the center of the canvas\n canvasData.left -= (newWidth - width) / 2;\n canvasData.top -= (newHeight - height) / 2;\n }\n canvasData.width = newWidth;\n canvasData.height = newHeight;\n this.renderCanvas(true);\n }\n return this;\n },\n /**\n * Rotate the canvas with a relative degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotate: function rotate(degree) {\n return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n },\n /**\n * Rotate the canvas to an absolute degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotateTo: function rotateTo(degree) {\n degree = Number(degree);\n if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n this.imageData.rotate = degree % 360;\n this.renderCanvas(true, true);\n }\n return this;\n },\n /**\n * Scale the image on the x-axis.\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @returns {Cropper} this\n */\n scaleX: function scaleX(_scaleX) {\n var scaleY = this.imageData.scaleY;\n return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n },\n /**\n * Scale the image on the y-axis.\n * @param {number} scaleY - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scaleY: function scaleY(_scaleY) {\n var scaleX = this.imageData.scaleX;\n return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n },\n /**\n * Scale the image\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scale: function scale(scaleX) {\n var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n var imageData = this.imageData;\n var transformed = false;\n scaleX = Number(scaleX);\n scaleY = Number(scaleY);\n if (this.ready && !this.disabled && this.options.scalable) {\n if (isNumber(scaleX)) {\n imageData.scaleX = scaleX;\n transformed = true;\n }\n if (isNumber(scaleY)) {\n imageData.scaleY = scaleY;\n transformed = true;\n }\n if (transformed) {\n this.renderCanvas(true, true);\n }\n }\n return this;\n },\n /**\n * Get the cropped area position and size data (base on the original image)\n * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n * @returns {Object} The result cropped data.\n */\n getData: function getData() {\n var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var data;\n if (this.ready && this.cropped) {\n data = {\n x: cropBoxData.left - canvasData.left,\n y: cropBoxData.top - canvasData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n var ratio = imageData.width / imageData.naturalWidth;\n forEach(data, function (n, i) {\n data[i] = n / ratio;\n });\n if (rounded) {\n // In case rounding off leads to extra 1px in right or bottom border\n // we should round the top-left corner and the dimension (#343).\n var bottom = Math.round(data.y + data.height);\n var right = Math.round(data.x + data.width);\n data.x = Math.round(data.x);\n data.y = Math.round(data.y);\n data.width = right - data.x;\n data.height = bottom - data.y;\n }\n } else {\n data = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n }\n if (options.rotatable) {\n data.rotate = imageData.rotate || 0;\n }\n if (options.scalable) {\n data.scaleX = imageData.scaleX || 1;\n data.scaleY = imageData.scaleY || 1;\n }\n return data;\n },\n /**\n * Set the cropped area position and size with new data\n * @param {Object} data - The new data.\n * @returns {Cropper} this\n */\n setData: function setData(data) {\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData;\n var cropBoxData = {};\n if (this.ready && !this.disabled && isPlainObject(data)) {\n var transformed = false;\n if (options.rotatable) {\n if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n imageData.rotate = data.rotate;\n transformed = true;\n }\n }\n if (options.scalable) {\n if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n imageData.scaleX = data.scaleX;\n transformed = true;\n }\n if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n imageData.scaleY = data.scaleY;\n transformed = true;\n }\n }\n if (transformed) {\n this.renderCanvas(true, true);\n }\n var ratio = imageData.width / imageData.naturalWidth;\n if (isNumber(data.x)) {\n cropBoxData.left = data.x * ratio + canvasData.left;\n }\n if (isNumber(data.y)) {\n cropBoxData.top = data.y * ratio + canvasData.top;\n }\n if (isNumber(data.width)) {\n cropBoxData.width = data.width * ratio;\n }\n if (isNumber(data.height)) {\n cropBoxData.height = data.height * ratio;\n }\n this.setCropBoxData(cropBoxData);\n }\n return this;\n },\n /**\n * Get the container size data.\n * @returns {Object} The result container data.\n */\n getContainerData: function getContainerData() {\n return this.ready ? assign({}, this.containerData) : {};\n },\n /**\n * Get the image position and size data.\n * @returns {Object} The result image data.\n */\n getImageData: function getImageData() {\n return this.sized ? assign({}, this.imageData) : {};\n },\n /**\n * Get the canvas position and size data.\n * @returns {Object} The result canvas data.\n */\n getCanvasData: function getCanvasData() {\n var canvasData = this.canvasData;\n var data = {};\n if (this.ready) {\n forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n data[n] = canvasData[n];\n });\n }\n return data;\n },\n /**\n * Set the canvas position and size with new data.\n * @param {Object} data - The new canvas data.\n * @returns {Cropper} this\n */\n setCanvasData: function setCanvasData(data) {\n var canvasData = this.canvasData;\n var aspectRatio = canvasData.aspectRatio;\n if (this.ready && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n canvasData.left = data.left;\n }\n if (isNumber(data.top)) {\n canvasData.top = data.top;\n }\n if (isNumber(data.width)) {\n canvasData.width = data.width;\n canvasData.height = data.width / aspectRatio;\n } else if (isNumber(data.height)) {\n canvasData.height = data.height;\n canvasData.width = data.height * aspectRatio;\n }\n this.renderCanvas(true);\n }\n return this;\n },\n /**\n * Get the crop box position and size data.\n * @returns {Object} The result crop box data.\n */\n getCropBoxData: function getCropBoxData() {\n var cropBoxData = this.cropBoxData;\n var data;\n if (this.ready && this.cropped) {\n data = {\n left: cropBoxData.left,\n top: cropBoxData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n }\n return data || {};\n },\n /**\n * Set the crop box position and size with new data.\n * @param {Object} data - The new crop box data.\n * @returns {Cropper} this\n */\n setCropBoxData: function setCropBoxData(data) {\n var cropBoxData = this.cropBoxData;\n var aspectRatio = this.options.aspectRatio;\n var widthChanged;\n var heightChanged;\n if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n cropBoxData.left = data.left;\n }\n if (isNumber(data.top)) {\n cropBoxData.top = data.top;\n }\n if (isNumber(data.width) && data.width !== cropBoxData.width) {\n widthChanged = true;\n cropBoxData.width = data.width;\n }\n if (isNumber(data.height) && data.height !== cropBoxData.height) {\n heightChanged = true;\n cropBoxData.height = data.height;\n }\n if (aspectRatio) {\n if (widthChanged) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else if (heightChanged) {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n this.renderCropBox();\n }\n return this;\n },\n /**\n * Get a canvas drawn the cropped image.\n * @param {Object} [options={}] - The config options.\n * @returns {HTMLCanvasElement} - The result canvas.\n */\n getCroppedCanvas: function getCroppedCanvas() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!this.ready || !window.HTMLCanvasElement) {\n return null;\n }\n var canvasData = this.canvasData;\n var source = getSourceCanvas(this.image, this.imageData, canvasData, options);\n\n // Returns the source canvas if it is not cropped.\n if (!this.cropped) {\n return source;\n }\n var _this$getData = this.getData(options.rounded),\n initialX = _this$getData.x,\n initialY = _this$getData.y,\n initialWidth = _this$getData.width,\n initialHeight = _this$getData.height;\n var ratio = source.width / Math.floor(canvasData.naturalWidth);\n if (ratio !== 1) {\n initialX *= ratio;\n initialY *= ratio;\n initialWidth *= ratio;\n initialHeight *= ratio;\n }\n var aspectRatio = initialWidth / initialHeight;\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.maxWidth || Infinity,\n height: options.maxHeight || Infinity\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.minWidth || 0,\n height: options.minHeight || 0\n }, 'cover');\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.width || (ratio !== 1 ? source.width : initialWidth),\n height: options.height || (ratio !== 1 ? source.height : initialHeight)\n }),\n width = _getAdjustedSizes.width,\n height = _getAdjustedSizes.height;\n width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = options.fillColor || 'transparent';\n context.fillRect(0, 0, width, height);\n var _options$imageSmoothi = options.imageSmoothingEnabled,\n imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n imageSmoothingQuality = options.imageSmoothingQuality;\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n if (imageSmoothingQuality) {\n context.imageSmoothingQuality = imageSmoothingQuality;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n var sourceWidth = source.width;\n var sourceHeight = source.height;\n\n // Source canvas parameters\n var srcX = initialX;\n var srcY = initialY;\n var srcWidth;\n var srcHeight;\n\n // Destination canvas parameters\n var dstX;\n var dstY;\n var dstWidth;\n var dstHeight;\n if (srcX <= -initialWidth || srcX > sourceWidth) {\n srcX = 0;\n srcWidth = 0;\n dstX = 0;\n dstWidth = 0;\n } else if (srcX <= 0) {\n dstX = -srcX;\n srcX = 0;\n srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n dstWidth = srcWidth;\n } else if (srcX <= sourceWidth) {\n dstX = 0;\n srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n dstWidth = srcWidth;\n }\n if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n srcY = 0;\n srcHeight = 0;\n dstY = 0;\n dstHeight = 0;\n } else if (srcY <= 0) {\n dstY = -srcY;\n srcY = 0;\n srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n dstHeight = srcHeight;\n } else if (srcY <= sourceHeight) {\n dstY = 0;\n srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n dstHeight = srcHeight;\n }\n var params = [srcX, srcY, srcWidth, srcHeight];\n\n // Avoid \"IndexSizeError\"\n if (dstWidth > 0 && dstHeight > 0) {\n var scale = width / initialWidth;\n params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n }\n\n // All the numerical parameters should be integer for `drawImage`\n // https://github.com/fengyuanchen/cropper/issues/476\n context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n return canvas;\n },\n /**\n * Change the aspect ratio of the crop box.\n * @param {number} aspectRatio - The new aspect ratio.\n * @returns {Cropper} this\n */\n setAspectRatio: function setAspectRatio(aspectRatio) {\n var options = this.options;\n if (!this.disabled && !isUndefined(aspectRatio)) {\n // 0 -> NaN\n options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n if (this.ready) {\n this.initCropBox();\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n }\n return this;\n },\n /**\n * Change the drag mode.\n * @param {string} mode - The new drag mode.\n * @returns {Cropper} this\n */\n setDragMode: function setDragMode(mode) {\n var options = this.options,\n dragBox = this.dragBox,\n face = this.face;\n if (this.ready && !this.disabled) {\n var croppable = mode === DRAG_MODE_CROP;\n var movable = options.movable && mode === DRAG_MODE_MOVE;\n mode = croppable || movable ? mode : DRAG_MODE_NONE;\n options.dragMode = mode;\n setData(dragBox, DATA_ACTION, mode);\n toggleClass(dragBox, CLASS_CROP, croppable);\n toggleClass(dragBox, CLASS_MOVE, movable);\n if (!options.cropBoxMovable) {\n // Sync drag mode to crop box when it is not movable\n setData(face, DATA_ACTION, mode);\n toggleClass(face, CLASS_CROP, croppable);\n toggleClass(face, CLASS_MOVE, movable);\n }\n }\n return this;\n }\n};\n\nvar AnotherCropper = WINDOW.Cropper;\nvar Cropper = /*#__PURE__*/function () {\n /**\n * Create a new Cropper.\n * @param {Element} element - The target element for cropping.\n * @param {Object} [options={}] - The configuration options.\n */\n function Cropper(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n _classCallCheck(this, Cropper);\n if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n throw new Error('The first argument is required and must be an <img> or <canvas> element.');\n }\n this.element = element;\n this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n this.cropped = false;\n this.disabled = false;\n this.pointers = {};\n this.ready = false;\n this.reloading = false;\n this.replaced = false;\n this.sized = false;\n this.sizing = false;\n this.init();\n }\n return _createClass(Cropper, [{\n key: \"init\",\n value: function init() {\n var element = this.element;\n var tagName = element.tagName.toLowerCase();\n var url;\n if (element[NAMESPACE]) {\n return;\n }\n element[NAMESPACE] = this;\n if (tagName === 'img') {\n this.isImg = true;\n\n // e.g.: \"img/picture.jpg\"\n url = element.getAttribute('src') || '';\n this.originalUrl = url;\n\n // Stop when it's a blank image\n if (!url) {\n return;\n }\n\n // e.g.: \"https://example.com/img/picture.jpg\"\n url = element.src;\n } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n url = element.toDataURL();\n }\n this.load(url);\n }\n }, {\n key: \"load\",\n value: function load(url) {\n var _this = this;\n if (!url) {\n return;\n }\n this.url = url;\n this.imageData = {};\n var element = this.element,\n options = this.options;\n if (!options.rotatable && !options.scalable) {\n options.checkOrientation = false;\n }\n\n // Only IE10+ supports Typed Arrays\n if (!options.checkOrientation || !window.ArrayBuffer) {\n this.clone();\n return;\n }\n\n // Detect the mime type of the image directly if it is a Data URL\n if (REGEXP_DATA_URL.test(url)) {\n // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n if (REGEXP_DATA_URL_JPEG.test(url)) {\n this.read(dataURLToArrayBuffer(url));\n } else {\n // Only a JPEG image may contains Exif Orientation information,\n // the rest types of Data URLs are not necessary to check orientation at all.\n this.clone();\n }\n return;\n }\n\n // 1. Detect the mime type of the image by a XMLHttpRequest.\n // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n var xhr = new XMLHttpRequest();\n var clone = this.clone.bind(this);\n this.reloading = true;\n this.xhr = xhr;\n\n // 1. Cross origin requests are only supported for protocol schemes:\n // http, https, data, chrome, chrome-extension.\n // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n // in some browsers as IE11 and Safari.\n xhr.onabort = clone;\n xhr.onerror = clone;\n xhr.ontimeout = clone;\n xhr.onprogress = function () {\n // Abort the request directly if it not a JPEG image for better performance\n if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n xhr.abort();\n }\n };\n xhr.onload = function () {\n _this.read(xhr.response);\n };\n xhr.onloadend = function () {\n _this.reloading = false;\n _this.xhr = null;\n };\n\n // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n url = addTimestamp(url);\n }\n\n // The third parameter is required for avoiding side-effect (#682)\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.withCredentials = element.crossOrigin === 'use-credentials';\n xhr.send();\n }\n }, {\n key: \"read\",\n value: function read(arrayBuffer) {\n var options = this.options,\n imageData = this.imageData;\n\n // Reset the orientation value to its default value 1\n // as some iOS browsers will render image with its orientation\n var orientation = resetAndGetOrientation(arrayBuffer);\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n if (orientation > 1) {\n // Generate a new URL which has the default orientation value\n this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n var _parseOrientation = parseOrientation(orientation);\n rotate = _parseOrientation.rotate;\n scaleX = _parseOrientation.scaleX;\n scaleY = _parseOrientation.scaleY;\n }\n if (options.rotatable) {\n imageData.rotate = rotate;\n }\n if (options.scalable) {\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n }\n this.clone();\n }\n }, {\n key: \"clone\",\n value: function clone() {\n var element = this.element,\n url = this.url;\n var crossOrigin = element.crossOrigin;\n var crossOriginUrl = url;\n if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n if (!crossOrigin) {\n crossOrigin = 'anonymous';\n }\n\n // Bust cache when there is not a \"crossOrigin\" property (#519)\n crossOriginUrl = addTimestamp(url);\n }\n this.crossOrigin = crossOrigin;\n this.crossOriginUrl = crossOriginUrl;\n var image = document.createElement('img');\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n image.src = crossOriginUrl || url;\n image.alt = element.alt || 'The image to crop';\n this.image = image;\n image.onload = this.start.bind(this);\n image.onerror = this.stop.bind(this);\n addClass(image, CLASS_HIDE);\n element.parentNode.insertBefore(image, element.nextSibling);\n }\n }, {\n key: \"start\",\n value: function start() {\n var _this2 = this;\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n this.sizing = true;\n\n // Match all browsers that use WebKit as the layout engine in iOS devices,\n // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n var done = function done(naturalWidth, naturalHeight) {\n assign(_this2.imageData, {\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n aspectRatio: naturalWidth / naturalHeight\n });\n _this2.initialImageData = assign({}, _this2.imageData);\n _this2.sizing = false;\n _this2.sized = true;\n _this2.build();\n };\n\n // Most modern browsers (excepts iOS WebKit)\n if (image.naturalWidth && !isIOSWebKit) {\n done(image.naturalWidth, image.naturalHeight);\n return;\n }\n var sizingImage = document.createElement('img');\n var body = document.body || document.documentElement;\n this.sizingImage = sizingImage;\n sizingImage.onload = function () {\n done(sizingImage.width, sizingImage.height);\n if (!isIOSWebKit) {\n body.removeChild(sizingImage);\n }\n };\n sizingImage.src = image.src;\n\n // iOS WebKit will convert the image automatically\n // with its orientation once append it into DOM (#279)\n if (!isIOSWebKit) {\n sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n body.appendChild(sizingImage);\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n image.parentNode.removeChild(image);\n this.image = null;\n }\n }, {\n key: \"build\",\n value: function build() {\n if (!this.sized || this.ready) {\n return;\n }\n var element = this.element,\n options = this.options,\n image = this.image;\n\n // Create cropper elements\n var container = element.parentNode;\n var template = document.createElement('div');\n template.innerHTML = TEMPLATE;\n var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n this.container = container;\n this.cropper = cropper;\n this.canvas = canvas;\n this.dragBox = dragBox;\n this.cropBox = cropBox;\n this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n this.face = face;\n canvas.appendChild(image);\n\n // Hide the original image\n addClass(element, CLASS_HIDDEN);\n\n // Inserts the cropper after to the current image\n container.insertBefore(cropper, element.nextSibling);\n\n // Show the hidden image\n removeClass(image, CLASS_HIDE);\n this.initPreview();\n this.bind();\n options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n addClass(cropBox, CLASS_HIDDEN);\n if (!options.guides) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n }\n if (!options.center) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n }\n if (options.background) {\n addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n }\n if (!options.highlight) {\n addClass(face, CLASS_INVISIBLE);\n }\n if (options.cropBoxMovable) {\n addClass(face, CLASS_MOVE);\n setData(face, DATA_ACTION, ACTION_ALL);\n }\n if (!options.cropBoxResizable) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n }\n this.render();\n this.ready = true;\n this.setDragMode(options.dragMode);\n if (options.autoCrop) {\n this.crop();\n }\n this.setData(options.data);\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_READY);\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.ready) {\n return;\n }\n this.ready = false;\n this.unbind();\n this.resetPreview();\n var parentNode = this.cropper.parentNode;\n if (parentNode) {\n parentNode.removeChild(this.cropper);\n }\n removeClass(this.element, CLASS_HIDDEN);\n }\n }, {\n key: \"uncreate\",\n value: function uncreate() {\n if (this.ready) {\n this.unbuild();\n this.ready = false;\n this.cropped = false;\n } else if (this.sizing) {\n this.sizingImage.onload = null;\n this.sizing = false;\n this.sized = false;\n } else if (this.reloading) {\n this.xhr.onabort = null;\n this.xhr.abort();\n } else if (this.image) {\n this.stop();\n }\n }\n\n /**\n * Get the no conflict cropper class.\n * @returns {Cropper} The cropper class.\n */\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Cropper = AnotherCropper;\n return Cropper;\n }\n\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n}();\nassign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\nexport { Cropper as default };\n","<script setup lang=\"ts\" generic=\"T extends EventTarget = EventTarget\">\nimport Cropper from 'cropperjs'\nimport { nextTick, onMounted, onUnmounted, ref } from 'vue'\nimport { isNull } from '@/utils/common'\nimport 'cropperjs/dist/cropper.css'\n\nconst props = withDefaults(\n defineProps<{\n // Library props\n src?: string\n alt?: string\n containerStyle?: { [key: string]: string } | undefined\n imgStyle?: { [key: string]: string } | undefined\n // CropperJS props\n aspectRatio?: number\n autoCrop?: boolean\n autoCropArea?: number\n background?: boolean\n center?: boolean\n checkCrossOrigin?: boolean\n checkOrientation?: boolean\n cropBoxMovable?: boolean\n cropBoxResizable?: boolean\n data?: Cropper.SetDataOptions | null\n dragMode?: Cropper.DragMode\n guides?: boolean\n highlight?: boolean\n initialAspectRatio?: number\n modal?: boolean\n movable?: boolean\n preview?: HTMLElement | HTMLElement[] | NodeListOf<HTMLElement> | string\n responsive?: boolean\n restore?: boolean\n rotatable?: boolean\n scalable?: boolean\n toggleDragModeOnDblclick?: boolean\n viewMode?: Cropper.ViewMode\n wheelZoomRatio?: number\n zoomOnTouch?: boolean\n zoomOnWheel?: boolean\n zoomable?: boolean\n // Size limitation\n minCanvasWidth?: number\n minCanvasHeight?: number\n minContainerWidth?: number\n minContainerHeight?: number\n minCropBoxWidth?: number\n minCropBoxHeight?: number\n // callbacks\n ready?: null | ((event: Cropper.ReadyEvent<T>) => void)\n crop?: null | ((event: Cropper.CropEvent<T>) => void)\n cropend?: null | ((event: Cropper.CropEndEvent<T>) => void)\n cropmove?: null | ((event: Cropper.CropMoveEvent<T>) => void)\n cropstart?: null | ((event: Cropper.CropStartEvent<T>) => void)\n zoom?: null | ((event: Cropper.ZoomEvent<T>) => void)\n }>(),\n {\n containerStyle: undefined,\n src: '',\n alt: '',\n imgStyle: undefined,\n aspectRatio: NaN,\n autoCrop: true,\n autoCropArea: 0.8,\n background: true,\n center: true,\n checkCrossOrigin: true,\n checkOrientation: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n data: null,\n dragMode: 'crop',\n guides: true,\n highlight: true,\n initialAspectRatio: NaN,\n modal: true,\n movable: true,\n preview: '',\n responsive: true,\n restore: true,\n rotatable: true,\n scalable: true,\n toggleDragModeOnDblclick: true,\n viewMode: 0,\n wheelZoomRatio: 0.1,\n zoomOnTouch: true,\n zoomable: true,\n minCanvasWidth: 0,\n minCanvasHeight: 0,\n minContainerWidth: 200,\n minContainerHeight: 100,\n minCropBoxWidth: 0,\n minCropBoxHeight: 0,\n ready: null,\n crop: null,\n cropend: null,\n cropmove: null,\n cropstart: null,\n zoom: null,\n }\n)\n\nconst cropperInstance = ref<InstanceType<typeof Cropper> | null>(null)\nconst imgEl = ref<HTMLImageElement | HTMLCanvasElement | null>(null)\nconst loading = ref(true)\n\nconst enable = () => {\n cropperInstance.value?.enable()\n}\n\nconst disable = () => {\n cropperInstance.value?.disable()\n}\n\nconst destroy = () => {\n cropperInstance.value?.destroy()\n}\n\nconst getImageData = () => {\n return cropperInstance.value?.getImageData()\n}\n\nconst getData = () => {\n return cropperInstance.value?.getData()\n}\n\nconst setData = (data: Cropper.SetDataOptions) => {\n return cropperInstance.value?.setData(data)\n}\n\ndefineExpose({\n enable,\n disable,\n destroy,\n getImageData,\n getData,\n setData,\n})\n\nonMounted(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { containerStyle, src, alt, imgStyle, ...data } = props\n const propsOptions = data as Record<string, any>\n const options: Record<string, any> = {}\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(propsOptions, key) && propsOptions[key] !== undefined) {\n options[key] = propsOptions[key]\n }\n }\n nextTick(() => {\n if (!isNull(imgEl.value)) {\n cropperInstance.value = new Cropper(imgEl.value as any, options)\n setTimeout(() => {\n loading.value = false\n }, 1000)\n }\n })\n})\n\nonUnmounted(() => {\n destroy()\n})\n</script>\n\n<template>\n <div class=\"d-flex flex-column\">\n <div\n v-if=\"loading\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n\n <div :style=\"containerStyle\">\n <img\n ref=\"imgEl\"\n :style=\"[{ 'max-width': '100%', opacity: loading ? 0 : 1 }, imgStyle]\"\n :alt=\"alt\"\n :src=\"src\"\n >\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onUnmounted, ref } from 'vue'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useImageRoiStore } from '@/components/damImage/uploadQueue/composables/imageRoiStore'\nimport { updateRoi } from '@/components/damImage/uploadQueue/api/damImageRoiApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { cropToRegion, regionToCrop } from '@/components/damImage/uploadQueue/composables/cropperJsService'\nimport ACropperjs from '@/components/ACropperjs.vue'\n\nconst { showRecordWas, showErrorsDefault } = useAlerts()\n\nconst DAM_IMAGE_ASPECT_RATIO = 16 / 9\nconst cropperContainerStyle = { overflow: 'hidden', maxHeight: 'calc(100vh - 160px)' }\n\nconst imageRoiStore = useImageRoiStore()\n\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst cropper = ref<any>(null) // fix any\n\nconst imageUrl = computed(() => {\n if (imageRoiStore.imageFile && imageRoiStore.imageFile.links?.image_detail) {\n return imageRoiStore.imageFile.links.image_detail.url\n }\n return ''\n})\n\nconst enableCropper = () => {\n if (cropper.value) {\n cropper.value.enable()\n }\n}\n\nconst disableCropper = () => {\n if (cropper.value) {\n cropper.value.disable()\n }\n}\n\nconst applyRegionOfInterest = () => {\n if (cropper.value && imageRoiStore.roi && imageRoiStore.imageFile) {\n enableCropper()\n const data = regionToCrop(\n cropper.value,\n imageRoiStore.roi,\n imageRoiStore.imageFile.imageAttributes.width,\n imageRoiStore.imageFile.imageAttributes.height\n )\n cropper.value.setData(data)\n disableCropper()\n }\n}\n\nconst saveRoi = async () => {\n if (cropper.value && imageRoiStore.roi && imageRoiStore.imageFile) {\n const roi = cropToRegion(\n cropper.value,\n imageRoiStore.roi,\n imageRoiStore.imageFile.imageAttributes.width,\n imageRoiStore.imageFile.imageAttributes.height\n )\n try {\n imageRoiStore.showLoader()\n await updateRoi(damClient, roi.id, roi)\n showRecordWas('updated')\n setTimeout(() => {\n imageRoiStore.forceReloadRoiPreviews()\n }, 2000)\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n imageRoiStore.hideLoader()\n }\n }\n}\n\nconst cropperReady = () => {\n applyRegionOfInterest()\n enableCropper()\n}\n\nconst cropperEnd = () => {\n saveRoi()\n}\n\nconst showCropper = computed(() => {\n if (imageRoiStore.imageFile && imageUrl.value.length > 0 && !imageRoiStore.loader) {\n return true\n }\n return false\n})\n\nonUnmounted(() => {\n if (cropper.value) {\n cropper.value.destroy()\n cropper.value = null\n }\n})\n</script>\n\n<template>\n <ACropperjs\n v-if=\"showCropper\"\n :key=\"imageRoiStore.timestampCropper\"\n ref=\"cropper\"\n :aspect-ratio=\"DAM_IMAGE_ASPECT_RATIO\"\n :background=\"false\"\n :check-cross-origin=\"false\"\n :container-style=\"cropperContainerStyle\"\n :ready=\"cropperReady\"\n :cropend=\"cropperEnd\"\n :src=\"imageUrl\"\n :view-mode=\"1\"\n :zoom-on-wheel=\"false\"\n responsive\n />\n</template>\n\n<style lang=\"scss\">\n.cropper-modal {\n background-color: #f1f4f6;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { storeToRefs } from 'pinia'\nimport { useI18n } from 'vue-i18n'\nimport { useTheme } from '@/composables/themeSettings'\nimport {\n AssetDetailTabImageWithRoi,\n useAssetDetailStore,\n} from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { DamAssetStatusDefault, DamAssetType, DamAssetTypeDefault } from '@/types/coreDam/Asset'\nimport AssetDetailDialogLoader from '@/components/damImage/uploadQueue/components/AssetDetailDialogLoader.vue'\nimport AssetImage from '@/components/damImage/uploadQueue/components/AssetImage.vue'\nimport AssetDetailDialogSidebar from '@/components/damImage/uploadQueue/components/AssetDetailDialogSidebar.vue'\nimport { assetFileIsImageFile } from '@/types/coreDam/AssetFile'\nimport AssetImageRoiSelect from '@/components/damImage/uploadQueue/components/AssetImageRoiSelect.vue'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport type { IntegerId } from '@/types/common'\n\nwithDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n extSystem: IntegerId\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n\nconst { toolbarColor } = useTheme()\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, dialog, activeTab, loading } = storeToRefs(assetDetailStore)\n\nconst closeDialog = () => {\n assetDetailStore.setAsset(null)\n dialog.value = null\n}\n\nconst sidebar = ref(true)\n\nconst toggleSidebar = () => {\n sidebar.value = !sidebar.value\n}\n\nconst onImageLoad = () => {\n // imageLoading.value = false\n}\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\nconst assetStatus = computed(() => {\n if (!asset.value) return DamAssetStatusDefault\n return asset.value.attributes.assetStatus\n})\n\nconst isTypeImage = computed(() => {\n return assetType.value === DamAssetType.Image\n})\nconst isTypeVideo = computed(() => {\n return assetType.value === DamAssetType.Video\n})\nconst isTypeAudio = computed(() => {\n return assetType.value === DamAssetType.Audio\n})\nconst isTypeDocument = computed(() => {\n return assetType.value === DamAssetType.Document\n})\n\nconst imageProperties = computed(() => {\n if (asset.value?.mainFile && asset.value.mainFile.links && asset.value.mainFile.links.image_detail) {\n return {\n url: asset.value.mainFile.links.image_detail.url + '?random=' + Date.now(),\n width: asset.value.mainFile.links.image_detail.width,\n height: asset.value.mainFile.links.image_detail.height,\n bgColor:\n assetFileIsImageFile(asset.value.mainFile) &&\n asset.value.mainFile.imageAttributes &&\n asset.value.mainFile.imageAttributes.mostDominantColor\n ? asset.value.mainFile.imageAttributes.mostDominantColor\n : '#ccc',\n }\n }\n return {\n url: '',\n width: 356,\n height: 200,\n bgColor: '#ccc',\n }\n})\nconst toolbarTitle = computed(() => {\n if (!asset.value) return ''\n return asset.value.texts.displayTitle\n})\n\nconst assetMainFile = computed(() => {\n return asset.value?.mainFile || undefined\n})\n</script>\n\n<template>\n <VDialog\n :model-value=\"true\"\n fullscreen\n eager\n >\n <AssetDetailDialogLoader\n v-if=\"loading\"\n @close-dialog=\"closeDialog\"\n />\n <VCard\n v-else-if=\"asset\"\n class=\"dam-image-detail\"\n :class=\"{ 'dam-image-detail--sidebar-active': sidebar }\"\n >\n <div class=\"dam-image-detail__wrapper d-flex flex-column\">\n <VToolbar\n :color=\"toolbarColor\"\n density=\"compact\"\n :height=\"64\"\n class=\"system-border-b pr-1\"\n >\n <div class=\"text-subtitle-2 d-flex px-2\">\n <div>DAM: {{ toolbarTitle }}</div>\n </div>\n <VSpacer />\n <div class=\"pr-2\">\n <VBtn\n :active=\"sidebar\"\n :variant=\"sidebar ? 'flat' : 'text'\"\n :color=\"sidebar ? 'secondary' : ''\"\n icon\n class=\"mr-1\"\n :width=\"36\"\n :height=\"36\"\n @click.stop=\"toggleSidebar\"\n >\n <VIcon icon=\"mdi-information-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.detail.toggleInfo') }}\n </VTooltip>\n </VBtn>\n <VBtn\n icon\n variant=\"text\"\n :width=\"36\"\n :height=\"36\"\n class=\"mr-1\"\n @click.stop=\"closeDialog\"\n >\n <VIcon icon=\"mdi-close\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.close') }}\n </VTooltip>\n </VBtn>\n </div>\n </VToolbar>\n <div class=\"d-flex w-100 h-100 position-relative\">\n <div class=\"d-flex w-100 align-center dam-image-detail__left\">\n <div\n v-if=\"activeTab === AssetDetailTabImageWithRoi.ROI\"\n class=\"w-100 h-100 pa-2 d-flex align-center justify-center\"\n >\n <AssetImageRoiSelect />\n </div>\n <div\n v-else\n class=\"w-100 h-100 pa-2 d-flex align-center justify-center\"\n >\n <AssetImage\n :asset-type=\"assetType\"\n :asset-status=\"assetStatus\"\n :src=\"imageProperties.url\"\n :background-color=\"imageProperties.bgColor\"\n :width=\"imageProperties.width\"\n :height=\"imageProperties.height\"\n use-component\n @load=\"onImageLoad\"\n @error=\"onImageLoad\"\n />\n </div>\n </div>\n <div class=\"h-100 d-flex dam-image-detail__sidebar system-border-l\">\n <AssetDetailDialogSidebar\n v-if=\"asset\"\n :key=\"asset.id\"\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n :asset-id=\"asset.id\"\n :is-video=\"isTypeVideo\"\n :is-audio=\"isTypeAudio\"\n :is-image=\"isTypeImage\"\n :is-document=\"isTypeDocument\"\n :asset-status=\"assetStatus\"\n :asset-type=\"assetType\"\n :asset-main-file-status=\"assetMainFile ? assetMainFile.fileAttributes.status : undefined\"\n :asset-main-file-fail-reason=\"assetMainFile ? assetMainFile.fileAttributes.failReason : undefined\"\n />\n </div>\n </div>\n </div>\n </VCard>\n </VDialog>\n</template>\n","import { ref } from 'vue'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\n\nconst uploadQueueDialog = ref<UploadQueueKey | null>(null)\nconst uploadQueueSidebar = ref(false)\n\nexport function useUploadQueueDialog () {\n const toggleUploadQueueSidebar = () => {\n uploadQueueSidebar.value = !uploadQueueSidebar.value\n }\n\n return {\n toggleUploadQueueSidebar,\n uploadQueueDialog,\n uploadQueueSidebar,\n }\n}\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, ref } from 'vue'\nimport { DamAssetType } from '@/types/coreDam/Asset'\nimport { type AssetFile, assetFileIsImageFile } from '@/types/coreDam/AssetFile'\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetCustomMetadataForm from '@/components/damImage/uploadQueue/components/AssetCustomMetadataForm.vue'\nimport ACopyText from '@/components/ACopyText.vue'\nimport { prettyBytes } from '@/utils/file'\nimport AssetMetadataImageAttributes from '@/components/damImage/uploadQueue/components/AssetMetadataImageAttributes.vue'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { UploadQueueItem } from '@/types/coreDam/UploadQueue'\nimport AuthorRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteWithCached.vue'\nimport ASystemEntityScope from '@/components/form/ASystemEntityScope.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport { dateTimePretty } from '@/utils/datetime'\nimport { useDamKeywordAssetTypeConfig } from '@/components/damImage/uploadQueue/keyword/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/components/damImage/uploadQueue/author/damAuthorConfig'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: string\n extSystem: IntegerId\n }>(),\n {}\n)\n\nconst { t } = useI18n()\n\nconst panels = ref(['metadata', 'file'])\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, authorConflicts, metadataAreTouched, mainFileSingleUse } = storeToRefs(assetDetailStore)\n\nconst uploadQueuesStore = useUploadQueuesStore()\n\nconst items = computed(() => {\n return uploadQueuesStore.getQueueItems(props.queueKey)\n})\n\nconst item = computed<UploadQueueItem | null>(() => {\n return items.value[0] ?? null\n})\n\nconst assetType = computed(() => {\n return DamAssetType.Image\n})\n\nconst isTypeImage = computed(() => {\n return assetType.value === DamAssetType.Image\n})\n\nconst assetMainFile = computed<null | AssetFile>(() => {\n return asset.value && asset.value.mainFile ? (asset.value.mainFile as AssetFile) : null\n})\n\nconst onAnyMetadataChange = () => {\n metadataAreTouched.value = true\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss,vue/no-ref-object-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(assetType.value, props.extSystem)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss,vue/no-ref-object-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(assetType.value, props.extSystem)\n</script>\n\n<template>\n <VExpansionPanels\n v-if=\"item\"\n v-model=\"panels\"\n multiple\n class=\"v-expansion-panels--compact\"\n >\n <VExpansionPanel\n elevation=\"0\"\n :title=\"t('common.damImage.asset.detail.info.metadata')\"\n value=\"metadata\"\n >\n <VExpansionPanelText>\n <VForm :disabled=\"!item.canEditMetadata\">\n <AssetCustomMetadataForm\n v-if=\"item\"\n v-model=\"item.customData\"\n :ext-system=\"extSystem\"\n :asset-type=\"assetType\"\n @any-change=\"onAnyMetadataChange\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <KeywordRemoteAutocompleteWithCached\n v-model=\"item.keywords\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n data-cy=\"custom-field-keywords\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :disabled=\"!item.canEditMetadata\"\n :required=\"keywordRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"authorEnabled\"\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <AuthorRemoteAutocompleteWithCached\n v-model=\"item.authors\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :author-conflicts=\"authorConflicts\"\n data-cy=\"custom-field-authors\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :disabled=\"!item.canEditMetadata\"\n :required=\"authorRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n dense\n class=\"my-2\"\n >\n <VCol>\n <VSwitch\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n v-model=\"mainFileSingleUse\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VForm>\n </VExpansionPanelText>\n </VExpansionPanel>\n <VExpansionPanel\n v-if=\"asset\"\n elevation=\"0\"\n :title=\"t('common.damImage.asset.detail.info.file')\"\n value=\"file\"\n >\n <VExpansionPanelText class=\"text-caption\">\n <!-- all types -->\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.id') }}\n </VCol>\n <VCol cols=\"9\">\n <ACopyText :value=\"asset.id\" />\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.type') }}\n </VCol>\n <VCol cols=\"9\">\n {{ asset.attributes.assetType }}\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.model.tracking.created') }}\n </VCol>\n <VCol cols=\"9\">\n {{ dateTimePretty(asset.createdAt) }}\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.model.tracking.modified') }}\n </VCol>\n <VCol cols=\"9\">\n {{ dateTimePretty(asset.modifiedAt) }}\n </VCol>\n </VRow>\n <div v-if=\"assetMainFile\">\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.mainFileId') }}\n </VCol>\n <VCol cols=\"9\">\n <ACopyText :value=\"assetMainFile.id\" />\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.mimeType') }}\n </VCol>\n <VCol cols=\"9\">\n {{ assetMainFile.fileAttributes.mimeType }}\n </VCol>\n </VRow>\n <VRow>\n <VCol cols=\"3\">\n {{ t('common.damImage.asset.detail.info.field.size') }}\n </VCol>\n <VCol cols=\"9\">\n {{ prettyBytes(assetMainFile.fileAttributes.size) }}\n </VCol>\n </VRow>\n <AssetMetadataImageAttributes\n v-if=\"isTypeImage && assetFileIsImageFile(assetMainFile)\"\n :file=\"assetMainFile\"\n />\n </div>\n </VExpansionPanelText>\n </VExpansionPanel>\n </VExpansionPanels>\n</template>\n","<script lang=\"ts\" setup>\nimport AssetDetailSidebarActionsWrapper from '@/components/damImage/uploadQueue/components/AssetDetailSidebarActionsWrapper.vue'\nimport { useI18n } from 'vue-i18n'\nimport useVuelidate from '@vuelidate/core'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport UploadQueueDialogSingleSidebarMetadataContent from '@/components/damImage/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport { useAlerts } from '@/composables/system/alerts'\nimport type { IntegerId } from '@/types/common'\n\nwithDefaults(\n defineProps<{\n queueKey: string\n extSystem: IntegerId\n isActive: boolean\n dataCy?: string\n assetType: DamAssetTypeType\n }>(),\n {\n dataCy: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'onSave'): void\n (e: 'onSaveAndApply'): void\n}>()\n\nconst { t } = useI18n()\n\nconst v$ = useVuelidate({ $scope: ADamAssetMetadataValidationScopeSymbol })\n\nconst { showValidationError } = useAlerts()\n\nconst onSave = async () => {\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n return\n }\n emit('onSave')\n}\n\nconst onSaveAndApply = async () => {\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n return\n }\n emit('onSaveAndApply')\n}\n</script>\n\n<template>\n <AssetDetailSidebarActionsWrapper\n v-if=\"isActive\"\n :queue-key=\"queueKey\"\n >\n <ABtnSecondary\n type=\"submit\"\n class=\"ml-2\"\n data-cy=\"button-save\"\n @click.stop=\"onSave\"\n >\n {{ t('common.button.save') }}\n </ABtnSecondary>\n <ABtnPrimary\n type=\"submit\"\n class=\"mx-2\"\n data-cy=\"button-save-and-apply\"\n @click.stop=\"onSaveAndApply\"\n >\n {{ t('common.damImage.upload.saveAndApply') }}\n </ABtnPrimary>\n </AssetDetailSidebarActionsWrapper>\n <UploadQueueDialogSingleSidebarMetadataContent\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport {\n AssetDetailTabImageWithRoi,\n useAssetDetailStore,\n} from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport type { DocId, IntegerId } from '@/types/common'\nimport type { DamAssetStatusType, DamAssetTypeType } from '@/types/coreDam/Asset'\nimport type { AssetFileFailReasonType, AssetFileProcessStatusType } from '@/types/coreDam/AssetFile'\nimport { useI18n } from 'vue-i18n'\nimport AssetDetailSidebarROI from '@/components/damImage/uploadQueue/components/AssetDetailSidebarROI.vue'\nimport AssetDetailSidebarActionsTeleportTarget from '@/components/damImage/uploadQueue/components/AssetDetailSidebarActionsTeleportTarget.vue'\nimport UploadQueueDialogSingleSidebarMetadata from '@/components/damImage/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue'\n\nwithDefaults(\n defineProps<{\n queueKey: string\n extSystem: IntegerId\n assetId: DocId\n isVideo: boolean\n isAudio: boolean\n isImage: boolean\n isDocument: boolean\n enableRoiTab: boolean\n showFileInfo: boolean\n dataCy?: string\n assetStatus: DamAssetStatusType\n assetType: DamAssetTypeType\n assetMainFileStatus?: AssetFileProcessStatusType | undefined\n assetMainFileFailReason?: AssetFileFailReasonType | undefined\n }>(),\n {\n assetMainFileStatus: undefined,\n assetMainFileFailReason: undefined,\n dataCy: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'onSave'): void\n (e: 'onSaveAndApply'): void\n}>()\n\nconst { t } = useI18n()\n\nconst assetDetailStore = useAssetDetailStore()\nconst { activeTab } = storeToRefs(assetDetailStore)\n</script>\n\n<template>\n <div class=\"sidebar-info d-flex w-100 h-100 flex-column\">\n <div class=\"w-100 d-flex flex-column\">\n <VTabs\n v-model=\"activeTab\"\n show-arrows\n class=\"sidebar-info__tabs\"\n >\n <VTab\n :value=\"AssetDetailTabImageWithRoi.Info\"\n data-cy=\"button-meta\"\n >\n {{ t('common.damImage.asset.detail.tabs.info') }}\n </VTab>\n <VTab\n v-if=\"isImage && enableRoiTab\"\n :value=\"AssetDetailTabImageWithRoi.ROI\"\n data-cy=\"button-focus\"\n >\n {{ t('common.damImage.asset.detail.tabs.roi') }}\n </VTab>\n </VTabs>\n\n <div class=\"sidebar-info__content\">\n <slot name=\"prepend-sidebar\"></slot>\n <div\n v-if=\"activeTab === AssetDetailTabImageWithRoi.Info\"\n class=\"py-2\"\n >\n <UploadQueueDialogSingleSidebarMetadata\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n :is-active=\"activeTab === AssetDetailTabImageWithRoi.Info\"\n :asset-type=\"assetType\"\n @on-save=\"emit('onSave')\"\n @on-save-and-apply=\"emit('onSaveAndApply')\"\n />\n </div>\n <div\n v-if=\"isImage && activeTab === AssetDetailTabImageWithRoi.ROI\"\n class=\"py-2\"\n >\n <AssetDetailSidebarROI\n :queue-key=\"queueKey\"\n :is-active=\"activeTab === AssetDetailTabImageWithRoi.ROI\"\n />\n </div>\n </div>\n <div class=\"sidebar-info__actions px-2\">\n <AssetDetailSidebarActionsTeleportTarget :queue-key=\"queueKey\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { eventClickBlur } from '@/utils/event'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\n\nconst props = withDefaults(\n defineProps<{\n isUploading: boolean\n dialogMaxWidth?: number\n buttonSize?: number\n dataCy?: string\n }>(),\n {\n dialogMaxWidth: 300,\n buttonSize: 26,\n dataCy: 'button-stop',\n }\n)\nconst emit = defineEmits<{\n (e: 'confirm'): void\n}>()\n\nconst dialog = ref(false)\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n if (!props.isUploading) {\n emit('confirm')\n return\n }\n dialog.value = true\n}\nconst onConfirm = () => {\n emit('confirm')\n dialog.value = false\n}\n\nconst onCancel = () => {\n dialog.value = false\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n variant=\"flat\"\n :data-cy=\"dataCy\"\n icon\n :width=\"buttonSize\"\n :height=\"buttonSize\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-close\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.upload.stop') }}\n </VTooltip>\n </VBtn>\n <VDialog\n v-model=\"dialog\"\n :width=\"500\"\n >\n <VCard\n v-if=\"dialog\"\n data-cy=\"delete-panel\"\n >\n <ADialogToolbar @on-cancel=\"onCancel\">\n {{ t('common.damImage.upload.stopConfirmQuestion') }}\n </ADialogToolbar>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-cancel\"\n @click.stop=\"onCancel\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n data-cy=\"button-confirm\"\n @click.stop=\"onConfirm\"\n >\n {{ t('common.damImage.upload.stop') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { storeToRefs } from 'pinia'\nimport { useI18n } from 'vue-i18n'\nimport { useTheme } from '@/composables/themeSettings'\nimport {\n AssetDetailTabImageWithRoi,\n useAssetDetailStore,\n} from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport {\n type AssetDetailItemDto,\n DamAssetStatusDefault,\n DamAssetType,\n DamAssetTypeDefault,\n} from '@/types/coreDam/Asset'\nimport AssetDetailDialogLoader from '@/components/damImage/uploadQueue/components/AssetDetailDialogLoader.vue'\nimport AssetImage from '@/components/damImage/uploadQueue/components/AssetImage.vue'\nimport { AssetFileFailReason, assetFileIsImageFile } from '@/types/coreDam/AssetFile'\nimport AssetImageRoiSelect from '@/components/damImage/uploadQueue/components/AssetImageRoiSelect.vue'\nimport type { ImageCreateUpdateAware } from '@/types/ImageAware'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport { useUploadQueueDialog } from '@/components/damImage/uploadQueue/composables/uploadQueueDialog'\nimport {\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n} from '@/types/coreDam/UploadQueue'\nimport { dateTimeNow } from '@/utils/datetime'\nimport AssetFileFailReasonChip from '@/components/damImage/uploadQueue/components/AssetFileFailReasonChip.vue'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { bulkUpdateAssetsMetadata, fetchAsset } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport UploadQueueDialogSingleSidebar from '@/components/damImage/uploadQueue/components/UploadQueueDialogSingleSidebar.vue'\nimport UploadQueueButtonStop from '@/components/damImage/uploadQueue/components/UploadQueueButtonStop.vue'\nimport { isNull, isString } from '@/utils/common'\nimport { fetchAuthorListByIds } from '@/components/damImage/uploadQueue/api/authorApi'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: string\n extSystem: IntegerId\n licenceId: IntegerId\n fileInputKey: number\n accept: string | undefined\n maxSizes: Record<string, number> | undefined\n disableDoneAnimation?: boolean\n }>(),\n {\n disableDoneAnimation: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'onApply', items: ImageCreateUpdateAware[]): void\n}>()\n\nconst { showErrorsDefault, showRecordWas } = useAlerts()\n\nconst IMAGE_ASPECT_RATIO = 16 / 9\n\nconst { t } = useI18n()\n\nconst { toolbarColor } = useTheme()\n\nconst assetDetailStore = useAssetDetailStore()\nconst { activeTab, loading, asset: assetDetail } = storeToRefs(assetDetailStore)\nconst enableRoiTab = ref(false)\n\nconst uploadQueuesStore = useUploadQueuesStore()\nconst { uploadQueueDialog } = useUploadQueueDialog()\n\nconst items = computed(() => {\n return uploadQueuesStore.getQueueItems(props.queueKey)\n})\n\nconst item = computed<UploadQueueItem | null>(() => {\n return items.value[0] ?? null\n})\n\nconst asset = computed<AssetDetailItemDto | null>(() => {\n if (!item.value || !item.value.assetId) return null\n if (isDone.value && assetDetail.value) return assetDetail.value\n return {\n id: item.value.assetId,\n texts: {\n displayTitle: '',\n },\n attributes: {\n assetType: item.value.assetType,\n assetStatus: item.value.assetStatus,\n },\n mainFileSingleUse: false,\n flags: {\n described: false,\n visible: false,\n },\n licence: item.value.licenceId,\n mainFile: null,\n keywords: [],\n authors: [],\n podcasts: [],\n metadata: {\n authorSuggestions: {},\n keywordSuggestions: {},\n customData: {},\n },\n distributionCategory: null,\n assetFileProperties: {\n distributesInServices: [],\n slotNames: [],\n fromRss: false,\n width: 0,\n height: 0,\n },\n _resourceName: 'asset',\n _system: 'coreDam',\n createdAt: dateTimeNow(),\n modifiedAt: dateTimeNow(),\n createdBy: null,\n modifiedBy: null,\n }\n})\n\nconst sidebar = ref(true)\n\nconst toggleSidebar = () => {\n sidebar.value = !sidebar.value\n}\n\nconst onImageLoad = () => {\n // imageLoading.value = false\n}\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\nconst assetStatus = computed(() => {\n if (!asset.value) return DamAssetStatusDefault\n return asset.value.attributes.assetStatus\n})\n\nconst isTypeImage = computed(() => {\n return assetType.value === DamAssetType.Image\n})\nconst isTypeVideo = computed(() => {\n return assetType.value === DamAssetType.Video\n})\nconst isTypeAudio = computed(() => {\n return assetType.value === DamAssetType.Audio\n})\nconst isTypeDocument = computed(() => {\n return assetType.value === DamAssetType.Document\n})\n\nconst imageProperties = computed(() => {\n if (item.value?.imagePreview) {\n return {\n url: item.value.imagePreview.url + '?random=' + Date.now(),\n width: item.value.imagePreview.requestedWidth || undefined,\n height: item.value.imagePreview.requestedHeight || undefined,\n bgColor:\n assetFileIsImageFile(asset.value?.mainFile) &&\n asset.value?.mainFile.imageAttributes &&\n asset.value?.mainFile.imageAttributes.mostDominantColor\n ? asset.value.mainFile.imageAttributes.mostDominantColor\n : '#ccc',\n }\n }\n return {\n url: '',\n width: 356,\n height: 200,\n bgColor: '#ccc',\n }\n})\n\nconst assetMainFile = computed(() => {\n return asset.value?.mainFile || undefined\n})\n\nconst processingStatuses: readonly UploadQueueItemStatusType[] = [\n UploadQueueItemStatus.Processing,\n UploadQueueItemStatus.Loading,\n]\nconst processing = computed(() => {\n return !isNull(item.value) && processingStatuses.includes(item.value.status)\n})\nconst waiting = computed(() => {\n return !isNull(item.value) && item.value.status === UploadQueueItemStatus.Waiting\n})\nconst isDone = computed(() => {\n return !isNull(item.value) && item.value.status === UploadQueueItemStatus.Uploaded\n})\nconst showDone = computed(() => {\n return !props.disableDoneAnimation && isDone.value\n})\nconst uploading = computed(() => {\n return !isNull(item.value) && item.value.status === UploadQueueItemStatus.Uploading\n})\nconst uploadProgress = computed(() => {\n return item.value?.progress.progressPercent\n})\n\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst onStopConfirm = async () => {\n uploadQueuesStore.stopUpload(props.queueKey)\n assetDetailStore.setAsset(null)\n uploadQueueDialog.value = null\n}\n\nconst queueTotalCount = computed(() => {\n return uploadQueuesStore.getQueueTotalCount(props.queueKey)\n})\n\nconst queueProcessedCount = computed(() => {\n return uploadQueuesStore.getQueueProcessedCount(props.queueKey)\n})\n\nconst isUploading = computed(() => {\n return queueTotalCount.value > queueProcessedCount.value\n})\n\nconst onSave = async () => {\n if (items.value.length === 0) return\n // saveAndCloseButtonLoading.value = true\n // v$.value.$touch()\n // if (v$.value.$invalid) {\n // showValidationError()\n // saveAndCloseButtonLoading.value = false\n // return\n // }\n try {\n await bulkUpdateAssetsMetadata(damClient, items.value)\n showRecordWas('updated')\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n // saveAndCloseButtonLoading.value = false\n }\n}\n\nconst onSaveAndApply = async () => {\n if (items.value.length === 0) return\n // saveAndCloseButtonLoading.value = true\n // v$.value.$touch()\n // if (v$.value.$invalid) {\n // showValidationError()\n // saveAndCloseButtonLoading.value = false\n // return\n // }\n let description = ''\n let source = ''\n try {\n const assetsMetadataRes = await bulkUpdateAssetsMetadata(damClient, items.value, assetDetailStore.mainFileSingleUse)\n if (!assetsMetadataRes[0]) {\n throw new Error('Fatal error updating asset metadata')\n }\n showRecordWas('updated')\n if (isString(assetsMetadataRes[0].customData?.description)) {\n description = assetsMetadataRes[0].customData.description.trim()\n }\n if (assetsMetadataRes[0].authors.length > 0) {\n const authorsRes = await fetchAuthorListByIds(damClient, props.extSystem, assetsMetadataRes[0].authors)\n source = authorsRes.map((author) => author.name).join(', ')\n }\n emit(\n 'onApply',\n items.value.map((item) => {\n return {\n texts: {\n description: description,\n source: source,\n },\n dam: {\n damId: item.fileId ?? '',\n regionPosition: 0,\n licenceId: props.licenceId,\n },\n position: 1,\n }\n })\n )\n\n await onStopConfirm()\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n // saveAndCloseButtonLoading.value = false\n }\n}\n\nwatch(\n isDone,\n async (newValue) => {\n if (!newValue || !item.value?.assetId) return\n try {\n const res = await fetchAsset(damClient, item.value.assetId)\n assetDetailStore.setAsset(res)\n enableRoiTab.value = true\n } catch (e) {\n showErrorsDefault(e)\n }\n },\n { immediate: true }\n)\n\nonMounted(() => {\n activeTab.value = AssetDetailTabImageWithRoi.Info\n})\n</script>\n\n<template>\n <VDialog\n :model-value=\"true\"\n fullscreen\n eager\n >\n <AssetDetailDialogLoader\n v-if=\"loading || !item\"\n @close-dialog=\"onStopConfirm\"\n />\n <VCard\n v-else-if=\"item\"\n class=\"dam-image-detail\"\n :class=\"{ 'dam-image-detail--sidebar-active': sidebar }\"\n >\n <div class=\"dam-image-detail__wrapper d-flex flex-column\">\n <VToolbar\n :color=\"toolbarColor\"\n density=\"compact\"\n :height=\"64\"\n class=\"system-border-b pr-1\"\n >\n <div class=\"text-subtitle-2 d-flex px-2\">\n <div\n v-if=\"isUploading\"\n class=\"text-subtitle-2\"\n >\n {{ t('common.damImage.upload.title') }}\n </div>\n <div\n v-else\n class=\"text-subtitle-2 text-green-darken-3 font-weight-bold\"\n >\n {{ t('common.damImage.upload.titleDone') }}\n </div>\n </div>\n <VSpacer />\n <div class=\"pr-3\">\n <VBtn\n :active=\"sidebar\"\n :variant=\"sidebar ? 'flat' : 'text'\"\n :color=\"sidebar ? 'secondary' : ''\"\n icon\n class=\"mr-1\"\n :width=\"36\"\n :height=\"36\"\n @click.stop=\"toggleSidebar\"\n >\n <VIcon icon=\"mdi-information-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.detail.toggleInfo') }}\n </VTooltip>\n </VBtn>\n <UploadQueueButtonStop\n data-cy=\"button-close\"\n :button-size=\"36\"\n :is-uploading=\"isUploading\"\n @confirm=\"onStopConfirm\"\n />\n </div>\n </VToolbar>\n <div class=\"d-flex w-100 h-100 position-relative\">\n <div class=\"d-flex w-100 align-center dam-image-detail__left\">\n <div\n v-if=\"activeTab === AssetDetailTabImageWithRoi.ROI && enableRoiTab\"\n class=\"w-100 h-100 pa-2 d-flex align-center justify-center\"\n >\n <AssetImageRoiSelect />\n </div>\n <div\n v-else\n class=\"w-100 h-100 pa-2 d-flex align-center justify-center\"\n >\n <div class=\"position-relative\">\n <AssetImage\n v-if=\"item\"\n :asset-type=\"assetType\"\n :asset-status=\"assetStatus\"\n :src=\"imageProperties.url\"\n :background-color=\"imageProperties.bgColor\"\n :width=\"imageProperties.width\"\n :height=\"imageProperties.height\"\n :show-uploading=\"uploading\"\n :show-processing=\"processing\"\n :show-waiting=\"waiting\"\n :show-done=\"showDone\"\n :uploading-progress=\"uploadProgress\"\n :remaining-time=\"item.progress.remainingTime\"\n use-component\n cover\n :aspect-ratio=\"IMAGE_ASPECT_RATIO\"\n @load=\"onImageLoad\"\n @error=\"onImageLoad\"\n />\n <div\n v-if=\"item && item.error.hasError\"\n :class=\"\n 'dam-upload-queue__overlay dam-upload-queue__overlay--error ' +\n 'd-flex align-center justify-center flex-column'\n \"\n >\n <VIcon\n icon=\"mdi-alert\"\n class=\"ma-1\"\n size=\"x-small\"\n color=\"error\"\n />\n <div class=\"text-error\">\n {{ t('common.damImage.queueItem.error') }}\n </div>\n <div\n v-if=\"item && item.error.message.length\"\n class=\"text-caption\"\n v-text=\"item.error.message\"\n />\n <div v-else-if=\"item.error.assetFileFailReason !== AssetFileFailReason.None\">\n <AssetFileFailReasonChip :reason=\"item.error.assetFileFailReason\" />\n </div>\n <div\n v-else\n class=\"text-caption\"\n >\n {{ t('common.damImage.uploadErrors.unknownError') }}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"h-100 d-flex dam-image-detail__sidebar system-border-l\">\n <UploadQueueDialogSingleSidebar\n v-if=\"asset\"\n :key=\"asset.id\"\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n :enable-roi-tab=\"enableRoiTab\"\n :show-file-info=\"enableRoiTab\"\n :asset-id=\"asset.id\"\n :is-video=\"isTypeVideo\"\n :is-audio=\"isTypeAudio\"\n :is-image=\"isTypeImage\"\n :is-document=\"isTypeDocument\"\n :asset-status=\"assetStatus\"\n :asset-type=\"assetType\"\n :asset-main-file-status=\"assetMainFile ? assetMainFile.fileAttributes.status : undefined\"\n :asset-main-file-fail-reason=\"assetMainFile ? assetMainFile.fileAttributes.failReason : undefined\"\n @on-save=\"onSave\"\n @on-save-and-apply=\"onSaveAndApply\"\n >\n <template #prepend-sidebar>\n <div v-if=\"item?.isDuplicate\" class=\"text-caption text-warning px-3 py-2\">\n {{ t('common.damImage.asset.detail.info.status.duplicate') }}\n </div>\n <div v-if=\"item?.isDuplicate && item?.mainFileSingleUse\" class=\"text-caption text-error px-3 py-2\">\n {{ t('common.damImage.asset.model.mainFileSingleUse') }}\n </div>\n </template>\n </UploadQueueDialogSingleSidebar>\n </div>\n </div>\n </div>\n </VCard>\n </VDialog>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch, withModifiers } from 'vue'\nimport { isBoolean, isUndefined } from '@/utils/common'\nimport AFileDropzone from '@/components/file/AFileDropzone.vue'\nimport type { InputFileChangeEvent } from '@/types/ChangeEvent'\nimport { useFormatAndSizeCheck } from '@/components/file/composables/formatAndSizeCheck'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n useDropzone?: boolean\n dropzoneVariant?: 'fill' | 'default' | 'fullscreen'\n onDropzoneClickCallback?: (() => void) | undefined | false // false for disable, undefined for browse files, otherwise custom callback is used\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n useDropzone: false,\n dropzoneVariant: 'default',\n onDropzoneClickCallback: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst BLOCK_DOUBLE_CLICK_MS = 200\n\nconst inputRef = ref<undefined | HTMLInputElement>(undefined)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst fileInputKeyLocal = ref(props.fileInputKey || 0)\nconst blockDoubleClick = ref(false)\n\nconst clickInput = () => {\n if (blockDoubleClick.value === true) {\n return\n }\n blockDoubleClick.value = true\n inputRef.value?.click()\n setTimeout(() => {\n blockDoubleClick.value = false\n }, BLOCK_DOUBLE_CLICK_MS)\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(props.accept, props.maxSizes)\n\nconst validateData = (files: File[]) => {\n if (!props.multiple && files.length > 0) {\n const checked = checkFormatsAndSizes([files[0]])\n emit('filesInput', checked)\n return\n }\n const checked = checkFormatsAndSizes(files)\n emit('filesInput', checked)\n}\n\nconst onDropzoneDrop = (files: File[]) => {\n validateData(files)\n}\n\nconst onInputFileChange = (payload: Event) => {\n const event = payload as InputFileChangeEvent\n emit('change', event)\n validateData(Array.from(event.target?.files ?? []))\n}\n\nconst onFileDropzoneClick = () => {\n if (isBoolean(props.onDropzoneClickCallback)) {\n return\n }\n if (isUndefined(props.onDropzoneClickCallback)) {\n clickInput()\n return\n }\n props.onDropzoneClickCallback()\n}\n\nwatch(\n () => props.fileInputKey,\n (newValue, oldValue) => {\n if (newValue === oldValue || isUndefined(newValue)) {\n return\n }\n fileInputKeyLocal.value = newValue\n }\n)\n\ndefineExpose({\n activate: clickInput,\n})\n</script>\n\n<template>\n <AFileDropzone\n v-if=\"useDropzone\"\n :variant=\"dropzoneVariant\"\n @on-click=\"onFileDropzoneClick\"\n @on-drop=\"onDropzoneDrop\"\n />\n <slot\n v-else\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => clickInput(), ['stop']) }\"\n />\n <input\n ref=\"inputRef\"\n :key=\"fileInputKeyLocal\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n hidden\n tabindex=\"-1\"\n type=\"file\"\n @change=\"onInputFileChange\"\n >\n</template>\n","<script setup lang=\"ts\">\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport AFileInput from '@/components/file/AFileInput.vue'\nimport type { VBtn } from 'vuetify/components'\nimport type { InputFileChangeEvent } from '@/types/ChangeEvent'\nimport { ref } from 'vue'\nimport ARow from '@/components/ARow.vue'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nwithDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst modelValue = defineModel<boolean>({ default: false, required: false })\n\nconst onClose = () => {\n modelValue.value = false\n}\n\nconst { t } = useI18n()\n\nconst fileInputComponent = ref<InstanceType<typeof AFileInput> | null>(null)\n\nconst onFilesInput = (files: File[]) => {\n emit('filesInput', files)\n modelValue.value = false\n}\n\nconst activate = () => {\n fileInputComponent.value?.activate()\n}\n\ndefineExpose({\n activate,\n})\n</script>\n\n<template>\n <VDialog\n :model-value=\"modelValue\"\n persistent\n :max-width=\"500\"\n @update:model-value=\"modelValue = $event\"\n >\n <template #activator=\"{ props: dialogProps }\">\n <slot\n name=\"activator\"\n :props=\"dialogProps\"\n >\n <VBtn\n v-bind=\"dialogProps\"\n :text=\"t('common.button.open')\"\n />\n </slot>\n </template>\n <VCard\n v-if=\"modelValue\"\n data-cy=\"create-panel\"\n >\n <ADialogToolbar @on-cancel=\"onClose\">\n <slot name=\"title\">\n {{ t('common.button.upload') }}\n </slot>\n </ADialogToolbar>\n <VCardText>\n <ARow>\n <AFileInput\n ref=\"fileInput\"\n :file-input-key=\"fileInputKey\"\n :accept=\"accept\"\n :max-sizes=\"maxSizes\"\n :multiple=\"multiple\"\n use-dropzone\n @files-input=\"onFilesInput\"\n @change=\"emit('change', $event)\"\n />\n </ARow>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-close\"\n @click.stop=\"onClose\"\n >\n {{ t('common.button.close') }}\n </ABtnTertiary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","import type { InjectionKey, ShallowRef } from 'vue'\nimport type { DamConfigLicenceExtSystemReturnType, DamExtSystemConfig } from '@/types/coreDam/DamConfig'\nimport type { IntegerId } from '@/types/common'\n\nexport const ImageWidgetExtSystemConfigs: InjectionKey<ShallowRef<Map<IntegerId, DamExtSystemConfig>>> = Symbol.for(\n 'anzu:ImageWidgetExtSystemConfigs'\n)\n\nexport const ImageWidgetUploadConfig: InjectionKey<ShallowRef<DamConfigLicenceExtSystemReturnType | undefined>> =\n Symbol.for('anzu:ImageWidgetUploadConfig')\n","<script lang=\"ts\" setup>\nimport AImageDropzone from '@/components/file/AFileDropzone.vue'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/types/common'\nimport type { ImageAware, ImageCreateUpdateAware } from '@/types/ImageAware'\nimport imagePlaceholderPath from '@/assets/image/placeholder16x9.jpg'\nimport { useCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\nimport { useImageActions } from '@/components/damImage/composables/imageActions'\nimport { cloneDeep, isDefined, isNull, isNumber, isString, isUndefined } from '@/utils/common'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { DamAssetType } from '@/types/coreDam/Asset'\nimport { useDamAcceptTypeAndSizeHelper } from '@/components/damImage/uploadQueue/composables/acceptTypeAndSizeHelper'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport AAssetSelect from '@/components/dam/assetSelect/AAssetSelect.vue'\nimport type { AssetSelectReturnData } from '@/types/coreDam/AssetSelect'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { createImage, deleteImage, fetchImage, updateImage } from '@/components/damImage/uploadQueue/api/imageApi'\nimport ImageDetailDialogMetadata from '@/components/damImage/uploadQueue/components/ImageDetailDialogMetadata.vue'\nimport { useImageStore } from '@/components/damImage/uploadQueue/composables/imageStore'\nimport { computed, inject, onMounted, ref, type ShallowRef, toRaw, watch } from 'vue'\nimport AssetDetailDialog from '@/components/damImage/uploadQueue/components/AssetDetailDialog.vue'\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport { fetchAsset, fetchAssetByFileId } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport UploadQueueDialogSingle from '@/components/damImage/uploadQueue/components/UploadQueueDialogSingle.vue'\nimport { useUploadQueueDialog } from '@/components/damImage/uploadQueue/composables/uploadQueueDialog'\nimport { fetchAuthorListByIds } from '@/components/damImage/uploadQueue/api/authorApi'\nimport { useI18n } from 'vue-i18n'\nimport type { VBtn } from 'vuetify/components'\nimport { useExtSystemIdForCached } from '@/components/damImage/uploadQueue/composables/extSystemIdForCached'\nimport { useAssetSelectStore } from '@/services/stores/coreDam/assetSelectStore'\nimport { fetchDamAssetLicence } from '@/components/damImage/uploadQueue/api/damAssetLicenceApi'\nimport {\n type CollabComponentConfig,\n type CollabFieldData,\n type CollabFieldLockOptions,\n CollabStatus,\n type CollabStatusType,\n} from '@/components/collab/types/Collab'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\nimport { useCollabField } from '@/components/collab/composables/collabField'\nimport ACollabLockedByUser from '@/components/collab/components/ACollabLockedByUser.vue'\nimport AFileInputDialog from '@/components/file/AFileInputDialog.vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusPayload,\n CollabFieldLockType,\n} from '@/components/collab/composables/collabEventBus'\nimport { ImageWidgetUploadConfig } from '@/components/damImage/composables/imageWidgetInkectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n uploadLicence: IntegerId\n selectLicences: IntegerId[]\n image?: ImageAware | undefined // optional, if available, no need to fetch image data\n configName?: string\n collab?: CollabComponentConfig\n collabStatus?: CollabStatusType\n label?: string | undefined\n required?: boolean\n readonly?: boolean\n dataCy?: string | undefined\n expandOptions?: boolean\n expandMetadata?: boolean // only one at once, use in dialogs\n disableOnClickMenu?: boolean\n width?: number | undefined\n maxWidth?: number | undefined\n height?: number | undefined\n callDeleteApiOnRemove?: boolean\n damWidth?: undefined | number\n damHeight?: undefined | number\n }>(),\n {\n configName: 'default',\n collab: undefined,\n collabStatus: CollabStatus.Inactive,\n label: undefined,\n required: false,\n image: undefined,\n readonly: false,\n lockable: false,\n lockedById: undefined,\n dataCy: undefined,\n expandOptions: false,\n expandMetadata: false,\n disableOnClickMenu: false,\n width: undefined,\n maxWidth: undefined,\n height: undefined,\n callDeleteApiOnRemove: false,\n damWidth: undefined,\n damHeight: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'afterMetadataSaveSuccess'): void\n}>()\n\nconst modelValue = defineModel<IntegerIdNullable>({ required: true })\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData, options?: Partial<CollabFieldLockOptions>) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst acquireFieldLock = ref((options?: Partial<CollabFieldLockOptions>) => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, acquireCollabFieldLock, addCollabFieldLockStatusListener, lockedByUser } =\n useCollabField(props.collab.room, props.collab.field)\n releaseFieldLock.value = releaseCollabFieldLock\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n // addCollabFieldDataChangeListener((data: CollabFieldDataEnvelope) => {\n // modelValue.value = data.value as IntegerIdNullable\n // reload(undefined, modelValue.value)\n // })\n addCollabFieldLockStatusListener((data: CollabFieldLockStatusPayload) => {\n if (data.status === CollabFieldLockStatus.Success && data.type === CollabFieldLockType.Acquire) {\n collabFieldLockReallyLocked.value = true\n } else if (data.status === CollabFieldLockStatus.Failure && data.type === CollabFieldLockType.Acquire) {\n collabFieldLockReallyLocked.value = false\n } else if (data.status === CollabFieldLockStatus.Success && data.type === CollabFieldLockType.Release) {\n collabFieldLockReallyLocked.value = false\n } else if (data.status === CollabFieldLockStatus.Failure && data.type === CollabFieldLockType.Release) {\n collabFieldLockReallyLocked.value = true\n }\n })\n}\nconst lockedLocal = ref(false)\nconst acquireFieldLockLocal = () => {\n if (lockedLocal.value === true || props.collabStatus === CollabStatus.Inactive) return\n acquireFieldLock.value()\n lockedLocal.value = true\n}\nconst releaseFieldLockLocal = (value: IntegerIdNullable) => {\n if (lockedLocal.value === false || props.collabStatus === CollabStatus.Inactive) return\n releaseFieldLock.value(value)\n lockedLocal.value = false\n}\n\nconst imageWidgetUploadConfig = inject<ShallowRef<DamConfigLicenceExtSystemReturnType | undefined> | undefined>(\n ImageWidgetUploadConfig,\n undefined\n)\n\nif (isUndefined(imageWidgetUploadConfig) || isUndefined(imageWidgetUploadConfig.value)) {\n throw new Error(\"Fatal error, parent component doesn't provide necessary config ext system config.\")\n}\n\nconst { t } = useI18n()\n\nconst { showErrorsDefault, showError } = useAlerts()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst imageOptions = useCommonAdminImageOptions(props.configName)\nconst { imageClient } = imageOptions\nconst { widgetImageToDamImageUrl } = useImageActions(imageOptions)\nconst uploadQueuesStore = useUploadQueuesStore()\nconst imageStore = useImageStore()\nconst { uploadQueueDialog } = useUploadQueueDialog()\n\nconst resImage = ref<null | ImageCreateUpdateAware>(null)\nconst clickMenuOpened = ref(false)\nconst assetSelectDialog = ref(false)\nconst metadataDialog = ref(false)\nconst metadataDialogSaving = ref(false)\nconst metadataDialogLoading = ref(false)\nconst fileInputDialog = ref(false)\n\nconst withoutImage = computed(() => {\n return isNull(modelValue.value)\n})\n\nconst resolvedSrc = ref('')\n\nconst uploadQueue = computed(() => {\n return uploadQueuesStore.getQueue(props.queueKey)\n})\n\nconst imageLoaded = computed(() => {\n return !isNull(resImage.value)\n})\n\nconst actionEditMeta = () => {\n imageStore.setImageDetail(toRaw(resImage.value))\n metadataDialog.value = true\n}\n\nconst actionLibrary = () => {\n assetSelectDialog.value = true\n}\n\nconst { cachedExtSystemId } = useExtSystemIdForCached()\n\n// this ref is updating only when the lock was really success or failure using sockets, needed for drop files\nconst collabFieldLockReallyLocked = ref(false)\n\nconst waitForFieldLockIsReallyAcquired = async () => {\n if (!collabOptions.value.enabled || isUndefined(props.collab) || props.collabStatus === CollabStatus.Inactive) {\n return Promise.resolve(true)\n }\n\n let count = 0\n\n const checkLock: () => Promise<Awaited<boolean>> = () => {\n if (collabFieldLockReallyLocked.value) {\n return Promise.resolve(true)\n }\n\n count++\n if (count < 50) {\n return new Promise((resolve) => setTimeout(() => resolve(checkLock()), 100))\n }\n\n return Promise.reject(false)\n }\n\n return checkLock()\n}\n\nconst onDrop = async (files: File[]) => {\n acquireFieldLockLocal()\n const config = imageWidgetUploadConfig.value\n if (isUndefined(config)) return\n try {\n await waitForFieldLockIsReallyAcquired()\n cachedExtSystemId.value = config.extSystem\n uploadQueuesStore.addByFiles(props.queueKey, config.extSystem, config.licence, files)\n uploadQueueDialog.value = props.queueKey\n } catch (e) {\n showError('Unable to lock image widget by current user.')\n }\n}\n\nconst onFileInput = (files: File[]) => {\n const config = imageWidgetUploadConfig.value\n if (isUndefined(config)) return\n cachedExtSystemId.value = config.extSystem\n uploadQueuesStore.addByFiles(props.queueKey, config.extSystem, config.licence, files)\n uploadQueueDialog.value = props.queueKey\n}\n\nconst { uploadSizes, uploadAccept } = useDamAcceptTypeAndSizeHelper(\n DamAssetType.Image,\n imageWidgetUploadConfig.value.extSystemConfig\n)\n\nconst reload = async (newImage: ImageCreateUpdateAware | undefined, newImageId: IntegerIdNullable, force = false) => {\n resolvedSrc.value = imagePlaceholderPath\n if ((newImage && isNull(resImage.value)) || (newImage && force)) {\n resImage.value = cloneDeep(newImage)\n if (resImage.value) {\n if (isNumber(props.damWidth) && isNumber(props.damHeight)) {\n resolvedSrc.value = widgetImageToDamImageUrl(toRaw(resImage.value), props.damWidth, props.damHeight)\n } else {\n resolvedSrc.value = widgetImageToDamImageUrl(toRaw(resImage.value))\n }\n if (props.expandMetadata) {\n imageStore.setImageDetail(toRaw(resImage.value))\n }\n }\n return\n }\n if (newImageId) {\n try {\n resImage.value = await fetchImage(imageClient, newImageId)\n } catch (error) {\n showErrorsDefault(error)\n }\n if (!isNull(resImage.value)) {\n if (isNumber(props.damWidth) && isNumber(props.damHeight)) {\n resolvedSrc.value = widgetImageToDamImageUrl(toRaw(resImage.value), props.damWidth, props.damHeight)\n } else {\n resolvedSrc.value = widgetImageToDamImageUrl(toRaw(resImage.value))\n }\n if (props.expandMetadata) {\n imageStore.setImageDetail(toRaw(resImage.value))\n }\n }\n return\n }\n resImage.value = null\n}\n\nconst reset = () => {\n resolvedSrc.value = imagePlaceholderPath\n resImage.value = null\n modelValue.value = null\n releaseFieldLock.value(null)\n}\n\nwatch(\n [() => props.image, modelValue],\n async ([newImage, newImageId]) => {\n await reload(newImage, newImageId)\n },\n { immediate: true }\n)\n\nconst onAssetSelectConfirm = async (data: AssetSelectReturnData) => {\n const assetSelectStore = useAssetSelectStore()\n metadataDialogLoading.value = true\n imageStore.setImageDetail(null)\n metadataDialog.value = true\n let description = ''\n let source = ''\n if (data.type === 'asset') {\n if (!data.value[0] || !data.value[0].mainFile) return\n try {\n const assetRes = await fetchAsset(damClient, data.value[0].id)\n if (isString(assetRes.metadata.customData?.description)) {\n description = assetRes.metadata.customData.description.trim()\n }\n if (assetRes.authors.length > 0) {\n const authorsRes = await fetchAuthorListByIds(\n damClient,\n assetSelectStore.selectedSelectConfig.extSystem,\n assetRes.authors\n )\n source = authorsRes.map((author) => author.name).join(', ')\n }\n } catch (e) {\n showErrorsDefault(e)\n }\n const image: ImageCreateUpdateAware = {\n texts: {\n description: description,\n source: source,\n },\n dam: {\n damId: data.value[0].mainFile.id,\n regionPosition: 0,\n licenceId: data.value[0].licence,\n },\n position: 1,\n }\n if (!isNull(modelValue.value)) {\n image.id = modelValue.value\n }\n imageStore.setImageDetail(image)\n metadataDialogLoading.value = false\n forceReloadViewWithExpandMetadata()\n }\n}\n\nconst assetDetailStore = useAssetDetailStore()\nconst { loading: assetLoading, dialog: assetDialog } = storeToRefs(assetDetailStore)\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst onEditAsset = async (assetFileId: DocId) => {\n assetLoading.value = true\n assetDialog.value = props.queueKey\n try {\n const asset = await fetchAssetByFileId(damClient, assetFileId)\n const licence = await fetchDamAssetLicence(damClient, asset.licence)\n if (licence.extSystem) {\n cachedExtSystemId.value = licence.extSystem\n }\n assetDetailStore.setAsset(asset)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n assetLoading.value = false\n }\n}\n\nconst onMetadataDialogClose = () => {\n imageStore.setImageDetail(null)\n metadataDialog.value = false\n}\n\nconst onMetadataDialogConfirm = async () => {\n if (isNull(imageStore.imageDetail)) return\n metadataDialogSaving.value = true\n try {\n const res = imageStore.imageDetail.id\n ? await updateImage(imageClient, imageStore.imageDetail.id, imageStore.imageDetail)\n : await createImage(imageClient, imageStore.imageDetail)\n metadataDialog.value = false\n modelValue.value = res.id\n imageStore.setImageDetail(null)\n await reload(res, res.id, true)\n emit('afterMetadataSaveSuccess')\n releaseFieldLock.value(res.id)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n metadataDialogSaving.value = false\n }\n}\n\nconst onImageDelete = async () => {\n if (isNull(modelValue.value)) return\n if (props.callDeleteApiOnRemove) {\n try {\n await deleteImage(imageClient, modelValue.value)\n reset()\n } catch (e) {\n showErrorsDefault(e)\n }\n return\n }\n reset()\n}\n\nconst forceReloadViewWithExpandMetadata = () => {\n const detail = imageStore.imageDetail\n if (!isNull(detail)) {\n reload(detail, null, true)\n }\n}\n\nconst onAssetUploadConfirm = (items: ImageCreateUpdateAware[]) => {\n if (!items[0]) return\n\n if (!isNull(modelValue.value)) {\n items[0].id = modelValue.value\n }\n imageStore.setImageDetail(items[0])\n metadataDialog.value = true\n if (props.expandMetadata) {\n forceReloadViewWithExpandMetadata()\n }\n}\n\nconst expandedUploadDialog = ref<InstanceType<typeof AFileInputDialog> | null>(null)\n\nconst onDropzoneClick = () => {\n if (isLocked.value) return\n acquireFieldLockLocal()\n if (!props.expandOptions) {\n clickMenuOpened.value = true\n return\n }\n expandedUploadDialog.value?.activate()\n}\n\nconst detailDialogMetadataComponent = ref<InstanceType<typeof ImageDetailDialogMetadata> | null>(null)\n\nconst metadataConfirm = () => {\n detailDialogMetadataComponent.value?.confirm()\n}\n\nconst onOptionsButtonClick = () => {\n acquireFieldLockLocal()\n}\n\nconst anyWidgetDialogOpened = computed(() => {\n return (\n metadataDialog.value ||\n assetSelectDialog.value ||\n fileInputDialog.value ||\n uploadQueueDialog.value === props.queueKey\n )\n})\n\nconst isLocked = computed(() => {\n return !isNull(lockedByUserLocal.value)\n})\n\nwatch(\n clickMenuOpened,\n (newValue, oldValue) => {\n if (newValue === oldValue || newValue || anyWidgetDialogOpened.value) return\n releaseFieldLockLocal(modelValue.value)\n },\n { immediate: false }\n)\n\nwatch(\n anyWidgetDialogOpened,\n (newValue, oldValue) => {\n if (newValue === oldValue || newValue) return\n releaseFieldLockLocal(modelValue.value)\n },\n { immediate: false }\n)\n\nonMounted(() => {\n imageStore.reset()\n})\n\ndefineExpose({\n metadataConfirm,\n})\n</script>\n\n<template>\n <div\n class=\"a-image-widget\"\n :class=\"{ 'a-image-widget--locked': isLocked }\"\n :style=\"{ width: width ? width + 'px' : undefined, maxWidth: maxWidth ? maxWidth + 'px' : undefined }\"\n >\n <div class=\"a-image-widget__options\">\n <h4\n v-if=\"label\"\n class=\"font-weight-bold text-subtitle-2\"\n >\n {{ label\n }}<span\n v-if=\"required\"\n class=\"required-mark\"\n />\n </h4>\n <div class=\"d-flex\">\n <div v-if=\"isLocked && collab\">\n <ACollabLockedByUser\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </div>\n <div>\n <div\n v-if=\"expandOptions\"\n class=\"d-flex flex-row\"\n >\n <VBtn\n v-if=\"imageLoaded && !expandMetadata\"\n class=\"mr-2 mb-2\"\n @click=\"actionEditMeta\"\n >\n {{ t('common.damImage.image.meta.edit') }}\n </VBtn>\n <VBtn\n class=\"mr-2 mb-2\"\n @click=\"actionLibrary\"\n >\n <span v-if=\"imageLoaded\">{{ t('common.damImage.image.button.replaceFromDam') }}</span>\n <span v-else>{{ t('common.damImage.image.button.addFromDam') }}</span>\n </VBtn>\n <AFileInputDialog\n ref=\"expandedUploadDialog\"\n v-model=\"fileInputDialog\"\n :file-input-key=\"uploadQueue?.fileInputKey\"\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n @files-input=\"onFileInput\"\n >\n <template #activator=\"{ props: fileInputProps }\">\n <VBtn v-bind=\"fileInputProps\">\n {{ t('common.damImage.image.button.upload') }}\n </VBtn>\n </template>\n </AFileInputDialog>\n <span\n v-if=\"required\"\n class=\"required-mark ml-2\"\n />\n </div>\n <VBtn\n v-else\n variant=\"text\"\n size=\"x-small\"\n icon\n :disabled=\"isLocked\"\n @click.stop=\"onOptionsButtonClick\"\n >\n <VIcon icon=\"mdi-dots-horizontal\" />\n <VTooltip\n activator=\"parent\"\n location=\"top\"\n >\n {{ t('common.damImage.image.button.options') }}\n </VTooltip>\n <VMenu\n v-model=\"clickMenuOpened\"\n activator=\"parent\"\n location=\"bottom right\"\n eager\n >\n <VCard>\n <VList density=\"compact\">\n <VListItem\n v-if=\"imageLoaded && !expandMetadata\"\n @click=\"actionEditMeta\"\n >\n <VListItemTitle>{{ t('common.damImage.image.meta.edit') }}</VListItemTitle>\n </VListItem>\n <VListItem @click=\"actionLibrary\">\n <VListItemTitle>\n <span v-if=\"imageLoaded\">{{ t('common.damImage.image.button.replaceFromDam') }}</span>\n <span v-else>{{ t('common.damImage.image.button.addFromDam') }}</span>\n </VListItemTitle>\n </VListItem>\n <AFileInputDialog\n v-model=\"fileInputDialog\"\n :file-input-key=\"uploadQueue?.fileInputKey\"\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n @files-input=\"onFileInput\"\n >\n <template #activator=\"{ props: fileInputProps }\">\n <VListItem\n @click=\"\n ($event: any) => {\n fileInputProps.onClick($event)\n clickMenuOpened = false\n }\n \"\n >\n {{ t('common.damImage.image.button.upload') }}\n </VListItem>\n </template>\n </AFileInputDialog>\n <VListItem\n v-if=\"imageLoaded\"\n @click=\"onImageDelete\"\n >\n <VListItemTitle>{{ t('common.damImage.image.button.removeImage') }}</VListItemTitle>\n </VListItem>\n </VList>\n </VCard>\n </VMenu>\n </VBtn>\n </div>\n </div>\n </div>\n <div class=\"position-relative\">\n <VImg\n :lazy-src=\"imagePlaceholderPath\"\n :src=\"resolvedSrc\"\n :width=\"width\"\n :height=\"height\"\n cover\n max-width=\"100%\"\n class=\"disable-radius\"\n >\n <template #placeholder>\n <div class=\"d-flex align-center justify-center h-100\">\n <VProgressCircular\n indeterminate\n color=\"grey-lighten-4\"\n />\n </div>\n </template>\n </VImg>\n <AImageDropzone\n variant=\"fill\"\n transparent\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n :hide-text=\"!withoutImage || isLocked\"\n @on-click=\"onDropzoneClick\"\n @on-drop=\"onDrop\"\n />\n </div>\n <slot\n name=\"append\"\n :image=\"resImage\"\n />\n <ImageDetailDialogMetadata\n ref=\"detailDialogMetadataComponent\"\n v-model=\"metadataDialog\"\n :expand=\"expandMetadata\"\n :saving=\"metadataDialogSaving\"\n :loading=\"metadataDialogLoading\"\n @edit-asset=\"onEditAsset\"\n @on-confirm=\"onMetadataDialogConfirm\"\n @on-close=\"onMetadataDialogClose\"\n />\n </div>\n <AAssetSelect\n v-model=\"assetSelectDialog\"\n :select-licences=\"selectLicences\"\n :min-count=\"1\"\n :max-count=\"1\"\n :asset-type=\"DamAssetType.Image\"\n return-type=\"asset\"\n @on-confirm=\"onAssetSelectConfirm\"\n />\n <AssetDetailDialog\n v-if=\"assetDialog === queueKey\"\n :queue-key=\"queueKey\"\n :ext-system=\"cachedExtSystemId\"\n />\n <UploadQueueDialogSingle\n v-if=\"uploadQueueDialog === queueKey && imageWidgetUploadConfig\"\n :queue-key=\"queueKey\"\n :ext-system=\"imageWidgetUploadConfig.extSystem\"\n :licence-id=\"imageWidgetUploadConfig.licence\"\n :file-input-key=\"uploadQueue?.fileInputKey ?? -1\"\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n @on-apply=\"onAssetUploadConfirm\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport type { IntegerId, IntegerIdNullable } from '@/types/common'\nimport { onMounted, provide, ref, shallowRef } from 'vue'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport type { ImageAware } from '@/types/ImageAware'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport ImageWidgetInner from '@/components/damImage/uploadQueue/components/ImageWidgetInner.vue'\nimport { ImageWidgetUploadConfig } from '@/components/damImage/composables/imageWidgetInkectionKeys'\nimport { isUndefined } from '@/utils/common'\nimport { isImageWidgetUploadConfigAllowed } from '@/components/damImage/composables/damFilterUserAllowedUploadConfigs'\nimport { type CollabComponentConfig, CollabStatus, type CollabStatusType } from '@/components/collab/types/Collab'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerIdNullable\n queueKey: UploadQueueKey\n uploadLicence: IntegerId\n selectLicences: IntegerId[]\n image?: ImageAware | undefined // optional, if available, no need to fetch image data\n configName?: string\n collab?: CollabComponentConfig\n collabStatus?: CollabStatusType\n label?: string | undefined\n readonly?: boolean\n required?: boolean\n dataCy?: string | undefined\n expandOptions?: boolean\n expandMetadata?: boolean\n disableOnClickMenu?: boolean\n width?: number | undefined\n maxWidth?: number | undefined\n height?: number | undefined\n callDeleteApiOnRemove?: boolean\n damWidth?: undefined | number\n damHeight?: undefined | number\n }>(),\n {\n configName: 'default',\n collab: undefined,\n collabStatus: CollabStatus.Inactive,\n label: undefined,\n image: undefined,\n readonly: false,\n required: false,\n lockable: false,\n lockedById: undefined,\n dataCy: undefined,\n expandOptions: false,\n expandMetadata: false,\n disableOnClickMenu: false,\n width: undefined,\n maxWidth: undefined,\n height: undefined,\n callDeleteApiOnRemove: false,\n damWidth: undefined,\n damHeight: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: IntegerIdNullable): void\n (e: 'afterMetadataSaveSuccess'): void\n}>()\n\nconst status = ref<'loading' | 'ready' | 'error' | 'uploadNotAllowed'>('loading')\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { damClient } = useCommonAdminCoreDamOptions(props.configName)\nconst {\n loadDamPrvConfig,\n loadDamConfigAssetCustomFormElements,\n getDamConfigAssetCustomFormElements,\n getOrLoadDamConfigExtSystemByLicence,\n getOrLoadDamConfigExtSystemByLicences,\n} = useDamConfigState(damClient)\n\nconst uploadConfig = shallowRef<DamConfigLicenceExtSystemReturnType | undefined>(undefined)\n\nonMounted(async () => {\n const damConfigStore = useDamConfigStore()\n uploadConfig.value = await getOrLoadDamConfigExtSystemByLicence(props.uploadLicence)\n if (isUndefined(uploadConfig.value)) {\n status.value = 'error'\n return\n }\n if (!isImageWidgetUploadConfigAllowed(uploadConfig.value)) {\n status.value = 'uploadNotAllowed'\n return\n }\n const promises: Promise<any>[] = []\n if (!damConfigStore.initialized.damPrvConfig) {\n promises.push(loadDamPrvConfig())\n }\n promises.push(getOrLoadDamConfigExtSystemByLicences(props.selectLicences))\n const configAssetCustomFormElements = getDamConfigAssetCustomFormElements(uploadConfig.value.extSystem)\n if (isUndefined(configAssetCustomFormElements)) {\n promises.push(loadDamConfigAssetCustomFormElements(uploadConfig.value.extSystem))\n }\n try {\n await Promise.allSettled(promises)\n } catch (e) {\n status.value = 'error'\n }\n if (status.value !== 'error') status.value = 'ready'\n})\n\nprovide(ImageWidgetUploadConfig, uploadConfig)\n\nconst innerComponent = ref<InstanceType<typeof ImageWidgetInner> | null>(null)\n\nconst metadataConfirm = () => {\n innerComponent.value?.metadataConfirm()\n}\n\ndefineExpose({\n metadataConfirm,\n})\n</script>\n\n<template>\n <ImageWidgetInner\n v-if=\"status === 'ready'\"\n ref=\"innerComponent\"\n v-bind=\"props\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @after-metadata-save-success=\"emit('afterMetadataSaveSuccess')\"\n >\n <template #append=\"{ image: appendImage }\">\n <slot\n name=\"append\"\n :image=\"appendImage\"\n />\n </template>\n </ImageWidgetInner>\n <div\n v-else-if=\"status === 'error'\"\n class=\"text-error\"\n >\n Loading DAM config error\n </div>\n <div\n v-else-if=\"status === 'uploadNotAllowed'\"\n class=\"text-error\"\n >\n DAM access rights error\n </div>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n />\n</template>\n\n<style lang=\"scss\">\n$class-name-root: 'a-image-widget';\n\n.#{$class-name-root} {\n &__options {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n &--locked .v-img {\n opacity: 0.6;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport AImageWidgetSimple from '@/components/damImage/AImageWidgetSimple.vue'\nimport { useImageStore } from '@/components/damImage/uploadQueue/composables/imageStore'\nimport { computed } from 'vue'\nimport AFormTextarea from '@/components/form/AFormTextarea.vue'\nimport type { DocId } from '@/types/common'\nimport { isNull, isUndefined } from '@/utils/common'\nimport AActionDeleteButton from '@/components/buttons/action/AActionDeleteButton.vue'\nimport { HANDLE_CLASS } from '@/components/sortable/sortableActions'\nimport { useI18n } from 'vue-i18n'\nimport { useImageValidation } from '@/components/damImage/uploadQueue/composables/uploadValidations'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n disableDraggable: boolean\n }>(),\n {}\n)\n\nconst emit = defineEmits<{\n (e: 'editAsset', data: DocId): void\n (e: 'removeItem', index: number): void\n}>()\n\nconst imageStore = useImageStore()\nconst { t } = useI18n()\n\nconst image = computed(() => imageStore.images[props.index])\n\nconst { v$ } = useImageValidation(image)\n\nconst onEditAsset = () => {\n if (isNull(image.value) || isUndefined(image.value)) return\n emit('editAsset', image.value.dam.damId)\n}\n\nconst removeItem = () => {\n emit('removeItem', props.index)\n}\n</script>\n\n<template>\n <div class=\"asset-list-tiles__item\">\n <div class=\"asset-list-tiles__item-card\">\n <div class=\"ma-2\">\n <div class=\"d-flex justify-md-space-between align-center\">\n <VIcon\n :class=\"{\n [HANDLE_CLASS]: true,\n [HANDLE_CLASS + '--disabled']: disableDraggable,\n }\"\n icon=\"mdi-drag\"\n />\n </div>\n <AImageWidgetSimple\n :model-value=\"image.id\"\n :image=\"image\"\n />\n <VRow dense>\n <VCol class=\"d-flex justify-space-between mt-1\">\n <VBtn\n variant=\"text\"\n size=\"small\"\n class=\"mb-2\"\n @click.stop=\"onEditAsset\"\n >\n {{ t('common.damImage.queueItem.edit') }}\n </VBtn>\n <AActionDeleteButton\n variant=\"icon\"\n :size=\"30\"\n button-class=\"\"\n @delete-record=\"removeItem\"\n />\n </VCol>\n </VRow>\n <VRow dense>\n <VCol>\n <AFormTextarea\n v-model=\"image.texts.description\"\n :label=\"t('common.damImage.image.model.texts.description')\"\n :help=\"t('common.damImage.image.help.texts.description')\"\n />\n </VCol>\n </VRow>\n <VRow dense>\n <VCol>\n <AFormTextarea\n v-model=\"image.texts.source\"\n :label=\"t('common.damImage.image.model.texts.source')\"\n :v=\"v$.image.texts.source\"\n />\n </VCol>\n </VRow>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.asset-list-tiles--thumbnail.a-sortable-widget__group .asset-list-tiles__item img:not(.img-svg) {\n padding: 0;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { type AssetCustomData, DamAssetStatusDefault } from '@/types/coreDam/Asset'\nimport type { DocId, IntegerId } from '@/types/common'\nimport {\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n type UploadQueueKey,\n} from '@/types/coreDam/UploadQueue'\nimport { AssetFileFailReason } from '@/types/coreDam/AssetFile'\nimport ATableCopyIdButton from '@/components/buttons/table/ATableCopyIdButton.vue'\nimport { prettyBytes } from '@/utils/file'\nimport ASystemEntityScope from '@/components/form/ASystemEntityScope.vue'\nimport AssetCustomMetadataForm from '@/components/damImage/uploadQueue/components/AssetCustomMetadataForm.vue'\nimport AssetImage from '@/components/damImage/uploadQueue/components/AssetImage.vue'\nimport AssetFileFailReasonChip from '@/components/damImage/uploadQueue/components/AssetFileFailReasonChip.vue'\nimport AuthorRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteWithCached.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport KeywordRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteWithCached.vue'\nimport { isNull } from '@/utils/common'\nimport { useDamKeywordAssetTypeConfig } from '@/components/damImage/uploadQueue/keyword/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/components/damImage/uploadQueue/author/damAuthorConfig'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n queueKey: string\n extSystem: IntegerId\n customData: AssetCustomData\n keywords: DocId[]\n authors: DocId[]\n item: UploadQueueItem\n mainFileSingleUse: boolean | null\n disableDoneAnimation?: boolean\n }>(),\n {\n disableDoneAnimation: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:customData', data: AssetCustomData): void\n (e: 'update:keywords', data: DocId[]): void\n (e: 'update:authors', data: DocId[]): void\n (e: 'update:mainFileSingleUse', data: boolean | null): void\n (e: 'cancelItem', data: { index: number; item: UploadQueueItem; queueKey: UploadQueueKey }): void\n (e: 'removeItem', index: number): void\n (e: 'showDetail', data: DocId): void\n}>()\n\nconst IMAGE_ASPECT_RATIO = 16 / 9\n\nconst customData = computed({\n get() {\n return props.customData\n },\n set(newValue) {\n emit('update:customData', { ...props.customData, ...newValue })\n },\n})\n\nconst keywords = computed({\n get() {\n return props.keywords\n },\n set(newValue) {\n emit('update:keywords', [...newValue])\n },\n})\n\nconst authors = computed({\n get() {\n return props.authors\n },\n set(newValue) {\n emit('update:authors', [...newValue])\n },\n})\n\nconst mainFileSingleUse = computed({\n get() {\n return props.mainFileSingleUse\n },\n set(newValue) {\n emit('update:mainFileSingleUse', newValue)\n },\n})\n\nconst { t } = useI18n()\n\nconst processingStatuses: readonly UploadQueueItemStatusType[] = [\n UploadQueueItemStatus.Processing,\n UploadQueueItemStatus.Loading,\n]\nconst processing = computed(() => {\n return processingStatuses.includes(props.item.status)\n})\nconst waiting = computed(() => {\n return props.item.status === UploadQueueItemStatus.Waiting\n})\nconst done = computed(() => {\n return !props.disableDoneAnimation && props.item.status === UploadQueueItemStatus.Uploaded\n})\nconst uploading = computed(() => {\n return props.item.status === UploadQueueItemStatus.Uploading\n})\nconst uploadProgress = computed(() => {\n return props.item.progress.progressPercent\n})\n\nconst imageSrc = computed(() => {\n return props.item.imagePreview ? props.item.imagePreview.url : undefined\n})\nconst assetType = computed(() => {\n return props.item.assetType\n})\nconst status = computed(() => {\n if (!props.item) return DamAssetStatusDefault\n return props.item.assetStatus\n})\n\nconst cancelItem = () => {\n emit('cancelItem', { index: props.index, item: props.item, queueKey: props.queueKey })\n}\n\nconst showCancelStatuses: readonly UploadQueueItemStatusType[] = [\n UploadQueueItemStatus.Loading,\n UploadQueueItemStatus.Waiting,\n UploadQueueItemStatus.Uploading,\n]\nconst showCancel = computed(() => {\n return showCancelStatuses.includes(props.item.status)\n})\n\nconst showDetail = async () => {\n if (isNull(props.item.assetId)) return\n emit('showDetail', props.item.assetId)\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss,vue/no-ref-object-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(assetType.value, props.extSystem)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss,vue/no-ref-object-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(assetType.value, props.extSystem)\n</script>\n\n<template>\n <VCol\n xxl=\"2\"\n xl=\"3\"\n md=\"4\"\n sm=\"6\"\n cols=\"12\"\n >\n <div class=\"dam-upload-queue__item\">\n <div class=\"dam-upload-queue__item-card\">\n <div class=\"position-relative\">\n <AssetImage\n :asset-type=\"assetType\"\n :asset-status=\"status\"\n :src=\"imageSrc\"\n background-color=\"#ccc\"\n :show-uploading=\"uploading\"\n :show-processing=\"processing\"\n :show-waiting=\"waiting\"\n :show-done=\"done\"\n :uploading-progress=\"uploadProgress\"\n :remaining-time=\"item.progress.remainingTime\"\n use-component\n cover\n :aspect-ratio=\"IMAGE_ASPECT_RATIO\"\n />\n <div\n v-if=\"item.error.hasError\"\n :class=\"\n 'dam-upload-queue__overlay dam-upload-queue__overlay--error ' +\n 'd-flex align-center justify-center flex-column'\n \"\n >\n <VIcon\n icon=\"mdi-alert\"\n class=\"ma-1\"\n size=\"x-small\"\n color=\"error\"\n />\n <div class=\"text-error\">\n {{ t('common.damImage.queueItem.error') }}\n </div>\n <div\n v-if=\"item.error.message.length\"\n class=\"text-caption\"\n v-text=\"item.error.message\"\n />\n <div v-else-if=\"item.error.assetFileFailReason !== AssetFileFailReason.None\">\n <AssetFileFailReasonChip :reason=\"item.error.assetFileFailReason\" />\n </div>\n <div\n v-else\n class=\"text-caption\"\n >\n {{ t('common.damImage.uploadErrors.unknownError') }}\n </div>\n </div>\n </div>\n <VRow\n dense\n class=\"my-2\"\n >\n <VCol>\n <div class=\"w-100 d-flex justify-space-between align-center\">\n <div>\n <VBtn\n size=\"small\"\n variant=\"text\"\n :disabled=\"!item.canEditMetadata\"\n @click.stop=\"showDetail\"\n >\n {{ t('common.damImage.queueItem.edit') }}\n </VBtn>\n </div>\n <div>\n <div v-if=\"item.isDuplicate\" />\n <ATableCopyIdButton\n v-if=\"item.assetId\"\n :id=\"item.assetId\"\n button-t=\"common.damImage.queueItem.copyAssetId\"\n size=\"small\"\n />\n <VBtn\n v-if=\"showCancel\"\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"cancelItem\"\n >\n <VIcon icon=\"mdi-close-circle-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.cancel') }}\n </VTooltip>\n </VBtn>\n <!-- <AActionDeleteButton-->\n <!-- variant=\"icon\"-->\n <!-- :disabled=\"!item.canEditMetadata && !item.isDuplicate\"-->\n <!-- button-class=\"\"-->\n <!-- @delete-record=\"remove\"-->\n <!-- />-->\n </div>\n </div>\n </VCol>\n </VRow>\n <VRow\n v-if=\"item.displayTitle\"\n dense\n class=\"my-2 mb-3 mt-0 text-caption\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.queueItem.displayTitle') }}: {{ item.displayTitle }}\n <span v-if=\"item.file?.size\">&nbsp;({{ prettyBytes(item.file.size) }})</span>\n </VCol>\n </VRow>\n <VRow\n v-if=\"item.isDuplicate\"\n class=\"text-caption text-warning\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.asset.detail.info.status.duplicate') }}\n </VCol>\n </VRow>\n <VForm :disabled=\"!item.canEditMetadata\">\n <AssetCustomMetadataForm\n v-if=\"item\"\n v-model=\"customData\"\n :ext-system=\"extSystem\"\n :asset-type=\"assetType\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <KeywordRemoteAutocompleteWithCached\n v-model=\"keywords\"\n :queue-id=\"queueKey\"\n :ext-system=\"extSystem\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n clearable\n multiple\n :required=\"keywordRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n :disabled=\"!item.canEditMetadata\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"authorEnabled\"\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <AuthorRemoteAutocompleteWithCached\n v-model=\"authors\"\n :queue-id=\"queueKey\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :author-conflicts=\"item.authorConflicts\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :required=\"authorRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n :disabled=\"!item.canEditMetadata\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n dense\n class=\"my-2\"\n >\n <VCol>\n <VSwitch\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n v-model=\"mainFileSingleUse\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VForm>\n </div>\n </div>\n </VCol>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport ACustomDataFormElement from '@/components/customDataForm/ACustomDataFormElement.vue'\nimport { isUndefined } from '@/utils/common'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n assetType: DamAssetTypeType\n extSystem: IntegerId\n modelValue: { [key: string]: any }\n }>(),\n {}\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'fillEmptyField', data: { assetType: DamAssetTypeType; elementProperty: string; value: any }): void\n (e: 'replaceField', data: { assetType: DamAssetTypeType; elementProperty: string; value: any }): void\n}>()\n\nconst { t } = useI18n()\n\nconst updateModelValue = (data: { property: string; value: any }) => {\n const updated = {} as { [key: string]: any }\n updated[data.property] = data.value\n emit('update:modelValue', { ...props.modelValue, ...updated })\n}\n\nconst fillEmptyField = (elementProperty: string, value: any) => {\n emit('fillEmptyField', { assetType: props.assetType, elementProperty, value })\n}\nconst replaceField = (elementProperty: string, value: any) => {\n emit('replaceField', { assetType: props.assetType, elementProperty, value })\n}\n\nconst { getDamConfigAssetCustomFormElements } = useDamConfigState()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst configAssetCustomFormElements = getDamConfigAssetCustomFormElements(props.extSystem)\nif (isUndefined(configAssetCustomFormElements)) {\n throw new Error('Custom form elements must be initialised.')\n}\n\nconst elements = computed(() => {\n return configAssetCustomFormElements[props.assetType]\n})\n</script>\n\n<template>\n <div class=\"w-100\">\n <VRow\n v-for=\"element in elements\"\n :key=\"element.id\"\n dense\n class=\"mt-1\"\n >\n <VCol>\n <div v-if=\"element.attributes.readonly\" />\n <div\n v-else\n class=\"d-flex\"\n >\n <ACustomDataFormElement\n :config=\"element\"\n :model-value=\"modelValue[element.property]\"\n @update:model-value=\"updateModelValue\"\n />\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n class=\"mr-1\"\n @click.stop=\"fillEmptyField(element.property, modelValue[element.property])\"\n >\n <VIcon icon=\"mdi-file-arrow-left-right-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.fillOneEmpty') }}\n </VTooltip>\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"replaceField(element.property, modelValue[element.property])\"\n >\n <VIcon icon=\"mdi-file-replace-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.replaceOne') }}\n </VTooltip>\n </VBtn>\n </div>\n </VCol>\n </VRow>\n </div>\n</template>\n","import type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { DamAssetTypeType } from '@/types/coreDam/Asset'\nimport { isUndefined } from '@/utils/common'\n\nexport function useUploadQueueMassOperations(queueKey: UploadQueueKey) {\n const uploadQueuesStore = useUploadQueuesStore()\n\n const replaceEmptyCustomDataValue = (\n data: { assetType: DamAssetTypeType; elementProperty: string; value: any },\n forceReplace = false\n ) => {\n const items = uploadQueuesStore.getQueueItems(queueKey)\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item.assetType !== data.assetType) continue\n if (\n forceReplace ||\n isUndefined(item.customData[data.elementProperty]) ||\n item.customData[data.elementProperty] === ''\n ) {\n item.customData[data.elementProperty] = data.value\n }\n }\n }\n\n const replaceEmptyKeywords = (value: any, forceReplace = false) => {\n const items = uploadQueuesStore.getQueueItems(queueKey)\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (forceReplace || isUndefined(item.keywords) || item.keywords.length === 0) {\n item.keywords = value\n }\n }\n }\n\n const replaceEmptyAuthors = (value: any, forceReplace = false) => {\n const items = uploadQueuesStore.getQueueItems(queueKey)\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (forceReplace || isUndefined(item.authors) || item.authors.length === 0) {\n item.authors = value\n }\n }\n }\n\n return {\n replaceEmptyCustomDataValue,\n replaceEmptyKeywords,\n replaceEmptyAuthors,\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport { DamAssetType, type DamAssetTypeType } from '@/types/coreDam/Asset'\nimport ASystemEntityScope from '@/components/form/ASystemEntityScope.vue'\nimport AssetCustomMetadataFormMassOperations from '@/components/damImage/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue'\nimport AuthorRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/author/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/components/damImage/uploadQueue/keyword/KeywordRemoteAutocompleteWithCached.vue'\nimport { useUploadQueueMassOperations } from '@/components/damImage/uploadQueue/composables/uploadQueueMassOperations'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: string\n extSystem: IntegerId\n }>(),\n {}\n)\n\nconst massOperationsData = ref({ image: {}, video: {}, audio: {}, document: {} })\nconst massOperationsKeywords = ref([])\nconst massOperationsAuthors = ref([])\n\nconst { t } = useI18n()\n\nconst panels = ref<Array<string>>(['general'])\n\nconst uploadQueuesStore = useUploadQueuesStore()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { replaceEmptyCustomDataValue, replaceEmptyAuthors, replaceEmptyKeywords } = useUploadQueueMassOperations(\n props.queueKey\n)\n\nconst fillEmptyField = (data: { assetType: DamAssetTypeType; elementProperty: string; value: any }) => {\n replaceEmptyCustomDataValue(data)\n}\nconst replaceField = (data: { assetType: DamAssetTypeType; elementProperty: string; value: any }) => {\n replaceEmptyCustomDataValue(data, true)\n}\nconst fillEmptyKeywords = () => {\n replaceEmptyKeywords(massOperationsKeywords.value)\n}\nconst replaceKeywords = () => {\n replaceEmptyKeywords(massOperationsKeywords.value, true)\n}\nconst fillEmptyAuthors = () => {\n replaceEmptyAuthors(massOperationsAuthors.value)\n}\nconst replaceAuthors = () => {\n replaceEmptyAuthors(massOperationsAuthors.value, true)\n}\nconst fillAll = (forceReplace = false) => {\n for (const [elementProperty, value] of Object.entries(massOperationsData.value.image)) {\n replaceEmptyCustomDataValue(\n {\n assetType: DamAssetType.Image,\n elementProperty,\n value,\n },\n forceReplace\n )\n }\n for (const [elementProperty, value] of Object.entries(massOperationsData.value.video)) {\n replaceEmptyCustomDataValue(\n {\n assetType: DamAssetType.Video,\n elementProperty,\n value,\n },\n forceReplace\n )\n }\n for (const [elementProperty, value] of Object.entries(massOperationsData.value.audio)) {\n replaceEmptyCustomDataValue(\n {\n assetType: DamAssetType.Audio,\n elementProperty,\n value,\n },\n forceReplace\n )\n }\n for (const [elementProperty, value] of Object.entries(massOperationsData.value.document)) {\n replaceEmptyCustomDataValue(\n {\n assetType: DamAssetType.Document,\n elementProperty,\n value,\n },\n forceReplace\n )\n }\n if (forceReplace) {\n replaceAuthors()\n replaceKeywords()\n return\n }\n fillEmptyAuthors()\n fillEmptyKeywords()\n}\nconst clearForm = () => {\n massOperationsData.value = { image: {}, video: {}, audio: {}, document: {} }\n massOperationsAuthors.value = []\n massOperationsKeywords.value = []\n}\n\nconst assetTypes = computed(() => {\n return uploadQueuesStore.getQueueItemsTypes(props.queueKey)\n})\n\nonMounted(() => {\n if (assetTypes.value[0]) {\n panels.value.push(assetTypes.value[0])\n }\n})\n</script>\n\n<template>\n <div class=\"sidebar-info d-flex w-100 h-100 flex-column\">\n <div class=\"w-100 d-flex flex-column\">\n <VTabs class=\"sidebar-info__tabs\">\n <VTab>{{ t('common.damImage.asset.massOperations.title') }}</VTab>\n </VTabs>\n <div class=\"sidebar-info__content\">\n <div class=\"text-caption pa-3\">\n {{ t('common.damImage.asset.massOperations.description') }}\n </div>\n <VExpansionPanels\n v-model=\"panels\"\n multiple\n class=\"v-expansion-panels--compact\"\n >\n <VExpansionPanel\n elevation=\"0\"\n :title=\"t('common.damImage.asset.massOperations.general')\"\n value=\"general\"\n >\n <VExpansionPanelText>\n <VRow\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <div class=\"d-flex\">\n <div style=\"min-width: 286px\">\n <KeywordRemoteAutocompleteWithCached\n v-model=\"massOperationsKeywords\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n clearable\n :ext-system=\"extSystem\"\n multiple\n :validation-scope=\"false\"\n />\n </div>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n class=\"mr-1\"\n @click.stop=\"fillEmptyKeywords\"\n >\n <VIcon icon=\"mdi-file-arrow-left-right-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.fillOneEmpty') }}\n </VTooltip>\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"replaceKeywords\"\n >\n <VIcon icon=\"mdi-file-replace-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.replaceOne') }}\n </VTooltip>\n </VBtn>\n </div>\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n dense\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <div class=\"d-flex\">\n <div style=\"min-width: 286px\">\n <AuthorRemoteAutocompleteWithCached\n v-model=\"massOperationsAuthors\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :validation-scope=\"false\"\n />\n </div>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n class=\"mr-1\"\n @click.stop=\"fillEmptyAuthors\"\n >\n <VIcon icon=\"mdi-file-arrow-left-right-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.fillOneEmpty') }}\n </VTooltip>\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"replaceAuthors\"\n >\n <VIcon icon=\"mdi-file-replace-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.replaceOne') }}\n </VTooltip>\n </VBtn>\n </div>\n </ASystemEntityScope>\n </VCol>\n </VRow>\n </VExpansionPanelText>\n </VExpansionPanel>\n <VExpansionPanel\n v-if=\"assetTypes.includes(DamAssetType.Image)\"\n elevation=\"0\"\n :title=\"t('common.damImage.asset.assetType.image')\"\n :value=\"DamAssetType.Image\"\n >\n <VExpansionPanelText>\n <AssetCustomMetadataFormMassOperations\n v-model=\"massOperationsData.image\"\n :asset-type=\"DamAssetType.Image\"\n :ext-system=\"extSystem\"\n @fill-empty-field=\"fillEmptyField\"\n @replace-field=\"replaceField\"\n />\n </VExpansionPanelText>\n </VExpansionPanel>\n </VExpansionPanels>\n </div>\n <div class=\"sidebar-info__actions pa-2 d-flex align-center justify-center\">\n <VBtn\n class=\"mr-2\"\n variant=\"text\"\n size=\"small\"\n @click.stop=\"fillAll(false)\"\n >\n {{ t('common.damImage.asset.massOperations.fillAllEmpty') }}\n </VBtn>\n <VBtn\n class=\"mr-2\"\n variant=\"text\"\n size=\"small\"\n @click.stop=\"fillAll(true)\"\n >\n {{ t('common.damImage.asset.massOperations.replaceAll') }}\n </VBtn>\n <VBtn\n variant=\"text\"\n size=\"small\"\n @click.stop=\"clearForm\"\n >\n {{ t('common.damImage.asset.massOperations.clearForm') }}\n </VBtn>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted } from 'vue'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { UploadQueueItem, UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport UploadQueueItemEditable from '@/components/damImage/uploadQueue/components/UploadQueueItemEditable.vue'\nimport AssetQueueSelectedSidebar from '@/components/damImage/uploadQueue/components/AssetQueueSelectedSidebar.vue'\nimport { useDamCachedKeywords } from '@/components/damImage/uploadQueue/keyword/cachedKeywords'\nimport { useDamCachedAuthors } from '@/components/damImage/uploadQueue/author/cachedAuthors'\nimport type { DocId, IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: string\n extSystem: IntegerId\n massOperations: boolean\n disableDoneAnimation?: boolean\n }>(),\n {\n disableDoneAnimation: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'showDetail', data: DocId): void\n}>()\n\nconst uploadQueuesStore = useUploadQueuesStore()\n\nconst list = computed(() => {\n return uploadQueuesStore.getQueueItems(props.queueKey)\n})\n\nconst cancelItem = (data: { index: number; item: UploadQueueItem; queueKey: UploadQueueKey }) => {\n uploadQueuesStore.stopItemUpload(data.queueKey, data.item, data.index)\n}\n\nconst removeItem = (index: number) => {\n uploadQueuesStore.removeByIndex(props.queueKey, index)\n}\n\nconst { addToCachedKeywords, fetchCachedKeywords } = useDamCachedKeywords()\nconst { addToCachedAuthors, fetchCachedAuthors } = useDamCachedAuthors()\n\nonMounted(() => {\n list.value.forEach((item) => {\n addToCachedKeywords(item.keywords)\n addToCachedAuthors(item.authors)\n })\n fetchCachedKeywords()\n fetchCachedAuthors()\n})\n</script>\n\n<template>\n <div\n class=\"asset-queue-editable\"\n :class=\"{ 'asset-queue-editable--sidebar-active': massOperations }\"\n >\n <div class=\"asset-queue-editable__left\">\n <div class=\"overflow-y-auto overflow-x-hidden h-100\">\n <VRow class=\"dam-upload-queue dam-upload-queue--editable pa-2 mb-5\">\n <UploadQueueItemEditable\n v-for=\"(item, index) in list\"\n :key=\"item.key\"\n v-model:custom-data=\"item.customData\"\n v-model:keywords=\"item.keywords\"\n v-model:authors=\"item.authors\"\n v-model:main-file-single-use=\"item.mainFileSingleUse\"\n :ext-system=\"extSystem\"\n :item=\"item\"\n :index=\"index\"\n :queue-key=\"queueKey\"\n :disable-done-animation=\"disableDoneAnimation\"\n @cancel-item=\"cancelItem\"\n @remove-item=\"removeItem\"\n @show-detail=\"emit('showDetail', $event)\"\n />\n </VRow>\n </div>\n </div>\n <div\n v-if=\"list.length > 0\"\n class=\"asset-queue-editable__sidebar system-border-l\"\n >\n <AssetQueueSelectedSidebar\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useUploadQueueDialog } from '@/components/damImage/uploadQueue/composables/uploadQueueDialog'\nimport { useI18n } from 'vue-i18n'\nimport UploadQueueEditable from '@/components/damImage/uploadQueue/components/UploadQueueEditable.vue'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport { computed, ref, toRaw } from 'vue'\nimport { useTheme } from '@/composables/themeSettings'\nimport UploadQueueButtonStop from '@/components/damImage/uploadQueue/components/UploadQueueButtonStop.vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useAlerts } from '@/composables/system/alerts'\nimport {\n type AssetMetadataBulkItem,\n bulkUpdateAssetsMetadata,\n fetchAsset,\n} from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport AFileInput from '@/components/file/AFileInput.vue'\nimport AImageDropzone from '@/components/file/AFileDropzone.vue'\nimport type { ImageCreateUpdateAware } from '@/types/ImageAware'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { isNull, isString, isUndefined } from '@/utils/common'\nimport { fetchAuthorListByIds } from '@/components/damImage/uploadQueue/api/authorApi'\nimport { generateUUIDv1 } from '@/utils/generator'\nimport type { UploadQueueItem } from '@/types/coreDam/UploadQueue'\nimport { useImageStore } from '@/components/damImage/uploadQueue/composables/imageStore'\nimport { storeToRefs } from 'pinia'\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: string\n licenceId: IntegerId\n fileInputKey: number\n extSystem: IntegerId\n accept: string | undefined\n maxSizes: Record<string, number> | undefined\n }>(),\n {}\n)\n\nconst emit = defineEmits<{\n (e: 'onDrop', files: File[]): void\n (e: 'onFilesInput', files: File[]): void\n (e: 'onApply', items: ImageCreateUpdateAware[]): void\n}>()\n\nconst { uploadQueueDialog, uploadQueueSidebar, toggleUploadQueueSidebar } = useUploadQueueDialog()\n\nconst imageStore = useImageStore()\nconst { maxPosition } = storeToRefs(imageStore)\nconst uploadQueuesStore = useUploadQueuesStore()\nconst queueTotalCount = computed(() => {\n return uploadQueuesStore.getQueueTotalCount(props.queueKey)\n})\n\nconst items = computed(() => {\n return uploadQueuesStore.getQueueItems(props.queueKey)\n})\n\nconst queueProcessedCount = computed(() => {\n return uploadQueuesStore.getQueueProcessedCount(props.queueKey)\n})\n\nconst isUploading = computed(() => {\n return queueTotalCount.value > queueProcessedCount.value\n})\n\nconst isFinished = computed(() => {\n return queueTotalCount.value === queueProcessedCount.value\n})\n\nconst { t } = useI18n()\nconst { toolbarColor } = useTheme()\nconst v$ = useVuelidate({ $stopPropagation: true })\nconst { showRecordWas, showValidationError, showErrorsDefault } = useAlerts()\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst saveButtonLoading = ref(false)\nconst saveAndCloseButtonLoading = ref(false)\n\nconst onStopConfirm = async () => {\n uploadQueuesStore.stopUpload(props.queueKey)\n uploadQueueDialog.value = null\n}\n\nconst onSave = async () => {\n const itemsRaw = toRaw(items.value)\n if (itemsRaw.length === 0) return\n saveButtonLoading.value = true\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n saveButtonLoading.value = false\n return\n }\n try {\n await bulkUpdateAssetsMetadata(damClient, itemsRaw)\n showRecordWas('updated')\n } catch (error) {\n console.error(error)\n showErrorsDefault(error)\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst metadataMap = async (queueItems: UploadQueueItem[], bulkItems: AssetMetadataBulkItem[]) => {\n const assetMetadataMap = new Map<DocId, { description: string; authorIds: DocId[] }>()\n const authorIdsToFetch = new Set<DocId>()\n const authorsMap = new Map<DocId, string>()\n try {\n bulkItems.forEach((bulkItem) => {\n assetMetadataMap.set(bulkItem.id, {\n description: isString(bulkItem.customData?.description) ? bulkItem.customData.description.trim() : '',\n authorIds: bulkItem.authors,\n })\n })\n assetMetadataMap.forEach((assetMeta) => {\n assetMeta.authorIds.forEach((authorId) => {\n authorIdsToFetch.add(authorId)\n })\n })\n if (authorIdsToFetch.size > 0) {\n const authorsRes = await fetchAuthorListByIds(damClient, props.extSystem, [...authorIdsToFetch])\n authorsRes.forEach((author) => {\n authorsMap.set(author.id, author.name)\n })\n }\n } catch (e) {\n showErrorsDefault(e)\n }\n\n const queueItemsWithAssetId = queueItems.filter(\n (queueItem) => !isNull(queueItem.assetId) && !isNull(queueItem.fileId)\n )\n\n return queueItemsWithAssetId.map((queueItem) => {\n maxPosition.value++\n const description = assetMetadataMap.get(queueItem.assetId!)?.description\n const authorNames: string[] = []\n assetMetadataMap.get(queueItem.assetId!)?.authorIds.forEach((authorId) => {\n const name = authorsMap.get(authorId)\n if (!isUndefined(name) && name.trim().length > 0) {\n authorNames.push(name)\n }\n })\n return {\n key: generateUUIDv1(),\n texts: {\n description: description ?? '',\n source: authorNames.join(', '),\n },\n dam: {\n damId: queueItem.fileId as DocId,\n regionPosition: 0,\n licenceId: props.licenceId,\n },\n position: maxPosition.value,\n }\n })\n}\n\nconst onSaveAndApply = async () => {\n const itemsRaw = toRaw(items.value)\n if (itemsRaw.length === 0) return\n saveAndCloseButtonLoading.value = true\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n saveAndCloseButtonLoading.value = false\n return\n }\n try {\n const res = await bulkUpdateAssetsMetadata(damClient, itemsRaw)\n const mapped = await metadataMap(itemsRaw, res)\n emit('onApply', mapped)\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n saveAndCloseButtonLoading.value = false\n }\n}\n\nconst assetDetailStore = useAssetDetailStore()\nconst { loading, dialog, updateUploadStore } = storeToRefs(assetDetailStore)\n\nconst showDetail = async (id: DocId) => {\n try {\n assetDetailStore.setAsset(null)\n loading.value = true\n dialog.value = props.queueKey\n updateUploadStore.value = true\n assetDetailStore.setAsset(await fetchAsset(damClient, id))\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n}\n</script>\n\n<template>\n <VDialog\n :model-value=\"true\"\n fullscreen\n class=\"overlay--sidebar\"\n >\n <VCard>\n <div class=\"asset-footer__upload asset-footer--full asset-footer__upload--full pa-0\">\n <div class=\"d-flex w-100 h-100 flex-column\">\n <VToolbar\n class=\"w-100 system-border-b pr-1\"\n :color=\"toolbarColor\"\n density=\"compact\"\n :height=\"64\"\n >\n <div class=\"d-flex align-center px-2\">\n <div>\n <div\n v-if=\"isUploading\"\n class=\"text-subtitle-2 d-flex align-center\"\n >\n {{ t('common.damImage.upload.title') }}\n </div>\n <div\n v-else\n class=\"text-subtitle-2 d-flex align-center text-green-darken-3 font-weight-bold\"\n >\n {{ t('common.damImage.upload.titleDone') }}\n </div>\n </div>\n </div>\n <VSpacer />\n <div\n v-if=\"isUploading\"\n class=\"text-caption d-flex align-center\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"16\"\n width=\"2\"\n class=\"mr-1\"\n />\n <div>{{ t('common.damImage.upload.uploading') }} {{ queueProcessedCount + 1 }}/{{ queueTotalCount }}</div>\n </div>\n <div class=\"d-flex align-center pr-3\">\n <VDivider\n v-show=\"isUploading\"\n vertical\n class=\"mx-4 my-2\"\n />\n <ABtnPrimary\n v-if=\"isFinished\"\n :height=\"36\"\n class=\"mr-2\"\n rounded=\"pill\"\n :loading=\"saveAndCloseButtonLoading\"\n :disabled=\"saveButtonLoading\"\n @click.stop=\"onSaveAndApply\"\n >\n {{ t('common.damImage.upload.saveAndApply') }}\n </ABtnPrimary>\n <VBtn\n variant=\"text\"\n :height=\"36\"\n :width=\"36\"\n class=\"mr-2\"\n icon\n :loading=\"saveButtonLoading\"\n :disabled=\"saveAndCloseButtonLoading\"\n @click.stop=\"onSave\"\n >\n <VIcon icon=\"mdi-content-save\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.upload.save') }}\n </VTooltip>\n </VBtn>\n <AFileInput\n :file-input-key=\"fileInputKey\"\n :accept=\"accept\"\n :max-sizes=\"maxSizes\"\n multiple\n @files-input=\"emit('onFilesInput', $event)\"\n >\n <template #activator=\"{ props: fileInputProps }\">\n <VBtn\n tabindex=\"-1\"\n icon\n variant=\"text\"\n :height=\"34\"\n :width=\"34\"\n v-bind=\"fileInputProps\"\n >\n <VIcon icon=\"mdi-plus\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.upload.add') }}\n </VTooltip>\n </VBtn>\n </template>\n </AFileInput>\n <VDivider\n vertical\n class=\"mx-4 my-2\"\n />\n <VBtn\n :height=\"36\"\n :width=\"36\"\n :active=\"uploadQueueSidebar\"\n :variant=\"uploadQueueSidebar ? 'flat' : 'text'\"\n :color=\"uploadQueueSidebar ? 'secondary' : ''\"\n class=\"mr-2\"\n icon\n @click.stop=\"toggleUploadQueueSidebar\"\n >\n <VIcon icon=\"mdi-tag-text-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.damImage.asset.massOperations.title') }}\n </VTooltip>\n </VBtn>\n <UploadQueueButtonStop\n data-cy=\"button-close\"\n :button-size=\"36\"\n :is-uploading=\"isUploading\"\n @confirm=\"onStopConfirm\"\n />\n </div>\n </VToolbar>\n <UploadQueueEditable\n :queue-key=\"queueKey\"\n :ext-system=\"extSystem\"\n :mass-operations=\"uploadQueueSidebar\"\n @show-detail=\"showDetail\"\n />\n </div>\n <AImageDropzone\n variant=\"fill\"\n transparent\n hover-only\n :accept=\"accept\"\n :max-sizes=\"maxSizes\"\n @on-drop=\"emit('onDrop', $event)\"\n />\n </div>\n </VCard>\n </VDialog>\n</template>\n","<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { computed, inject, ref, type ShallowRef } from 'vue'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { isUndefined } from '@/utils/common'\nimport { ImageWidgetUploadConfig } from '@/components/damImage/composables/imageWidgetInkectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n queueKey: UploadQueueKey\n }>(),\n {}\n)\n\nconst emit = defineEmits<{\n (e: 'afterAdd'): void\n}>()\n\nconst MAX_UPLOAD_ITEMS = 50\nconst dialog = ref(false)\nconst uploadDialogLoader = ref(false)\nconst fileCache = ref<File[]>([])\n\nconst { t } = useI18n()\n\nconst imageWidgetUploadConfig = inject<ShallowRef<DamConfigLicenceExtSystemReturnType | undefined> | undefined>(\n ImageWidgetUploadConfig,\n undefined\n)\n\nif (isUndefined(imageWidgetUploadConfig) || isUndefined(imageWidgetUploadConfig.value)) {\n throw new Error(\"Fatal error, parent component doesn't provide necessary config ext system config.\")\n}\n\nconst uploadQueuesStore = useUploadQueuesStore()\n\nconst uploadQueueTotalCount = computed(() => {\n return uploadQueuesStore.getQueueTotalCount(props.queueKey)\n})\n\nconst alreadyAtUploadLimit = computed(() => {\n return uploadQueueTotalCount.value === MAX_UPLOAD_ITEMS\n})\n\nconst openDialog = () => {\n dialog.value = true\n}\n\nconst onDialogConfirm = async () => {\n if (isUndefined(imageWidgetUploadConfig) || isUndefined(imageWidgetUploadConfig.value)) {\n return\n }\n uploadDialogLoader.value = true\n const files = fileCache.value.slice(0, MAX_UPLOAD_ITEMS - uploadQueueTotalCount.value)\n await uploadQueuesStore.addByFiles(\n props.queueKey,\n imageWidgetUploadConfig.value.extSystem,\n imageWidgetUploadConfig.value.licence,\n files\n )\n fileCache.value = []\n uploadDialogLoader.value = false\n dialog.value = false\n emit('afterAdd')\n}\n\nconst onDialogCancel = () => {\n fileCache.value = []\n uploadQueuesStore.forceReloadFileInput(props.queueKey)\n dialog.value = false\n}\n\nconst checkForLimit = (files: File[]) => {\n fileCache.value = files\n if (files.length + uploadQueueTotalCount.value > MAX_UPLOAD_ITEMS) {\n openDialog()\n return\n }\n onDialogConfirm()\n}\n\ndefineExpose({\n check: checkForLimit,\n})\n</script>\n\n<template>\n <VDialog\n v-model=\"dialog\"\n :width=\"500\"\n >\n <VCard\n v-if=\"dialog\"\n data-cy=\"delete-panel\"\n >\n <ADialogToolbar @on-cancel=\"onDialogCancel\">\n {{ t('common.damImage.upload.limits.uploadWarning') }}\n </ADialogToolbar>\n <VCardText>\n <p v-if=\"alreadyAtUploadLimit\">\n {{ t('common.damImage.upload.limits.onUploadLimit', { limit: MAX_UPLOAD_ITEMS }) }}\n </p>\n <p v-else>\n {{ t('common.damImage.upload.limits.addingOverLimit', { count: fileCache.length }) }}\n <span v-if=\"uploadQueueTotalCount > 0\">{{\n t('common.damImage.upload.limits.countAlreadyInProgress', { count: uploadQueueTotalCount })\n }}</span>\n {{ t('common.damImage.upload.limits.onlyAllowedAtOnce', { count: MAX_UPLOAD_ITEMS }) }}<br><br>\n {{\n t('common.damImage.upload.limits.cancelOrUploadFirst', { count: MAX_UPLOAD_ITEMS - uploadQueueTotalCount })\n }}\n </p>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary @click.stop=\"onDialogCancel\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!alreadyAtUploadLimit\"\n :loading=\"uploadDialogLoader\"\n @click.stop=\"onDialogConfirm\"\n >\n {{\n t('common.damImage.upload.limits.actionAddFirstItems', { count: MAX_UPLOAD_ITEMS - uploadQueueTotalCount })\n }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script lang=\"ts\" setup>\nimport type { DocId, IntegerId } from '@/types/common'\nimport { computed, inject, nextTick, onMounted, ref, type ShallowRef, toRaw } from 'vue'\nimport { isNull, isString, isUndefined } from '@/utils/common'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport { useImageStore } from '@/components/damImage/uploadQueue/composables/imageStore'\nimport ImageWidgetMultipleItem from '@/components/damImage/uploadQueue/components/ImageWidgetMultipleItem.vue'\nimport { storeToRefs } from 'pinia'\nimport { bulkUpdateImages, deleteImage, fetchImageListByIds } from '@/components/damImage/uploadQueue/api/imageApi'\nimport { useCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { type AssetSearchListItemDto, DamAssetType } from '@/types/coreDam/Asset'\nimport AAssetSelect from '@/components/dam/assetSelect/AAssetSelect.vue'\nimport AFileInput from '@/components/file/AFileInput.vue'\nimport AImageDropzone from '@/components/file/AFileDropzone.vue'\nimport { useDamAcceptTypeAndSizeHelper } from '@/components/damImage/uploadQueue/composables/acceptTypeAndSizeHelper'\nimport { useUploadQueuesStore } from '@/components/damImage/uploadQueue/composables/uploadQueuesStore'\nimport type { AssetSelectReturnData } from '@/types/coreDam/AssetSelect'\nimport UploadQueueDialog from '@/components/damImage/uploadQueue/components/UploadQueueDialog.vue'\nimport { useUploadQueueDialog } from '@/components/damImage/uploadQueue/composables/uploadQueueDialog'\nimport AssetDetailDialog from '@/components/damImage/uploadQueue/components/AssetDetailDialog.vue'\nimport { fetchAssetByFileId, fetchAssetListByIds } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { useAssetDetailStore } from '@/components/damImage/uploadQueue/composables/assetDetailStore'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport type { ImageCreateUpdateAware } from '@/types/ImageAware'\nimport { generateUUIDv1 } from '@/utils/generator'\nimport { CHOSEN_CLASS, DRAG_CLASS, GHOST_CLASS, GROUP_CLASS, HANDLE_CLASS } from '@/components/sortable/sortableActions'\nimport { useSortable, type UseSortableReturn } from '@vueuse/integrations/useSortable'\nimport type { SortableEvent } from 'sortablejs'\nimport { WIDGET_HTML_ID_PREFIX } from '@/components/sortable/sortableUtils'\nimport { fetchAuthorListByIds } from '@/components/damImage/uploadQueue/api/authorApi'\nimport { useI18n } from 'vue-i18n'\nimport useVuelidate from '@vuelidate/core'\nimport { AImageMetadataValidationScopeSymbol } from '@/components/damImage/uploadQueue/composables/uploadValidations'\nimport { useExtSystemIdForCached } from '@/components/damImage/uploadQueue/composables/extSystemIdForCached'\nimport { fetchDamAssetLicence } from '@/components/damImage/uploadQueue/api/damAssetLicenceApi'\nimport { useAssetSelectStore } from '@/services/stores/coreDam/assetSelectStore'\nimport ImageWidgetMultipleLimitDialog from '@/components/damImage/uploadQueue/components/ImageWidgetMultipleLimitDialog.vue'\nimport { ImageWidgetUploadConfig } from '@/components/damImage/composables/imageWidgetInkectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerId[]\n queueKey: UploadQueueKey\n uploadLicence: IntegerId\n selectLicences: IntegerId[]\n configName?: string\n label?: string | undefined\n readonly?: boolean\n dataCy?: string | undefined\n width?: number | undefined\n disableDraggable?: boolean\n widgetIdentifierId?: string | undefined\n callDeleteApiOnRemove?: boolean\n }>(),\n {\n configName: 'default',\n label: undefined,\n image: undefined,\n readonly: false,\n lockable: false,\n lockedById: undefined,\n dataCy: undefined,\n width: undefined,\n disableDraggable: false,\n widgetIdentifierId: undefined,\n callDeleteApiOnRemove: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: IntegerId[]): void\n}>()\n\nconst assetSelectDialog = ref(false)\n\nconst imageWidgetUploadConfig = inject<ShallowRef<DamConfigLicenceExtSystemReturnType | undefined> | undefined>(\n ImageWidgetUploadConfig,\n undefined\n)\n\nif (isUndefined(imageWidgetUploadConfig) || isUndefined(imageWidgetUploadConfig.value)) {\n throw new Error(\"Fatal error, parent component doesn't provide necessary config ext system config.\")\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst imageOptions = useCommonAdminImageOptions(props.configName)\nconst { imageClient } = imageOptions\nconst { showErrorsDefault, showValidationError } = useAlerts()\nconst uploadButtonComponent = ref<InstanceType<any> | null>(null)\n\nconst { uploadSizes, uploadAccept } = useDamAcceptTypeAndSizeHelper(\n DamAssetType.Image,\n imageWidgetUploadConfig.value.extSystemConfig\n)\n\nconst { t } = useI18n()\n\nconst imagesLoading = ref(false)\n\nconst imageStore = useImageStore()\nconst { images, maxPosition } = storeToRefs(imageStore)\n\nconst fetchImagesOnLoad = async () => {\n try {\n imagesLoading.value = true\n const imagesRes = await fetchImageListByIds(imageClient, props.modelValue)\n imageStore.setImages(\n imagesRes.map((imageRes) => {\n if (isUndefined(imageRes.position)) throw new Error('Image object needs position field!')\n imageStore.updateMaxPositionIfGreater(imageRes.position)\n return {\n key: generateUUIDv1(),\n ...imageRes,\n }\n })\n )\n emit('update:modelValue', images.value.map((image) => image.id).filter((id) => id !== undefined) as IntegerId[])\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n imagesLoading.value = false\n }\n}\n\nconst uploadQueuesStore = useUploadQueuesStore()\n\nconst uploadQueue = computed(() => {\n return uploadQueuesStore.getQueue(props.queueKey)\n})\n\nconst { cachedExtSystemId } = useExtSystemIdForCached()\n\nconst { uploadQueueDialog } = useUploadQueueDialog()\n\nconst onFileInput = (files: File[]) => {\n const config = imageWidgetUploadConfig.value\n if (isUndefined(config)) return\n cachedExtSystemId.value = config.extSystem\n // uploadQueuesStore.addByFiles(props.queueKey, props.uploadConfig.extSystem, props.uploadConfig.licence, files)\n limitDialogComponent.value?.check(files)\n uploadQueueDialog.value = props.queueKey\n}\n\nconst onDrop = (files: File[]) => {\n const config = imageWidgetUploadConfig.value\n if (isUndefined(config)) return\n cachedExtSystemId.value = config.extSystem\n limitDialogComponent.value?.check(files)\n // uploadQueuesStore.addByFiles(props.queueKey, props.uploadConfig.extSystem, props.uploadConfig.licence, files)\n uploadQueueDialog.value = props.queueKey\n}\n\nconst afterLimitDialogAdd = () => {\n uploadQueueDialog.value = props.queueKey\n}\n\nconst assetSelectConfirmMap = async (items: AssetSearchListItemDto[]) => {\n const assetSelectStore = useAssetSelectStore()\n const ids = items.map((item) => item.id)\n const assetMetadataMap = new Map<DocId, { description: string; authorIds: DocId[] }>()\n const authorIdsToFetch = new Set<DocId>()\n const authorsMap = new Map<DocId, string>()\n try {\n const assetDetails = await fetchAssetListByIds(damClient, ids, assetSelectStore.selectedLicenceId)\n assetDetails.forEach((assetDetail) => {\n assetMetadataMap.set(assetDetail.id, {\n description: isString(assetDetail.metadata.customData?.description)\n ? assetDetail.metadata.customData.description.trim()\n : '',\n authorIds: assetDetail.authors,\n })\n })\n assetMetadataMap.forEach((assetMeta) => {\n assetMeta.authorIds.forEach((authorId) => {\n authorIdsToFetch.add(authorId)\n })\n })\n if (authorIdsToFetch.size > 0) {\n const authorsRes = await fetchAuthorListByIds(damClient, assetSelectStore.selectedSelectConfig.extSystem, [\n ...authorIdsToFetch,\n ])\n authorsRes.forEach((author) => {\n authorsMap.set(author.id, author.name)\n })\n }\n } catch (e) {\n showErrorsDefault(e)\n }\n\n return items.map((asset) => {\n maxPosition.value++\n const description = assetMetadataMap.get(asset.id)?.description\n const authorNames: string[] = []\n assetMetadataMap.get(asset.id)?.authorIds.forEach((authorId) => {\n const name = authorsMap.get(authorId)\n if (!isUndefined(name) && name.trim().length > 0) {\n authorNames.push(name)\n }\n })\n return {\n key: generateUUIDv1(),\n texts: {\n description: description ?? '',\n source: authorNames.join(', '),\n },\n dam: {\n damId: asset.mainFile!.id,\n regionPosition: 0,\n licenceId: asset.licence,\n },\n position: maxPosition.value,\n }\n })\n}\n\nconst onAssetSelectConfirm = async (data: AssetSelectReturnData) => {\n if (data.type === 'asset') {\n if (data.value.length === 0) return\n const items = await assetSelectConfirmMap(data.value.filter((asset) => !isNull(asset.mainFile)))\n imageStore.addImages(items)\n }\n}\n\nconst assetDetailStore = useAssetDetailStore()\nconst { loading: assetLoading, dialog: assetDialog } = storeToRefs(assetDetailStore)\nconst { damClient } = useCommonAdminCoreDamOptions()\n\nconst onEditAsset = async (assetFileId: DocId) => {\n assetLoading.value = true\n assetDialog.value = props.queueKey\n try {\n const asset = await fetchAssetByFileId(damClient, assetFileId)\n const licence = await fetchDamAssetLicence(damClient, asset.licence)\n if (licence.extSystem) {\n cachedExtSystemId.value = licence.extSystem\n }\n assetDetailStore.setAsset(asset)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n assetLoading.value = false\n }\n}\n\nconst onAssetUploadConfirm = (items: ImageCreateUpdateAware[]) => {\n if (items.length === 0) return\n imageStore.addImages(\n items.map((item) => {\n maxPosition.value++\n return {\n key: generateUUIDv1(),\n ...item,\n position: maxPosition.value,\n }\n })\n )\n uploadQueueDialog.value = null\n uploadQueuesStore.stopUpload(props.queueKey)\n}\n\nconst actionLibrary = () => {\n assetSelectDialog.value = true\n}\n\nconst v$ = useVuelidate({ $scope: AImageMetadataValidationScopeSymbol })\n\nconst saveImages = async () => {\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n return false\n }\n try {\n const resItems = await bulkUpdateImages(imageClient, toRaw(images.value))\n const ids: IntegerId[] = []\n const items = resItems.map((resItem) => {\n ids.push(resItem.id)\n return {\n key: generateUUIDv1(),\n ...resItem,\n }\n })\n imageStore.setImages(items)\n emit('update:modelValue', ids)\n return true\n } catch (e) {\n return false\n }\n}\n\nconst removeItem = async (index: number) => {\n const image = images.value[index]\n if (!image) return\n if (isUndefined(image.id)) {\n imageStore.removeImageByIndex(index)\n return\n }\n if (props.callDeleteApiOnRemove) {\n try {\n await deleteImage(imageClient, image.id)\n imageStore.removeImageByIndex(index)\n } catch (e) {\n showErrorsDefault(e)\n }\n return\n }\n imageStore.removeImageByIndex(index)\n}\n\nconst widgetEl = ref<HTMLElement | null>(null)\nconst randomUuid = ref<string>(generateUUIDv1())\nconst sortableInstance = ref<UseSortableReturn | null>(null)\nconst forceRerender = ref(0)\nconst limitDialogComponent = ref<InstanceType<typeof ImageWidgetMultipleLimitDialog> | null>(null)\n\nconst widgetHtmlId = computed(() => {\n return isUndefined(props.widgetIdentifierId) ? WIDGET_HTML_ID_PREFIX + randomUuid.value : props.widgetIdentifierId\n})\n\nconst forceRerenderWidgetHtml = () => {\n forceRerender.value++\n nextTick(() => {\n initSortable()\n })\n}\n\nconst updateAllPositions = () => {\n let pos = 0\n images.value.forEach((image) => {\n pos++\n image.position = pos\n })\n imageStore.maxPosition = pos\n}\nconst moveImagePositions = (from: number, to: number) => {\n if (to >= 0 && to < images.value.length) {\n const element = images.value.splice(from, 1)[0]\n images.value.splice(to, 0, element)\n updateAllPositions()\n forceRerenderWidgetHtml()\n }\n}\n\nconst initSortable = () => {\n if (props.disableDraggable) return\n if (!widgetEl.value) return\n const nestedSortable = widgetEl.value.querySelector<HTMLElement>('.' + GROUP_CLASS)\n if (!nestedSortable) return\n sortableInstance.value = useSortable(nestedSortable, [], {\n handle: '.' + HANDLE_CLASS,\n ghostClass: GHOST_CLASS,\n dragClass: DRAG_CLASS,\n chosenClass: CHOSEN_CLASS,\n onEnd: async (event: SortableEvent) => {\n if (isUndefined(event.oldIndex) || isUndefined(event.newIndex)) return\n moveImagePositions(event.oldIndex, event.newIndex)\n },\n })\n}\n\nnextTick(() => {\n widgetEl.value = document.querySelector('#' + widgetHtmlId.value)\n initSortable()\n})\n\ndefineExpose({\n saveImages,\n})\n\nonMounted(() => {\n fetchImagesOnLoad()\n})\n</script>\n\n<template>\n <div :id=\"widgetHtmlId\">\n <h4\n v-if=\"label\"\n class=\"font-weight-bold text-subtitle-2\"\n >\n {{ label }}\n </h4>\n <div class=\"pb-2\">\n <AFileInput\n :file-input-key=\"uploadQueue?.fileInputKey\"\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n multiple\n @files-input=\"onFileInput\"\n >\n <template #activator=\"{ props: fileInputProps }\">\n <VBtn\n ref=\"uploadButtonComponent\"\n v-bind=\"fileInputProps\"\n >\n {{ t('common.damImage.image.button.upload') }}\n </VBtn>\n </template>\n </AFileInput>\n <VBtn\n class=\"mr-2\"\n @click=\"actionLibrary\"\n >\n {{ t('common.damImage.image.button.addFromDam') }}\n </VBtn>\n </div>\n <AAssetSelect\n v-model=\"assetSelectDialog\"\n :select-licences=\"selectLicences\"\n :min-count=\"1\"\n :max-count=\"50\"\n :asset-type=\"DamAssetType.Image\"\n return-type=\"asset\"\n @on-confirm=\"onAssetSelectConfirm\"\n />\n\n <div\n class=\"position-relative w-100\"\n style=\"min-height: 140px\"\n >\n <div\n :key=\"forceRerender\"\n :class=\"GROUP_CLASS\"\n class=\"asset-list-tiles asset-list-tiles--thumbnail\"\n >\n <ImageWidgetMultipleItem\n v-for=\"(image, index) in images\"\n :key=\"image.key\"\n :index=\"index\"\n :disable-draggable=\"disableDraggable\"\n @edit-asset=\"onEditAsset\"\n @remove-item=\"removeItem\"\n />\n </div>\n <AImageDropzone\n variant=\"fill\"\n :hover-only=\"modelValue.length > 0 || images.length > 0\"\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n @on-drop=\"onDrop\"\n @on-click=\"uploadButtonComponent?.$el.click()\"\n />\n </div>\n <UploadQueueDialog\n v-if=\"uploadQueueDialog === queueKey && imageWidgetUploadConfig\"\n :queue-key=\"queueKey\"\n :ext-system=\"imageWidgetUploadConfig.extSystem\"\n :licence-id=\"imageWidgetUploadConfig.licence\"\n :file-input-key=\"uploadQueue?.fileInputKey ?? -1\"\n :accept=\"uploadAccept\"\n :max-sizes=\"uploadSizes\"\n multiple\n @on-apply=\"onAssetUploadConfirm\"\n />\n <AssetDetailDialog\n v-if=\"assetDialog === queueKey\"\n :queue-key=\"queueKey\"\n :ext-system=\"cachedExtSystemId\"\n />\n <ImageWidgetMultipleLimitDialog\n ref=\"limitDialogComponent\"\n :queue-key=\"queueKey\"\n @after-add=\"afterLimitDialogAdd\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { isImageWidgetUploadConfigAllowed } from '@/components/damImage/composables/damFilterUserAllowedUploadConfigs'\nimport { ImageWidgetUploadConfig } from '@/components/damImage/composables/imageWidgetInkectionKeys'\nimport ImageWidgetMultipleInner from '@/components/damImage/uploadQueue/components/ImageWidgetMultipleInner.vue'\nimport { useDamConfigState } from '@/components/damImage/uploadQueue/composables/damConfigState'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\nimport type { IntegerId } from '@/types/common'\nimport type { DamConfigLicenceExtSystemReturnType } from '@/types/coreDam/DamConfig'\nimport type { UploadQueueKey } from '@/types/coreDam/UploadQueue'\nimport { isUndefined } from '@/utils/common'\nimport { onMounted, provide, ref, shallowRef } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerId[] // initial ids, updated only when save is called\n queueKey: UploadQueueKey\n uploadLicence: IntegerId\n selectLicences: IntegerId[]\n configName?: string\n label?: string | undefined\n readonly?: boolean\n dataCy?: string | undefined\n width?: number | undefined\n callDeleteApiOnRemove?: boolean\n }>(),\n {\n configName: 'default',\n label: undefined,\n image: undefined,\n readonly: false,\n lockable: false,\n lockedById: undefined,\n dataCy: undefined,\n expandOptions: false,\n width: undefined,\n callDeleteApiOnRemove: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: IntegerId[]): void\n}>()\n\nconst status = ref<'loading' | 'ready' | 'error' | 'uploadNotAllowed'>('loading')\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { damClient } = useCommonAdminCoreDamOptions(props.configName)\nconst {\n loadDamPrvConfig,\n loadDamConfigAssetCustomFormElements,\n getDamConfigAssetCustomFormElements,\n getOrLoadDamConfigExtSystemByLicence,\n getOrLoadDamConfigExtSystemByLicences,\n} = useDamConfigState(damClient)\n\nconst uploadConfig = shallowRef<DamConfigLicenceExtSystemReturnType | undefined>(undefined)\n\nonMounted(async () => {\n const damConfigStore = useDamConfigStore()\n uploadConfig.value = await getOrLoadDamConfigExtSystemByLicence(props.uploadLicence)\n if (isUndefined(uploadConfig.value)) {\n status.value = 'error'\n return\n }\n if (!isImageWidgetUploadConfigAllowed(uploadConfig.value)) {\n status.value = 'uploadNotAllowed'\n return\n }\n const promises: Promise<any>[] = []\n if (!damConfigStore.initialized.damPrvConfig) {\n promises.push(loadDamPrvConfig())\n }\n promises.push(getOrLoadDamConfigExtSystemByLicences(props.selectLicences))\n const configAssetCustomFormElements = getDamConfigAssetCustomFormElements(uploadConfig.value.extSystem)\n if (isUndefined(configAssetCustomFormElements)) {\n promises.push(loadDamConfigAssetCustomFormElements(uploadConfig.value.extSystem))\n }\n try {\n await Promise.allSettled(promises)\n } catch (e) {\n status.value = 'error'\n }\n if (status.value !== 'error') status.value = 'ready'\n})\n\nconst innerComponent = ref<InstanceType<typeof ImageWidgetMultipleInner> | null>(null)\n\nconst saveImages = async () => {\n if (!innerComponent.value) return false\n return (await innerComponent.value.saveImages()) as boolean\n}\n\nprovide(ImageWidgetUploadConfig, uploadConfig)\n\ndefineExpose({\n saveImages,\n})\n</script>\n\n<template>\n <ImageWidgetMultipleInner\n v-if=\"status === 'ready'\"\n ref=\"innerComponent\"\n v-bind=\"props\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n />\n <div\n v-else-if=\"status === 'error'\"\n class=\"text-error\"\n >\n Loading DAM config error\n </div>\n <div\n v-else-if=\"status === 'uploadNotAllowed'\"\n class=\"text-error\"\n >\n DAM access rights error\n </div>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n />\n</template>\n","<script lang=\"ts\" setup>\nimport type { IntegerId } from '@/types/common'\nimport type { ImageAware } from '@/types/ImageAware'\nimport AImageWidgetSimple from '@/components/damImage/AImageWidgetSimple.vue'\nimport { ref, toRefs, watch } from 'vue'\nimport { cloneDeep } from '@/utils/common'\nimport { fetchImageListByIds } from '@/components/damImage/uploadQueue/api/imageApi'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerId[]\n images?: ImageAware[]\n configName?: string\n label?: string | undefined\n width?: number | undefined\n disableAspectRatio?: boolean\n aspectRatio?: number | string\n showDescription?: boolean\n showSource?: boolean\n }>(),\n {\n images: () => [],\n configName: 'default',\n label: undefined,\n image: undefined,\n width: undefined,\n disableAspectRatio: false,\n aspectRatio: 1.777, // 16/9\n showDescription: false,\n showSource: false,\n }\n)\n\nconst { images, modelValue } = toRefs(props)\n\nconst resImages = ref<ImageAware[]>([])\n\nconst { showErrorsDefault } = useAlerts()\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst imageOptions = useCommonAdminImageOptions(props.configName)\nconst { imageClient } = imageOptions\n\nwatch(\n [images, modelValue],\n async ([newImages, newImageIds]) => {\n resImages.value = []\n if (newImages && newImages.length > 0) {\n resImages.value = cloneDeep(newImages)\n return\n }\n if (newImageIds && newImageIds.length > 0) {\n try {\n resImages.value = await fetchImageListByIds(imageClient, newImageIds)\n } catch (error) {\n showErrorsDefault(error)\n }\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"asset-list-tiles asset-list-tiles--thumbnail\">\n <div\n v-for=\"image in resImages\"\n :key=\"image.id\"\n class=\"asset-list-tiles__item\"\n >\n <div class=\"asset-list-tiles__item-card\">\n <div class=\"ma-2\">\n <AImageWidgetSimple\n :model-value=\"image.id\"\n :image=\"image\"\n :config-name=\"configName\"\n :width=\"width\"\n :disable-aspect-ratio=\"disableAspectRatio\"\n :aspect-ratio=\"aspectRatio\"\n :show-description=\"showDescription\"\n :show-source=\"showSource\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { ImageAware, ImageCreateUpdateAware } from '@/types/ImageAware'\nimport { useCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { fetchAssetByFileId } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { cloneDeep, isDocId, isNull, isString } from '@/utils/common'\nimport { computed, ref, toRaw, watch } from 'vue'\nimport type { AssetDetailItemDto } from '@/types/coreDam/Asset'\nimport type { IntegerId, IntegerIdNullable } from '@/types/common'\nimport { createImage, fetchImage, updateImage } from '@/components/damImage/uploadQueue/api/imageApi'\nimport { useImageActions } from '@/components/damImage/composables/imageActions'\nimport { useCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useI18n } from 'vue-i18n'\nimport AFormTextField from '@/components/form/AFormTextField.vue'\nimport AFormTextarea from '@/components/form/AFormTextarea.vue'\nimport ARow from '@/components/ARow.vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\n\nconst props = withDefaults(\n defineProps<{\n selectLicences: IntegerId[]\n image?: ImageAware | undefined // optional, if available, no need to fetch image data\n configName?: string\n labelT?: string | undefined\n dataCy?: string | undefined\n }>(),\n {\n image: undefined,\n configName: 'default',\n labelT: 'common.damImage.public.idOrUrl',\n dataCy: undefined,\n }\n)\nconst modelValue = defineModel<IntegerIdNullable>({ default: null, required: true })\nconst inputField = ref('')\nconst meta = ref({ description: '', source: '' })\n\nconst resolvedSrc = ref('')\nconst resImage = ref<null | ImageCreateUpdateAware>(null)\n\nconst isValid = ref(true)\nconst isDirty = ref(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst imageOptions = useCommonAdminImageOptions(props.configName)\nconst { imageClient } = imageOptions\nconst { damClient } = useCommonAdminCoreDamOptions()\nconst { widgetImageToDamImageOriginalUrl } = useImageActions(imageOptions)\n\nconst { showErrorsDefault, showValidationError } = useAlerts()\nconst { t } = useI18n()\n\nconst extractUUID = (url: string): string | undefined => {\n const regex = /\\/image\\/original\\/([0-9a-fA-F-]+)\\.jpg/\n const match = url.match(regex)\n\n return match ? match[1] : undefined\n}\n\nconst validateAssetData = (asset: AssetDetailItemDto, licences: IntegerId[]) => {\n return licences.some((licence) => licence === asset.licence)\n}\n\nconst { required, maxLength } = useValidate()\n\nconst rules = {\n meta: {\n description: {\n maxLength: maxLength(255),\n },\n source: {\n required,\n maxLength: maxLength(255),\n },\n },\n}\nconst v$ = useVuelidate(rules, { meta }, { $stopPropagation: true })\n\nconst validateField = async () => {\n isDirty.value = true\n isValid.value = true\n inputField.value = inputField.value.trim()\n if (inputField.value.startsWith('http')) {\n const extracted = extractUUID(inputField.value)\n if (isString(extracted)) inputField.value = extracted\n }\n if (!isDocId(inputField.value)) {\n isValid.value = false\n return Promise.reject('Incorrect URL/ID provided')\n }\n try {\n const assetRes = await fetchAssetByFileId(damClient, inputField.value)\n if (isNull(assetRes.mainFile)) {\n isValid.value = false\n return Promise.reject('Incorrect asset mainFile')\n }\n if (validateAssetData(assetRes, props.selectLicences)) {\n isValid.value = true\n return Promise.resolve(assetRes)\n }\n isValid.value = false\n return Promise.reject('Incorrect asset or no access')\n } catch (e) {\n isValid.value = false\n return Promise.reject('Incorrect asset or no access')\n }\n}\n\nconst submit = async () => {\n try {\n const asset = await validateField()\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n return Promise.reject('Invalid source or description')\n }\n const data: ImageCreateUpdateAware = {\n texts: {\n description: meta.value.description.trim(),\n source: meta.value.source.trim(),\n },\n dam: {\n damId: asset.mainFile!.id,\n licenceId: asset.licence,\n regionPosition: 0,\n },\n position: 0,\n }\n if (resImage.value?.id) {\n data.id = resImage.value.id\n }\n const imageRes = resImage.value?.id\n ? await updateImage(imageClient, resImage.value.id, data)\n : await createImage(imageClient, data)\n resImage.value = imageRes\n modelValue.value = imageRes.id\n return Promise.resolve({ asset: asset, image: imageRes })\n } catch (e) {\n showErrorsDefault(e)\n }\n}\n\nconst updatePreviewAndTexts = () => {\n resolvedSrc.value = widgetImageToDamImageOriginalUrl({\n texts: {\n description: '',\n source: '',\n },\n dam: {\n damId: inputField.value,\n licenceId: 0,\n regionPosition: 0,\n },\n })\n}\n\nconst onBlur = async () => {\n try {\n await validateField()\n updatePreviewAndTexts()\n } catch (e) {\n //\n }\n}\n\nconst reload = async (newImage: ImageCreateUpdateAware | undefined, newImageId: IntegerIdNullable, force = false) => {\n resolvedSrc.value = ''\n if ((newImage && isNull(resImage.value)) || (newImage && force)) {\n resImage.value = cloneDeep(newImage)\n if (resImage.value) {\n inputField.value = resImage.value.dam.damId\n resolvedSrc.value = widgetImageToDamImageOriginalUrl(toRaw(resImage.value))\n meta.value.description = resImage.value.texts.description\n meta.value.source = resImage.value.texts.source\n onBlur()\n }\n return\n }\n if (newImageId) {\n try {\n resImage.value = await fetchImage(imageClient, newImageId)\n } catch (error) {\n showErrorsDefault(error)\n }\n if (!isNull(resImage.value)) {\n inputField.value = resImage.value.dam.damId\n resolvedSrc.value = widgetImageToDamImageOriginalUrl(toRaw(resImage.value))\n meta.value.description = resImage.value.texts.description\n meta.value.source = resImage.value.texts.source\n onBlur()\n }\n return\n }\n resImage.value = null\n meta.value.description = ''\n meta.value.source = ''\n}\n\nconst disabled = computed(() => !(isValid.value && isDirty.value))\n\nwatch(\n [() => props.image, modelValue],\n async ([newImage, newImageId]) => {\n await reload(newImage, newImageId)\n },\n { immediate: true }\n)\n\ndefineExpose({\n submit,\n})\n</script>\n\n<template>\n <ARow>\n <AFormTextField\n v-model=\"inputField\"\n :label=\"labelT ? t(labelT) : undefined\"\n :error=\"!isValid\"\n :error-message=\"isValid ? undefined : t('common.damImage.public.inputError')\"\n required\n @blur=\"onBlur\"\n @keyup.enter=\"onBlur\"\n />\n </ARow>\n <ARow>\n <AFormTextarea\n v-model=\"meta.description\"\n :label=\"t('common.damImage.image.model.texts.description')\"\n :v=\"v$.meta.description\"\n :disabled=\"disabled\"\n />\n </ARow>\n <ARow>\n <AFormTextarea\n v-model=\"meta.source\"\n :label=\"t('common.damImage.image.model.texts.source')\"\n :v=\"v$.meta.source\"\n :disabled=\"disabled\"\n />\n </ARow>\n <ARow style=\"min-height: 50px\">\n <div>{{ t('common.damImage.public.imagePreview') }}:</div>\n <img\n v-if=\"resolvedSrc.length > 0\"\n :src=\"resolvedSrc\"\n alt=\"\"\n >\n </ARow>\n</template>\n","export const datatableSlotName = (columnName: string, prefix = 'item') => {\n return prefix + '.' + columnName\n}\n","<script lang=\"ts\" setup>\nimport { objectGetValueByPath } from '@/utils/object'\nimport { computed } from 'vue'\nimport ABooleanValue from '@/components/ABooleanValue.vue'\nimport { datatableSlotName } from '@/components/datatable/datatable'\n\nconst props = withDefaults(\n defineProps<{\n item: any\n column: any\n }>(),\n {}\n)\n\nconst value = computed(() => {\n return objectGetValueByPath(props.item, props.column.key)\n})\n\nconst isBoolean = computed(() => typeof value.value === 'boolean')\n</script>\n\n<template>\n <td>\n <slot\n :name=\"datatableSlotName(column.key)\"\n :item=\"item\"\n >\n <ABooleanValue\n v-if=\"isBoolean\"\n chip\n :value=\"value\"\n />\n <template v-else>\n {{ value }}\n </template>\n </slot>\n </td>\n</template>\n","<script lang=\"ts\" setup generic=\"TItem = Record<string, unknown>\">\nimport { computed } from 'vue'\nimport { isEmpty } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport ADatatableColumn from '@/components/datatable/ADatatableColumn.vue'\nimport { datatableSlotName } from '@/components/datatable/datatable'\n\nconst props = withDefaults(\n defineProps<{\n items: TItem[]\n columns: any\n itemKey?: string\n }>(),\n {\n itemKey: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'click:row', data: any): void\n}>()\nconst onRowClick = (event: unknown, item: unknown) => {\n emit('click:row', { event, item })\n}\n\nconst isNotEmpty = computed(() => {\n return !isEmpty(props.items)\n})\n\nconst totalColumnsCount = computed(() => {\n return props.columns.length\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VTable class=\"a-datatable\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n class=\"text-left\"\n >\n {{ column.title }}\n </th>\n </tr>\n </thead>\n <tbody>\n <template v-if=\"isNotEmpty\">\n <tr\n v-for=\"item in props.items\"\n :key=\"(item as any)[itemKey]\"\n @click=\"onRowClick($event, item)\"\n >\n <ADatatableColumn\n v-for=\"column in columns\"\n :key=\"column.key\"\n :item=\"item\"\n :column=\"column\"\n >\n <template #[datatableSlotName(column.key)]=\"{ item: slotItem }\">\n <slot\n :name=\"datatableSlotName(column.key)\"\n :item=\"slotItem\"\n />\n </template>\n </ADatatableColumn>\n </tr>\n </template>\n <template v-else>\n <tr>\n <td\n :colspan=\"totalColumnsCount\"\n class=\"text-center text-disabled\"\n >\n {{ t('common.system.datatable.noDataText') }}\n </td>\n </tr>\n </template>\n </tbody>\n </VTable>\n <slot name=\"bottom\" />\n</template>\n","import { computed, type Ref } from 'vue'\nimport { i18n } from '@/plugins/i18n'\nimport type { Pagination } from '@/types/Pagination'\nimport { usePagination } from '@/composables/system/pagination'\nimport { isUndefined } from '@/utils/common'\n\nexport const DATETIME_AUTO_LABEL_TRACKING = ['createdAt', 'modifiedAt']\n\nexport type DatatableSortBy =\n | {\n key: string\n order: 'asc' | 'desc'\n }\n | null\n | undefined\n\nexport type DatatableOrderingOption = { id: number; titleT: string; sortBy?: DatatableSortBy; customData?: any }\n\nexport type DatatableOrderingOptions = Array<DatatableOrderingOption>\n\nexport type ColumnConfig = {\n key: string\n title?: string\n sortable?: boolean\n fixed?: boolean\n maxWidth?: number\n}\n\nexport type ColumnInternalValues = {\n key: string\n title?: string\n sortable: boolean\n fixed: boolean\n}\n\nconst defaultColumn: ColumnInternalValues = {\n key: '',\n title: undefined,\n sortable: false,\n fixed: false,\n}\n\nexport function createDatatableColumnsConfig(\n config: ColumnConfig[],\n columnsHidden: Ref<Array<string>>,\n system: string | undefined = undefined,\n subject: string | undefined = undefined,\n disableActions: boolean = false,\n customInitialPagination: Pagination | undefined = undefined,\n customI18n: undefined | any = undefined,\n showExpand: undefined| boolean = undefined\n) {\n const localI18n = customI18n ?? i18n\n const { t } = localI18n.global || localI18n\n const pagination: Pagination = usePagination()\n if (customInitialPagination) {\n for (const prop of Object.keys(pagination)) {\n if (prop in customInitialPagination) {\n // @ts-ignore\n pagination[prop] = customInitialPagination[prop]\n }\n }\n }\n\n const columnsAll = config.map((item) => {\n const obj = { ...defaultColumn, ...item }\n if (!isUndefined(obj.title)) {\n // do not modify\n } else if (isUndefined(obj.title) && DATETIME_AUTO_LABEL_TRACKING.includes(obj.key)) {\n obj.title = t('common.model.tracking.' + obj.key)\n } else if (isUndefined(obj.title) && system && subject) {\n obj.title = t(system + '.' + subject + '.model.' + obj.key)\n } else {\n obj.title = ''\n }\n return obj\n })\n\n const columnsVisible = computed(() => {\n const columns: any = []\n if (showExpand) columns.push({ key: 'data-table-expand', sortable: false })\n columnsAll.forEach((column) => {\n if (!columnsHidden.value.includes(column.key)) {\n columns.push(column)\n }\n })\n if (!disableActions) columns.push({ key: 'actions', sortable: false, fixed: true })\n return columns\n })\n\n const updateSortBy = (sortBy: { key: string, order: 'asc' | 'desc' } | undefined | null) => {\n if (sortBy) {\n pagination.sortBy = sortBy.key\n pagination.descending = sortBy.order === 'desc' ? true : false\n return\n }\n pagination.sortBy = null\n }\n\n return {\n columnsAll,\n columnsVisible,\n columnsHidden,\n updateSortBy,\n pagination,\n }\n}\n","import { createDatatableColumnsConfig, type DatatableOrderingOption } from '@/composables/system/datatableColumns'\nimport type { Ref } from 'vue'\nimport { ref } from 'vue'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { useFilterHelpers } from '@/composables/filter/filterHelpers'\nimport { useAlerts } from '@/composables/system/alerts'\n\nexport function useSubjectSelect<TItem>(\n datatableConfig: any,\n datatableHiddenColumns: any,\n system: string,\n subject: string,\n fetch: (pag: Pagination, fb: FilterBag) => Promise<Array<TItem>>,\n filter: FilterBag\n) {\n const filterTouched: Ref<boolean> = ref(false)\n const items: Ref<Array<TItem>> = ref([])\n const selected: Ref<Array<TItem>> = ref([])\n const loading = ref(false)\n\n const { resetFilter, submitFilter } = useFilterHelpers()\n const { showErrorsDefault } = useAlerts()\n\n const { columnsVisible, pagination, updateSortBy, columnsAll, columnsHidden } = createDatatableColumnsConfig(\n datatableConfig,\n datatableHiddenColumns,\n system,\n subject\n )\n\n const onOpen = () => {\n resetState()\n getList()\n }\n\n const sortByChange = (option: DatatableOrderingOption) => {\n updateSortBy(option.sortBy)\n getList()\n }\n\n const onFetchNextPage = async () => {\n loading.value = true\n pagination.page++\n try {\n items.value.push(...(await fetch(pagination, filter)))\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n }\n\n const resetState = () => {\n items.value = []\n selected.value = []\n }\n\n const getList = async () => {\n loading.value = true\n try {\n items.value = await fetch(pagination, filter)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n }\n\n const onRowClick = (event: Event) => {\n const eventTarget = event.target as HTMLElement | null\n if (!eventTarget) return\n const parent = eventTarget.parentElement\n if (!parent || !parent.classList.contains('v-data-table__tr')) return\n const firstTd = parent.firstElementChild\n if (!firstTd || !firstTd.classList.contains('v-data-table__td')) return\n const input = firstTd.querySelector('input')\n if (!input) return\n input.click()\n }\n\n return {\n items,\n selected,\n pagination,\n columnsVisible,\n columnsHidden,\n columnsAll,\n filterTouched,\n loading,\n onRowClick,\n onFetchNextPage,\n onOpen,\n sortByChange,\n getList,\n resetFilter: () => resetFilter(filter, pagination, getList),\n submitFilter: () => submitFilter(filter, pagination, getList),\n }\n}\n","export interface VDatatableSelectableItem {\n value: any\n selectable: boolean\n}\n\ninterface DataTableSelectStrategy {\n showSelectAll: boolean\n allSelected: (data: {\n allItems: VDatatableSelectableItem[]\n currentPage: VDatatableSelectableItem[]\n }) => VDatatableSelectableItem[]\n select: (data: { items: VDatatableSelectableItem[]; value: boolean; selected: Set<unknown> }) => Set<unknown>\n selectAll: (data: {\n value: boolean\n allItems: VDatatableSelectableItem[]\n currentPage: VDatatableSelectableItem[]\n selected: Set<unknown>\n }) => Set<unknown>\n}\n\nexport const generateDatatableMinMaxSelectStrategy = (min: number, max: number): DataTableSelectStrategy => {\n return {\n showSelectAll: false,\n allSelected: () => [],\n select: ({ items, value, selected }) => {\n if (min === max && min === 1) {\n return new Set(value ? [items[0]?.value] : [])\n }\n for (const item of items) {\n if (selected.size >= max && value) break\n else if (value) selected.add(item.value)\n else selected.delete(item.value)\n }\n return selected\n },\n selectAll: ({ selected }) => selected,\n }\n}\n","export const booleanToInteger = (value: boolean) => {\n return value ? 1 : 0\n}\n","import { dateTimeNow } from '@/utils/datetime'\nimport { isString } from '@/utils/common'\nimport type { AnzuUser } from '@/types/AnzuUser'\n\nexport function useAnzuUserFactory(system = '', resourceName = 'user') {\n let _system = system\n let _resourceName = resourceName\n const createAnzuUser = (system?: string, resourceName?: string): AnzuUser => {\n if (isString(system)) _system = system\n if (isString(resourceName)) _resourceName = resourceName\n\n return {\n id: null,\n email: '',\n avatar: {\n color: '',\n text: '',\n },\n person: {\n firstName: '',\n fullName: '',\n lastName: '',\n },\n enabled: false,\n permissionGroups: [],\n permissions: {},\n resolvedPermissions: {},\n roles: [],\n modifiedAt: dateTimeNow(),\n modifiedBy: null,\n createdAt: dateTimeNow(),\n createdBy: null,\n _system: _system,\n _resourceName: _resourceName,\n }\n }\n\n return {\n createAnzuUser,\n }\n}\n","import type { BaseUser } from '@/types/AnzuUser'\n\nexport function useBaseUserFactory() {\n const createBaseUser = (): BaseUser => {\n return {\n id: null,\n email: '',\n avatar: {\n color: '',\n text: '',\n },\n person: {\n firstName: '',\n fullName: '',\n lastName: '',\n },\n }\n }\n\n return {\n createBaseUser,\n }\n}\n","import type { PermissionConfig } from '@/types/PermissionConfig'\n\nexport function usePermissionConfigFactory() {\n const createPermissionConfig = (): PermissionConfig => {\n return {\n config: {},\n defaultGrants: [],\n roles: [],\n translation: {\n actions: {},\n subjects: {},\n roles: {},\n },\n }\n }\n\n return {\n createPermissionConfig,\n }\n}\n","import { dateTimeNow } from '@/utils/datetime'\nimport type { PermissionGroup } from '@/types/PermissionGroup'\n\nexport function usePermissionGroupFactory() {\n const createPermissionGroup = (): PermissionGroup => {\n return {\n id: 0,\n title: '',\n description: '',\n permissions: {},\n createdBy: 0,\n modifiedBy: 0,\n createdAt: dateTimeNow(),\n modifiedAt: dateTimeNow(),\n _resourceName: 'permissionGroup',\n _system: '',\n }\n }\n\n return {\n createPermissionGroup,\n }\n}\n","import { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isNull } from '@/utils/common'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig, Method } from 'axios'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nexport const apiAnyRequest = <T, R = T>(\n client: () => AxiosInstance,\n method: Method,\n urlTemplate = '',\n urlParams: UrlParams = {},\n object: T | null = null,\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n return new Promise((resolve, reject) => {\n const axiosConfig: AxiosRequestConfig = { method: method }\n if (urlTemplate !== '') {\n axiosConfig.url = replaceUrlParameters(urlTemplate, urlParams)\n }\n if (!isNull(object)) {\n axiosConfig.data = JSON.stringify(object)\n }\n client()\n .request({ ...options, ...axiosConfig })\n .then((res) => {\n if (!isValidHTTPStatus(res.status)) {\n return reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n return resolve(res.data)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return resolve(null as R)\n }\n return reject(new AnzuFatalError())\n })\n .catch((err) => {\n if (axiosErrorResponseIsForbidden(err)) {\n return reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return reject(new AnzuApiForbiddenOperationError(err, err))\n }\n // todo catch another axios errors, for example timeout\n return reject(new AnzuFatalError(err))\n })\n })\n}\n","import { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport type { FilterBag } from '@/types/Filter'\nimport type { Pagination } from '@/types/Pagination'\nimport { isDefined } from '@/utils/common'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { useApiQueryBuilder } from '@/services/api/queryBuilder'\nimport { usePagination } from '@/composables/system/pagination'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport { AnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport {\n type ApiInfiniteResponseList,\n type ApiResponseList,\n isApiInfiniteResponseList,\n isApiResponseList,\n} from '@/types/ApiResponse'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\n\nconst generateListApiQuery = (pagination: Pagination, filterBag: FilterBag | undefined = undefined): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, querySetFilters } = useApiQueryBuilder()\n querySetLimit(pagination.rowsPerPage)\n querySetOffset(pagination.page, pagination.rowsPerPage)\n querySetOrder(pagination.sortBy, pagination.descending)\n if (isDefined(filterBag)) querySetFilters(filterBag)\n return queryBuild()\n}\n\nconst generateListApiQueryWithoutPagination = (\n rowsPerPage: number,\n page: number,\n orderField: string,\n orderDesc: boolean,\n filterBag: FilterBag | undefined = undefined\n): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, querySetFilters } = useApiQueryBuilder()\n querySetLimit(rowsPerPage)\n querySetOffset(page, rowsPerPage)\n querySetOrder(orderField, orderDesc)\n if (isDefined(filterBag)) querySetFilters(filterBag)\n return queryBuild()\n}\n// todo: alpha version\n/**\n * Used to fetch all items from list api.\n *\n * @template R Response type override, optional\n */\nexport const apiFetchListBatch = async <R>(\n client: () => AxiosInstance,\n urlTemplate: string,\n urlParams: UrlParams = {},\n sortBy = 'id',\n sortDesc = true,\n filterBag: FilterBag | undefined = undefined,\n batchSize = 100,\n system: string,\n entity: string,\n forceElastic = false,\n options: AxiosRequestConfig = {}\n): Promise<R> => {\n const searchApi = (isDefined(filterBag?._elastic) || forceElastic) ? '/search' : ''\n const pagination = usePagination(sortBy)\n pagination.rowsPerPage = batchSize\n pagination.sortBy = sortBy\n pagination.descending = sortDesc\n const urlPart = replaceUrlParameters(urlTemplate, urlParams) + searchApi\n const results = [] as unknown as R\n\n try {\n const res = await client().get(urlPart + generateListApiQuery(pagination, filterBag), options)\n if (!isValidHTTPStatus(res.status)) {\n return Promise.reject(new AnzuApiResponseCodeError(res.status))\n }\n if (res.data) {\n const resData = res.data as unknown as ApiResponseList<R> | ApiInfiniteResponseList<R>\n // @ts-ignore\n results.push(...resData.data)\n if (isApiInfiniteResponseList(resData)) {\n pagination.hasNextPage = res.data.hasNextPage\n if (pagination.hasNextPage) {\n while (pagination.hasNextPage) {\n pagination.page++\n const nextPageResponse = await client().get(urlPart + generateListApiQuery(pagination, filterBag), options)\n const nextPageData = nextPageResponse.data\n // @ts-ignore\n results.push(...nextPageData.data)\n pagination.hasNextPage = nextPageData.hasNextPage\n }\n }\n } else if (isApiResponseList(resData)) {\n pagination.totalCount = resData.totalCount\n if (pagination.totalCount <= pagination.rowsPerPage) {\n return Promise.resolve(results as R)\n }\n const promises: Promise<any>[] = []\n const numPages = Math.ceil(pagination.totalCount / pagination.rowsPerPage)\n for (let i = 0; i < numPages; i++) {\n promises.push(\n client().get(\n urlPart +\n generateListApiQueryWithoutPagination(\n pagination.rowsPerPage,\n i,\n pagination.sortBy,\n pagination.descending,\n filterBag\n ),\n options\n )\n )\n }\n const allResponses = await Promise.all(promises)\n allResponses.forEach((pageResponse) => {\n // @ts-ignore\n results.push(...pageResponse.data.data)\n })\n }\n pagination.currentViewCount = res.data.data.length\n return Promise.resolve(results as R)\n }\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return Promise.resolve([] as R)\n }\n\n return results\n } catch (err: any) {\n if (axiosErrorResponseIsForbidden(err)) {\n return Promise.reject(new AnzuApiForbiddenError(err))\n }\n if (axiosErrorResponseHasValidationData(err)) {\n return Promise.reject(new AnzuApiValidationError(err, system, entity, err))\n }\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n return Promise.reject(new AnzuApiForbiddenOperationError(err, err))\n }\n return Promise.reject(new AnzuFatalError(err))\n }\n}\n","import { isAnzuApiValidationError } from '@/model/error/AnzuApiValidationError'\nimport { isAnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { isAnzuApiForbiddenError } from '@/model/error/AnzuApiForbiddenError'\nimport { isAnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\n\nexport function useErrors() {\n return {\n isAnzuFatalError,\n isAnzuApiForbiddenError,\n isAnzuApiValidationError,\n isAnzuApiResponseCodeError,\n }\n}\n","import type { AxiosInstance } from 'axios'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport type { JobBase } from '@/types/Job'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport { apiCreateOne } from '@/services/api/apiCreateOne'\nimport { apiDeleteOne } from '@/services/api/apiDeleteOne'\nimport { stringToKebabCase } from '@/utils/string'\n\nconst END_POINT = '/adm/v1/job'\nexport const ENTITY = 'job'\n\nexport function useJobApi<JobType extends JobBase = JobBase>(client: () => AxiosInstance, system: string) {\n const fetchJobList = (pagination: Pagination, filterBag: FilterBag) =>\n apiFetchList<JobType[]>(client, END_POINT, {}, pagination, filterBag, system, ENTITY)\n\n const fetchJob = (id: number) => apiFetchOne<JobType>(client, END_POINT + '/:id', { id }, system, ENTITY)\n\n const createJob = (data: JobType) => {\n const type = stringToKebabCase(data._resourceName)\n .slice(4) // remove \"job-\" prefix\n .replace('-kind-', '-kind/') // replace \"-kind-\" with \"-kind/\" if the needle is found\n\n return apiCreateOne<JobType>(client, data, END_POINT + '/:type', { type }, system, ENTITY)\n }\n\n const deleteJob = (id: number) => apiDeleteOne<JobType>(client, END_POINT + '/:id', { id }, system, ENTITY)\n\n return {\n fetchJobList,\n fetchJob,\n createJob,\n deleteJob,\n }\n}\n","import { ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\nexport const JOB_RESOURCE_USER_DATA_DELETE = 'jobUserDataDelete'\n\nexport type JobBaseResource = typeof JOB_RESOURCE_USER_DATA_DELETE | `job${string}`\n\nexport function useJobBaseResource<T extends JobBaseResource = JobBaseResource>(\n customJobs: ValueObjectOption<T>[] = []\n) {\n const { t } = useI18n()\n\n const jobResourceOptions = ref<ValueObjectOption<T>[]>([\n ...([\n {\n value: 'jobUserDataDelete',\n title: t('common.job.jobResource.jobUserDataDelete'),\n },\n ] as unknown as ValueObjectOption<T>[]),\n ...customJobs,\n ])\n\n const getJobResourceOption = (value: T): ValueObjectOption<T> => {\n return jobResourceOptions.value.find((item) => item.value === value) as ValueObjectOption<T>\n }\n\n return {\n jobResourceOptions,\n getJobResourceOption,\n }\n}\n","import type { App, DeepReadonly, Ref, UnwrapRef } from 'vue'\nimport type { AnzuUser } from '@/types/AnzuUser'\nimport Acl from '@/components/permission/Acl.vue'\nimport Notification from '@kyvg/vue3-notification'\nimport type { LanguageCode } from '@/composables/languageSettings'\nimport { AvailableLanguagesSymbol, DefaultLanguageSymbol } from '@/components/injectionKeys'\nimport type { AxiosInstance } from 'axios'\nimport { initCommonAdminImageOptions } from '@/components/damImage/composables/commonAdminImageOptions'\nimport { initCommonAdminCoreDamOptions } from '@/components/dam/assetSelect/composables/commonAdminCoreDamOptions'\nimport { initCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nexport type PluginOptions = {\n languages: { available: LanguageCode[]; default: LanguageCode }\n coreDam?: CommonAdminCoreDamOptions\n image?: CommonAdminImageOptions\n collab?: CommonAdminCollabOptions\n}\n\nexport type CurrentUserType = DeepReadonly<Ref<UnwrapRef<AnzuUser | undefined>>>\n\nexport interface CommonAdminImageConfig {\n imageClient: () => AxiosInstance\n previewDomain: string\n width: number\n height: number\n}\n\nexport type CommonAdminImageOptions =\n | undefined\n | {\n configs: { [key: string]: CommonAdminImageConfig }\n }\n\nexport interface CommonAdminCoreDamConfig {\n damClient: () => AxiosInstance\n}\n\nexport type CommonAdminCoreDamOptions =\n | undefined\n | {\n configs: { [key: string]: CommonAdminCoreDamConfig }\n apiTimeout: number\n uploadStatusFallback: boolean\n notification: {\n enabled: boolean\n webSocketUrl: string\n }\n }\n\nexport type CommonAdminCollabOptions =\n | {\n enabled: boolean\n socketUrl: string\n }\n\nexport default {\n install(app: App, options: PluginOptions): void {\n app.provide(AvailableLanguagesSymbol, options.languages.available)\n app.provide(DefaultLanguageSymbol, options.languages.default)\n app.component('Acl', Acl)\n app.use(Notification, { componentName: 'Notifications' })\n initCommonAdminImageOptions(options.image)\n initCommonAdminCoreDamOptions(options.coreDam)\n initCommonAdminCollabOptions(options.collab)\n },\n}\n","export const arrayItemToggle = <T>(array: Array<T>, value: T) => {\n const index = array.indexOf(value)\n if (index === -1) {\n array.push(value)\n return\n }\n array.splice(index, 1)\n}\n\nexport const arrayToString = (values: Array<string | number>, separator = ', ') => values.join(separator)\n\nexport const arrayFromArgs = <T>(...args: [T[]]) => Array.from(...args)\n\nexport type NestedArray<T> = Array<NestedArray<T> | T>\n\nexport const arrayFlatten = <T>(input: NestedArray<T>, acc: T[] = []): T[] => {\n return input.reduce((_: T[], current) => {\n if (Array.isArray(current)) return arrayFlatten(current, acc)\n acc.push(current)\n return acc\n }, [])\n}\n\nexport const arraysHaveSameElements = <T>(array1: T[], array2: T[]): boolean => {\n if (array1.length !== array2.length) {\n return false\n }\n\n // Sort both arrays\n const sortedArray1 = array1.slice().sort()\n const sortedArray2 = array2.slice().sort()\n\n // Compare the sorted arrays\n for (let i = 0; i < sortedArray1.length; i++) {\n if (sortedArray1[i] !== sortedArray2[i]) {\n return false\n }\n }\n\n return true\n}\n","import type { RouteLocationRaw, Router } from 'vue-router'\n\nexport const browserHistoryReplaceUrlByString = (path: string) => {\n history.replaceState(history.state, '', path)\n}\n\nexport const browserHistoryReplaceUrlByRouter = (router: Router, to: RouteLocationRaw) => {\n const resolved = router.resolve(to)\n browserHistoryReplaceUrlByString(resolved.href)\n}\n","import alert from '@/locales/cs/common/alert.json'\nimport button from '@/locales/cs/common/button.json'\nimport model from '@/locales/cs/common/model.json'\nimport system from '@/locales/cs/common/system.json'\nimport anzuUser from '@/locales/cs/common/anzuUser.json'\nimport job from '@/locales/cs/common/job.json'\nimport log from '@/locales/cs/common/log.json'\nimport permission from '@/locales/cs/common/permission.json'\nimport permissionGroup from '@/locales/cs/common/permissionGroup.json'\nimport vuetify from '@/locales/cs/vuetify.json'\nimport apiValidation from '@/locales/cs/error/apiValidation.json'\nimport apiForbiddenOperation from '@/locales/cs/error/apiForbiddenOperation.json'\nimport jsValidation from '@/locales/cs/error/jsValidation.json'\nimport assetSelect from '@/locales/cs/common/assetSelect.json'\nimport subjectSelect from '@/locales/cs/common/subjectSelect.json'\nimport time from '@/locales/cs/common/time.json'\nimport sortable from '@/locales/cs/common/sortable.json'\nimport damImage from '@/locales/cs/common/damImage.json'\nimport collab from '@/locales/cs/common/collab.json'\n\nexport default {\n common: {\n alert,\n button,\n model,\n system,\n anzuUser,\n job,\n log,\n permission,\n permissionGroup,\n assetSelect,\n subjectSelect,\n time,\n sortable,\n damImage,\n collab,\n },\n $vuetify: vuetify,\n error: {\n apiValidation: {\n ...apiValidation,\n },\n apiForbiddenOperation: {\n ...apiForbiddenOperation,\n },\n jsValidation: {\n ...jsValidation,\n },\n },\n}\n","import vuetify from '@/locales/en/vuetify.json'\nimport alert from '@/locales/en/common/alert.json'\nimport button from '@/locales/en/common/button.json'\nimport model from '@/locales/en/common/model.json'\nimport system from '@/locales/en/common/system.json'\nimport anzuUser from '@/locales/en/common/anzuUser.json'\nimport job from '@/locales/en/common/job.json'\nimport log from '@/locales/en/common/log.json'\nimport permission from '@/locales/en/common/permission.json'\nimport permissionGroup from '@/locales/en/common/permissionGroup.json'\nimport apiValidation from '@/locales/en/error/apiValidation.json'\nimport jsValidation from '@/locales/en/error/jsValidation.json'\nimport apiForbiddenOperation from '@/locales/en/error/apiForbiddenOperation.json'\nimport assetSelect from '@/locales/en/common/assetSelect.json'\nimport subjectSelect from '@/locales/en/common/subjectSelect.json'\nimport time from '@/locales/en/common/time.json'\nimport sortable from '@/locales/en/common/sortable.json'\nimport damImage from '@/locales/en/common/damImage.json'\nimport collab from '@/locales/en/common/collab.json'\n\nexport default {\n common: {\n alert,\n button,\n model,\n system,\n anzuUser,\n job,\n log,\n permission,\n permissionGroup,\n assetSelect,\n subjectSelect,\n time,\n sortable,\n damImage,\n collab,\n },\n $vuetify: vuetify,\n error: {\n apiValidation: {\n ...apiValidation,\n },\n apiForbiddenOperation: {\n ...apiForbiddenOperation,\n },\n jsValidation: {\n ...jsValidation,\n },\n },\n}\n","import alert from '@/locales/sk/common/alert.json'\nimport button from '@/locales/sk/common/button.json'\nimport model from '@/locales/sk/common/model.json'\nimport system from '@/locales/sk/common/system.json'\nimport anzuUser from '@/locales/sk/common/anzuUser.json'\nimport job from '@/locales/sk/common/job.json'\nimport log from '@/locales/sk/common/log.json'\nimport permission from '@/locales/sk/common/permission.json'\nimport permissionGroup from '@/locales/sk/common/permissionGroup.json'\nimport vuetify from '@/locales/sk/vuetify.json'\nimport apiValidation from '@/locales/sk/error/apiValidation.json'\nimport apiForbiddenOperation from '@/locales/sk/error/apiForbiddenOperation.json'\nimport jsValidation from '@/locales/sk/error/jsValidation.json'\nimport assetSelect from '@/locales/sk/common/assetSelect.json'\nimport subjectSelect from '@/locales/sk/common/subjectSelect.json'\nimport time from '@/locales/sk/common/time.json'\nimport sortable from '@/locales/sk/common/sortable.json'\nimport damImage from '@/locales/sk/common/damImage.json'\nimport collab from '@/locales/sk/common/collab.json'\n\nexport default {\n common: {\n alert,\n button,\n model,\n system,\n anzuUser,\n job,\n log,\n permission,\n permissionGroup,\n assetSelect,\n subjectSelect,\n time,\n sortable,\n damImage,\n collab,\n },\n $vuetify: vuetify,\n error: {\n apiValidation: {\n ...apiValidation,\n },\n apiForbiddenOperation: {\n ...apiForbiddenOperation,\n },\n jsValidation: {\n ...jsValidation,\n },\n },\n}\n","import { VBtn, VChip } from 'vuetify/components'\n\nexport const useCommonVuetifyConfig = () => {\n const commonTheme = () => {\n return {\n defaultTheme: 'light',\n variations: {\n colors: [],\n lighten: 0,\n darken: 0,\n },\n themes: {\n light: {\n dark: false,\n colors: {\n background: '#ffffff',\n surface: '#ffffff',\n 'on-surface': '#333',\n primary: '#3f6ad8',\n secondary: '#E0E0E0',\n 'on-secondary': '#333',\n success: '#3ac47d',\n 'on-success': '#fff',\n warning: '#FB8C00',\n error: '#d92550',\n info: '#78c3fb',\n },\n variables: {},\n },\n dark: {\n dark: true,\n colors: {\n background: '#1A1A1A',\n surface: '#1A1A1A',\n primary: '#3f6ad8',\n secondary: '#E0E0E0',\n 'on-secondary': '#333',\n success: '#3ac47d',\n warning: '#FB8C00',\n error: '#d92550',\n info: '#78c3fb',\n },\n variables: {},\n },\n },\n }\n }\n\n const commonDefaults = () => {\n return {\n global: {},\n VTextField: {\n variant: 'underlined',\n density: 'compact',\n color: 'primary',\n },\n VTextarea: {\n variant: 'underlined',\n density: 'compact',\n color: 'primary',\n },\n VSelect: {\n variant: 'underlined',\n density: 'compact',\n color: 'primary',\n },\n VAutocomplete: {\n variant: 'underlined',\n density: 'compact',\n color: 'primary',\n clearOnSelect: true,\n },\n VCombobox: {\n variant: 'underlined',\n density: 'compact',\n color: 'primary',\n },\n VSwitch: {\n color: 'success',\n density: 'compact',\n },\n VCard: {\n variant: 'flat',\n },\n VDialog: {\n noClickAnimation: true,\n persistent: true,\n },\n VProgressCircular: {\n color: 'primary',\n },\n VBtn: {\n variant: 'flat',\n },\n ABtnPrimary: {\n variant: 'flat',\n color: 'primary',\n },\n ABtnSecondary: {\n variant: 'outlined',\n color: 'primary',\n },\n ABtnTertiary: {\n variant: 'text',\n color: 'primary',\n },\n ABtnIcon: {\n variant: 'text',\n icon: true,\n },\n }\n }\n\n const commonAliases = () => {\n return {\n ABtnPrimary: VBtn as any,\n ABtnSecondary: VBtn as any,\n ABtnTertiary: VBtn as any,\n ABtnIcon: VBtn as any,\n AChipNoLink: VChip as any,\n }\n }\n\n return {\n commonAliases,\n commonDefaults,\n commonTheme,\n }\n}\n","type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...0[]]\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\nexport type ObjectPaths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, ObjectPaths<T[K], Prev[D]>> : never\n }[keyof T]\n : ''\n\nexport type ObjectLeaves<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? { [K in keyof T]-?: Join<K, ObjectLeaves<T[K], Prev[D]>> }[keyof T]\n : ''\n\nexport type Prettify<T> = {\n [K in keyof T]: T[K]\n} & {}\n\nexport type UniqueValues<T extends Record<string, any>> = {\n [K in keyof T]: Exclude<T[K], T[Exclude<keyof T, K>]>\n}\n\nexport function ensureUniqueValues<T extends Record<string, any>>(obj: UniqueValues<T>): UniqueValues<T> {\n return obj\n}\n","export async function loadCommonFonts() {\n const webfontloader = await import('webfontloader')\n\n webfontloader.load({\n google: {\n families: ['Roboto:100,300,400,500,700,900&display=swap'],\n },\n // urls: ['https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css']\n })\n}\n","import type { JobBase, JobUserDataDelete } from '@/types/Job'\nimport { JobStatusDefault } from '@/model/valueObject/JobStatus'\nimport { dateTimeNow } from '@/utils/datetime'\nimport type { JobBaseResource } from '@/model/valueObject/JobBaseResource'\n\nexport function useCommonJobFactory() {\n const createBase = (resourceName: JobBaseResource, system: string): JobBase => {\n return {\n id: 0,\n scheduledAt: dateTimeNow(),\n priority: 1,\n status: JobStatusDefault,\n result: '',\n batchProcessedIterationCount: 0,\n finishedAt: null,\n startedAt: null,\n lastBatchProcessedRecord: '',\n createdAt: dateTimeNow(),\n modifiedAt: dateTimeNow(),\n createdBy: null,\n modifiedBy: null,\n _resourceName: resourceName,\n _system: system,\n }\n }\n\n const createUserDataDelete = (system: string): JobUserDataDelete => {\n return {\n ...createBase('jobUserDataDelete', system),\n ...{\n targetUserId: null,\n anonymizeUser: false,\n },\n }\n }\n\n return {\n createBase,\n createUserDataDelete,\n }\n}\n","import { readonly, ref } from 'vue'\nimport type { RouteLocationNormalized } from 'vue-router'\nimport { isNull } from '@/utils/common'\n\nexport const LoginState = {\n Success: 'success',\n FailureSsoCommunicationFailed: 'failure-sso-communication',\n FailureInternalError: 'failure-internal-error',\n FailureUnauthorized: 'failure-unauthorized',\n} as const\nexport type JobStatusType = (typeof LoginState)[keyof typeof LoginState]\n\nconst status = ref<string | null>(null)\n\nexport function useLoginStatus(to: RouteLocationNormalized) {\n if (to.query.loginState) {\n status.value = to.query.loginState.toString()\n }\n\n const isStatusNotDefined = () => isNull(status.value)\n const isStatusLoginSuccess = () => status.value === LoginState.Success\n const isStatusSsoCommunicationFailure = () => status.value === LoginState.FailureSsoCommunicationFailed\n const isStatusInternalErrorFailure = () => status.value === LoginState.FailureInternalError\n const isStatusUnauthorized = () => status.value === LoginState.FailureUnauthorized\n\n return {\n status: readonly(status),\n isStatusNotDefined,\n isStatusLoginSuccess,\n isStatusSsoCommunicationFailure,\n isStatusInternalErrorFailure,\n isStatusUnauthorized,\n }\n}\n","import type { AxiosInstance } from 'axios'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport type { DamCurrentUserDto } from '@/types/coreDam/DamCurrentUser'\n\nconst END_POINT = '/adm/users/current'\n\nexport const fetchDamCurrentUser = (client: () => AxiosInstance) =>\n apiFetchOne<DamCurrentUserDto>(client, END_POINT, {}, 'coreDam', 'user')\n","import type {\n CollabRoom,\n CollabRoomData,\n CollabRoomInfo,\n CollabRoomLocks,\n CollabRoomPlainData,\n} from '@/components/collab/types/Collab'\nimport { CollabStatus } from '@/components/collab/types/Collab'\nimport { io } from 'socket.io-client'\nimport {\n useCollabApprovedJoinRequestEventBus,\n useCollabApprovedRequestToTakeModerationEventBus,\n useCollabJoinRequestEventBus,\n useCollabKickedFromRoomEventBus,\n useCollabReconnectEventBus,\n useCollabRejectedJoinRequestEventBus,\n useCollabRejectedRequestToTakeModerationEventBus,\n useCollabRequestToTakeModerationEventBus,\n useCollabRoomDataChangeEventBus,\n useCollabStartingEventBus,\n} from '@/components/collab/composables/collabEventBus'\nimport { useCollabState } from '@/components/collab/composables/collabState'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\n\nexport function useCollabInit() {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { showWarningT, showSuccessT } = useAlerts()\n const { collabConnected, collabSocket, collabRoomInfoState, collabFieldLocksState } = useCollabState()\n\n const initCollab = () => {\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const reconnectEventBus = useCollabReconnectEventBus()\n const collabStartingEventBus = useCollabStartingEventBus()\n const requestAccessEventBus = useCollabJoinRequestEventBus()\n const approvedJoinRequestEventBus = useCollabApprovedJoinRequestEventBus()\n const rejectedJoinRequestEventBus = useCollabRejectedJoinRequestEventBus()\n const requestToTakeModerationEventBus = useCollabRequestToTakeModerationEventBus()\n const approvedRequestToTakeModerationEventBus = useCollabApprovedRequestToTakeModerationEventBus()\n const rejectedRequestToTakeModerationEventBus = useCollabRejectedRequestToTakeModerationEventBus()\n const kickedFromRoomEventBus = useCollabKickedFromRoomEventBus()\n\n if (collabSocket.value || !collabOptions.value.enabled) {\n return\n }\n\n collabSocket.value = io(collabOptions.value.socketUrl, {\n transports: ['websocket'],\n path: '/ws',\n forceNew: true,\n })\n collabSocket.value.on('collabRoomChanged', (room: CollabRoomInfo) => {\n try {\n if (collabRoomInfoState.has(room.name)) {\n collabRoomInfoState.set(room.name, room)\n }\n } catch (error) {\n console.error('error', error)\n }\n })\n collabSocket.value.on('collabRoomLocksChanged', (room: CollabRoom, locks: CollabRoomLocks) => {\n const locksEntries = Object.entries(locks)\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map(locksEntries))\n }\n for (const [field, lock] of locksEntries) {\n if (!lock) {\n collabFieldLocksState.get(room)?.delete(field)\n continue\n }\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n })\n collabSocket.value.on('collabRoomDataChanged', (room: CollabRoom, data: CollabRoomData) => {\n const dataEntries = Object.entries(data)\n for (const [field, fieldData] of dataEntries) {\n changeEventBus.emit({ room, field }, fieldData)\n }\n })\n collabSocket.value?.on('requestToJoin', (room: CollabRoom, userId: number, timestamp: number) => {\n requestAccessEventBus.emit({ room, userId, timestamp })\n })\n collabSocket.value?.on('approvedRequestToJoin', (room: CollabRoom) => {\n approvedJoinRequestEventBus.emit({ room })\n })\n collabSocket.value?.on('rejectedRequestToJoin', (room: CollabRoom) => {\n rejectedJoinRequestEventBus.emit({ room })\n })\n collabSocket.value?.on('requestToTakeModeration', (room: CollabRoom, userId: number, timestamp: number) => {\n requestToTakeModerationEventBus.emit({ room, userId, timestamp })\n })\n collabSocket.value?.on('approvedRequestToTakeModeration', (room: CollabRoom) => {\n approvedRequestToTakeModerationEventBus.emit({ room })\n })\n collabSocket.value?.on('rejectedRequestToTakeModeration', (room: CollabRoom) => {\n rejectedRequestToTakeModerationEventBus.emit({ room })\n })\n collabSocket.value?.on('transferredModeration', () => {\n showSuccessT('common.collab.alert.transferredModeration')\n })\n collabSocket.value?.on('kickedFromRoom', (room: CollabRoom) => {\n showWarningT('common.collab.alert.kickedFromRoom')\n kickedFromRoomEventBus.emit({ room })\n })\n collabSocket.value?.on('startCollab', async (room, callback: (data: CollabRoomPlainData) => void) => {\n collabStartingEventBus.emit({ room, startedCallback: callback })\n })\n collabSocket.value.on('connect', () => {\n collabRoomInfoState.clear()\n const connectedBefore = collabConnected.value\n collabConnected.value = collabSocket.value?.connected ?? false\n if (!connectedBefore) {\n reconnectEventBus.emit('reconnect')\n }\n })\n collabSocket.value.on('connect_error', () => {\n collabConnected.value = collabSocket.value?.connected ?? false\n })\n collabSocket.value.on('disconnect', (reason) => {\n collabRoomInfoState.forEach((roomInfo: CollabRoomInfo) => (roomInfo.status = CollabStatus.Inactive))\n collabConnected.value = collabSocket.value?.connected ?? false\n if (reason === 'io server disconnect') {\n collabSocket.value?.connect()\n }\n })\n }\n\n return {\n initCollab,\n }\n}\n","import type { CollabFieldName, CollabRoom } from '@/components/collab/types/Collab'\nimport type { DocId, IntegerId } from '@/types/common'\nimport type { CachedItem } from '@/composables/system/defineCached'\nimport type { AnzuUserMinimal } from '@/types/AnzuUser'\n\nexport const COLLAB_FIELD_PREFIX_EMBED = 'embed:'\nexport const COLLAB_FIELD_PREFIX_COMMENT = 'comment:'\n\nexport type CollabCachedUsersMap = Map<IntegerId, CachedItem<AnzuUserMinimal>>\n\nexport function useCollabHelpers() {\n const createCollabRoom = (id: IntegerId | DocId, entity: string, system: string) => {\n return (system + ':' + entity + ':' + id) as CollabRoom\n }\n\n const createCollabFieldConfig = (name: CollabFieldName, room: CollabRoom, cachedUsers: CollabCachedUsersMap ) => {\n return { room, field: name, cachedUsers }\n }\n\n const createCollabEmbedFieldName = (id: DocId) => {\n return COLLAB_FIELD_PREFIX_EMBED + id as CollabFieldName\n }\n\n const createCollabCommentFieldName = (id: DocId) => {\n return COLLAB_FIELD_PREFIX_COMMENT + id as CollabFieldName\n }\n\n return {\n createCollabRoom,\n createCollabFieldConfig,\n createCollabEmbedFieldName,\n createCollabCommentFieldName,\n }\n}\n","import {\n type CollabChangeRoomLockCallbackTypes,\n type CollabFieldData,\n type CollabFieldDataEnvelope,\n type CollabFieldLockOptions,\n type CollabFieldName,\n type CollabRoom,\n CollabStatus,\n isCollabFailedChangeRoomLockCallback,\n isCollabSuccessChangeRoomLockCallback,\n} from '@/components/collab/types/Collab'\nimport { type MaybeRef, ref, unref } from 'vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusEvent,\n CollabFieldLockType,\n type CollabRoomDataChangedEvent,\n createFieldLockStatusPayload,\n useCollabFieldLockStatusEventBus,\n useCollabRoomDataChangeEventBus,\n} from '@/components/collab/composables/collabEventBus'\nimport { type Fn, tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCommonAdminCollabOptions } from '@/components/collab/composables/commonAdminCollabOptions'\nimport { useCollabState } from '@/components/collab/composables/collabState'\nimport { cloneDeep, isDefined, isUndefined } from '@/utils/common'\nimport { objectSetValueByPath } from '@/utils/object'\n\nexport function useCollabAnyDataChange(room: CollabRoom, disableAutoUnsubscribe = false) {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { collabSocket, collabFieldLocksState, collabFieldDataBufferState, collabRoomInfoState } = useCollabState()\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const fieldLockStatusEventBus = useCollabFieldLockStatusEventBus()\n\n const anyChangeCallback = ref<undefined | ((field: CollabFieldName, payload: CollabFieldDataEnvelope) => void)>()\n const unsubscribeCollabAnyDataChangeListener = ref<undefined | Fn>()\n\n const anyChangeEventBusListener = (event: CollabRoomDataChangedEvent, payload?: CollabFieldDataEnvelope) => {\n if (event.room !== room || isUndefined(payload) || isUndefined(anyChangeCallback.value)) {\n return\n }\n anyChangeCallback.value(event.field, payload)\n }\n\n const addCollabAnyDataChangeListener = (\n callback: (field: CollabFieldName, data: CollabFieldDataEnvelope) => void\n ) => {\n anyChangeCallback.value = callback\n unsubscribeCollabAnyDataChangeListener.value = changeEventBus.on(anyChangeEventBusListener)\n }\n\n const changeCollabAnyData = (field: CollabFieldName, data: CollabFieldData, callback: Fn | undefined = undefined) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n collabSocket.value.emit('changeFieldData', room, field, data, () => {\n if (!isUndefined(callback)) callback()\n })\n }\n\n const objectSetDataByField = <T extends object>(\n field: CollabFieldName,\n data: CollabFieldDataEnvelope,\n objectToUpdate: MaybeRef<T>\n ) => {\n const object = unref(objectToUpdate)\n switch (data.type) {\n case 'json':\n {\n objectSetValueByPath(object, field, cloneDeep(data.value))\n }\n break\n default: {\n objectSetValueByPath(object, field, data.value)\n }\n }\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeCollabAnyDataChangeListener.value)) {\n unsubscribeCollabAnyDataChangeListener.value()\n }\n })\n\n const acquireCollabAnyLock = (field: CollabFieldName, options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value\n ?.timeout(1000)\n .emit('acquireFieldLock', room, field, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n const locks = new Map(Object.entries(response.locks))\n for (const [field, lock] of locks.entries()) {\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const releaseCollabAnyLock = (\n field: CollabFieldName,\n data: CollabFieldData,\n options: Partial<CollabFieldLockOptions> = {}\n ) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) {\n if (!collabFieldDataBufferState.has(room)) {\n collabFieldDataBufferState.set(room, new Map())\n }\n collabFieldDataBufferState.get(room)?.set(field, data)\n return\n }\n collabSocket.value\n ?.timeout(1000)\n .emit('releaseFieldLock', room, field, data, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n for (const field of Object.keys(response.locks)) {\n collabFieldLocksState.get(room)?.delete(field)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n return {\n addCollabAnyDataChangeListener,\n unsubscribeCollabAnyDataChangeListener,\n changeCollabAnyData,\n objectSetDataByField,\n acquireCollabAnyLock,\n releaseCollabAnyLock,\n }\n}\n","import type { AxiosInstance } from 'axios'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport type { DamAssetLicence } from '@/types/coreDam/AssetLicence'\nimport type { IntegerId } from '@/types/common'\n\nconst END_POINT = '/adm/v1/asset-licence'\nexport const ENTITY = 'assetLicence'\n\nexport const fetchDamAssetLicenceListByIds = (client: () => AxiosInstance, ids: IntegerId[]) =>\n apiFetchByIds<DamAssetLicence[]>(client, ids, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchDamAssetLicenceList = (client: () => AxiosInstance, pagination: Pagination, filterBag: FilterBag) =>\n apiFetchList<DamAssetLicence[]>(client, END_POINT, {}, pagination, filterBag, SYSTEM_CORE_DAM, ENTITY)\n","import { reactive } from 'vue'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { ENTITY } from '@/components/dam/user/assetLicenceApi'\nimport { makeFilterHelper } from '@/composables/filter/filterHelpers'\n\nconst makeFilter = makeFilterHelper(SYSTEM_CORE_DAM, ENTITY)\nexport function useDamAssetLicenceFilter() {\n return reactive({\n name: {\n ...makeFilter({ name: 'name', variant: 'startsWith' }),\n },\n extSystem: {\n ...makeFilter({ name: 'extSystem', default: null }),\n },\n extId: {\n ...makeFilter({ name: 'extId', default: null }),\n },\n })\n}\n","import type { DamAssetLicence } from '@/types/coreDam/AssetLicence'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { fetchDamAssetLicenceList, fetchDamAssetLicenceListByIds } from '@/components/dam/user/assetLicenceApi'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\n\nexport const useAssetLicenceSelectActions = (client: () => AxiosInstance) => {\n const mapToValueObjectOption = (assetLicences: DamAssetLicence[]): ValueObjectOption<IntegerId>[] => {\n return assetLicences.map((assetLicence: DamAssetLicence) => ({\n title: assetLicence.name,\n value: assetLicence.id,\n }))\n }\n\n const fetchItems = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToValueObjectOption(await fetchDamAssetLicenceList(client, pagination, filterBag))\n }\n\n const fetchItemsByIds = async (ids: IntegerId[]) => {\n return mapToValueObjectOption(await fetchDamAssetLicenceListByIds(client, ids))\n }\n\n return {\n fetchItems,\n fetchItemsByIds,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed, watch } from 'vue'\nimport type { IntegerId } from '@/types/common'\nimport { cloneDeep } from '@/utils/common'\nimport AFormRemoteAutocomplete from '@/components/form/AFormRemoteAutocomplete.vue'\nimport { useDamAssetLicenceFilter } from '@/components/dam/user/AssetLicenceFilter'\nimport { useAssetLicenceSelectActions } from '@/components/dam/user/assetLicenceActions'\nimport type { AxiosInstance } from 'axios'\nimport type { ValueObjectOption } from '@/types/ValueObject'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerId | null | IntegerId[] | any\n client: () => AxiosInstance,\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n dataCy?: string\n extSystemId?: IntegerId | null\n hideDetails?: boolean\n disableInitFetch?: boolean\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n dataCy: '',\n extSystemId: null,\n hideDetails: undefined,\n disableInitFetch: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: IntegerId | null | IntegerId[] | any): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: IntegerId | null | IntegerId[] | any) {\n emit('update:modelValue', cloneDeep<IntegerId | null | IntegerId[] | any>(newValue))\n },\n})\n\nconst selected = defineModel<ValueObjectOption<IntegerId>[]>('selected', { required: false, default: () => [] })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItems, fetchItemsByIds } = useAssetLicenceSelectActions(props.client)\n\nconst innerFilter = useDamAssetLicenceFilter()\n\nconst selectedExtSystemId = computed(() => {\n return props.extSystemId\n})\n\nwatch(\n selectedExtSystemId,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n modelValueComputed.value = null\n if (newValue) {\n innerFilter.extSystem.model = newValue\n return\n }\n innerFilter.extSystem.model = null\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <AFormRemoteAutocomplete\n :key=\"selectedExtSystemId + ''\"\n v-model=\"modelValueComputed\"\n v-model:selected=\"selected\"\n :required=\"required\"\n :label=\"label\"\n :fetch-items=\"fetchItems\"\n :fetch-items-by-ids=\"fetchItemsByIds\"\n :inner-filter=\"innerFilter\"\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n filter-by-field=\"name\"\n :data-cy=\"dataCy\"\n :hide-details=\"hideDetails\"\n :disable-init-fetch=\"disableInitFetch\"\n />\n</template>\n","import type { AxiosInstance } from 'axios'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport type { IntegerId } from '@/types/common'\nimport type { DamAssetLicenceGroup } from '@/types/coreDam/AssetLicenceGroup'\n\nconst END_POINT = '/adm/v1/asset-licence-group'\nexport const ENTITY = 'assetLicenceGroup'\n\nexport const fetchDamAssetLicenceGroupListByIds = (client: () => AxiosInstance, ids: IntegerId[]) =>\n apiFetchByIds<DamAssetLicenceGroup[]>(client, ids, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY, {}, true)\n\nexport const fetchDamAssetLicenceGroupList = (\n client: () => AxiosInstance,\n pagination: Pagination,\n filterBag: FilterBag\n) => apiFetchList<DamAssetLicenceGroup[]>(client, END_POINT, {}, pagination, filterBag, SYSTEM_CORE_DAM, ENTITY)\n","import type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\nimport type { DamAssetLicenceGroup } from '@/types/coreDam/AssetLicenceGroup'\nimport {\n fetchDamAssetLicenceGroupList,\n fetchDamAssetLicenceGroupListByIds\n} from '@/components/dam/user/assetLicenceGroupApi'\n\nexport const useAssetLicenceGroupSelectActions = (client: () => AxiosInstance) => {\n const mapToValueObjectOption = (assetLicenceGroups: DamAssetLicenceGroup[]): ValueObjectOption<IntegerId>[] => {\n return assetLicenceGroups.map((assetLicence: DamAssetLicenceGroup) => ({\n title: assetLicence.name,\n value: assetLicence.id,\n }))\n }\n\n const fetchItems = async (pagination: Pagination, filterBag: FilterBag) => {\n return mapToValueObjectOption(await fetchDamAssetLicenceGroupList(client, pagination, filterBag))\n }\n\n const fetchItemsByIds = async (ids: number[]) => {\n return mapToValueObjectOption(await fetchDamAssetLicenceGroupListByIds(client, ids))\n }\n\n return {\n fetchItems,\n fetchItemsByIds,\n }\n}\n","import { reactive } from 'vue'\nimport { makeFilterHelper } from '@/composables/filter/filterHelpers'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { ENTITY } from '@/components/dam/user/assetLicenceGroupApi'\n\nconst makeFilter = makeFilterHelper(SYSTEM_CORE_DAM, ENTITY)\n\nexport function useDamAssetLicenceGroupFilter() {\n return reactive({\n name: {\n ...makeFilter({ name: 'name', variant: 'startsWith' }),\n },\n })\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { IntegerId } from '@/types/common'\nimport type { AxiosInstance } from 'axios'\nimport { cloneDeep } from '@/utils/common'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport AFormRemoteAutocomplete from '@/components/form/AFormRemoteAutocomplete.vue'\nimport { useAssetLicenceGroupSelectActions } from '@/components/dam/user/assetLicenceGroupActions'\nimport { useDamAssetLicenceGroupFilter } from '@/components/dam/user/AssetLicenceGroupFilter'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerId | null | IntegerId[] | any\n client: () => AxiosInstance\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n dataCy?: string\n hideDetails?: boolean\n disableInitFetch?: boolean\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n dataCy: '',\n hideDetails: undefined,\n disableInitFetch: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: IntegerId | null | IntegerId[] | any): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: IntegerId | null | IntegerId[] | any) {\n emit('update:modelValue', cloneDeep<IntegerId | null | IntegerId[] | any>(newValue))\n },\n})\n\nconst selected = defineModel<ValueObjectOption<IntegerId>[]>('selected', { required: false, default: () => [] })\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItems, fetchItemsByIds } = useAssetLicenceGroupSelectActions(props.client)\n\nconst innerFilter = useDamAssetLicenceGroupFilter()\n</script>\n\n<template>\n <AFormRemoteAutocomplete\n v-model=\"modelValueComputed\"\n v-model:selected=\"selected\"\n :required=\"required\"\n :label=\"label\"\n :fetch-items=\"fetchItems\"\n :fetch-items-by-ids=\"fetchItemsByIds\"\n :inner-filter=\"innerFilter\"\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n filter-by-field=\"name\"\n :data-cy=\"dataCy\"\n :hide-details=\"hideDetails\"\n :disable-init-fetch=\"disableInitFetch\"\n />\n</template>\n","import type { DamExtSystem } from '@/components/damImage/uploadQueue/composables/DamExtSystem'\nimport { apiFetchByIds } from '@/services/api/apiFetchByIds'\nimport { apiFetchList } from '@/services/api/apiFetchList'\nimport type { AxiosInstance } from 'axios'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport type { IntegerId } from '@/types/common'\n\nconst END_POINT = '/adm/v1/ext-system'\nexport const ENTITY = 'extSystem'\n\nexport const fetchDamExtSystemListByIds = (client: () => AxiosInstance, ids: IntegerId[]) =>\n apiFetchByIds<DamExtSystem[]>(client, ids, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY)\n\nexport const fetchDamExtSystemList = (client: () => AxiosInstance, pagination: Pagination, filterBag: FilterBag) =>\n apiFetchList<DamExtSystem[]>(client, END_POINT, {}, pagination, filterBag, SYSTEM_CORE_DAM, ENTITY)\n","import type { Pagination } from '@/types/Pagination'\nimport type { FilterBag } from '@/types/Filter'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { DamExtSystem } from '@/components/damImage/uploadQueue/composables/DamExtSystem'\nimport type { AxiosInstance } from 'axios'\nimport { fetchDamExtSystemList, fetchDamExtSystemListByIds } from '@/components/dam/user/extSystemApi'\nimport type { IntegerId } from '@/types/common'\n\nexport const useExtSystemSelectActions = (client: () => AxiosInstance) => {\n const fetchItems = async (pagination: Pagination, filterBag: FilterBag) => {\n const extSystems = await fetchDamExtSystemList(client, pagination, filterBag)\n\n return <ValueObjectOption<IntegerId>[]>extSystems.map((extSystem: DamExtSystem) => ({\n title: extSystem.slug,\n value: extSystem.id,\n }))\n }\n\n const fetchItemsByIds = async (ids: IntegerId[]) => {\n const extSystems = await fetchDamExtSystemListByIds(client, ids)\n\n return <ValueObjectOption<IntegerId>[]>extSystems.map((extSystem: DamExtSystem) => ({\n title: extSystem.slug,\n value: extSystem.id,\n }))\n }\n\n return {\n fetchItems,\n fetchItemsByIds,\n }\n}\n","import { reactive } from 'vue'\nimport { SYSTEM_CORE_DAM } from '@/components/damImage/uploadQueue/api/damAssetApi'\nimport { ENTITY } from '@/components/dam/user/extSystemApi'\nimport { makeFilterHelper } from '@/composables/filter/filterHelpers'\n\nconst makeFilter = makeFilterHelper(SYSTEM_CORE_DAM, ENTITY)\n\nexport function useExtSystemFilter() {\n return reactive({\n name: {\n ...makeFilter({ name: 'name', variant: 'startsWith' }),\n },\n })\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { cloneDeep } from '@/utils/common'\nimport AFormRemoteAutocomplete from '@/components/form/AFormRemoteAutocomplete.vue'\nimport { useExtSystemSelectActions } from '@/components/dam/user/extSystemActions'\nimport { useExtSystemFilter } from '@/components/dam/user/ExtSystemFilter'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: IntegerId | null | IntegerId[] | any\n client: () => AxiosInstance,\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n dataCy?: string\n hideDetails?: boolean\n disableInitFetch?: boolean\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n dataCy: '',\n hideDetails: undefined,\n disableInitFetch: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: IntegerId | null | IntegerId[] | any): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: IntegerId | null | IntegerId[] | any) {\n emit('update:modelValue', cloneDeep<IntegerId | null | IntegerId[] | any>(newValue))\n },\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetchItems, fetchItemsByIds } = useExtSystemSelectActions(props.client)\n\nconst innerFilter = useExtSystemFilter()\n</script>\n\n<template>\n <AFormRemoteAutocomplete\n v-model=\"modelValueComputed\"\n :required=\"required\"\n :label=\"label\"\n :fetch-items=\"fetchItems\"\n :fetch-items-by-ids=\"fetchItemsByIds\"\n :inner-filter=\"innerFilter\"\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n filter-by-field=\"name\"\n :data-cy=\"dataCy\"\n :hide-details=\"hideDetails\"\n :disable-init-fetch=\"disableInitFetch\"\n />\n</template>\n","import { ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\n\nexport function useDamExternalProviderAssetType() {\n const damConfigStore = useDamConfigStore()\n const all = Object.entries(damConfigStore.damPrvConfig.assetExternalProviders).map(\n ([providerName, value]): ValueObjectOption<string> => {\n return {\n value: providerName,\n title: value.title,\n }\n }\n )\n\n const allExternalProviderAssetTypeOptions = ref<ValueObjectOption<string>[]>(all)\n\n const getExternalProviderAssetTypeOption = (value: string) => {\n return allExternalProviderAssetTypeOptions.value.find((item) => item.value === value)\n }\n\n return {\n allExternalProviderAssetTypeOptions,\n getExternalProviderAssetTypeOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { cloneDeep } from '@/utils/common'\nimport { useDamExternalProviderAssetType } from '@/components/dam/user/DamExternalProviderAssetType'\nimport type { AxiosInstance } from 'axios'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string[]\n client: () => AxiosInstance\n multiple?: boolean\n label?: string\n dataCy?: string\n }>(),\n {\n multiple: false,\n label: undefined,\n dataCy: '',\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: string[]): void\n (e: 'blur', data: string[]): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: string[]) {\n emit('update:modelValue', cloneDeep<string[]>(newValue))\n },\n})\n\nconst onBlur = () => {\n emit('blur', modelValueComputed.value)\n}\n\nconst { allExternalProviderAssetTypeOptions } = useDamExternalProviderAssetType()\n</script>\n\n<template>\n <VSelect\n v-model=\"modelValueComputed\"\n :items=\"allExternalProviderAssetTypeOptions\"\n item-title=\"title\"\n item-value=\"value\"\n :label=\"label\"\n :multiple=\"multiple\"\n clearable\n chips\n no-filter\n :data-cy=\"dataCy\"\n @blur=\"onBlur\"\n />\n</template>\n","import { ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { useDamConfigStore } from '@/components/damImage/uploadQueue/composables/damConfigStore'\n\nexport function useDamDistributionServiceType() {\n const damConfigStore = useDamConfigStore()\n const all = Object.entries(damConfigStore.damPrvConfig.distributionServices).map(\n ([serviceName, value]): ValueObjectOption<string> => {\n return {\n value: serviceName,\n title: value.title,\n }\n }\n )\n\n const allDistributionServiceTypeOptions = ref<ValueObjectOption<string>[]>(all)\n\n const getDistributionServiceTypeOption = (value: string) => {\n return allDistributionServiceTypeOptions.value.find((item) => item.value === value)\n }\n\n return {\n allDistributionServiceTypeOptions,\n getDistributionServiceTypeOption,\n }\n}\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { cloneDeep } from '@/utils/common'\nimport { useDamDistributionServiceType } from '@/components/dam/user/DamDistributionServiceType'\nimport type { AxiosInstance } from 'axios'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string[]\n client: () => AxiosInstance,\n multiple?: boolean\n label?: string\n dataCy?: string\n }>(),\n {\n multiple: false,\n label: undefined,\n dataCy: '',\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: string[]): void\n (e: 'blur', data: string[]): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: string[]) {\n emit('update:modelValue', cloneDeep<string[]>(newValue))\n },\n})\n\nconst onBlur = () => {\n emit('blur', modelValueComputed.value)\n}\n\nconst { allDistributionServiceTypeOptions } = useDamDistributionServiceType()\n</script>\n\n<template>\n <VSelect\n v-model=\"modelValueComputed\"\n :items=\"allDistributionServiceTypeOptions\"\n item-title=\"title\"\n item-value=\"value\"\n :label=\"label\"\n :multiple=\"multiple\"\n clearable\n no-filter\n chips\n :data-cy=\"dataCy\"\n @blur=\"onBlur\"\n />\n</template>\n","import { type ComputedRef } from 'vue'\nimport type { DocId, IntegerId } from '@/types/common'\n\nexport interface BreadcrumbItem {\n title: string\n routeName: string\n id?: IntegerId | DocId\n routeParams?: any\n}\n\nexport interface Breadcrumbs {\n items: ComputedRef<Array<BreadcrumbItem>>\n options: BreadcrumbOptions\n}\n\nexport interface BreadcrumbOptions {\n linkLastItem: boolean\n}\n\nexport const defaultOptions: BreadcrumbOptions = {\n linkLastItem: false,\n}\n\nexport function defineBreadcrumbs(items: ComputedRef<Array<BreadcrumbItem>>, options: Partial<BreadcrumbOptions> = {}) {\n return {\n items,\n options: {\n ...defaultOptions,\n ...options,\n },\n }\n}\n"],"names":["props","__props","t","useI18n","booleanValue","computed","text","color","loadingComputed","isUndefined","value","isDefined","isNull","isNumber","isString","isArray","isFunction","isBoolean","isDocId","isInt","x","isObject","isEmptyObject","isEmptyArray","isEmpty","cloneDeep","object","isProxy","toRaw","isRef","unref","stringToInt","fallbackValue","check","stringToFloat","stringSplitOnFirstOccurrence","delimiter","index","stringToSlug","stringToKebabCase","stringTrimLength","maxLength","stringUrlTemplateReplace","template","params","newParts","path","queryString","part","key","stringUrlTemplateReplaceVueRouter","regex","match","stringNormalizeForSlotName","name","stringIsValidEmail","email","SystemScopeSymbol","SubjectScopeSymbol","AvailableLanguagesSymbol","DefaultLanguageSymbol","_a","fontSize","firstNameLastName","cached","shallowRef","loaded","cachedUsers","item","tooltip","watch","newValue","collabRoomDataChangedEventBusKey","collabReconnectEventBusKey","collabStartingEventBusKey","collabGatheringBufferDataEventBusKey","collabApprovedJoinRequestEventBusKey","collabRejectedJoinRequestEventBusKey","collabJoinRequestEventBusKey","collabApprovedRequestToTakeModerationEventBusKey","collabRejectedRequestToTakeModerationEventBusKey","collabRequestToTakeModerationEventBusKey","collabKickedFromRoomEventBusKey","useCollabRoomDataChangeEventBus","useEventBus","useCollabReconnectEventBus","useCollabStartingEventBus","useCollabGatheringBufferDataEventBus","useCollabApprovedJoinRequestEventBus","useCollabRejectedJoinRequestEventBus","useCollabJoinRequestEventBus","useCollabApprovedRequestToTakeModerationEventBus","useCollabRejectedRequestToTakeModerationEventBus","useCollabRequestToTakeModerationEventBus","useCollabKickedFromRoomEventBus","CollabFieldLockType","CollabFieldLockStatus","createFieldLockStatusPayload","type","status","collabFieldLockStatusEventBusKey","useCollabFieldLockStatusEventBus","CollabStatus","CollabAccessRoomStatus","isCollabSuccessAccessRoomCallback","callback","CollabChangeRoomLockStatus","isCollabSuccessChangeRoomLockCallback","isCollabFailedChangeRoomLockCallback","CollabRoomJoinStrategy","CollabRequestToTakeModerationStatus","CollabRequestToJoinStatus","collabOptions","ref","initCommonAdminCollabOptions","data","useCommonAdminCollabOptions","collabConnected","collabSocket","collabRoomInfoState","reactive","collabFieldLocksState","collabFieldDataBufferState","useCollabState","room","dataBuffer","dataBufferMap","currentUserId","useCollabCurrentUserId","setCollabUserCurrentId","useCollabField","field","disableAutoUnsubscribe","changeEventBus","unsubscribeCollabFieldDataChangeListener","fieldChangeCallback","fieldLockStatusEventBus","unsubscribeCollabFieldLockStatusListener","fieldLockStatusCallback","collabGatheringBufferDataEventBus","unsubscribeCollabGatheringBufferData","collabGatheringBufferDataCallback","fieldChangeEventBusListener","event","payload","fieldLockStatusEventBusListener","collabGatheringBufferDataEventBusListener","addCollabFieldDataChangeListener","addCollabFieldLockStatusListener","addCollabGatheringBufferDataListener","tryOnBeforeUnmount","lockedByUser","roomLockData","lock","options","roomInfo","error","response","statusEvent","locks","_b","emit","__emit","textFieldRef","releaseFieldLock","acquireFieldLock","lockedByUserLocal","releaseCollabFieldLock","acquireCollabFieldLock","system","inject","subject","onUpdate","onBlur","onFocus","errorMessageComputed","labelComputed","requiredComputed","disabledComputed","textareaRef","showCounterWarning","counterValue","provide","modelValueComputed","lastPage","displayedFrom","displayedTo","disabledFirstAndPrev","disabledLast","disabledNext","computedTotalCountText","rowsPerPageComputed","oldValue","pageComputed","onClickFirst","onClickLast","onClickPrev","onClickNext","isVisible","toggleVisibility","cloned","active","defaultItems","defaultItemsMostRelevant","activeTitle","found","onItemClick","onCancel","computedData","o","e","n","R","ot","i","a","r","v","T","M","it","at","H","st","rt","lt","b","ct","y","m","ut","nt","ft","U","X","g","c","D","S","s","u","p","j","G","W","O","B","d","L","k","C","F","q","z","J","K","f","w","Q","h","A","I","P","_","Y","V","N","Z","l","tt","et","$","E","dt","pt","gt","REQUIRED_LOCALES","i18n","createI18n","locale","isAnzuFatalError","AnzuFatalError","cause","message","HTTP_STATUS_OK","HTTP_STATUS_CREATED","HTTP_STATUS_ACCEPTED","HTTP_STATUS_NO_CONTENT","HTTP_STATUS_BAD_REQUEST","HTTP_STATUS_UNAUTHORIZED","HTTP_STATUS_FORBIDDEN","HTTP_STATUS_NOT_FOUND","HTTP_STATUS_UNPROCESSABLE_ENTITY","HTTP_STATUS_VALID_ALL","axiosErrorResponseIsForbidden","axios","isAnzuApiForbiddenError","AnzuApiForbiddenError","ERROR_VALIDATION","axiosErrorResponseHasValidationData","_c","isAnzuApiValidationError","AnzuApiValidationError","resolveResponseData","axiosError","entity","items","values","__publicField","isAnzuApiResponseCodeError","AnzuApiResponseCodeError","code","ERROR_FORBIDDEN_OPERATION","axiosErrorResponseHasForbiddenOperationData","isAnzuApiForbiddenOperationError","AnzuApiForbiddenOperationError","DEFAULT_DURATION_SECONDS","NEW_LINE_MARK","useAlerts","showSuccess","duration","notify","showSuccessT","translation","showError","showErrorT","showInfo","showInfoT","showWarning","showWarningT","showValidationError","showRecordWas","variant","showApiValidationError","errors","fieldIsTranslated","te","texts","fieldText","errorsTexts","showApiForbiddenOperationError","detail","showUnknownError","showForbiddenError","modelValue","_useModel","buttonLoading","onOpen","onClose","router","useRouter","showErrorsDefault","onConfirm","res","config","onMounted","useFetch","module","this","dayjs","utc","customParseFormat","SUFFIX","FORMAT","DATETIME_MIN","DATETIME_MAX","dateNow","dateTimeToDate","isoDate","timestampCurrent","dateTimeNow","ignoreFractionalSeconds","ignoreSeconds","dateTimeStartOfDay","days","dateTimeEndOfDay","dateModifyMinutes","minutes","date","dateToUtc","yearNow","dateTimePretty","edgeDateValue","dateTimeFriendly","displayYear","displayDayMonth","now","datePretty","timePretty","dateDiff","date1","date2","unit","date1dayjs","date2dayjs","createdAt","modifiedAt","makeFilterHelper","defaultValue","titleT","useFilterHelpers","storeId","clearOne","filter","clearAll","filterBag","filterName","clearAllErrors","loadStoredFilter","showAdvancedFilter","containsAdvanced","stored","storedData","storeFilter","pagination","label","placeholderComputed","model","filterId","filterText","filterDocId","filterUrl","filterOverrides","toRefs","filterActive","clearIfActive","clearAllActiveExcept","exceptFilter","_d","_e","_f","_g","_h","_i","overrideFilter","currentFilter","setFilters","newModel","autodetectFilter","filterLabels","currentFilterModel","eventClickBlur","onClick","icon","showAdvanced","resetFilter","toggleAdvancedFilter","Grant","GrantDefault","useGrant","grantOptions","selectedGrant","newGrant","getGrantOption","GrantOrigin","GrantOriginDefault","useGrantOrigin","grantOriginOptions","grantOption","getGrantOriginOption","grantOriginOption","currentUsers","currentUsersLoaded","useAuthStore","getCurrentUserBySystem","isCurrentUserLoadedBySystem","reset","objectDeepFreeze","obj","propNames","objectGetValues","objectGetValueByPath","splitChar","objectSetValueByPath","objectDeletePropertyByPath","pathParts","lastIndex","recurse","isOwnerAware","isCreatedByAware","replaceUrlParameters","urlTemplate","urlParams","overrideUrlTemplate","isValidHTTPStatus","statusCode","apiFetchOne","client","resolve","reject","err","ROLE_SUPER_ADMIN","defineAuth","mainCurrentUserSystem","authStore","getSystemFromAcl","acl","isAdmin","userRoles","can","user","userIsLoaded","permission","canOwner","canForAll","acls","canForSome","useCurrentUser","setCurrentUser","currentUser","isCurrentUserLoaded","isSuperAdmin","hasCurrentUser","isAnonymous","endPoint","allowed","pretty","useValidateBetween","createI18nMessage","between","useValidateEmail","useValidateMaxLength","useValidateMaxValue","maxValue","useValidateMinLength","minLength","useValidateMinValue","minValue","useValidateNumeric","numeric","useValidateRequired","required","useValidateRequiredIf","requiredIf","useValidateSlug","helpers","useValidateStringArrayItemLength","withI18nMessage","stringArrayItemLengthValidator","min","max","useValidateUrl","url","useValidate","hours","hoursRef","selectContent","target","nextTick","onBlurHours","parsedHours","onBlurMinutes","parsedMinutes","increaseHours","newHours","decreaseHours","increaseMinutes","newMinutes","decreaseMinutes","focus","oldHours","oldMinutes","hoursInt","minutesInt","__expose","pickerOpened","pickerKey","timeKey","textFieldValue","datePickerValue","timePickerValue","datetimeInternal","rules","v$","useVuelidate","displayFormat","updateDateAndTimePickerOnlyWhenChanged","watchDatePicker","internal","watchTimePicker","newTimePickerValue","newDatePickerValue","newDate","newUtcValue","onTextFieldBlur","filtered","parsed","seconds","modelDate","onClear","onTextFieldFocus","changeFieldData","changeCollabFieldData","isOpened","isFocused","checkboxModel","onCheckboxClick","usePagination","sortBy","usePaginationAutoHide","modelValueSelected","modelValueAutocomplete","apiRequestCounter","search","autoFetchTimer","innerFilter","multipleComputedVuetifyTypeFix","fetchedItems","selectedItemsCache","allItems","final","loadingLocal","apiSearch","query","requestCounter","filterField","findLocalDataByValues","tryToLoadFromLocalData","count","foundItems","autoFetched","clearAutoFetchTimer","autoFetch","singleItemSelectedTitle","onSearchUpdate","onClickClear","watchDebounced","updateSelected","id","foundObject","selectedNewValue","onAutocompleteModelUpdate","loading","hasError","uniqueId","internalModelValue","success","returnValue","JobStatus","JobStatusDefault","useJobStatus","jobStatusOptions","getJobStatusOption","option","commonConfig","COMMON_CONFIG","containerClassComputed","displayTitle","customTitle","LogLevel","LogLevelDefault","useLogLevel","logLevelOptions","getLogLevelOption","levelOption","numberToString","copy","isSupported","useClipboard","customColorClass","countdown","countdownTimer","onUnmounted","alertedOccupiedRooms","useCollabRoom","watchForNewUsers","addToCachedUsers","fetchCachedUsers","reconnectEventBus","unsubscribeCollabReconnectListener","reconnectCallback","joinRequestEventBus","unsubscribeJoinRequestListener","joinRequestCallback","approvedJoinRequestEventBus","unsubscribeApprovedJoinRequestListener","approvedJoinRequestCallback","rejectedJoinRequestEventBus","unsubscribeRejectedJoinRequestListener","rejectedJoinRequestCallback","requestToTakeModerationEventBus","unsubscribeRequestToTakeModerationListener","requestToTakeModerationCallback","approvedRequestToTakeModerationEventBus","unsubscribeApprovedRequestToTakeModerationListener","approvedRequestToTakeModerationCallback","rejectedRequestToTakeModerationEventBus","unsubscribeRejectedRequestToTakeModerationListener","rejectedRequestToTakeModerationCallback","kickedFromRoomEventBus","unsubscribeKickedFromRoomListener","kickedFromRoomCallback","collabStartingEventBus","unsubscribeCollabStartingListener","collabStartingCallback","reconnectEventBusListener","joinRequestEventBusListener","approvedJoinRequestEventBusListener","rejectedJoinRequestEventBusListener","requestToTakeModerationEventBusListener","approvedRequestToTakeModerationEventBusListener","rejectedRequestToTakeModerationEventBusListener","kickedFromCollabRookEventBusListener","collabStartingEventBusListener","addJoinRequestListener","addApprovedJoinRequestListener","addRejectedJoinRequestListener","addRequestToTakeModerationListener","addApprovedRequestToTakeModerationListener","addRejectedRequestToTakeModerationListener","addCollabReconnectListener","addKickedFromRoomListener","addCollabStartingListener","subscribeCollabRoomInfo","unsubscribeCollabRoomInfo","joinCollabRoom","leaveCollabRoom","enteredCollabRoom","requestToJoinCollabRoom","approveRequestToJoinCollabRoom","userId","rejectRequestToJoinCollabRoom","requestToTakeModeration","approveRequestToTakeModeration","rejectRequestToTakeModeration","kickUserFromRoom","transferModeration","fetchRoomInfo","baseRoomInfo","collabRoomInfo","collabRoomLocks","approveRequestsToCollab","selectedIdsToCollab","collabUserIds","moderatorManagementDialog","approveRequestTakeModerationDialog","moderationRequest","requestToJoinAccepted","waitingFroApproval","timestamp","waitingForApprovalTimerDone","showRequestToJoinCollabButton","showRequestToTakeModerationButton","showModeratorManagementDialog","showKickYourselfButton","showModeratorManagementButton","showJoinCollaborationDialog","requestToJoinCollabTimerDone","request","requestToJoinCollabRoomAction","showModeratorManagementDialogAction","requestToTakeModerationAction","approveRequestToCollaborate","selectedId","rejectRequestToCollaborate","resetRequestToTakeModeration","rejectRequestToTakeModerationAction","approveRequestToTakeModerationAction","transferModerationAction","kickUserAction","kickYourselfAction","calculateWaitingSeconds","routerToComputed","variantComputed","dialog","closeDialog","ThemeSettings","Theme","storedSettings","useStorage","QUERY","settings","val","theme","systemHasDarkPreference","setTheme","setThemeSettings","toolbarColor","useTheme","setThemeAuto","setThemeDark","setThemeLight","toggleTheme","readonly","isOpen","ALL_LANGUAGES","modifyLanguageSettings","configAvailableLanguages","configDefaultLanguage","addMessages","language","messages","setLanguage","useLanguageSettings","_hoisted_1","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","currentFlagComponent","FlagSk","FlagEn","FlagEmpty","currentLanguageCode","onLanguageChange","currentLocale","availableLocales","reloadAdmin","AnzuNewVersionFetchError","showSystemBar","checkNewVersion","contentType","json","systemBarComponent","ASystemBarNewVersion","pause","useIntervalFn","onBeforeUnmount","swatches","generatedColor","generateRandomColor","randomRow","buttonColorComputed","onColorPickerChange","newColor","logoutDialog","MIN_SEARCH_CHARS","fetch","add","addManualMinimal","noDataText","fetchedItemsMinimal","finalRaw","tryToAddFromFetchedItems","ids","idsToFetch","useJobPriority","priorityLabels","priority","getPriorityLabel","getPriorityColor","priorityColor","priorityLabel","sliderColor","makeFilter","useAssetListFilter","AssetSelectReturnType","DamAssetStatus","DamAssetStatusDefault","DamAssetType","DamAssetTypeDefault","useAssetSelectStore","defineStore","assetListItems","loader","selectedLicenceId","selectConfig","assetType","selectedAssets","singleMode","minCount","maxCount","showLoader","hideLoader","setSelectConfig","setSingleMode","setAssetType","setMinCount","setMaxCount","setList","appendList","assets","asset","toggleSelectedByIndex","isSelectedMax","unselectAllExcept","clearSelected","addToSelected","removeFromSelected","ignoreIndex","assetItem","assetId","getSelectedMainFileIds","fileIds","getSelectedAssetIds","getSelectedAssets","getSelectedData","selectedCount","selectedSelectConfig","configItem","commonAdminCoreDamOptions","initCommonAdminCoreDamOptions","useCommonAdminCoreDamOptions","configName","useCommonAdminCoreDamOptionsGlobal","useApiQueryBuilder","querySetLimit","queryAdd","querySetOffset","page","limit","querySetOrder","desc","formatValue","queryAddFilter","filterVariant","getValue","isSearchApi","isApiResponseList","isApiInfiniteResponseList","apiGenerateListQuery","queryBuild","querySetFilters","apiFetchList","searchApi","resData","END_POINT","fetchDamAssetLicence","ENTITY","fetchAssetCustomFormElements","damClient","extSystem","SYSTEM_CORE_DAM","fetchDistributionCustomFormElements","distributionService","PUB_END_POINT_PREFIX","PUB_END_POINT","fetchPubConfiguration","fetchConfiguration","fetchExtSystemConfiguration","DamDistributionRequirementStrategy","DamDistributionRequirementStrategyDefault","DamDistributionServiceType","DamDistributionStatus","DamDistributionStatusDefault","UserAuthType","UserAuthTypeDefault","damPubConfigDefault","damPrvConfigDefault","useDamConfigStore","initialized","damPubConfig","damPrvConfig","damConfigExtSystem","damConfigLicenceExtSystem","damConfigAssetCustomFormElements","damConfigDistributionCustomFormElements","useDamConfigState","damConfigStore","onConfigError","loadDamPubConfig","setDamPubConfig","loadDamPrvConfig","setDamPrvConfig","loadDamConfigExtSystem","extSystemId","setDamConfigExtSystem","loadDamConfigAssetCustomFormElements","promises","responses","setDamConfigAssetCustomFormElements","loadDamConfigDistributionCustomFormElements","distributionServiceName","isDamPubConfigLoaded","isDamPrvConfigLoaded","getDamConfigExtSystem","getDamConfigAssetCustomFormElements","getOrLoadDamConfigExtSystemByLicences","licences","licence","getOrLoadDamConfigExtSystemByLicence","result","foundLicenceConfig","licenceRes","foundExtSystemConfig","BULK_METADATA_LIMIT","SYSTEM_DAM","FETCH_BY_IDS_MAX_LIMIT","fetchAssetList","licenceId","fetchAsset","fetchAssetByFileId","assetFileId","bulkUpdateAssetsMetadata","mainFileSingleUseOverride","bulkItems","listItemsToMetadataBulkItems","updateMetadataSequence","bulkItemsRes","fetchAssetListByIdsSequence","totalCalls","offset","reduced","fetchAssetListByIds","dtoItems","handleMetadataValidationError","configAssetCustomFormElements","updateAssetMetadata","mainFileSingleUse","filterIsTouched","useAssetSelectActions","assetSelectStore","storeToRefs","apiFetchAssetList","fetchNextPage","resetAssetList","filterTouch","filterUnTouch","initStoreContext","IMAGE_HEIGHT","IMAGE_BG_COLOR_DEFAULT","useAssetItemActions","assetStatus","imageProperties","tableImageProperties","imagePlaceholderPath","onError","srcComputed","placeholder16x9","showIconComputed","prettyBytes","bytes","decimals","dm","sizes","IMAGE_WIDTH","toRef","AssetSelectGridView","AssetSelectGridViewDefault","gridView","useGridView","setGridView","sidebarLeft","useSidebar","toggleSidebar","closeSidebar","openSidebar","generateByIdsApiQuery","apiFetchByIds","apiCreateOne","END_POINT_LIST","fetchKeywordListByIds","fetchKeywordList","createKeyword","useKeywordSelectActions","configExtSystem","mapToValueObject","keyword","mapToMinimal","mapToValueObjects","keywords","mapToMinimals","useKeywordListFilter","useKeywordFilter","fetchItems","fetchItemsByIds","fetchAuthorListByIds","fetchAuthorList","createAuthor","useAuthorSelectActions","author","authors","useAuthorFilter","apiUpdateOne","fetchDamUserListByIds","fetchDamUserList","updateDamUser","fetchDamUser","useDamUserSelectAction","users","useDamUserFilter","onAnyFilterUpdate","submitFilter","componentComputed","AssetSelectFilterFormImage","AssetSelectFilterFormDefault","filterAllowedImageWidgetSelectConfigs","damCurrentUser","damCurrentUserIsSuperAdmin","adminToExtSystems","assetLicences","assetLicenceValue","isImageWidgetUploadConfigAllowed","selectConfigs","selectConfigLocal","autoloadOnIntersect","isIntersecting","AssetSelectListTable","AssetSelectListTiles","disabledSubmit","ownKeys","enumerableOnly","keys","symbols","sym","_objectSpread2","source","_defineProperty","_typeof","_extends","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","version","userAgent","pattern","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","on","el","fn","off","matches","selector","getParentOrHost","closest","ctx","includeCTX","R_SPACE","toggleClass","state","className","css","prop","style","matrix","selfOnly","appliedTransforms","transform","matrixFn","find","tagName","iterator","list","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","elRect","top","left","bottom","right","height","width","containerRect","elMatrix","scaleX","scaleY","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","includeDragEl","currentChild","children","Sortable","lastChild","last","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","indexOfObject","arr","includeSelf","elem","gotSelf","elemCSS","extend","dst","src","isRectEqual","rect1","rect2","_throttleTimeout","throttle","ms","args","_this","cancelThrottle","scrollBy","clone","Polymer","getChildContainingRectFromElement","ghostEl","rect","child","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","expando","AnimationStateManager","animationStates","animationCallbackId","fromRect","childMatrix","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","currentRect","translateX","translateY","repaint","plugins","defaults","PluginManager","plugin","eventName","sortable","evt","eventNameGlobal","pluginName","modified","eventProperties","modifiedValue","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","allEventProperties","_excluded","pluginEvent","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","moved","_hideGhostForTarget","_unhideGhostForTarget","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","threshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","to","from","sameGroup","otherGroup","group","originalGroup","nearestEmptyInsertDetectEvent","nearest","_checkOutsideTargetEl","dataTransfer","preventOnFilter","touch","originalTarget","_saveInputCheckedState","criteria","ownerDocument","dragStartFn","_disableDraggable","_nextTick","fallback","inserted","fallbackTolerance","fallbackOffset","ghostMatrix","relativeScrollOffset","dx","dy","cssMatrix","revert","activeSortable","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","completed","after","_onMove","changed","capture","insertion","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","direction","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","nextSibling","moveVector","_unsilent","_cancelNextTick","_globalDragOver","order","_generateId","useAnimation","store","willInsertAfter","onMoveFn","retVal","firstElRect","childContainingRect","spacer","lastElRect","swapThreshold","invertedSwapThreshold","invertSwap","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","str","sum","root","inputs","idx","element","_len","_key","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","_ref2","clearPointerElemChangedInterval","clearAutoScrolls","autoScroll","ogElemScroller","newElem","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","layersOut","currentParent","canScrollX","canScrollY","scrollWidth","scrollHeight","scrollPosX","scrollPosY","vx","vy","scrollOffsetY","scrollOffsetX","drop","dispatchSortableEvent","hideGhostForTarget","unhideGhostForTarget","toSortable","Revert","_ref3","Remove","_ref4","parentSortable","useSortable","document","defaultDocument","resetOptions","defaultOptions","moveArrayElement","start","unrefElement","stop","tryOnMounted","tryOnScopeDispose","_valueIsRef","array","toValue","byteToHex","unsafeStringify","getRandomValues","rnds8","rng","_state","v1","buf","rnds","updateV1State","v1Bytes","msecs","nsecs","clockseq","node","tl","tmh","randomUUID","native","v4","generateUUIDv1","uuidv1","generateUUIDv4","uuidv4","HANDLE_CLASS","GHOST_CLASS","DRAG_CLASS","CHOSEN_CLASS","GROUP_CLASS","useSortableActions","initSortableCallback","removeDialog","itemToRemove","widgetEl","randomUuid","sortableInstance","forceRerender","dirtyLocal","transformItem","forceRerenderWidgetHtml","emitData","touchDirty","untouchDirty","updatePositions","updatedPositions","position","clonedData","returnData","findItemIndexById","updateDataCommon","dirty","updateData","foundIndex","updateDataAtIndex","addAfterIndex","targetIndex","addAfterId","targetId","removeById","removeByIndex","destroy","WIDGET_HTML_ID_PREFIX","onAddAfterClick","onDeleteClick","onRemoveDialogConfirm","onEditClick","onAddLastClick","widgetHtmlId","rootClassNameComputed","initSortable","nestedSortable","needsRefresh","refresh","NESTED_HANDLE_CLASS","NESTED_GHOST_CLASS","NESTED_DRAG_CLASS","NESTED_CHOSEN_CLASS","NESTED_GROUP_CLASS","SortableLevel","useSortableNestedActions","initSortablesCallback","sortableInstances","dragging","nestedData","updatePositionsSameParent","updatePositionsDifferentParent","itemsTarget","itemsSource","indexTarget","indexSource","calculateParentDepth","depth","parentItem","calculateChildDepth","childDepth","currentDepth","calculateNodeMaxDepth","parentDepth","findItemById","foundInChildren","currentId","maxDepth","itemToMove","itemToMoveParentItem","targetItem","childrenAllowed","insertData","targetItemParentItem","itemFound","onAddChildClick","level","showAddChildButtonComputed","widgetClass","initSortables","nestedSortables","parentId","addChildToId","dialogLocal","paginationComputed","filterTouched","selectedItemsCount","onPageChange","hasNextPage","showAll","useCustomDataForm","CustomDataFormElementType","CustomDataFormElementTypeDefault","useCustomDataFormElementType","customDataFormElementTypeOptions","fixValue","updateModelValue","stringArrayItemLength","dynamicRules","counter","toggleForm","updated","elementsPinned","elementsOther","showHideButtonText","showHideButtonIcon","enableShowHide","isDraggingFile","draggingTimer","useDropzoneGlobalDragState","dragoverHandler","checkReallyDraggingEnded","dragleaveHandler","dropHandler","dragEventContainsFiles","damFileTypeFix","file","useFormatAndSizeCheck","accept","maxSizes","acceptKeys","maxSizeKeys","checkFormatsAndSizes","files","disableAlert","incorrectFileNames","validFiles","isFileValid","checkFormats","checkSizes","accepts","splitType","dropZoneRef","onDrop","isOverDropZone","useDropZone","imageOptions","initCommonAdminImageOptions","useCommonAdminImageOptions","useImageActions","image","random","imageId","useDamAcceptTypeAndSizeHelper","createSizesByAssetType","uploadSizes","uploadAccept","defineCached","mapFullToMinimal","mapIdToMinimal","fetchCallback","idProp","maxLimit","cache","toFetch","toAdd","arg","addManual","updateMap","updateToFetch","apiFetch","debouncedFetch","useDebounceFn","cachedExtSystemId","useExtSystemIdForCached","has","get","isLoaded","useDamCachedAuthors","useDamCachedAuthorsForRemoteAutocomplete","AssetFileProcessStatus","AssetFileFailReason","AssetFileFailReasonDefault","AssetFileRouteStatus","AssetFileRouteStatusDefault","AssetFileLinkType","assetFileIsImageFile","assetFileIsVideoFile","assetFileIsAudioFile","assetFileIsDocumentFile","useUploadQueueItemFactory","chunkSize","useAssetSuggestions","suggestions","newNames","conflicts","damNotificationsEventBusKey","useDamNotificationsEventBus","DamNotificationName","damNotificationsInitialized","initDamNotifications","notification","enabled","eventBus","open","useWebSocket","ws","useDamNotifications","getAssetTypeByMimeType","mimeType","UploadQueueItemType","UploadQueueItemStatus","useDamUploadChunkSize","apiTimeout","lastChunkSize","minUploadTimeThreshold","idealUploadTimeThreshold","maxUploadTimeThreshold","updateChunkSize","expectedChunkUploadSpeed","returnFromRange","CHUNK_UPLOAD_TIMEOUT","imageUploadStart","imageUploadChunk","buffer","size","onUploadProgressCallback","formData","imageUploadFinish","sha","rotateImage","angle","NOTIFICATION_FALLBACK_TIMER_CHECK_SECONDS","NOTIFICATION_FALLBACK_MAX_TRIES","damUploadStart","damUploadChunk","damUploadFinish","uploadStatusFallback","notificationFallbackCallback","calculateFallbackTime","uploadQueuesStore","useUploadQueuesStore","factory","modules","installedModules","__webpack_require__","moduleId","exports","getter","property","_classCallCheck","instance","Constructor","RushaCore","_require","toHex","ceilHeapSize","conv","padlen","len","padZeroes","bin","h8","om","align","padData","chunkLen","msgLen","getRawDigest","heap","padMaxChunkLen","io","out","Rusha","padMsgLen","padChunkLen","view","chunkOffset","finalize","chunk","turnOffset","inputLen","precomputedHex","arrayBuffer","binarray","self","isRunningInWorker","isRunningInSharedWorker","isRunningInServiceWorker","hashData","hasher","cb","hashFile","readTotal","blockSize","reader","workerBehaviourEnabled","done","hash","work","createHash","runWorker","isDedicatedWorkerScope","isRunningInDedicatedWorker","worker","terminate","webpackBootstrapFunc","moduleNameReqExp","dependencyRegExp","quoteRegExp","getModuleDependencies","sources","queueName","retval","fnString","wrapperSignature","webpackRequireName","re","hasValuesInQueues","queues","hasValues","getRequiredModules","modulesQueue","requiredModules","seenModules","queue","moduleToCheck","newModules","newModulesKeys","entryModule","blob","URL","workerUrl","stdlib$840","foreign$841","heap$842","H$843","hash$844","k$845","x$846","i$847","j$848","y0$849","z0$850","y1$851","z1$852","y2$853","z2$854","y3$855","z3$856","y4$857","z4$858","t0$859","t1$860","convStr","H8","H32","lm","convBuf","convBlob","_createClass","defineProperties","descriptor","protoProps","staticProps","Hash","encoding","digest","CHUNK_MAX_RETRY","SPEED_CHECK_INTERVAL","CHUNK_RETRY_INTERVAL","CHUNK_RETRY_MULTIPLY","failUpload","queueItem","finishUpload","handleValidationErrorMessage","errorMessages","readFile","partial","sleep","useUpload","uploadCallback","fileSize","progress","speedStack","lastTimestamp","endTimestamp","lastLoaded","rusha","getCurrentTimestamp","progressCallback","progressEvent","currentStamp","dataSent","uploadChunk","chunkFile","exception","processAndUploadChunk","cancelToken","sleepTime","attempt","speedCheck","speedCheckRun","avgSpeed","current","remainingBytes","filesize","uploadedChunk","uploadStop","cancelTokenSource","useDamCachedKeywords","useCachedKeywordsForRemoteAutocomplete","QUEUE_MAX_PARALLEL_UPLOADS","QUEUE_CHUNK_SIZE","addToCachedKeywords","fetchCachedKeywords","addToCachedAuthors","fetchCachedAuthors","createDefault","addDamNotificationListener","queueItemProcessed","queueItemFailed","queueItemDuplicate","queueItemMetadataProcessed","getQueue","queueKey","getQueueItems","addByFiles","assetLicence","createQueue","addQueueItem","recalculateQueueCounts","processUpload","getQueueItemsByStatus","waitingItems","queueItemUploadStart","upload","uploadInit","estimate","setUploadSpeed","originAssetFile","updateNewNames","getAuthorConflicts","assetRes","failReason","stopItemUpload","updateFromDetail","getQueueTotalCount","getQueueProcessedCount","stopUpload","currentItems","clearQueue","forceReloadFileInput","getQueueFileInputKey","getQueueItemsTypes","types","apiDeleteOne","SYSTEM_CMS","fetchImageListByIds","fetchImage","createImage","updateImage","deleteImage","bulkUpdateImages","updateImagesSequence","images","reqData","imageClient","widgetImageToDamImageUrl","resImage","resolvedSrc","getImageUrl","newImage","newImageId","useImageStore","imageDetail","maxPosition","setImageDetail","setImages","addImages","updateMaxPositionIfGreater","newPosition","removeImageByIndex","ADamAssetMetadataValidationScopeSymbol","AImageMetadataValidationScopeSymbol","ADamKeywordCreateValidationScopeSymbol","ADamAuthorCreateValidationScopeSymbol","useImageValidation","imageStore","onDialogModelUpdate","onEditAsset","AssetDetailTabImageWithRoi","AssetDetailTabImageWithRoiDefault","useAssetDetailStore","authorConflicts","metadataAreTouched","activeTab","updateUploadStore","setAsset","MINUTE_IN_SECONDS","HOUR_IN_SECONDS","DAY_IN_SECONDS","useRemainingTime","remainingTime","short","prefix","svg2k","svg4k","svg8k","svgqhd","svgfhd","svgslot","svglow","svgrss","DIMENSIONS_CONFIG","ICON_SLOTS","ICON_RSS","ICON_LOW","LOW_DIMENSION","checkDimensions","icons","titles","checkDistributions","iconPath","onLoad","uploadingPercentage","backgroundColorComputed","iconColor","remainingTimeShort","useAssetFileFailReason","assetFileFailReasonOptions","getAssetFileFailReasonOption","reasonOption","CLASS_PREFIX","mountedDivClasses","useAssetDetailSidebarActionbar","uploadKey","mounted","unMounted","canTeleport","divClassName","elements","pinnedCount","getCachedAuthor","displayNewIcon","displayReviewed","clickClose","DamAuthorType","DamAuthorTypeDefault","useDamAuthorType","authorTypeOptions","useAuthorValidation","validationScope","useDamAuthorFactory","reviewed","fetchItemsMinimal","addAuthor","addNewAuthorText","searchChange","addManualToCachedAuthors","afterCreate","itemSlotIsSelected","getCachedKeyword","useDamKeywordFactory","useKeywordValidation","addNewKeywordText","addManualToCachedKeywords","useDamKeywordAssetTypeConfig","keywordEnabled","keywordRequired","useDamAuthorAssetTypeConfig","authorEnabled","authorRequired","panels","assetDetailStore","isTypeImage","assetMainFile","onAnyMetadataChange","uploadQueueStore","saveButtonLoading","onSave","useImageRoiStore","imageFile","roi","timestampCropper","timestampRoiPreviews","setImageFile","newFile","setRoi","newRoi","forceReloadRoiPreviews","forceReloadCropper","rotate","END_POINT_IMAGE_ROI","fetchRoi","updateRoi","fetchImageRoiList","imageRoiStore","loadRois","afterRotate","PRECISION","regionToCrop","cropper","regionOfInterest","originalImageWidth","originalImageHeight","imageData","ratio","cropToRegion","pointX","pointY","percentageWidth","validateWidth","percentageHeight","validateHeight","_toPrimitive","_toPropertyKey","_defineProperties","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_arrayLikeToArray","iter","minLen","arr2","IS_BROWSER","WINDOW","IS_TOUCH_DEVICE","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","DEFAULTS","TEMPLATE","isNaN","isPositiveNumber","hasOwnProperty","isPlainObject","_constructor","prototype","slice","toArray","forEach","assign","REGEXP_DECIMALS","normalizeDecimalNumber","times","REGEXP_SUFFIX","setStyle","styles","hasClass","addClass","removeClass","added","REGEXP_CAMEL_CASE","toParamCase","getData","setData","removeData","REGEXP_SPACES","onceSupported","supported","once","listener","removeListener","handler","listeners","addListener","_handler","_element$listeners","_len2","_key2","getOffset","box","location","REGEXP_ORIGINS","isCrossOriginURL","parts","addTimestamp","getTransforms","getMaxZoomRatio","pointers","pointers2","maxRatio","pointer","pointerId","pointer2","x1","y1","x2","y2","z1","z2","getPointer","endOnly","pageX","pageY","end","getPointersCenter","startX","startY","getAdjustedSizes","aspectRatio","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","sinArc","cosArc","newWidth","newHeight","getSourceCanvas","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","imageNaturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","naturalWidth","naturalHeight","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","context","minSizes","destMaxSizes","destMinSizes","destWidth","destHeight","param","fromCharCode","getStringFromCharCode","dataView","length","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","uint8","arrayBufferToDataURL","chunks","resetAndGetOrientation","orientation","littleEndian","app1Start","ifdStart","exifIDCode","tiffOffset","endianness","firstIFDOffset","_length","_offset","parseOrientation","render","containerData","viewMode","rotated","canvasWidth","canvasHeight","canvasData","sizeLimited","positionLimited","cropBoxData","cropped","minCanvasWidth","minCanvasHeight","_getAdjustedSizes","newCanvasLeft","newCanvasTop","transformed","_getRotatedSizes","autoCropArea","limited","minCropBoxWidth","minCropBoxHeight","maxCropBoxWidth","maxCropBoxHeight","preview","crossOrigin","alt","previews","img","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","events","handlers","ratioX","ratioY","delta","buttons","button","action","change","minLeft","minTop","renderable","range","side","methods","hasSameSize","offsetX","offsetY","_this$canvasData","_originalEvent","pivot","center","_scaleX","_scaleY","rounded","widthChanged","heightChanged","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","sourceWidth","sourceHeight","srcX","srcY","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","scale","mode","dragBox","face","croppable","movable","AnotherCropper","Cropper","xhr","_parseOrientation","crossOriginUrl","_this2","isIOSWebKit","sizingImage","body","cropBox","parentNode","cropperInstance","imgEl","enable","disable","containerStyle","imgStyle","propsOptions","DAM_IMAGE_ASPECT_RATIO","cropperContainerStyle","imageUrl","enableCropper","disableCropper","applyRegionOfInterest","saveRoi","cropperReady","cropperEnd","showCropper","sidebar","onImageLoad","isTypeVideo","isTypeAudio","isTypeDocument","toolbarTitle","uploadQueueDialog","uploadQueueSidebar","useUploadQueueDialog","onSaveAndApply","IMAGE_ASPECT_RATIO","assetDetail","enableRoiTab","isDone","processingStatuses","processing","waiting","showDone","uploading","uploadProgress","onStopConfirm","queueTotalCount","queueProcessedCount","isUploading","description","assetsMetadataRes","BLOCK_DOUBLE_CLICK_MS","inputRef","fileInputKeyLocal","blockDoubleClick","clickInput","validateData","checked","onDropzoneDrop","onInputFileChange","onFileDropzoneClick","fileInputComponent","onFilesInput","ImageWidgetUploadConfig","collabFieldLockReallyLocked","lockedLocal","acquireFieldLockLocal","releaseFieldLockLocal","imageWidgetUploadConfig","clickMenuOpened","assetSelectDialog","metadataDialog","metadataDialogSaving","metadataDialogLoading","fileInputDialog","withoutImage","uploadQueue","imageLoaded","actionEditMeta","actionLibrary","waitForFieldLockIsReallyAcquired","checkLock","onFileInput","reload","force","onAssetSelectConfirm","forceReloadViewWithExpandMetadata","assetLoading","assetDialog","onMetadataDialogClose","onMetadataDialogConfirm","onImageDelete","onAssetUploadConfirm","expandedUploadDialog","onDropzoneClick","isLocked","detailDialogMetadataComponent","metadataConfirm","onOptionsButtonClick","anyWidgetDialogOpened","uploadConfig","innerComponent","removeItem","customData","imageSrc","cancelItem","showCancelStatuses","showCancel","showDetail","fillEmptyField","elementProperty","replaceField","useUploadQueueMassOperations","forceReplace","massOperationsData","massOperationsKeywords","massOperationsAuthors","replaceEmptyCustomDataValue","replaceEmptyAuthors","replaceEmptyKeywords","fillEmptyKeywords","replaceKeywords","fillEmptyAuthors","replaceAuthors","fillAll","clearForm","assetTypes","toggleUploadQueueSidebar","isFinished","saveAndCloseButtonLoading","itemsRaw","metadataMap","queueItems","assetMetadataMap","authorIdsToFetch","authorsMap","bulkItem","assetMeta","authorId","authorNames","mapped","MAX_UPLOAD_ITEMS","uploadDialogLoader","fileCache","uploadQueueTotalCount","alreadyAtUploadLimit","openDialog","onDialogConfirm","onDialogCancel","uploadButtonComponent","imagesLoading","fetchImagesOnLoad","imagesRes","imageRes","limitDialogComponent","afterLimitDialogAdd","assetSelectConfirmMap","saveImages","resItems","resItem","updateAllPositions","pos","moveImagePositions","resImages","newImages","newImageIds","inputField","meta","isValid","isDirty","widgetImageToDamImageOriginalUrl","extractUUID","validateAssetData","validateField","extracted","submit","updatePreviewAndTexts","disabled","datatableSlotName","columnName","onRowClick","isNotEmpty","totalColumnsCount","DATETIME_AUTO_LABEL_TRACKING","defaultColumn","createDatatableColumnsConfig","columnsHidden","disableActions","customInitialPagination","customI18n","showExpand","localI18n","columnsAll","columnsVisible","columns","column","useSubjectSelect","datatableConfig","datatableHiddenColumns","selected","updateSortBy","resetState","getList","sortByChange","onFetchNextPage","eventTarget","firstTd","input","generateDatatableMinMaxSelectStrategy","booleanToInteger","useAnzuUserFactory","resourceName","_system","_resourceName","useBaseUserFactory","usePermissionConfigFactory","usePermissionGroupFactory","apiAnyRequest","method","axiosConfig","generateListApiQuery","generateListApiQueryWithoutPagination","rowsPerPage","orderField","orderDesc","apiFetchListBatch","sortDesc","batchSize","forceElastic","urlPart","results","nextPageData","numPages","pageResponse","useErrors","useJobApi","JOB_RESOURCE_USER_DATA_DELETE","useJobBaseResource","customJobs","jobResourceOptions","AnzuSystemsCommonAdmin","app","Acl","Notification","arrayItemToggle","arrayToString","separator","arrayFromArgs","arrayFlatten","acc","arraysHaveSameElements","array1","array2","sortedArray1","sortedArray2","browserHistoryReplaceUrlByString","browserHistoryReplaceUrlByRouter","resolved","cs","alert","anzuUser","job","log","permissionGroup","assetSelect","subjectSelect","damImage","collab","vuetify","apiValidation","apiForbiddenOperation","jsValidation","en","sk","useCommonVuetifyConfig","VBtn","VChip","ensureUniqueValues","loadCommonFonts","useCommonJobFactory","createBase","LoginState","useLoginStatus","isStatusNotDefined","isStatusLoginSuccess","isStatusSsoCommunicationFailure","isStatusInternalErrorFailure","isStatusUnauthorized","fetchDamCurrentUser","useCollabInit","requestAccessEventBus","locksEntries","dataEntries","fieldData","connectedBefore","reason","COLLAB_FIELD_PREFIX_EMBED","COLLAB_FIELD_PREFIX_COMMENT","useCollabHelpers","useCollabAnyDataChange","anyChangeCallback","unsubscribeCollabAnyDataChangeListener","anyChangeEventBusListener","addCollabAnyDataChangeListener","changeCollabAnyData","objectSetDataByField","objectToUpdate","fetchDamAssetLicenceListByIds","fetchDamAssetLicenceList","useDamAssetLicenceFilter","useAssetLicenceSelectActions","mapToValueObjectOption","selectedExtSystemId","fetchDamAssetLicenceGroupListByIds","fetchDamAssetLicenceGroupList","useAssetLicenceGroupSelectActions","assetLicenceGroups","useDamAssetLicenceGroupFilter","fetchDamExtSystemListByIds","fetchDamExtSystemList","useExtSystemSelectActions","useExtSystemFilter","useDamExternalProviderAssetType","all","providerName","allExternalProviderAssetTypeOptions","useDamDistributionServiceType","serviceName","allDistributionServiceTypeOptions","defineBreadcrumbs"],"mappings":"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","x_google_ignoreList":[21,32,33,34,179,180,181,182,183,184,185,219,274]}