photos/js/photos-src_services_DavRequ...

1 line
30 KiB
XML

{"version":3,"file":"photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js?v=0dc8d0d25f2781672fee","mappings":"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","sources":["webpack:///photos/src/services/DavRequest.js","webpack:///photos/src/utils/CancelableRequest.js","webpack:///photos/src/components/File.vue?vue&type=style&index=0&id=67e992e4&lang=scss&scoped=true&","webpack:///photos/src/components/File.vue?vue&type=template&id=67e992e4&scoped=true&","webpack:///photos/src/components/File.vue","webpack:///photos/src/components/File.vue?vue&type=script&lang=js&","webpack://photos/./src/components/File.vue?c765","webpack://photos/./src/components/File.vue?f552"],"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:realpath />\n\t<nc:has-preview />\n\t<nc:file-metadata-size />\n\t<nc:face-detections />\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","/**\n * @copyright Copyright (c) 2019 Marco Ambrosini <marcoambrosini@pm.me>\n *\n * @author Marco Ambrosini <marcoambrosini@pm.me>\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 axios from '@nextcloud/axios'\n/**\n * Create a cancel token\n *\n * @return {CancelTokenSource}\n */\nconst createCancelToken = () => axios.CancelToken.source()\n\n/**\n * Creates a cancelable axios 'request object'.\n *\n * @param {Function} request the axios promise request\n * @return {object}\n */\nconst CancelableRequest = function(request) {\n\t/**\n\t * Generate an axios cancel token\n\t */\n\tconst cancelToken = createCancelToken()\n\n\t/**\n\t * Execute the request\n\t *\n\t * @param {string} url the url to send the request to\n\t * @param {object} [options] optional config for the request\n\t */\n\tconst fetch = async function(url, options) {\n\t\treturn request(\n\t\t\turl,\n\t\t\tObject.assign({ cancelToken: cancelToken.token }, options)\n\t\t)\n\t}\n\n\treturn {\n\t\trequest: fetch,\n\t\tcancel: cancelToken.cancel,\n\t}\n}\n\nexport default CancelableRequest\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, \".file-container[data-v-67e992e4]{background:var(--color-primary-light);position:relative;height:100%;width:100%;border:2px solid var(--color-main-background);box-sizing:border-box}.file-container.selected[data-v-67e992e4]::after,.file-container[data-v-67e992e4]:focus-within::after{position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;content:\\\"\\\";outline:var(--color-primary) solid 4px;outline-offset:-4px;pointer-events:none}.file-container .file[data-v-67e992e4]{width:100%;height:100%;box-sizing:border-box;outline:none}.file-container .file__images[data-v-67e992e4]{display:contents}.file-container .file__images .video-icon[data-v-67e992e4]{position:absolute;top:0px;right:0px;width:100%;height:100%;z-index:1;opacity:.8}.file-container .file__images .video-icon[data-v-67e992e4] .material-design-icon__svg{fill:var(--color-main-background)}.file-container .file__images img[data-v-67e992e4]{width:100%;height:100%;object-fit:cover;position:absolute;color:transparent}.file-container .file__images .loading-overlay[data-v-67e992e4]{position:absolute;height:100%;width:100%;display:flex;align-content:center;align-items:center;justify-content:center}.file-container .file__images .loading-overlay svg[data-v-67e992e4]{width:70%;height:70%}.file-container .file__hidden-description[data-v-67e992e4]{position:absolute;left:-10000px;top:-10000px;width:1px;height:1px;overflow:hidden}.file-container .file__hidden-description.show[data-v-67e992e4]{position:initial;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}.file-container:hover .selection-checkbox[data-v-67e992e4],.file-container.selected .selection-checkbox[data-v-67e992e4],.file-container:focus-within .selection-checkbox[data-v-67e992e4]{display:flex}.file-container:hover .favorite-state[data-v-67e992e4],.file-container.selected .favorite-state[data-v-67e992e4],.file-container:focus-within .favorite-state[data-v-67e992e4]{display:none}.file-container .selection-checkbox[data-v-67e992e4]{display:none;position:absolute;top:8px;right:min(22px,50% - 7px);z-index:1;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-container .selection-checkbox[data-v-67e992e4] .checkbox-radio-switch__label{padding:10px;box-sizing:border-box}.file-container .selection-checkbox[data-v-67e992e4] .checkbox-radio-switch__label::after{content:\\\"\\\";background:var(--color-primary-light);width:16px;height:16px;position:absolute;left:1px;z-index:-1}.file-container .selection-checkbox[data-v-67e992e4] .checkbox-radio-switch__label .checkbox-radio-switch__icon{margin:0}.file-container .selection-checkbox .input-label[data-v-67e992e4]{position:fixed;z-index:-1;top:-5000px;left:-5000px}.file-container .favorite-state[data-v-67e992e4]{position:absolute;top:2px;right:min(2px,50% - 7px)}.file-container .favorite-state[data-v-67e992e4] .material-design-icon__svg{fill:#fc0}.file-container .favorite-state[data-v-67e992e4] .material-design-icon__svg path{stroke:var(--color-primary-light);stroke-width:1px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/File.vue\"],\"names\":[],\"mappings\":\"AAiOA,iCACC,qCAAA,CACA,iBAAA,CACA,WAAA,CACA,UAAA,CACA,6CAAA,CACA,qBAAA,CAIC,sGACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CACA,sCAAA,CACA,mBAAA,CACA,mBAAA,CAIF,uCACC,UAAA,CACA,WAAA,CACA,qBAAA,CACA,YAAA,CAEA,+CACC,gBAAA,CAEA,2DACC,iBAAA,CACA,OAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CACA,UAAA,CAEA,uFACC,iCAAA,CAIF,mDACC,UAAA,CACA,WAAA,CACA,gBAAA,CACA,iBAAA,CACA,iBAAA,CAGD,gEACC,iBAAA,CACA,WAAA,CACA,UAAA,CACA,YAAA,CACA,oBAAA,CACA,kBAAA,CACA,sBAAA,CAEA,oEACC,SAAA,CACA,UAAA,CAKH,2DACC,iBAAA,CACA,aAAA,CACA,YAAA,CACA,SAAA,CACA,UAAA,CACA,eAAA,CAEA,gEACC,gBAAA,CACA,yBAAA,CAAA,sBAAA,CAAA,iBAAA,CACA,0BAAA,CAAA,uBAAA,CAAA,kBAAA,CAOF,2LACC,YAAA,CAGD,+KACC,YAAA,CAIF,qDACC,YAAA,CACA,iBAAA,CACA,OAAA,CAEA,yBAAA,CACA,SAAA,CACA,yBAAA,CAAA,sBAAA,CAAA,iBAAA,CAGA,oFACC,YAAA,CACA,qBAAA,CAGA,2FACC,UAAA,CACA,qCAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,QAAA,CACA,UAAA,CAGD,iHACC,QAAA,CAIF,kEACC,cAAA,CACA,UAAA,CACA,WAAA,CACA,YAAA,CAIF,iDACC,iBAAA,CACA,OAAA,CAEA,wBAAA,CAEA,6EACC,SAAA,CAEA,kFACC,iCAAA,CACA,gBAAA\",\"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.file-container {\\n\\tbackground: var(--color-primary-light);\\n\\tposition: relative;\\n\\theight: 100%;\\n\\twidth: 100%;\\n\\tborder: 2px solid var(--color-main-background); // Use border so create a separation between images.\\n\\tbox-sizing: border-box;\\n\\n\\t// Selection border.\\n\\t&.selected, &:focus-within {\\n\\t\\t&::after {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\ttop: 0;\\n\\t\\t\\tleft: 0;\\n\\t\\t\\tz-index: 2;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: 100%;\\n\\t\\t\\tcontent: '';\\n\\t\\t\\toutline: var(--color-primary) solid 4px;\\n\\t\\t\\toutline-offset: -4px;\\n\\t\\t\\tpointer-events: none;\\n\\t\\t}\\n\\t}\\n\\n\\t.file {\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t\\tbox-sizing: border-box;\\n\\t\\toutline: none; // Override global focus state.\\n\\n\\t\\t&__images {\\n\\t\\t\\tdisplay: contents;\\n\\n\\t\\t\\t.video-icon {\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\ttop: 0px;\\n\\t\\t\\t\\tright: 0px;\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t\\tz-index: 1;\\n\\t\\t\\t\\topacity: 0.8;\\n\\n\\t\\t\\t\\t::v-deep .material-design-icon__svg {\\n\\t\\t\\t\\t\\tfill: var(--color-main-background);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\timg {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t\\tobject-fit: cover;\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tcolor: transparent; /// Hide alt='' text when loading.\\n\\t\\t\\t}\\n\\n\\t\\t\\t.loading-overlay {\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-content: center;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t\\tjustify-content: center;\\n\\n\\t\\t\\t\\tsvg {\\n\\t\\t\\t\\t\\twidth: 70%;\\n\\t\\t\\t\\t\\theight: 70%;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&__hidden-description {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tleft: -10000px;\\n\\t\\t\\ttop: -10000px;\\n\\t\\t\\twidth: 1px;\\n\\t\\t\\theight: 1px;\\n\\t\\t\\toverflow: hidden;\\n\\n\\t\\t\\t&.show {\\n\\t\\t\\t\\tposition: initial;\\n\\t\\t\\t\\twidth: fit-content;\\n\\t\\t\\t\\theight: fit-content;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Reveal checkbox on hover.\\n\\t&:hover, &.selected, &:focus-within {\\n\\t\\t.selection-checkbox {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\n\\t\\t.favorite-state {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n\\n\\t.selection-checkbox {\\n\\t\\tdisplay: none;\\n\\t\\tposition: absolute;\\n\\t\\ttop: 8px;\\n\\t\\t// Fancy calculation to render the checkbox in the middle of narrow images.\\n\\t\\tright: min(22px, calc(50% - 7px));\\n\\t\\tz-index: 1;\\n\\t\\twidth: fit-content;\\n\\n\\t\\t// Make the checkbox background round on hover.\\n\\t\\t::v-deep .checkbox-radio-switch__label {\\n\\t\\t\\tpadding: 10px;\\n\\t\\t\\tbox-sizing: border-box;\\n\\n\\t\\t\\t// Add a background to the checkbox so we do not see the image through it.\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tcontent: '';\\n\\t\\t\\t\\tbackground: var(--color-primary-light);\\n\\t\\t\\t\\twidth: 16px;\\n\\t\\t\\t\\theight: 16px;\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tleft: 1px;\\n\\t\\t\\t\\tz-index: -1;\\n\\t\\t\\t}\\n\\n\\t\\t\\t.checkbox-radio-switch__icon {\\n\\t\\t\\t\\tmargin: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.input-label {\\n\\t\\t\\tposition: fixed;\\n\\t\\t\\tz-index: -1;\\n\\t\\t\\ttop: -5000px;\\n\\t\\t\\tleft: -5000px;\\n\\t\\t}\\n\\t}\\n\\n\\t.favorite-state {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 2px;\\n\\t\\t// Fancy calculation to render the start in the middle of narrow images.\\n\\t\\tright: min(2px, calc(50% - 7px));\\n\\n\\t\\t::v-deep .material-design-icon__svg {\\n\\t\\t\\tfill: #FC0;\\n\\n\\t\\t\\tpath {\\n\\t\\t\\t\\tstroke: var(--color-primary-light);\\n\\t\\t\\t\\tstroke-width: 1px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\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 _c('div',{staticClass:\"file-container\",class:{selected: _vm.selected}},[_c('a',{staticClass:\"file\",attrs:{\"href\":_vm.davPath,\"aria-label\":_vm.ariaLabel},on:{\"click\":function($event){$event.preventDefault();return _vm.emitClick.apply(null, arguments)}}},[_c('div',{staticClass:\"file__images\"},[(_vm.file.mime.includes('video'))?_c('VideoIcon',{staticClass:\"video-icon\",attrs:{\"size\":64}}):_vm._e(),_vm._v(\" \"),(_vm.visibility !== 'none' && _vm.canLoad && !_vm.error)?_c('img',{key:((_vm.file.basename) + \"-near\"),ref:\"imgNear\",attrs:{\"src\":_vm.srcNear,\"alt\":_vm.file.basename,\"aria-describedby\":_vm.ariaDescription},on:{\"load\":_vm.onLoad,\"error\":_vm.onError}}):_vm._e(),_vm._v(\" \"),(_vm.visibility === 'visible' && _vm.canLoad && !_vm.error)?_c('img',{key:((_vm.file.basename) + \"-visible\"),ref:\"imgVisible\",attrs:{\"src\":_vm.srcVisible,\"alt\":_vm.file.basename,\"aria-describedby\":_vm.ariaDescription},on:{\"load\":_vm.onLoad,\"error\":_vm.onError}}):_vm._e()],1),_vm._v(\" \"),_c('p',{staticClass:\"file__hidden-description\",class:{show: _vm.error},attrs:{\"id\":_vm.ariaDescription}},[_vm._v(_vm._s(_vm.file.basename))])]),_vm._v(\" \"),(_vm.allowSelection)?_c('CheckboxRadioSwitch',{staticClass:\"selection-checkbox\",attrs:{\"checked\":_vm.selected},on:{\"update:checked\":_vm.onToggle}},[_c('span',{staticClass:\"input-label\"},[_vm._v(_vm._s(_vm.t('photos', 'Select image {imageName}', {imageName: _vm.file.basename})))])]):_vm._e(),_vm._v(\" \"),(_vm.file.favorite === 1)?_c('Star',{staticClass:\"favorite-state\",attrs:{\"aria-label\":_vm.t('photos', 'The file is in the favorites')}}):_vm._e()],1)}\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=\"file-container\"\n\t\t:class=\"{selected}\">\n\t\t<a class=\"file\"\n\t\t\t:href=\"davPath\"\n\t\t\t:aria-label=\"ariaLabel\"\n\t\t\t@click.prevent=\"emitClick\">\n\n\t\t\t<!-- image and loading placeholder -->\n\t\t\t<div class=\"file__images\">\n\t\t\t\t<VideoIcon v-if=\"file.mime.includes('video')\" class=\"video-icon\" :size=\"64\" />\n\n\t\t\t\t<img v-if=\"visibility !== 'none' && canLoad && !error\"\n\t\t\t\t\tref=\"imgNear\"\n\t\t\t\t\t:key=\"`${file.basename}-near`\"\n\t\t\t\t\t:src=\"srcNear\"\n\t\t\t\t\t:alt=\"file.basename\"\n\t\t\t\t\t:aria-describedby=\"ariaDescription\"\n\t\t\t\t\t@load=\"onLoad\"\n\t\t\t\t\t@error=\"onError\">\n\n\t\t\t\t<img v-if=\"visibility === 'visible' && canLoad && !error\"\n\t\t\t\t\tref=\"imgVisible\"\n\t\t\t\t\t:key=\"`${file.basename}-visible`\"\n\t\t\t\t\t:src=\"srcVisible\"\n\t\t\t\t\t:alt=\"file.basename\"\n\t\t\t\t\t:aria-describedby=\"ariaDescription\"\n\t\t\t\t\t@load=\"onLoad\"\n\t\t\t\t\t@error=\"onError\">\n\t\t\t</div>\n\n\t\t\t<!-- image description -->\n\t\t\t<p :id=\"ariaDescription\" class=\"file__hidden-description\" :class=\"{show: error}\">{{ file.basename }}</p>\n\t\t</a>\n\n\t\t<CheckboxRadioSwitch v-if=\"allowSelection\"\n\t\t\tclass=\"selection-checkbox\"\n\t\t\t:checked=\"selected\"\n\t\t\t@update:checked=\"onToggle\">\n\t\t\t<span class=\"input-label\">{{ t('photos', 'Select image {imageName}', {imageName: file.basename}) }}</span>\n\t\t</CheckboxRadioSwitch>\n\n\t\t<Star v-if=\"file.favorite === 1\" class=\"favorite-state\" :aria-label=\"t('photos', 'The file is in the favorites')\" />\n\t</div>\n</template>\n\n<script>\nimport Star from 'vue-material-design-icons/Star'\nimport VideoIcon from 'vue-material-design-icons/Video.vue'\n\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { CheckboxRadioSwitch } from '@nextcloud/vue'\n\nimport UserConfig from '../mixins/UserConfig.js'\nimport Semaphore from '../utils/semaphoreWithPriority.js'\n\nexport default {\n\tname: 'File',\n\tcomponents: {\n\t\tCheckboxRadioSwitch,\n\t\tStar,\n\t\tVideoIcon,\n\t},\n\tmixins: [UserConfig],\n\tinheritAttrs: false,\n\tprops: {\n\t\tfile: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tselected: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t\tallowSelection: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tvisibility: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tsemaphore: {\n\t\t\ttype: Semaphore,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\terror: false,\n\t\t\tcanLoad: false,\n\t\t\tsemaphoreSymbol: null,\n\t\t\tisDestroyed: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {string} */\n\t\tdavPath() {\n\t\t\treturn generateRemoteUrl(`dav/files/${getCurrentUser().uid}`) + this.file.filename\n\t\t},\n\t\t/** @return {string} */\n\t\tariaDescription() {\n\t\t\treturn `image-description-${this.file.fileid}`\n\t\t},\n\t\t/** @return {string} */\n\t\tariaLabel() {\n\t\t\treturn t('photos', 'Open the full size \"{name}\" image', { name: this.file.basename })\n\t\t},\n\t\t/** @return {boolean} */\n\t\tisImage() {\n\t\t\treturn this.file.mime.startsWith('image')\n\t\t},\n\t\t/** @return {string} */\n\t\tdecodedEtag() {\n\t\t\treturn this.file.etag.replace('&quot;', '').replace('&quot;', '')\n\t\t},\n\t\t/** @return {string} */\n\t\tsrcVisible() {\n\t\t\treturn this.getItemURL(512)\n\t\t},\n\t\t/** @return {string} */\n\t\tsrcNear() {\n\t\t\treturn this.getItemURL(64)\n\t\t},\n\t},\n\n\tmounted() {\n\t\t// Don't render the component right away as it is useless if the user is only scrolling\n\t\tsetTimeout(async () => {\n\t\t\tthis.semaphoreSymbol = await this.semaphore.acquire(() => {\n\t\t\t\tswitch (this.visibility) {\n\t\t\t\tcase 'visible':\n\t\t\t\t\treturn 1\n\t\t\t\tcase 'near':\n\t\t\t\t\treturn 2\n\t\t\t\tdefault:\n\t\t\t\t\treturn 3\n\t\t\t\t}\n\t\t\t}, this.file.fileid)\n\n\t\t\tthis.canLoad = true\n\t\t\tif (this.visibility === 'none' || this.isDestroyed) {\n\t\t\t\tthis.releaseSemaphore()\n\t\t\t}\n\t\t}, 250)\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.isDestroyed = true\n\t\tthis.releaseSemaphore()\n\n\t\t// cancel any pending load\n\t\tif (this.$refs.imgNear !== undefined) {\n\t\t\tthis.$refs.imgNear.src = ''\n\t\t}\n\t\tif (this.$refs.srcVisible !== undefined) {\n\t\t\tthis.$refs.srcVisible.src = ''\n\t\t}\n\t},\n\n\tmethods: {\n\t\temitClick() {\n\t\t\tthis.$emit('click', this.file.fileid)\n\t\t},\n\n\t\t/** When the image is fully loaded by browser we remove the placeholder */\n\t\tonLoad() {\n\t\t\tthis.loaded = true\n\t\t\tthis.releaseSemaphore()\n\t\t},\n\n\t\tonError() {\n\t\t\tthis.error = true\n\t\t\tthis.releaseSemaphore()\n\t\t},\n\n\t\tonToggle(value) {\n\t\t\tthis.$emit('select-toggled', { id: this.file.fileid, value })\n\t\t},\n\n\t\tgetItemURL(size) {\n\t\t\treturn generateUrl(`/core/preview?fileId=${this.file.fileid}&c=${this.decodedEtag}&x=${size}&y=${size}&forceIcon=0&a=1`)\n\n\t\t},\n\n\t\treleaseSemaphore() {\n\t\t\tif (this.semaphoreSymbol === null) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.semaphore.release(this.semaphoreSymbol)\n\t\t\tthis.semaphoreSymbol = null\n\t\t},\n\t},\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.file-container {\n\tbackground: var(--color-primary-light);\n\tposition: relative;\n\theight: 100%;\n\twidth: 100%;\n\tborder: 2px solid var(--color-main-background); // Use border so create a separation between images.\n\tbox-sizing: border-box;\n\n\t// Selection border.\n\t&.selected, &:focus-within {\n\t\t&::after {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tz-index: 2;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tcontent: '';\n\t\t\toutline: var(--color-primary) solid 4px;\n\t\t\toutline-offset: -4px;\n\t\t\tpointer-events: none;\n\t\t}\n\t}\n\n\t.file {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbox-sizing: border-box;\n\t\toutline: none; // Override global focus state.\n\n\t\t&__images {\n\t\t\tdisplay: contents;\n\n\t\t\t.video-icon {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0px;\n\t\t\t\tright: 0px;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tz-index: 1;\n\t\t\t\topacity: 0.8;\n\n\t\t\t\t::v-deep .material-design-icon__svg {\n\t\t\t\t\tfill: var(--color-main-background);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\timg {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tobject-fit: cover;\n\t\t\t\tposition: absolute;\n\t\t\t\tcolor: transparent; /// Hide alt='' text when loading.\n\t\t\t}\n\n\t\t\t.loading-overlay {\n\t\t\t\tposition: absolute;\n\t\t\t\theight: 100%;\n\t\t\t\twidth: 100%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-content: center;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\tsvg {\n\t\t\t\t\twidth: 70%;\n\t\t\t\t\theight: 70%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__hidden-description {\n\t\t\tposition: absolute;\n\t\t\tleft: -10000px;\n\t\t\ttop: -10000px;\n\t\t\twidth: 1px;\n\t\t\theight: 1px;\n\t\t\toverflow: hidden;\n\n\t\t\t&.show {\n\t\t\t\tposition: initial;\n\t\t\t\twidth: fit-content;\n\t\t\t\theight: fit-content;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Reveal checkbox on hover.\n\t&:hover, &.selected, &:focus-within {\n\t\t.selection-checkbox {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t.favorite-state {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t.selection-checkbox {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\ttop: 8px;\n\t\t// Fancy calculation to render the checkbox in the middle of narrow images.\n\t\tright: min(22px, calc(50% - 7px));\n\t\tz-index: 1;\n\t\twidth: fit-content;\n\n\t\t// Make the checkbox background round on hover.\n\t\t::v-deep .checkbox-radio-switch__label {\n\t\t\tpadding: 10px;\n\t\t\tbox-sizing: border-box;\n\n\t\t\t// Add a background to the checkbox so we do not see the image through it.\n\t\t\t&::after {\n\t\t\t\tcontent: '';\n\t\t\t\tbackground: var(--color-primary-light);\n\t\t\t\twidth: 16px;\n\t\t\t\theight: 16px;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 1px;\n\t\t\t\tz-index: -1;\n\t\t\t}\n\n\t\t\t.checkbox-radio-switch__icon {\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t}\n\n\t\t.input-label {\n\t\t\tposition: fixed;\n\t\t\tz-index: -1;\n\t\t\ttop: -5000px;\n\t\t\tleft: -5000px;\n\t\t}\n\t}\n\n\t.favorite-state {\n\t\tposition: absolute;\n\t\ttop: 2px;\n\t\t// Fancy calculation to render the start in the middle of narrow images.\n\t\tright: min(2px, calc(50% - 7px));\n\n\t\t::v-deep .material-design-icon__svg {\n\t\t\tfill: #FC0;\n\n\t\t\tpath {\n\t\t\t\tstroke: var(--color-primary-light);\n\t\t\t\tstroke-width: 1px;\n\t\t\t}\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!./File.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!./File.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!./File.vue?vue&type=style&index=0&id=67e992e4&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!./File.vue?vue&type=style&index=0&id=67e992e4&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./File.vue?vue&type=template&id=67e992e4&scoped=true&\"\nimport script from \"./File.vue?vue&type=script&lang=js&\"\nexport * from \"./File.vue?vue&type=script&lang=js&\"\nimport style0 from \"./File.vue?vue&type=style&index=0&id=67e992e4&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 \"67e992e4\",\n null\n \n)\n\nexport default component.exports"],"names":["props","request","cancelToken","axios","url","options","Object","assign","token","cancel","___CSS_LOADER_EXPORT___","push","module","id","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","staticClass","class","selected","attrs","davPath","ariaLabel","on","$event","preventDefault","emitClick","apply","arguments","file","mime","includes","_e","_v","visibility","canLoad","error","key","ref","srcNear","basename","ariaDescription","onLoad","onError","srcVisible","show","_s","onToggle","t","imageName","favorite"],"sourceRoot":""}