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

1 line
16 KiB
Plaintext

{"version":3,"file":"FaceContent-DMIngLh-.chunk.mjs","sources":["../src/views/FaceContent.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<!-- Errors handlers-->\n\t<NcEmptyContent\n\t\tv-if=\"face === undefined && !loadingFiles && !loadingFaces\"\n\t\tclass=\"empty-content-with-illustration\">\n\t\t<template #icon>\n\t\t\t<AccountBoxMultipleOutline />\n\t\t</template>\n\t\t{{ t('photos', 'This person could not be found') }}\n\t</NcEmptyContent>\n\t<NcEmptyContent v-else-if=\"errorFetchingFiles || errorFetchingFaces\">\n\t\t<template #icon>\n\t\t\t<AlertCircleOutline />\n\t\t</template>\n\t\t{{ t('photos', 'An error occurred') }}\n\t</NcEmptyContent>\n\n\t<div v-else class=\"face\">\n\t\t<div class=\"face__header\">\n\t\t\t<div class=\"face__header__left\">\n\t\t\t\t<NcActions>\n\t\t\t\t\t<NcActionButton @click=\"$router.push('/faces/')\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowLeft />\n\t\t\t\t\t\t</template>{{ t('photos', 'Back') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t\t<div class=\"face__header__title\">\n\t\t\t\t\t<h2\n\t\t\t\t\t\tv-if=\"face !== undefined\"\n\t\t\t\t\t\t:class=\"{ 'face-name': true, 'hidden-visually': face.basename.match(/^[0-9]+$/) }\">\n\t\t\t\t\t\t{{ face.basename }}\n\t\t\t\t\t</h2>\n\t\t\t\t</div>\n\n\t\t\t\t<NcLoadingIcon v-if=\"loadingCount > 0 || loadingFaces\" />\n\t\t\t</div>\n\t\t\t<div v-if=\"face !== undefined\" class=\"face__header__actions\">\n\t\t\t\t<NcActions>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t:aria-label=\"t('photos', 'Rename person')\"\n\t\t\t\t\t\t@click=\"showRenameModal = true\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<PencilOutline />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('photos', 'Rename person') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t\t<NcActions :force-menu=\"true\">\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-if=\"Object.keys(faces).length > 1\"\n\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t:aria-label=\"t('photos', 'Merge with different person')\"\n\t\t\t\t\t\t@click=\"showMergeModal = true\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Merge />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('photos', 'Merge with different person') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t<template v-if=\"selectedFileIds.length\">\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t\t:aria-label=\"t('photos', 'Download selected files')\"\n\t\t\t\t\t\t\t@click=\"downloadSelection\">\n\t\t\t\t\t\t\t<Download slot=\"icon\" />\n\t\t\t\t\t\t\t{{ t('photos', 'Download selected photos') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"shouldFavoriteSelection\"\n\t\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t\t:aria-label=\"t('photos', 'Mark selection as favorite')\"\n\t\t\t\t\t\t\t@click=\"favoriteSelection\">\n\t\t\t\t\t\t\t<StarOutline slot=\"icon\" />\n\t\t\t\t\t\t\t{{ t('photos', 'Favorite') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t\t:aria-label=\"t('photos', 'Remove selection from favorites')\"\n\t\t\t\t\t\t\t@click=\"unFavoriteSelection\">\n\t\t\t\t\t\t\t<Star slot=\"icon\" />\n\t\t\t\t\t\t\t{{ t('photos', 'Remove from favorites') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t\t@click=\"showMoveModal = true\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<AccountSwitchOutline />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ n('photos', 'Move photo to a different person', 'Move photos to a different person', selectedFileIds.length) }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t\t@click=\"handleRemoveFilesFromFace(selectedFileIds)\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<Close />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ n('photos', 'Remove photo from person', 'Remove photos from person', selectedFileIds.length) }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t\t@click=\"handleDeleteFace\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Close />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('photos', 'Remove person') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<FilesListViewer\n\t\t\tv-if=\"face !== undefined\"\n\t\t\tclass=\"face__photos\"\n\t\t\t:container-element=\"appContent\"\n\t\t\t:file-ids=\"faceFileIds\"\n\t\t\t:loading=\"loadingFiles || loadingFaces\">\n\t\t\t<FileComponent\n\t\t\t\tslot-scope=\"{ file, distance }\"\n\t\t\t\t:file=\"files[file.id]\"\n\t\t\t\t:allow-selection=\"true\"\n\t\t\t\t:selected=\"selection[file.id] === true\"\n\t\t\t\t:distance=\"distance\"\n\t\t\t\t@click=\"openViewer\"\n\t\t\t\t@select-toggled=\"onFileSelectToggle\" />\n\t\t</FilesListViewer>\n\n\t\t<NcDialog\n\t\t\tv-if=\"showRenameModal\"\n\t\t\t:name=\"t('photos', 'Rename person')\"\n\t\t\tclose-on-click-outside\n\t\t\tsize=\"small\"\n\t\t\t@closing=\"showRenameModal = false\">\n\t\t\t<div class=\"rename-form\">\n\t\t\t\t<input\n\t\t\t\t\tref=\"nameInput\"\n\t\t\t\t\tv-focus\n\t\t\t\t\t:value=\"faceName\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"name\"\n\t\t\t\t\trequired\n\t\t\t\t\t:placeholder=\"t('photos', 'Name of this person')\"\n\t\t\t\t\t@keydown.enter=\"handleRenameFace($refs.nameInput.value)\">\n\t\t\t</div>\n\t\t\t<template #actions>\n\t\t\t\t<NcButton\n\t\t\t\t\t:aria-label=\"t('photos', 'Save.')\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:disabled=\"$refs.nameInput && $refs.nameInput.value.trim() === ''\"\n\t\t\t\t\t@click=\"handleRenameFace($refs.nameInput.value)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"loadingCount\" />\n\t\t\t\t\t\t<SendOutline v-else />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('photos', 'Save') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcDialog>\n\n\t\t<NcDialog\n\t\t\tv-if=\"showMergeModal\"\n\t\t\t:name=\"t('photos', 'Merge person')\"\n\t\t\tclose-on-click-outside\n\t\t\tsize=\"normal\"\n\t\t\t@closing=\"showMergeModal = false\">\n\t\t\t<FaceMergeForm :first-face=\"faceName\" @select=\"handleMerge($event)\" />\n\t\t</NcDialog>\n\n\t\t<NcDialog\n\t\t\tv-if=\"showMoveModal\"\n\t\t\t:name=\"t('photos', 'Move to different person')\"\n\t\t\tclose-on-click-outside\n\t\t\tsize=\"normal\"\n\t\t\t@closing=\"showMoveModal = false\">\n\t\t\t<FaceMergeForm :first-face=\"faceName\" @select=\"handleMove($event, selectedFileIds)\" />\n\t\t</NcDialog>\n\t</div>\n</template>\n\n<script lang='ts'>\nimport type { Collection } from '../services/collectionFetcher.js'\n\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\nimport NcActionButton from '@nextcloud/vue/components/NcActionButton'\nimport NcActions from '@nextcloud/vue/components/NcActions'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport AccountBoxMultipleOutline from 'vue-material-design-icons/AccountBoxMultipleOutline.vue'\nimport AccountSwitchOutline from 'vue-material-design-icons/AccountSwitchOutline.vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ArrowLeft from 'vue-material-design-icons/ArrowLeft.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport Merge from 'vue-material-design-icons/Merge.vue'\nimport PencilOutline from 'vue-material-design-icons/PencilOutline.vue'\nimport SendOutline from 'vue-material-design-icons/SendOutline.vue'\nimport Star from 'vue-material-design-icons/Star.vue'\nimport StarOutline from 'vue-material-design-icons/StarOutline.vue'\nimport Download from 'vue-material-design-icons/TrayArrowDown.vue'\nimport FaceMergeForm from '../components/Faces/FaceMergeForm.vue'\nimport FileComponent from '../components/FileComponent.vue'\nimport FilesListViewer from '../components/FilesListViewer.vue'\nimport FetchFacesMixin from '../mixins/FetchFacesMixin.js'\nimport FetchFilesMixin from '../mixins/FetchFilesMixin.js'\nimport FilesSelectionMixin from '../mixins/FilesSelectionMixin.js'\nimport logger from '../services/logger.js'\nimport { toViewerFileInfo } from '../utils/fileUtils.js'\n\nexport default {\n\tname: 'FaceContent',\n\tcomponents: {\n\t\tPencilOutline,\n\t\tStar,\n\t\tStarOutline,\n\t\tDownload,\n\t\tClose,\n\t\tAlertCircleOutline,\n\t\tSendOutline,\n\t\tMerge,\n\t\tArrowLeft,\n\t\tAccountBoxMultipleOutline,\n\t\tFaceMergeForm,\n\t\tFilesListViewer,\n\t\tFileComponent,\n\t\tNcLoadingIcon,\n\t\tNcEmptyContent,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcDialog,\n\t\tNcButton,\n\t\tAccountSwitchOutline,\n\t},\n\n\tdirectives: {\n\t\tfocus(el) {\n\t\t\tVue.nextTick(() => el.focus())\n\t\t},\n\t},\n\n\tmixins: [\n\t\tFetchFacesMixin,\n\t\tFetchFilesMixin,\n\t\tFilesSelectionMixin,\n\t],\n\n\tprops: {\n\t\tfaceName: {\n\t\t\ttype: String,\n\t\t\tdefault: '/',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tshowMoveModal: false,\n\t\t\tshowMergeModal: false,\n\t\t\tshowRenameModal: false,\n\t\t\tloadingCount: 0,\n\t\t\tappContent: document.getElementById('app-content-vue'),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tfiles() {\n\t\t\treturn this.$store.state.files.files\n\t\t},\n\n\t\tfacesFiles() {\n\t\t\treturn this.$store.state.faces.facesFiles\n\t\t},\n\n\t\tface(): Collection {\n\t\t\treturn this.faces[this.faceName]\n\t\t},\n\n\t\tfaceFileIds(): string[] {\n\t\t\treturn this.facesFiles[this.faceName] || []\n\t\t},\n\n\t\tshouldFavoriteSelection(): boolean {\n\t\t\t// Favorite all selection if at least one file is not on the favorites.\n\t\t\treturn this.selectedFileIds.some((fileId) => this.$store.state.files.files[fileId].attributes.favorite === 0)\n\t\t},\n\t},\n\n\twatch: {\n\t\tface() {\n\t\t\tif (this.face) {\n\t\t\t\tthis.fetchFaceContent(this.faceName)\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.fetchFaceContent(this.faceName)\n\t},\n\n\tmethods: {\n\t\topenViewer(fileId: string) {\n\t\t\twindow.OCA.Viewer.open({\n\t\t\t\tfileInfo: toViewerFileInfo(this.files[fileId]),\n\t\t\t\tlist: this.faceFileIds.map((fileId) => toViewerFileInfo(this.files[fileId])),\n\t\t\t})\n\t\t},\n\n\t\tasync handleRemoveFilesFromFace(fileIds: string[]) {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('removeFilesFromFace', { faceName: this.faceName, fileIdsToRemove: fileIds })\n\t\t\t\tthis.resetSelection()\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync handleDeleteFace() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('deleteFace', { faceName: this.faceName })\n\t\t\t\tthis.$router.push('/faces')\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync handleRenameFace(faceName: string) {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tthis.showRenameModal = false\n\t\t\t\tconst oldName = this.faceName\n\t\t\t\tawait this.$store.dispatch('renameFace', { oldName, faceName })\n\t\t\t\tthis.$router.push({ name: 'facecontent', params: { faceName } })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync handleMerge(faceName: string) {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('moveFilesToFace', { oldFace: this.faceName, faceName, fileIdsToMove: this.facesFiles[this.faceName] })\n\t\t\t\tawait this.$store.dispatch('deleteFace', { faceName: this.faceName })\n\t\t\t\tthis.showMergeModal = false\n\t\t\t\tthis.$router.push({ name: 'facecontent', params: { faceName } })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync handleMove(faceName: string, fileIds: string[]) {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('moveFilesToFace', { oldFace: this.faceName, faceName, fileIdsToMove: fileIds })\n\t\t\t\tthis.showMoveModal = false\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync favoriteSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('toggleFavoriteForFiles', { fileIds: this.selectedFileIds, favoriteState: true })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync unFavoriteSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('toggleFavoriteForFiles', { fileIds: this.selectedFileIds, favoriteState: false })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync downloadSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.$store.dispatch('downloadFiles', this.selectedFileIds)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tt,\n\t\tn,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../mixins/FaceContent';\n</style>\n"],"names":["_sfc_main","PencilOutline","Star","StarOutline","Download","Close","AlertCircleOutline","SendOutline","Merge","ArrowLeft","AccountBoxMultipleOutline","FaceMergeForm","FilesListViewer","FileComponent","NcLoadingIcon","NcEmptyContent","NcActions","NcActionButton","NcDialog","NcButton","AccountSwitchOutline","el","Vue","FetchFacesMixin","FetchFilesMixin","FilesSelectionMixin","fileId","toViewerFileInfo","fileIds","error","logger","faceName","oldName","t","n"],"mappings":"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"}