@anzusystems/common-admin 2.0.0-rc.8 → 2.0.0-rc.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnzuSystemsCommonAdmin.d.ts +9 -0
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +170 -169
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +5 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js +94 -67
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +7 -0
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js +27 -13
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +7 -0
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js +56 -28
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js +107 -89
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/autoDeleteTimeLeft.d.ts +9 -0
- package/dist/domains/dam/assetDetail/composables/autoDeleteTimeLeft.js +18 -0
- package/dist/domains/dam/assetDetail/composables/autoDeleteTimeLeft.js.map +1 -0
- package/dist/domains/dam/assetDetail/store/assetDetailStore.d.ts +4 -2
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +4 -2
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +2 -1
- package/dist/domains/dam/assetSelect/components/AssetImagePreview.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue.d.ts +3 -0
- package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue_vue_type_script_setup_true_lang.js +16 -5
- package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js +8 -3
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.vue_vue_type_script_setup_true_lang.js +5 -3
- package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectItemActions.d.ts +2 -0
- package/dist/domains/dam/assetSelect/composables/assetSelectItemActions.js +37 -31
- package/dist/domains/dam/assetSelect/composables/assetSelectItemActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.d.ts +4 -2
- package/dist/domains/dam/assetSelect/store/assetSelectStore.d.ts +8 -4
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +3 -0
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js +3 -0
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +2 -2
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +2 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +2 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +2 -1
- package/dist/domains/dam/types/Asset.d.ts +3 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/AssetFile.d.ts +1 -1
- package/dist/domains/dam/types/AssetFile.js.map +1 -1
- package/dist/domains/dam/types/AssetLicence.d.ts +7 -0
- package/dist/domains/dam/user/api/assetLicenceApi.d.ts +2 -1
- package/dist/domains/dam/user/api/assetLicenceApi.js +4 -4
- package/dist/domains/dam/user/api/assetLicenceApi.js.map +1 -1
- package/dist/domains/dam/user/composables/cachedAssetLicences.d.ts +17 -0
- package/dist/domains/dam/user/composables/cachedAssetLicences.js +35 -0
- package/dist/domains/dam/user/composables/cachedAssetLicences.js.map +1 -0
- package/dist/lib.d.ts +3 -2
- package/dist/locales/cs/common/damImage.js +29 -0
- package/dist/locales/cs/common/damImage.js.map +1 -1
- package/dist/locales/cs.d.ts +3 -0
- package/dist/locales/en/common/damImage.js +29 -0
- package/dist/locales/en/common/damImage.js.map +1 -1
- package/dist/locales/en.d.ts +3 -0
- package/dist/locales/sk/common/damImage.js +29 -0
- package/dist/locales/sk/common/damImage.js.map +1 -1
- package/dist/locales/sk.d.ts +3 -0
- package/dist/plugins/i18n.d.ts +3 -0
- package/package.json +2 -2
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { dateTimeFriendly as e } from "../../../../shared/utils/datetime.js";
|
|
2
|
+
import { DamAssetType as t } from "../../types/Asset.js";
|
|
3
|
+
import { useDamConfigStoreOf as n } from "../../config/store/damConfigStore.js";
|
|
4
|
+
import { useDamConfigName as r } from "../../composables/damConfigName.js";
|
|
5
|
+
import { DIMENSIONS_CONFIG as i, ICON_LOW as a, ICON_RSS as o, ICON_SLOTS as s, ICON_TTS as c } from "../utils/assetImageIconsConfig.js";
|
|
6
|
+
import { useRemainingTime as l } from "../../../ui/datetime/composables/remainingTime.js";
|
|
7
|
+
import { useAutoDeleteTimeLeft as u } from "../composables/autoDeleteTimeLeft.js";
|
|
8
|
+
import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createTextVNode as g, defineComponent as _, normalizeClass as v, openBlock as y, renderList as b, toDisplayString as x, vShow as S, withCtx as C, withDirectives as w } from "vue";
|
|
9
|
+
import { useI18n as T } from "vue-i18n";
|
|
10
|
+
import { VChip as E } from "vuetify/components/VChip";
|
|
7
11
|
// src/domains/dam/assetDetail/components/AssetImageMetaIcons.vue?vue&type=script&setup=true&lang.ts
|
|
8
|
-
var
|
|
12
|
+
var D = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "asset-image__licence-badge",
|
|
15
|
+
"data-cy": "asset-licence-badge"
|
|
16
|
+
}, O = ["src", "title"], k = /*@__PURE__*/ _({
|
|
9
17
|
__name: "AssetImageMetaIcons",
|
|
10
18
|
props: {
|
|
11
19
|
assetType: {},
|
|
@@ -18,40 +26,60 @@ var v = ["src", "title"], y = /*@__PURE__*/ d({
|
|
|
18
26
|
type: Boolean,
|
|
19
27
|
default: !1
|
|
20
28
|
},
|
|
21
|
-
configName: { default: void 0 }
|
|
29
|
+
configName: { default: void 0 },
|
|
30
|
+
autoDeleteAt: { default: null },
|
|
31
|
+
licenceBadge: { default: "" }
|
|
22
32
|
},
|
|
23
|
-
setup(
|
|
24
|
-
let
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
setup(_) {
|
|
34
|
+
let k = _, A = n(r(k.configName)), { t: j } = T(), { remainingTimeShort: M } = l(), { secondsLeft: N } = u(() => k.autoDeleteAt), P = f(() => !k.autoDeleteAt || N.value === null ? null : {
|
|
35
|
+
text: M(N.value),
|
|
36
|
+
title: j("common.damImage.asset.metaIcons.autoDeleteAt", { date: e(k.autoDeleteAt) })
|
|
37
|
+
}), F = (e, n) => {
|
|
38
|
+
if (k.assetFileProperties.width !== 0 && k.assetFileProperties.height !== 0) {
|
|
39
|
+
if (k.assetFileProperties.width < 600 || k.assetFileProperties.height < 600) e.push(a), n.push(j("common.damImage.asset.metaIcons.low"));
|
|
40
|
+
else if (k.assetType === t.Video) {
|
|
41
|
+
for (let t of i) if (k.assetFileProperties.width === t.width && k.assetFileProperties.height === t.height) {
|
|
42
|
+
e.push(t.svgSrc), n.push(j(t.titleT));
|
|
30
43
|
break;
|
|
31
44
|
}
|
|
32
45
|
}
|
|
33
46
|
}
|
|
34
|
-
},
|
|
35
|
-
for (let n of
|
|
36
|
-
let r =
|
|
47
|
+
}, I = (e, t) => {
|
|
48
|
+
for (let n of k.assetFileProperties.distributesInServices) {
|
|
49
|
+
let r = A.damPrvConfig.distributionServices[n], i = r?.iconPath;
|
|
37
50
|
r && i && i.length > 0 && !e.includes(i) && (e.push(i), t.push(r.title));
|
|
38
51
|
}
|
|
39
|
-
},
|
|
52
|
+
}, L = f(() => {
|
|
40
53
|
let e = [], t = [];
|
|
41
|
-
return
|
|
54
|
+
return k.assetFileProperties.slotNames.length > 1 && (e.push(s), t.push(j("common.damImage.asset.metaIcons.slots"))), k.assetFileProperties.fromRss && (e.push(o), t.push(j("common.damImage.asset.metaIcons.rss"))), k.showTts && k.assetFileProperties.ttsAudio && (e.push(c), t.push(j("common.damImage.asset.metaIcons.tts"))), F(e, t), I(e, t), {
|
|
42
55
|
icons: e,
|
|
43
56
|
titles: t
|
|
44
57
|
};
|
|
45
58
|
});
|
|
46
|
-
return (e, t) =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
59
|
+
return (e, t) => w((y(), h("div", { class: v(["asset-image__meta-icons", { "asset-image__meta-icons-absolute": !_.disableAbsolute }]) }, [
|
|
60
|
+
_.licenceBadge ? (y(), h("span", D, x(_.licenceBadge), 1)) : m("", !0),
|
|
61
|
+
P.value ? (y(), p(E, {
|
|
62
|
+
key: 1,
|
|
63
|
+
size: "x-small",
|
|
64
|
+
variant: "flat",
|
|
65
|
+
color: "warning",
|
|
66
|
+
class: "ma-1 align-self-center",
|
|
67
|
+
title: P.value.title,
|
|
68
|
+
"data-cy": "asset-auto-delete-badge"
|
|
69
|
+
}, {
|
|
70
|
+
default: C(() => [g(x(P.value.text), 1)]),
|
|
71
|
+
_: 1
|
|
72
|
+
}, 8, ["title"])) : m("", !0),
|
|
73
|
+
(y(!0), h(d, null, b(L.value.icons, (e, t) => (y(), h("img", {
|
|
74
|
+
key: e,
|
|
75
|
+
class: "img-svg",
|
|
76
|
+
src: e,
|
|
77
|
+
alt: "",
|
|
78
|
+
title: L.value.titles[t] || ""
|
|
79
|
+
}, null, 8, O))), 128))
|
|
80
|
+
], 2)), [[S, L.value.icons.length > 0 || P.value || _.licenceBadge]]);
|
|
53
81
|
}
|
|
54
82
|
});
|
|
55
|
-
export {
|
|
83
|
+
export { k as default };
|
|
56
84
|
|
|
57
85
|
//# sourceMappingURL=AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js","names":["_withDirectives","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_vShow","_hoisted_1","AssetImageMetaIcons_vue_vue_type_script_setup_true_lang_default","props","__props","damConfigStore","useDamConfigStoreOf","useDamConfigName","useI18n","checkDimensions","icons","ICON_LOW","titles","
|
|
1
|
+
{"version":3,"file":"AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js","names":["_withDirectives","_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_createBlock","_component_VChip","_withCtx","_createTextVNode","_Fragment","_renderList","_vShow","_hoisted_1","_hoisted_2","AssetImageMetaIcons_vue_vue_type_script_setup_true_lang_default","props","__props","damConfigStore","useDamConfigStoreOf","useDamConfigName","useI18n","useRemainingTime","useAutoDeleteTimeLeft","autoDeleteBadge","computed","secondsLeft","remainingTimeShort","t","dateTimeFriendly","checkDimensions","icons","ICON_LOW","titles","DamAssetType","dimension","DIMENSIONS_CONFIG","checkDistributions","serviceName","service","iconPath","data","ICON_SLOTS","ICON_RSS","ICON_TTS","withDirectives","openBlock","createElementBlock","normalizeClass","toDisplayString","createCommentVNode","createBlock","VChip","withCtx","createTextVNode","Fragment","renderList","item","index","vShow"],"sources":["../../../../../src/domains/dam/assetDetail/components/AssetImageMetaIcons.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { type AssetFileProperties, DamAssetType, type DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport {\n DIMENSIONS_CONFIG,\n ICON_LOW,\n ICON_RSS,\n ICON_SLOTS,\n ICON_TTS,\n LOW_DIMENSION,\n} from '@/domains/dam/assetDetail/utils/assetImageIconsConfig'\nimport { useDamConfigStoreOf } from '@/domains/dam/config/store/damConfigStore'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\nimport { useRemainingTime } from '@/domains/ui/datetime/composables/remainingTime'\nimport { useAutoDeleteTimeLeft } from '@/domains/dam/assetDetail/composables/autoDeleteTimeLeft'\nimport type { DatetimeUTCNullable } from '@/shared/types/common'\nimport { dateTimeFriendly } from '@/shared/utils/datetime'\n\nconst props = withDefaults(\n defineProps<{\n assetType: DamAssetTypeType\n assetFileProperties: AssetFileProperties\n disableAbsolute?: boolean\n /** Shows the synthesized audio (TTS) icon. Off by default because the backend reports it to every admin. */\n showTts?: boolean\n /** DAM configuration whose distribution services name the icons. Inherited when not given. */\n configName?: string\n /** When DAM deletes the asset: a badge shows the time left. Only admin-dam passes it, the other admins show none. */\n autoDeleteAt?: DatetimeUTCNullable\n /** Badge of the asset's licence, shown as given. Empty shows none. */\n licenceBadge?: string\n }>(),\n {\n disableAbsolute: false,\n showTts: false,\n configName: undefined,\n autoDeleteAt: null,\n licenceBadge: '',\n }\n)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigStore = useDamConfigStoreOf(useDamConfigName(props.configName))\n\nconst { t } = useI18n()\nconst { remainingTimeShort } = useRemainingTime()\n\nconst { secondsLeft } = useAutoDeleteTimeLeft(() => props.autoDeleteAt)\n\nconst autoDeleteBadge = computed(() => {\n if (!props.autoDeleteAt || secondsLeft.value === null) return null\n return {\n text: remainingTimeShort(secondsLeft.value),\n title: t('common.damImage.asset.metaIcons.autoDeleteAt', { date: dateTimeFriendly(props.autoDeleteAt) }),\n }\n})\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 (const dimension of DIMENSIONS_CONFIG) {\n if (props.assetFileProperties.width === dimension.width && props.assetFileProperties.height === dimension.height) {\n icons.push(dimension.svgSrc)\n titles.push(t(dimension.titleT))\n break\n }\n }\n}\n\nconst checkDistributions = (icons: string[], titles: string[]) => {\n for (const serviceName of props.assetFileProperties.distributesInServices) {\n const service = damConfigStore.damPrvConfig.distributionServices[serviceName]\n const iconPath = service?.iconPath\n if (service && iconPath && iconPath.length > 0 && !icons.includes(iconPath)) {\n icons.push(iconPath)\n titles.push(service.title)\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 if (props.showTts && props.assetFileProperties.ttsAudio) {\n icons.push(ICON_TTS)\n titles.push(t('common.damImage.asset.metaIcons.tts'))\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 || autoDeleteBadge || licenceBadge\"\n class=\"asset-image__meta-icons\"\n :class=\"{ 'asset-image__meta-icons-absolute': !disableAbsolute }\"\n >\n <span\n v-if=\"licenceBadge\"\n class=\"asset-image__licence-badge\"\n data-cy=\"asset-licence-badge\"\n >\n {{ licenceBadge }}\n </span>\n <VChip\n v-if=\"autoDeleteBadge\"\n size=\"x-small\"\n variant=\"flat\"\n color=\"warning\"\n class=\"ma-1 align-self-center\"\n :title=\"autoDeleteBadge.title\"\n data-cy=\"asset-auto-delete-badge\"\n >\n {{ autoDeleteBadge.text }}\n </VChip>\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 // As the SVG meta icons: a half-transparent black circle with white bold letters.\n .asset-image__licence-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n margin: 2px;\n border-radius: 50%;\n background-color: rgb(0 0 0 / 50%);\n color: #fff;\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,IAAMgB,IAAQC,GAuBRC,IAAiBC,EAAoBC,EAAiBJ,EAAM,UAAU,CAAC,GAEvE,EAAE,SAAMK,EAAQ,GAChB,EAAE,0BAAuBC,EAAiB,GAE1C,EAAE,mBAAgBC,QAA4BP,EAAM,YAAY,GAEhEQ,IAAkBC,QAClB,CAACT,EAAM,gBAAgBU,EAAY,UAAU,OAAa,OACvD;GACL,MAAMC,EAAmBD,EAAY,KAAK;GAC1C,OAAOE,EAAE,gDAAgD,EAAE,MAAMC,EAAiBb,EAAM,YAAY,EAAE,CAAC;EACzG,CACD,GAEKc,KAAmB,GAAiB,MAAqB;GAC7D,IAAId,EAAM,oBAAoB,UAAU,KAAKA,EAAM,oBAAoB,WAAW,GAGlF;QAAIA,EAAM,oBAAoB,QAAA,OAAyBA,EAAM,oBAAoB,SAAA,KAE/E,AADAe,EAAM,KAAKC,CAAQ,GACnBC,EAAO,KAAKL,EAAE,qCAAqC,CAAC;SAGtD,IAAIZ,EAAM,cAAckB,EAAa,OACrC;UAAK,IAAMC,KAAaC,GACtB,IAAIpB,EAAM,oBAAoB,UAAUmB,EAAU,SAASnB,EAAM,oBAAoB,WAAWmB,EAAU,QAAQ;MAEhH,AADAJ,EAAM,KAAKI,EAAU,MAAM,GAC3BF,EAAO,KAAKL,EAAEO,EAAU,MAAM,CAAC;MAC/B;KACF;;GAPF;EASF,GAEME,KAAsB,GAAiB,MAAqB;GAChE,KAAK,IAAMC,KAAetB,EAAM,oBAAoB,uBAAuB;IACzE,IAAMuB,IAAUrB,EAAe,aAAa,qBAAqBoB,IAC3DE,IAAWD,GAAS;IAC1B,AAAIA,KAAWC,KAAYA,EAAS,SAAS,KAAK,CAACT,EAAM,SAASS,CAAQ,MACxET,EAAM,KAAKS,CAAQ,GACnBP,EAAO,KAAKM,EAAQ,KAAK;GAE7B;EACF,GAEME,IAAOhB,QAAe;GAC1B,IAAMM,IAAkB,CAAC,GACnBE,IAAmB,CAAC;GAiB1B,OAfIjB,EAAM,oBAAoB,UAAU,SAAS,MAC/Ce,EAAM,KAAKW,CAAU,GACrBT,EAAO,KAAKL,EAAE,uCAAuC,CAAC,IAEpDZ,EAAM,oBAAoB,YAC5Be,EAAM,KAAKY,CAAQ,GACnBV,EAAO,KAAKL,EAAE,qCAAqC,CAAC,IAElDZ,EAAM,WAAWA,EAAM,oBAAoB,aAC7Ce,EAAM,KAAKa,CAAQ,GACnBX,EAAO,KAAKL,EAAE,qCAAqC,CAAC,IAEtDE,EAAgBC,GAAOE,CAAM,GAC7BI,EAAmBN,GAAOE,CAAM,GAEzB;IAAE;IAAO;GAAO;EACzB,CAAC;E,iBAICjC,GAAAC,EAAA,GAAAC,EA+BM,OAAA,EA7BJ,OAAKC,EAAA,CAAC,2BAAyB,EAAA,oCAAA,CACgBc,EAAA,gBAAe,CAAA,CAAA,E;GAGtDA,EAAA,gBADRhB,EAAA,GAAAC,EAMO,QANPW,GAMOT,EADFa,EAAA,YAAY,GAAA,CAAA,K;GAGTO,EAAA,SADRvB,EAAA,GAAAK,EAUQC,GAAA;;IARN,MAAK;IACL,SAAQ;IACR,OAAM;IACN,OAAM;IACL,OAAOiB,EAAA,MAAgB;IACxB,WAAQ;;IAER,SAAAhB,QAA0B,CAAvBC,EAAAL,EAAAoB,EAAA,MAAgB,IAAI,GAAA,CAAA,C;;;IAEzBvB,EAAA,EAAA,GAAAC,EAOEQ,GAAA,MAAAC,EANwB8B,EAAA,MAAK,QAArB,GAAM,OADhBxC,EAAA,GAAAC,EAOE,OAAA;IALC,KAAKuD;IACN,OAAM;IACL,KAAKA;IACN,KAAI;IACH,OAAOhB,EAAA,MAAK,OAAOiB,MAAK;;E,SA5BnB,CAAA9C,GAAA6B,EAAA,MAAK,MAAM,SAAM,KAAQjB,EAAA,SAAmBP,EAAA,YAAY,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetMetadata.js","names":["_sfc_main","AssetMetadata_vue_vue_type_script_setup_true_lang_default","AssetMetadata_default"],"sources":["../../../../../src/domains/dam/assetDetail/components/AssetMetadata.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, ref, watch } from 'vue'\nimport { DamAssetTypeDefault } from '@/domains/dam/types/Asset'\nimport { useAssetDetailStore } from '@/domains/dam/assetDetail/store/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetFileInfoPanel from '@/domains/dam/assetDetail/components/AssetFileInfoPanel.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport ABooleanValue from '@/domains/ui/components/ABooleanValue.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport { useCommonAdminCoreDamOptions } from '@/domains/dam/composables/commonAdminCoreDamOptions'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\nimport { useAssetSuggestions } from '@/domains/dam/uploadQueue/composables/assetSuggestions'\nimport { useDamCachedAuthors } from '@/domains/dam/author/composables/cachedAuthors'\nimport { useDamCachedUsers } from '@/domains/dam/author/composables/cachedUsers'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n readonly?: boolean\n configName?: string\n showEditButton?: boolean\n }>(),\n {\n readonly: false,\n configName: undefined,\n showEditButton: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'editInDam'): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\nconst { t } = useI18n()\n\nconst panels = ref(['metadata', 'file'])\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, metadataAreTouched, mainFileSingleUse } = storeToRefs(assetDetailStore)\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { getAuthorConflicts } = useAssetSuggestions()\nconst { addToCachedAuthors, fetchCachedAuthors } = useDamCachedAuthors(damConfigName)\n\n// DAM author suggestions for names read from the file, as the queue row card offers them.\n// Taken from the asset itself, because nothing writes the store field.\n// None in a read-only side panel, or when the authors field is disabled. Such an asset may still carry old suggestions.\nconst authorConflicts = computed<DocId[]>(() =>\n props.readonly || !authorEnabled.value || !asset.value\n ? []\n : getAuthorConflicts(asset.value.metadata.authorSuggestions ?? {})\n)\n// The chips show names from the configuration's cache, as the row's do. Without it a chip spins forever.\nwatch(\n authorConflicts,\n (conflicts) => {\n if (conflicts.length === 0) return\n addToCachedAuthors(conflicts)\n fetchCachedAuthors()\n },\n { immediate: true }\n)\n\nconst onAnyMetadataChange = () => {\n metadataAreTouched.value = true\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { mainFileSingleUseEnabled, showFileInfoEnabled, editAssetLabel }
|
|
1
|
+
{"version":3,"file":"AssetMetadata.js","names":["_sfc_main","AssetMetadata_vue_vue_type_script_setup_true_lang_default","AssetMetadata_default"],"sources":["../../../../../src/domains/dam/assetDetail/components/AssetMetadata.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, ref, watch } from 'vue'\nimport { DamAssetTypeDefault } from '@/domains/dam/types/Asset'\nimport { useAssetDetailStore } from '@/domains/dam/assetDetail/store/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetFileInfoPanel from '@/domains/dam/assetDetail/components/AssetFileInfoPanel.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport ABooleanValue from '@/domains/ui/components/ABooleanValue.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport { useCommonAdminCoreDamOptions } from '@/domains/dam/composables/commonAdminCoreDamOptions'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\nimport { useAssetSuggestions } from '@/domains/dam/uploadQueue/composables/assetSuggestions'\nimport { useDamCachedAuthors } from '@/domains/dam/author/composables/cachedAuthors'\nimport { useDamCachedUsers } from '@/domains/dam/author/composables/cachedUsers'\nimport { useAutoDeleteTimeLeft } from '@/domains/dam/assetDetail/composables/autoDeleteTimeLeft'\nimport { useRemainingTime } from '@/domains/ui/datetime/composables/remainingTime'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n readonly?: boolean\n configName?: string\n showEditButton?: boolean\n }>(),\n {\n readonly: false,\n configName: undefined,\n showEditButton: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'editInDam'): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\nconst { t } = useI18n()\n\nconst panels = ref(['metadata', 'file'])\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, metadataAreTouched, mainFileSingleUse } = storeToRefs(assetDetailStore)\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { getAuthorConflicts } = useAssetSuggestions()\nconst { addToCachedAuthors, fetchCachedAuthors } = useDamCachedAuthors(damConfigName)\n\n// DAM author suggestions for names read from the file, as the queue row card offers them.\n// Taken from the asset itself, because nothing writes the store field.\n// None in a read-only side panel, or when the authors field is disabled. Such an asset may still carry old suggestions.\nconst authorConflicts = computed<DocId[]>(() =>\n props.readonly || !authorEnabled.value || !asset.value\n ? []\n : getAuthorConflicts(asset.value.metadata.authorSuggestions ?? {})\n)\n// The chips show names from the configuration's cache, as the row's do. Without it a chip spins forever.\nwatch(\n authorConflicts,\n (conflicts) => {\n if (conflicts.length === 0) return\n addToCachedAuthors(conflicts)\n fetchCachedAuthors()\n },\n { immediate: true }\n)\n\nconst onAnyMetadataChange = () => {\n metadataAreTouched.value = true\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { mainFileSingleUseEnabled, showFileInfoEnabled, showAutoDeleteEnabled, showLicenceEnabled, editAssetLabel } =\n useCommonAdminCoreDamOptions(damConfigName)\n\n// Only where the configuration turns it on: without it no clock runs.\nconst { secondsLeft: autoDeleteSecondsLeft } = useAutoDeleteTimeLeft(() =>\n showAutoDeleteEnabled ? asset.value?.autoDeleteAt : null\n)\nconst { remainingTimeLong } = useRemainingTime()\nconst autoDeleteIn = computed(() =>\n autoDeleteSecondsLeft.value === null ? null : remainingTimeLong(autoDeleteSecondsLeft.value)\n)\n\nconst { addToCachedUsers, fetchCachedUsers } = useDamCachedUsers(damConfigName)\n// The \"file\" panel chips show creator and modifier from the configuration's user cache.\n// A picker click fills it only for the clicked asset.\n// The \"edit asset\" detail of a widget or a queue row showed two chips spinning forever.\nwatch(\n [() => asset.value?.createdBy, () => asset.value?.modifiedBy],\n ([createdBy, modifiedBy]) => {\n if (!showFileInfoEnabled || (!createdBy && !modifiedBy)) return\n addToCachedUsers(createdBy, modifiedBy)\n fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VBtn\n v-if=\"showEditButton && asset\"\n size=\"small\"\n class=\"ma-2\"\n @click=\"emit('editInDam')\"\n >\n {{ editAssetLabel }}\n </VBtn>\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 :readonly=\"readonly\"\n @any-change=\"onAnyMetadataChange\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n density=\"compact\"\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 :disabled=\"readonly\"\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 density=\"compact\"\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 :disabled=\"readonly\"\n :required=\"authorRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"mainFileSingleUseEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n >\n <ABooleanValue :value=\"mainFileSingleUse\" />\n </ARow>\n <VSwitch\n v-else\n v-model=\"mainFileSingleUse\"\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n />\n </VCol>\n </VRow>\n <VRow\n v-if=\"autoDeleteIn !== null\"\n density=\"compact\"\n class=\"my-2\"\n data-cy=\"asset-auto-delete\"\n >\n <VCol>\n <ARow :title=\"t('common.damImage.asset.model.autoDelete')\">\n {{ autoDeleteIn }}\n </ARow>\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VExpansionPanelText>\n </VExpansionPanel>\n <!-- The detail wraps text only between words, unlike its card (design 1.10, JS29). -->\n <AssetFileInfoPanel\n v-if=\"showFileInfoEnabled\"\n :asset=\"asset\"\n show-users\n :show-licence=\"showLicenceEnabled\"\n style=\"overflow-wrap: normal\"\n />\n </VExpansionPanels>\n</template>\n"],"mappings":""}
|
package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
import e from "../../../ui/components/ABooleanValue.js";
|
|
2
2
|
import t from "../../../ui/components/ARow.js";
|
|
3
3
|
import n from "../../../form/components/ASystemEntityScope.js";
|
|
4
|
-
import { DamAssetTypeDefault as
|
|
5
|
-
import { useCommonAdminCoreDamOptions as
|
|
6
|
-
import { useDamConfigName as
|
|
7
|
-
import { useAssetDetailStore as
|
|
8
|
-
import { useDamCachedAuthors as
|
|
9
|
-
import { useDamCachedUsers as
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
4
|
+
import { DamAssetTypeDefault as ee } from "../../types/Asset.js";
|
|
5
|
+
import { useCommonAdminCoreDamOptions as r } from "../../composables/commonAdminCoreDamOptions.js";
|
|
6
|
+
import { useDamConfigName as i } from "../../composables/damConfigName.js";
|
|
7
|
+
import { useAssetDetailStore as te } from "../store/assetDetailStore.js";
|
|
8
|
+
import { useDamCachedAuthors as a } from "../../author/composables/cachedAuthors.js";
|
|
9
|
+
import { useDamCachedUsers as ne } from "../../author/composables/cachedUsers.js";
|
|
10
|
+
import { useRemainingTime as re } from "../../../ui/datetime/composables/remainingTime.js";
|
|
11
|
+
import { useAutoDeleteTimeLeft as ie } from "../composables/autoDeleteTimeLeft.js";
|
|
12
|
+
import { ADamAssetMetadataValidationScopeSymbol as o } from "../../composables/uploadValidations.js";
|
|
13
|
+
import s from "./AssetCustomMetadataForm.js";
|
|
14
|
+
import c from "./AssetFileInfoPanel.js";
|
|
15
|
+
import { useAssetSuggestions as l } from "../../uploadQueue/composables/assetSuggestions.js";
|
|
16
|
+
import u from "../../author/components/AuthorRemoteAutocompleteWithCached.js";
|
|
17
|
+
import d from "../../keyword/components/KeywordRemoteAutocompleteWithCached.js";
|
|
18
|
+
import { useDamKeywordAssetTypeConfig as f } from "../../keyword/composables/damKeywordConfig.js";
|
|
19
|
+
import { useDamAuthorAssetTypeConfig as p } from "../../author/composables/damAuthorConfig.js";
|
|
20
|
+
import { Fragment as ae, computed as m, createBlock as h, createCommentVNode as g, createElementBlock as oe, createTextVNode as _, createVNode as v, defineComponent as y, isRef as b, openBlock as x, ref as se, toDisplayString as S, unref as C, watch as w, withCtx as T } from "vue";
|
|
21
|
+
import { useI18n as E } from "vue-i18n";
|
|
22
|
+
import { VCol as D, VRow as O } from "vuetify/components/VGrid";
|
|
23
|
+
import { VBtn as k } from "vuetify/components/VBtn";
|
|
24
|
+
import { VSwitch as A } from "vuetify/components/VSwitch";
|
|
25
|
+
import { storeToRefs as j } from "pinia";
|
|
26
|
+
import { VExpansionPanel as M, VExpansionPanelText as N, VExpansionPanels as P } from "vuetify/components/VExpansionPanel";
|
|
25
27
|
// src/domains/dam/assetDetail/components/AssetMetadata.vue?vue&type=script&setup=true&lang.ts
|
|
26
|
-
var
|
|
28
|
+
var F = /*@__PURE__*/ y({
|
|
27
29
|
__name: "AssetMetadata",
|
|
28
30
|
props: {
|
|
29
31
|
extSystem: {},
|
|
@@ -38,68 +40,68 @@ var I = /*@__PURE__*/ S({
|
|
|
38
40
|
}
|
|
39
41
|
},
|
|
40
42
|
emits: ["editInDam"],
|
|
41
|
-
setup(
|
|
42
|
-
let
|
|
43
|
-
|
|
44
|
-
e.length !== 0 && (
|
|
43
|
+
setup(y, { emit: F }) {
|
|
44
|
+
let I = y, L = F, R = i(I.configName), { t: z } = E(), B = se(["metadata", "file"]), V = te(), { asset: H, metadataAreTouched: U, mainFileSingleUse: W } = j(V), G = m(() => H.value?.attributes.assetType || ee), { authorRequired: K, authorEnabled: q } = p(G.value, I.extSystem, R), { getAuthorConflicts: ce } = l(), { addToCachedAuthors: le, fetchCachedAuthors: ue } = a(R), J = m(() => I.readonly || !q.value || !H.value ? [] : ce(H.value.metadata.authorSuggestions ?? {}));
|
|
45
|
+
w(J, (e) => {
|
|
46
|
+
e.length !== 0 && (le(e), ue());
|
|
45
47
|
}, { immediate: !0 });
|
|
46
|
-
let
|
|
47
|
-
|
|
48
|
-
}, { keywordRequired:
|
|
49
|
-
return
|
|
50
|
-
|
|
51
|
-
}, { immediate: !0 }), (
|
|
48
|
+
let Y = () => {
|
|
49
|
+
U.value = !0;
|
|
50
|
+
}, { keywordRequired: de, keywordEnabled: fe } = f(G.value, I.extSystem, R), { mainFileSingleUseEnabled: X, showFileInfoEnabled: Z, showAutoDeleteEnabled: pe, showLicenceEnabled: me, editAssetLabel: he } = r(R), { secondsLeft: Q } = ie(() => pe ? H.value?.autoDeleteAt : null), { remainingTimeLong: ge } = re(), $ = m(() => Q.value === null ? null : ge(Q.value)), { addToCachedUsers: _e, fetchCachedUsers: ve } = ne(R);
|
|
51
|
+
return w([() => H.value?.createdBy, () => H.value?.modifiedBy], ([e, t]) => {
|
|
52
|
+
Z && (e || t) && (_e(e, t), ve());
|
|
53
|
+
}, { immediate: !0 }), (ee, r) => (x(), oe(ae, null, [y.showEditButton && C(H) ? (x(), h(k, {
|
|
52
54
|
key: 0,
|
|
53
55
|
size: "small",
|
|
54
56
|
class: "ma-2",
|
|
55
|
-
onClick:
|
|
57
|
+
onClick: r[0] ||= (e) => L("editInDam")
|
|
56
58
|
}, {
|
|
57
|
-
default:
|
|
59
|
+
default: T(() => [_(S(C(he)), 1)]),
|
|
58
60
|
_: 1
|
|
59
|
-
})) :
|
|
61
|
+
})) : g("", !0), C(H) ? (x(), h(P, {
|
|
60
62
|
key: 1,
|
|
61
|
-
modelValue:
|
|
62
|
-
"onUpdate:modelValue":
|
|
63
|
+
modelValue: B.value,
|
|
64
|
+
"onUpdate:modelValue": r[5] ||= (e) => B.value = e,
|
|
63
65
|
multiple: "",
|
|
64
66
|
class: "v-expansion-panels--compact"
|
|
65
67
|
}, {
|
|
66
|
-
default:
|
|
68
|
+
default: T(() => [v(M, {
|
|
67
69
|
elevation: "0",
|
|
68
|
-
title:
|
|
70
|
+
title: C(z)("common.damImage.asset.detail.info.metadata"),
|
|
69
71
|
value: "metadata"
|
|
70
72
|
}, {
|
|
71
|
-
default:
|
|
72
|
-
default:
|
|
73
|
+
default: T(() => [v(N, null, {
|
|
74
|
+
default: T(() => [C(H) ? (x(), h(s, {
|
|
73
75
|
key: 0,
|
|
74
|
-
modelValue:
|
|
75
|
-
"onUpdate:modelValue":
|
|
76
|
-
"ext-system":
|
|
77
|
-
"asset-type":
|
|
78
|
-
readonly:
|
|
79
|
-
onAnyChange:
|
|
76
|
+
modelValue: C(H).metadata.customData,
|
|
77
|
+
"onUpdate:modelValue": r[4] ||= (e) => C(H).metadata.customData = e,
|
|
78
|
+
"ext-system": y.extSystem,
|
|
79
|
+
"asset-type": G.value,
|
|
80
|
+
readonly: y.readonly,
|
|
81
|
+
onAnyChange: Y
|
|
80
82
|
}, {
|
|
81
|
-
"after-pinned":
|
|
82
|
-
|
|
83
|
+
"after-pinned": T(() => [
|
|
84
|
+
C(fe) ? (x(), h(O, {
|
|
83
85
|
key: 0,
|
|
84
86
|
density: "compact",
|
|
85
87
|
class: "my-2"
|
|
86
88
|
}, {
|
|
87
|
-
default:
|
|
88
|
-
default:
|
|
89
|
+
default: T(() => [v(D, null, {
|
|
90
|
+
default: T(() => [v(n, {
|
|
89
91
|
subject: "keyword",
|
|
90
92
|
system: "dam"
|
|
91
93
|
}, {
|
|
92
|
-
default:
|
|
93
|
-
modelValue:
|
|
94
|
-
"onUpdate:modelValue": [
|
|
95
|
-
"ext-system":
|
|
96
|
-
label:
|
|
94
|
+
default: T(() => [v(d, {
|
|
95
|
+
modelValue: C(H).keywords,
|
|
96
|
+
"onUpdate:modelValue": [r[1] ||= (e) => C(H).keywords = e, Y],
|
|
97
|
+
"ext-system": y.extSystem,
|
|
98
|
+
label: C(z)("common.damImage.asset.model.keywords"),
|
|
97
99
|
"data-cy": "custom-field-keywords",
|
|
98
100
|
clearable: "",
|
|
99
101
|
multiple: "",
|
|
100
|
-
disabled:
|
|
101
|
-
required:
|
|
102
|
-
"validation-scope":
|
|
102
|
+
disabled: y.readonly,
|
|
103
|
+
required: C(de),
|
|
104
|
+
"validation-scope": C(o)
|
|
103
105
|
}, null, 8, [
|
|
104
106
|
"modelValue",
|
|
105
107
|
"ext-system",
|
|
@@ -113,29 +115,29 @@ var I = /*@__PURE__*/ S({
|
|
|
113
115
|
_: 1
|
|
114
116
|
})]),
|
|
115
117
|
_: 1
|
|
116
|
-
})) :
|
|
117
|
-
|
|
118
|
+
})) : g("", !0),
|
|
119
|
+
C(q) ? (x(), h(O, {
|
|
118
120
|
key: 1,
|
|
119
121
|
density: "compact",
|
|
120
122
|
class: "my-2"
|
|
121
123
|
}, {
|
|
122
|
-
default:
|
|
123
|
-
default:
|
|
124
|
+
default: T(() => [v(D, null, {
|
|
125
|
+
default: T(() => [v(n, {
|
|
124
126
|
subject: "author",
|
|
125
127
|
system: "dam"
|
|
126
128
|
}, {
|
|
127
|
-
default:
|
|
128
|
-
modelValue:
|
|
129
|
-
"onUpdate:modelValue": [
|
|
130
|
-
"ext-system":
|
|
131
|
-
label:
|
|
132
|
-
"author-conflicts":
|
|
129
|
+
default: T(() => [v(u, {
|
|
130
|
+
modelValue: C(H).authors,
|
|
131
|
+
"onUpdate:modelValue": [r[2] ||= (e) => C(H).authors = e, Y],
|
|
132
|
+
"ext-system": y.extSystem,
|
|
133
|
+
label: C(z)("common.damImage.asset.model.authors"),
|
|
134
|
+
"author-conflicts": J.value,
|
|
133
135
|
"data-cy": "custom-field-authors",
|
|
134
136
|
clearable: "",
|
|
135
137
|
multiple: "",
|
|
136
|
-
disabled:
|
|
137
|
-
required:
|
|
138
|
-
"validation-scope":
|
|
138
|
+
disabled: y.readonly,
|
|
139
|
+
required: C(K),
|
|
140
|
+
"validation-scope": C(o)
|
|
139
141
|
}, null, 8, [
|
|
140
142
|
"modelValue",
|
|
141
143
|
"ext-system",
|
|
@@ -150,29 +152,44 @@ var I = /*@__PURE__*/ S({
|
|
|
150
152
|
_: 1
|
|
151
153
|
})]),
|
|
152
154
|
_: 1
|
|
153
|
-
})) :
|
|
154
|
-
|
|
155
|
+
})) : g("", !0),
|
|
156
|
+
C(X) ? (x(), h(O, {
|
|
155
157
|
key: 2,
|
|
156
158
|
density: "compact",
|
|
157
159
|
class: "my-2"
|
|
158
160
|
}, {
|
|
159
|
-
default:
|
|
160
|
-
default:
|
|
161
|
+
default: T(() => [v(D, null, {
|
|
162
|
+
default: T(() => [y.readonly ? (x(), h(t, {
|
|
161
163
|
key: 0,
|
|
162
|
-
title:
|
|
164
|
+
title: C(z)("common.damImage.asset.model.mainFileSingleUse")
|
|
163
165
|
}, {
|
|
164
|
-
default:
|
|
166
|
+
default: T(() => [v(e, { value: C(W) }, null, 8, ["value"])]),
|
|
165
167
|
_: 1
|
|
166
|
-
}, 8, ["title"])) : (
|
|
168
|
+
}, 8, ["title"])) : (x(), h(A, {
|
|
167
169
|
key: 1,
|
|
168
|
-
modelValue:
|
|
169
|
-
"onUpdate:modelValue":
|
|
170
|
-
label:
|
|
170
|
+
modelValue: C(W),
|
|
171
|
+
"onUpdate:modelValue": r[3] ||= (e) => b(W) ? W.value = e : null,
|
|
172
|
+
label: C(z)("common.damImage.asset.model.mainFileSingleUse")
|
|
171
173
|
}, null, 8, ["modelValue", "label"]))]),
|
|
172
174
|
_: 1
|
|
173
175
|
})]),
|
|
174
176
|
_: 1
|
|
175
|
-
})) :
|
|
177
|
+
})) : g("", !0),
|
|
178
|
+
$.value === null ? g("", !0) : (x(), h(O, {
|
|
179
|
+
key: 3,
|
|
180
|
+
density: "compact",
|
|
181
|
+
class: "my-2",
|
|
182
|
+
"data-cy": "asset-auto-delete"
|
|
183
|
+
}, {
|
|
184
|
+
default: T(() => [v(D, null, {
|
|
185
|
+
default: T(() => [v(t, { title: C(z)("common.damImage.asset.model.autoDelete") }, {
|
|
186
|
+
default: T(() => [_(S($.value), 1)]),
|
|
187
|
+
_: 1
|
|
188
|
+
}, 8, ["title"])]),
|
|
189
|
+
_: 1
|
|
190
|
+
})]),
|
|
191
|
+
_: 1
|
|
192
|
+
}))
|
|
176
193
|
]),
|
|
177
194
|
_: 1
|
|
178
195
|
}, 8, [
|
|
@@ -180,20 +197,21 @@ var I = /*@__PURE__*/ S({
|
|
|
180
197
|
"ext-system",
|
|
181
198
|
"asset-type",
|
|
182
199
|
"readonly"
|
|
183
|
-
])) :
|
|
200
|
+
])) : g("", !0)]),
|
|
184
201
|
_: 1
|
|
185
202
|
})]),
|
|
186
203
|
_: 1
|
|
187
|
-
}, 8, ["title"]),
|
|
204
|
+
}, 8, ["title"]), C(Z) ? (x(), h(c, {
|
|
188
205
|
key: 0,
|
|
189
|
-
asset:
|
|
206
|
+
asset: C(H),
|
|
190
207
|
"show-users": "",
|
|
208
|
+
"show-licence": C(me),
|
|
191
209
|
style: { "overflow-wrap": "normal" }
|
|
192
|
-
}, null, 8, ["asset"])) :
|
|
210
|
+
}, null, 8, ["asset", "show-licence"])) : g("", !0)]),
|
|
193
211
|
_: 1
|
|
194
|
-
}, 8, ["modelValue"])) :
|
|
212
|
+
}, 8, ["modelValue"])) : g("", !0)], 64));
|
|
195
213
|
}
|
|
196
214
|
});
|
|
197
|
-
export {
|
|
215
|
+
export { F as default };
|
|
198
216
|
|
|
199
217
|
//# sourceMappingURL=AssetMetadata.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetMetadata.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_unref","_createBlock","_component_VBtn","_withCtx","_createTextVNode","_toDisplayString","_createCommentVNode","_component_VExpansionPanels","_createVNode","_component_VExpansionPanel","_component_VExpansionPanelText","AssetCustomMetadataForm","_component_VRow","_component_VCol","ASystemEntityScope","KeywordRemoteAutocompleteWithCached","AuthorRemoteAutocompleteWithCached","ARow","ABooleanValue","_component_VSwitch","_isRef","AssetFileInfoPanel","ABooleanValue_default","ARow_default","ASystemEntityScope_default","AssetCustomMetadataForm_default","AssetFileInfoPanel_default","AuthorRemoteAutocompleteWithCached_default","KeywordRemoteAutocompleteWithCached_default","AssetMetadata_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","damConfigName","useDamConfigName","useI18n","panels","ref","assetDetailStore","useAssetDetailStore","storeToRefs","assetType","computed","asset","DamAssetTypeDefault","useDamAuthorAssetTypeConfig","useAssetSuggestions","useDamCachedAuthors","authorConflicts","authorEnabled","getAuthorConflicts","conflicts","addToCachedAuthors","fetchCachedAuthors","onAnyMetadataChange","useDamKeywordAssetTypeConfig","useCommonAdminCoreDamOptions","useDamCachedUsers","watch","createdBy","modifiedBy","showFileInfoEnabled","addToCachedUsers","fetchCachedUsers","openBlock","createElementBlock","Fragment","unref","createBlock","VBtn","_cache","withCtx","createTextVNode","toDisplayString","editAssetLabel","createCommentVNode","VExpansionPanels","$event","createVNode","VExpansionPanel","t","VExpansionPanelText","keywordEnabled","VRow","VCol","keywordRequired","ADamAssetMetadataValidationScopeSymbol","authorRequired","mainFileSingleUseEnabled","mainFileSingleUse","VSwitch","isRef"],"sources":["../../../../../src/domains/dam/assetDetail/components/AssetMetadata.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, ref, watch } from 'vue'\nimport { DamAssetTypeDefault } from '@/domains/dam/types/Asset'\nimport { useAssetDetailStore } from '@/domains/dam/assetDetail/store/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetFileInfoPanel from '@/domains/dam/assetDetail/components/AssetFileInfoPanel.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport ABooleanValue from '@/domains/ui/components/ABooleanValue.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport { useCommonAdminCoreDamOptions } from '@/domains/dam/composables/commonAdminCoreDamOptions'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\nimport { useAssetSuggestions } from '@/domains/dam/uploadQueue/composables/assetSuggestions'\nimport { useDamCachedAuthors } from '@/domains/dam/author/composables/cachedAuthors'\nimport { useDamCachedUsers } from '@/domains/dam/author/composables/cachedUsers'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n readonly?: boolean\n configName?: string\n showEditButton?: boolean\n }>(),\n {\n readonly: false,\n configName: undefined,\n showEditButton: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'editInDam'): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\nconst { t } = useI18n()\n\nconst panels = ref(['metadata', 'file'])\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, metadataAreTouched, mainFileSingleUse } = storeToRefs(assetDetailStore)\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { getAuthorConflicts } = useAssetSuggestions()\nconst { addToCachedAuthors, fetchCachedAuthors } = useDamCachedAuthors(damConfigName)\n\n// DAM author suggestions for names read from the file, as the queue row card offers them.\n// Taken from the asset itself, because nothing writes the store field.\n// None in a read-only side panel, or when the authors field is disabled. Such an asset may still carry old suggestions.\nconst authorConflicts = computed<DocId[]>(() =>\n props.readonly || !authorEnabled.value || !asset.value\n ? []\n : getAuthorConflicts(asset.value.metadata.authorSuggestions ?? {})\n)\n// The chips show names from the configuration's cache, as the row's do. Without it a chip spins forever.\nwatch(\n authorConflicts,\n (conflicts) => {\n if (conflicts.length === 0) return\n addToCachedAuthors(conflicts)\n fetchCachedAuthors()\n },\n { immediate: true }\n)\n\nconst onAnyMetadataChange = () => {\n metadataAreTouched.value = true\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { mainFileSingleUseEnabled, showFileInfoEnabled, editAssetLabel } = useCommonAdminCoreDamOptions(damConfigName)\n\nconst { addToCachedUsers, fetchCachedUsers } = useDamCachedUsers(damConfigName)\n// The \"file\" panel chips show creator and modifier from the configuration's user cache.\n// A picker click fills it only for the clicked asset.\n// The \"edit asset\" detail of a widget or a queue row showed two chips spinning forever.\nwatch(\n [() => asset.value?.createdBy, () => asset.value?.modifiedBy],\n ([createdBy, modifiedBy]) => {\n if (!showFileInfoEnabled || (!createdBy && !modifiedBy)) return\n addToCachedUsers(createdBy, modifiedBy)\n fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VBtn\n v-if=\"showEditButton && asset\"\n size=\"small\"\n class=\"ma-2\"\n @click=\"emit('editInDam')\"\n >\n {{ editAssetLabel }}\n </VBtn>\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 :readonly=\"readonly\"\n @any-change=\"onAnyMetadataChange\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n density=\"compact\"\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 :disabled=\"readonly\"\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 density=\"compact\"\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 :disabled=\"readonly\"\n :required=\"authorRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"mainFileSingleUseEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n >\n <ABooleanValue :value=\"mainFileSingleUse\" />\n </ARow>\n <VSwitch\n v-else\n v-model=\"mainFileSingleUse\"\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VExpansionPanelText>\n </VExpansionPanel>\n <!-- The detail wraps text only between words, unlike its card (design 1.10, JS29). -->\n <AssetFileInfoPanel\n v-if=\"showFileInfoEnabled\"\n :asset=\"asset\"\n show-users\n style=\"overflow-wrap: normal\"\n />\n </VExpansionPanels>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetMetadata.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_unref","_createBlock","_component_VBtn","_withCtx","_createTextVNode","_toDisplayString","_createCommentVNode","_component_VExpansionPanels","_createVNode","_component_VExpansionPanel","_component_VExpansionPanelText","AssetCustomMetadataForm","_component_VRow","_component_VCol","ASystemEntityScope","KeywordRemoteAutocompleteWithCached","AuthorRemoteAutocompleteWithCached","ARow","ABooleanValue","_component_VSwitch","_isRef","AssetFileInfoPanel","ABooleanValue_default","ARow_default","ASystemEntityScope_default","AssetCustomMetadataForm_default","AssetFileInfoPanel_default","AuthorRemoteAutocompleteWithCached_default","KeywordRemoteAutocompleteWithCached_default","AssetMetadata_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","damConfigName","useDamConfigName","useI18n","panels","ref","assetDetailStore","useAssetDetailStore","storeToRefs","assetType","computed","asset","DamAssetTypeDefault","useDamAuthorAssetTypeConfig","useAssetSuggestions","useDamCachedAuthors","authorConflicts","authorEnabled","getAuthorConflicts","conflicts","addToCachedAuthors","fetchCachedAuthors","onAnyMetadataChange","useDamKeywordAssetTypeConfig","useCommonAdminCoreDamOptions","autoDeleteSecondsLeft","useAutoDeleteTimeLeft","showAutoDeleteEnabled","useRemainingTime","autoDeleteIn","remainingTimeLong","useDamCachedUsers","watch","createdBy","modifiedBy","showFileInfoEnabled","addToCachedUsers","fetchCachedUsers","openBlock","createElementBlock","Fragment","unref","createBlock","VBtn","_cache","withCtx","createTextVNode","toDisplayString","editAssetLabel","createCommentVNode","VExpansionPanels","$event","createVNode","VExpansionPanel","t","VExpansionPanelText","keywordEnabled","VRow","VCol","keywordRequired","ADamAssetMetadataValidationScopeSymbol","authorRequired","mainFileSingleUseEnabled","mainFileSingleUse","VSwitch","isRef","showLicenceEnabled"],"sources":["../../../../../src/domains/dam/assetDetail/components/AssetMetadata.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, ref, watch } from 'vue'\nimport { DamAssetTypeDefault } from '@/domains/dam/types/Asset'\nimport { useAssetDetailStore } from '@/domains/dam/assetDetail/store/assetDetailStore'\nimport { storeToRefs } from 'pinia'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetFileInfoPanel from '@/domains/dam/assetDetail/components/AssetFileInfoPanel.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport ABooleanValue from '@/domains/ui/components/ABooleanValue.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport { useCommonAdminCoreDamOptions } from '@/domains/dam/composables/commonAdminCoreDamOptions'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\nimport { useAssetSuggestions } from '@/domains/dam/uploadQueue/composables/assetSuggestions'\nimport { useDamCachedAuthors } from '@/domains/dam/author/composables/cachedAuthors'\nimport { useDamCachedUsers } from '@/domains/dam/author/composables/cachedUsers'\nimport { useAutoDeleteTimeLeft } from '@/domains/dam/assetDetail/composables/autoDeleteTimeLeft'\nimport { useRemainingTime } from '@/domains/ui/datetime/composables/remainingTime'\n\nconst props = withDefaults(\n defineProps<{\n extSystem: IntegerId\n readonly?: boolean\n configName?: string\n showEditButton?: boolean\n }>(),\n {\n readonly: false,\n configName: undefined,\n showEditButton: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'editInDam'): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\nconst { t } = useI18n()\n\nconst panels = ref(['metadata', 'file'])\n\nconst assetDetailStore = useAssetDetailStore()\nconst { asset, metadataAreTouched, mainFileSingleUse } = storeToRefs(assetDetailStore)\n\nconst assetType = computed(() => {\n return asset.value?.attributes.assetType || DamAssetTypeDefault\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { getAuthorConflicts } = useAssetSuggestions()\nconst { addToCachedAuthors, fetchCachedAuthors } = useDamCachedAuthors(damConfigName)\n\n// DAM author suggestions for names read from the file, as the queue row card offers them.\n// Taken from the asset itself, because nothing writes the store field.\n// None in a read-only side panel, or when the authors field is disabled. Such an asset may still carry old suggestions.\nconst authorConflicts = computed<DocId[]>(() =>\n props.readonly || !authorEnabled.value || !asset.value\n ? []\n : getAuthorConflicts(asset.value.metadata.authorSuggestions ?? {})\n)\n// The chips show names from the configuration's cache, as the row's do. Without it a chip spins forever.\nwatch(\n authorConflicts,\n (conflicts) => {\n if (conflicts.length === 0) return\n addToCachedAuthors(conflicts)\n fetchCachedAuthors()\n },\n { immediate: true }\n)\n\nconst onAnyMetadataChange = () => {\n metadataAreTouched.value = true\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nconst { mainFileSingleUseEnabled, showFileInfoEnabled, showAutoDeleteEnabled, showLicenceEnabled, editAssetLabel } =\n useCommonAdminCoreDamOptions(damConfigName)\n\n// Only where the configuration turns it on: without it no clock runs.\nconst { secondsLeft: autoDeleteSecondsLeft } = useAutoDeleteTimeLeft(() =>\n showAutoDeleteEnabled ? asset.value?.autoDeleteAt : null\n)\nconst { remainingTimeLong } = useRemainingTime()\nconst autoDeleteIn = computed(() =>\n autoDeleteSecondsLeft.value === null ? null : remainingTimeLong(autoDeleteSecondsLeft.value)\n)\n\nconst { addToCachedUsers, fetchCachedUsers } = useDamCachedUsers(damConfigName)\n// The \"file\" panel chips show creator and modifier from the configuration's user cache.\n// A picker click fills it only for the clicked asset.\n// The \"edit asset\" detail of a widget or a queue row showed two chips spinning forever.\nwatch(\n [() => asset.value?.createdBy, () => asset.value?.modifiedBy],\n ([createdBy, modifiedBy]) => {\n if (!showFileInfoEnabled || (!createdBy && !modifiedBy)) return\n addToCachedUsers(createdBy, modifiedBy)\n fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VBtn\n v-if=\"showEditButton && asset\"\n size=\"small\"\n class=\"ma-2\"\n @click=\"emit('editInDam')\"\n >\n {{ editAssetLabel }}\n </VBtn>\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 :readonly=\"readonly\"\n @any-change=\"onAnyMetadataChange\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n density=\"compact\"\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 :disabled=\"readonly\"\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 density=\"compact\"\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 :disabled=\"readonly\"\n :required=\"authorRequired\"\n :validation-scope=\"ADamAssetMetadataValidationScopeSymbol\"\n @update:model-value=\"onAnyMetadataChange\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"mainFileSingleUseEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n >\n <ABooleanValue :value=\"mainFileSingleUse\" />\n </ARow>\n <VSwitch\n v-else\n v-model=\"mainFileSingleUse\"\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n />\n </VCol>\n </VRow>\n <VRow\n v-if=\"autoDeleteIn !== null\"\n density=\"compact\"\n class=\"my-2\"\n data-cy=\"asset-auto-delete\"\n >\n <VCol>\n <ARow :title=\"t('common.damImage.asset.model.autoDelete')\">\n {{ autoDeleteIn }}\n </ARow>\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VExpansionPanelText>\n </VExpansionPanel>\n <!-- The detail wraps text only between words, unlike its card (design 1.10, JS29). -->\n <AssetFileInfoPanel\n v-if=\"showFileInfoEnabled\"\n :asset=\"asset\"\n show-users\n :show-licence=\"showLicenceEnabled\"\n style=\"overflow-wrap: normal\"\n />\n </VExpansionPanels>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DatetimeUTCNullable } from '../../../../shared/types/common';
|
|
2
|
+
/**
|
|
3
|
+
* Seconds left until DAM deletes the asset (`autoDeleteAt`), never below zero; `null` when it is not deleted.
|
|
4
|
+
* The time moves on while it is shown: a clock ticks every minute, and only while there is a date.
|
|
5
|
+
* Call it in component setup, the clock stops with the component.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useAutoDeleteTimeLeft(autoDeleteAt: () => DatetimeUTCNullable | undefined): {
|
|
8
|
+
secondsLeft: import('vue').ComputedRef<number | null>;
|
|
9
|
+
};
|