mirror of
https://github.com/nextcloud/server.git
synced 2026-06-06 23:34:22 -04:00
Merge pull request #44012 from nextcloud/feat/live-file-reference
feat(files): add Viewer Files ressource handler
This commit is contained in:
commit
32f5a15b1e
123 changed files with 447 additions and 237 deletions
|
|
@ -33,16 +33,17 @@ Vue.mixin({
|
|||
},
|
||||
})
|
||||
|
||||
registerWidget('file', (el, { richObjectType, richObject, accessible }) => {
|
||||
registerWidget('file', (el, { richObjectType, richObject, accessible, interactive }) => {
|
||||
const Widget = Vue.extend(FileWidget)
|
||||
new Widget({
|
||||
propsData: {
|
||||
richObjectType,
|
||||
richObject,
|
||||
accessible,
|
||||
interactive,
|
||||
},
|
||||
}).$mount(el)
|
||||
})
|
||||
}, { hasInteractiveView: true })
|
||||
|
||||
registerCustomPickerElement('files', (el, { providerId, accessible }) => {
|
||||
const Element = Vue.extend(FileReferencePickerElement)
|
||||
|
|
@ -21,50 +21,155 @@
|
|||
|
||||
<template>
|
||||
<div v-if="!accessible" class="widget-file widget-file--no-access">
|
||||
<div class="widget-file--image widget-file--image--icon icon-folder" />
|
||||
<div class="widget-file--details">
|
||||
<p class="widget-file--title">
|
||||
<span class="widget-file__image widget-file__image--icon">
|
||||
<FolderIcon v-if="isFolder" :size="88" />
|
||||
<FileIcon v-else :size="88" />
|
||||
</span>
|
||||
<span class="widget-file__details">
|
||||
<p class="widget-file__title">
|
||||
{{ t('files', 'File cannot be accessed') }}
|
||||
</p>
|
||||
<p class="widget-file--description">
|
||||
<p class="widget-file__description">
|
||||
{{ t('files', 'The file could not be found or you do not have permissions to view it. Ask the sender to share it.') }}
|
||||
</p>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Live preview if a handler is available -->
|
||||
<component :is="viewerHandler.component"
|
||||
v-else-if="interactive && viewerHandler && !failedViewer"
|
||||
:active="false /* prevent video from autoplaying */"
|
||||
:can-swipe="false"
|
||||
:can-zoom="false"
|
||||
:is-embedded="true"
|
||||
v-bind="viewerFile"
|
||||
:file-list="[viewerFile]"
|
||||
:is-full-screen="false"
|
||||
:is-sidebar-shown="false"
|
||||
class="widget-file widget-file--interactive"
|
||||
@error="failedViewer = true" />
|
||||
|
||||
<!-- The file is accessible -->
|
||||
<a v-else
|
||||
class="widget-file"
|
||||
class="widget-file widget-file--link"
|
||||
:href="richObject.link"
|
||||
@click.prevent="navigate">
|
||||
<div class="widget-file--image" :class="filePreviewClass" :style="filePreview" />
|
||||
<div class="widget-file--details">
|
||||
<p class="widget-file--title">{{ richObject.name }}</p>
|
||||
<p class="widget-file--description">{{ fileSize }}<br>{{ fileMtime }}</p>
|
||||
<p class="widget-file--link">{{ filePath }}</p>
|
||||
</div>
|
||||
target="_blank"
|
||||
@click="navigate">
|
||||
<span class="widget-file__image" :class="filePreviewClass" :style="filePreviewStyle">
|
||||
<template v-if="!previewUrl">
|
||||
<FolderIcon v-if="isFolder" :size="88" />
|
||||
<FileIcon v-else :size="88" />
|
||||
</template>
|
||||
</span>
|
||||
<span class="widget-file__details">
|
||||
<p class="widget-file__title">{{ richObject.name }}</p>
|
||||
<p class="widget-file__description">{{ fileSize }}<br>{{ fileMtime }}</p>
|
||||
<p class="widget-file__link">{{ filePath }}</p>
|
||||
</span>
|
||||
</a>
|
||||
</template>
|
||||
<script>
|
||||
import { generateUrl } from '@nextcloud/router'
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, type Component, type PropType } from 'vue'
|
||||
import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
|
||||
import { getCurrentUser } from '@nextcloud/auth'
|
||||
import { getFilePickerBuilder } from '@nextcloud/dialogs'
|
||||
import { Node } from '@nextcloud/files'
|
||||
import FileIcon from 'vue-material-design-icons/File.vue'
|
||||
import FolderIcon from 'vue-material-design-icons/Folder.vue'
|
||||
import path from 'path'
|
||||
|
||||
export default {
|
||||
// see lib/private/Collaboration/Reference/File/FileReferenceProvider.php
|
||||
type Ressource = {
|
||||
id: number
|
||||
name: string
|
||||
size: number
|
||||
path: string
|
||||
link: string
|
||||
mimetype: string
|
||||
mtime: number // as unix timestamp
|
||||
'preview-available': boolean
|
||||
}
|
||||
|
||||
type ViewerHandler = {
|
||||
id: string
|
||||
group: string
|
||||
mimes: string[]
|
||||
component: Component
|
||||
}
|
||||
|
||||
/**
|
||||
* Minimal mock of the legacy Viewer FileInfo
|
||||
* TODO: replace by Node object
|
||||
*/
|
||||
type ViewerFile = {
|
||||
filename: string // the path to the root folder
|
||||
basename: string // the file name
|
||||
lastmod: Date // the last modification date
|
||||
size: number // the file size in bytes
|
||||
type: string
|
||||
mime: string
|
||||
fileid: number
|
||||
failed: boolean
|
||||
loaded: boolean
|
||||
davPath: string
|
||||
source: string
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
name: 'ReferenceFileWidget',
|
||||
components: {
|
||||
FolderIcon,
|
||||
FileIcon,
|
||||
},
|
||||
props: {
|
||||
richObject: {
|
||||
type: Object,
|
||||
type: Object as PropType<Ressource>,
|
||||
required: true,
|
||||
},
|
||||
accessible: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
interactive: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
previewUrl: window.OC.MimeType.getIconUrl(this.richObject.mimetype),
|
||||
previewUrl: null as string | null,
|
||||
failedViewer: false,
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
availableViewerHandlers(): ViewerHandler[] {
|
||||
return (window?.OCA?.Viewer?.availableHandlers || []) as ViewerHandler[]
|
||||
},
|
||||
viewerHandler(): ViewerHandler | undefined {
|
||||
return this.availableViewerHandlers
|
||||
.find(handler => handler.mimes.includes(this.richObject.mimetype))
|
||||
},
|
||||
viewerFile(): ViewerFile {
|
||||
const davSource = generateRemoteUrl(`dav/files/${getCurrentUser()?.uid}/${this.richObject.path}`)
|
||||
.replace(/\/\/$/, '/')
|
||||
return {
|
||||
filename: this.richObject.path,
|
||||
basename: this.richObject.name,
|
||||
lastmod: new Date(this.richObject.mtime * 1000),
|
||||
size: this.richObject.size,
|
||||
type: 'file',
|
||||
mime: this.richObject.mimetype,
|
||||
fileid: this.richObject.id,
|
||||
failed: false,
|
||||
loaded: true,
|
||||
davPath: davSource,
|
||||
source: davSource,
|
||||
}
|
||||
},
|
||||
|
||||
fileSize() {
|
||||
return window.OC.Util.humanFileSize(this.richObject.size)
|
||||
},
|
||||
|
|
@ -74,26 +179,26 @@ export default {
|
|||
filePath() {
|
||||
return path.dirname(this.richObject.path)
|
||||
},
|
||||
filePreview() {
|
||||
filePreviewStyle() {
|
||||
if (this.previewUrl) {
|
||||
return {
|
||||
backgroundImage: 'url(' + this.previewUrl + ')',
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
backgroundImage: 'url(' + window.OC.MimeType.getIconUrl(this.richObject.mimetype) + ')',
|
||||
}
|
||||
|
||||
return {}
|
||||
},
|
||||
filePreviewClass() {
|
||||
if (this.previewUrl) {
|
||||
return 'widget-file--image--preview'
|
||||
return 'widget-file__image--preview'
|
||||
}
|
||||
return 'widget-file--image--icon'
|
||||
return 'widget-file__image--icon'
|
||||
|
||||
},
|
||||
isFolder() {
|
||||
return this.richObject.mimetype === 'httpd/unix-directory'
|
||||
},
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (this.richObject['preview-available']) {
|
||||
const previewUrl = generateUrl('/core/preview?fileId={fileId}&x=250&y=250', {
|
||||
|
|
@ -110,43 +215,74 @@ export default {
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
navigate() {
|
||||
if (OCA.Viewer && OCA.Viewer.mimetypes.indexOf(this.richObject.mimetype) !== -1) {
|
||||
OCA.Viewer.open({ path: this.richObject.path })
|
||||
return
|
||||
navigate(event) {
|
||||
if (this.isFolder) {
|
||||
event.stopPropagation()
|
||||
event.preventDefault()
|
||||
this.openFilePicker()
|
||||
}
|
||||
window.location = this.richObject.link
|
||||
},
|
||||
|
||||
openFilePicker() {
|
||||
const picker = getFilePickerBuilder(t('settings', 'Your files'))
|
||||
.allowDirectories(true)
|
||||
.setMultiSelect(false)
|
||||
.addButton({
|
||||
id: 'open',
|
||||
label: this.t('settings', 'Open in files'),
|
||||
callback(nodes: Node[]) {
|
||||
if (nodes[0]) {
|
||||
window.open(generateUrl('/f/{fileid}', {
|
||||
fileid: nodes[0].fileid,
|
||||
}))
|
||||
}
|
||||
},
|
||||
type: 'primary',
|
||||
})
|
||||
.disableNavigation()
|
||||
.startAt(this.richObject.path)
|
||||
.build()
|
||||
picker.pick()
|
||||
},
|
||||
},
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.widget-file {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
color: var(--color-main-text) !important;
|
||||
text-decoration: none !important;
|
||||
padding: 0 !important;
|
||||
|
||||
&--image {
|
||||
min-width: 40%;
|
||||
&__image {
|
||||
width: 30%;
|
||||
min-width: 160px;
|
||||
max-width: 320px;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
&.widget-file--image--icon {
|
||||
&--icon {
|
||||
min-width: 88px;
|
||||
background-size: 44px;
|
||||
max-width: 88px;
|
||||
padding: 12px;
|
||||
padding-right: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
&--title {
|
||||
&__title {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
&--details {
|
||||
&__details {
|
||||
padding: 12px;
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
|
|
@ -158,7 +294,7 @@ export default {
|
|||
}
|
||||
}
|
||||
|
||||
&--description {
|
||||
&__description {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
|
|
@ -167,16 +303,16 @@ export default {
|
|||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
// No preview, standard link to ressource
|
||||
&--link {
|
||||
color: var(--color-text-maxcontrast);
|
||||
}
|
||||
|
||||
&.widget-file--no-access {
|
||||
padding: 12px;
|
||||
|
||||
.widget-file--details {
|
||||
padding: 0;
|
||||
}
|
||||
&--interactive {
|
||||
position: relative;
|
||||
height: 400px;
|
||||
max-height: 50vh;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
4
apps/settings/js/map-test.js.map
Normal file
4
apps/settings/js/map-test.js.map
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* This is a dummy file for testing webserver support of JavaScript map files.
|
||||
*/
|
||||
{}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
3
dist/1359-1359.js
vendored
Normal file
3
dist/1359-1359.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/1359-1359.js.map
vendored
Normal file
1
dist/1359-1359.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
4
dist/2382-2382.js
vendored
4
dist/2382-2382.js
vendored
File diff suppressed because one or more lines are too long
2
dist/2382-2382.js.map
vendored
2
dist/2382-2382.js.map
vendored
File diff suppressed because one or more lines are too long
3
dist/3747-3747.js
vendored
3
dist/3747-3747.js
vendored
File diff suppressed because one or more lines are too long
1
dist/3747-3747.js.map
vendored
1
dist/3747-3747.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/5225-5225.js
vendored
4
dist/5225-5225.js
vendored
File diff suppressed because one or more lines are too long
2
dist/5225-5225.js.map
vendored
2
dist/5225-5225.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/5528-5528.js
vendored
2
dist/5528-5528.js
vendored
|
|
@ -1 +1 @@
|
|||
"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[5528],{95528:(e,u,t)=>{t.r(u),t.d(u,{NcAutoCompleteResult:()=>c.N,NcMentionBubble:()=>l.N,default:()=>c.a});var l=t(58341),c=t(79234)}}]);
|
||||
"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[5528],{95528:(e,u,t)=>{t.r(u),t.d(u,{NcAutoCompleteResult:()=>c.N,NcMentionBubble:()=>l.N,default:()=>c.a});var l=t(96982),c=t(7679)}}]);
|
||||
3
dist/5662-5662.js
vendored
3
dist/5662-5662.js
vendored
|
|
@ -1,3 +0,0 @@
|
|||
/*! For license information please see 5662-5662.js.LICENSE.txt */
|
||||
"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[5662],{35662:(e,c,l)=>{l.d(c,{FilePickerVue:()=>n});const n=(0,l(85471).$V)((()=>Promise.all([l.e(4208),l.e(3747)]).then(l.bind(l,92133))))}}]);
|
||||
//# sourceMappingURL=5662-5662.js.map?v=d1f20e62402d8be29948
|
||||
4
dist/7462-7462.js
vendored
4
dist/7462-7462.js
vendored
File diff suppressed because one or more lines are too long
2
dist/7462-7462.js.map
vendored
2
dist/7462-7462.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/7883-7883.js
vendored
4
dist/7883-7883.js
vendored
File diff suppressed because one or more lines are too long
2
dist/7883-7883.js.map
vendored
2
dist/7883-7883.js.map
vendored
File diff suppressed because one or more lines are too long
3
dist/8618-8618.js
vendored
Normal file
3
dist/8618-8618.js
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
/*! For license information please see 8618-8618.js.LICENSE.txt */
|
||||
"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[8618],{68618:(e,c,l)=>{l.d(c,{FilePickerVue:()=>n});const n=(0,l(85471).$V)((()=>Promise.all([l.e(4208),l.e(1359)]).then(l.bind(l,61421))))}}]);
|
||||
//# sourceMappingURL=8618-8618.js.map?v=1e8f15db3b14455fef8f
|
||||
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"5662-5662.js?v=d1f20e62402d8be29948","mappings":";oIAsBA,MAAMA,GAAI,gBAAE,IAAM","sources":["webpack:///nextcloud/node_modules/@nextcloud/dialogs/dist/chunks/index-Xjd5r2aR.mjs"],"sourcesContent":["import { defineAsyncComponent as e } from \"vue\";\n/**\n * @copyright Copyright (c) 2023 Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @author Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst i = e(() => import(\"./FilePicker-gEH28Uzn.mjs\"));\nexport {\n i as FilePickerVue\n};\n"],"names":["i"],"sourceRoot":""}
|
||||
{"version":3,"file":"8618-8618.js?v=1e8f15db3b14455fef8f","mappings":";oIAsBA,MAAMA,GAAI,gBAAE,IAAM","sources":["webpack:///nextcloud/node_modules/@nextcloud/dialogs/dist/chunks/index-RkOaxczZ.mjs"],"sourcesContent":["import { defineAsyncComponent as e } from \"vue\";\n/**\n * @copyright Copyright (c) 2023 Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @author Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst i = e(() => import(\"./FilePicker-DBGB1Rec.mjs\"));\nexport {\n i as FilePickerVue\n};\n"],"names":["i"],"sourceRoot":""}
|
||||
4
dist/8670-8670.js
vendored
4
dist/8670-8670.js
vendored
File diff suppressed because one or more lines are too long
2
dist/8670-8670.js.map
vendored
2
dist/8670-8670.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/comments-comments-app.js
vendored
4
dist/comments-comments-app.js
vendored
File diff suppressed because one or more lines are too long
2
dist/comments-comments-app.js.map
vendored
2
dist/comments-comments-app.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/comments-comments-tab.js
vendored
4
dist/comments-comments-tab.js
vendored
File diff suppressed because one or more lines are too long
2
dist/comments-comments-tab.js.map
vendored
2
dist/comments-comments-tab.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-common.js
vendored
4
dist/core-common.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-common.js.map
vendored
2
dist/core-common.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-legacy-unified-search.js
vendored
4
dist/core-legacy-unified-search.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-legacy-unified-search.js.map
vendored
2
dist/core-legacy-unified-search.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-login.js
vendored
4
dist/core-login.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-login.js.map
vendored
2
dist/core-login.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-main.js
vendored
4
dist/core-main.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-main.js.map
vendored
2
dist/core-main.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-profile.js
vendored
4
dist/core-profile.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-profile.js.map
vendored
2
dist/core-profile.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-recommendedapps.js
vendored
4
dist/core-recommendedapps.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-recommendedapps.js.map
vendored
2
dist/core-recommendedapps.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-unified-search.js
vendored
4
dist/core-unified-search.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-unified-search.js.map
vendored
2
dist/core-unified-search.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/core-unsupported-browser-redirect.js
vendored
4
dist/core-unsupported-browser-redirect.js
vendored
|
|
@ -1,3 +1,3 @@
|
|||
/*! For license information please see core-unsupported-browser-redirect.js.LICENSE.txt */
|
||||
(()=>{"use strict";var e,r,t,o={47210:(e,r,t)=>{var o,n=t(92457);t.nc=btoa((0,n.do)()),window.TESTING||null!==(o=OC)&&void 0!==o&&null!==(o=o.config)&&void 0!==o&&o.no_unsupported_browser_warning||window.addEventListener("DOMContentLoaded",(async function(){const{testSupportedBrowser:e}=await Promise.all([t.e(4208),t.e(7883)]).then(t.bind(t,77883));e()}))}},n={};function a(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,a),t.loaded=!0,t.exports}a.m=o,e=[],a.O=(r,t,o,n)=>{if(!t){var i=1/0;for(u=0;u<e.length;u++){t=e[u][0],o=e[u][1],n=e[u][2];for(var l=!0,d=0;d<t.length;d++)(!1&n||i>=n)&&Object.keys(a.O).every((e=>a.O[e](t[d])))?t.splice(d--,1):(l=!1,n<i&&(i=n));if(l){e.splice(u--,1);var c=o();void 0!==c&&(r=c)}}return r}n=n||0;for(var u=e.length;u>0&&e[u-1][2]>n;u--)e[u]=e[u-1];e[u]=[t,o,n]},a.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return a.d(r,{a:r}),r},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>e+"-"+e+".js?v=01d13a358a121a1736f5",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="nextcloud:",a.l=(e,o,n,i)=>{if(r[e])r[e].push(o);else{var l,d;if(void 0!==n)for(var c=document.getElementsByTagName("script"),u=0;u<c.length;u++){var s=c[u];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==t+n){l=s;break}}l||(d=!0,(l=document.createElement("script")).charset="utf-8",l.timeout=120,a.nc&&l.setAttribute("nonce",a.nc),l.setAttribute("data-webpack",t+n),l.src=e),r[e]=[o];var p=(t,o)=>{l.onerror=l.onload=null,clearTimeout(f);var n=r[e];if(delete r[e],l.parentNode&&l.parentNode.removeChild(l),n&&n.forEach((e=>e(o))),t)return t(o)},f=setTimeout(p.bind(null,void 0,{type:"timeout",target:l}),12e4);l.onerror=p.bind(null,l.onerror),l.onload=p.bind(null,l.onload),d&&document.head.appendChild(l)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),a.j=3604,(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var r=a.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{a.b=document.baseURI||self.location.href;var e={3604:0};a.f.j=(r,t)=>{var o=a.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else{var n=new Promise(((t,n)=>o=e[r]=[t,n]));t.push(o[2]=n);var i=a.p+a.u(r),l=new Error;a.l(i,(t=>{if(a.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var n=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;l.message="Loading chunk "+r+" failed.\n("+n+": "+i+")",l.name="ChunkLoadError",l.type=n,l.request=i,o[1](l)}}),"chunk-"+r,r)}},a.O.j=r=>0===e[r];var r=(r,t)=>{var o,n,i=t[0],l=t[1],d=t[2],c=0;if(i.some((r=>0!==e[r]))){for(o in l)a.o(l,o)&&(a.m[o]=l[o]);if(d)var u=d(a)}for(r&&r(t);c<i.length;c++)n=i[c],a.o(e,n)&&e[n]&&e[n][0](),e[n]=0;return a.O(u)},t=self.webpackChunknextcloud=self.webpackChunknextcloud||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),a.nc=void 0;var i=a.O(void 0,[4208],(()=>a(47210)));i=a.O(i)})();
|
||||
//# sourceMappingURL=core-unsupported-browser-redirect.js.map?v=fec4ffebd61d3901d676
|
||||
(()=>{"use strict";var e,r,t,o={47210:(e,r,t)=>{var o,n=t(92457);t.nc=btoa((0,n.do)()),window.TESTING||null!==(o=OC)&&void 0!==o&&null!==(o=o.config)&&void 0!==o&&o.no_unsupported_browser_warning||window.addEventListener("DOMContentLoaded",(async function(){const{testSupportedBrowser:e}=await Promise.all([t.e(4208),t.e(7883)]).then(t.bind(t,77883));e()}))}},n={};function a(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,a),t.loaded=!0,t.exports}a.m=o,e=[],a.O=(r,t,o,n)=>{if(!t){var i=1/0;for(c=0;c<e.length;c++){t=e[c][0],o=e[c][1],n=e[c][2];for(var l=!0,d=0;d<t.length;d++)(!1&n||i>=n)&&Object.keys(a.O).every((e=>a.O[e](t[d])))?t.splice(d--,1):(l=!1,n<i&&(i=n));if(l){e.splice(c--,1);var u=o();void 0!==u&&(r=u)}}return r}n=n||0;for(var c=e.length;c>0&&e[c-1][2]>n;c--)e[c]=e[c-1];e[c]=[t,o,n]},a.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return a.d(r,{a:r}),r},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>e+"-"+e+".js?v=46e2cea40d0fe8364773",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="nextcloud:",a.l=(e,o,n,i)=>{if(r[e])r[e].push(o);else{var l,d;if(void 0!==n)for(var u=document.getElementsByTagName("script"),c=0;c<u.length;c++){var s=u[c];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==t+n){l=s;break}}l||(d=!0,(l=document.createElement("script")).charset="utf-8",l.timeout=120,a.nc&&l.setAttribute("nonce",a.nc),l.setAttribute("data-webpack",t+n),l.src=e),r[e]=[o];var p=(t,o)=>{l.onerror=l.onload=null,clearTimeout(f);var n=r[e];if(delete r[e],l.parentNode&&l.parentNode.removeChild(l),n&&n.forEach((e=>e(o))),t)return t(o)},f=setTimeout(p.bind(null,void 0,{type:"timeout",target:l}),12e4);l.onerror=p.bind(null,l.onerror),l.onload=p.bind(null,l.onload),d&&document.head.appendChild(l)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),a.j=3604,(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var r=a.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{a.b=document.baseURI||self.location.href;var e={3604:0};a.f.j=(r,t)=>{var o=a.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else{var n=new Promise(((t,n)=>o=e[r]=[t,n]));t.push(o[2]=n);var i=a.p+a.u(r),l=new Error;a.l(i,(t=>{if(a.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var n=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;l.message="Loading chunk "+r+" failed.\n("+n+": "+i+")",l.name="ChunkLoadError",l.type=n,l.request=i,o[1](l)}}),"chunk-"+r,r)}},a.O.j=r=>0===e[r];var r=(r,t)=>{var o,n,i=t[0],l=t[1],d=t[2],u=0;if(i.some((r=>0!==e[r]))){for(o in l)a.o(l,o)&&(a.m[o]=l[o]);if(d)var c=d(a)}for(r&&r(t);u<i.length;u++)n=i[u],a.o(e,n)&&e[n]&&e[n][0](),e[n]=0;return a.O(c)},t=self.webpackChunknextcloud=self.webpackChunknextcloud||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),a.nc=void 0;var i=a.O(void 0,[4208],(()=>a(47210)));i=a.O(i)})();
|
||||
//# sourceMappingURL=core-unsupported-browser-redirect.js.map?v=63a1328426084e0a278b
|
||||
File diff suppressed because one or more lines are too long
4
dist/core-unsupported-browser.js
vendored
4
dist/core-unsupported-browser.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-unsupported-browser.js.map
vendored
2
dist/core-unsupported-browser.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/dashboard-main.js
vendored
4
dist/dashboard-main.js
vendored
File diff suppressed because one or more lines are too long
2
dist/dashboard-main.js.map
vendored
2
dist/dashboard-main.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/dav-settings-personal-availability.js
vendored
4
dist/dav-settings-personal-availability.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
dist/files-init.js
vendored
4
dist/files-init.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files-init.js.map
vendored
2
dist/files-init.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files-main.js
vendored
4
dist/files-main.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files-main.js.map
vendored
2
dist/files-main.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files-personal-settings.js
vendored
4
dist/files-personal-settings.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files-personal-settings.js.map
vendored
2
dist/files-personal-settings.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files-reference-files.js
vendored
4
dist/files-reference-files.js
vendored
File diff suppressed because one or more lines are too long
68
dist/files-reference-files.js.LICENSE.txt
vendored
68
dist/files-reference-files.js.LICENSE.txt
vendored
|
|
@ -1,3 +1,48 @@
|
|||
/**
|
||||
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
*
|
||||
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||
*
|
||||
* @license AGPL-3.0-or-later
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>
|
||||
*
|
||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||
*
|
||||
* @license AGPL-3.0-or-later
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
|
|
@ -40,3 +85,26 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
|
||||
*
|
||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||
* @author Ferdinand Thiessen <opensource@fthiessen.de>
|
||||
*
|
||||
* @license AGPL-3.0-or-later
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
2
dist/files-reference-files.js.map
vendored
2
dist/files-reference-files.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files-sidebar.js
vendored
4
dist/files-sidebar.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files-sidebar.js.map
vendored
2
dist/files-sidebar.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files_external-init.js
vendored
4
dist/files_external-init.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_external-init.js.map
vendored
2
dist/files_external-init.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files_reminders-init.js
vendored
4
dist/files_reminders-init.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_reminders-init.js.map
vendored
2
dist/files_reminders-init.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files_sharing-files_sharing_tab.js
vendored
4
dist/files_sharing-files_sharing_tab.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_sharing-files_sharing_tab.js.map
vendored
2
dist/files_sharing-files_sharing_tab.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files_sharing-personal-settings.js
vendored
4
dist/files_sharing-personal-settings.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_sharing-personal-settings.js.map
vendored
2
dist/files_sharing-personal-settings.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files_versions-files_versions.js
vendored
4
dist/files_versions-files_versions.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_versions-files_versions.js.map
vendored
2
dist/files_versions-files_versions.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/oauth2-oauth2.js
vendored
4
dist/oauth2-oauth2.js
vendored
File diff suppressed because one or more lines are too long
2
dist/oauth2-oauth2.js.map
vendored
2
dist/oauth2-oauth2.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/settings-apps-view-4529.js
vendored
4
dist/settings-apps-view-4529.js
vendored
File diff suppressed because one or more lines are too long
2
dist/settings-apps-view-4529.js.map
vendored
2
dist/settings-apps-view-4529.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/settings-users-3239.js
vendored
4
dist/settings-users-3239.js
vendored
File diff suppressed because one or more lines are too long
2
dist/settings-users-3239.js.map
vendored
2
dist/settings-users-3239.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/settings-vue-settings-admin-ai.js
vendored
4
dist/settings-vue-settings-admin-ai.js
vendored
File diff suppressed because one or more lines are too long
2
dist/settings-vue-settings-admin-ai.js.map
vendored
2
dist/settings-vue-settings-admin-ai.js.map
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
dist/settings-vue-settings-admin-security.js
vendored
4
dist/settings-vue-settings-admin-security.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
dist/settings-vue-settings-admin-sharing.js
vendored
4
dist/settings-vue-settings-admin-sharing.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
dist/settings-vue-settings-personal-info.js
vendored
4
dist/settings-vue-settings-personal-info.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue