photos/js/photos-src_components_Colle...

1 line
53 KiB
XML

{"version":3,"file":"photos-src_components_Collection_CollectionContent_vue-src_components_PhotosPicker_vue.js?v=ffe21867ec160f61c0bb","mappings":"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","sources":["webpack:///photos/src/mixins/FetchFilesMixin.js","webpack:///photos/src/services/PhotoSearch.js","webpack:///photos/src/mixins/FilesByMonthMixin.js","webpack:///photos/src/components/Collection/CollectionContent.vue?vue&type=style&index=0&id=550e2ad4&prod&lang=scss&scoped=true","webpack:///photos/src/components/PhotosPicker.vue?vue&type=style&index=0&id=b044636c&prod&lang=scss&scoped=true","webpack://photos/./src/components/Collection/CollectionContent.vue?de63","webpack:///photos/src/components/Collection/CollectionContent.vue","webpack:///photos/src/components/Collection/CollectionContent.vue?vue&type=script&lang=js","webpack://photos/./src/components/Collection/CollectionContent.vue?a590","webpack://photos/./src/components/Collection/CollectionContent.vue?d20d","webpack://photos/./src/components/PhotosPicker.vue?4733","webpack:///photos/src/components/PhotosPicker.vue","webpack:///photos/src/components/PhotosPicker.vue?vue&type=script&lang=js","webpack://photos/./src/components/PhotosPicker.vue?1f6b","webpack://photos/./src/components/PhotosPicker.vue?67e2"],"sourcesContent":["/**\n * @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n *\n * @author Louis Chemineau <louis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { davGetClient, davRootPath } from '@nextcloud/files'\nimport { joinPaths } from '@nextcloud/paths'\nimport logger from '../services/logger.js'\nimport getPhotos from '../services/PhotoSearch.js'\nimport SemaphoreWithPriority from '../utils/semaphoreWithPriority.js'\nimport AbortControllerMixin from './AbortControllerMixin.js'\nimport store from '../store/index.js'\n\nexport default {\n\tname: 'FetchFilesMixin',\n\n\tmixins: [\n\t\tAbortControllerMixin,\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\terrorFetchingFiles: null,\n\t\t\tloadingFiles: false,\n\t\t\tdoneFetchingFiles: false,\n\t\t\tfetchSemaphore: new SemaphoreWithPriority(1),\n\t\t\tfetchedFileIds: [],\n\t\t}\n\t},\n\n\twatch: {\n\t\t'$route.path'() {\n\t\t\tthis.resetFetchFilesState()\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * @param {object} options - Options to pass to getPhotos.\n\t\t * @param {string[]} [blacklist=[]] - Array of ids to filter out.\n\t\t * @param {boolean} [force=false] - Force fetching even if doneFetchingFiles is true\n\t\t * @return {Promise<string[]>} - The next batch of data depending on global offset.\n\t\t */\n\t\tasync fetchFiles(options = {}, blacklist = [], force = false) {\n\t\t\tif ((this.doneFetchingFiles && !force) || this.loadingFiles) {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\tconst fetchSemaphoreSymbol = await this.fetchSemaphore.acquire()\n\n\t\t\ttry {\n\t\t\t\tthis.errorFetchingFiles = null\n\t\t\t\tthis.loadingFiles = true\n\n\t\t\t\tconst numberOfImagesPerBatch = 200\n\n\t\t\t\t// Load next batch of images\n\t\t\t\tconst fetchedFiles = await getPhotos({\n\t\t\t\t\tfirstResult: this.fetchedFileIds.length,\n\t\t\t\t\tnbResults: numberOfImagesPerBatch,\n\t\t\t\t\t...options,\n\t\t\t\t\tsignal: this.abortController.signal,\n\t\t\t\t})\n\n\t\t\t\t// If we get less files than requested that means we got to the end\n\t\t\t\tif (fetchedFiles.length !== numberOfImagesPerBatch) {\n\t\t\t\t\tthis.doneFetchingFiles = true\n\t\t\t\t}\n\n\t\t\t\tconst fileIds = fetchedFiles\n\t\t\t\t\t.map(file => file.fileid)\n\t\t\t\t\t.filter(fileId => !this.fetchedFileIds.includes(fileId.toString())) // Filter to prevent duplicate fileIds.\n\n\t\t\t\tthis.fetchedFileIds.push(\n\t\t\t\t\t...fileIds\n\t\t\t\t\t\t.map((fileId) => fileId.toString())\n\t\t\t\t\t\t.filter((fileId) => !blacklist.includes(fileId))\n\t\t\t\t)\n\n\t\t\t\tthis.$store.dispatch('appendFiles', fetchedFiles)\n\n\t\t\t\tlogger.debug(`[FetchFilesMixin] Fetched ${fileIds.length} new files: `, fileIds)\n\n\t\t\t\treturn fileIds\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response?.status === 404) {\n\t\t\t\t\tconst sources = store.state.userConfig.photosSourceFolders\n\t\t\t\t\tfor (const source of sources) {\n\t\t\t\t\t\tif (error.response?.data?.match(`File with name /${source} could not be located`) === null) {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.debug(`The ${source} folder does not exist, creating it.`)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait davGetClient().createDirectory(joinPaths(davRootPath, source))\n\t\t\t\t\t\t\tthis.resetFetchFilesState()\n\t\t\t\t\t\t\treturn []\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tthis.errorFetchingFiles = 404\n\t\t\t\t\t\t\tlogger.error('Fail to create source directory', { error })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (error.code === 'ERR_CANCELED') {\n\t\t\t\t\treturn []\n\t\t\t\t} else {\n\t\t\t\t\tthis.errorFetchingFiles = error\n\t\t\t\t}\n\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tlogger.error('Error fetching files', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loadingFiles = false\n\t\t\t\tthis.fetchSemaphore.release(fetchSemaphoreSymbol)\n\t\t\t}\n\n\t\t\treturn []\n\t\t},\n\n\t\tresetFetchFilesState() {\n\t\t\tthis.doneFetchingFiles = false\n\t\t\tthis.errorFetchingFiles = null\n\t\t\tthis.loadingFiles = false\n\t\t\tthis.fetchedFileIds = []\n\t\t},\n\t},\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 */\n\nimport { genFileInfo } from '../utils/fileUtils.js'\nimport { allMimes } from './AllowedMimes.js'\nimport client from './DavClient.js'\nimport { props } from './DavRequest.js'\nimport moment from '@nextcloud/moment'\nimport store from '../store/index.js'\nimport { davRootPath } from '@nextcloud/files'\nimport { joinPaths } from '@nextcloud/paths'\n\n/**\n * List files from a folder and filter out unwanted mimes\n *\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 */\nexport default async function(options = {}) {\n\t// default function options\n\toptions = {\n\t\tfirstResult: 0,\n\t\tnbResults: 200,\n\t\tmimesType: allMimes,\n\t\tonThisDay: false,\n\t\tonlyFavorites: false,\n\t\t...options,\n\t}\n\n\t// generating the search or condition\n\t// based on the allowed mimetypes\n\tconst 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\n\tconst eqFavorites = options.onlyFavorites\n\t\t? `<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\t\t: ''\n\n\tconst onThisDay = options.onThisDay\n\t\t? `<d:or>${Array(20).fill(1)\n\t\t\t.map((_, years) => {\n\t\t\t\tconst start = moment(Date.now()).startOf('day').subtract(3, 'd').subtract(years + 1, 'y')\n\t\t\t\tconst end = moment(Date.now()).endOf('day').add(3, 'd').subtract(years + 1, 'y')\n\t\t\t\treturn `<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\t\t\t}).join('\\n')}</d:or>`\n\t\t: ''\n\n\tconst sourceFolders = store.state.userConfig.photosSourceFolders\n\t\t.map(folder => `\n\t\t\t<d:scope>\n\t\t\t\t<d:href>${joinPaths(davRootPath, folder)}</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>`\n\t\t)\n\t\t.join('\\n')\n\n\toptions = Object.assign({\n\t\tmethod: 'SEARCH',\n\t\theaders: {\n\t\t\t'content-Type': 'text/xml',\n\t\t},\n\t\tdata: `<?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${sourceFolders}\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><nc:metadata-photos-original_date_time/></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\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\t\tdeep: true,\n\t\tdetails: true,\n\t}, options)\n\n\tconst response = await client.getDirectoryContents('', options)\n\n\treturn response.data.map(data => genFileInfo(data))\n}\n","/**\n * @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n *\n * @author Louis Chemineau <louis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default {\n\tname: 'FilesByMonthMixin',\n\n\tcomputed: {\n\t\t/**\n\t\t * @return {Object<string, []>}\n\t\t */\n\t\tfileIdsByMonth() {\n\t\t\tconst filesByMonth = {}\n\t\t\tfor (const fileId of this.fetchedFileIds) {\n\t\t\t\tconst file = this.files[fileId]\n\t\t\t\tif (file) {\n\t\t\t\t\tfilesByMonth[file.month] = filesByMonth[file.month] ?? []\n\t\t\t\t\tfilesByMonth[file.month].push(file.fileid)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Sort files in sections.\n\t\t\tObject.keys(filesByMonth)\n\t\t\t\t.forEach(month => filesByMonth[month].sort(this.sortFilesByTimestamp))\n\n\t\t\treturn filesByMonth\n\t\t},\n\n\t\t/**\n\t\t * @return {string[]}\n\t\t */\n\t\tmonthsList() {\n\t\t\treturn Object\n\t\t\t\t.keys(this.fileIdsByMonth)\n\t\t\t\t.sort((month1, month2) => month1 > month2 ? -1 : 1)\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * @param {string} fileId1 The first file ID\n\t\t * @param {string} fileId2 The second file ID\n\t\t * @return {-1 | 1}\n\t\t */\n\t\tsortFilesByTimestamp(fileId1, fileId2) {\n\t\t\treturn this.files[fileId1].timestamp > this.files[fileId2].timestamp ? -1 : 1\n\t\t},\n\t},\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".collection[data-v-550e2ad4]{display:flex;flex-direction:column}.collection__media[data-v-550e2ad4]{padding:0 64px}@media only screen and (max-width: 1200px){.collection__media[data-v-550e2ad4]{padding:0 4px}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Collection/CollectionContent.vue\"],\"names\":[],\"mappings\":\"AAEA,6BACC,YAAA,CACA,qBAAA,CAEA,oCACC,cAAA,CAEA,2CAHD,oCAIE,aAAA,CAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n.collection {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\n\\t&__media {\\n\\t\\tpadding: 0 64px;\\n\\n\\t\\t@media only screen and (max-width: 1200px) {\\n\\t\\t\\tpadding: 0 4px;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"[data-v-b044636c] .photos-picker{-webkit-padding-end:0 !important;padding-inline-end:0 !important}.photos-picker__navigation__month[data-v-b044636c]{margin:4px}.photos-picker__navigation__month-select[data-v-b044636c]{flex:1;-webkit-padding-end:12px;padding-inline-end:12px;-webkit-padding-after:6px;padding-block-end:6px}.photos-picker__file-list[data-v-b044636c]{flex-grow:1;min-width:0;height:100%;padding:0 4px}.photos-picker__file-list--placeholder[data-v-b044636c]{background:var(--color-primary-element-light);border-radius:var(--border-radius-large)}.photos-picker__file-list .section-header[data-v-b044636c]{font-weight:bold;font-size:20px;padding:8px 0 4px 0}.photos-picker__file-list[data-v-b044636c] .empty-content{position:absolute;width:100%;margin-top:0;height:100%;display:flex;flex-direction:column;justify-content:center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/PhotosPicker.vue\"],\"names\":[],\"mappings\":\"AAEA,iCAEC,gCAAA,CAAA,+BAAA,CAMC,mDAEC,UAAA,CAGD,0DACC,MAAA,CAEA,wBAAA,CAAA,uBAAA,CACA,yBAAA,CAAA,qBAAA,CAIF,2CACC,WAAA,CACA,WAAA,CACA,WAAA,CACA,aAAA,CAEA,wDACC,6CAAA,CACA,wCAAA,CAGD,2DACC,gBAAA,CACA,cAAA,CACA,mBAAA,CAGD,0DACC,iBAAA,CACA,UAAA,CACA,YAAA,CACA,WAAA,CACA,YAAA,CACA,qBAAA,CACA,sBAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n:deep(.photos-picker) {\\n\\t// remove padding to move scrollbar to the very end\\n\\tpadding-inline-end: 0 !important;\\n}\\n\\n.photos-picker {\\n\\n\\t&__navigation {\\n\\t\\t&__month {\\n\\t\\t\\t// For focus-visible outline\\n\\t\\t\\tmargin: 4px;\\n\\t\\t}\\n\\n\\t\\t&__month-select {\\n\\t\\t\\tflex: 1;\\n\\t\\t\\t// align with other content\\n\\t\\t\\tpadding-inline-end: 12px;\\n\\t\\t\\tpadding-block-end: 6px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__file-list {\\n\\t\\tflex-grow: 1;\\n\\t\\tmin-width: 0;\\n\\t\\theight: 100%;\\n\\t\\tpadding: 0 4px;\\n\\n\\t\\t&--placeholder {\\n\\t\\t\\tbackground: var(--color-primary-element-light);\\n\\t\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\t}\\n\\n\\t\\t.section-header {\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t\\tpadding: 8px 0 4px 0;\\n\\t\\t}\\n\\n\\t\\t:deep .empty-content {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\tmargin-top: 0;\\n\\t\\t\\theight: 100%;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tflex-direction: column;\\n\\t\\t\\tjustify-content: center;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function render(){var _vm=this,_c=_vm._self._c;return ((_vm.collection === undefined && !_vm.loading) || _vm.error === 404)?_c('NcEmptyContent',{staticClass:\"empty-content-with-illustration\",attrs:{\"name\":_vm.t('photos', 'This collection does not exist')}},[_c('FolderMultipleImage',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1):(_vm.error)?_c('NcEmptyContent',{attrs:{\"name\":_vm.t('photos', 'An error occurred')}},[_c('AlertCircle',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1):_c('div',{staticClass:\"collection\"},[_vm._t(\"header\",null,{\"selectedFileIds\":_vm.selectedFileIds,\"resetSelection\":_vm.resetSelection}),_vm._v(\" \"),(_vm.sortedCollectionFileIds.length === 0 && !_vm.loading)?_vm._t(\"empty-content\"):_vm._e(),_vm._v(\" \"),(_vm.collection !== undefined)?_c('FilesListViewer',{staticClass:\"collection__media\",attrs:{\"container-element\":_vm.appContent,\"file-ids\":_vm.sortedCollectionFileIds,\"base-height\":_vm.isMobile ? 120 : 200,\"loading\":_vm.loading},scopedSlots:_vm._u([{key:\"default\",fn:function({file, distance}){return _c('File',{attrs:{\"file\":_vm.files[file.id],\"allow-selection\":_vm.allowSelection,\"selected\":_vm.selection[file.id] === true,\"distance\":distance},on:{\"click\":_vm.openViewer,\"select-toggled\":_vm.onFileSelectToggle}})}}],null,false,3813029717)}):_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n -\n - @author Louis Chemineau <louis@chmn.me>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<!-- Errors handlers-->\n\t<NcEmptyContent v-if=\"(collection === undefined && !loading) || error === 404\"\n\t\tclass=\"empty-content-with-illustration\"\n\t\t:name=\"t('photos', 'This collection does not exist')\">\n\t\t<FolderMultipleImage slot=\"icon\" />\n\t</NcEmptyContent>\n\t<NcEmptyContent v-else-if=\"error\" :name=\"t('photos', 'An error occurred')\">\n\t\t<AlertCircle slot=\"icon\" />\n\t</NcEmptyContent>\n\n\t<div v-else class=\"collection\">\n\t\t<!-- Header -->\n\t\t<slot class=\"collection__header\"\n\t\t\tname=\"header\"\n\t\t\t:selected-file-ids=\"selectedFileIds\"\n\t\t\t:reset-selection=\"resetSelection\" />\n\n\t\t<!-- No content -->\n\t\t<slot v-if=\"sortedCollectionFileIds.length === 0 && !loading\" name=\"empty-content\" />\n\n\t\t<!-- Media list -->\n\t\t<FilesListViewer v-if=\"collection !== undefined\"\n\t\t\t:container-element=\"appContent\"\n\t\t\tclass=\"collection__media\"\n\t\t\t:file-ids=\"sortedCollectionFileIds\"\n\t\t\t:base-height=\"isMobile ? 120 : 200\"\n\t\t\t:loading=\"loading\">\n\t\t\t<File slot-scope=\"{file, distance}\"\n\t\t\t\t:file=\"files[file.id]\"\n\t\t\t\t:allow-selection=\"allowSelection\"\n\t\t\t\t:selected=\"selection[file.id] === true\"\n\t\t\t\t:distance=\"distance\"\n\t\t\t\t@click=\"openViewer\"\n\t\t\t\t@select-toggled=\"onFileSelectToggle\" />\n\t\t</FilesListViewer>\n\t</div>\n</template>\n\n<script>\nimport AlertCircle from 'vue-material-design-icons/AlertCircle.vue'\nimport FolderMultipleImage from 'vue-material-design-icons/FolderMultipleImage.vue'\n\nimport { NcEmptyContent, isMobile } from '@nextcloud/vue'\nimport { translate } from '@nextcloud/l10n'\n\nimport FilesSelectionMixin from '../../mixins/FilesSelectionMixin.js'\nimport FilesListViewer from '.././FilesListViewer.vue'\nimport File from '.././File.vue'\n\nexport default {\n\tname: 'CollectionContent',\n\n\tcomponents: {\n\t\tAlertCircle,\n\t\tFolderMultipleImage,\n\t\tNcEmptyContent,\n\t\tFilesListViewer,\n\t\tFile,\n\t},\n\n\tmixins: [\n\t\tFilesSelectionMixin,\n\t\tisMobile,\n\t],\n\n\tprops: {\n\t\t/** @type {import('vue').PropType<import('../../services/collectionFetcher').Collection>} */\n\t\tcollection: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => undefined,\n\t\t},\n\n\t\t/** @type {import('vue').PropType<string[]>} */\n\t\tcollectionFileIds: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\tallowSelection: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\terror: {\n\t\t\ttype: [Error, Number],\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tappContent: document.getElementById('app-content-vue'),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {import('../../services/collectionFetcher').IndexedCollectionFiles} */\n\t\tfiles() {\n\t\t\treturn this.$store.getters.files\n\t\t},\n\n\t\tsortedCollectionFileIds() {\n\t\t\treturn this.collectionFileIds.toSorted((fileId1, fileId2) => this.files[fileId1].timestamp < this.files[fileId2].timestamp ? -1 : 1)\n\t\t},\n\t},\n\n\tmethods: {\n\t\topenViewer(fileId) {\n\t\t\tconst file = this.files[fileId]\n\t\t\tOCA.Viewer.open({\n\t\t\t\tfileInfo: file,\n\t\t\t\tlist: this.sortedCollectionFileIds.map(fileId => this.files[fileId]).filter(file => !file.sectionHeader),\n\t\t\t\tloadMore: file.loadMore ? async () => await file.loadMore(true) : () => [],\n\t\t\t\tcanLoop: file.canLoop,\n\t\t\t})\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.collection {\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t&__media {\n\t\tpadding: 0 64px;\n\n\t\t@media only screen and (max-width: 1200px) {\n\t\t\tpadding: 0 4px;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CollectionContent.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!./CollectionContent.vue?vue&type=script&lang=js\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2.use[3]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CollectionContent.vue?vue&type=style&index=0&id=550e2ad4&prod&lang=scss&scoped=true\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2.use[3]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CollectionContent.vue?vue&type=style&index=0&id=550e2ad4&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./CollectionContent.vue?vue&type=template&id=550e2ad4&scoped=true\"\nimport script from \"./CollectionContent.vue?vue&type=script&lang=js\"\nexport * from \"./CollectionContent.vue?vue&type=script&lang=js\"\nimport style0 from \"./CollectionContent.vue?vue&type=style&index=0&id=550e2ad4&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"550e2ad4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcDialog',{attrs:{\"content-classes\":\"photos-picker\",\"name\":_vm.name,\"open\":_vm.open,\"out-transition\":\"\",\"size\":\"large\"},on:{\"update:open\":(open) => _vm.$emit('update:open', open)},scopedSlots:_vm._u([{key:\"navigation\",fn:function({ isCollapsed }){return [(isCollapsed)?_c('NcSelect',{staticClass:\"photos-picker__navigation__month-select\",attrs:{\"aria-label-listbox\":_vm.t('photos', 'Dates'),\"clearable\":false,\"input-label\":_vm.t('photos', 'Jump to specific date in list'),\"options\":_vm.monthsList},scopedSlots:_vm._u([{key:\"selected-option\",fn:function({ label }){return [_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.dateMonthAndYear(label))+\"\\n\\t\\t\\t\")]}},{key:\"option\",fn:function({ label }){return [_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.dateMonthAndYear(label))+\"\\n\\t\\t\\t\")]}}],null,true),model:{value:(_vm.targetMonth),callback:function ($$v) {_vm.targetMonth=$$v},expression:\"targetMonth\"}}):_c('ul',{attrs:{\"aria-label\":_vm.t('photos', 'Dates')}},_vm._l((_vm.monthsList),function(month){return _c('li',{key:month,staticClass:\"photos-picker__navigation__month\"},[_c('NcButton',{attrs:{\"type\":_vm.targetMonth === month ? 'secondary' : 'tertiary',\"aria-label\":_vm.t('photos', 'Jump to {date}', { date: _vm.dateMonthAndYear(month) })},on:{\"click\":function($event){_vm.targetMonth = month}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.dateMonthAndYear(month))+\"\\n\\t\\t\\t\\t\")])],1)}),0)]}},{key:\"actions\",fn:function(){return [_c('UploadPicker',{attrs:{\"accept\":_vm.allowedMimes,\"context\":_vm.uploadContext,\"destination\":_vm.photosLocationFolder,\"multiple\":true},on:{\"uploaded\":_vm.refreshFiles}}),_vm._v(\" \"),_c('NcButton',{attrs:{\"type\":\"primary\",\"disabled\":_vm.loading || _vm.selectedFileIds.length === 0},on:{\"click\":_vm.emitPickedEvent},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(!_vm.loading)?_c('ImagePlus'):_vm._e(),_vm._v(\" \"),(_vm.loading)?_c('NcLoadingIcon'):_vm._e()]},proxy:true}])},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('photos', 'Add to {destination}', { destination: _vm.destination }))+\"\\n\\t\\t\")])]},proxy:true}])},[_vm._v(\" \"),_vm._v(\" \"),_c('FilesListViewer',{staticClass:\"photos-picker__file-list\",class:{'photos-picker__file-list--placeholder': _vm.monthsList.length === 0},attrs:{\"file-ids-by-section\":_vm.fileIdsByMonth,\"empty-message\":_vm.t('photos', 'There are no photos or videos yet!'),\"sections\":_vm.monthsList,\"loading\":_vm.loadingFiles,\"base-height\":100,\"section-header-height\":50,\"scroll-to-section\":_vm.targetMonth},on:{\"need-content\":_vm.getFiles},nativeOn:{\"focusout\":function($event){return _vm.onFocusOut.apply(null, arguments)}},scopedSlots:_vm._u([{key:\"default\",fn:function({file, height, isHeader, distance}){return [(isHeader)?_c('h3',{staticClass:\"section-header\",style:({ height: `${height}px`}),attrs:{\"id\":`photos-picker-section-header-${file.id}`}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.dateMonthAndYear(file.id))+\"\\n\\t\\t\\t\")]):_c('File',{attrs:{\"file\":_vm.files[file.id],\"allow-selection\":true,\"selected\":_vm.selection[file.id] === true,\"distance\":distance},on:{\"select-toggled\":_vm.onFileSelectToggle}})]}}])})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2022 Louis Chemineau <louis@chmn.me>\n -\n - @author Louis Chemineau <louis@chmn.me>\n - @author Ferdinand Thiessen <opensource@fthiessen.de>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcDialog content-classes=\"photos-picker\"\n\t\t:name=\"name\"\n\t\t:open=\"open\"\n\t\tout-transition\n\t\tsize=\"large\"\n\t\t@update:open=\"(open) => $emit('update:open', open)\">\n\t\t<!-- Navigation containing the months available -->\n\t\t<template #navigation=\"{ isCollapsed }\">\n\t\t\t<!-- Mobile view -->\n\t\t\t<NcSelect v-if=\"isCollapsed\"\n\t\t\t\tv-model=\"targetMonth\"\n\t\t\t\t:aria-label-listbox=\"t('photos', 'Dates')\"\n\t\t\t\tclass=\"photos-picker__navigation__month-select\"\n\t\t\t\t:clearable=\"false\"\n\t\t\t\t:input-label=\"t('photos', 'Jump to specific date in list')\"\n\t\t\t\t:options=\"monthsList\">\n\t\t\t\t<template #selected-option=\"{ label }\">\n\t\t\t\t\t{{ dateMonthAndYear(label) }}\n\t\t\t\t</template>\n\t\t\t\t<template #option=\"{ label }\">\n\t\t\t\t\t{{ dateMonthAndYear(label) }}\n\t\t\t\t</template>\n\t\t\t</NcSelect>\n\n\t\t\t<!-- Default view -->\n\t\t\t<ul v-else :aria-label=\"t('photos', 'Dates')\">\n\t\t\t\t<li v-for=\"month in monthsList\"\n\t\t\t\t\t:key=\"month\"\n\t\t\t\t\tclass=\"photos-picker__navigation__month\">\n\t\t\t\t\t<NcButton :type=\"targetMonth === month ? 'secondary' : 'tertiary'\"\n\t\t\t\t\t\t:aria-label=\"t('photos', 'Jump to {date}', { date: dateMonthAndYear(month) })\"\n\t\t\t\t\t\t@click=\"targetMonth = month\">\n\t\t\t\t\t\t{{ dateMonthAndYear(month) }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</template>\n\n\t\t<!-- The actions on the bottom -->\n\t\t<template #actions>\n\t\t\t<UploadPicker :accept=\"allowedMimes\"\n\t\t\t\t:context=\"uploadContext\"\n\t\t\t\t:destination=\"photosLocationFolder\"\n\t\t\t\t:multiple=\"true\"\n\t\t\t\t@uploaded=\"refreshFiles\" />\n\t\t\t<NcButton type=\"primary\" :disabled=\"loading || selectedFileIds.length === 0\" @click=\"emitPickedEvent\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ImagePlus v-if=\"!loading\" />\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('photos', 'Add to {destination}', { destination }) }}\n\t\t\t</NcButton>\n\t\t</template>\n\n\t\t<FilesListViewer class=\"photos-picker__file-list\"\n\t\t\t:class=\"{'photos-picker__file-list--placeholder': monthsList.length === 0}\"\n\t\t\t:file-ids-by-section=\"fileIdsByMonth\"\n\t\t\t:empty-message=\"t('photos', 'There are no photos or videos yet!')\"\n\t\t\t:sections=\"monthsList\"\n\t\t\t:loading=\"loadingFiles\"\n\t\t\t:base-height=\"100\"\n\t\t\t:section-header-height=\"50\"\n\t\t\t:scroll-to-section=\"targetMonth\"\n\t\t\t@need-content=\"getFiles\"\n\t\t\t@focusout.native=\"onFocusOut\">\n\t\t\t<template slot-scope=\"{file, height, isHeader, distance}\">\n\t\t\t\t<h3 v-if=\"isHeader\"\n\t\t\t\t\t:id=\"`photos-picker-section-header-${file.id}`\"\n\t\t\t\t\t:style=\"{ height: `${height}px`}\"\n\t\t\t\t\tclass=\"section-header\">\n\t\t\t\t\t{{ dateMonthAndYear(file.id) }}\n\t\t\t\t</h3>\n\n\t\t\t\t<File v-else\n\t\t\t\t\t:file=\"files[file.id]\"\n\t\t\t\t\t:allow-selection=\"true\"\n\t\t\t\t\t:selected=\"selection[file.id] === true\"\n\t\t\t\t\t:distance=\"distance\"\n\t\t\t\t\t@select-toggled=\"onFileSelectToggle\" />\n\t\t\t</template>\n\t\t</FilesListViewer>\n\t</NcDialog>\n</template>\n\n<script>\nimport { UploadPicker } from '@nextcloud/upload'\nimport { NcButton, NcDialog, NcLoadingIcon, NcSelect, useIsMobile } from '@nextcloud/vue'\nimport { defineComponent } from 'vue'\nimport { mapGetters } from 'vuex'\n\nimport moment from '@nextcloud/moment'\n\nimport ImagePlus from 'vue-material-design-icons/ImagePlus.vue'\n\nimport FilesListViewer from './FilesListViewer.vue'\nimport File from './File.vue'\n\nimport FetchFilesMixin from '../mixins/FetchFilesMixin.js'\nimport FilesSelectionMixin from '../mixins/FilesSelectionMixin.js'\nimport FilesByMonthMixin from '../mixins/FilesByMonthMixin.js'\nimport allowedMimes from '../services/AllowedMimes.js'\n\nexport default defineComponent({\n\tname: 'PhotosPicker',\n\n\tcomponents: {\n\t\tFile,\n\t\tFilesListViewer,\n\t\tImagePlus,\n\t\tNcButton,\n\t\tNcDialog,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tUploadPicker,\n\t},\n\n\tmixins: [\n\t\tFetchFilesMixin,\n\t\tFilesByMonthMixin,\n\t\tFilesSelectionMixin,\n\t],\n\n\tprops: {\n\t\t/**\n\t\t * If the photos picker should be opened\n\t\t */\n\t\topen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Name to be used as heading\n\t\t */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t// Label to show in the submit button.\n\t\tdestination: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t// List of file ids to not show.\n\t\tblacklistIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t// Whether we should disable the submit button and show a spinner.\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['files-picked', 'update:open'],\n\n\tsetup() {\n\t\treturn {\n\t\t\tisMobile: useIsMobile(),\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tallowedMimes,\n\t\t\ttargetMonth: null,\n\t\t\tuploadContext: {\n\t\t\t\troute: 'albumpicker',\n\t\t\t},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t]),\n\t},\n\n\twatch: {\n\t\tmonthsList(value) {\n\t\t\tif (this.targetMonth === null) {\n\t\t\t\tthis.targetMonth = value[0]\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * @param {FocusEvent} event The focus event\n\t\t */\n\t\tonFocusOut(event) {\n\t\t\tif (event.relatedTarget === null) { // Focus escaping to body\n\t\t\t\tevent.target.focus({ preventScroll: true })\n\t\t\t}\n\t\t},\n\n\t\tgetFiles() {\n\t\t\tthis.fetchFiles({}, this.blacklistIds)\n\t\t},\n\n\t\trefreshFiles() {\n\t\t\tthis.fetchFiles({ firstResult: 0 }, [...this.blacklistIds, ...this.fetchedFileIds], true)\n\t\t},\n\n\t\temitPickedEvent() {\n\t\t\tthis.$emit('files-picked', this.selectedFileIds)\n\t\t},\n\t\t/**\n\t\t * @param {string} date - In the following format: YYYYMM\n\t\t */\n\t\tdateMonthAndYear(date) {\n\t\t\tif (this.isMobile) {\n\t\t\t\treturn moment(date, 'YYYYMM').format('MMM YYYY')\n\t\t\t}\n\t\t\treturn moment(date, 'YYYYMM').format('MMMM YYYY')\n\t\t},\n\t\tphotosLocationFolder() {\n\t\t\treturn this.$store.state.userConfig.photosLocationFolder\n\t\t},\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n:deep(.photos-picker) {\n\t// remove padding to move scrollbar to the very end\n\tpadding-inline-end: 0 !important;\n}\n\n.photos-picker {\n\n\t&__navigation {\n\t\t&__month {\n\t\t\t// For focus-visible outline\n\t\t\tmargin: 4px;\n\t\t}\n\n\t\t&__month-select {\n\t\t\tflex: 1;\n\t\t\t// align with other content\n\t\t\tpadding-inline-end: 12px;\n\t\t\tpadding-block-end: 6px;\n\t\t}\n\t}\n\n\t&__file-list {\n\t\tflex-grow: 1;\n\t\tmin-width: 0;\n\t\theight: 100%;\n\t\tpadding: 0 4px;\n\n\t\t&--placeholder {\n\t\t\tbackground: var(--color-primary-element-light);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t}\n\n\t\t.section-header {\n\t\t\tfont-weight: bold;\n\t\t\tfont-size: 20px;\n\t\t\tpadding: 8px 0 4px 0;\n\t\t}\n\n\t\t:deep .empty-content {\n\t\t\tposition: absolute;\n\t\t\twidth: 100%;\n\t\t\tmargin-top: 0;\n\t\t\theight: 100%;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: center;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosPicker.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!./PhotosPicker.vue?vue&type=script&lang=js\"","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2.use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosPicker.vue?vue&type=style&index=0&id=b044636c&prod&lang=scss&scoped=true\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2.use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosPicker.vue?vue&type=style&index=0&id=b044636c&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./PhotosPicker.vue?vue&type=template&id=b044636c&scoped=true\"\nimport script from \"./PhotosPicker.vue?vue&type=script&lang=js\"\nexport * from \"./PhotosPicker.vue?vue&type=script&lang=js\"\nimport style0 from \"./PhotosPicker.vue?vue&type=style&index=0&id=b044636c&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b044636c\",\n null\n \n)\n\nexport default component.exports"],"names":["name","mixins","AbortControllerMixin","data","errorFetchingFiles","loadingFiles","doneFetchingFiles","fetchSemaphore","SemaphoreWithPriority","fetchedFileIds","watch","this","resetFetchFilesState","methods","async","options","arguments","length","undefined","blacklist","force","fetchSemaphoreSymbol","acquire","numberOfImagesPerBatch","fetchedFiles","firstResult","nbResults","mimesType","allMimes","onThisDay","onlyFavorites","orMime","reduce","str","mime","concat","eqFavorites","Array","fill","map","_","years","start","moment","Date","now","startOf","subtract","end","endOf","add","format","join","sourceFolders","store","folder","joinPaths","davRootPath","Object","assign","method","headers","props","deep","details","client","genFileInfo","getPhotos","signal","abortController","fileIds","file","fileid","filter","fileId","includes","toString","push","$store","dispatch","logger","error","_error$response","response","status","sources","source","_error$response2","_error$response2$data","match","davGetClient","createDirectory","code","release","computed","fileIdsByMonth","filesByMonth","files","_filesByMonth$file$mo","month","keys","forEach","sort","sortFilesByTimestamp","monthsList","month1","month2","fileId1","fileId2","timestamp","___CSS_LOADER_EXPORT___","module","id","components","AlertCircle","FolderMultipleImage","NcEmptyContent","FilesListViewer","File","FilesSelectionMixin","isMobile","collection","type","default","collectionFileIds","required","loading","Boolean","allowSelection","Error","Number","appContent","document","getElementById","getters","sortedCollectionFileIds","toSorted","openViewer","OCA","Viewer","open","fileInfo","list","sectionHeader","loadMore","canLoop","t","translate","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","_c","_self","staticClass","attrs","slot","_t","selectedFileIds","resetSelection","_v","_e","scopedSlots","_u","key","fn","_ref","distance","selection","on","onFileSelectToggle","defineComponent","ImagePlus","NcButton","NcDialog","NcLoadingIcon","NcSelect","UploadPicker","FetchFilesMixin","FilesByMonthMixin","String","destination","blacklistIds","emits","setup","useIsMobile","allowedMimes","targetMonth","uploadContext","route","mapGetters","value","onFocusOut","event","relatedTarget","target","focus","preventScroll","getFiles","fetchFiles","refreshFiles","emitPickedEvent","$emit","dateMonthAndYear","date","photosLocationFolder","state","userConfig","_setupProxy","isCollapsed","_ref2","label","_s","_ref3","model","callback","$$v","expression","_l","$event","proxy","class","nativeOn","apply","_ref4","height","isHeader","style"],"sourceRoot":""}