f7cloud_client/apps/photos/js/AlbumForm-B5HQDBP6.chunk.mjs.map
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

1 line
34 KiB
Plaintext

{"version":3,"file":"AlbumForm-B5HQDBP6.chunk.mjs","sources":["../node_modules/@mdi/svg/svg/account-group-outline.svg","../src/components/Albums/CollaboratorsSelectionForm.vue","../src/components/Albums/AlbumForm.vue"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='mdi-account-group-outline'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M12,5A3.5,3.5%200%200,0%208.5,8.5A3.5,3.5%200%200,0%2012,12A3.5,3.5%200%200,0%2015.5,8.5A3.5,3.5%200%200,0%2012,5M12,7A1.5,1.5%200%200,1%2013.5,8.5A1.5,1.5%200%200,1%2012,10A1.5,1.5%200%200,1%2010.5,8.5A1.5,1.5%200%200,1%2012,7M5.5,8A2.5,2.5%200%200,0%203,10.5C3,11.44%203.53,12.25%204.29,12.68C4.65,12.88%205.06,13%205.5,13C5.94,13%206.35,12.88%206.71,12.68C7.08,12.47%207.39,12.17%207.62,11.81C6.89,10.86%206.5,9.7%206.5,8.5C6.5,8.41%206.5,8.31%206.5,8.22C6.2,8.08%205.86,8%205.5,8M18.5,8C18.14,8%2017.8,8.08%2017.5,8.22C17.5,8.31%2017.5,8.41%2017.5,8.5C17.5,9.7%2017.11,10.86%2016.38,11.81C16.5,12%2016.63,12.15%2016.78,12.3C16.94,12.45%2017.1,12.58%2017.29,12.68C17.65,12.88%2018.06,13%2018.5,13C18.94,13%2019.35,12.88%2019.71,12.68C20.47,12.25%2021,11.44%2021,10.5A2.5,2.5%200%200,0%2018.5,8M12,14C9.66,14%205,15.17%205,17.5V19H19V17.5C19,15.17%2014.34,14%2012,14M4.71,14.55C2.78,14.78%200,15.76%200,17.5V19H3V17.07C3,16.06%203.69,15.22%204.71,14.55M19.29,14.55C20.31,15.22%2021,16.06%2021,17.07V19H24V17.5C24,15.76%2021.22,14.78%2019.29,14.55M12,16C13.53,16%2015.24,16.5%2016.23,17H7.77C8.76,16.5%2010.47,16%2012,16Z'%20/%3e%3c/svg%3e\"","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<div class=\"manage-collaborators\">\n\t\t<h2 class=\"manage-collaborators__title\">\n\t\t\t{{ t('photos', 'Add collaborators') }}\n\t\t</h2>\n\n\t\t<form class=\"manage-collaborators__form\" @submit.prevent>\n\t\t\t<NcSelect\n\t\t\t\tv-model=\"searchText\"\n\t\t\t\tinput-id=\"sharing-search-input\"\n\t\t\t\t:input-label=\"t('photos', 'Add people or groups who can edit your album')\"\n\t\t\t\t:loading=\"loadingCollaborators\"\n\t\t\t\tlabel=\"label\"\n\t\t\t\t:filterable=\"false\"\n\t\t\t\t:placeholder=\"t('photos', 'Search people or groups')\"\n\t\t\t\t:clear-search-on-blur=\"() => false\"\n\t\t\t\t:user-select=\"true\"\n\t\t\t\t:append-to-body=\"false\"\n\t\t\t\t:options=\"searchResults\"\n\t\t\t\t@search=\"searchCollaborators\"\n\t\t\t\t@option:selected=\"({ key }) => selectEntity(key)\">\n\t\t\t\t{{ t('photos', 'No recommendations. Start typing.') }}\n\t\t\t</NcSelect>\n\t\t</form>\n\n\t\t<ul class=\"manage-collaborators__selection\">\n\t\t\t<li\n\t\t\t\tv-for=\"collaboratorKey of listableSelectedCollaboratorsKeys\"\n\t\t\t\t:key=\"collaboratorKey\"\n\t\t\t\tclass=\"manage-collaborators__selection__item\">\n\t\t\t\t<NcListItemIcon\n\t\t\t\t\t:id=\"availableCollaborators[collaboratorKey].id\"\n\t\t\t\t\t:display-name=\"availableCollaborators[collaboratorKey].label\"\n\t\t\t\t\t:name=\"availableCollaborators[collaboratorKey].label\"\n\t\t\t\t\t:user=\"availableCollaborators[collaboratorKey].id\"\n\t\t\t\t\t:is-no-user=\"availableCollaborators[collaboratorKey].type !== collaboratorTypes.User\">\n\t\t\t\t\t<AccountGroupOutline v-if=\"availableCollaborators[collaboratorKey].type === collaboratorTypes.Group\" :title=\"t('photos', 'Group')\" />\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:aria-label=\"t('photos', 'Remove {collaboratorLabel} from the collaborators list', { collaboratorLabel: availableCollaborators[collaboratorKey].label })\"\n\t\t\t\t\t\t@click=\"unselectEntity(collaboratorKey)\">\n\t\t\t\t\t\t<Close slot=\"icon\" :size=\"20\" />\n\t\t\t\t\t</NcButton>\n\t\t\t\t</NcListItemIcon>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<div class=\"actions\">\n\t\t\t<div v-if=\"allowPublicLink\" class=\"actions__public-link\">\n\t\t\t\t<template v-if=\"isPublicLinkSelected && publicLink.id !== ''\">\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tclass=\"manage-collaborators__public-link-button\"\n\t\t\t\t\t\t:aria-label=\"t('photos', 'Copy the public link')\"\n\t\t\t\t\t\t:title=\"publicLinkURL\"\n\t\t\t\t\t\t@click=\"copyPublicLink\">\n\t\t\t\t\t\t<template v-if=\"publicLinkCopied\">\n\t\t\t\t\t\t\t{{ t('photos', 'Public link copied!') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t{{ t('photos', 'Copy public link') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Check v-if=\"publicLinkCopied\" />\n\t\t\t\t\t\t\t<ContentCopy v-else />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:aria-label=\"t('photos', 'Delete the public link')\"\n\t\t\t\t\t\t@click=\"deletePublicLink\">\n\t\t\t\t\t\t<Close slot=\"icon\" />\n\t\t\t\t\t</NcButton>\n\t\t\t\t</template>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-else\n\t\t\t\t\t:disabled=\"isPublicLinkSelected && publicLink.id === ''\"\n\t\t\t\t\t:aria-label=\"t('photos', 'Create public link share')\"\n\t\t\t\t\tclass=\"manage-collaborators__public-link-button\"\n\t\t\t\t\t@click=\"createPublicLinkForAlbum\">\n\t\t\t\t\t<Earth slot=\"icon\" />\n\t\t\t\t\t{{ t('photos', 'Share via public link') }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\n\t\t\t<div class=\"actions__slot\">\n\t\t\t\t<slot :collaborators=\"selectedCollaborators\" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang='ts'>\n\nimport type { PropType } from 'vue'\nimport type { Collaborator } from '../../store/albums.js'\n\nimport AccountGroupOutlineSvg from '@mdi/svg/svg/account-group-outline.svg'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport { generateOcsUrl, generateUrl } from '@nextcloud/router'\nimport { ShareType } from '@nextcloud/sharing'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcListItemIcon from '@nextcloud/vue/components/NcListItemIcon'\nimport NcSelect from '@nextcloud/vue/components/NcSelect'\nimport AccountGroupOutline from 'vue-material-design-icons/AccountGroupOutline.vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Earth from 'vue-material-design-icons/Earth.vue'\nimport FetchCollectionContentMixin from '../../mixins/FetchCollectionContentMixin.js'\nimport logger from '../../services/logger.js'\nimport { albumsExtraProps } from '../../store/albums.ts'\n\ntype CollaboratorSearchResult = Collaborator & {\n\tkey: string\n\tdisplayName: string // The label of the collaborator for display.\n\ticonSvg?: Element // An icon to differentiate the collaborator type.\n}\n\nexport default {\n\tname: 'CollaboratorsSelectionForm',\n\n\tcomponents: {\n\t\tClose,\n\t\tAccountGroupOutline,\n\t\tContentCopy,\n\t\tCheck,\n\t\tEarth,\n\t\tNcButton,\n\t\tNcListItemIcon,\n\t\tNcSelect,\n\t},\n\n\tmixins: [FetchCollectionContentMixin],\n\n\tprops: {\n\t\talbumName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tcollaborators: {\n\t\t\ttype: Array as PropType<Collaborator[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\tallowPublicLink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsearchText: null,\n\t\t\tavailableCollaborators: {} as Record<string, Collaborator>,\n\t\t\tselectedCollaboratorsKeys: [] as string[],\n\t\t\tcurrentSearchResults: [] as Collaborator[],\n\t\t\tloadingCollaborators: false,\n\t\t\trandomId: Math.random().toString().substring(2, 10),\n\t\t\tpublicLinkCopied: false,\n\t\t\tcollaboratorTypes: ShareType,\n\t\t\tconfig: {\n\t\t\t\tminSearchStringLength: parseInt(OC.config['sharing.minSearchStringLength'], 10) || 0,\n\t\t\t},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tsearchResults(): CollaboratorSearchResult[] {\n\t\t\treturn this.currentSearchResults\n\t\t\t\t.filter(({ id }) => id !== getCurrentUser()?.uid)\n\t\t\t\t.map((collaborator) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...collaborator,\n\t\t\t\t\t\tkey: `${collaborator.type}:${collaborator.id}`,\n\t\t\t\t\t\ticonSvg: collaborator.type === ShareType.Group ? AccountGroupOutlineSvg : undefined,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.filter(({ key }) => !this.selectedCollaboratorsKeys.includes(key))\n\t\t},\n\n\t\tlistableSelectedCollaboratorsKeys(): string[] {\n\t\t\treturn this.selectedCollaboratorsKeys\n\t\t\t\t.filter((collaboratorKey) => this.availableCollaborators[collaboratorKey].type !== ShareType.Link)\n\t\t},\n\n\t\tselectedCollaborators(): Collaborator[] {\n\t\t\treturn this.selectedCollaboratorsKeys\n\t\t\t\t.map((collaboratorKey) => this.availableCollaborators[collaboratorKey])\n\t\t},\n\n\t\tisPublicLinkSelected(): boolean {\n\t\t\treturn this.selectedCollaboratorsKeys.includes(`${ShareType.Link}`)\n\t\t},\n\n\t\tpublicLink(): Collaborator {\n\t\t\treturn this.availableCollaborators[ShareType.Link]\n\t\t},\n\n\t\tpublicLinkURL(): string {\n\t\t\treturn `${window.location.protocol}//${window.location.host}${generateUrl(`apps/photos/public/${this.publicLink.id}`)}`\n\t\t},\n\n\t\talbumFileName(): string {\n\t\t\treturn this.$store.getters.getAlbumName(this.albumName)\n\t\t},\n\t},\n\n\twatch: {\n\t\tcollaborators(collaborators) {\n\t\t\tthis.populateCollaborators(collaborators)\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.populateCollaborators(this.collaborators)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Fetch possible collaborators.\n\t\t *\n\t\t * @param query\n\t\t */\n\t\tasync searchCollaborators(query: string) {\n\t\t\tif (query === undefined) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tquery = query.trim()\n\n\t\t\tif (query.length < this.config.minSearchStringLength) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.loadingCollaborators = true\n\t\t\t\tconst response = await axios.get(generateOcsUrl('core/autocomplete/get'), {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tsearch: query,\n\t\t\t\t\t\titemType: 'share-recipients',\n\t\t\t\t\t\tshareTypes: [\n\t\t\t\t\t\t\tShareType.User,\n\t\t\t\t\t\t\tShareType.Group,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tthis.currentSearchResults = response.data.ocs.data\n\t\t\t\t\t.map((collaborator) => {\n\t\t\t\t\t\tswitch (collaborator.source) {\n\t\t\t\t\t\t\tcase 'users':\n\t\t\t\t\t\t\t\treturn { id: collaborator.id, label: collaborator.label, type: ShareType.User }\n\t\t\t\t\t\t\tcase 'groups':\n\t\t\t\t\t\t\t\treturn { id: collaborator.id, label: collaborator.label, type: ShareType.Group }\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new Error(`Invalid collaborator source ${collaborator.source}`)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\tthis.availableCollaborators = {\n\t\t\t\t\t...this.availableCollaborators,\n\t\t\t\t\t...this.currentSearchResults.reduce(this.indexCollaborators, {}),\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.errorFetchingCollaborators = error\n\t\t\t\tlogger.error(this.t('photos', 'Failed to fetch collaborators list.'), { error })\n\t\t\t\tshowError(this.t('photos', 'Failed to fetch collaborators list.'))\n\t\t\t} finally {\n\t\t\t\tthis.loadingCollaborators = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Populate selectedCollaboratorsKeys and availableCollaborators.\n\t\t *\n\t\t * @param collaborators\n\t\t */\n\t\tpopulateCollaborators(collaborators: Collaborator[]) {\n\t\t\tconst initialCollaborators = collaborators.reduce(this.indexCollaborators, {})\n\t\t\tthis.selectedCollaboratorsKeys = Object.keys(initialCollaborators)\n\t\t\tthis.availableCollaborators = {\n\t\t\t\t3: {\n\t\t\t\t\tid: '',\n\t\t\t\t\tlabel: this.t('photos', 'Public link'),\n\t\t\t\t\ttype: ShareType.Link,\n\t\t\t\t},\n\n\t\t\t\t...this.availableCollaborators,\n\t\t\t\t...initialCollaborators,\n\t\t\t}\n\t\t},\n\n\t\tindexCollaborators(collaborators: Record<string, Collaborator>, collaborator: Collaborator) {\n\t\t\treturn { ...collaborators, [`${collaborator.type}${collaborator.type === ShareType.Link ? '' : ':'}${collaborator.type === ShareType.Link ? '' : collaborator.id}`]: collaborator }\n\t\t},\n\n\t\tasync createPublicLinkForAlbum() {\n\t\t\tthis.selectEntity(`${ShareType.Link}`)\n\t\t\tawait this.updateAlbumCollaborators()\n\t\t\tawait this.fetchCollection(\n\t\t\t\tthis.albumFileName,\n\t\t\t\talbumsExtraProps,\n\t\t\t)\n\t\t},\n\n\t\tasync deletePublicLink() {\n\t\t\tthis.unselectEntity(`${ShareType.Link}`)\n\t\t\tthis.availableCollaborators[3] = {\n\t\t\t\tid: '',\n\t\t\t\tlabel: this.t('photos', 'Public link'),\n\t\t\t\ttype: ShareType.Link,\n\t\t\t}\n\t\t\tthis.publicLinkCopied = false\n\t\t\tawait this.updateAlbumCollaborators()\n\t\t},\n\n\t\tasync updateAlbumCollaborators() {\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('updateCollection', {\n\t\t\t\t\tcollectionFileName: this.albumFileName,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tcollaborators: this.selectedCollaborators,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('[PublicAlbumContent] Error updating album', { error })\n\t\t\t\tshowError(this.t('photos', 'Failed to update album.'))\n\t\t\t}\n\t\t},\n\n\t\tasync copyPublicLink() {\n\t\t\tawait navigator.clipboard.writeText(this.publicLinkURL)\n\t\t\tthis.publicLinkCopied = true\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.publicLinkCopied = false\n\t\t\t}, 10000)\n\t\t},\n\n\t\tselectEntity(collaboratorKey) {\n\t\t\tthis.searchText = null\n\n\t\t\tif (this.selectedCollaboratorsKeys.includes(collaboratorKey)) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.selectedCollaboratorsKeys.push(collaboratorKey)\n\t\t},\n\n\t\tunselectEntity(collaboratorKey) {\n\t\t\tconst index = this.selectedCollaboratorsKeys.indexOf(collaboratorKey)\n\n\t\t\tif (index === -1) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.selectedCollaboratorsKeys.splice(index, 1)\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.manage-collaborators {\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 20px;\n\theight: 500px;\n\n\t&__title {\n\t\tfont-weight: bold;\n\t}\n\n\t&__subtitle {\n\t\tcolor: var(--color-text-lighter);\n\t}\n\n\t&__public-link-button {\n\t\tmargin: 4px 0;\n\t}\n\n\t&__form {\n\t\tmargin-top: 4px 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\n\t\t&__input {\n\t\t\tposition: relative;\n\t\t\tdisplay: block;\n\n\t\t\tinput {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding-inline-start: 34px;\n\t\t\t}\n\n\t\t\t.loading-icon {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc(36px / 2 - 20px / 2);\n\t\t\t\tinset-inline-end: 8px;\n\t\t\t}\n\t\t}\n\n\t\t&__list {\n\t\t\tpadding: 8px;\n\t\t\theight: 350px;\n\t\t\toverflow: scroll;\n\n\t\t\t&__result {\n\t\t\t\tpadding: 8px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t\tbox-sizing: border-box;\n\n\t\t\t\t&, & * {\n\t\t\t\t\tcursor: pointer !important;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: var(--color-background-dark);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&--empty {\n\t\t\t\tmargin: 100px 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__selection {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmargin-top: 32px;\n\t\tflex-grow: 1;\n\n\t\t&__item {\n\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\tpadding: 0 8px;\n\n\t\t\t&:hover {\n\t\t\t\tbackground: var(--color-background-dark);\n\t\t\t}\n\n\t\t\t:deep(.option) {\n\t\t\t\tgap: 4px;\n\t\t\t}\n\t\t}\n\t}\n\n\t.actions {\n\t\tdisplay: flex;\n\t\tmargin-top: 8px;\n\n\t\t&__public-link {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\n\t\t\tbutton {\n\t\t\t\tmargin-inline-start: 8px;\n\t\t\t}\n\t\t}\n\n\t\t&__slot {\n\t\t\tflex-grow: 1;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: flex-end;\n\t\t\talign-items: center;\n\t\t}\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<form v-if=\"!showCollaboratorView\" class=\"album-form\" @submit.prevent=\"submit()\">\n\t\t<div class=\"form-inputs\">\n\t\t\t<NcTextField\n\t\t\t\tref=\"nameInput\"\n\t\t\t\tv-model.trim=\"albumName\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tname=\"name\"\n\t\t\t\t:helper-text=\"albumNameValidationError\"\n\t\t\t\t:error=\"albumNameValidationError !== undefined\"\n\t\t\t\t:required=\"true\"\n\t\t\t\t:label=\"t('photos', 'Name of the album')\" />\n\t\t\t<NcTextField\n\t\t\t\t:value.sync=\"albumLocation\"\n\t\t\t\tname=\"location\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:label=\"t('photos', 'Location of the album')\">\n\t\t\t\t<template #default>\n\t\t\t\t\t<MapMarkerOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcTextField>\n\t\t</div>\n\n\t\t<PhotosFiltersInput\n\t\t\t:selected-filters=\"albumFilters\"\n\t\t\t@select-filter=\"selectFilter\" />\n\t\t<PhotosFiltersDisplay\n\t\t\t:selected-filters=\"albumFilters\"\n\t\t\t@deselect-filter=\"deselectFilter\" />\n\n\t\t<div class=\"form-buttons\">\n\t\t\t<span class=\"left-buttons\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"displayBackButton\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t@click=\"back\">\n\t\t\t\t\t{{ t('photos', 'Back') }}\n\t\t\t\t</NcButton>\n\t\t\t</span>\n\t\t\t<span class=\"right-buttons\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"sharingEnabled && !editMode\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t:disabled=\"!canSubmit\"\n\t\t\t\t\t@click=\"showCollaboratorView = true\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<AccountMultiplePlusOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('photos', 'Add collaborators') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:disabled=\"!canSubmit\"\n\t\t\t\t\t@click=\"submit()\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\n\t\t\t\t\t\t<SendOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ editMode ? t('photos', 'Save') : t('photos', 'Create album') }}\n\t\t\t\t</NcButton>\n\t\t\t</span>\n\t\t</div>\n\t</form>\n\t<CollaboratorsSelectionForm\n\t\tv-else\n\t\t:album-name=\"albumName\"\n\t\t:allow-public-link=\"false\">\n\t\t<template #default=\"{ collaborators }\">\n\t\t\t<span class=\"left-buttons\">\n\t\t\t\t<NcButton\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t@click=\"showCollaboratorView = false\">\n\t\t\t\t\t{{ t('photos', 'Back') }}\n\t\t\t\t</NcButton>\n\t\t\t</span>\n\t\t\t<span class=\"right-buttons\">\n\t\t\t\t<NcButton\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:disabled=\"!canSubmit\"\n\t\t\t\t\t@click=\"submit(collaborators)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\n\t\t\t\t\t\t<SendOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ editMode ? t('photos', 'Save') : t('photos', 'Create album') }}\n\t\t\t\t</NcButton>\n\t\t\t</span>\n\t\t</template>\n\t</CollaboratorsSelectionForm>\n</template>\n\n<script lang='ts'>\nimport type { PropType } from 'vue'\nimport type { FilterOption } from '../../services/PhotosFilters/PhotosFilter.ts'\nimport type { Album, AlbumEditableProperties, Collaborator } from '../../store/albums.ts'\n\nimport { InvalidFilenameError, InvalidFilenameErrorReason, validateFilename } from '@nextcloud/files'\nimport { resultToNode } from '@nextcloud/files/dav'\nimport { t } from '@nextcloud/l10n'\nimport moment from '@nextcloud/moment'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport AccountMultiplePlusOutline from 'vue-material-design-icons/AccountMultiplePlusOutline.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport SendOutline from 'vue-material-design-icons/SendOutline.vue'\nimport PhotosFiltersDisplay from '../PhotosFilters/PhotosFiltersDisplay.vue'\nimport PhotosFiltersInput from '../PhotosFilters/PhotosFiltersInput.vue'\nimport CollaboratorsSelectionForm from './CollaboratorsSelectionForm.vue'\nimport filters from '../../services/PhotosFilters/index.ts'\nimport { albumsPrefix } from '../../store/albums.ts'\n\nexport default {\n\tname: 'AlbumForm',\n\n\tcomponents: {\n\t\tMapMarkerOutline,\n\t\tAccountMultiplePlusOutline,\n\t\tSendOutline,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t\tCollaboratorsSelectionForm,\n\t\tPhotosFiltersInput,\n\t\tPhotosFiltersDisplay,\n\t},\n\n\tprops: {\n\t\talbum: {\n\t\t\ttype: Object as PropType<Album | null>,\n\t\t\tdefault: null,\n\t\t},\n\n\t\tfiltersValue: {\n\t\t\ttype: Object as PropType<Record<string, unknown[]>>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\tdisplayBackButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tshowCollaboratorView: false,\n\t\t\talbumName: '',\n\t\t\talbumLocation: '',\n\t\t\talbumFilters: filters.reduce((acc, filter) => ({ ...acc, [filter.id]: [] }), {}),\n\t\t\tloading: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\teditMode(): boolean {\n\t\t\treturn this.album !== null\n\t\t},\n\n\t\tsharingEnabled(): boolean {\n\t\t\treturn OC.Share !== undefined\n\t\t},\n\n\t\talbumFileName(): string {\n\t\t\treturn this.$store.getters.getAlbumName(this.albumName)\n\t\t},\n\n\t\talbumNameValidationError(): string | undefined {\n\t\t\t// If loading is true, it means that the album is being created\n\t\t\t// so this condition will eventually become true\n\t\t\t// but we don't want to show the error message while loading\n\t\t\tconst existingAlbum = this.$store.getters.albums[this.albumFileName]\n\t\t\tif (existingAlbum !== undefined && this.album !== existingAlbum && !this.loading) {\n\t\t\t\treturn t('files', 'This name is already in use.')\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tvalidateFilename(this.albumName)\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof InvalidFilenameError)) {\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\n\t\t\t\tswitch (error.reason) {\n\t\t\t\t\tcase InvalidFilenameErrorReason.Character:\n\t\t\t\t\t\treturn t('files', '\"{char}\" is not allowed inside a filename.', { char: error.segment })\n\t\t\t\t\tcase InvalidFilenameErrorReason.ReservedName:\n\t\t\t\t\t\treturn undefined // We don't need to enforce that for albums.\n\t\t\t\t\tcase InvalidFilenameErrorReason.Extension:\n\t\t\t\t\t\treturn undefined // We don't need to enforce that for albums.\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn t('files', 'Invalid filename.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined\n\t\t},\n\n\t\tcanSubmit() {\n\t\t\treturn this.albumName !== '' && this.albumNameValidationError === undefined && !this.loading\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (this.editMode) {\n\t\t\tthis.albumName = this.album?.basename as string\n\t\t\tthis.albumLocation = this.album?.attributes.location ?? ''\n\t\t\tthis.albumFilters = {\n\t\t\t\t...this.albumFilters,\n\t\t\t\t...structuredClone(this.album?.attributes.filters ?? {}),\n\t\t\t}\n\t\t} else {\n\t\t\tthis.albumFilters = {\n\t\t\t\t...this.albumFilters,\n\t\t\t\t...structuredClone(this.filtersValue),\n\t\t\t}\n\t\t}\n\n\t\tthis.$nextTick(() => {\n\t\t\t(this.$refs!.nameInput! as NcTextField).$el.getElementsByTagName('input')[0].focus()\n\t\t})\n\t},\n\n\tmethods: {\n\t\tsubmit(collaborators: Collaborator[] = []) {\n\t\t\tif (!this.canSubmit) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.editMode) {\n\t\t\t\tthis.handleUpdateAlbum()\n\t\t\t} else {\n\t\t\t\tthis.handleCreateAlbum(collaborators)\n\t\t\t}\n\t\t},\n\n\t\tasync handleCreateAlbum(collaborators: Collaborator[] = []) {\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\n\t\t\t\tconst localAlbum = resultToNode({\n\t\t\t\t\tbasename: this.albumName,\n\t\t\t\t\tfilename: albumsPrefix + '/' + this.albumName,\n\t\t\t\t\tlastmod: '',\n\t\t\t\t\tsize: 0,\n\t\t\t\t\ttype: 'directory',\n\t\t\t\t\tetag: null,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayname: this.albumName,\n\t\t\t\t\t\tresourcetype: {},\n\t\t\t\t\t\tnbItems: 0,\n\t\t\t\t\t\tlocation: this.albumLocation,\n\t\t\t\t\t\t'last-photo': -1,\n\t\t\t\t\t\tdate: moment().format('MMMM YYYY'),\n\t\t\t\t\t\tcollaborators,\n\t\t\t\t\t\tfilters: this.filtersValue,\n\t\t\t\t\t\tsource: generateRemoteUrl(`dav/${this.albumFileName}`),\n\t\t\t\t\t},\n\t\t\t\t}, albumsPrefix)\n\n\t\t\t\tlet album = await this.$store.dispatch('createCollection', { collection: localAlbum })\n\n\t\t\t\tif (album === undefined) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst propertiesToUpdate: Partial<AlbumEditableProperties> = {}\n\n\t\t\t\tif (this.albumLocation !== '') {\n\t\t\t\t\tpropertiesToUpdate.location = this.albumLocation\n\t\t\t\t}\n\n\t\t\t\tif (this.albumLocation !== '' || collaborators.length !== 0) {\n\t\t\t\t\tpropertiesToUpdate.collaborators = collaborators\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(this.filtersValue).length > 0) {\n\t\t\t\t\tpropertiesToUpdate.filters = this.filtersValue\n\t\t\t\t}\n\n\t\t\t\talbum = await this.$store.dispatch('updateCollection', {\n\t\t\t\t\tcollectionFileName: this.albumFileName,\n\t\t\t\t\tproperties: propertiesToUpdate,\n\t\t\t\t})\n\n\t\t\t\tthis.$emit('done', { album })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tasync handleUpdateAlbum() {\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\n\t\t\t\tlet album = this.album?.clone() as Album\n\t\t\t\tconst changes: string[] = []\n\n\t\t\t\tif (this.album !== null && this.album.basename !== this.albumName) {\n\t\t\t\t\tchanges.push('name')\n\t\t\t\t\talbum = await this.$store.dispatch('renameCollection', { collectionFileName: this.album.root + this.album.path, newBaseName: this.albumName }) as Album\n\n\t\t\t\t\tif (album === this.album) {\n\t\t\t\t\t\treturn // Abort, and do not close the form if renaming failed\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.album !== null && this.album.attributes.location !== this.albumLocation) {\n\t\t\t\t\tchanges.push('location')\n\t\t\t\t\talbum = await this.$store.dispatch('updateCollection', { collectionFileName: album.root + album.path, properties: { location: this.albumLocation } }) as Album\n\t\t\t\t}\n\n\t\t\t\tif (this.album !== null && JSON.stringify(this.album.attributes.filters) !== JSON.stringify(this.albumFilters)) {\n\t\t\t\t\tchanges.push('filters')\n\t\t\t\t\talbum = await this.$store.dispatch('updateCollection', { collectionFileName: album.root + album.path, properties: { filters: this.albumFilters } }) as Album\n\t\t\t\t}\n\n\t\t\t\tthis.$emit('done', { album, changes })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tselectFilter(filterOption: FilterOption<unknown>) {\n\t\t\tthis.albumFilters[filterOption.filterId].push(filterOption.value)\n\t\t},\n\n\t\tdeselectFilter(filterOption: { filterId: string, value: unknown }) {\n\t\t\tconst index = this.albumFilters[filterOption.filterId].indexOf(filterOption.value)\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.albumFilters[filterOption.filterId].splice(index, 1)\n\t\t\t}\n\t\t},\n\n\t\tback() {\n\t\t\tthis.$emit('back')\n\t\t},\n\n\t\tt,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.album-form {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\theight: 350px;\n\tpadding: calc(var(--default-grid-baseline) * 4);\n\n\t.form-title {\n\t\tfont-weight: bold;\n\t}\n\n\t.form-subtitle {\n\t\tcolor: var(--color-text-lighter);\n\t}\n\n\t.form-inputs {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: calc(var(--default-grid-baseline) * 4);\n\t}\n\n\t.form-buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tflex-direction: column;\n\n\t\t.left-buttons,\n\t\t.right-buttons {\n\t\t\tdisplay: flex;\n\t\t\tgap: calc(var(--default-grid-baseline) * 4);\n\t\t}\n\n\t\t.right-buttons {\n\t\t\tjustify-content: flex-end;\n\t\t}\n\t}\n}\n\n.left-buttons {\n\tflex-grow: 1;\n}\n\n@media only screen and (max-width: 1020px) {\n\t.right-buttons {\n\t\tjustify-content: flex-end;\n\t\tflex-direction: column;\n\t}\n}\n</style>\n"],"names":["AccountGroupOutlineSvg","_sfc_main$1","Close","AccountGroupOutline","ContentCopy","Check","Earth","NcButton","NcListItemIcon","NcSelect","FetchCollectionContentMixin","ShareType","id","getCurrentUser","collaborator","key","collaboratorKey","generateUrl","collaborators","query","response","axios","generateOcsUrl","error","logger","showError","initialCollaborators","albumsExtraProps","index","translate","_sfc_main","MapMarkerOutline","AccountMultiplePlusOutline","SendOutline","NcLoadingIcon","NcTextField","CollaboratorsSelectionForm","PhotosFiltersInput","PhotosFiltersDisplay","filters","acc","filter","existingAlbum","t","validateFilename","InvalidFilenameError","InvalidFilenameErrorReason","localAlbum","resultToNode","albumsPrefix","moment","generateRemoteUrl","album","propertiesToUpdate","changes","filterOption"],"mappings":"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","x_google_ignoreList":[0]}