Welcome to mirror list, hosted at ThFree Co, Russian Federation.

photos-src_views_FaceContent_vue.js.map « js - github.com/nextcloud/photos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9859f0d0dfb8fd8264fa6c662f0c3371c5deb574 (plain)
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":""}