aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/src
diff options
context:
space:
mode:
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2019-11-27 18:11:33 +0100
committerRoeland Jago Douma <roeland@famdouma.nl>2019-12-03 08:13:21 +0100
commit3a86b9925693fbcbaf0adb64a8d85500f055ef38 (patch)
tree2138ba06a5175bca070ecf2da021905469562c50 /apps/files_sharing/src
parentccf7d87c11112b63851940a6b157f07f954bd9ef (diff)
downloadnextcloud-server-3a86b9925693fbcbaf0adb64a8d85500f055ef38.tar.gz
nextcloud-server-3a86b9925693fbcbaf0adb64a8d85500f055ef38.zip
Inherited share UI
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
Diffstat (limited to 'apps/files_sharing/src')
-rw-r--r--apps/files_sharing/src/components/SharingEntry.vue2
-rw-r--r--apps/files_sharing/src/components/SharingEntryInherited.vue112
-rw-r--r--apps/files_sharing/src/views/SharingInherited.vue164
-rw-r--r--apps/files_sharing/src/views/SharingTab.vue11
4 files changed, 284 insertions, 5 deletions
diff --git a/apps/files_sharing/src/components/SharingEntry.vue b/apps/files_sharing/src/components/SharingEntry.vue
index cde7d2ed2b1..4d7f60cfa61 100644
--- a/apps/files_sharing/src/components/SharingEntry.vue
+++ b/apps/files_sharing/src/components/SharingEntry.vue
@@ -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 {
diff --git a/apps/files_sharing/src/components/SharingEntryInherited.vue b/apps/files_sharing/src/components/SharingEntryInherited.vue
new file mode 100644
index 00000000000..0d355ed6d22
--- /dev/null
+++ b/apps/files_sharing/src/components/SharingEntryInherited.vue
@@ -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>
diff --git a/apps/files_sharing/src/views/SharingInherited.vue b/apps/files_sharing/src/views/SharingInherited.vue
new file mode 100644
index 00000000000..be3c5ef2dc3
--- /dev/null
+++ b/apps/files_sharing/src/views/SharingInherited.vue
@@ -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>
diff --git a/apps/files_sharing/src/views/SharingTab.vue b/apps/files_sharing/src/views/SharingTab.vue
index 216b2e74ffc..b15ec5e9a64 100644
--- a/apps/files_sharing/src/views/SharingTab.vue
+++ b/apps/files_sharing/src/views/SharingTab.vue
@@ -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,