Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Molakvoæ <skjnldsv@protonmail.com>2021-09-14 18:41:07 +0300
committerJohn Molakvoæ <skjnldsv@protonmail.com>2021-09-16 16:20:50 +0300
commit164b0064ed678f8f5c019d464a94afbadde7f462 (patch)
tree7e40561bdf04dface382f78b177f7315c8f7113e /apps/files_sharing/src
parent959e4cb0bf768f9bd3ecd61046261cf7f7163a24 (diff)
Add new ExternalShareActions API
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
Diffstat (limited to 'apps/files_sharing/src')
-rw-r--r--apps/files_sharing/src/components/ExternalShareAction.vue63
-rw-r--r--apps/files_sharing/src/components/SharingEntryLink.vue39
-rw-r--r--apps/files_sharing/src/files_sharing_tab.js2
-rw-r--r--apps/files_sharing/src/services/ExternalLinkActions.js2
-rw-r--r--apps/files_sharing/src/services/ExternalShareActions.js80
5 files changed, 178 insertions, 8 deletions
diff --git a/apps/files_sharing/src/components/ExternalShareAction.vue b/apps/files_sharing/src/components/ExternalShareAction.vue
new file mode 100644
index 00000000000..39caa1260c8
--- /dev/null
+++ b/apps/files_sharing/src/components/ExternalShareAction.vue
@@ -0,0 +1,63 @@
+<!--
+ - @copyright Copyright (c) 2021 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>
+ <Component :is="data.is"
+ v-bind="data"
+ v-on="action.handlers">
+ {{ data.text }}
+ </Component>
+</template>
+
+<script>
+import Share from '../models/Share'
+
+export default {
+ name: 'ExternalShareAction',
+
+ props: {
+ id: {
+ type: String,
+ required: true,
+ },
+ action: {
+ type: Object,
+ default: () => ({}),
+ },
+ fileInfo: {
+ type: Object,
+ default: () => {},
+ required: true,
+ },
+ share: {
+ type: Share,
+ default: null,
+ },
+ },
+
+ computed: {
+ data() {
+ return this.action.data(this)
+ },
+ },
+}
+</script>
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 37e52850754..d860ee20805 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -285,8 +285,16 @@
@submit="onNoteSubmit" />
</template>
- <!-- external sharing via url (social...) -->
- <ActionLink v-for="({icon, url, name}, index) in externalActions"
+ <!-- external actions -->
+ <ExternalShareAction v-for="action in externalLinkActions"
+ :id="action.id"
+ :key="action.id"
+ :action="action"
+ :file-info="fileInfo"
+ :share="share" />
+
+ <!-- external legacy sharing via url (social...) -->
+ <ActionLink v-for="({icon, url, name}, index) in externalLegacyLinkActions"
:key="index"
:href="url(shareLink)"
:icon="icon"
@@ -328,15 +336,16 @@ import Vue from 'vue'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import ActionCheckbox from '@nextcloud/vue/dist/Components/ActionCheckbox'
-import ActionRadio from '@nextcloud/vue/dist/Components/ActionRadio'
import ActionInput from '@nextcloud/vue/dist/Components/ActionInput'
+import ActionLink from '@nextcloud/vue/dist/Components/ActionLink'
+import ActionRadio from '@nextcloud/vue/dist/Components/ActionRadio'
import ActionText from '@nextcloud/vue/dist/Components/ActionText'
import ActionTextEditable from '@nextcloud/vue/dist/Components/ActionTextEditable'
-import ActionLink from '@nextcloud/vue/dist/Components/ActionLink'
import Actions from '@nextcloud/vue/dist/Components/Actions'
import Avatar from '@nextcloud/vue/dist/Components/Avatar'
import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip'
+import ExternalShareAction from './ExternalShareAction'
import GeneratePassword from '../utils/GeneratePassword'
import Share from '../models/Share'
import SharesMixin from '../mixins/SharesMixin'
@@ -354,6 +363,7 @@ export default {
ActionText,
ActionTextEditable,
Avatar,
+ ExternalShareAction,
},
directives: {
@@ -381,7 +391,8 @@ export default {
publicUploadRValue: OC.PERMISSION_READ,
publicUploadWValue: OC.PERMISSION_CREATE,
- ExternalLinkActions: OCA.Sharing.ExternalLinkActions.state,
+ ExternalLegacyLinkActions: OCA.Sharing.ExternalLinkActions.state,
+ ExternalShareActions: OCA.Sharing.ExternalShareActions.state,
}
},
@@ -621,11 +632,23 @@ export default {
},
/**
- * External aditionnal actions for the menu
+ * External additionnai actions for the menu
+ * @deprecated use OCA.Sharing.ExternalShareActions
+ * @returns {Array}
+ */
+ externalLegacyLinkActions() {
+ return this.ExternalLegacyLinkActions.actions
+ },
+
+ /**
+ * Additional actions for the menu
* @returns {Array}
*/
- externalActions() {
- return this.ExternalLinkActions.actions
+ externalLinkActions() {
+ // filter only the registered actions for said link
+ return this.ExternalShareActions.actions
+ .filter(action => action.shareType.includes(OC.Share.SHARE_TYPE_LINK)
+ || action.shareType.includes(OC.Share.SHARE_TYPE_EMAIL))
},
isPasswordPolicyEnabled() {
diff --git a/apps/files_sharing/src/files_sharing_tab.js b/apps/files_sharing/src/files_sharing_tab.js
index 2c12703ab83..8a31569d6d0 100644
--- a/apps/files_sharing/src/files_sharing_tab.js
+++ b/apps/files_sharing/src/files_sharing_tab.js
@@ -28,6 +28,7 @@ import { translate as t, translatePlural as n } from '@nextcloud/l10n'
import SharingTab from './views/SharingTab'
import ShareSearch from './services/ShareSearch'
import ExternalLinkActions from './services/ExternalLinkActions'
+import ExternalShareActions from './services/ExternalShareActions'
import TabSections from './services/TabSections'
// Init Sharing Tab Service
@@ -36,6 +37,7 @@ if (!window.OCA.Sharing) {
}
Object.assign(window.OCA.Sharing, { ShareSearch: new ShareSearch() })
Object.assign(window.OCA.Sharing, { ExternalLinkActions: new ExternalLinkActions() })
+Object.assign(window.OCA.Sharing, { ExternalShareActions: new ExternalShareActions() })
Object.assign(window.OCA.Sharing, { ShareTabSections: new TabSections() })
Vue.prototype.t = t
diff --git a/apps/files_sharing/src/services/ExternalLinkActions.js b/apps/files_sharing/src/services/ExternalLinkActions.js
index 6bda05e166e..3903bec643f 100644
--- a/apps/files_sharing/src/services/ExternalLinkActions.js
+++ b/apps/files_sharing/src/services/ExternalLinkActions.js
@@ -52,6 +52,8 @@ export default class ExternalLinkActions {
* @returns {boolean}
*/
registerAction(action) {
+ console.warn('OCA.Sharing.ExternalLinkActions is deprecated, use OCA.Sharing.ExternalShareAction instead')
+
if (typeof action === 'object' && action.icon && action.name && action.url) {
this._state.actions.push(action)
return true
diff --git a/apps/files_sharing/src/services/ExternalShareActions.js b/apps/files_sharing/src/services/ExternalShareActions.js
new file mode 100644
index 00000000000..821bf479755
--- /dev/null
+++ b/apps/files_sharing/src/services/ExternalShareActions.js
@@ -0,0 +1,80 @@
+/**
+ * @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/>.
+ *
+ */
+
+export default class ExternalShareActions {
+
+ _state;
+
+ constructor() {
+ // init empty state
+ this._state = {}
+
+ // init default values
+ this._state.actions = []
+ console.debug('OCA.Sharing.ExternalShareActions initialized')
+ }
+
+ /**
+ * Get the state
+ *
+ * @readonly
+ * @memberof ExternalLinkActions
+ * @returns {Object} the data state
+ */
+ get state() {
+ return this._state
+ }
+
+ /**
+ * Register a new option/entry for the a given share type
+ *
+ * @param {Object} action new action component to register
+ * @param {string} action.id unique action id
+ * @param {Function} action.data data to bind the component to
+ * @param {Array} action.shareType list of OC.Share.SHARE_XXX to be mounted on
+ * @param {Object} action.handlers list of listeners
+ * @returns {boolean}
+ */
+ registerAction(action) {
+ // Validate action
+ if (typeof action !== 'object'
+ || typeof action.id !== 'string'
+ || typeof action.data !== 'function' // () => {disabled: true}
+ || !Array.isArray(action.shareType) // [OC.Share.SHARE_TYPE_LINK, ...]
+ || typeof action.handlers !== 'object' // {click: () => {}, ...}
+ || !Object.values(action.handlers).every(handler => typeof handler === 'function')) {
+ console.error('Invalid action provided', action)
+ return false
+ }
+
+ // Check duplicates
+ const hasDuplicate = this._state.actions.findIndex(check => check.id === action.id) > -1
+ if (hasDuplicate) {
+ console.error(`An action with the same id ${action.id} already exists`, action)
+ return false
+ }
+
+ this._state.actions.push(action)
+ return true
+ }
+
+}