Inherited share UI

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ (skjnldsv) 2019-11-27 18:11:33 +01:00 committed by Roeland Jago Douma
parent ccf7d87c11
commit 3a86b99256
No known key found for this signature in database
GPG Key ID: F941078878347C0C
14 changed files with 438 additions and 159 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +1,2 @@
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=65)}({65:function(e,n,r){r.p=OC.linkTo("files_sharing","js/dist/"),r.nc=btoa(OC.requestToken),window.OCP.Collaboration.registerType("file",{action:function(){return new Promise((function(e,n){OC.dialogs.filepicker(t("files_sharing","Link to a file"),(function(t){OC.Files.getClient().getFileInfo(t).then((function(n,t){e(t.id)})).fail((function(){n(new Error("Cannot get fileinfo"))}))}),!1,null,!1,OC.dialogs.FILEPICKER_TYPE_CHOOSE,"",{allowDirectoryChooser:!0})}))},typeString:t("files_sharing","Link to a file"),typeIconClass:"icon-files-dark"})}});
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=68)}({68:function(e,n,r){r.p=OC.linkTo("files_sharing","js/dist/"),r.nc=btoa(OC.requestToken),window.OCP.Collaboration.registerType("file",{action:function(){return new Promise((function(e,n){OC.dialogs.filepicker(t("files_sharing","Link to a file"),(function(t){OC.Files.getClient().getFileInfo(t).then((function(n,t){e(t.id)})).fail((function(){n(new Error("Cannot get fileinfo"))}))}),!1,null,!1,OC.dialogs.FILEPICKER_TYPE_CHOOSE,"",{allowDirectoryChooser:!0})}))},typeString:t("files_sharing","Link to a file"),typeIconClass:"icon-files-dark"})}});
//# sourceMappingURL=collaboration.js.map

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

View File

