diff --git a/src/components/card/CardSidebar.vue b/src/components/card/CardSidebar.vue index b1c285651..2060c0c0a 100644 --- a/src/components/card/CardSidebar.vue +++ b/src/components/card/CardSidebar.vue @@ -33,10 +33,17 @@ {{ t('deck', 'Open in sidebar view') }} - {{ t('deck', 'Open in bigger view') }} + + + {{ action.label }} + import { ActionButton, AppSidebar, AppSidebarTab } from '@nextcloud/vue' +import { generateUrl } from '@nextcloud/router' import { mapState, mapGetters } from 'vuex' import CardSidebarTabDetails from './CardSidebarTabDetails' import CardSidebarTabAttachments from './CardSidebarTabAttachments' @@ -114,7 +122,7 @@ export default { currentBoard: state => state.currentBoard, cardDetailsInModal: state => state.cardDetailsInModal, }), - ...mapGetters(['canEdit', 'assignables']), + ...mapGetters(['canEdit', 'assignables', 'cardActions', 'stackById']), title() { return this.titleEditable ? this.titleEditing : this.currentCard.title }, @@ -124,6 +132,15 @@ export default { subtitle() { return t('deck', 'Modified') + ': ' + this.relativeDate(this.currentCard.lastModified * 1000) + ' ' + t('deck', 'Created') + ': ' + this.relativeDate(this.currentCard.createdAt * 1000) }, + cardRichObject() { + return { + id: '' + this.currentCard.id, + name: this.currentCard.title, + boardname: this.currentBoard.title, + stackname: this.stackById(this.currentCard.stackId)?.title, + link: window.location.protocol + '//' + window.location.host + generateUrl('/apps/deck/') + `#/board/${this.currentBoard.id}/card/${this.currentCard.id}`, + } + }, }, methods: { handleUpdateTitleEditable(value) { diff --git a/src/main.js b/src/main.js index 710e31c59..3ac1249dd 100644 --- a/src/main.js +++ b/src/main.js @@ -103,3 +103,40 @@ new Vue({ }, render: h => h(App), }) + +if (!window.OCA.Deck) { + window.OCA.Deck = {} +} + +/** + * @typedef {Object} CardRichObject + * @property {string} id + * @property {string} name + * @property {string} boardname + * @property {string} stackname + * @property {string} link + */ + +/** + * @callback registerActionCallback + * @param {CardRichObject} card + */ + +/** + * Frontend message API for adding actions to talk messages. + * @param {*} Object the wrapping object. + * @param {String} label the action label. + * @param {registerActionCallback} callback the callback function. This function will receive + * the card as a parameter and be triggered by a click on the + * action. The card parameter will be of the format of a rich object string + * type "deck-card" + * @param {String} icon the action label. E.g. "icon-reply" + */ +window.OCA.Deck.registerCardAction = ({ label, callback, icon }) => { + const cardAction = { + label, + callback, + icon, + } + store.dispatch('addCardAction', cardAction) +} diff --git a/src/store/actions.js b/src/store/actions.js new file mode 100644 index 000000000..722d778ca --- /dev/null +++ b/src/store/actions.js @@ -0,0 +1,42 @@ +/* + * @copyright Copyright (c) 2021 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 . + * + */ + +export default { + state: { + actions: { + card: [], + }, + }, + getters: { + cardActions: (state) => state.actions.card, + }, + mutations: { + ADD_CARD_ACTION(state, action) { + state.actions.card.push(action) + }, + }, + actions: { + async addCardAction({ commit }, action) { + commit('ADD_CARD_ACTION', action) + }, + }, +} diff --git a/src/store/main.js b/src/store/main.js index 4987421b2..b36dc942c 100644 --- a/src/store/main.js +++ b/src/store/main.js @@ -28,6 +28,7 @@ import Vuex from 'vuex' import axios from '@nextcloud/axios' import { generateOcsUrl } from '@nextcloud/router' import { BoardApi } from '../services/BoardApi' +import actions from './actions' import stack from './stack' import card from './card' import comment from './comment' @@ -47,6 +48,7 @@ export const BOARD_FILTERS = { export default new Vuex.Store({ modules: { + actions, stack, card, comment, diff --git a/src/store/stack.js b/src/store/stack.js index 3f428e71f..bbb0486be 100644 --- a/src/store/stack.js +++ b/src/store/stack.js @@ -34,6 +34,9 @@ export default { stacksByBoard: state => (id) => { return state.stacks.filter((stack) => stack.boardId === id).sort((a, b) => a.order - b.order) }, + stackById: state => (id) => { + return state.stacks.find((stack) => stack.id === id) + }, }, mutations: { addStack(state, stack) {