1 line
38 KiB
Plaintext
1 line
38 KiB
Plaintext
{"version":3,"file":"photos-main.mjs","sources":["../node_modules/@nextcloud/vue/dist/Components/NcAppNavigationList.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcAppNavigation-CqKWSnxO.mjs","../node_modules/@nextcloud/vue/dist/Components/NcAppSettingsSection.mjs","../src/components/Settings/CroppedLayoutSettings.vue","../src/components/Settings/PhotosUploadLocationSettings.vue","../src/components/Settings/SettingsDialog.vue","../src/services/IsAppStoreEnabled.ts","../src/PhotosApp.vue","../src/main.ts"],"sourcesContent":["import '../assets/NcAppNavigationList-DnKj0-Zq.css';\nimport { n as normalizeComponent } from \"../chunks/_plugin-vue2_normalizer-DU4iP6Vu.mjs\";\nconst _sfc_main = {\n name: \"NcAppNavigationList\"\n};\nvar _sfc_render = function render() {\n var _vm = this, _c = _vm._self._c;\n return _c(\"ul\", { staticClass: \"app-navigation-list\" }, [_vm._t(\"default\")], 2);\n};\nvar _sfc_staticRenderFns = [];\nvar __component__ = /* @__PURE__ */ normalizeComponent(\n _sfc_main,\n _sfc_render,\n _sfc_staticRenderFns,\n false,\n null,\n \"058e6060\"\n);\nconst NcAppNavigationList = __component__.exports;\nexport {\n NcAppNavigationList as default\n};\n//# sourceMappingURL=NcAppNavigationList.mjs.map\n","import '../assets/NcAppNavigation-WhHdkLQF.css';\nimport { createFocusTrap } from \"focus-trap\";\nimport { emit, unsubscribe, subscribe } from \"@nextcloud/event-bus\";\nimport { tabbable } from \"tabbable\";\nimport Vue from \"vue\";\nimport { g as getTrapStack } from \"./focusTrap-DmkaYJTC.mjs\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\nimport { useHotKey } from \"../Composables/useHotKey.mjs\";\nimport { useIsMobile } from \"../Composables/useIsMobile.mjs\";\nimport NcAppNavigationList from \"../Components/NcAppNavigationList.mjs\";\nimport { N as NcAppNavigationToggle } from \"./NcAppNavigationToggle-CUdNQwyN.mjs\";\nimport { n as normalizeComponent } from \"./_plugin-vue2_normalizer-DU4iP6Vu.mjs\";\nconst _sfc_main = {\n name: \"NcAppNavigation\",\n components: {\n NcAppNavigationList,\n NcAppNavigationToggle\n },\n // Injected from NcContent\n inject: {\n setHasAppNavigation: {\n default: () => () => Vue.util.warn(\"NcAppNavigation is not mounted inside NcContent, this is probably an error.\"),\n from: \"NcContent:setHasAppNavigation\"\n }\n },\n props: {\n /**\n * The aria label to describe the navigation\n */\n ariaLabel: {\n type: String,\n default: \"\"\n },\n /**\n * aria-labelledby attribute to describe the navigation\n */\n ariaLabelledby: {\n type: String,\n default: \"\"\n }\n },\n setup() {\n return {\n isMobile: useIsMobile()\n };\n },\n data() {\n return {\n open: !this.isMobile,\n focusTrap: null\n };\n },\n watch: {\n isMobile() {\n this.open = !this.isMobile;\n this.toggleFocusTrap();\n },\n open() {\n this.toggleFocusTrap();\n }\n },\n mounted() {\n this.setHasAppNavigation(true);\n subscribe(\"toggle-navigation\", this.toggleNavigationByEventBus);\n emit(\"navigation-toggled\", {\n open: this.open\n });\n this.focusTrap = createFocusTrap(this.$refs.appNavigationContainer, {\n allowOutsideClick: true,\n fallbackFocus: this.$refs.appNavigationContainer,\n trapStack: getTrapStack(),\n escapeDeactivates: false\n });\n this.toggleFocusTrap();\n useHotKey(\"n\", this.onKeyDown, {\n prevent: true,\n stop: true\n });\n },\n unmounted() {\n this.setHasAppNavigation(false);\n unsubscribe(\"toggle-navigation\", this.toggleNavigationByEventBus);\n this.focusTrap.deactivate();\n },\n methods: {\n /**\n * Toggle the navigation\n *\n * @param {boolean} [state] set the state instead of inverting the current one\n */\n async toggleNavigation(state) {\n if (this.open === state) {\n emit(\"navigation-toggled\", {\n open: this.open\n });\n return;\n }\n this.open = typeof state === \"undefined\" ? !this.open : state;\n const bodyStyles = getComputedStyle(document.body);\n const animationLength = parseInt(bodyStyles.getPropertyValue(\"--animation-quick\")) || 100;\n if (this.open) {\n await this.$nextTick();\n this.focusFirstElement();\n }\n setTimeout(() => {\n emit(\"navigation-toggled\", {\n open: this.open\n });\n }, 1.5 * animationLength);\n },\n toggleNavigationByEventBus({ open }) {\n this.toggleNavigation(open);\n },\n /**\n * Activate focus trap if it is currently needed, otherwise deactivate\n */\n toggleFocusTrap() {\n if (this.isMobile && this.open) {\n this.focusTrap.activate();\n } else {\n this.focusTrap.deactivate();\n }\n },\n handleEsc() {\n if (this.isMobile && this.open) {\n this.toggleNavigation(false);\n }\n },\n focusFirstElement() {\n const element = tabbable(this.$refs.appNavigationContainer)[0];\n if (element) {\n element.focus();\n logger.debug(\"Focusing first element in the navigation\", { element });\n }\n },\n onKeyDown(event) {\n if (event.key === \"n\") {\n if (!this.open) {\n this.toggleNavigation(true);\n return;\n }\n if (this.isFocusWithinNavigation()) {\n this.toggleNavigation(false);\n }\n }\n },\n isFocusWithinNavigation() {\n const activeElement = document.activeElement;\n return this.$refs.appNavigationContainer?.contains(activeElement);\n }\n }\n};\nvar _sfc_render = function render() {\n var _vm = this, _c = _vm._self._c;\n return _c(\"div\", { ref: \"appNavigationContainer\", staticClass: \"app-navigation\", class: { \"app-navigation--close\": !_vm.open } }, [_c(\"nav\", { staticClass: \"app-navigation__content\", attrs: { \"id\": \"app-navigation-vue\", \"aria-hidden\": _vm.open ? \"false\" : \"true\", \"aria-label\": _vm.ariaLabel || void 0, \"aria-labelledby\": _vm.ariaLabelledby || void 0, \"inert\": !_vm.open || void 0 }, on: { \"keydown\": function($event) {\n if (!$event.type.indexOf(\"key\") && _vm._k($event.keyCode, \"esc\", 27, $event.key, [\"Esc\", \"Escape\"])) return null;\n return _vm.handleEsc.apply(null, arguments);\n } } }, [_c(\"div\", { staticClass: \"app-navigation__search\" }, [_vm._t(\"search\")], 2), _c(\"div\", { staticClass: \"app-navigation__body\", class: { \"app-navigation__body--no-list\": !_vm.$scopedSlots.list } }, [_vm._t(\"default\")], 2), _vm.$scopedSlots.list ? _c(\"NcAppNavigationList\", { staticClass: \"app-navigation__list\" }, [_vm._t(\"list\")], 2) : _vm._e(), _vm._t(\"footer\")], 2), _c(\"NcAppNavigationToggle\", { attrs: { \"open\": _vm.open }, on: { \"update:open\": _vm.toggleNavigation } })], 1);\n};\nvar _sfc_staticRenderFns = [];\nvar __component__ = /* @__PURE__ */ normalizeComponent(\n _sfc_main,\n _sfc_render,\n _sfc_staticRenderFns,\n false,\n null,\n \"6d2acd3d\"\n);\nconst NcAppNavigation = __component__.exports;\nexport {\n NcAppNavigation as N\n};\n//# sourceMappingURL=NcAppNavigation-CqKWSnxO.mjs.map\n","import '../assets/NcAppSettingsSection-Bl2-D3_g.css';\nimport { n as normalizeComponent } from \"../chunks/_plugin-vue2_normalizer-DU4iP6Vu.mjs\";\nconst _sfc_main = {\n name: \"NcAppSettingsSection\",\n inject: [\"registerSection\", \"unregisterSection\"],\n props: {\n name: {\n type: String,\n required: true\n },\n id: {\n type: String,\n required: true,\n validator(id) {\n return /^[a-z0-9\\-_]+$/.test(id);\n }\n }\n },\n computed: {\n // generate an id for each settingssection based on the name without whitespaces\n htmlId() {\n return \"settings-section_\" + this.id;\n }\n },\n // Reactive changes for section navigation\n watch: {\n id(newId, oldId) {\n this.unregisterSection(oldId);\n this.registerSection(newId, this.name, this.$slots?.icon);\n },\n name(newName) {\n this.unregisterSection(this.id);\n this.registerSection(this.id, newName, this.$slots?.icon);\n }\n },\n mounted() {\n this.registerSection(this.id, this.name, this.$slots?.icon);\n },\n beforeDestroy() {\n this.unregisterSection(this.id);\n }\n};\nvar _sfc_render = function render() {\n var _vm = this, _c = _vm._self._c;\n return _c(\"section\", { staticClass: \"app-settings-section\", attrs: { \"id\": _vm.htmlId, \"aria-labelledby\": `${_vm.htmlId}--label` } }, [_c(\"h3\", { staticClass: \"app-settings-section__name\", attrs: { \"id\": `${_vm.htmlId}--label` } }, [_vm._v(\" \" + _vm._s(_vm.name) + \" \")]), _vm._t(\"default\"), _vm._e()], 2);\n};\nvar _sfc_staticRenderFns = [];\nvar __component__ = /* @__PURE__ */ normalizeComponent(\n _sfc_main,\n _sfc_render,\n _sfc_staticRenderFns,\n false,\n null,\n \"e970c9f7\"\n);\nconst NcAppSettingsSection = __component__.exports;\nexport {\n NcAppSettingsSection as default\n};\n//# sourceMappingURL=NcAppSettingsSection.mjs.map\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcCheckboxRadioSwitch\n\t\t:checked=\"croppedLayout\"\n\t\ttype=\"switch\"\n\t\t@update:checked=\"updateSetting\">\n\t\t{{ t('photos', 'Enable squared photos view') }}\n\t</NcCheckboxRadioSwitch>\n</template>\n\n<script lang='ts'>\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\n\nexport default {\n\tname: 'CroppedLayoutSettings',\n\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t},\n\n\tcomputed: {\n\t\tcroppedLayout() {\n\t\t\treturn this.$store.state.userConfig.croppedLayout\n\t\t},\n\t},\n\n\tmethods: {\n\t\tupdateSetting(value) {\n\t\t\tthis.$store.dispatch('updateUserConfig', { key: 'croppedLayout', value })\n\t\t},\n\t},\n}\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"photos-location\">\n\t\t<PhotosFolder :path=\"photosLocation\" :root-folder-label=\"t('photos', 'Home')\" :root-folder-icon=\"HomeOutline\" />\n\n\t\t<NcButton\n\t\t\t:aria-label=\"t('photos', 'Choose default Photos upload and Albums location')\"\n\t\t\t@click=\"debounceSelectPhotosFolder\">\n\t\t\t{{ t('photos', 'Choose a different folder') }}\n\t\t</NcButton>\n\t</div>\n</template>\n\n<script lang='ts'>\nimport { getFilePickerBuilder } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport debounce from 'debounce'\nimport { defineComponent } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport HomeOutline from 'vue-material-design-icons/HomeOutline.vue'\nimport PhotosFolder from './PhotosFolder.vue'\nimport logger from '../../services/logger.js'\n\nexport default defineComponent({\n\tname: 'PhotosUploadLocationSettings',\n\n\tcomponents: {\n\t\tNcButton,\n\t\tPhotosFolder,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tHomeOutline,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tphotosLocation(): string {\n\t\t\treturn this.$store.state.userConfig.photosLocation\n\t\t},\n\t},\n\n\tmethods: {\n\t\tdebounceSelectPhotosFolder: debounce(function() {\n\t\t\tthis.selectPhotosFolder()\n\t\t}),\n\n\t\tasync selectPhotosFolder(): Promise<void> {\n\t\t\tconst pickedFolder = await this.openFilePicker(t('photos', 'Select the default upload location for your media'))\n\t\t\tthis.updatePhotosFolder(pickedFolder)\n\t\t},\n\n\t\tasync openFilePicker(title: string): Promise<string> {\n\t\t\tconst picker = getFilePickerBuilder(title)\n\t\t\t\t.setMultiSelect(false)\n\t\t\t\t.addMimeTypeFilter('httpd/unix-directory')\n\t\t\t\t.allowDirectories()\n\t\t\t\t.startAt(this.photosLocation)\n\t\t\t\t.addButton({\n\t\t\t\t\tlabel: t('photos', 'Pick folder'),\n\t\t\t\t\tcallback: (nodes) => logger.debug('Picked', { nodes }),\n\t\t\t\t})\n\t\t\t\t.build()\n\n\t\t\treturn picker.pick()\n\t\t},\n\n\t\tupdatePhotosFolder(path: string): void {\n\t\t\tthis.$store.dispatch('updateUserConfig', { key: 'photosLocation', value: path })\n\t\t},\n\n\t\tt,\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.photos-location {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: fit-content;\n\n\t.folder {\n\t\tmargin-bottom: 16px;\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcAppSettingsDialog\n\t\t:open=\"open\"\n\t\t:show-navigation=\"true\"\n\t\t:name=\"t('photos', 'Photos settings')\"\n\t\t@update:open=\"onClose\">\n\t\t<NcAppSettingsSection id=\"layout-settings\" :name=\"t('photos', 'View')\">\n\t\t\t<CroppedLayoutSettings />\n\t\t</NcAppSettingsSection>\n\n\t\t<NcAppSettingsSection id=\"source-directories-settings\" :name=\"t('photos', 'Media folders')\">\n\t\t\t<div class=\"setting-section-subline\">\n\t\t\t\t{{ t('photos', 'Choose the folders from where photos and videos are shown.') }}\n\t\t\t</div>\n\n\t\t\t<PhotosSourceLocationsSettings />\n\t\t</NcAppSettingsSection>\n\n\t\t<NcAppSettingsSection id=\"upload-directory-settings\" :name=\"t('photos', 'Upload folder')\">\n\t\t\t<div class=\"setting-section-subline\">\n\t\t\t\t{{ t('photos', 'Choose the folder where photos and albums are uploaded to.') }}\n\t\t\t</div>\n\n\t\t\t<PhotosUploadLocationSettings />\n\t\t</NcAppSettingsSection>\n\t</NcAppSettingsDialog>\n</template>\n\n<script lang='ts'>\nimport { t } from '@nextcloud/l10n'\nimport NcAppSettingsDialog from '@nextcloud/vue/components/NcAppSettingsDialog'\nimport NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'\nimport CroppedLayoutSettings from './CroppedLayoutSettings.vue'\nimport PhotosSourceLocationsSettings from './PhotosSourceLocationsSettings.vue'\nimport PhotosUploadLocationSettings from './PhotosUploadLocationSettings.vue'\n\nexport default {\n\tname: 'SettingsDialog',\n\n\tcomponents: {\n\t\tNcAppSettingsDialog,\n\t\tNcAppSettingsSection,\n\t\tCroppedLayoutSettings,\n\t\tPhotosSourceLocationsSettings,\n\t\tPhotosUploadLocationSettings,\n\t},\n\n\tprops: {\n\t\topen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tmethods: {\n\t\t// This can only be called if the AppSettingsDialog\n\t\t// is shown. So closing only\n\t\tonClose() {\n\t\t\tthis.$emit('update:open', false)\n\t\t},\n\n\t\tt,\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n.app-settings {\n\t.setting-section-subline {\n\t\tcolor: var(--color-text-lighter);\n\t\tmargin-bottom: 8px;\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\nconst appStoreEnabled = loadState('photos', 'appStoreEnabled', false) as boolean\nexport default appStoreEnabled\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcContent app-name=\"photos\">\n\t\t<NcAppNavigation :aria-label=\"t('photos', 'Photos')\">\n\t\t\t<template v-if=\"isTimelineView\" #search>\n\t\t\t\t<PhotosFiltersInput\n\t\t\t\t\t:selected-filters=\"selectedFilters\"\n\t\t\t\t\t@select-filter=\"selectFilter\" />\n\t\t\t\t<PhotosFiltersDisplay\n\t\t\t\t\t:selected-filters=\"selectedFilters\"\n\t\t\t\t\t@deselect-filter=\"deselectFilter\" />\n\t\t\t</template>\n\n\t\t\t<template #list>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'all_media' }\"\n\t\t\t\t\t:name=\"t('photos', 'All media')\"\n\t\t\t\t\tclass=\"app-navigation__all_media\"\n\t\t\t\t\tdata-id-app-nav-item=\"all-media\"\n\t\t\t\t\texact>\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<ImageIcon v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<ImageOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\tto=\"/photos\"\n\t\t\t\t\t:name=\"t('photos', 'Photos')\"\n\t\t\t\t\tdata-id-app-nav-item=\"photos\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<Camera v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<CameraOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\tto=\"/videos\"\n\t\t\t\t\t:name=\"t('photos', 'Videos')\"\n\t\t\t\t\tdata-id-app-nav-item=\"videos\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<VideoIcon v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<VideoOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'albums' }\"\n\t\t\t\t\t:name=\"t('photos', 'Albums')\"\n\t\t\t\t\tdata-id-app-nav-item=\"albums\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<ImageMultiple v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<ImageMultipleOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'sharedAlbums' }\"\n\t\t\t\t\t:name=\"t('photos', 'Collaborative albums')\"\n\t\t\t\t\tdata-id-app-nav-item=\"sharedalbums\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<AccountGroup v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<AccountGroupOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\tv-if=\"showPeopleMenuEntry\"\n\t\t\t\t\t:to=\"{ name: 'faces' }\"\n\t\t\t\t\t:name=\"t('photos', 'People')\"\n\t\t\t\t\tdata-id-app-nav-item=\"faces\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<AccountBoxMultiple v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<AccountBoxMultipleOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'folders' }\"\n\t\t\t\t\t:name=\"t('photos', 'Folders')\"\n\t\t\t\t\tdata-id-app-nav-item=\"folders\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<Folder v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<FolderOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\tto=\"/favorites\"\n\t\t\t\t\t:name=\"t('photos', 'Favorites')\"\n\t\t\t\t\tdata-id-app-nav-item=\"favorites\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<Star v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<StarOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'thisday' }\"\n\t\t\t\t\t:name=\"t('photos', 'On this day')\"\n\t\t\t\t\tdata-id-app-nav-item=\"this-day\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<CalendarToday v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<CalendarTodayOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'shared' }\"\n\t\t\t\t\t:name=\"t('photos', 'Shared with you')\"\n\t\t\t\t\tdata-id-app-nav-item=\"shared\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<ShareVariant v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<ShareVariantOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\tv-if=\"areTagsInstalled\"\n\t\t\t\t\t:to=\"{ name: 'tags' }\"\n\t\t\t\t\t:name=\"t('photos', 'Tags')\"\n\t\t\t\t\tdata-id-app-nav-item=\"tags\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<Tag v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<TagOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:to=\"{ name: 'places' }\"\n\t\t\t\t\t:name=\"t('photos', 'Places')\"\n\t\t\t\t\tdata-id-app-nav-item=\"places\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<MapMarker v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<MapMarkerOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\tv-if=\"showLocationMenuEntry\"\n\t\t\t\t\t:to=\"{ name: 'maps' }\"\n\t\t\t\t\t:name=\"t('photos', 'Map')\"\n\t\t\t\t\tdata-id-app-nav-item=\"maps\">\n\t\t\t\t\t<template #icon=\"{ active }\">\n\t\t\t\t\t\t<MapIcon v-if=\"active\" :size=\"20\" />\n\t\t\t\t\t\t<MapOutline v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</template>\n\t\t\t<template #footer>\n\t\t\t\t<div class=\"app-navigation__footer\">\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\talignment=\"start\"\n\t\t\t\t\t\twide\n\t\t\t\t\t\t@click=\"showSettings\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CogOutline :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('photos', 'Photos settings') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</NcAppNavigation>\n\t\t<NcAppContent>\n\t\t\t<RouterView />\n\n\t\t\t<!-- svg img loading placeholder (linked to the File component) -->\n\t\t\t<!-- eslint-disable-next-line vue/no-v-html (because it's an SVG file) -->\n\t\t\t<span class=\"hidden-visually\" role=\"none\" v-html=\"svgplaceholder\" />\n\t\t\t<!-- eslint-disable-next-line vue/no-v-html (because it's an SVG file) -->\n\t\t\t<span class=\"hidden-visually\" role=\"none\" v-html=\"imgplaceholder\" />\n\t\t\t<!-- eslint-disable-next-line vue/no-v-html (because it's an SVG file) -->\n\t\t\t<span class=\"hidden-visually\" role=\"none\" v-html=\"videoplaceholder\" />\n\t\t</NcAppContent>\n\n\t\t<!-- Main settings Modal-->\n\t\t<SettingsDialog :open.sync=\"openedSettings\" />\n\t</NcContent>\n</template>\n\n<script lang='ts'>\nimport type { FilterOption } from './services/PhotosFilters/PhotosFilter.ts'\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { storeToRefs } from 'pinia'\nimport NcAppContent from '@nextcloud/vue/components/NcAppContent'\nimport NcAppNavigation from '@nextcloud/vue/components/NcAppNavigation'\nimport NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcContent from '@nextcloud/vue/components/NcContent'\nimport AccountBoxMultiple from 'vue-material-design-icons/AccountBoxMultiple.vue'\nimport AccountBoxMultipleOutline from 'vue-material-design-icons/AccountBoxMultipleOutline.vue'\nimport AccountGroup from 'vue-material-design-icons/AccountGroup.vue'\nimport AccountGroupOutline from 'vue-material-design-icons/AccountGroupOutline.vue'\nimport CalendarToday from 'vue-material-design-icons/CalendarToday.vue'\nimport CalendarTodayOutline from 'vue-material-design-icons/CalendarTodayOutline.vue'\nimport Camera from 'vue-material-design-icons/Camera.vue'\nimport CameraOutline from 'vue-material-design-icons/CameraOutline.vue'\nimport CogOutline from 'vue-material-design-icons/CogOutline.vue'\nimport Folder from 'vue-material-design-icons/Folder.vue'\nimport FolderOutline from 'vue-material-design-icons/FolderOutline.vue'\nimport ImageIcon from 'vue-material-design-icons/Image.vue'\nimport ImageMultiple from 'vue-material-design-icons/ImageMultiple.vue'\nimport ImageMultipleOutline from 'vue-material-design-icons/ImageMultipleOutline.vue'\nimport ImageOutline from 'vue-material-design-icons/ImageOutline.vue'\nimport MapIcon from 'vue-material-design-icons/Map.vue'\nimport MapMarker from 'vue-material-design-icons/MapMarker.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport MapOutline from 'vue-material-design-icons/MapOutline.vue'\nimport ShareVariant from 'vue-material-design-icons/ShareVariant.vue'\nimport ShareVariantOutline from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport Star from 'vue-material-design-icons/Star.vue'\nimport StarOutline from 'vue-material-design-icons/StarOutline.vue'\nimport Tag from 'vue-material-design-icons/Tag.vue'\nimport TagOutline from 'vue-material-design-icons/TagOutline.vue'\nimport VideoIcon from 'vue-material-design-icons/Video.vue'\nimport VideoOutline from 'vue-material-design-icons/VideoOutline.vue'\nimport PhotosFiltersDisplay from './components/PhotosFilters/PhotosFiltersDisplay.vue'\nimport PhotosFiltersInput from './components/PhotosFilters/PhotosFiltersInput.vue'\nimport SettingsDialog from './components/Settings/SettingsDialog.vue'\nimport svgplaceholder from './assets/file-placeholder.svg'\nimport imgplaceholder from './assets/image.svg'\nimport videoplaceholder from './assets/video.svg'\nimport areTagsInstalled from './services/AreTagsInstalled.ts'\nimport isAppStoreEnabled from './services/IsAppStoreEnabled.ts'\nimport isMapsInstalled from './services/IsMapsInstalled.ts'\nimport isRecognizeInstalled from './services/IsRecognizeInstalled.ts'\nimport logger from './services/logger.ts'\nimport useFilterStore from './store/filters.ts'\n\nexport default {\n\tname: 'PhotosApp',\n\tcomponents: {\n\t\tAccountBoxMultiple,\n\t\tAccountBoxMultipleOutline,\n\t\tCogOutline,\n\t\tCalendarToday,\n\t\tCalendarTodayOutline,\n\t\tCamera,\n\t\tCameraOutline,\n\t\tAccountGroup,\n\t\tAccountGroupOutline,\n\t\tFolder,\n\t\tFolderOutline,\n\t\tImageMultiple,\n\t\tImageMultipleOutline,\n\t\tImageIcon,\n\t\tImageOutline,\n\t\tShareVariant,\n\t\tShareVariantOutline,\n\t\tStar,\n\t\tStarOutline,\n\t\tTag,\n\t\tTagOutline,\n\t\tVideoIcon,\n\t\tVideoOutline,\n\t\tMapIcon,\n\t\tMapOutline,\n\t\tMapMarker,\n\t\tMapMarkerOutline,\n\t\tNcAppContent,\n\t\tNcAppNavigation,\n\t\tNcAppNavigationItem,\n\t\tNcButton,\n\t\tNcContent,\n\t\tSettingsDialog,\n\t\tPhotosFiltersInput,\n\t\tPhotosFiltersDisplay,\n\t},\n\n\tsetup() {\n\t\tconst filtersStore = useFilterStore()\n\t\tconst { selectedFilters } = storeToRefs(filtersStore)\n\n\t\treturn {\n\t\t\tselectedFilters,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsvgplaceholder,\n\t\t\timgplaceholder,\n\t\t\tvideoplaceholder,\n\t\t\tareTagsInstalled,\n\n\t\t\tshowLocationMenuEntry: getCurrentUser() === null\n\t\t\t\t? false\n\t\t\t\t: (getCurrentUser().isAdmin && isAppStoreEnabled) || isMapsInstalled,\n\n\t\t\tshowPeopleMenuEntry: getCurrentUser() === null\n\t\t\t\t? false\n\t\t\t\t: (getCurrentUser().isAdmin && loadState('photos', 'showPeopleMenuEntry', true) && isAppStoreEnabled) || isRecognizeInstalled,\n\n\t\t\topenedSettings: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisTimelineView() {\n\t\t\treturn ['all_media', 'photos', 'videos'].includes(this.$store.state.route.name || '')\n\t\t},\n\t},\n\n\tasync beforeMount() {\n\t\t// Register excluded paths\n\t\tconst files = loadState('photos', 'nomedia-paths', [])\n\t\tthis.$store.dispatch('setNomediaPaths', files)\n\t\tlogger.debug('Known .nomedia and .noimage paths', { files })\n\n\t\tif ('serviceWorker' in navigator) {\n\t\t\t// Use the window load event to keep the page load performant\n\t\t\twindow.addEventListener('load', () => {\n\t\t\t\tnavigator.serviceWorker.register(generateUrl('/apps/photos/service-worker.js', {}, {\n\t\t\t\t\tnoRewrite: true,\n\t\t\t\t}), {\n\t\t\t\t\tscope: generateUrl('/apps/photos'),\n\t\t\t\t}).then((registration) => {\n\t\t\t\t\tlogger.debug('SW registered: ', { registration })\n\t\t\t\t}).catch((registrationError) => {\n\t\t\t\t\tlogger.error('SW registration failed: ', { registrationError })\n\t\t\t\t})\n\t\t\t})\n\t\t} else {\n\t\t\tlogger.debug('Service Worker is not enabled on this browser.')\n\t\t}\n\t},\n\n\tbeforeDestroy() {\n\t\twindow.removeEventListener('load', () => {\n\t\t\tnavigator.serviceWorker.register(generateUrl('/apps/photos/service-worker.js', {}, {\n\t\t\t\tnoRewrite: true,\n\t\t\t}))\n\t\t})\n\t},\n\n\tmethods: {\n\t\tshowSettings() {\n\t\t\tthis.openedSettings = true\n\t\t},\n\n\t\tselectFilter(filterOption: FilterOption<unknown>) {\n\t\t\tthis.selectedFilters[filterOption.filterId].push(filterOption.value)\n\t\t},\n\n\t\tdeselectFilter(filterOption: { filterId: string, value: unknown }) {\n\t\t\tconst index = this.selectedFilters[filterOption.filterId].indexOf(filterOption.value)\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.selectedFilters[filterOption.filterId].splice(index, 1)\n\t\t\t}\n\t\t},\n\n\t\tt,\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n.app-content {\n\tdisplay: flex;\n\tflex-grow: 1;\n\tflex-direction: column;\n\talign-content: space-between;\n}\n\n.app-navigation__photos :deep(.app-navigation-entry-icon.icon-photos) {\n\tbackground-size: 20px;\n}\n\n.app-navigation__footer {\n\tpadding: calc(var(--default-grid-baseline) * 2);\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { registerDavProperty } from '@nextcloud/files/dav'\nimport { translate, translatePlural } from '@nextcloud/l10n'\nimport { createPinia, PiniaVuePlugin } from 'pinia'\nimport Vue from 'vue'\nimport { sync } from 'vuex-router-sync'\nimport PhotosApp from './PhotosApp.vue'\nimport router from './router/index.js'\nimport store from './store/index.js'\n\nsync(store, router)\n\nVue.prototype.t = translate\nVue.prototype.n = translatePlural\n\nregisterDavProperty('nc:metadata-photos-size')\nregisterDavProperty('nc:metadata-files-live-photo')\nregisterDavProperty('nc:metadata-blurhash')\nregisterDavProperty('nc:metadata-photos-original_date_time')\n\nVue.use(PiniaVuePlugin)\n\nexport default new Vue({\n\tel: '#content',\n\tname: 'PhotosRoot',\n\trouter,\n\tstore,\n\tpinia: createPinia(),\n\trender: (h) => h(PhotosApp),\n})\n"],"names":["_sfc_main","_sfc_render","_vm","_c","_sfc_staticRenderFns","__component__","normalizeComponent","NcAppNavigationList","NcAppNavigationToggle","Vue","useIsMobile","subscribe","emit","createFocusTrap","getTrapStack","useHotKey","unsubscribe","state","bodyStyles","animationLength","open","element","tabbable","logger","event","activeElement","$event","NcAppNavigation","id","newId","oldId","newName","NcAppSettingsSection","_sfc_main$3","NcCheckboxRadioSwitch","value","_sfc_main$2","defineComponent","NcButton","PhotosFolder","HomeOutline","debounce","pickedFolder","t","title","getFilePickerBuilder","nodes","path","_sfc_main$1","NcAppSettingsDialog","CroppedLayoutSettings","PhotosSourceLocationsSettings","PhotosUploadLocationSettings","appStoreEnabled","loadState","AccountBoxMultiple","AccountBoxMultipleOutline","CogOutline","CalendarToday","CalendarTodayOutline","Camera","CameraOutline","AccountGroup","AccountGroupOutline","Folder","FolderOutline","ImageMultiple","ImageMultipleOutline","ImageIcon","ImageOutline","ShareVariant","ShareVariantOutline","Star","StarOutline","Tag","TagOutline","VideoIcon","VideoOutline","MapIcon","MapOutline","MapMarker","MapMarkerOutline","NcAppContent","NcAppNavigationItem","NcContent","SettingsDialog","PhotosFiltersInput","PhotosFiltersDisplay","filtersStore","useFilterStore","selectedFilters","storeToRefs","svgplaceholder","imgplaceholder","videoplaceholder","areTagsInstalled","getCurrentUser","isAppStoreEnabled","isMapsInstalled","isRecognizeInstalled","files","generateUrl","registration","registrationError","filterOption","index","sync","store","router","translate","translatePlural","registerDavProperty","PiniaVuePlugin","createPinia","h","PhotosApp"],"mappings":"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","x_google_ignoreList":[0,1,2]} |