@ -1,4 +1,4 @@
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/js/",r(r.s=343)}({343:function(e,t){
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/js/",r(r.s=349)}({349:function(e,t){
/**
* @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
*

File diff suppressed because one or more lines are too long

View File

@ -119,8 +119,6 @@ import ActionInput from 'nextcloud-vue/dist/Components/ActionInput'
import ActionTextEditable from 'nextcloud-vue/dist/Components/ActionTextEditable'
import Tooltip from 'nextcloud-vue/dist/Directives/Tooltip'
// eslint-disable-next-line no-unused-vars
import Share from '../models/Share'
import SharesMixin from '../mixins/SharesMixin'
export default {

View File

@ -0,0 +1,112 @@
<!--
- @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
-
- @author John Molakvoæ <skjnldsv@protonmail.com>
-
- @license GNU AGPL version 3 or any later version
-
- 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/>.
-
-->
<template>
<SharingEntrySimple
:key="share.id"
class="sharing-entry__inherited"
:title="share.shareWithDisplayName">
<template #avatar>
<Avatar
:user="share.shareWith"
:display-name="share.shareWithDisplayName"
class="sharing-entry__avatar"
tooltip-message="" />
</template>
<ActionText icon="icon-user">
{{ t('files_sharing', 'Invited by {initiator}', { initiator: share.ownerDisplayName }) }}
</ActionText>
<ActionLink v-if="share.fileSource"
icon="icon-folder"
:href="fileTargetUrl">
{{ t('files_sharing', 'Open folder') }}
</ActionLink>
<ActionButton v-if="share.canDelete"
icon="icon-delete"
@click.prevent="onDelete">
{{ t('files_sharing', 'Delete share') }}
</actionbutton>
</SharingEntrySimple>
</template>
<script>
import { generateUrl } from '@nextcloud/router'
import Avatar from 'nextcloud-vue/dist/Components/Avatar'
import ActionButton from 'nextcloud-vue/dist/Components/ActionButton'
import ActionLink from 'nextcloud-vue/dist/Components/ActionLink'
import ActionText from 'nextcloud-vue/dist/Components/ActionText'
// eslint-disable-next-line no-unused-vars
import Share from '../models/Share'
import SharesMixin from '../mixins/SharesMixin'
import SharingEntrySimple from '../components/SharingEntrySimple'
export default {
name: 'SharingEntryInherited',
components: {
ActionButton,
ActionLink,
ActionText,
Avatar,
SharingEntrySimple
},
mixins: [SharesMixin],
props: {
share: {
type: Share,
required: true
}
},
computed: {
fileTargetUrl() {
return generateUrl('/f/{fileid}', {
fileid: this.share.fileSource
})
}
}
}
</script>
<style lang="scss" scoped>
.sharing-entry {
display: flex;
align-items: center;
height: 44px;
&__desc {
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 8px;
line-height: 1.2em;
p {
color: var(--color-text-maxcontrast);
}
}
&__actions {
margin-left: auto;
}
}
</style>

View File

@ -0,0 +1,164 @@
<!--
- @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
-
- @author John Molakvoæ <skjnldsv@protonmail.com>
-
- @license GNU AGPL version 3 or any later version
-
- 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/>.
-
-->
<template>
<ul id="sharing-inherited-shares">
<!-- Main collapsible entry -->
<SharingEntrySimple
class="sharing-entry__inherited"
:title="mainTitle">
<template #avatar>
<div class="avatar-shared icon-more-white" />
</template>
<ActionButton :icon="showInheritedSharesIcon" @click.prevent.stop="toggleInheritedShares">
{{ toggleTooltip }}
</ActionButton>
</SharingEntrySimple>
<!-- Inherited shares list -->
<SharingEntryInherited v-for="share in shares"
:key="share.id"
:share="share" />
</ul>
</template>
<script>
import { generateOcsUrl } from '@nextcloud/router'
import ActionButton from 'nextcloud-vue/dist/Components/ActionButton'
import axios from '@nextcloud/axios'
import Share from '../models/Share'
import SharingEntryInherited from '../components/SharingEntryInherited'
import SharingEntrySimple from '../components/SharingEntrySimple'
export default {
name: 'SharingInherited',
components: {
ActionButton,
SharingEntryInherited,
SharingEntrySimple
},
props: {
fileInfo: {
type: Object,
default: () => {},
required: true
}
},
data() {
return {
loaded: false,
loading: false,
showInheritedShares: false,
shares: []
}
},
computed: {
showInheritedSharesIcon() {
if (this.loading) {
return 'icon-loading-small'
}
if (this.showInheritedShares) {
return 'icon-triangle-n'
}
return 'icon-triangle-s'
},
mainTitle() {
return t('files_sharing', 'Others with access {count}', {
count: this.loaded ? `: ${this.shares.length}` : ''
})
},
toggleTooltip() {
return this.fileInfo.type === 'dir'
? t('files_sharing', 'Toggle list of others with access to this directory')
: t('files_sharing', 'Toggle list of others with access to this file')
},
fullPath() {
const path = `${this.fileInfo.path}/${this.fileInfo.name}`
return path.replace('//', '/')
}
},
watch: {
fileInfo() {
this.resetState()
}
},
methods: {
/**
* Toggle the list view and fetch/reset the state
*/
toggleInheritedShares() {
this.showInheritedShares = !this.showInheritedShares
if (this.showInheritedShares) {
this.fetchInheritedShares()
} else {
this.resetState()
}
},
/**
* Fetch the Inherited Shares array
*/
async fetchInheritedShares() {
this.loading = true
try {
const url = generateOcsUrl(`apps/files_sharing/api/v1/shares/inherited?format=json&path=${this.fullPath}`, 2)
const shares = await axios.get(url.replace(/\/$/, ''))
this.shares = shares.data.ocs.data
.map(share => new Share(share))
.sort((a, b) => b.createdTime - a.createdTime)
console.info(this.shares)
this.loaded = true
} catch (error) {
OC.Notification.showTemporary(t('files_sharing', 'Unable to fetch inherited shares'), { type: 'error' })
} finally {
this.loading = false
}
},
/**
* Reset current component state
*/
resetState() {
this.loaded = false
this.loading = false
this.showInheritedShares = false
this.shares = []
}
}
}
</script>
<style lang="scss" scoped>
.sharing-entry__inherited {
.avatar-shared {
width: 32px;
height: 32px;
line-height: 32px;
font-size: 18px;
background-color: var(--color-text-maxcontrast);
border-radius: 50%;
flex-shrink: 0;
}
}
</style>

View File

@ -33,7 +33,7 @@
<!-- shared with me information -->
<SharingEntrySimple v-if="isSharedWithMe" v-bind="sharedWithMe" class="sharing-entry__reshare">
<template #avatar>
<Avatar #avatar
<Avatar
:user="sharedWithMe.user"
:display-name="sharedWithMe.displayName"
class="sharing-entry__avatar"
@ -61,6 +61,9 @@
:shares="shares"
:file-info="fileInfo" />
<!-- inherited shares -->
<SharingInherited v-if="!loading" :file-info="fileInfo" />
<!-- internal link copy -->
<SharingEntryInternal :file-info="fileInfo" />
@ -82,11 +85,11 @@
</template>
<script>
import { CollectionList } from 'nextcloud-vue-collections'
import { generateOcsUrl } from '@nextcloud/router'
import Tab from 'nextcloud-vue/dist/Components/AppSidebarTab'
import Avatar from 'nextcloud-vue/dist/Components/Avatar'
import axios from '@nextcloud/axios'
import { CollectionList } from 'nextcloud-vue-collections'
import Tab from 'nextcloud-vue/dist/Components/AppSidebarTab'
import { shareWithTitle } from '../utils/SharedWithMe'
import Share from '../models/Share'
@ -95,6 +98,7 @@ import SharingEntryInternal from '../components/SharingEntryInternal'
import SharingEntrySimple from '../components/SharingEntrySimple'
import SharingInput from '../components/SharingInput'
import SharingInherited from './SharingInherited'
import SharingLinkList from './SharingLinkList'
import SharingList from './SharingList'
@ -106,6 +110,7 @@ export default {
CollectionList,
SharingEntryInternal,
SharingEntrySimple,
SharingInherited,
SharingInput,
SharingLinkList,
SharingList,