diff --git a/apps/files_sharing/src/collaborationresources.js b/apps/files_sharing/src/collaborationresources.js new file mode 100644 index 00000000000..3b0a12c5b2b --- /dev/null +++ b/apps/files_sharing/src/collaborationresources.js @@ -0,0 +1,108 @@ +/* + * @copyright Copyright (c) 2019 Julius Härtl + * + * @author Julius Härtl + * + * @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 . + * + */ + +import Vue from 'vue' +import { PopoverMenu } from 'nextcloud-vue' +import ClickOutside from 'vue-click-outside' +import { VTooltip } from 'v-tooltip' + +Vue.prototype.t = t; + +Vue.component('PopoverMenu', PopoverMenu) +Vue.directive('ClickOutside', ClickOutside) +Vue.directive('Tooltip', VTooltip) + +import View from './views/CollaborationView' + +let selectAction = {}; +let icons = {}; +let types = {}; + +window.Collaboration = { + /** + * + * @param type + * @param {callback} selectCallback should return a promise + */ + registerType(type, typeDefinition) { + types[type] = typeDefinition; + }, + trigger(type) { + return types[type].action() + }, + getTypes() { + return Object.keys(types); + }, + getIcon(type) { + return types[type].icon; + }, + getLabel(type) { + return t('files_sharing', 'Link to a {label}', { label: types[type].typeString || type }, 1) + }, + getLink(type, id) { + /* TODO: Allow action to be executed instead of href as well */ + return types[type].link(id); + } +} + +window.Collaboration.registerType('files', { + action: () => { + return new Promise((resolve, reject) => { + OC.dialogs.filepicker('Link to a file', function (f) { + const client = OC.Files.getClient(); + client.getFileInfo(f).then((status, fileInfo) => { + resolve(fileInfo.id) + }, () => { + reject() + }) + }, false); + }) + }, + link: (id) => OC.generateUrl('/f/') + id, + icon: 'nav-icon-files', + /** used in "Link to a {typeString}" */ + typeString: 'file' +}); + +/* TODO: temporary data for testing */ +window.Collaboration.registerType('calendar', { + action: () => { + return new Promise((resolve, reject) => { + var id = window.prompt("calendar id", "1"); + resolve(id); + }) + }, + icon: 'icon-calendar-dark', + typeName: 'calendar', +}); +window.Collaboration.registerType('contact', { + action: () => { + return new Promise((resolve, reject) => { + var id = window.prompt("contacts id", "1"); + resolve(id); + }) + }, + icon: 'icon-contacts-dark', + typeName: 'contact', +}); + +export { Vue, View } diff --git a/apps/files_sharing/src/components/CollectionListItem.vue b/apps/files_sharing/src/components/CollectionListItem.vue new file mode 100644 index 00000000000..8819497ca66 --- /dev/null +++ b/apps/files_sharing/src/components/CollectionListItem.vue @@ -0,0 +1,158 @@ + + + + + + + diff --git a/apps/files_sharing/src/services/collections.js b/apps/files_sharing/src/services/collections.js new file mode 100644 index 00000000000..bd45b8f3c32 --- /dev/null +++ b/apps/files_sharing/src/services/collections.js @@ -0,0 +1,59 @@ +/* + * @copyright Copyright (c) 2019 Julius Härtl + * + * @author Julius Härtl + * + * @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 . + * + */ + +import axios from 'nextcloud-axios'; + +class Service { + constructor() { + this.service = axios.create(); + } + + listCollection(collectionId) { + return this.service.get(`/collaboration/resources/collections/${collectionId}`) + } + + addResource(collectionId, resource) { + return this.service.post(`/collaboration/resources/collections/${collectionId}`) + } + + removeResource() { + return this.service.post(`/collaboration/resources/collections/${collectionId}`) + } + + createCollectionOnResource(resourceType, resourceId) { + return this.service.post(`/collaboration/resources/${resourceType}/${resourceId}`) + } + + getCollectionByResource(resourceType, resourceId) { + return this.service.get(`/collaboration/resources/${resourceType}/${resourceId}`) + } + + getProviders() { + + } + + search() { + + } +} + +export default new Service; diff --git a/apps/files_sharing/src/sharetabview.js b/apps/files_sharing/src/sharetabview.js index 4ac09ff9f79..8f8a655b00e 100644 --- a/apps/files_sharing/src/sharetabview.js +++ b/apps/files_sharing/src/sharetabview.js @@ -83,6 +83,18 @@ self.trigger('sharesChanged', shareModel); }); + import('./../src/collaborationresources').then((Resources) => { + var vm = new Resources.Vue({ + el: '#collaborationResources', + render: h => h(Resources.View), + data: { + model: this.model.toJSON() + }, + }); + this.model.on('change', () => { vm.data = this.model.toJSON() }) + + }) + } else { this.$el.empty(); // TODO: render placeholder text? diff --git a/apps/files_sharing/src/views/CollaborationView.vue b/apps/files_sharing/src/views/CollaborationView.vue new file mode 100644 index 00000000000..e5431ba580e --- /dev/null +++ b/apps/files_sharing/src/views/CollaborationView.vue @@ -0,0 +1,184 @@ + + + + + +