photos/js/photos-src_views_Timeline_v...

1 line
101 KiB
XML

{"version":3,"file":"photos-src_views_Timeline_vue.js?v=932d93bcf9845cd93046","mappings":"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","sources":["webpack:///photos/src/services/DavRequest.js","webpack:///photos/src/components/Loader.vue?vue&type=style&index=0&lang=scss&","webpack:///photos/src/components/PhotosHeader.vue?vue&type=style&index=0&id=ef246676&lang=scss&scoped=true&","webpack:///photos/src/components/TiledLayout.vue?vue&type=style&index=0&id=0a4c3fdc&scoped=true&lang=scss&","webpack:///photos/src/components/TiledRows.vue?vue&type=style&index=0&id=452165e4&lang=scss&scoped=true&","webpack:///photos/src/components/VirtualScrolling.vue?vue&type=style&index=0&id=00c0e180&scoped=true&lang=scss&","webpack:///photos/src/views/Timeline.vue?vue&type=style&index=0&id=f605719e&lang=scss&scoped=true&","webpack:///photos/src/views/Timeline.vue?vue&type=template&id=f605719e&scoped=true&","webpack:///photos/src/services/PhotoSearch.js","webpack:///photos/src/services/TiledLayout.js","webpack:///photos/src/components/TiledRows.vue?vue&type=template&id=452165e4&scoped=true&functional=true&","webpack://photos/./src/components/TiledRows.vue?b166","webpack:///photos/src/components/TiledRows.vue","webpack:///photos/src/components/TiledLayout.vue","webpack:///photos/src/components/TiledLayout.vue?vue&type=script&lang=js&","webpack://photos/./src/components/TiledLayout.vue?13d2","webpack://photos/./src/components/TiledLayout.vue?e02f","webpack:///photos/src/components/TiledLayout.vue?vue&type=template&id=0a4c3fdc&scoped=true&","webpack:///photos/src/components/VirtualScrolling.vue","webpack:///photos/src/components/VirtualScrolling.vue?vue&type=script&lang=js&","webpack://photos/./src/components/VirtualScrolling.vue?dc4d","webpack://photos/./src/components/VirtualScrolling.vue?6e3f","webpack:///photos/src/components/VirtualScrolling.vue?vue&type=template&id=00c0e180&scoped=true&","webpack:///photos/node_modules/vue-material-design-icons/Plus.vue","webpack:///photos/node_modules/vue-material-design-icons/Plus.vue?vue&type=script&lang=js&","webpack://photos/./node_modules/vue-material-design-icons/Plus.vue?80b4","webpack:///photos/node_modules/vue-material-design-icons/Plus.vue?vue&type=template&id=39b67473&","webpack:///photos/node_modules/vue-material-design-icons/TrashCan.vue","webpack:///photos/node_modules/vue-material-design-icons/TrashCan.vue?vue&type=script&lang=js&","webpack://photos/./node_modules/vue-material-design-icons/TrashCan.vue?4171","webpack:///photos/node_modules/vue-material-design-icons/TrashCan.vue?vue&type=template&id=614a2d89&","webpack:///photos/node_modules/vue-material-design-icons/DownloadOutline.vue","webpack:///photos/node_modules/vue-material-design-icons/DownloadOutline.vue?vue&type=script&lang=js&","webpack://photos/./node_modules/vue-material-design-icons/DownloadOutline.vue?c8d2","webpack:///photos/node_modules/vue-material-design-icons/DownloadOutline.vue?vue&type=template&id=391e3bc7&","webpack:///photos/node_modules/vue-material-design-icons/Loading.vue","webpack:///photos/node_modules/vue-material-design-icons/Loading.vue?vue&type=script&lang=js&","webpack://photos/./node_modules/vue-material-design-icons/Loading.vue?e4c6","webpack:///photos/node_modules/vue-material-design-icons/Loading.vue?vue&type=template&id=6c8b5c1e&","webpack:///photos/src/components/PhotosHeader.vue","webpack:///photos/src/components/PhotosHeader.vue?vue&type=script&lang=js&","webpack://photos/./src/components/PhotosHeader.vue?c5ab","webpack://photos/./src/components/PhotosHeader.vue?c20b","webpack:///photos/src/components/PhotosHeader.vue?vue&type=template&id=ef246676&scoped=true&","webpack:///photos/src/components/Loader.vue","webpack:///photos/src/components/Loader.vue?vue&type=script&lang=js&","webpack://photos/./src/components/Loader.vue?eb1b","webpack://photos/./src/components/Loader.vue?5508","webpack:///photos/src/components/Loader.vue?vue&type=template&id=7bbb2dd6&","webpack:///photos/src/views/Timeline.vue","webpack:///photos/src/views/Timeline.vue?vue&type=script&lang=js&","webpack://photos/./src/views/Timeline.vue?a9a8","webpack://photos/./src/views/Timeline.vue?2f21"],"sourcesContent":["/**\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 */\nconst props = `\n\t<oc:fileid />\n\t<d:getlastmodified />\n\t<d:getetag />\n\t<d:getcontenttype />\n\t<d:getcontentlength />\n\t<nc:has-preview />\n\t<nc:file-metadata-size />\n\t<oc:favorite />\n\t<d:resourcetype />`\n\nexport { props }\nexport default `<?xml version=\"1.0\"?>\n\t\t\t<d:propfind 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:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<d:prop>\n\t\t\t\t\t${props}\n\t\t\t\t</d:prop>\n\t\t\t</d:propfind>`\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, \".loader{display:grid;height:60px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/Loader.vue\"],\"names\":[],\"mappings\":\"AAsCA,QACC,YAAA,CACA,WAAA\",\"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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.loader {\\n\\tdisplay: grid;\\n\\theight: 60px;\\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, \".photos-header[data-v-ef246676]{display:flex;margin:16px 0;padding-left:32px}.photos-header>*[data-v-ef246676]{margin:0 16px}.photos-header .loading-icon[data-v-ef246676] svg{-webkit-animation:rotate var(--animation-duration, 0.8s) linear infinite;animation:rotate var(--animation-duration, 0.8s) linear infinite;color:var(--color-loading-dark)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/PhotosHeader.vue\"],\"names\":[],\"mappings\":\"AA8LA,gCACC,YAAA,CACA,aAAA,CACA,iBAAA,CAEA,kCACC,aAAA,CAGD,kDACC,wEAAA,CAAA,gEAAA,CACA,+BAAA\",\"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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.photos-header {\\n\\tdisplay: flex;\\n\\tmargin: 16px 0;\\n\\tpadding-left: 32px;\\n\\n\\t& > * {\\n\\t\\tmargin: 0 16px;\\n\\t}\\n\\n\\t.loading-icon::v-deep svg {\\n\\t\\tanimation: rotate var(--animation-duration, 0.8s) linear infinite;\\n\\t\\tcolor: var(--color-loading-dark);\\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, \".photos-header[data-v-0a4c3fdc]{height:50px}.tiled-container[data-v-0a4c3fdc]{margin:0 24px}.tiled-container .tiled-row[data-v-0a4c3fdc]{display:flex;justify-content:space-around;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/TiledLayout.vue\"],\"names\":[],\"mappings\":\"AAuFA,gCACC,WAAA,CAGD,kCACC,aAAA,CAEA,6CACC,YAAA,CACA,4BAAA,CACA,yBAAA,CAAA,sBAAA,CAAA,iBAAA\",\"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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.photos-header {\\n\\theight: 50px;\\n}\\n\\n.tiled-container {\\n\\tmargin: 0 24px;\\n\\n\\t.tiled-row {\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-around;\\n\\t\\twidth: fit-content; // Prevent solitary image to be rendered in the middle because of the flex layout.\\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, \".tiled-row[data-v-452165e4]{display:flex}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/TiledRows.vue\"],\"names\":[],\"mappings\":\"AAsCA,4BACC,YAAA\",\"sourcesContent\":[\"$sizes: (\\\"400\\\": (\\\"count\\\": 3, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"700\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 8), \\\"1024\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1280\\\": (\\\"count\\\": 4, \\\"marginTop\\\": 66, \\\"marginW\\\": 44), \\\"1440\\\": (\\\"count\\\": 5, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"1600\\\": (\\\"count\\\": 6, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2048\\\": (\\\"count\\\": 7, \\\"marginTop\\\": 88, \\\"marginW\\\": 66), \\\"2560\\\": (\\\"count\\\": 8, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"3440\\\": (\\\"count\\\": 9, \\\"marginTop\\\": 88, \\\"marginW\\\": 88), \\\"max\\\": (\\\"count\\\": 10, \\\"marginTop\\\": 88, \\\"marginW\\\": 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.tiled-row {\\n\\tdisplay: flex;\\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, \".vs-container[data-v-00c0e180]{overflow-y:scroll;height:100%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/VirtualScrolling.vue\"],\"names\":[],\"mappings\":\"AAuRA,+BACC,iBAAA,CACA,WAAA\",\"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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.vs-container {\\n\\toverflow-y: scroll;\\n\\theight: 100%;\\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, \".section-header[data-v-f605719e]{padding:32px 0 16px 2px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/views/Timeline.vue\"],\"names\":[],\"mappings\":\"AAuYA,iCACC,uBAAA\",\"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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.section-header {\\n\\tpadding: 32px 0 16px 2px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.error === 404)?_c('EmptyContent',{attrs:{\"illustration-name\":\"folder\"}},[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'This folder does not exist'))+\"\\n\")]):(_vm.error)?_c('EmptyContent',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'An error occurred'))+\"\\n\")]):_c('div',[(_vm.isEmpty)?_c('Navigation',{key:\"navigation\",attrs:{\"basename\":_vm.path,\"filename\":'/',\"root-title\":_vm.rootTitle}}):_c('div',{staticClass:\"photos-container\"},[_c('PhotosHeader',{attrs:{\"selection\":_vm.selection},on:{\"uncheck-items\":_vm.onUncheckItems}}),_vm._v(\" \"),(_vm.nbFetchedFiles === 0 && _vm.loading)?_c('Loader'):_vm._e(),_vm._v(\" \"),_c('TiledLayout',{ref:\"tiledLayout\",attrs:{\"items\":_vm.itemsList},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar rows = ref.rows;\nreturn _c('VirtualScrolling',{attrs:{\"use-window\":true,\"rows\":rows},on:{\"need-content\":_vm.getContent},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar renderedRows = ref.renderedRows;\nreturn _c('TiledRows',{attrs:{\"rows\":renderedRows},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar row = ref.row;\nvar item = ref.item;\nreturn [(item.sectionHeader)?_c('h3',{staticClass:\"section-header\"},[_c('b',[_vm._v(_vm._s(_vm._f(\"dateMonth\")(item.id)))]),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm._f(\"dateYear\")(item.id))+\"\\n\\t\\t\\t\\t\\t\\t\\t\")]):_c('File',{attrs:{\"item\":_vm.files[item.id],\"allow-selection\":true,\"selected\":_vm.selectedItems[item.id] === true,\"visibility\":row.visibility,\"semaphore\":_vm.semaphore},on:{\"click\":_vm.openViewer,\"select-toggled\":_vm.onItemSelectToggle}})]}}],null,true)})}}])})}}])}),_vm._v(\" \"),(_vm.loading)?_c('Loader'):_vm._e(),_vm._v(\" \"),(_vm.isEmpty)?_c('EmptyContent',{attrs:{\"illustration-name\":\"empty\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('photos', 'No photos in here'))+\"\\n\\t\\t\")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\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 { 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/**\n * List files from a folder and filter out unwanted mimes\n *\n * @param {boolean} [onlyFavorites=false] not used\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 * @return {Promise<object[]>} the file list\n */\nexport default async function(onlyFavorites = false, options = {}) {\n\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\t...options,\n\t}\n\n\tconst prefixPath = `/files/${getCurrentUser().uid}`\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 = 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\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<d:scope>\n\t\t\t\t\t\t\t<d:href>${prefixPath}</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\t\tdeep: true,\n\t\tdetails: true,\n\t}, options)\n\n\tconst response = await client.getDirectoryContents('', options)\n\n\treturn response.data\n\t\t.map(data => genFileInfo(data))\n\t\t// remove prefix path from full file path\n\t\t.map(data => Object.assign({}, data, { filename: data.filename.replace(prefixPath, '') }))\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 */\n\n/**\n * @typedef {object} TiledItem\n * @property {string} id\n * @property {number} [width] Real width of the item.\n * @property {number} height Real height of the item.\n * @property {number} [ratio] The aspect ratio of the item.\n * @property {boolean} [sectionHeader] Whether this row is a section header.\n */\n\n/**\n * @typedef {object} TiledRow\n * @property {TiledItem[]} items -\n * @property {number} height -\n * @property {string} key -\n */\n\nconst BASE_ROW_HEIGHT = 200\n\n/**\n * Split items in rows of equal width.\n * The last row will not be forced to match containerWidth.\n *\n * @param {TiledItem[]} items The list of item to split in row of equal width.\n * @param {number} containerWidth The width of a row.\n * @return {TiledRow[]}\n */\nexport function splitItemsInRows(items, containerWidth) {\n\tif (containerWidth === 0) {\n\t\treturn []\n\t}\n\n\tconst rows = []\n\tlet rowNumber = 0\n\tlet currentItem = 0\n\n\twhile (currentItem < items.length) {\n\t\t/** @type { TiledItem[] } */\n\t\tconst rowItems = []\n\n\t\t// Fill the row with new items as long as the width is less than containerWidth.\n\t\tdo {\n\t\t\t// @ts-ignore - We know that items.shift() is not undefined as we always check that items.length > 0.\n\t\t\trowItems.push(items[currentItem++])\n\t\t} while (\n\t\t\tcurrentItem < items.length\n\t\t\t&& !items[currentItem - 1].sectionHeader && !items[currentItem].sectionHeader\n\t\t\t&& computeRowWidth([...rowItems, items[currentItem]]) <= containerWidth\n\t\t)\n\n\t\trows[rowNumber] = {\n\t\t\titems: rowItems,\n\t\t\theight: computeRowHeight(\n\t\t\t\trowItems,\n\t\t\t\tcontainerWidth,\n\t\t\t\titems.length === currentItem || items[currentItem].sectionHeader === true\n\t\t\t),\n\t\t\t// Key to help vue to keep track of the row in VirtualScrolling.\n\t\t\tkey: rowItems.map(item => item.id).join('-'),\n\t\t}\n\n\t\trowNumber += 1\n\t}\n\n\treturn rows\n}\n\n/**\n * Compute the row width based on its items with the assumption that their height is BASE_ROW_HEIGHT.\n *\n * @param {TiledItem[]} items The list of items in the row.\n * @return {number} The width of the row\n */\nfunction computeRowWidth(items) {\n\treturn items\n\t\t.map(item => BASE_ROW_HEIGHT * item.ratio)\n\t\t.reduce((sum, itemWidth) => sum + itemWidth)\n}\n\n/**\n * Compute the row height based on its items and on the container's width.\n *\n * Math time !\n * With Rn the aspect ratio of item n\n * Wn the width of item n\n * Hn the height of item n\n * Wc the width of the container\n * Hr the height of the row\n * For n items we want: Wc = W1 + W2 + ... + Wn\n * We know Rn = Wn / Hn\n * So Wn = Rn * Hn\n * So Wc = (R1 * H1) + (R2 * H2) + ... + (Rn * Hn)\n * But we also want Hr === H1 === H2 === ... === Hn\n * So Wc = (R1 * Hr) + (R2 * Hr) + ... + (Rn * Hr)\n * So Wc = Hr * (R1 + R2 + ... + Rn)\n * So Hr = Wc / (R1 + R2 + ... + Rn)\n *\n * @param {TiledItem[]} items The list of items in the row.\n * @param {number} containerWidth The width of the row.\n * @param {boolean} isLastRow Whether we are computing the height for the last row.\n * @return {number} The height of the row\n */\nfunction computeRowHeight(items, containerWidth, isLastRow) {\n\t// Exception 1: there is only one item and its width it is a sectionHeader, meaning take the full width.\n\tif (items.length === 1 && items[0].sectionHeader) {\n\t\treturn items[0].height\n\t}\n\n\tconst sumOfItemsRatio = items\n\t\t.map(item => item.ratio)\n\t\t.reduce((sum, itemRatio) => sum + itemRatio\n\t\t)\n\n\tlet rowHeight = containerWidth / sumOfItemsRatio\n\n\t// Exception 2: there is only one item which is larger than containerWidth.\n\t// Limit its height so that itemWidth === containerWidth\n\tif (items.length === 1 && items[0].width > containerWidth) {\n\t\trowHeight = containerWidth / items[0].ratio\n\t}\n\n\t// Exception 3: we reached the last row.\n\t// Force the items width to match containerWidth, and limit their heigh to BASE_ROW_HEIGHT.\n\tif (isLastRow) {\n\t\trowHeight = Math.min(BASE_ROW_HEIGHT + 20, rowHeight)\n\t}\n\n\treturn rowHeight\n}\n","var render = function (_h,_vm) {var _c=_vm._c;return _c('ul',_vm._l((_vm.props.rows),function(row){return _c('div',{key:row.key,staticClass:\"tiled-row\",style:({height: ((row.height) + \"px\")})},_vm._l((row.items),function(item){return _c('li',{key:item.id,style:({ width: item.ratio ? ((row.height * item.ratio) + \"px\") : '100%', height: ((row.height) + \"px\")})},[_vm._t(\"default\",null,{\"row\":row,\"item\":item})],2)}),0)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TiledRows.vue?vue&type=style&index=0&id=452165e4&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!./TiledRows.vue?vue&type=style&index=0&id=452165e4&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TiledRows.vue?vue&type=template&id=452165e4&scoped=true&functional=true&\"\nvar script = {}\nimport style0 from \"./TiledRows.vue?vue&type=style&index=0&id=452165e4&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 true,\n null,\n \"452165e4\",\n null\n \n)\n\nexport default component.exports","<!--\n - @copyright Copyright (c) 2019 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<div ref=\"tiledLayoutContainer\"\n\t\tclass=\"tiled-container\">\n\t\t<!-- Slot to allow changing the rows before passing them to TiledRows -->\n\t\t<!-- Useful for partially rendering rows like in VirtualScrolling -->\n\t\t<slot :rows=\"rows\">\n\t\t\t<!-- Default rendering -->\n\t\t\t<TiledRows :rows=\"rows\" />\n\t\t</slot>\n\t</div>\n</template>\n\n<script>\nimport { splitItemsInRows } from '../services/TiledLayout.js'\nimport TiledRows from './TiledRows.vue'\n\nexport default {\n\tname: 'TiledLayout',\n\n\tcomponents: {\n\t\tTiledRows,\n\t},\n\n\tprops: {\n\t\titems: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tcontainerWidth: 0,\n\t\t\t/** @type {ResizeObserver} */\n\t\t\tresizeObserver: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {import('../services/TiledLayout').TiledRow[]} */\n\t\trows() {\n\t\t\treturn splitItemsInRows(this.items, this.containerWidth)\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.resizeObserver = new ResizeObserver(entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst cr = entry.contentRect\n\t\t\t\tif (entry.target.classList.contains('tiled-container')) {\n\t\t\t\t\tthis.containerWidth = cr.width\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tthis.resizeObserver.observe(this.$refs.tiledLayoutContainer)\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.resizeObserver.disconnect()\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.photos-header {\n\theight: 50px;\n}\n\n.tiled-container {\n\tmargin: 0 24px;\n\n\t.tiled-row {\n\t\tdisplay: flex;\n\t\tjustify-content: space-around;\n\t\twidth: fit-content; // Prevent solitary image to be rendered in the middle because of the flex layout.\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!./TiledLayout.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!./TiledLayout.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[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TiledLayout.vue?vue&type=style&index=0&id=0a4c3fdc&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!./TiledLayout.vue?vue&type=style&index=0&id=0a4c3fdc&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TiledLayout.vue?vue&type=template&id=0a4c3fdc&scoped=true&\"\nimport script from \"./TiledLayout.vue?vue&type=script&lang=js&\"\nexport * from \"./TiledLayout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TiledLayout.vue?vue&type=style&index=0&id=0a4c3fdc&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 \"0a4c3fdc\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"tiledLayoutContainer\",staticClass:\"tiled-container\"},[_vm._t(\"default\",function(){return [_c('TiledRows',{attrs:{\"rows\":_vm.rows}})]},{\"rows\":_vm.rows})],2)}\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<div v-if=\"!useWindow && containerElement === null\" ref=\"container\" class=\"vs-container\">\n\t\t<div ref=\"rowsContainer\"\n\t\t\tclass=\"vs-rows-container\"\n\t\t\t:style=\"rowsContainerStyle\">\n\t\t\t<slot :rendered-rows=\"visibleRows\" />\n\t\t</div>\n\t</div>\n\t<div v-else\n\t\tref=\"rowsContainer\"\n\t\tclass=\"vs-rows-container\"\n\t\t:style=\"rowsContainerStyle\">\n\t\t<slot :rendered-rows=\"visibleRows\" />\n\t</div>\n</template>\n\n<script>\n/**\n * @typedef {object} Row\n * @property {number} height - The height of the row.\n */\n\n/**\n * @typedef {Row} VisibleRow\n * @property {'none'|'near'|'visible'} visibility - The visibility state of the row\n * @property {boolean} shouldRender - Whether the row should be renderer in the DOM\n */\n\nexport default {\n\tname: 'VirtualScrolling',\n\n\tprops: {\n\t\trows: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\tcontainerElement: {\n\t\t\ttype: HTMLElement,\n\t\t\tdefault: null,\n\t\t},\n\n\t\tuseWindow: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\trenderWindowRatio: {\n\t\t\ttype: Number,\n\t\t\tdefault: 6,\n\t\t},\n\n\t\twillBeVisibleWindowRatio: {\n\t\t\ttype: Number,\n\t\t\tdefault: 4,\n\t\t},\n\n\t\tvisibleWindowRatio: {\n\t\t\ttype: Number,\n\t\t\t// A little bit more than the container's height to include items at its edges.\n\t\t\tdefault: 0,\n\t\t},\n\n\t\tbottomBufferRatio: {\n\t\t\ttype: Number,\n\t\t\tdefault: 5,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tscrollPosition: 0,\n\t\t\tcontainerHeight: 0,\n\t\t\trowsContainerHeight: 0,\n\t\t\t/** @type {ResizeObserver} */\n\t\t\tresizeObserver: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * @return {VisibleRow[]}\n\t\t */\n\t\tvisibleRows() {\n\t\t\t// Optimisation: get those computed properties once to not go through vue's internal every time we need them.\n\t\t\tconst scrollPosition = this.scrollPosition\n\t\t\tconst containerHeight = this.containerHeight\n\n\t\t\t// Optimisation: different windows to hint the items how they should render themselves.\n\t\t\t// This will be forwarded with the visibility props.\n\t\t\tconst shouldRenderedWindow = containerHeight * this.renderWindowRatio\n\t\t\tconst willBeVisibleWindow = containerHeight * this.willBeVisibleWindowRatio\n\t\t\tconst visibleWindow = containerHeight * this.visibleWindowRatio\n\n\t\t\tlet currentRowTopDistanceFromTop = 0\n\t\t\tlet currentBottomTopDistanceFromTop = 0\n\n\t\t\t// Compute whether a row should be included in the DOM (shouldRender)\n\t\t\t// And how visible the row is.\n\t\t\treturn this.rows\n\t\t\t\t.reduce((visibleRows, row) => {\n\t\t\t\t\tcurrentRowTopDistanceFromTop = currentBottomTopDistanceFromTop\n\t\t\t\t\tcurrentBottomTopDistanceFromTop += row.height\n\n\t\t\t\t\tif (currentRowTopDistanceFromTop < scrollPosition - shouldRenderedWindow || scrollPosition + containerHeight + shouldRenderedWindow < currentRowTopDistanceFromTop) {\n\t\t\t\t\t\treturn visibleRows\n\t\t\t\t\t}\n\n\t\t\t\t\tlet visibility = 'none'\n\n\t\t\t\t\tif (scrollPosition - willBeVisibleWindow < currentRowTopDistanceFromTop && currentRowTopDistanceFromTop < scrollPosition + containerHeight + willBeVisibleWindow) {\n\t\t\t\t\t\tvisibility = 'near'\n\n\t\t\t\t\t\tif (scrollPosition - visibleWindow < currentRowTopDistanceFromTop && currentRowTopDistanceFromTop < scrollPosition + containerHeight + visibleWindow) {\n\t\t\t\t\t\t\tvisibility = 'visible'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (scrollPosition - visibleWindow < currentBottomTopDistanceFromTop && currentBottomTopDistanceFromTop < scrollPosition + containerHeight + visibleWindow) {\n\t\t\t\t\t\t\tvisibility = 'visible'\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...visibleRows,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...row,\n\t\t\t\t\t\t\tvisibility,\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t}, [])\n\t\t},\n\n\t\t/**\n\t\t * Total height of all the rows.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\trowsHeight() {\n\t\t\treturn this.rows\n\t\t\t\t.map(row => row.height)\n\t\t\t\t.reduce((totalHeight, rowHeight) => totalHeight + rowHeight, 0)\n\t\t},\n\n\t\t/**\n\t\t * @return {number}\n\t\t */\n\t\tpaddingTop() {\n\t\t\tif (this.visibleRows.length === 0) {\n\t\t\t\treturn 0\n\t\t\t}\n\n\t\t\tconst firstVisibleRowIndex = this.rows.findIndex(row => row.items === this.visibleRows[0].items)\n\n\t\t\treturn this.rows\n\t\t\t\t.map(row => row.height)\n\t\t\t\t.slice(0, firstVisibleRowIndex)\n\t\t\t\t.reduce((totalHeight, rowHeight) => totalHeight + rowHeight, 0)\n\t\t},\n\n\t\t/**\n\t\t * padding-top is used to replace not included item in the container.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\trowsContainerStyle() {\n\t\t\treturn {\n\t\t\t\theight: `${this.rowsHeight}px`,\n\t\t\t\tpaddingTop: `${this.paddingTop}px`,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether the user is near the bottom.\n\t\t * If true, then the need-content event will be emitted.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisNearBottom() {\n\t\t\tconst buffer = this.containerHeight * this.bottomBufferRatio\n\t\t\treturn this.scrollPosition + this.containerHeight >= this.rowsHeight - buffer\n\t\t},\n\n\t\t/**\n\t\t * @return {HTMLElement}\n\t\t */\n\t\tcontainer() {\n\t\t\tif (this.containerElement !== null) {\n\t\t\t\treturn this.containerElement\n\t\t\t} else if (this.useWindow) {\n\t\t\t\treturn window\n\t\t\t} else {\n\t\t\t\treturn this.$refs.container\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tisNearBottom(value) {\n\t\t\tif (value) {\n\t\t\t\tthis.$emit('need-content')\n\t\t\t}\n\t\t},\n\n\t\trows() {\n\t\t\t// Re-emit need-content when rows is updated and isNearBottom is still true.\n\t\t\t// If the height of added rows is under `bottomBufferRatio`, `isNearBottom` will still be true so we need more content.\n\t\t\tif (this.isNearBottom) {\n\t\t\t\tthis.$emit('need-content')\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.resizeObserver = new ResizeObserver(entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst cr = entry.contentRect\n\t\t\t\tif (entry.target.classList.contains('vs-container')) {\n\t\t\t\t\tthis.containerHeight = cr.height\n\t\t\t\t}\n\t\t\t\tif (entry.target.classList.contains('vs-rows-container')) {\n\t\t\t\t\tthis.rowsContainerHeight = cr.height\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tif (this.useWindow) {\n\t\t\twindow.addEventListener('resize', this.updateContainerSize)\n\t\t\tthis.containerHeight = window.innerHeight\n\t\t} else {\n\t\t\tthis.resizeObserver.observe(this.container)\n\t\t}\n\n\t\tthis.resizeObserver.observe(this.$refs.rowsContainer)\n\t\tthis.container.addEventListener('scroll', this.updateScrollPosition)\n\t},\n\n\tbeforeDestroy() {\n\t\tif (this.useWindow) {\n\t\t\twindow.removeEventListener('resize', this.updateContainerSize)\n\t\t}\n\n\t\tthis.resizeObserver.disconnect()\n\t\tthis.container.removeEventListener('scroll', this.updateScrollPosition)\n\t},\n\n\tmethods: {\n\t\tupdateScrollPosition() {\n\t\t\tthis.scrollPosition = this.container.scrollY\n\t\t},\n\t\tupdateContainerSize() {\n\t\t\tthis.containerHeight = window.innerHeight\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.vs-container {\n\toverflow-y: scroll;\n\theight: 100%;\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VirtualScrolling.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!./VirtualScrolling.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[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VirtualScrolling.vue?vue&type=style&index=0&id=00c0e180&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!./VirtualScrolling.vue?vue&type=style&index=0&id=00c0e180&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./VirtualScrolling.vue?vue&type=template&id=00c0e180&scoped=true&\"\nimport script from \"./VirtualScrolling.vue?vue&type=script&lang=js&\"\nexport * from \"./VirtualScrolling.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VirtualScrolling.vue?vue&type=style&index=0&id=00c0e180&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 \"00c0e180\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.useWindow && _vm.containerElement === null)?_c('div',{ref:\"container\",staticClass:\"vs-container\"},[_c('div',{ref:\"rowsContainer\",staticClass:\"vs-rows-container\",style:(_vm.rowsContainerStyle)},[_vm._t(\"default\",null,{\"renderedRows\":_vm.visibleRows})],2)]):_c('div',{ref:\"rowsContainer\",staticClass:\"vs-rows-container\",style:(_vm.rowsContainerStyle)},[_vm._t(\"default\",null,{\"renderedRows\":_vm.visibleRows})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon plus-icon\"\n role=\"img\"\n v-bind=\"$attrs\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"PlusIcon\",\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./Plus.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./Plus.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Plus.vue?vue&type=template&id=39b67473&\"\nimport script from \"./Plus.vue?vue&type=script&lang=js&\"\nexport * from \"./Plus.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._b({staticClass:\"material-design-icon plus-icon\",attrs:{\"aria-hidden\":!_vm.title,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon trash-can-icon\"\n role=\"img\"\n v-bind=\"$attrs\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M9,8H11V17H9V8M13,8H15V17H13V8Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"TrashCanIcon\",\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./TrashCan.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./TrashCan.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TrashCan.vue?vue&type=template&id=614a2d89&\"\nimport script from \"./TrashCan.vue?vue&type=script&lang=js&\"\nexport * from \"./TrashCan.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._b({staticClass:\"material-design-icon trash-can-icon\",attrs:{\"aria-hidden\":!_vm.title,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M9,8H11V17H9V8M13,8H15V17H13V8Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon download-outline-icon\"\n role=\"img\"\n v-bind=\"$attrs\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M13,5V11H14.17L12,13.17L9.83,11H11V5H13M15,3H9V9H5L12,16L19,9H15V3M19,18H5V20H19V18Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"DownloadOutlineIcon\",\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./DownloadOutline.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./DownloadOutline.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DownloadOutline.vue?vue&type=template&id=391e3bc7&\"\nimport script from \"./DownloadOutline.vue?vue&type=script&lang=js&\"\nexport * from \"./DownloadOutline.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._b({staticClass:\"material-design-icon download-outline-icon\",attrs:{\"aria-hidden\":!_vm.title,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M13,5V11H14.17L12,13.17L9.83,11H11V5H13M15,3H9V9H5L12,16L19,9H15V3M19,18H5V20H19V18Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span :aria-hidden=\"!title\"\n :aria-label=\"title\"\n class=\"material-design-icon loading-icon\"\n role=\"img\"\n v-bind=\"$attrs\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"LoadingIcon\",\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./Loading.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./Loading.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Loading.vue?vue&type=template&id=6c8b5c1e&\"\nimport script from \"./Loading.vue?vue&type=script&lang=js&\"\nexport * from \"./Loading.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._b({staticClass:\"material-design-icon loading-icon\",attrs:{\"aria-hidden\":!_vm.title,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 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<div class=\"photos-header\">\n\t\t<Actions v-if=\"selection.length === 0\" :menu-title=\"t('photos', 'Add')\" :primary=\"true\">\n\t\t\t<Plus slot=\"icon\" />\n\t\t\t<!-- TODO: uncomment when implementing upload -->\n\t\t\t<!-- <ActionButton :close-after-click=\"true\" :title=\"t('photos', 'Upload media')\" @click=\"openUploader\">\n\t\t\t\t<FileUpload slot=\"icon\" />\n\t\t\t</ActionButton> -->\n\t\t\t<!-- TODO: uncomment when implementing albums -->\n\t\t\t<!-- <ActionButton :close-after-click=\"true\" :title=\"t('photos', 'Create new album')\" @click=\"createNewAlbum\">\n\t\t\t\t<PlusBoxMultiple slot=\"icon\" />\n\t\t\t</ActionButton> -->\n\t\t</Actions>\n\n\t\t<template v-else>\n\t\t\t<!-- TODO: uncomment when implementing albums -->\n\t\t\t<!-- <Actions :force-title=\"true\" :menu-title=\"t('photos', 'Add to album')\" :primary=\"true\">\n\t\t\t\t<ActionButton :close-after-click=\"true\"\n\t\t\t\t\t:primary=\"true\"\n\t\t\t\t\t:title=\"t('photos', 'Add to album')\"\n\t\t\t\t\t@click=\"openAlbumPicker\">\n\t\t\t\t\t<Plus slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t</Actions> -->\n\t\t\t<Actions :force-menu=\"true\">\n\t\t\t\t<ActionButton :close-after-click=\"true\" :title=\"t('photos', 'Download')\" @click=\"downloadSelection\">\n\t\t\t\t\t<DownloadOutline slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t\t<ActionButton v-if=\"shouldFavorite\"\n\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t:title=\"t('photos', 'Favorite')\"\n\t\t\t\t\t@click=\"favoriteSelection\">\n\t\t\t\t\t<Star slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t\t<ActionButton v-else\n\t\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t\t:title=\"t('photos', 'Remove from favorites')\"\n\t\t\t\t\t@click=\"unFavoriteSelection\">\n\t\t\t\t\t<Star slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t\t<ActionButton :close-after-click=\"true\" :title=\"t('photos', 'Delete')\" @click=\"deleteSelection\">\n\t\t\t\t\t<TrashCan slot=\"icon\" />\n\t\t\t\t</ActionButton>\n\t\t\t</Actions>\n\t\t</template>\n\n\t\t<Loading v-if=\"loadingCount > 0\" class=\"loading-icon\" />\n\t</div>\n</template>\n<script>\n\nimport { mapActions } from 'vuex'\n\nimport Plus from 'vue-material-design-icons/Plus'\nimport TrashCan from 'vue-material-design-icons/TrashCan.vue'\n// import PlusBoxMultiple from 'vue-material-design-icons/PlusBoxMultiple'\n// import FileUpload from 'vue-material-design-icons/FileUpload.vue'\nimport Star from 'vue-material-design-icons/Star.vue'\nimport DownloadOutline from 'vue-material-design-icons/DownloadOutline.vue'\nimport Loading from 'vue-material-design-icons/Loading'\n\nimport { Actions, ActionButton } from '@nextcloud/vue'\n\nimport logger from '../services/logger.js'\n\nexport default {\n\tname: 'PhotosHeader',\n\tcomponents: {\n\t\tActions,\n\t\tActionButton,\n\t\tLoading,\n\t\tPlus,\n\t\tTrashCan,\n\t\t// FileUpload,\n\t\t// PlusBoxMultiple,\n\t\tStar,\n\t\tDownloadOutline,\n\t},\n\tprops: {\n\t\tselection: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloadingCount: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @type {boolean} */\n\t\tshouldFavorite() {\n\t\t\t// Favorite all selection if at least one file is not on the favorites.\n\t\t\treturn this.selection.some((fileId) => this.$store.state.files.files[fileId].favorite === 0)\n\t\t},\n\t},\n\n\tmethods: {\n\t\t...mapActions(['deleteFiles', 'toggleFavoriteForFiles', 'downloadFiles']),\n\n\t\t// TODO: uncomment when implementing upload\n\t\t// openUploader() {\n\n\t\t// },\n\n\t\t// TODO: uncomment when implementing albums\n\t\t// createNewAlbum() {\n\n\t\t// },\n\t\t// openAlbumPicker() {\n\n\t\t// },\n\t\t// async moveSelectionToAlbum() {\n\n\t\t// },\n\n\t\tasync favoriteSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.toggleFavoriteForFiles({ fileIds: this.selection, favoriteState: true })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync unFavoriteSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.toggleFavoriteForFiles({ fileIds: this.selection, favoriteState: false })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync deleteSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tconst items = this.selection\n\t\t\t\tthis.$emit('uncheck-items', items)\n\t\t\t\tawait this.deleteFiles(items)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\n\t\tasync downloadSelection() {\n\t\t\ttry {\n\t\t\t\tthis.loadingCount++\n\t\t\t\tawait this.downloadFiles(this.selection)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loadingCount--\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.photos-header {\n\tdisplay: flex;\n\tmargin: 16px 0;\n\tpadding-left: 32px;\n\n\t& > * {\n\t\tmargin: 0 16px;\n\t}\n\n\t.loading-icon::v-deep svg {\n\t\tanimation: rotate var(--animation-duration, 0.8s) linear infinite;\n\t\tcolor: var(--color-loading-dark);\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!./PhotosHeader.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!./PhotosHeader.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[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PhotosHeader.vue?vue&type=style&index=0&id=ef246676&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!./PhotosHeader.vue?vue&type=style&index=0&id=ef246676&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./PhotosHeader.vue?vue&type=template&id=ef246676&scoped=true&\"\nimport script from \"./PhotosHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./PhotosHeader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PhotosHeader.vue?vue&type=style&index=0&id=ef246676&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 \"ef246676\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"photos-header\"},[(_vm.selection.length === 0)?_c('Actions',{attrs:{\"menu-title\":_vm.t('photos', 'Add'),\"primary\":true}},[_c('Plus',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1):[_c('Actions',{attrs:{\"force-menu\":true}},[_c('ActionButton',{attrs:{\"close-after-click\":true,\"title\":_vm.t('photos', 'Download')},on:{\"click\":_vm.downloadSelection}},[_c('DownloadOutline',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1),_vm._v(\" \"),(_vm.shouldFavorite)?_c('ActionButton',{attrs:{\"close-after-click\":true,\"title\":_vm.t('photos', 'Favorite')},on:{\"click\":_vm.favoriteSelection}},[_c('Star',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1):_c('ActionButton',{attrs:{\"close-after-click\":true,\"title\":_vm.t('photos', 'Remove from favorites')},on:{\"click\":_vm.unFavoriteSelection}},[_c('Star',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1),_vm._v(\" \"),_c('ActionButton',{attrs:{\"close-after-click\":true,\"title\":_vm.t('photos', 'Delete')},on:{\"click\":_vm.deleteSelection}},[_c('TrashCan',{attrs:{\"slot\":\"icon\"},slot:\"icon\"})],1)],1)],_vm._v(\" \"),(_vm.loadingCount > 0)?_c('Loading',{staticClass:\"loading-icon\"}):_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 Corentin Mors\n -\n - @license AGPL-3.0-or-later\n -\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"loader\">\n\t\t<slot name=\"icon\">\n\t\t\t<span class=\"icon-loading\" />\n\t\t</slot>\n\t</div>\n</template>\n\n<script>\nexport default {\n\tname: 'Loader',\n}\n</script>\n\n<style lang=\"scss\">\n.loader {\n\tdisplay: grid;\n\theight: 60px;\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.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!./Loader.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[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=style&index=0&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!./Loader.vue?vue&type=style&index=0&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Loader.vue?vue&type=template&id=7bbb2dd6&\"\nimport script from \"./Loader.vue?vue&type=script&lang=js&\"\nexport * from \"./Loader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Loader.vue?vue&type=style&index=0&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 null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"loader\"},[_vm._t(\"icon\",function(){return [_c('span',{staticClass:\"icon-loading\"})]})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<!-- Errors handlers-->\n\t<EmptyContent v-if=\"error === 404\" illustration-name=\"folder\">\n\t\t{{ t('photos', 'This folder does not exist') }}\n\t</EmptyContent>\n\t<EmptyContent v-else-if=\"error\">\n\t\t{{ t('photos', 'An error occurred') }}\n\t</EmptyContent>\n\n\t<!-- Folder content -->\n\t<div v-else>\n\t\t<Navigation v-if=\"isEmpty\"\n\t\t\tkey=\"navigation\"\n\t\t\t:basename=\"path\"\n\t\t\t:filename=\"'/'\"\n\t\t\t:root-title=\"rootTitle\" />\n\n\t\t<div v-else class=\"photos-container\">\n\t\t\t<PhotosHeader :selection=\"selection\" @uncheck-items=\"onUncheckItems\" />\n\n\t\t\t<Loader v-if=\"nbFetchedFiles === 0 && loading\" />\n\n\t\t\t<TiledLayout ref=\"tiledLayout\" :items=\"itemsList\">\n\t\t\t\t<VirtualScrolling slot-scope=\"{rows}\"\n\t\t\t\t\t:use-window=\"true\"\n\t\t\t\t\t:rows=\"rows\"\n\t\t\t\t\t@need-content=\"getContent\">\n\t\t\t\t\t<TiledRows slot-scope=\"{renderedRows}\" :rows=\"renderedRows\">\n\t\t\t\t\t\t<template slot-scope=\"{row, item}\">\n\t\t\t\t\t\t\t<h3 v-if=\"item.sectionHeader\" class=\"section-header\">\n\t\t\t\t\t\t\t\t<!-- TODO: uncomment to activate section selection -->\n\t\t\t\t\t\t\t\t<!-- <CheckboxRadioSwitch v-if=\"allowSelection\"\n\t\t\t\t\t\t\t\tclass=\"selection-checkbox\"\n\t\t\t\t\t\t\t\t:checked=\"selectedSections[item.id]\"\n\t\t\t\t\t\t\t\t@update:checked=\"(value) => onSectionToggle(item.id)\"> -->\n\t\t\t\t\t\t\t\t<b>{{ item.id | dateMonth }}</b>\n\t\t\t\t\t\t\t\t{{ item.id | dateYear }}\n\t\t\t\t\t\t\t\t<!-- </CheckboxRadioSwitch> -->\n\t\t\t\t\t\t\t</h3>\n\n\t\t\t\t\t\t\t<File v-else\n\t\t\t\t\t\t\t\t:item=\"files[item.id]\"\n\t\t\t\t\t\t\t\t:allow-selection=\"true\"\n\t\t\t\t\t\t\t\t:selected=\"selectedItems[item.id] === true\"\n\t\t\t\t\t\t\t\t:visibility=\"row.visibility\"\n\t\t\t\t\t\t\t\t:semaphore=\"semaphore\"\n\t\t\t\t\t\t\t\t@click=\"openViewer\"\n\t\t\t\t\t\t\t\t@select-toggled=\"onItemSelectToggle\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</TiledRows>\n\t\t\t\t</VirtualScrolling>\n\t\t\t</TiledLayout>\n\n\t\t\t<Loader v-if=\"loading\" />\n\n\t\t\t<EmptyContent v-if=\"isEmpty\" illustration-name=\"empty\">\n\t\t\t\t{{ t('photos', 'No photos in here') }}\n\t\t\t</EmptyContent>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\n\nimport moment from '@nextcloud/moment'\n\nimport cancelableRequest from '../utils/CancelableRequest.js'\n\nimport getPhotos from '../services/PhotoSearch.js'\nimport { allMimes } from '../services/AllowedMimes.js'\nimport logger from '../services/logger.js'\n\nimport TiledLayout from '../components/TiledLayout.vue'\nimport TiledRows from '../components/TiledRows.vue'\nimport VirtualScrolling from '../components/VirtualScrolling.vue'\nimport PhotosHeader from '../components/PhotosHeader.vue'\nimport EmptyContent from '../components/EmptyContent.vue'\nimport File from '../components/File.vue'\nimport Navigation from '../components/Navigation.vue'\nimport Loader from '../components/Loader.vue'\nimport SemaphoreWithPriority from '../utils/semaphoreWithPriority.js'\n\nexport default {\n\tname: 'Timeline',\n\tcomponents: {\n\t\tEmptyContent,\n\t\tNavigation,\n\t\tTiledLayout,\n\t\tTiledRows,\n\t\tVirtualScrolling,\n\t\tPhotosHeader,\n\t\tLoader,\n\t\tFile,\n\t},\n\n\tfilters: {\n\t\t/**\n\t\t * @param {string} date - In the following format: YYYYMM\n\t\t */\n\t\tdateMonth(date) {\n\t\t\treturn moment(date, 'YYYYMM').format('MMMM')\n\t\t},\n\t\t/**\n\t\t * @param {string} date - In the following format: YYYYMM\n\t\t */\n\t\tdateYear(date) {\n\t\t\treturn moment(date, 'YYYYMM').format('YYYY')\n\t\t},\n\t},\n\n\tbeforeRouteLeave(from, to, next) {\n\t\t// cancel any pending requests\n\t\tif (this.cancelRequest) {\n\t\t\tthis.cancelRequest('Changed view')\n\t\t}\n\t\tthis.resetState()\n\t\treturn next()\n\t},\n\n\tprops: {\n\t\tonlyFavorites: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tmimesType: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => allMimes,\n\t\t},\n\t\trootTitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tonThisDay: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tcancelRequest: null,\n\t\t\tdone: false,\n\t\t\terror: null,\n\t\t\tselectedItems: {},\n\t\t\tnbFetchedFiles: 0,\n\t\t\tsemaphore: new SemaphoreWithPriority(30),\n\t\t\tsemaphoreSymbol: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// global lists\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t]),\n\n\t\t/**\n\t\t * List of loaded medias.\n\t\t *\n\t\t * @return {import('../services/TiledLayout').TiledItem[]}\n\t\t */\n\t\tfileList() {\n\t\t\tconst today = moment().format('DDMM')\n\t\t\treturn Object.values(this.files)\n\t\t\t\t.filter(file => !this.onlyFavorites || file.favorite === 1)\n\t\t\t\t.filter(file => this.mimesType.includes(file.mime))\n\t\t\t\t.filter(file => !this.onThisDay || file.day === today)\n\t\t\t\t.map(file => ({\n\t\t\t\t\tid: file.fileid,\n\t\t\t\t\twidth: file.fileMetadataSizeParsed.width,\n\t\t\t\t\theight: file.fileMetadataSizeParsed.height,\n\t\t\t\t\tratio: file.fileMetadataSizeParsed.width / file.fileMetadataSizeParsed.height,\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {Object<string, import('../services/TiledLayout').TiledItem[]>}\n\t\t */\n\t\tfileListByMonth() {\n\t\t\tconst itemsByMonth = {}\n\t\t\tfor (const item of this.fileList) {\n\t\t\t\titemsByMonth[this.files[item.id].month] = itemsByMonth[this.files[item.id].month] ?? []\n\t\t\t\titemsByMonth[this.files[item.id].month].push(item)\n\t\t\t}\n\t\t\treturn itemsByMonth\n\t\t},\n\n\t\t/**\n\t\t * @return {import('../services/TiledLayout').TiledItem[]}\n\t\t */\n\t\titemsList() {\n\t\t\tconst fileListByMonth = this.fileListByMonth\n\t\t\treturn Object\n\t\t\t\t.keys(fileListByMonth)\n\t\t\t\t.sort((date1, date2) => date1 > date2 ? -1 : 1)\n\t\t\t\t.flatMap((month) => {\n\t\t\t\t\t// Insert month item in the list.\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: month,\n\t\t\t\t\t\t\tsectionHeader: true,\n\t\t\t\t\t\t\theight: 75,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...fileListByMonth[month].sort((item1, item2) => this.files[item1.id].timestamp > this.files[item2.id].timestamp ? -1 : 1),\n\t\t\t\t\t]\n\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Is current folder empty?\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisEmpty() {\n\t\t\treturn this.fileList.length === 0\n\t\t},\n\n\t\t/**\n\t\t * Is current folder empty?\n\t\t *\n\t\t * @type {Object<string, boolean>}\n\t\t */\n\t\tselectedSections() {\n\t\t\treturn Object.entries(this.fileListByMonth)\n\t\t\t\t.reduce((selectedSections, [month, items]) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...selectedSections,\n\t\t\t\t\t\t[month]: !items.some((item) => this.selectedItems[item.id] !== true),\n\t\t\t\t\t}\n\t\t\t\t}, {})\n\t\t},\n\n\t\t/** @return {import('../services/TiledLayout').TiledItem[]} */\n\t\tselection() {\n\t\t\treturn Object.keys(this.selectedItems).filter(fileId => this.selectedItems[fileId])\n\t\t},\n\t},\n\n\twatch: {\n\t\t$route(from, to) {\n\t\t\t// cancel any pending requests\n\t\t\tif (this.cancelRequest) {\n\t\t\t\tthis.cancelRequest('Changed view')\n\t\t\t}\n\t\t\tthis.resetState()\n\t\t\tthis.getContent()\n\t\t},\n\t\tasync onThisDay() {\n\t\t\t// reset component\n\t\t\tthis.resetState()\n\t\t\tthis.getContent()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.getContent()\n\t},\n\n\tbeforeDestroy() {\n\t\t// cancel any pending requests\n\t\tif (this.cancelRequest) {\n\t\t\tthis.cancelRequest('Changed view')\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Return next batch of data depending on global offset\n\t\t */\n\t\tasync getContent() {\n\t\t\tif (this.done || this.loading) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.semaphoreSymbol = await this.semaphore.acquire(() => 0, 'timeline')\n\n\t\t\t\tconst { request, cancel } = cancelableRequest(getPhotos)\n\t\t\t\tthis.cancelRequest = cancel\n\n\t\t\t\tconst numberOfImagesPerBatch = 1000\n\n\t\t\t\t// Load next batch of images\n\t\t\t\tconst files = await request(this.onlyFavorites, {\n\t\t\t\t\t// We reuse already fetched files in the store when moving from one tab to another, but to make sure that we have all the files, we keep an internal counter (nbFetchedFiles).\n\t\t\t\t\t// Some files will be fetched twice, but we have less loading time when switching between tabs.\n\t\t\t\t\tfirstResult: this.nbFetchedFiles,\n\t\t\t\t\tnbResults: numberOfImagesPerBatch,\n\t\t\t\t\tmimesType: this.mimesType,\n\t\t\t\t\tonThisDay: this.onThisDay,\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 (files.length !== numberOfImagesPerBatch) {\n\t\t\t\t\tthis.done = true\n\t\t\t\t}\n\n\t\t\t\tthis.nbFetchedFiles += files.length\n\n\t\t\t\tthis.$store.dispatch('appendFiles', files)\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tif (error.response.status === 404) {\n\t\t\t\t\t\tthis.error = 404\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.$router.push({ name: this.$route.name })\n\t\t\t\t\t\t}, 3000)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error = error\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tlogger.error('Error fetching timeline', error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t\tthis.cancelRequest = null\n\t\t\t\tawait this.semaphore.release(this.semaphoreSymbol)\n\t\t\t\tthis.semaphoreSymbol = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Reset this component data to a pristine state\n\t\t */\n\t\tresetState() {\n\t\t\tthis.done = false\n\t\t\tthis.error = null\n\t\t\tthis.lastSection = ''\n\t\t\tthis.loading = false\n\t\t\tthis.nbFetchedFiles = 0\n\t\t\tthis.$refs.tiledLayout?.$el.scrollTo(0, 0)\n\t\t},\n\n\t\tonItemSelectToggle({ id, value }) {\n\t\t\tthis.$set(this.selectedItems, id, value)\n\t\t},\n\n\t\t// onSectionToggle(sectionId) {\n\t\t// const shouldCheck = !this.selectedSections[sectionId]\n\t\t// this.fileListByMonth[sectionId].forEach(item => this.$set(this.selectedItems, item.id, shouldCheck))\n\t\t// },\n\n\t\tonUncheckItems(itemIds) {\n\t\t\titemIds.forEach(itemId => this.$set(this.selectedItems, itemId, false))\n\t\t},\n\n\t\topenViewer(itemId) {\n\t\t\tconst item = this.files[itemId]\n\t\t\tOCA.Viewer.open({\n\t\t\t\tpath: item.filename,\n\t\t\t\tlist: this.itemsList.filter(item => !item.sectionHeader).map(item => this.files[item.id]),\n\t\t\t\tloadMore: item.loadMore ? async () => await item.loadMore(true) : () => [],\n\t\t\t\tcanLoop: item.canLoop,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n\t.section-header {\n\t\tpadding: 32px 0 16px 2px;\n\t}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Timeline.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!./Timeline.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[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Timeline.vue?vue&type=style&index=0&id=f605719e&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!./Timeline.vue?vue&type=style&index=0&id=f605719e&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Timeline.vue?vue&type=template&id=f605719e&scoped=true&\"\nimport script from \"./Timeline.vue?vue&type=script&lang=js&\"\nexport * from \"./Timeline.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Timeline.vue?vue&type=style&index=0&id=f605719e&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 \"f605719e\",\n null\n \n)\n\nexport default component.exports"],"names":["props","___CSS_LOADER_EXPORT___","push","module","id","onlyFavorites","options","firstResult","nbResults","mimesType","allMimes","onThisDay","prefixPath","getCurrentUser","uid","orMime","reduce","str","mime","eqFavorites","Array","fill","map","_","years","start","moment","Date","now","startOf","subtract","end","endOf","add","format","join","Object","assign","method","headers","data","deep","details","client","response","genFileInfo","filename","replace","computeRowWidth","items","item","ratio","sum","itemWidth","computeRowHeight","containerWidth","isLastRow","length","sectionHeader","height","rowHeight","itemRatio","width","Math","min","BASE_ROW_HEIGHT","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_h","_vm","_c","_l","row","key","staticClass","style","_t","rows","rowNumber","currentItem","rowItems","this","$createElement","_self","ref","attrs","useWindow","containerElement","visibleRows","name","title","type","String","fillColor","default","size","Number","_b","on","$event","$emit","$attrs","_v","_s","_e","selection","t","slot","downloadSelection","favoriteSelection","unFavoriteSelection","deleteSelection","loadingCount","error","path","rootTitle","onUncheckItems","nbFetchedFiles","loading","itemsList","scopedSlots","_u","fn","getContent","renderedRows","_f","files","selectedItems","visibility","semaphore","openViewer","onItemSelectToggle"],"sourceRoot":""}