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 @@ + + + + + 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" /> - - + + + + 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æ + * + * @author John Molakvoæ + * + * @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 . + * + */ + +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 + } + +}