photos/js/photos-src_views_FaceConten...

1 line
67 KiB
Plaintext

{"version":3,"file":"photos-src_views_FaceContent_vue.js?v=3457394d941dfd4279a7","mappings":"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","sources":["webpack:///photos/src/mixins/FaceCoverMixin.js","webpack:///photos/src/mixins/FetchFacesMixin.js","webpack:///photos/src/components/FaceMergeForm.vue?vue&type=style&index=0&id=6af87af4&scoped=true&lang=scss&","webpack:///photos/src/views/FaceContent.vue?vue&type=style&index=0&id=bbffc378&lang=scss&scoped=true&","webpack:///photos/node_modules/vue-material-design-icons/AlertCircle.vue","webpack:///photos/node_modules/vue-material-design-icons/AlertCircle.vue?vue&type=script&lang=js&","webpack://photos/./node_modules/vue-material-design-icons/AlertCircle.vue?489a","webpack:///photos/node_modules/vue-material-design-icons/AlertCircle.vue?vue&type=template&id=5938211a&","webpack:///photos/src/views/FaceContent.vue?vue&type=template&id=bbffc378&scoped=true&","webpack:///photos/node_modules/vue-material-design-icons/Merge.vue","webpack:///photos/node_modules/vue-material-design-icons/Merge.vue?vue&type=script&lang=js&","webpack://photos/./node_modules/vue-material-design-icons/Merge.vue?5467","webpack:///photos/node_modules/vue-material-design-icons/Merge.vue?vue&type=template&id=1ef9b8c6&","webpack:///photos/src/components/FaceMergeForm.vue","webpack:///photos/src/components/FaceMergeForm.vue?vue&type=script&lang=js&","webpack://photos/./src/components/FaceMergeForm.vue?60de","webpack:///photos/src/views/FaceContent.vue","webpack:///photos/src/views/FaceContent.vue?vue&type=script&lang=js&","webpack://photos/./src/components/FaceMergeForm.vue?6840","webpack:///photos/src/components/FaceMergeForm.vue?vue&type=template&id=6af87af4&scoped=true&","webpack://photos/./src/views/FaceContent.vue?34ba","webpack://photos/./src/views/FaceContent.vue?fd9f"],"sourcesContent":["/**\n * @copyright Copyright (c) 2022 Marcel Klehr <mklehr@gmx.net>\n *\n * @author Marcel Klehr <mklehr@gmx.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { mapGetters } from 'vuex'\nimport he from 'he'\n\nexport default {\n\tname: 'FaceCoverMixin',\n\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'faces',\n\t\t\t'facesFiles',\n\t\t\t'files',\n\t\t]),\n\t},\n\n\tmethods: {\n\t\tgetFaceCover(faceName) {\n\t\t return (this.facesFiles[faceName] || [])\n\t\t\t .slice(0, 25)\n\t\t\t .map(fileId => this.files[fileId])\n\t\t\t .map(file => ({ ...file, faceDetections: JSON.parse(he.decode(file.faceDetections)) }))\n\t\t\t // sort larges face first\n\t\t\t .sort((a, b) =>\n\t\t\t\t b.faceDetections.find(d => d.title === faceName).width\n\t\t\t\t - a.faceDetections.find(d => d.title === faceName).width\n\t\t\t )\n\t\t\t // sort fewest face detections first\n\t\t\t .sort((a, b) =>\n\t\t\t\t a.faceDetections.length\n\t\t\t\t - b.faceDetections.length\n\t\t\t )[0]\n\t\t},\n\n\t\t/**\n\t\t * This will produce an inline style to apply to images\n\t\t * to zoom toward the detected face\n\t\t *\n\t\t * @param faceName\n\t\t * @return {{}|{transform: string, width: string, transformOrigin: string}}\n\t\t */\n\t\tgetCoverStyle(faceName) {\n\t\t\tconst cover = this.getFaceCover(faceName)\n\t\t\tif (!cover) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\tconst detections = cover.faceDetections\n\n\t\t\tconst detection = detections.find(detection => detection.title === faceName)\n\n\t\t\t// Zoom into the picture so that the face fills the --photos-face-width box nicely\n\t\t\t// if the face is larger than the image, we don't zoom out (reason for the Math.max)\n\t\t\tconst zoom = Math.max(1, (1 / detection.width) * 0.4)\n\n\t\t\tconst horizontalCenterOfFace = (detection.x + detection.width / 2) * 100\n\t\t\tconst verticalCenterOfFace = (detection.y + detection.height / 2) * 100\n\n\t\t\treturn {\n\t\t\t\t// We assume that the image is inside a div with width: var(--photos-face-width)\n\t\t\t\twidth: '100%',\n\t\t\t\t// we translate the image so that the center of the detected face is in the center of the --photos-face-width box\n\t\t\t\t// and add the zoom\n\t\t\t\ttransform: `translate(calc( var(--photos-face-width)/2 - ${horizontalCenterOfFace}% ), calc( var(--photos-face-width)/2 - ${verticalCenterOfFace}% )) scale(${zoom})`,\n\t\t\t\t// this is necessary for the zoom to zoom toward the center of the face\n\t\t\t\ttransformOrigin: `${horizontalCenterOfFace}% ${verticalCenterOfFace}%`,\n\t\t\t}\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n *\n * @author Louis Chemineau <louis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { mapActions, mapGetters } from 'vuex'\n\nimport { showError } from '@nextcloud/dialogs'\nimport { getCurrentUser } from '@nextcloud/auth'\n\nimport client from '../services/DavClient.js'\nimport logger from '../services/logger.js'\nimport cancelableRequest from '../utils/CancelableRequest.js'\nimport DavRequest from '../services/DavRequest'\nimport { genFileInfo } from '../utils/fileUtils'\n\nexport default {\n\tname: 'FetchFacesMixin',\n\n\tdata() {\n\t\treturn {\n\t\t\terrorFetchingFaces: null,\n\t\t\tloadingFaces: false,\n\t\t\terrorFetchingFiles: null,\n\t\t\tloadingFiles: false,\n\t\t\tcancelFacesRequest: () => { },\n\t\t\tcancelFilesRequest: () => {},\n\t\t}\n\t},\n\n\tasync beforeMount() {\n\t\tthis.fetchFaces()\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.cancelFacesRequest('Changed view')\n\t\tthis.cancelFilesRequest('Changed view')\n\t},\n\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'faces',\n\t\t]),\n\t},\n\n\tmethods: {\n\t\t...mapActions([\n\t\t\t'appendFiles',\n\t\t]),\n\n\t\tasync fetchFaces() {\n\t\t\tif (this.loadingFaces) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (Object.keys(this.faces).length) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.loadingFaces = true\n\t\t\t\tthis.errorFetchingFaces = null\n\n\t\t\t\tconst { request, cancel } = cancelableRequest(client.getDirectoryContents)\n\t\t\t\tthis.cancelFacesRequest = cancel\n\n\t\t\t\tconst faces = await request(`/recognize/${getCurrentUser()?.uid}/faces/`)\n\t\t\t\tthis.$store.dispatch('addFaces', { faces })\n\t\t\t\tlogger.debug(`[FetchFacesMixin] Fetched ${faces.length} new faces: `, faces)\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tif (error.response.status === 404) {\n\t\t\t\t\t\tthis.errorFetchingFaces = 404\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.errorFetchingFaces = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlogger.error(t('photos', 'Failed to fetch faces list.'), error)\n\t\t\t\tshowError(t('photos', 'Failed to fetch faces list.'))\n\t\t\t} finally {\n\t\t\t\tthis.cancelFacesRequest = () => { }\n\t\t\t\tthis.loadingFaces = false\n\t\t\t}\n\t\t},\n\n\t\tasync fetchFaceContent(faceName, force) {\n\t\t\tif (this.loadingFiles) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!force && this.facesFiles[faceName] && this.facesFiles[faceName].length) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.errorFetchingFiles = null\n\t\t\t\tthis.loadingFiles = true\n\n\t\t\t\tconst { request, cancel } = cancelableRequest(client.getDirectoryContents)\n\t\t\t\tthis.cancelFilesRequest = cancel\n\n\t\t\t\tlet { data: fetchedFiles } = await request(\n\t\t\t\t\t`/recognize/${getCurrentUser()?.uid}/faces/${faceName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: DavRequest,\n\t\t\t\t\t\tdetails: true,\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\tfetchedFiles = fetchedFiles\n\t\t\t\t\t.map(file => genFileInfo(file))\n\t\t\t\t\t.map(file => ({ ...file, filename: file.realpath.replace(`/${getCurrentUser().uid}/files`, '') }))\n\n\t\t\t\tconst fileIds = fetchedFiles.map(file => '' + file.fileid)\n\n\t\t\t\tthis.appendFiles(fetchedFiles)\n\n\t\t\t\tif (fetchedFiles.length > 0) {\n\t\t\t\t\tawait this.$store.commit('addFilesToFace', { faceName, fileIdsToAdd: fileIds })\n\t\t\t\t}\n\n\t\t\t\tlogger.debug(`[FetchFacesMixin] Fetched ${fileIds.length} new files: `, fileIds)\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tif (error.response.status === 404) {\n\t\t\t\t\t\tthis.errorFetchingFiles = 404\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.errorFetchingFiles = error\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tlogger.error('Error fetching face files', error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingFiles = false\n\t\t\t\tthis.cancelFilesRequest = () => { }\n\t\t\t}\n\t\t},\n\t},\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".face-list[data-v-6af87af4]{display:flex;flex-direction:row;height:350px;flex-wrap:wrap;padding:12px}.face-list__item[data-v-6af87af4]{display:flex;flex-direction:column;padding:10px;border-radius:var(--border-radius);align-items:center;cursor:pointer;width:120px}.face-list__item *[data-v-6af87af4]{cursor:pointer}.face-list__item__crop-container[data-v-6af87af4]{overflow:hidden;width:60px;height:60px;border-radius:60px;position:relative;background:var(--color-background-darker);--photos-face-width: 60px}.face-list__item[data-v-6af87af4]:hover,.face-list__item[data-v-6af87af4]:focus{background:var(--color-background-hover)}.face-list__item__details[data-v-6af87af4]{padding:10px;height:1em;overflow:hidden;text-overflow:ellipsis;width:100%;text-align:center}.loader[data-v-6af87af4]{margin-top:25%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/FaceMergeForm.vue\"],\"names\":[],\"mappings\":\"AAyGA,4BACC,YAAA,CACA,kBAAA,CACA,YAAA,CACA,cAAA,CACA,YAAA,CAEA,kCACC,YAAA,CACA,qBAAA,CACA,YAAA,CACA,kCAAA,CACA,kBAAA,CACA,cAAA,CACA,WAAA,CAEA,oCACC,cAAA,CAGD,kDACC,eAAA,CACA,UAAA,CACA,WAAA,CACA,kBAAA,CACA,iBAAA,CACA,yCAAA,CACA,yBAAA,CAGD,gFACC,wCAAA,CAGD,2CACC,YAAA,CACA,UAAA,CACA,eAAA,CACA,sBAAA,CACA,UAAA,CACA,iBAAA,CAKH,yBACC,cAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.face-list {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\theight: 350px;\\n\\tflex-wrap: wrap;\\n\\tpadding: 12px;\\n\\n\\t&__item {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tpadding: 10px;\\n\\t\\tborder-radius: var(--border-radius);\\n\\t\\talign-items: center;\\n\\t\\tcursor: pointer;\\n\\t\\twidth: 120px;\\n\\n\\t\\t* {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t}\\n\\n\\t\\t&__crop-container {\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\twidth: 60px;\\n\\t\\t\\theight: 60px;\\n\\t\\t\\tborder-radius: 60px;\\n\\t\\t\\tposition: relative;\\n\\t\\t\\tbackground: var(--color-background-darker);\\n\\t\\t\\t--photos-face-width: 60px;\\n\\t\\t}\\n\\n\\t\\t&:hover, &:focus {\\n\\t\\t\\tbackground: var(--color-background-hover);\\n\\t\\t}\\n\\n\\t\\t&__details {\\n\\t\\t\\tpadding: 10px;\\n\\t\\t\\theight: 1em;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\ttext-align: center;\\n\\t\\t}\\n\\t}\\n}\\n\\n.loader {\\n\\tmargin-top: 25%;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".face[data-v-bbffc378]{display:flex;flex-direction:column}.face__empty[data-v-bbffc378]{display:flex;flex-direction:column;align-items:center}.face__empty__button[data-v-bbffc378]{margin-top:32px}.face__header[data-v-bbffc378]{display:flex;min-height:60px;align-items:center;justify-content:space-between;position:-webkit-sticky;position:sticky;top:var(--header-height);z-index:3;background:var(--color-main-background);padding:0 64px}@media only screen and (max-width: 1020px){.face__header[data-v-bbffc378]{padding:0;padding-left:64px}}.face__header__left[data-v-bbffc378]{height:100%;display:flex;align-items:center}.face__header__title[data-v-bbffc378]{margin-left:10px}.face__header__title h2[data-v-bbffc378]{margin-bottom:0}.face__header__loader[data-v-bbffc378]{margin-left:32px}.face__header__actions[data-v-bbffc378]{display:flex;align-items:center}.face__header__actions button[data-v-bbffc378]{margin-left:16px}.face__photos[data-v-bbffc378]{margin-top:16px;height:100%;min-height:0;padding:0 64px}@media only screen and (max-width: 1020px){.face__photos[data-v-bbffc378]{padding:0}}.empty-content-with-illustration[data-v-bbffc378] .empty-content__icon{width:200px;height:200px}.empty-content-with-illustration[data-v-bbffc378] .empty-content__icon svg{width:200px;height:200px}.rename-form[data-v-bbffc378]{display:flex;flex-direction:row;align-items:center;height:70px;padding:16px}.rename-form input[data-v-bbffc378]{width:80%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/views/FaceContent.vue\"],\"names\":[],\"mappings\":\"AAmYA,uBACC,YAAA,CACA,qBAAA,CAEA,8BACC,YAAA,CACA,qBAAA,CACA,kBAAA,CAEA,sCACC,eAAA,CAKF,+BACC,YAAA,CACA,eAAA,CACA,kBAAA,CACA,6BAAA,CACA,uBAAA,CAAA,eAAA,CACA,wBAAA,CACA,SAAA,CACA,uCAAA,CACA,cAAA,CAEA,2CAXD,+BAYE,SAAA,CACA,iBAAA,CAAA,CAGD,qCACC,WAAA,CACA,YAAA,CACA,kBAAA,CAGD,sCACC,gBAAA,CACA,yCACC,eAAA,CAIF,uCACC,gBAAA,CAGD,wCACC,YAAA,CACA,kBAAA,CAEA,+CACC,gBAAA,CAKH,+BACC,eAAA,CACA,WAAA,CACA,YAAA,CACA,cAAA,CAEA,2CAND,+BAOE,SAAA,CAAA,CAKH,wEACC,WAAA,CACA,YAAA,CAEA,4EACC,WAAA,CACA,YAAA,CAIF,8BACC,YAAA,CACA,kBAAA,CACA,kBAAA,CACA,WAAA,CACA,YAAA,CAEA,oCACC,SAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.face {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\n\\t&__empty {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\talign-items: center;\\n\\n\\t\\t&__button {\\n\\t\\t\\tmargin-top: 32px;\\n\\t\\t}\\n\\n\\t}\\n\\n\\t&__header {\\n\\t\\tdisplay: flex;\\n\\t\\tmin-height: 60px;\\n\\t\\talign-items: center;\\n\\t\\tjustify-content: space-between;\\n\\t\\tposition: sticky;\\n\\t\\ttop: var(--header-height);\\n\\t\\tz-index: 3;\\n\\t\\tbackground: var(--color-main-background);\\n\\t\\tpadding: 0 64px;\\n\\n\\t\\t@media only screen and (max-width: 1020px) {\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\tpadding-left: 64px;\\n\\t\\t}\\n\\n\\t\\t&__left {\\n\\t\\t\\theight: 100%;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t}\\n\\n\\t\\t&__title {\\n\\t\\t\\tmargin-left: 10px;\\n\\t\\t\\th2 {\\n\\t\\t\\t\\tmargin-bottom: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&__loader {\\n\\t\\t\\tmargin-left: 32px;\\n\\t\\t}\\n\\n\\t\\t&__actions {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\n\\t\\t\\tbutton {\\n\\t\\t\\t\\tmargin-left: 16px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&__photos {\\n\\t\\tmargin-top: 16px;\\n\\t\\theight: 100%;\\n\\t\\tmin-height: 0; // Prevent it from overflowing in a flex context.\\n\\t\\tpadding: 0 64px;\\n\\n\\t\\t@media only screen and (max-width: 1020px) {\\n\\t\\t\\tpadding: 0;\\n\\t\\t}\\n\\t}\\n}\\n\\n.empty-content-with-illustration ::v-deep .empty-content__icon {\\n\\twidth: 200px;\\n\\theight: 200px;\\n\\n\\tsvg {\\n\\t\\twidth: 200px;\\n\\t\\theight: 200px;\\n\\t}\\n}\\n\\n.rename-form {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\talign-items: center;\\n\\theight: 70px;\\n\\tpadding: 16px;\\n\\n\\tinput {\\n\\t\\twidth: 80%;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","<template>\n <span :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon alert-circle-icon\"\n role=\"img\"\n v-bind=\"$attrs\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AlertCircleIcon\",\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./AlertCircle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./AlertCircle.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AlertCircle.vue?vue&type=template&id=5938211a&\"\nimport script from \"./AlertCircle.vue?vue&type=script&lang=js&\"\nexport * from \"./AlertCircle.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._b({staticClass:\"material-design-icon alert-circle-icon\",attrs:{\"aria-hidden\":!_vm.title,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.face === undefined && !_vm.loadingFiles && !_vm.loadingFaces)?_c('EmptyContent',{staticClass:\"empty-content-with-illustration\",scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('AccountBoxMultipleOutline')]},proxy:true}],null,false,2861705255)},[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'This person could not be found'))+\"\\n\")]):(_vm.errorFetchingFiles || _vm.errorFetchingFaces)?_c('EmptyContent',{scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('AlertCircle')]},proxy:true}])},[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'An error occurred'))+\"\\n\")]):_c('div',{staticClass:\"face\"},[_c('div',{staticClass:\"face__header\"},[_c('div',{staticClass:\"face__header__left\"},[_c('Actions',[_c('ActionButton',{on:{\"click\":function($event){return _vm.$router.push('/faces/')}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('ArrowLeft')]},proxy:true}])},[_vm._v(_vm._s(_vm.t('photos', 'Back'))+\"\\n\\t\\t\\t\\t\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"face__header__title\"},[(_vm.face !== undefined)?_c('h2',{class:{'face-name': true, 'hidden-visually': _vm.face.basename.match(/^[0-9]+$/)}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.face.basename)+\"\\n\\t\\t\\t\\t\")]):_vm._e()]),_vm._v(\" \"),(_vm.loadingCount > 0 || _vm.loadingFaces)?_c('Loader'):_vm._e()],1),_vm._v(\" \"),(_vm.face !== undefined)?_c('div',{staticClass:\"face__header__actions\"},[_c('Actions',[_c('ActionButton',{attrs:{\"close-after-click\":true,\"aria-label\":_vm.t('photos', 'Rename person')},on:{\"click\":function($event){_vm.showRenameModal = true}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Pencil')]},proxy:true}],null,false,514409694)},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Rename person'))+\"\\n\\t\\t\\t\\t\")])],1),_vm._v(\" \"),_c('Actions',{attrs:{\"force-menu\":true}},[(Object.keys(_vm.faces).length > 1)?_c('ActionButton',{attrs:{\"close-after-click\":true,\"aria-label\":_vm.t('photos', 'Merge with different person')},on:{\"click\":function($event){_vm.showMergeModal = true}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Merge')]},proxy:true}],null,false,3117189691)},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Merge with different person'))+\"\\n\\t\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.selectedFileIds.length)?[_c('ActionButton',{attrs:{\"close-after-click\":true,\"aria-label\":_vm.t('photos', 'Download selected files')},on:{\"click\":_vm.downloadSelection}},[_c('Download',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Download selected photos'))+\"\\n\\t\\t\\t\\t\\t\")],1),_vm._v(\" \"),(_vm.shouldFavoriteSelection)?_c('ActionButton',{attrs:{\"close-after-click\":true,\"aria-label\":_vm.t('photos', 'Mark selection as favorite')},on:{\"click\":_vm.favoriteSelection}},[_c('Star',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Favorite'))+\"\\n\\t\\t\\t\\t\\t\")],1):_c('ActionButton',{attrs:{\"close-after-click\":true,\"aria-label\":_vm.t('photos', 'Remove selection from favorites')},on:{\"click\":_vm.unFavoriteSelection}},[_c('Star',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Remove from favorites'))+\"\\n\\t\\t\\t\\t\\t\")],1),_vm._v(\" \"),_c('ActionButton',{attrs:{\"close-after-click\":true},on:{\"click\":function($event){return _vm.handleRemoveFilesFromFace(_vm.selectedFileIds)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Close')]},proxy:true}],null,false,1051939733)},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.n('photos', 'Remove photo from person', 'Remove photos from person', _vm.selectedFileIds.length))+\"\\n\\t\\t\\t\\t\\t\")])]:_vm._e(),_vm._v(\" \"),_c('ActionButton',{attrs:{\"close-after-click\":true},on:{\"click\":_vm.handleDeleteFace},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Close')]},proxy:true}],null,false,1051939733)},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Remove person'))+\"\\n\\t\\t\\t\\t\")])],2)],1):_vm._e()]),_vm._v(\" \"),(_vm.face !== undefined)?_c('FilesListViewer',{staticClass:\"face__photos\",attrs:{\"use-window\":true,\"file-ids\":_vm.faceFileIds,\"loading\":_vm.loadingFiles || _vm.loadingFaces},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar file = ref.file;\nvar visibility = ref.visibility;\nreturn _c('File',{attrs:{\"file\":_vm.files[file.id],\"allow-selection\":true,\"selected\":_vm.selection[file.id] === true,\"visibility\":visibility,\"semaphore\":_vm.semaphore},on:{\"click\":_vm.openViewer,\"select-toggled\":_vm.onFileSelectToggle}})}}],null,false,3592900521)}):_vm._e(),_vm._v(\" \"),(_vm.showRenameModal)?_c('Modal',{attrs:{\"title\":_vm.t('photos', 'Rename person')},on:{\"close\":function($event){_vm.showRenameModal = false}}},[_c('div',{staticClass:\"rename-form\"},[_c('input',{directives:[{name:\"focus\",rawName:\"v-focus\"}],ref:\"nameInput\",attrs:{\"type\":\"text\",\"name\":\"name\",\"required\":\"\",\"placeholder\":_vm.t('photos', 'Name of this person')},domProps:{\"value\":_vm.faceName},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.handleRenameFace(_vm.$refs.nameInput.value)}}}),_vm._v(\" \"),_c('Button',{attrs:{\"aria-label\":_vm.t('photos', 'Save.'),\"type\":\"primary\",\"disabled\":_vm.$refs.nameInput && _vm.$refs.nameInput.value.trim() === ''},on:{\"click\":function($event){return _vm.handleRenameFace(_vm.$refs.nameInput.value)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loadingCount)?_c('Loader'):_c('Send')]},proxy:true}],null,false,3935163698)},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Save'))+\"\\n\\t\\t\\t\")])],1)]):_vm._e(),_vm._v(\" \"),(_vm.showMergeModal)?_c('Modal',{attrs:{\"title\":_vm.t('photos', 'Merge person')},on:{\"close\":function($event){_vm.showMergeModal = false}}},[_c('FaceMergeForm',{attrs:{\"first-face\":_vm.faceName},on:{\"select\":function($event){return _vm.handleMerge($event)}}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon merge-icon\"\n role=\"img\"\n v-bind=\"$attrs\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M8 17L12 13H15.2C15.6 14.2 16.7 15 18 15C19.7 15 21 13.7 21 12S19.7 9 18 9C16.7 9 15.6 9.8 15.2 11H12L8 7V3H3V8H6L10.2 12L6 16H3V21H8V17Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"MergeIcon\",\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./Merge.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./Merge.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Merge.vue?vue&type=template&id=1ef9b8c6&\"\nimport script from \"./Merge.vue?vue&type=script&lang=js&\"\nexport * from \"./Merge.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._b({staticClass:\"material-design-icon merge-icon\",attrs:{\"aria-hidden\":!_vm.title,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M8 17L12 13H15.2C15.6 14.2 16.7 15 18 15C19.7 15 21 13.7 21 12S19.7 9 18 9C16.7 9 15.6 9.8 15.2 11H12L8 7V3H3V8H6L10.2 12L6 16H3V21H8V17Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2022 Marcel Klehr <mklehr@gmx.net>\n -\n - @author Marcel Klehr <mklehr@gmx.net>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<div class=\"merge-form face-list\">\n\t\t<template v-if=\"loading\">\n\t\t\t<Loader class=\"loader\" />\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<div v-for=\"face in filteredFaces\"\n\t\t\t\t:key=\"face.basename\"\n\t\t\t\tclass=\"face-list__item\"\n\t\t\t\t@click=\"handleSelect(face.basename)\">\n\t\t\t\t<div class=\"face-list__item__crop-container\">\n\t\t\t\t\t<img class=\"face-list__item__image\"\n\t\t\t\t\t\t:src=\"getCoverUrl(face.basename)\"\n\t\t\t\t\t\t:style=\"getCoverStyle(face.basename)\">\n\t\t\t\t</div>\n\t\t\t\t<div class=\"face-list__item__details\">\n\t\t\t\t\t<span :class=\"{'hidden-visually': face.basename.match(/^[0-9]+$/)}\">{{ face.basename }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport FaceCoverMixin from '../mixins/FaceCoverMixin.js'\nimport { generateUrl } from '@nextcloud/router'\nimport { mapGetters } from 'vuex'\nimport FetchFacesMixin from '../mixins/FetchFacesMixin.js'\nimport Loader from './Loader'\n\nexport default {\n\tname: 'FaceMergeForm',\n\tcomponents: { Loader },\n\tmixins: [\n\t\tFaceCoverMixin,\n\t\tFetchFacesMixin,\n\t],\n\tprops: {\n\t\tfirstFace: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'faces',\n\t\t\t'facesFiles',\n\t\t]),\n\n\t\tfilteredFaces() {\n\t\t\treturn Object.values(this.faces).filter(face => face.basename !== this.firstFace).sort((a, b) => {\n\t\t\t\tif (!this.facesFiles[b.basename] || !this.facesFiles[a.basename]) {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t\treturn this.facesFiles[b.basename].length - this.facesFiles[a.basename].length\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\tgetCoverUrl(faceName) {\n\t\t\tconst cover = this.getFaceCover(faceName)\n\t\t\tif (!cover) {\n\t\t\t\tthis.fetchFaceContent(faceName)\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn generateUrl(`/core/preview?fileId=${cover.fileid}&x=${512}&y=${512}&forceIcon=0&a=1`)\n\t\t},\n\n\t\thandleSelect(faceName) {\n\t\t\tthis.$emit('select', faceName)\n\t\t\tthis.loading = true\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.face-list {\n\tdisplay: flex;\n\tflex-direction: row;\n\theight: 350px;\n\tflex-wrap: wrap;\n\tpadding: 12px;\n\n\t&__item {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 10px;\n\t\tborder-radius: var(--border-radius);\n\t\talign-items: center;\n\t\tcursor: pointer;\n\t\twidth: 120px;\n\n\t\t* {\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t&__crop-container {\n\t\t\toverflow: hidden;\n\t\t\twidth: 60px;\n\t\t\theight: 60px;\n\t\t\tborder-radius: 60px;\n\t\t\tposition: relative;\n\t\t\tbackground: var(--color-background-darker);\n\t\t\t--photos-face-width: 60px;\n\t\t}\n\n\t\t&:hover, &:focus {\n\t\t\tbackground: var(--color-background-hover);\n\t\t}\n\n\t\t&__details {\n\t\t\tpadding: 10px;\n\t\t\theight: 1em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twidth: 100%;\n\t\t\ttext-align: center;\n\t\t}\n\t}\n}\n\n.loader {\n\tmargin-top: 25%;\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceMergeForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceMergeForm.vue?vue&type=script&lang=js&\"","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceMergeForm.vue?vue&type=style&index=0&id=6af87af4&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceMergeForm.vue?vue&type=style&index=0&id=6af87af4&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","<!--\n - @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n - @copyright Copyright (c) 2022 Marcel Klehr <mklehr@gmx.net>\n -\n - @author Louis Chemineau <louis@chmn.me>\n - @author Marcel Klehr <mklehr@gmx.net>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<!-- Errors handlers-->\n\t<EmptyContent v-if=\"face === undefined && !loadingFiles && !loadingFaces\" class=\"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</EmptyContent>\n\t<EmptyContent v-else-if=\"errorFetchingFiles || errorFetchingFaces\">\n\t\t<template #icon>\n\t\t\t<AlertCircle />\n\t\t</template>\n\t\t{{ t('photos', 'An error occurred') }}\n\t</EmptyContent>\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<Actions>\n\t\t\t\t\t<ActionButton @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</ActionButton>\n\t\t\t\t</Actions>\n\t\t\t\t<div class=\"face__header__title\">\n\t\t\t\t\t<h2 v-if=\"face !== undefined\" :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<Loader 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<Actions>\n\t\t\t\t\t<ActionButton :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<Pencil />\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</ActionButton>\n\t\t\t\t</Actions>\n\t\t\t\t<Actions :force-menu=\"true\">\n\t\t\t\t\t<ActionButton v-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</ActionButton>\n\t\t\t\t\t<template v-if=\"selectedFileIds.length\">\n\t\t\t\t\t\t<ActionButton :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</ActionButton>\n\t\t\t\t\t\t<ActionButton v-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<Star slot=\"icon\" />\n\t\t\t\t\t\t\t{{ t('photos', 'Favorite') }}\n\t\t\t\t\t\t</ActionButton>\n\t\t\t\t\t\t<ActionButton v-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</ActionButton>\n\t\t\t\t\t\t<ActionButton :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</ActionButton>\n\t\t\t\t\t</template>\n\t\t\t\t\t<ActionButton :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</ActionButton>\n\t\t\t\t</Actions>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<FilesListViewer v-if=\"face !== undefined\"\n\t\t\tclass=\"face__photos\"\n\t\t\t:use-window=\"true\"\n\t\t\t:file-ids=\"faceFileIds\"\n\t\t\t:loading=\"loadingFiles || loadingFaces\">\n\t\t\t<File slot-scope=\"{file, visibility}\"\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:visibility=\"visibility\"\n\t\t\t\t:semaphore=\"semaphore\"\n\t\t\t\t@click=\"openViewer\"\n\t\t\t\t@select-toggled=\"onFileSelectToggle\" />\n\t\t</FilesListViewer>\n\n\t\t<Modal v-if=\"showRenameModal\"\n\t\t\t:title=\"t('photos', 'Rename person')\"\n\t\t\t@close=\"showRenameModal = false\">\n\t\t\t<div class=\"rename-form\">\n\t\t\t\t<input ref=\"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\t<Button :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<Loader v-if=\"loadingCount\" />\n\t\t\t\t\t\t<Send v-else />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('photos', 'Save') }}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</Modal>\n\n\t\t<Modal v-if=\"showMergeModal\"\n\t\t\t:title=\"t('photos', 'Merge person')\"\n\t\t\t@close=\"showMergeModal = false\">\n\t\t\t<FaceMergeForm :first-face=\"faceName\" @select=\"handleMerge($event)\" />\n\t\t</Modal>\n\t</div>\n</template>\n\n<script>\nimport { mapActions, mapGetters } from 'vuex'\nimport Pencil from 'vue-material-design-icons/Pencil'\nimport Close from 'vue-material-design-icons/Close'\nimport AlertCircle from 'vue-material-design-icons/AlertCircle'\nimport Star from 'vue-material-design-icons/Star'\nimport Download from 'vue-material-design-icons/Download'\nimport Send from 'vue-material-design-icons/Send'\nimport Merge from 'vue-material-design-icons/Merge'\nimport ArrowLeft from 'vue-material-design-icons/ArrowLeft'\nimport AccountBoxMultipleOutline from 'vue-material-design-icons/AccountBoxMultipleOutline'\n\nimport { Actions, ActionButton, Modal, EmptyContent, Button } from '@nextcloud/vue'\n\nimport FetchFilesMixin from '../mixins/FetchFilesMixin.js'\nimport FilesSelectionMixin from '../mixins/FilesSelectionMixin.js'\nimport FilesListViewer from '../components/FilesListViewer.vue'\nimport File from '../components/File.vue'\nimport Loader from '../components/Loader.vue'\nimport logger from '../services/logger.js'\nimport FetchFacesMixin from '../mixins/FetchFacesMixin.js'\nimport Vue from 'vue'\nimport FaceMergeForm from '../components/FaceMergeForm.vue'\n\nexport default {\n\tname: 'FaceContent',\n\tcomponents: {\n\t\tFaceMergeForm,\n\t\tPencil,\n\t\tStar,\n\t\tDownload,\n\t\tClose,\n\t\tAlertCircle,\n\t\tFilesListViewer,\n\t\tFile,\n\t\tEmptyContent,\n\t\tLoader,\n\t\tActions,\n\t\tActionButton,\n\t\tModal,\n\t\tSend,\n\t\tButton,\n\t\tMerge,\n\t\tArrowLeft,\n\t\tAccountBoxMultipleOutline,\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\tshowMergeModal: false,\n\t\t\tshowRenameModal: false,\n\t\t\tloadingCount: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'facesFiles',\n\t\t]),\n\n\t\t/**\n\t\t * @return {string[]} The face information for the current faceName.\n\t\t */\n\t\tface() {\n\t\t\treturn this.faces[this.faceName]\n\t\t},\n\n\t\t/**\n\t\t * @return {string[]} The list of files for the current faceName.\n\t\t */\n\t\tfaceFileIds() {\n\t\t\treturn this.facesFiles[this.faceName] || []\n\t\t},\n\n\t\t/** @type {boolean} */\n\t\tshouldFavoriteSelection() {\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].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\tmethods: {\n\t\t...mapActions([\n\t\t\t'appendFiles',\n\t\t\t'deleteFace',\n\t\t\t'renameFace',\n\t\t\t'downloadFiles',\n\t\t\t'toggleFavoriteForFiles',\n\t\t\t'removeFilesFromFace',\n\t\t\t'moveFilesToFace',\n\t\t]),\n\n\t\topenViewer(fileId) {\n\t\t\tconst file = this.files[fileId]\n\t\t\tOCA.Viewer.open({\n\t\t\t\tpath: file.filename,\n\t\t\t\tlist: this.faceFileIds.map(fileId => ({\n\t\t\t\t\t...this.files[fileId],\n\t\t\t\t\tbasename: this.files[fileId].basename.split('-', 2)[1],\n\t\t\t\t})).filter(file => !file.sectionHeader),\n\t\t\t\tloadMore: file.loadMore ? async () => await file.loadMore(true) : () => [],\n\t\t\t\tcanLoop: file.canLoop,\n\t\t\t})\n\t\t},\n\n\t\tasync handleRemoveFilesFromFace(fileIds) {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.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.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) {\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.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) {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.moveFilesToFace({ oldFace: this.faceName, faceName, fileIdsToMove: this.facesFiles[this.faceName] })\n\t\t\t\tawait this.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 favoriteSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.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.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.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\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.face {\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t&__empty {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\n\t\t&__button {\n\t\t\tmargin-top: 32px;\n\t\t}\n\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tmin-height: 60px;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tposition: sticky;\n\t\ttop: var(--header-height);\n\t\tz-index: 3;\n\t\tbackground: var(--color-main-background);\n\t\tpadding: 0 64px;\n\n\t\t@media only screen and (max-width: 1020px) {\n\t\t\tpadding: 0;\n\t\t\tpadding-left: 64px;\n\t\t}\n\n\t\t&__left {\n\t\t\theight: 100%;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t&__title {\n\t\t\tmargin-left: 10px;\n\t\t\th2 {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\t\t}\n\n\t\t&__loader {\n\t\t\tmargin-left: 32px;\n\t\t}\n\n\t\t&__actions {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\n\t\t\tbutton {\n\t\t\t\tmargin-left: 16px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__photos {\n\t\tmargin-top: 16px;\n\t\theight: 100%;\n\t\tmin-height: 0; // Prevent it from overflowing in a flex context.\n\t\tpadding: 0 64px;\n\n\t\t@media only screen and (max-width: 1020px) {\n\t\t\tpadding: 0;\n\t\t}\n\t}\n}\n\n.empty-content-with-illustration ::v-deep .empty-content__icon {\n\twidth: 200px;\n\theight: 200px;\n\n\tsvg {\n\t\twidth: 200px;\n\t\theight: 200px;\n\t}\n}\n\n.rename-form {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\theight: 70px;\n\tpadding: 16px;\n\n\tinput {\n\t\twidth: 80%;\n\t}\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceContent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceContent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FaceMergeForm.vue?vue&type=template&id=6af87af4&scoped=true&\"\nimport script from \"./FaceMergeForm.vue?vue&type=script&lang=js&\"\nexport * from \"./FaceMergeForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FaceMergeForm.vue?vue&type=style&index=0&id=6af87af4&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6af87af4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"merge-form face-list\"},[(_vm.loading)?[_c('Loader',{staticClass:\"loader\"})]:_vm._l((_vm.filteredFaces),function(face){return _c('div',{key:face.basename,staticClass:\"face-list__item\",on:{\"click\":function($event){return _vm.handleSelect(face.basename)}}},[_c('div',{staticClass:\"face-list__item__crop-container\"},[_c('img',{staticClass:\"face-list__item__image\",style:(_vm.getCoverStyle(face.basename)),attrs:{\"src\":_vm.getCoverUrl(face.basename)}})]),_vm._v(\" \"),_c('div',{staticClass:\"face-list__item__details\"},[_c('span',{class:{'hidden-visually': face.basename.match(/^[0-9]+$/)}},[_vm._v(_vm._s(face.basename))])])])})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceContent.vue?vue&type=style&index=0&id=bbffc378&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceContent.vue?vue&type=style&index=0&id=bbffc378&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FaceContent.vue?vue&type=template&id=bbffc378&scoped=true&\"\nimport script from \"./FaceContent.vue?vue&type=script&lang=js&\"\nexport * from \"./FaceContent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FaceContent.vue?vue&type=style&index=0&id=bbffc378&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"bbffc378\",\n null\n \n)\n\nexport default component.exports"],"names":["name","computed","mapGetters","methods","getFaceCover","faceName","this","facesFiles","slice","map","fileId","files","file","faceDetections","JSON","parse","he","sort","a","b","find","d","title","width","length","getCoverStyle","cover","detection","zoom","Math","max","horizontalCenterOfFace","x","verticalCenterOfFace","y","height","transform","transformOrigin","data","errorFetchingFaces","loadingFaces","errorFetchingFiles","loadingFiles","cancelFacesRequest","cancelFilesRequest","beforeMount","fetchFaces","beforeDestroy","mapActions","Object","keys","faces","cancelableRequest","client","request","cancel","getCurrentUser","uid","$store","dispatch","logger","response","status","t","showError","fetchFaceContent","force","DavRequest","details","fetchedFiles","genFileInfo","filename","realpath","replace","fileIds","fileid","appendFiles","commit","fileIdsToAdd","___CSS_LOADER_EXPORT___","push","module","id","props","type","String","fillColor","default","size","Number","_vm","_h","$createElement","_c","_self","_b","staticClass","attrs","on","$event","$emit","$attrs","_v","_s","_e","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_l","face","key","basename","handleSelect","style","getCoverUrl","class","match","undefined","scopedSlots","_u","fn","proxy","$router","loadingCount","showRenameModal","showMergeModal","selectedFileIds","downloadSelection","slot","favoriteSelection","unFavoriteSelection","handleRemoveFilesFromFace","n","handleDeleteFace","faceFileIds","ref","visibility","selection","semaphore","openViewer","onFileSelectToggle","directives","rawName","domProps","indexOf","_k","keyCode","handleRenameFace","$refs","nameInput","value","trim","handleMerge"],"sourceRoot":""}