1
|
{"version":3,"file":"photos-src_views_FaceContent_vue.js?v=6b5c3b6147f6bcb72fe9","mappings":";;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACtYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA;AACA;;;;;;;;;;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA;AACA;;;;;;;;;;;;;;;ACvCA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AKAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["webpack:///photos/src/components/FaceMergeForm.vue?vue&type=script&lang=js&","webpack:///photos/src/views/FaceContent.vue?vue&type=script&lang=js&","webpack:///photos/src/mixins/AbortControllerMixin.js","webpack:///photos/src/mixins/FaceCoverMixin.js","webpack:///photos/src/mixins/FetchFacesMixin.js","webpack:///photos/src/mixins/FetchFilesMixin.js","webpack:///photos/src/services/PhotoSearch.js","webpack:///photos/src/components/FaceMergeForm.vue?vue&type=style&index=0&id=1591b7bf&scoped=true&lang=scss&","webpack:///photos/src/views/FaceContent.vue?vue&type=style&index=0&id=03238d12&lang=scss&scoped=true&","webpack://photos/./src/components/FaceMergeForm.vue?1ac7","webpack://photos/./src/views/FaceContent.vue?0ac8","webpack:///photos/src/components/FaceMergeForm.vue","webpack:///photos/src/views/FaceContent.vue","webpack://photos/./src/components/FaceMergeForm.vue?b353","webpack://photos/./src/views/FaceContent.vue?f398","webpack://photos/./src/components/FaceMergeForm.vue?d86d","webpack://photos/./src/views/FaceContent.vue?8e32","webpack:///photos/src/components/FaceMergeForm.vue?vue&type=template&id=1591b7bf&scoped=true&","webpack:///photos/src/views/FaceContent.vue?vue&type=template&id=03238d12&scoped=true&","webpack://photos/./src/components/FaceMergeForm.vue?bed5","webpack://photos/./src/views/FaceContent.vue?4945"],"sourcesContent":["//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nimport { mapGetters } from 'vuex';\nimport { generateUrl } from '@nextcloud/router';\nimport { NcLoadingIcon } from '@nextcloud/vue';\nimport FaceCoverMixin from '../mixins/FaceCoverMixin.js';\nimport FetchFacesMixin from '../mixins/FetchFacesMixin.js';\nexport default {\n name: 'FaceMergeForm',\n components: {\n NcLoadingIcon\n },\n mixins: [FaceCoverMixin, FetchFacesMixin],\n props: {\n firstFace: {\n type: String,\n required: true\n }\n },\n\n data() {\n return {\n loading: false\n };\n },\n\n computed: { ...mapGetters(['files', 'faces', 'facesFiles']),\n\n filteredFaces() {\n return Object.values(this.faces).filter(face => face.basename !== this.firstFace).sort((a, b) => {\n if (!this.facesFiles[b.basename] || !this.facesFiles[a.basename]) {\n return 0;\n }\n\n return this.facesFiles[b.basename].length - this.facesFiles[a.basename].length;\n });\n }\n\n },\n methods: {\n getCoverUrl(faceName) {\n const cover = this.getFaceCover(faceName);\n\n if (!cover) {\n this.fetchFaceContent(faceName);\n return '';\n }\n\n return generateUrl(`/apps/photos/api/v1/preview/${cover.fileid}?x=${512}&y=${512}`);\n },\n\n handleSelect(faceName) {\n this.$emit('select', faceName);\n this.loading = true;\n }\n\n }\n};","//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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';\nimport { NcActions, NcActionButton, NcModal, NcEmptyContent, NcButton, NcLoadingIcon } from '@nextcloud/vue';\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 logger from '../services/logger.js';\nimport FetchFacesMixin from '../mixins/FetchFacesMixin.js';\nimport Vue from 'vue';\nimport FaceMergeForm from '../components/FaceMergeForm.vue';\nexport default {\n name: 'FaceContent',\n components: {\n Pencil,\n Star,\n Download,\n Close,\n AlertCircle,\n Send,\n Merge,\n ArrowLeft,\n AccountBoxMultipleOutline,\n FaceMergeForm,\n FilesListViewer,\n File,\n NcLoadingIcon,\n NcEmptyContent,\n NcActions,\n NcActionButton,\n NcModal,\n NcButton\n },\n directives: {\n focus(el) {\n Vue.nextTick(() => el.focus());\n }\n\n },\n mixins: [FetchFacesMixin, FetchFilesMixin, FilesSelectionMixin],\n props: {\n faceName: {\n type: String,\n default: '/'\n }\n },\n\n data() {\n return {\n showMergeModal: false,\n showRenameModal: false,\n loadingCount: 0,\n appContent: document.getElementById('app-content-vue')\n };\n },\n\n computed: { ...mapGetters(['files', 'facesFiles']),\n\n /**\n * @return {string[]} The face information for the current faceName.\n */\n face() {\n return this.faces[this.faceName];\n },\n\n /**\n * @return {string[]} The list of files for the current faceName.\n */\n faceFileIds() {\n return this.facesFiles[this.faceName] || [];\n },\n\n /** @type {boolean} */\n shouldFavoriteSelection() {\n // Favorite all selection if at least one file is not on the favorites.\n return this.selectedFileIds.some(fileId => this.$store.state.files.files[fileId].favorite === 0);\n }\n\n },\n watch: {\n face() {\n if (this.face) {\n this.fetchFaceContent(this.faceName);\n }\n }\n\n },\n methods: { ...mapActions(['appendFiles', 'deleteFace', 'renameFace', 'downloadFiles', 'toggleFavoriteForFiles', 'removeFilesFromFace', 'moveFilesToFace']),\n\n openViewer(fileId) {\n const file = this.files[fileId];\n OCA.Viewer.open({\n path: file.filename,\n list: this.faceFileIds.map(fileId => ({ ...this.files[fileId],\n basename: this.files[fileId].basename.split('-').slice(1).join('-')\n })).filter(file => !file.sectionHeader),\n loadMore: file.loadMore ? async () => await file.loadMore(true) : () => [],\n canLoop: file.canLoop\n });\n },\n\n async handleRemoveFilesFromFace(fileIds) {\n try {\n this.loadingCount++;\n await this.removeFilesFromFace({\n faceName: this.faceName,\n fileIdsToRemove: fileIds\n });\n this.resetSelection();\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n },\n\n async handleDeleteFace() {\n try {\n this.loadingCount++;\n await this.deleteFace({\n faceName: this.faceName\n });\n this.$router.push('/faces');\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n },\n\n async handleRenameFace(faceName) {\n try {\n this.loadingCount++;\n this.showRenameModal = false;\n const oldName = this.faceName;\n await this.renameFace({\n oldName,\n faceName\n });\n this.$router.push({\n name: 'facecontent',\n params: {\n faceName\n }\n });\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n },\n\n async handleMerge(faceName) {\n try {\n this.loadingCount++;\n await this.moveFilesToFace({\n oldFace: this.faceName,\n faceName,\n fileIdsToMove: this.facesFiles[this.faceName]\n });\n await this.deleteFace({\n faceName: this.faceName\n });\n this.showMergeModal = false;\n this.$router.push({\n name: 'facecontent',\n params: {\n faceName\n }\n });\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n },\n\n async favoriteSelection() {\n try {\n this.loadingCount++;\n await this.toggleFavoriteForFiles({\n fileIds: this.selectedFileIds,\n favoriteState: true\n });\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n },\n\n async unFavoriteSelection() {\n try {\n this.loadingCount++;\n await this.toggleFavoriteForFiles({\n fileIds: this.selectedFileIds,\n favoriteState: false\n });\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n },\n\n async downloadSelection() {\n try {\n this.loadingCount++;\n await this.downloadFiles(this.selectedFileIds);\n } catch (error) {\n logger.error(error);\n } finally {\n this.loadingCount--;\n }\n }\n\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 */\nexport default {\n name: 'AbortControllerMixin',\n\n data() {\n return {\n abortController: new AbortController()\n };\n },\n\n beforeDestroy() {\n this.abortController.abort();\n },\n\n beforeRouteLeave(from, to, next) {\n this.abortController.abort();\n this.abortController = new AbortController();\n next();\n }\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 */\nimport { mapGetters } from 'vuex';\nimport he from 'he';\nexport default {\n name: 'FaceCoverMixin',\n computed: { ...mapGetters(['faces', 'facesFiles', 'files'])\n },\n methods: {\n getFaceCover(faceName) {\n // Give high scores for faces that intersect with the edge of the picture (with a margin of half the face size)\n const scoreFacePosition = faceDetection => {\n return Math.max(0, -1 * (faceDetection.x - faceDetection.width * 0.5)) + Math.max(0, -1 * (faceDetection.y - faceDetection.height * 0.5)) + Math.max(0, -1 * (1 - (faceDetection.x + faceDetection.width) - faceDetection.width * 0.5)) + Math.max(0, -1 * (1 - (faceDetection.y + faceDetection.height) - faceDetection.height * 0.5));\n };\n\n return (this.facesFiles[faceName] || []).slice(0, 25).map(fileId => this.files[fileId]).map(file => ({ ...file,\n faceDetections: JSON.parse(he.decode(file.faceDetections))\n })) // sort larges face first\n .sort((a, b) => b.faceDetections.find(d => d.title === faceName).width - a.faceDetections.find(d => d.title === faceName).width) // sort fewest face detections first\n .sort((a, b) => a.faceDetections.length - b.faceDetections.length) // Sort faces that are at the edge last\n .sort((a, b) => scoreFacePosition(a.faceDetections.find(d => d.title === faceName)) - scoreFacePosition(b.faceDetections.find(d => d.title === faceName)))[0];\n },\n\n /**\n * This will produce an inline style to apply to images\n * to zoom toward the detected face\n *\n * @param faceName\n * @return {{}|{transform: string, width: string, transformOrigin: string}}\n */\n getCoverStyle(faceName) {\n const cover = this.getFaceCover(faceName);\n\n if (!cover) {\n return {};\n }\n\n const detections = cover.faceDetections;\n const detection = detections.find(detection => detection.title === faceName); // Zoom into the picture so that the face fills the --photos-face-width box nicely\n // if the face is larger than the image, we don't zoom out (reason for the Math.max)\n\n const zoom = Math.max(1, 1 / detection.width * 0.4);\n const horizontalCenterOfFace = (detection.x + detection.width / 2) * 100;\n const verticalCenterOfFace = (detection.y + detection.height / 2) * 100;\n return {\n // We assume that the image is inside a div with width: var(--photos-face-width)\n width: '100%',\n // we translate the image so that the center of the detected face is in the center of the --photos-face-width box\n // and add the zoom\n transform: `translate(calc( var(--photos-face-width)/2 - ${horizontalCenterOfFace}% ), calc( var(--photos-face-width)/2 - ${verticalCenterOfFace}% )) scale(${zoom})`,\n // this is necessary for the zoom to zoom toward the center of the face\n transformOrigin: `${horizontalCenterOfFace}% ${verticalCenterOfFace}%`\n };\n }\n\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 */\nimport { mapActions, mapGetters } from 'vuex';\nimport { showError } from '@nextcloud/dialogs';\nimport { getCurrentUser } from '@nextcloud/auth';\nimport client from '../services/DavClient.js';\nimport logger from '../services/logger.js';\nimport DavRequest from '../services/DavRequest';\nimport { genFileInfo } from '../utils/fileUtils';\nimport AbortControllerMixin from './AbortControllerMixin';\nexport default {\n name: 'FetchFacesMixin',\n\n data() {\n return {\n errorFetchingFaces: null,\n loadingFaces: false,\n errorFetchingFiles: null,\n loadingFiles: false\n };\n },\n\n mixins: [AbortControllerMixin],\n\n async beforeMount() {\n this.fetchFaces();\n },\n\n computed: { ...mapGetters(['faces'])\n },\n methods: { ...mapActions(['appendFiles']),\n\n async fetchFaces() {\n if (this.loadingFaces) {\n return;\n }\n\n if (Object.keys(this.faces).length) {\n return;\n }\n\n try {\n this.loadingFaces = true;\n this.errorFetchingFaces = null;\n const faces = await client.getDirectoryContents(`/recognize/${getCurrentUser()?.uid}/faces/`, {\n signal: this.abortController.signal\n });\n this.$store.dispatch('addFaces', {\n faces\n });\n logger.debug(`[FetchFacesMixin] Fetched ${faces.length} new faces: `, faces);\n } catch (error) {\n if (error.response && error.response.status) {\n if (error.response.status === 404) {\n this.errorFetchingFaces = 404;\n } else {\n this.errorFetchingFaces = error;\n }\n }\n\n logger.error(t('photos', 'Failed to fetch faces list.'), {\n error\n });\n showError(t('photos', 'Failed to fetch faces list.'));\n } finally {\n this.loadingFaces = false;\n }\n },\n\n async fetchFaceContent(faceName, force) {\n if (this.loadingFiles) {\n return;\n }\n\n if (!force && this.facesFiles[faceName] && this.facesFiles[faceName].length) {\n return;\n }\n\n try {\n this.errorFetchingFiles = null;\n this.loadingFiles = true;\n let {\n data: fetchedFiles\n } = await client.getDirectoryContents(`/recognize/${getCurrentUser()?.uid}/faces/${faceName}`, {\n data: DavRequest,\n details: true,\n signal: this.abortController.signal\n });\n fetchedFiles = fetchedFiles.map(file => genFileInfo(file)).map(file => ({ ...file,\n filename: file.realpath.replace(`/${getCurrentUser().uid}/files`, '')\n }));\n const fileIds = fetchedFiles.map(file => '' + file.fileid);\n this.appendFiles(fetchedFiles);\n\n if (fetchedFiles.length > 0) {\n await this.$store.commit('addFilesToFace', {\n faceName,\n fileIdsToAdd: fileIds\n });\n }\n\n logger.debug(`[FetchFacesMixin] Fetched ${fileIds.length} new files: `, fileIds);\n } catch (error) {\n if (error.response && error.response.status) {\n if (error.response.status === 404) {\n this.errorFetchingFiles = 404;\n } else {\n this.errorFetchingFiles = error;\n }\n } // cancelled request, moving on...\n\n\n logger.error('Error fetching face files', {\n error\n });\n } finally {\n this.loadingFiles = false;\n }\n }\n\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 */\nimport logger from '../services/logger.js';\nimport getPhotos from '../services/PhotoSearch.js';\nimport SemaphoreWithPriority from '../utils/semaphoreWithPriority.js';\nimport AbortControllerMixin from './AbortControllerMixin.js';\nexport default {\n name: 'FetchFilesMixin',\n mixins: [AbortControllerMixin],\n\n data() {\n return {\n errorFetchingFiles: null,\n loadingFiles: false,\n doneFetchingFiles: false,\n semaphore: new SemaphoreWithPriority(30),\n fetchSemaphore: new SemaphoreWithPriority(1),\n semaphoreSymbol: null,\n fetchedFileIds: []\n };\n },\n\n watch: {\n $route() {\n this.resetFetchFilesState();\n }\n\n },\n methods: {\n /**\n * @param {string} path - Path to pass to getPhotos.\n * @param {object} options - Options to pass to getPhotos.\n * @param {string[]} [blacklist=[]] - Array of ids to filter out.\n * @return {Promise<string[]>} - The next batch of data depending on global offset.\n */\n async fetchFiles() {\n let path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let blacklist = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n if (this.doneFetchingFiles || this.loadingFiles) {\n return [];\n }\n\n const semaphoreSymbol = await this.semaphore.acquire(() => 0, 'fetchFiles');\n const fetchSemaphoreSymbol = await this.fetchSemaphore.acquire();\n\n try {\n this.errorFetchingFiles = null;\n this.loadingFiles = true;\n this.semaphoreSymbol = semaphoreSymbol;\n const numberOfImagesPerBatch = 200; // Load next batch of images\n\n const fetchedFiles = await getPhotos(path, {\n firstResult: this.fetchedFileIds.length,\n nbResults: numberOfImagesPerBatch,\n ...options,\n signal: this.abortController.signal\n }); // If we get less files than requested that means we got to the end\n\n if (fetchedFiles.length !== numberOfImagesPerBatch) {\n this.doneFetchingFiles = true;\n }\n\n const fileIds = fetchedFiles.map(file => file.fileid).filter(fileId => !this.fetchedFileIds.includes(fileId)); // Filter to prevent duplicate fileIds.\n\n this.fetchedFileIds.push(...fileIds.map(fileId => fileId.toString()).filter(fileId => !blacklist.includes(fileId)));\n this.$store.dispatch('appendFiles', fetchedFiles);\n logger.debug(`[FetchFilesMixin] Fetched ${fileIds.length} new files: `, fileIds);\n return fileIds;\n } catch (error) {\n if (error.response?.status === 404) {\n this.errorFetchingFiles = 404;\n } else if (error.code === 'ERR_CANCELED') {\n return [];\n } else {\n this.errorFetchingFiles = error;\n } // cancelled request, moving on...\n\n\n logger.error('Error fetching files', {\n error\n });\n console.error(error);\n } finally {\n this.loadingFiles = false;\n this.semaphore.release(semaphoreSymbol);\n this.fetchSemaphore.release(fetchSemaphoreSymbol);\n }\n\n return [];\n },\n\n resetFetchFilesState() {\n this.doneFetchingFiles = false;\n this.errorFetchingFiles = null;\n this.loadingFiles = false;\n this.fetchedFileIds = [];\n }\n\n }\n};","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\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 */\nimport { genFileInfo } from '../utils/fileUtils.js';\nimport { getCurrentUser } from '@nextcloud/auth';\nimport { allMimes } from './AllowedMimes.js';\nimport client from './DavClient.js';\nimport { props } from './DavRequest.js';\nimport moment from '@nextcloud/moment';\n/**\n * List files from a folder and filter out unwanted mimes\n *\n * @param {object} path the lookup path\n * @param {object} [options] used for the cancellable requests\n * @param {number} [options.firstResult=0] Index of the first result that we want (starts at 0)\n * @param {number} [options.nbResults=200] The number of file to fetch\n * @param {string[]} [options.mimesType=allMimes] Mime type of the files\n * @param {boolean} [options.full=false] get full data of the files\n * @param {boolean} [options.onThisDay=false] get only items from this day of year\n * @param {boolean} [options.onlyFavorites=false] get only favorite items\n * @return {Promise<object[]>} the file list\n */\n\nexport default async function () {\n let path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n // default function options\n options = {\n firstResult: 0,\n nbResults: 200,\n mimesType: allMimes,\n onThisDay: false,\n onlyFavorites: false,\n ...options\n };\n const prefixPath = `/files/${getCurrentUser().uid}`; // generating the search or condition\n // based on the allowed mimetypes\n\n const orMime = options.mimesType.reduce((str, mime) => `${str}\n\t\t<d:eq>\n\t\t\t<d:prop>\n\t\t\t\t<d:getcontenttype/>\n\t\t\t</d:prop>\n\t\t\t<d:literal>${mime}</d:literal>\n\t\t</d:eq>\n\t`, '');\n const eqFavorites = options.onlyFavorites ? `<d:eq>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<oc:favorite/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:literal>1</d:literal>\n\t\t\t</d:eq>` : '';\n const onThisDay = options.onThisDay ? `<d:or>${Array(20).fill(1).map((_, years) => {\n const start = moment(Date.now()).startOf('day').subtract(3, 'd').subtract(years + 1, 'y');\n const end = moment(Date.now()).endOf('day').add(3, 'd').subtract(years + 1, 'y');\n return `<d:and>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified />\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${start.format(moment.defaultFormatUtc)}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t\t<d:lt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified />\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${end.format(moment.defaultFormatUtc)}</d:literal>\n\t\t\t\t</d:lt>\n\t\t\t</d:and>`;\n }).join('\\n')}</d:or>` : '';\n options = Object.assign({\n method: 'SEARCH',\n headers: {\n 'content-Type': 'text/xml'\n },\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\t\t\t<d:searchrequest xmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<d:basicsearch>\n\t\t\t\t\t<d:select>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t${props}\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t</d:select>\n\t\t\t\t\t<d:from>\n\t\t\t\t\t\t<d:scope>\n\t\t\t\t\t\t\t<d:href>${prefixPath}/${path}</d:href>\n\t\t\t\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t\t\t\t</d:scope>\n\t\t\t\t\t</d:from>\n\t\t\t\t\t<d:where>\n\t\t\t\t\t\t<d:and>\n\t\t\t\t\t\t\t<d:or>\n\t\t\t\t\t\t\t\t${orMime}\n\t\t\t\t\t\t\t</d:or>\n\t\t\t\t\t\t\t${eqFavorites}\n\t\t\t\t\t\t\t${onThisDay}\n\t\t\t\t\t\t</d:and>\n\t\t\t\t\t</d:where>\n\t\t\t\t\t<d:orderby>\n\t\t\t\t\t\t<d:order>\n\t\t\t\t\t\t\t<d:prop><d:getlastmodified/></d:prop>\n\t\t\t\t\t\t\t<d:descending/>\n\t\t\t\t\t\t</d:order>\n\t\t\t\t\t</d:orderby>\n\t\t\t\t\t<d:limit>\n\t\t\t\t\t\t<d:nresults>${options.nbResults}</d:nresults>\n\t\t\t\t\t\t<ns:firstresult>${options.firstResult}</ns:firstresult>\n\t\t\t\t\t</d:limit>\n\t\t\t\t</d:basicsearch>\n\t\t\t</d:searchrequest>`,\n deep: true,\n details: true\n }, options);\n const response = await client.getDirectoryContents('', options);\n return response.data.map(data => genFileInfo(data));\n}","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.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_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".face-list[data-v-1591b7bf] {\\n display: flex;\\n flex-direction: row;\\n height: 350px;\\n flex-wrap: wrap;\\n padding: 12px;\\n align-content: center;\\n}\\n.face-list__item[data-v-1591b7bf] {\\n display: flex;\\n flex-direction: column;\\n padding: 10px;\\n border-radius: var(--border-radius);\\n align-items: center;\\n cursor: pointer;\\n width: 120px;\\n}\\n.face-list__item *[data-v-1591b7bf] {\\n cursor: pointer;\\n}\\n.face-list__item__crop-container[data-v-1591b7bf] {\\n overflow: hidden;\\n width: 60px;\\n height: 60px;\\n border-radius: 60px;\\n position: relative;\\n background: var(--color-background-darker);\\n --photos-face-width: 60px;\\n}\\n.face-list__item[data-v-1591b7bf]:hover, .face-list__item[data-v-1591b7bf]:focus {\\n background: var(--color-background-hover);\\n}\\n.face-list__item__details[data-v-1591b7bf] {\\n padding: 10px;\\n height: 1em;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n width: 100%;\\n text-align: center;\\n}\\n.loader[data-v-1591b7bf] {\\n margin: 25% auto;\\n}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.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_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".face[data-v-03238d12] {\\n display: flex;\\n flex-direction: column;\\n}\\n.face__empty[data-v-03238d12] {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n.face__empty__button[data-v-03238d12] {\\n margin-top: 32px;\\n}\\n.face__header[data-v-03238d12] {\\n display: flex;\\n min-height: 60px;\\n align-items: center;\\n justify-content: space-between;\\n position: sticky;\\n z-index: 3;\\n background: var(--color-main-background);\\n padding: 0 64px;\\n}\\n@media only screen and (max-width: 1020px) {\\n.face__header[data-v-03238d12] {\\n padding: 0;\\n padding-left: 64px;\\n}\\n}\\n.face__header__left[data-v-03238d12] {\\n height: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.face__header__title[data-v-03238d12] {\\n margin-left: 10px;\\n}\\n.face__header__title h2[data-v-03238d12] {\\n margin-bottom: 0;\\n}\\n.face__header__loader[data-v-03238d12] {\\n margin-left: 32px;\\n}\\n.face__header__actions[data-v-03238d12] {\\n display: flex;\\n align-items: center;\\n}\\n.face__header__actions button[data-v-03238d12] {\\n margin-left: 16px;\\n}\\n.face__photos[data-v-03238d12] {\\n margin-top: 16px;\\n height: 100%;\\n min-height: 0;\\n padding: 0 64px;\\n}\\n@media only screen and (max-width: 1020px) {\\n.face__photos[data-v-03238d12] {\\n padding: 0;\\n}\\n}\\n.empty-content-with-illustration[data-v-03238d12] .empty-content__icon {\\n width: 200px;\\n height: 200px;\\n}\\n.empty-content-with-illustration[data-v-03238d12] .empty-content__icon svg {\\n width: 200px;\\n height: 200px;\\n}\\n.rename-form[data-v-03238d12] {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n height: 70px;\\n padding: 16px;\\n}\\n.rename-form input[data-v-03238d12] {\\n width: 80%;\\n}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\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=1591b7bf&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=1591b7bf&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","\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=03238d12&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=03238d12&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FaceMergeForm.vue?vue&type=template&id=1591b7bf&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=1591b7bf&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 \"1591b7bf\",\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/home/louis/workspace/nextcloud/apps/photos/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('1591b7bf')) {\n api.createRecord('1591b7bf', component.options)\n } else {\n api.reload('1591b7bf', component.options)\n }\n module.hot.accept(\"./FaceMergeForm.vue?vue&type=template&id=1591b7bf&scoped=true&\", function () {\n api.rerender('1591b7bf', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"src/components/FaceMergeForm.vue\"\nexport default component.exports","import { render, staticRenderFns } from \"./FaceContent.vue?vue&type=template&id=03238d12&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=03238d12&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 \"03238d12\",\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/home/louis/workspace/nextcloud/apps/photos/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('03238d12')) {\n api.createRecord('03238d12', component.options)\n } else {\n api.reload('03238d12', component.options)\n }\n module.hot.accept(\"./FaceContent.vue?vue&type=template&id=03238d12&scoped=true&\", function () {\n api.rerender('03238d12', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"src/views/FaceContent.vue\"\nexport default component.exports","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&\"","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&\"","export * from \"-!../../node_modules/style-loader/dist/cjs.js!../../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=1591b7bf&scoped=true&lang=scss&\"","export * from \"-!../../node_modules/style-loader/dist/cjs.js!../../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=03238d12&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceMergeForm.vue?vue&type=template&id=1591b7bf&scoped=true&\"","export * from \"-!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FaceContent.vue?vue&type=template&id=03238d12&scoped=true&\"","var render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"merge-form face-list\" },\n [\n _vm.loading\n ? [_c(\"NcLoadingIcon\", { staticClass: \"loader\" })]\n : _vm._l(_vm.filteredFaces, function (face) {\n return _c(\n \"div\",\n {\n key: face.basename,\n staticClass: \"face-list__item\",\n on: {\n click: function ($event) {\n return _vm.handleSelect(face.basename)\n },\n },\n },\n [\n _c(\"div\", { staticClass: \"face-list__item__crop-container\" }, [\n _c(\"img\", {\n staticClass: \"face-list__item__image\",\n style: _vm.getCoverStyle(face.basename),\n attrs: { src: _vm.getCoverUrl(face.basename) },\n }),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"face-list__item__details\" }, [\n _c(\n \"span\",\n {\n class: {\n \"hidden-visually\": face.basename.match(/^[0-9]+$/),\n },\n },\n [_vm._v(_vm._s(face.basename))]\n ),\n ]),\n ]\n )\n }),\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","var render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _vm.face === undefined && !_vm.loadingFiles && !_vm.loadingFaces\n ? _c(\n \"NcEmptyContent\",\n {\n staticClass: \"empty-content-with-illustration\",\n scopedSlots: _vm._u(\n [\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"AccountBoxMultipleOutline\")]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 2861705255\n ),\n },\n [\n _vm._v(\n \"\\n\\t\" +\n _vm._s(_vm.t(\"photos\", \"This person could not be found\")) +\n \"\\n\"\n ),\n ]\n )\n : _vm.errorFetchingFiles || _vm.errorFetchingFaces\n ? _c(\n \"NcEmptyContent\",\n {\n scopedSlots: _vm._u([\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"AlertCircle\")]\n },\n proxy: true,\n },\n ]),\n },\n [_vm._v(\"\\n\\t\" + _vm._s(_vm.t(\"photos\", \"An error occurred\")) + \"\\n\")]\n )\n : _c(\n \"div\",\n { staticClass: \"face\" },\n [\n _c(\"div\", { staticClass: \"face__header\" }, [\n _c(\n \"div\",\n { staticClass: \"face__header__left\" },\n [\n _c(\n \"NcActions\",\n [\n _c(\n \"NcActionButton\",\n {\n on: {\n click: function ($event) {\n return _vm.$router.push(\"/faces/\")\n },\n },\n scopedSlots: _vm._u([\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"ArrowLeft\")]\n },\n proxy: true,\n },\n ]),\n },\n [_vm._v(_vm._s(_vm.t(\"photos\", \"Back\")) + \"\\n\\t\\t\\t\\t\")]\n ),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"face__header__title\" }, [\n _vm.face !== undefined\n ? _c(\n \"h2\",\n {\n class: {\n \"face-name\": true,\n \"hidden-visually\":\n _vm.face.basename.match(/^[0-9]+$/),\n },\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" +\n _vm._s(_vm.face.basename) +\n \"\\n\\t\\t\\t\\t\"\n ),\n ]\n )\n : _vm._e(),\n ]),\n _vm._v(\" \"),\n _vm.loadingCount > 0 || _vm.loadingFaces\n ? _c(\"NcLoadingIcon\")\n : _vm._e(),\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.face !== undefined\n ? _c(\n \"div\",\n { staticClass: \"face__header__actions\" },\n [\n _c(\n \"NcActions\",\n [\n _c(\n \"NcActionButton\",\n {\n attrs: {\n \"close-after-click\": true,\n \"aria-label\": _vm.t(\"photos\", \"Rename person\"),\n },\n on: {\n click: function ($event) {\n _vm.showRenameModal = true\n },\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"Pencil\")]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 514409694\n ),\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"photos\", \"Rename person\")) +\n \"\\n\\t\\t\\t\\t\"\n ),\n ]\n ),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"NcActions\",\n { attrs: { \"force-menu\": true } },\n [\n Object.keys(_vm.faces).length > 1\n ? _c(\n \"NcActionButton\",\n {\n attrs: {\n \"close-after-click\": true,\n \"aria-label\": _vm.t(\n \"photos\",\n \"Merge with different person\"\n ),\n },\n on: {\n click: function ($event) {\n _vm.showMergeModal = true\n },\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"Merge\")]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 3117189691\n ),\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" +\n _vm._s(\n _vm.t(\n \"photos\",\n \"Merge with different person\"\n )\n ) +\n \"\\n\\t\\t\\t\\t\"\n ),\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.selectedFileIds.length\n ? [\n _c(\n \"NcActionButton\",\n {\n attrs: {\n \"close-after-click\": true,\n \"aria-label\": _vm.t(\n \"photos\",\n \"Download selected files\"\n ),\n },\n on: { click: _vm.downloadSelection },\n },\n [\n _c(\"Download\", {\n attrs: { slot: \"icon\" },\n slot: \"icon\",\n }),\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\\t\" +\n _vm._s(\n _vm.t(\n \"photos\",\n \"Download selected photos\"\n )\n ) +\n \"\\n\\t\\t\\t\\t\\t\"\n ),\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.shouldFavoriteSelection\n ? _c(\n \"NcActionButton\",\n {\n attrs: {\n \"close-after-click\": true,\n \"aria-label\": _vm.t(\n \"photos\",\n \"Mark selection as favorite\"\n ),\n },\n on: { click: _vm.favoriteSelection },\n },\n [\n _c(\"Star\", {\n attrs: { slot: \"icon\" },\n slot: \"icon\",\n }),\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"photos\", \"Favorite\")) +\n \"\\n\\t\\t\\t\\t\\t\"\n ),\n ],\n 1\n )\n : _c(\n \"NcActionButton\",\n {\n attrs: {\n \"close-after-click\": true,\n \"aria-label\": _vm.t(\n \"photos\",\n \"Remove selection from favorites\"\n ),\n },\n on: { click: _vm.unFavoriteSelection },\n },\n [\n _c(\"Star\", {\n attrs: { slot: \"icon\" },\n slot: \"icon\",\n }),\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\\t\" +\n _vm._s(\n _vm.t(\n \"photos\",\n \"Remove from favorites\"\n )\n ) +\n \"\\n\\t\\t\\t\\t\\t\"\n ),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"NcActionButton\",\n {\n attrs: { \"close-after-click\": true },\n on: {\n click: function ($event) {\n return _vm.handleRemoveFilesFromFace(\n _vm.selectedFileIds\n )\n },\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"Close\")]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 1051939733\n ),\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\\t\" +\n _vm._s(\n _vm.n(\n \"photos\",\n \"Remove photo from person\",\n \"Remove photos from person\",\n _vm.selectedFileIds.length\n )\n ) +\n \"\\n\\t\\t\\t\\t\\t\"\n ),\n ]\n ),\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"NcActionButton\",\n {\n attrs: { \"close-after-click\": true },\n on: { click: _vm.handleDeleteFace },\n scopedSlots: _vm._u(\n [\n {\n key: \"icon\",\n fn: function () {\n return [_c(\"Close\")]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 1051939733\n ),\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"photos\", \"Remove person\")) +\n \"\\n\\t\\t\\t\\t\"\n ),\n ]\n ),\n ],\n 2\n ),\n ],\n 1\n )\n : _vm._e(),\n ]),\n _vm._v(\" \"),\n _vm.face !== undefined\n ? _c(\"FilesListViewer\", {\n staticClass: \"face__photos\",\n attrs: {\n \"container-element\": _vm.appContent,\n \"file-ids\": _vm.faceFileIds,\n loading: _vm.loadingFiles || _vm.loadingFaces,\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function (ref) {\n var file = ref.file\n var visibility = ref.visibility\n return _c(\"File\", {\n attrs: {\n file: _vm.files[file.id],\n \"allow-selection\": true,\n selected: _vm.selection[file.id] === true,\n visibility: visibility,\n semaphore: _vm.semaphore,\n },\n on: {\n click: _vm.openViewer,\n \"select-toggled\": _vm.onFileSelectToggle,\n },\n })\n },\n },\n ],\n null,\n false,\n 3592900521\n ),\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showRenameModal\n ? _c(\n \"NcModal\",\n {\n attrs: { title: _vm.t(\"photos\", \"Rename person\") },\n on: {\n close: function ($event) {\n _vm.showRenameModal = false\n },\n },\n },\n [\n _c(\n \"div\",\n { staticClass: \"rename-form\" },\n [\n _c(\"input\", {\n directives: [{ name: \"focus\", rawName: \"v-focus\" }],\n ref: \"nameInput\",\n attrs: {\n type: \"text\",\n name: \"name\",\n required: \"\",\n placeholder: _vm.t(\"photos\", \"Name of this person\"),\n },\n domProps: { value: _vm.faceName },\n on: {\n keydown: function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return _vm.handleRenameFace(\n _vm.$refs.nameInput.value\n )\n },\n },\n }),\n _vm._v(\" \"),\n _c(\n \"NcButton\",\n {\n attrs: {\n \"aria-label\": _vm.t(\"photos\", \"Save.\"),\n type: \"primary\",\n disabled:\n _vm.$refs.nameInput &&\n _vm.$refs.nameInput.value.trim() === \"\",\n },\n on: {\n click: function ($event) {\n return _vm.handleRenameFace(\n _vm.$refs.nameInput.value\n )\n },\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"icon\",\n fn: function () {\n return [\n _vm.loadingCount\n ? _c(\"NcLoadingIcon\")\n : _c(\"Send\"),\n ]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 564208483\n ),\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\" +\n _vm._s(_vm.t(\"photos\", \"Save\")) +\n \"\\n\\t\\t\\t\"\n ),\n ]\n ),\n ],\n 1\n ),\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showMergeModal\n ? _c(\n \"NcModal\",\n {\n attrs: { title: _vm.t(\"photos\", \"Merge person\") },\n on: {\n close: function ($event) {\n _vm.showMergeModal = false\n },\n },\n },\n [\n _c(\"FaceMergeForm\", {\n attrs: { \"first-face\": _vm.faceName },\n on: {\n select: function ($event) {\n return _vm.handleMerge($event)\n },\n },\n }),\n ],\n 1\n )\n : _vm._e(),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }"],"names":[],"sourceRoot":""}
|