photos/js/photos-src_views_Faces_vue....

1 line
63 KiB
Plaintext

{"version":3,"file":"photos-src_views_Faces_vue.js?v=fcb6470f432528a61cd4","mappings":"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","sources":["webpack:///photos/src/mixins/AbortControllerMixin.js","webpack:///photos/src/mixins/FaceCoverMixin.js","webpack:///photos/src/mixins/FetchFacesMixin.js","webpack:///photos/src/components/Faces/FaceCover.vue?vue&type=style&index=0&id=5cb97458&prod&lang=scss&scoped=true","webpack:///photos/src/components/Faces/UnassignedFacesCover.vue?vue&type=style&index=0&id=c72c5064&prod&lang=scss&scoped=true","webpack:///photos/src/views/Faces.vue?vue&type=style&index=0&id=740b3c8a&prod&lang=scss&scoped=true","webpack:///photos/node_modules/vue-material-design-icons/AccountBoxMultipleOutline.vue","webpack:///photos/node_modules/vue-material-design-icons/AccountBoxMultipleOutline.vue?vue&type=script&lang=js","webpack://photos/./node_modules/vue-material-design-icons/AccountBoxMultipleOutline.vue?a4da","webpack:///photos/node_modules/vue-material-design-icons/AccountBoxMultipleOutline.vue?vue&type=template&id=6bcc1fce","webpack://photos/./src/components/Faces/FaceCover.vue?076a","webpack:///photos/src/components/Faces/FaceCover.vue","webpack:///photos/src/components/Faces/FaceCover.vue?vue&type=script&lang=js","webpack://photos/./src/components/Faces/FaceCover.vue?77ea","webpack://photos/./src/components/Faces/FaceCover.vue?eba5","webpack://photos/./src/views/Faces.vue?9d13","webpack:///photos/node_modules/vue-material-design-icons/AccountOff.vue","webpack:///photos/node_modules/vue-material-design-icons/AccountOff.vue?vue&type=script&lang=js","webpack://photos/./node_modules/vue-material-design-icons/AccountOff.vue?800f","webpack:///photos/src/components/Faces/UnassignedFacesCover.vue?vue&type=script&lang=js","webpack:///photos/src/components/Faces/UnassignedFacesCover.vue","webpack:///photos/node_modules/vue-material-design-icons/AccountOff.vue?vue&type=template&id=4a2e1178","webpack://photos/./src/components/Faces/UnassignedFacesCover.vue?5965","webpack://photos/./src/components/Faces/UnassignedFacesCover.vue?89fd","webpack:///photos/src/views/Faces.vue?vue&type=script&lang=js","webpack:///photos/src/views/Faces.vue","webpack://photos/./src/components/Faces/UnassignedFacesCover.vue?cc34","webpack://photos/./src/views/Faces.vue?6bd1","webpack://photos/./src/views/Faces.vue?a265"],"sourcesContent":["/**\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\nexport default {\n\tname: 'AbortControllerMixin',\n\n\tdata() {\n\t\treturn {\n\t\t\tabortController: new AbortController(),\n\t\t}\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.abortController.abort()\n\t},\n\n\tbeforeRouteLeave(from, to, next) {\n\t\tthis.abortController.abort()\n\t\tthis.abortController = new AbortController()\n\t\tnext()\n\t},\n}\n","/**\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\treturn JSON.parse(he.decode(this.faces[faceName].props['face-preview-image'] || '{}'))\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 || !cover.detection) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\tconst detection = cover.detection\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 DavRequest from '../services/DavRequest.js'\nimport { genFileInfo } from '../utils/fileUtils.js'\nimport AbortControllerMixin from './AbortControllerMixin.js'\nimport he from 'he'\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}\n\t},\n\n\tmixins: [\n\t\tAbortControllerMixin,\n\t],\n\n\tasync beforeMount() {\n\t\tthis.fetchFaces()\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 { data: faces } = await client.getDirectoryContents(`/recognize/${getCurrentUser()?.uid}/faces/`, {\n\t\t\t\t\tdata: DavRequest,\n\t\t\t\t\tdetails: true,\n\t\t\t\t\tsignal: this.abortController.signal,\n\t\t\t\t})\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.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\tlet { data: fetchedFiles } = await client.getDirectoryContents(\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\tsignal: this.abortController.signal,\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: he.decode(file.realpath).replace(`/${getCurrentUser().uid}/files`, `/files/${getCurrentUser().uid}`) }))\n\t\t\t\t\t.map(file => ({ ...file, faceDetections: JSON.parse(he.decode(file.faceDetections)) }))\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}\n\t\t},\n\n\t\tasync fetchUnassignedFaces(force) {\n\t\t\tif (this.loadingFiles) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!force && this.unassignedFiles && this.unassignedFiles.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\tlet { data: fetchedFiles } = await client.getDirectoryContents(\n\t\t\t\t\t`/recognize/${getCurrentUser()?.uid}/unassigned-faces`,\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\tsignal: this.abortController.signal,\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: he.decode(file.realpath).replace(`/${getCurrentUser().uid}/files`, `/files/${getCurrentUser().uid}`) }))\n\t\t\t\t\t.map(file => ({ ...file, faceDetections: JSON.parse(he.decode(file.faceDetections)) }))\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('addUnassignedFiles', { fileIdsToAdd: fileIds })\n\t\t\t\t}\n\n\t\t\t\tlogger.debug(`[FetchFacesMixin] Fetched ${fileIds.length} new unassigned 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 unassigned files', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loadingFiles = false\n\t\t\t}\n\t\t},\n\n\t\tasync fetchUnassignedFacesCount() {\n\t\t\ttry {\n\t\t\t\tconst { data: unassignedFacesRoot } = await client.stat(\n\t\t\t\t\t`/recognize/${getCurrentUser()?.uid}/unassigned-faces`,\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\tsignal: this.abortController.signal,\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\tconst count = Number(unassignedFacesRoot.props.nbItems)\n\n\t\t\t\tawait this.$store.commit('setUnassignedFilesCount', count)\n\n\t\t\t\tlogger.debug('[FetchFacesMixin] Fetched unassigned files count: ', count)\n\t\t\t} catch (error) {\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tlogger.error('Error fetching unassigned files count', { error })\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-cover[data-v-5cb97458]{display:flex;flex-direction:column;padding:10px;border-radius:var(--border-radius-large)}.face-cover__crop-container[data-v-5cb97458]{overflow:hidden;width:128px;height:128px;border-radius:128px;position:relative;background:var(--color-background-darker);--photos-face-width: 128px}@media only screen and (max-width: 1020px){.face-cover__crop-container[data-v-5cb97458]{width:95px;height:95px;--photos-face-width: 95px}}.face-cover[data-v-5cb97458]:hover,.face-cover[data-v-5cb97458]:focus{background:var(--color-background-hover)}.face-cover__details[data-v-5cb97458]{display:flex;flex-direction:column;width:128px;margin-top:4px;text-align:center}@media only screen and (max-width: 1020px){.face-cover__details[data-v-5cb97458]{width:95px}}.face-cover__details__first-line[data-v-5cb97458]{display:flex;height:2em;overflow:hidden;text-overflow:ellipsis}.face-cover__details__second-line[data-v-5cb97458]{margin-top:6px;color:var(--color-text-maxcontrast)}.face-cover__details__name[data-v-5cb97458]{flex-grow:1;margin:0}.face-cover--small *[data-v-5cb97458]{font-size:15px !important}.face-cover--small .face-cover__details[data-v-5cb97458]{width:60px !important}.face-cover--small .face-cover__crop-container[data-v-5cb97458]{width:60px !important;height:60px !important;--photos-face-width: 60px !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/mixins/FaceCover.scss\"],\"names\":[],\"mappings\":\"AAqBA,6BACC,YAAA,CACA,qBAAA,CACA,YAAA,CACA,wCAAA,CAEA,6CACC,eAAA,CACA,WAAA,CACA,YAAA,CACA,mBAAA,CACA,iBAAA,CACA,yCAAA,CACA,0BAAA,CAEA,2CATD,6CAUE,UAAA,CACA,WAAA,CACA,yBAAA,CAAA,CAIF,sEACC,wCAAA,CAGD,sCACC,YAAA,CACA,qBAAA,CACA,WAAA,CACA,cAAA,CACA,iBAAA,CAEA,2CAPD,sCAQE,UAAA,CAAA,CAGD,kDACC,YAAA,CACA,UAAA,CACA,eAAA,CACA,sBAAA,CAGD,mDACC,cAAA,CACA,mCAAA,CAGD,4CACC,WAAA,CACA,QAAA,CAMF,sCACC,yBAAA,CAED,yDACC,qBAAA,CAED,gEACC,qBAAA,CACA,sBAAA,CACA,oCAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2023 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.face-cover {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tpadding: 10px;\\n\\tborder-radius: var(--border-radius-large);\\n\\n\\t&__crop-container {\\n\\t\\toverflow: hidden;\\n\\t\\twidth: 128px;\\n\\t\\theight: 128px;\\n\\t\\tborder-radius: 128px;\\n\\t\\tposition: relative;\\n\\t\\tbackground: var(--color-background-darker);\\n\\t\\t--photos-face-width: 128px;\\n\\n\\t\\t@media only screen and (max-width: 1020px) {\\n\\t\\t\\twidth: 95px;\\n\\t\\t\\theight: 95px;\\n\\t\\t\\t--photos-face-width: 95px;\\n\\t\\t}\\n\\t}\\n\\n\\t&:hover, &:focus {\\n\\t\\tbackground: var(--color-background-hover);\\n\\t}\\n\\n\\t&__details {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\twidth: 128px;\\n\\t\\tmargin-top: 4px;\\n\\t\\ttext-align: center;\\n\\n\\t\\t@media only screen and (max-width: 1020px) {\\n\\t\\t\\twidth: 95px;\\n\\t\\t}\\n\\n\\t\\t&__first-line {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\theight: 2em;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t}\\n\\n\\t\\t&__second-line {\\n\\t\\t\\tmargin-top: 6px;\\n\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t}\\n\\n\\t\\t&__name {\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t\\tmargin: 0;\\n\\t\\t}\\n\\t}\\n}\\n\\n.face-cover--small {\\n\\t* {\\n\\t\\tfont-size: 15px !important;\\n\\t}\\n\\t.face-cover__details {\\n\\t\\twidth: 60px !important;\\n\\t}\\n\\t.face-cover__crop-container {\\n\\t\\twidth: 60px !important;\\n\\t\\theight: 60px !important;\\n\\t\\t--photos-face-width: 60px !important;\\n\\t}\\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-cover[data-v-c72c5064]{display:flex;flex-direction:column;padding:10px;border-radius:var(--border-radius-large)}.face-cover__crop-container[data-v-c72c5064]{overflow:hidden;width:128px;height:128px;border-radius:128px;position:relative;background:var(--color-background-darker);--photos-face-width: 128px}@media only screen and (max-width: 1020px){.face-cover__crop-container[data-v-c72c5064]{width:95px;height:95px;--photos-face-width: 95px}}.face-cover[data-v-c72c5064]:hover,.face-cover[data-v-c72c5064]:focus{background:var(--color-background-hover)}.face-cover__details[data-v-c72c5064]{display:flex;flex-direction:column;width:128px;margin-top:4px;text-align:center}@media only screen and (max-width: 1020px){.face-cover__details[data-v-c72c5064]{width:95px}}.face-cover__details__first-line[data-v-c72c5064]{display:flex;height:2em;overflow:hidden;text-overflow:ellipsis}.face-cover__details__second-line[data-v-c72c5064]{margin-top:6px;color:var(--color-text-maxcontrast)}.face-cover__details__name[data-v-c72c5064]{flex-grow:1;margin:0}.face-cover--small *[data-v-c72c5064]{font-size:15px !important}.face-cover--small .face-cover__details[data-v-c72c5064]{width:60px !important}.face-cover--small .face-cover__crop-container[data-v-c72c5064]{width:60px !important;height:60px !important;--photos-face-width: 60px !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/mixins/FaceCover.scss\"],\"names\":[],\"mappings\":\"AAqBA,6BACC,YAAA,CACA,qBAAA,CACA,YAAA,CACA,wCAAA,CAEA,6CACC,eAAA,CACA,WAAA,CACA,YAAA,CACA,mBAAA,CACA,iBAAA,CACA,yCAAA,CACA,0BAAA,CAEA,2CATD,6CAUE,UAAA,CACA,WAAA,CACA,yBAAA,CAAA,CAIF,sEACC,wCAAA,CAGD,sCACC,YAAA,CACA,qBAAA,CACA,WAAA,CACA,cAAA,CACA,iBAAA,CAEA,2CAPD,sCAQE,UAAA,CAAA,CAGD,kDACC,YAAA,CACA,UAAA,CACA,eAAA,CACA,sBAAA,CAGD,mDACC,cAAA,CACA,mCAAA,CAGD,4CACC,WAAA,CACA,QAAA,CAMF,sCACC,yBAAA,CAED,yDACC,qBAAA,CAED,gEACC,qBAAA,CACA,sBAAA,CACA,oCAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2023 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.face-cover {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tpadding: 10px;\\n\\tborder-radius: var(--border-radius-large);\\n\\n\\t&__crop-container {\\n\\t\\toverflow: hidden;\\n\\t\\twidth: 128px;\\n\\t\\theight: 128px;\\n\\t\\tborder-radius: 128px;\\n\\t\\tposition: relative;\\n\\t\\tbackground: var(--color-background-darker);\\n\\t\\t--photos-face-width: 128px;\\n\\n\\t\\t@media only screen and (max-width: 1020px) {\\n\\t\\t\\twidth: 95px;\\n\\t\\t\\theight: 95px;\\n\\t\\t\\t--photos-face-width: 95px;\\n\\t\\t}\\n\\t}\\n\\n\\t&:hover, &:focus {\\n\\t\\tbackground: var(--color-background-hover);\\n\\t}\\n\\n\\t&__details {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\twidth: 128px;\\n\\t\\tmargin-top: 4px;\\n\\t\\ttext-align: center;\\n\\n\\t\\t@media only screen and (max-width: 1020px) {\\n\\t\\t\\twidth: 95px;\\n\\t\\t}\\n\\n\\t\\t&__first-line {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\theight: 2em;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t}\\n\\n\\t\\t&__second-line {\\n\\t\\t\\tmargin-top: 6px;\\n\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t}\\n\\n\\t\\t&__name {\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t\\tmargin: 0;\\n\\t\\t}\\n\\t}\\n}\\n\\n.face-cover--small {\\n\\t* {\\n\\t\\tfont-size: 15px !important;\\n\\t}\\n\\t.face-cover__details {\\n\\t\\twidth: 60px !important;\\n\\t}\\n\\t.face-cover__crop-container {\\n\\t\\twidth: 60px !important;\\n\\t\\theight: 60px !important;\\n\\t\\t--photos-face-width: 60px !important;\\n\\t}\\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, \".faces[data-v-740b3c8a]{display:flex;flex-direction:column;height:calc(100vh - var(--header-height));padding-left:64px}@media only screen and (max-width: 1020px){.faces[data-v-740b3c8a]{padding:0}}.faces__header[data-v-740b3c8a]{display:flex;min-height:60px;align-items:center}.faces__header button[data-v-740b3c8a]{margin-right:32px}.faces__list[data-v-740b3c8a]{padding-top:24px;padding-bottom:32px;flex-grow:1;display:flex;flex-wrap:wrap;gap:32px;align-content:flex-start}.faces__empty[data-v-740b3c8a]{display:flex;flex-direction:column;align-items:center}.faces__empty__button[data-v-740b3c8a]{margin-top:32px}.empty-content-with-illustration[data-v-740b3c8a] .empty-content__icon{width:200px;height:200px}.empty-content-with-illustration[data-v-740b3c8a] .empty-content__icon svg{width:200px;height:200px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/views/Faces.vue\"],\"names\":[],\"mappings\":\"AAEA,wBACC,YAAA,CACA,qBAAA,CACA,yCAAA,CACA,iBAAA,CAEA,2CAND,wBAOE,SAAA,CAAA,CAGD,gCACC,YAAA,CACA,eAAA,CACA,kBAAA,CAEA,uCACC,iBAAA,CAIF,8BACC,gBAAA,CACA,mBAAA,CACA,WAAA,CACA,YAAA,CACA,cAAA,CACA,QAAA,CACA,wBAAA,CAGD,+BACC,YAAA,CACA,qBAAA,CACA,kBAAA,CAEA,uCACC,eAAA,CAKH,uEACC,WAAA,CACA,YAAA,CAEA,2EACC,WAAA,CACA,YAAA\",\"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.faces {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\theight: calc(100vh - var(--header-height));\\n\\tpadding-left: 64px;\\n\\n\\t@media only screen and (max-width: 1020px) {\\n\\t\\tpadding: 0;\\n\\t}\\n\\n\\t&__header {\\n\\t\\tdisplay: flex;\\n\\t\\tmin-height: 60px;\\n\\t\\talign-items: center;\\n\\n\\t\\tbutton {\\n\\t\\t\\tmargin-right: 32px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__list {\\n\\t\\tpadding-top: 24px;\\n\\t\\tpadding-bottom: 32px;\\n\\t\\tflex-grow: 1;\\n\\t\\tdisplay: flex;\\n\\t\\tflex-wrap: wrap;\\n\\t\\tgap: 32px;\\n\\t\\talign-content: flex-start;\\n\\t}\\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\\t}\\n}\\n\\n.empty-content-with-illustration :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\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon account-box-multiple-outline-icon\"\n role=\"img\"\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=\"M4 6H2V20C2 21.11 2.9 22 4 22H18V20H4V6M18.5 14.25C18.5 12.75 15.5 12 14 12S9.5 12.75 9.5 14.25V15H18.5M14 10.25C15.24 10.25 16.25 9.24 16.25 8S15.24 5.75 14 5.75 11.75 6.76 11.75 8 12.76 10.25 14 10.25M20 2H8C6.9 2 6 2.9 6 4V16C6 17.11 6.9 18 8 18H20C21.11 18 22 17.11 22 16V4C22 2.89 21.1 2 20 2M20 16H8V4H20V16Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AccountBoxMultipleOutlineIcon\",\n emits: ['click'],\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!./AccountBoxMultipleOutline.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./AccountBoxMultipleOutline.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./AccountBoxMultipleOutline.vue?vue&type=template&id=6bcc1fce\"\nimport script from \"./AccountBoxMultipleOutline.vue?vue&type=script&lang=js\"\nexport * from \"./AccountBoxMultipleOutline.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 render(){var _vm=this,_c=_vm._self._c;return _c('span',_vm._b({staticClass:\"material-design-icon account-box-multiple-outline-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\":\"M4 6H2V20C2 21.11 2.9 22 4 22H18V20H4V6M18.5 14.25C18.5 12.75 15.5 12 14 12S9.5 12.75 9.5 14.25V15H18.5M14 10.25C15.24 10.25 16.25 9.24 16.25 8S15.24 5.75 14 5.75 11.75 6.76 11.75 8 12.76 10.25 14 10.25M20 2H8C6.9 2 6 2.9 6 4V16C6 17.11 6.9 18 8 18H20C21.11 18 22 17.11 22 16V4C22 2.89 21.1 2 20 2M20 16H8V4H20V16Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:['face-cover', _vm.small && 'face-cover--small'],on:{\"click\":function($event){return _vm.$emit('click')}}},[_c('div',{staticClass:\"face-cover__crop-container\"},[_c('img',{ref:\"image\",staticClass:\"face-cover__image\",style:(_vm.coverDimensions),attrs:{\"src\":_vm.coverUrl}})]),_vm._v(\" \"),_c('div',{staticClass:\"face-cover__details\"},[(!_vm.baseName.match(/^[0-9]+$/))?_c('div',{staticClass:\"face-cover__details__first-line\"},[_c('h2',{staticClass:\"face-cover__details__name\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.baseName)+\"\\n\\t\\t\\t\")])]):_vm._e(),_vm._v(\" \"),(!_vm.small)?_c('div',{staticClass:\"face-cover__details__second-line\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.n('photos', '%n photos', '%n photos', _vm.face.props['nbItems']))+\"\\n\\t\\t\")]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\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\n<template>\n\t<div :class=\"['face-cover', small && 'face-cover--small']\" @click=\"$emit('click')\">\n\t\t<div class=\"face-cover__crop-container\">\n\t\t\t<img ref=\"image\"\n\t\t\t\tclass=\"face-cover__image\"\n\t\t\t\t:src=\"coverUrl\"\n\t\t\t\t:style=\"coverDimensions\">\n\t\t</div>\n\t\t<div class=\"face-cover__details\">\n\t\t\t<div v-if=\"!baseName.match(/^[0-9]+$/)\" class=\"face-cover__details__first-line\">\n\t\t\t\t<h2 class=\"face-cover__details__name\">\n\t\t\t\t\t{{ baseName }}\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div v-if=\"!small\" class=\"face-cover__details__second-line\">\n\t\t\t\t{{ n('photos', '%n photos', '%n photos', face.props['nbItems']) }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport { generateUrl } from '@nextcloud/router'\nimport FetchFacesMixin from '../../mixins/FetchFacesMixin.js'\nimport FaceCoverMixin from '../../mixins/FaceCoverMixin.js'\n\nexport default {\n\tname: 'FaceCover',\n\n\tmixins: [\n\t\tFetchFacesMixin,\n\t\tFaceCoverMixin,\n\t],\n\n\tprops: {\n\t\tbaseName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tsmall: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tobserver: null,\n\t\t}\n\t},\n\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\t/**\n\t\t * @return {Face}\n\t\t */\n\t\tface() {\n\t\t\treturn this.faces[this.baseName]\n\t\t},\n\n\t\t/**\n\t\t * @return {string}\n\t\t */\n\t\tcoverUrl() {\n\t\t\tif (!this.cover) {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\treturn generateUrl(`/apps/photos/api/v1/preview/${this.cover.fileid}?x=${512}&y=${512}`)\n\t\t},\n\n\t\tcover() {\n\t\t\treturn this.getFaceCover(this.face.basename)\n\t\t},\n\n\t\tcoverDimensions() {\n\t\t\tif (!this.cover) return {}\n\t\t\treturn this.getCoverStyle(this.face.basename)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../mixins/FaceCover';\n</style>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceCover.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!./FaceCover.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.use[3]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceCover.vue?vue&type=style&index=0&id=5cb97458&prod&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.use[3]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceCover.vue?vue&type=style&index=0&id=5cb97458&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FaceCover.vue?vue&type=template&id=5cb97458&scoped=true\"\nimport script from \"./FaceCover.vue?vue&type=script&lang=js\"\nexport * from \"./FaceCover.vue?vue&type=script&lang=js\"\nimport style0 from \"./FaceCover.vue?vue&type=style&index=0&id=5cb97458&prod&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 \"5cb97458\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.errorFetchingFaces)?_c('NcEmptyContent',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'An error occurred'))+\"\\n\")]):_c('div',{staticClass:\"faces\"},[(_vm.loadingFaces)?_c('NcLoadingIcon'):_vm._e(),_vm._v(\" \"),(_vm.noFaces && !_vm.loadingFaces)?_c('div',{staticClass:\"faces__empty\"},[_c('NcEmptyContent',{staticClass:\"empty-content-with-illustration\",scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('AccountBoxMultipleOutline')]},proxy:true},{key:\"desc\",fn:function(){return [_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('photos', 'This might take some time depending on the size of your photo library.'))+\"\\n\\t\\t\\t\")]},proxy:true}],null,false,3796275108)},[_vm._v(\" \"),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Recognized people will show up here'))+\"\\n\\t\\t\")])],1):(!_vm.noFaces)?_c('div',{staticClass:\"faces__list\"},[_vm._l((_vm.orderedFaces),function(face){return _c('router-link',{key:face.basename,attrs:{\"to\":`/faces/${encodeURIComponent(face.basename)}`}},[_c('FaceCover',{attrs:{\"base-name\":face.basename}})],1)}),_vm._v(\" \"),_c('router-link',{key:\"unassigned\",attrs:{\"to\":`/faces/unassigned`}},[_c('UnassignedFacesCover')],1)],2):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon account-off-icon\"\n role=\"img\"\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=\"M12,4A4,4 0 0,1 16,8C16,9.95 14.6,11.58 12.75,11.93L8.07,7.25C8.42,5.4 10.05,4 12,4M12.28,14L18.28,20L20,21.72L18.73,23L15.73,20H4V18C4,16.16 6.5,14.61 9.87,14.14L2.78,7.05L4.05,5.78L12.28,14M20,18V19.18L15.14,14.32C18,14.93 20,16.35 20,18Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AccountOffIcon\",\n emits: ['click'],\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!./AccountOff.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./AccountOff.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./AccountOff.vue?vue&type=template&id=4a2e1178\"\nimport script from \"./AccountOff.vue?vue&type=script&lang=js\"\nexport * from \"./AccountOff.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","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UnassignedFacesCover.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!./UnassignedFacesCover.vue?vue&type=script&lang=js\"","<!--\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\n<template>\n\t<div :class=\"['face-cover', small && 'face-cover--small']\" @click=\"$emit('click')\">\n\t\t<div class=\"face-cover__crop-container\">\n\t\t\t<AccountOffIcon :size=\"'auto'\" :fill-color=\"colorMainBackground\" />\n\t\t</div>\n\t\t<div class=\"face-cover__details\">\n\t\t\t<div v-if=\"!small\" class=\"face-cover__details__second-line\">\n\t\t\t\t{{ n('photos', '%n unassigned photo', '%n unassigned photos', unassignedFilesCount) }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport FetchFacesMixin from '../../mixins/FetchFacesMixin.js'\nimport FaceCoverMixin from '../../mixins/FaceCoverMixin.js'\nimport AccountOffIcon from 'vue-material-design-icons/AccountOff.vue'\n\nexport default {\n\tname: 'UnassignedFacesCover',\n\n\tcomponents: { AccountOffIcon },\n\n\tmixins: [\n\t\tFetchFacesMixin,\n\t\tFaceCoverMixin,\n\t],\n\n\tprops: {\n\t\tsmall: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'unassignedFilesCount',\n\t\t]),\n\t\tcolorMainBackground() {\n\t\t\treturn getComputedStyle(document.documentElement).getPropertyValue('--color-main-background')\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.fetchUnassignedFacesCount()\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../mixins/FaceCover';\n</style>\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',_vm._b({staticClass:\"material-design-icon account-off-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\":\"M12,4A4,4 0 0,1 16,8C16,9.95 14.6,11.58 12.75,11.93L8.07,7.25C8.42,5.4 10.05,4 12,4M12.28,14L18.28,20L20,21.72L18.73,23L15.73,20H4V18C4,16.16 6.5,14.61 9.87,14.14L2.78,7.05L4.05,5.78L12.28,14M20,18V19.18L15.14,14.32C18,14.93 20,16.35 20,18Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])\n}\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.use[3]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UnassignedFacesCover.vue?vue&type=style&index=0&id=c72c5064&prod&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.use[3]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UnassignedFacesCover.vue?vue&type=style&index=0&id=c72c5064&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UnassignedFacesCover.vue?vue&type=template&id=c72c5064&scoped=true\"\nimport script from \"./UnassignedFacesCover.vue?vue&type=script&lang=js\"\nexport * from \"./UnassignedFacesCover.vue?vue&type=script&lang=js\"\nimport style0 from \"./UnassignedFacesCover.vue?vue&type=style&index=0&id=c72c5064&prod&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 \"c72c5064\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Faces.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!./Faces.vue?vue&type=script&lang=js\"","<!--\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<NcEmptyContent v-if=\"errorFetchingFaces\">\n\t\t{{ t('photos', 'An error occurred') }}\n\t</NcEmptyContent>\n\n\t<!-- Face list -->\n\t<div v-else class=\"faces\">\n\t\t<NcLoadingIcon v-if=\"loadingFaces\" />\n\n\t\t<!-- No faces -->\n\t\t<div v-if=\"noFaces && !loadingFaces\" class=\"faces__empty\">\n\t\t\t<NcEmptyContent class=\"empty-content-with-illustration\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<AccountBoxMultipleOutline />\n\t\t\t\t</template>\n\t\t\t\t<template #desc>\n\t\t\t\t\t{{ t('photos', 'This might take some time depending on the size of your photo library.') }}\n\t\t\t\t</template>\n\t\t\t\t{{ t('photos', 'Recognized people will show up here') }}\n\t\t\t</NcEmptyContent>\n\t\t</div>\n\n\t\t<div v-else-if=\"!noFaces\" class=\"faces__list\">\n\t\t\t<router-link v-for=\"face in orderedFaces\"\n\t\t\t\t:key=\"face.basename\"\n\t\t\t\t:to=\"`/faces/${encodeURIComponent(face.basename)}`\">\n\t\t\t\t<FaceCover :base-name=\"face.basename\" />\n\t\t\t</router-link>\n\t\t\t<router-link key=\"unassigned\"\n\t\t\t\t:to=\"`/faces/unassigned`\">\n\t\t\t\t<UnassignedFacesCover />\n\t\t\t</router-link>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport AccountBoxMultipleOutline from 'vue-material-design-icons/AccountBoxMultipleOutline.vue'\n\nimport { NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'\n\nimport FetchFacesMixin from '../mixins/FetchFacesMixin.js'\nimport FaceCover from '../components/Faces/FaceCover.vue'\nimport { mapGetters } from 'vuex'\nimport UnassignedFacesCover from '../components/Faces/UnassignedFacesCover.vue'\n\nexport default {\n\tname: 'Faces',\n\tcomponents: {\n\t\tUnassignedFacesCover,\n\t\tFaceCover,\n\t\tNcEmptyContent,\n\t\tNcLoadingIcon,\n\t\tAccountBoxMultipleOutline,\n\t},\n\n\tmixins: [\n\t\tFetchFacesMixin,\n\t],\n\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'facesFiles',\n\t\t\t'unassignedFilesCount',\n\t\t]),\n\n\t\t/**\n\t\t * @return {boolean} Whether the list of face is empty or not.\n\t\t */\n\t\tnoFaces() {\n\t\t\treturn Object.keys(this.faces).length === 0\n\t\t},\n\n\t\torderedFaces() {\n\t\t\treturn Object.values(this.faces).sort((a, b) => {\n\t\t\t\tif (a.props.nbItems && b.props.nbItems) {\n\t\t\t\t\treturn b.props.nbItems - a.props.nbItems\n\t\t\t\t}\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}\n</script>\n<style lang=\"scss\" scoped>\n.faces {\n\tdisplay: flex;\n\tflex-direction: column;\n\theight: calc(100vh - var(--header-height));\n\tpadding-left: 64px;\n\n\t@media only screen and (max-width: 1020px) {\n\t\tpadding: 0;\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tmin-height: 60px;\n\t\talign-items: center;\n\n\t\tbutton {\n\t\t\tmargin-right: 32px;\n\t\t}\n\t}\n\n\t&__list {\n\t\tpadding-top: 24px;\n\t\tpadding-bottom: 32px;\n\t\tflex-grow: 1;\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 32px;\n\t\talign-content: flex-start;\n\t}\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\t}\n}\n\n.empty-content-with-illustration :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</style>\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:['face-cover', _vm.small && 'face-cover--small'],on:{\"click\":function($event){return _vm.$emit('click')}}},[_c('div',{staticClass:\"face-cover__crop-container\"},[_c('AccountOffIcon',{attrs:{\"size\":'auto',\"fill-color\":_vm.colorMainBackground}})],1),_vm._v(\" \"),_c('div',{staticClass:\"face-cover__details\"},[(!_vm.small)?_c('div',{staticClass:\"face-cover__details__second-line\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.n('photos', '%n unassigned photo', '%n unassigned photos', _vm.unassignedFilesCount))+\"\\n\\t\\t\")]):_vm._e()])])\n}\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.use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Faces.vue?vue&type=style&index=0&id=740b3c8a&prod&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.use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Faces.vue?vue&type=style&index=0&id=740b3c8a&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Faces.vue?vue&type=template&id=740b3c8a&scoped=true\"\nimport script from \"./Faces.vue?vue&type=script&lang=js\"\nexport * from \"./Faces.vue?vue&type=script&lang=js\"\nimport style0 from \"./Faces.vue?vue&type=style&index=0&id=740b3c8a&prod&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 \"740b3c8a\",\n null\n \n)\n\nexport default component.exports"],"names":["name","data","abortController","AbortController","beforeDestroy","this","abort","beforeRouteLeave","from","to","next","computed","mapGetters","methods","getFaceCover","faceName","JSON","parse","he","faces","props","getCoverStyle","cover","detection","zoom","Math","max","width","horizontalCenterOfFace","x","verticalCenterOfFace","y","height","transform","concat","transformOrigin","errorFetchingFaces","loadingFaces","errorFetchingFiles","loadingFiles","mixins","AbortControllerMixin","async","fetchFaces","mapActions","Object","keys","length","_getCurrentUser","client","getCurrentUser","uid","DavRequest","details","signal","$store","dispatch","logger","error","response","status","t","showError","force","facesFiles","_getCurrentUser2","fetchedFiles","map","file","genFileInfo","filename","realpath","replace","faceDetections","fileIds","fileid","appendFiles","commit","fileIdsToAdd","unassignedFiles","_getCurrentUser3","_getCurrentUser4","unassignedFacesRoot","count","Number","nbItems","___CSS_LOADER_EXPORT___","push","module","id","emits","title","type","String","fillColor","default","size","_vm","_c","_self","_b","staticClass","attrs","on","$event","$emit","$attrs","_v","_s","_e","FetchFacesMixin","FaceCoverMixin","baseName","required","small","Boolean","observer","face","coverUrl","generateUrl","basename","coverDimensions","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","class","ref","style","match","n","components","AccountOffIcon","colorMainBackground","getComputedStyle","document","documentElement","getPropertyValue","fetchUnassignedFacesCount","UnassignedFacesCover","unassignedFilesCount","FaceCover","NcEmptyContent","NcLoadingIcon","AccountBoxMultipleOutline","noFaces","orderedFaces","values","sort","a","b","scopedSlots","_u","key","fn","proxy","_l","encodeURIComponent"],"sourceRoot":""}