From cfec900763958ae1876366a0433ff2de5b505760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Wed, 29 Jan 2020 15:50:18 +0100 Subject: [PATCH 01/17] Implement fetching newer comments and infinite loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- .../card/CardSidebarTabComments.vue | 48 ++++---- src/services/BoardApi.js | 1 + src/services/CommentApi.js | 106 ++++++------------ src/services/StackApi.js | 1 + src/store/comment.js | 102 ++++++++++------- src/store/main.js | 12 +- 6 files changed, 128 insertions(+), 142 deletions(-) diff --git a/src/components/card/CardSidebarTabComments.vue b/src/components/card/CardSidebarTabComments.vue index 9646dbab9..841fb272d 100644 --- a/src/components/card/CardSidebarTabComments.vue +++ b/src/components/card/CardSidebarTabComments.vue @@ -36,14 +36,16 @@ -
@@ -59,9 +61,10 @@ import tippy from 'tippy.js' import { Editor, EditorContent } from 'tiptap' import { Mention } from 'tiptap-extensions' -import { mapState } from 'vuex' +import { mapState, mapGetters } from 'vuex' import { Avatar } from '@nextcloud/vue' import CommentItem from './CommentItem' +import InfiniteLoading from 'vue-infinite-loading' export default { name: 'CardSidebarTabComments', @@ -69,6 +72,7 @@ export default { Avatar, CommentItem, EditorContent, + InfiniteLoading, }, props: { card: { @@ -80,9 +84,6 @@ export default { return { newComment: '', isLoading: false, - limit: 20, - offset: 0, - editor: new Editor({ extensions: [ new Mention({ @@ -176,7 +177,7 @@ export default { comments: state => state.comment.comments, currentBoard: state => state.currentBoard, }), - + ...mapGetters(['getCommentsForCard', 'hasMoreComments']), hasResults() { return this.filteredUsers.length }, @@ -193,17 +194,19 @@ export default { }, }, }, - created() { - }, - methods: { - loadComments() { + async infiniteHandler($state) { + await this.loadMore() + if (this.hasMoreComments(this.card.id)) { + $state.loaded() + } else { + $state.complete() + } + }, + async loadComments() { this.isLoading = true - this.card.limit = this.limit - this.card.offset = this.offset - this.$store.dispatch('listComments', this.card).then(response => { - this.isLoading = false - }) + await this.$store.dispatch('fetchComments', { cardId: this.card.id }) + this.isLoading = false }, createComment() { const commentObj = { @@ -215,9 +218,10 @@ export default { this.newComment = '' this.editor.setContent('') }, - loadMore() { - this.offset = this.offset + this.limit - this.loadComments() + async loadMore() { + this.isLoading = true + await this.$store.dispatch('fetchMore', { cardId: this.card.id }) + this.isLoading = false }, // navigate to the previous item diff --git a/src/services/BoardApi.js b/src/services/BoardApi.js index a148de137..164ac1716 100644 --- a/src/services/BoardApi.js +++ b/src/services/BoardApi.js @@ -21,6 +21,7 @@ */ import axios from '@nextcloud/axios' +import './../models' /** * This class handles all the api communication with the Deck backend. diff --git a/src/services/CommentApi.js b/src/services/CommentApi.js index 33fb0c1a6..775beae63 100644 --- a/src/services/CommentApi.js +++ b/src/services/CommentApi.js @@ -22,6 +22,7 @@ import axios from '@nextcloud/axios' import { getCurrentUser } from '@nextcloud/auth' +import xmlToTagList from '../helpers/xml' export class CommentApi { @@ -30,97 +31,62 @@ export class CommentApi { return OC.linkToRemote(url) } - listComments(card) { - return axios({ + async loadComments({ cardId, limit, offset }) { + const response = await axios({ method: 'REPORT', - url: this.url(`${card.id}`), + url: this.url(`${cardId}`), data: ` - ${card.limit} - ${card.offset} + ${limit} + ${offset} `, - }).then( - (response) => { - return Promise.resolve(response.data) - }, - (err) => { - return Promise.reject(err) - } - ) - .catch((err) => { - return Promise.reject(err) - }) + }) + return xmlToTagList(response.data) } - createComment(commentObj) { - return axios({ + async createComment({ cardId, comment }) { + const response = await axios({ method: 'POST', - url: this.url(`${commentObj.cardId}`), - data: { actorType: 'users', message: `${commentObj.comment}`, verb: 'comment' }, - }).then( - (response) => { - const header = response.headers['content-location'] - const headerArray = header.split('/') - const id = headerArray[headerArray.length - 1] + url: this.url(`${cardId}`), + data: { actorType: 'users', message: `${comment}`, verb: 'comment' }, + }) - const ret = { - cardId: (commentObj.cardId).toString(), - id: id, - uId: getCurrentUser().uid, - creationDateTime: (new Date()).toString(), - message: commentObj.comment, - } - return Promise.resolve(ret) - }, - (err) => { - return Promise.reject(err) - } - ) - .catch((err) => { - return Promise.reject(err) - }) + const header = response.headers['content-location'] + const headerArray = header.split('/') + const id = headerArray[headerArray.length - 1] + + const ret = { + cardId: (cardId).toString(), + id: id, + uId: getCurrentUser().uid, + creationDateTime: (new Date()).toString(), + message: comment, + } + return ret } - updateComment(data) { - return axios({ + async updateComment({ cardId, commentId, comment }) { + const response = await axios({ method: 'PROPPATCH', - url: this.url(`${data.cardId}/${data.commentId}`), + url: this.url(`${cardId}/${commentId}`), data: ` - ${data.comment} + ${comment} `, - }).then( - (response) => { - return Promise.resolve(response.data) - }, - (err) => { - return Promise.reject(err) - } - ) - .catch((err) => { - return Promise.reject(err) - }) + }) + return response.data } - deleteComment(data) { - return axios({ + async deleteComment({ cardId, commentId }) { + const response = await axios({ method: 'DELETE', - url: this.url(`${data.cardId}/${data.commentId}`), - }).then( - (response) => { - return Promise.resolve(response.data) - }, - (err) => { - return Promise.reject(err) - } - ) - .catch((err) => { - return Promise.reject(err) - }) + url: this.url(`${cardId}/${commentId}`), + }) + return response.data } } diff --git a/src/services/StackApi.js b/src/services/StackApi.js index 782088661..9cf343e9a 100644 --- a/src/services/StackApi.js +++ b/src/services/StackApi.js @@ -21,6 +21,7 @@ */ import axios from '@nextcloud/axios' +import './../models' export class StackApi { diff --git a/src/store/comment.js b/src/store/comment.js index 0aac6239e..991255a40 100644 --- a/src/store/comment.js +++ b/src/store/comment.js @@ -21,73 +21,93 @@ */ import { CommentApi } from '../services/CommentApi' -import xmlToTagList from '../helpers/xml' import Vue from 'vue' const apiClient = new CommentApi() +const COMMENT_FETCH_LIMIT = 3 + export default { state: { comments: {}, }, + getters: { + getCommentsForCard: (state) => (id) => { + if (state.comments[id]) { + return [...state.comments[id].comments].sort((a, b) => b.id - a.id) + } + return [] + }, + hasMoreComments: (state) => (cardId) => { + return state.comments[cardId] && state.comments[cardId].hasMore + }, + }, mutations: { - addComments(state, commentObj) { - if (state.comments[commentObj.cardId] === undefined) { - Vue.set(state.comments, commentObj.cardId, commentObj.comments) - } else { - // FIXME append comments once incremental fetching is implemented - // state.comments[commentObj.cardId].push(...commentObj.comments) - Vue.set(state.comments, commentObj.cardId, commentObj.comments) + endReached(state, { cardId }) { + if (state.comments[cardId]) { + state.comments[cardId].hasMore = false } }, - createComment(state, newComment) { - if (state.comments[newComment.cardId] === undefined) { - state.comments[newComment.cardId] = [] + addComments(state, { comments, cardId }) { + if (state.comments[cardId] === undefined) { + Vue.set(state.comments, cardId, { + hasMore: comments.length > 0, + comments, + }) + } else { + const newComments = comments.filter((comment) => { + return state.comments[cardId].comments.findIndex((item) => item.id === comment.id) === -1 + }) + state.comments[cardId].comments.push(...newComments) } - state.comments[newComment.cardId].push(newComment) }, updateComment(state, comment) { - const existingIndex = state.comments[comment.cardId].findIndex(_comment => _comment.id === comment.commentId) + const existingIndex = state.comments[comment.cardId].comments.findIndex(_comment => _comment.id === comment.commentId) if (existingIndex !== -1) { - state.comments[comment.cardId][existingIndex].message = comment.comment + state.comments[comment.cardId].comments[existingIndex].message = comment.comment } }, deleteComment(state, comment) { - const existingIndex = state.comments[comment.cardId].findIndex(_comment => _comment.id === comment.commentId) + const existingIndex = state.comments[comment.cardId].comments.findIndex(_comment => _comment.id === comment.commentId) if (existingIndex !== -1) { - state.comments[comment.cardId].splice(existingIndex, 1) + state.comments[comment.cardId].comments.splice(existingIndex, 1) } }, }, actions: { - listComments({ commit }, card) { - apiClient.listComments(card) - .then((comments) => { - const commentsJson = xmlToTagList(comments) - const returnObj = { - cardId: card.id, - comments: commentsJson, - } - commit('addComments', returnObj) - }) + async fetchComments({ commit }, { cardId, offset }) { + const comments = await apiClient.loadComments({ + cardId, + limit: COMMENT_FETCH_LIMIT, + offset: offset || 0, + }) + + if (comments.length < COMMENT_FETCH_LIMIT) { + commit('endReached', { cardId }) + return + } + commit('addComments', { + cardId, + comments, + }) }, - createComment({ commit }, newComment) { - apiClient.createComment(newComment) - .then((newComment) => { - commit('createComment', newComment) - }) + async fetchMore({ commit, dispatch, getters }, { cardId }) { + // fetch newer comments first + await dispatch('fetchComments', { cardId }) + await dispatch('fetchComments', { cardId, offset: getters.getCommentsForCard(cardId).length }) + }, - deleteComment({ commit }, data) { - apiClient.deleteComment(data) - .then((retVal) => { - commit('deleteComment', data) - }) + async createComment({ commit, dispatch }, { cardId, comment }) { + await apiClient.createComment({ cardId, comment }) + await dispatch('fetchComments', { cardId }) }, - updateComment({ commit }, data) { - apiClient.updateComment(data) - .then((retVal) => { - commit('updateComment', data) - }) + async deleteComment({ commit }, data) { + await apiClient.deleteComment(data) + commit('deleteComment', data) + }, + async updateComment({ commit }, data) { + await apiClient.updateComment(data) + commit('updateComment', data) }, }, } diff --git a/src/store/main.js b/src/store/main.js index fc0f27804..3440f2638 100644 --- a/src/store/main.js +++ b/src/store/main.js @@ -110,12 +110,9 @@ export default new Vuex.Store({ toggleShowArchived(state) { state.showArchived = !state.showArchived }, - /** + /* * Adds or replaces a board in the store. * Matches a board by it's id. - * - * @param state - * @param board */ addBoard(state, board) { const indexExisting = state.boards.findIndex((b) => { @@ -141,11 +138,8 @@ export default new Vuex.Store({ } }, - /** + /* * Removes the board from the store. - * - * @param state - * @param board */ removeBoard(state, board) { state.boards = state.boards.filter((b) => { @@ -207,7 +201,6 @@ export default new Vuex.Store({ } }, updateLabelFromCurrentBoard(state, newLabel) { - const labelToUpdate = state.currentBoard.labels.find((l) => { return newLabel.id === l.id }) @@ -264,6 +257,7 @@ export default new Vuex.Store({ toggleShowArchived({ commit }) { commit('toggleShowArchived') }, + /** * @param commit * @param state From 548c9a78fff89a1118ae6bd9a3d5a4fa31d8134b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Wed, 29 Jan 2020 18:01:07 +0100 Subject: [PATCH 02/17] Switch to vue-at for comment mentions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- package-lock.json | 5 + package.json | 2 + .../card/CardSidebarTabComments.vue | 249 +++++------------- src/components/card/CommentItem.vue | 18 +- src/helpers/mentions.js | 23 ++ src/helpers/xml.js | 12 + 6 files changed, 119 insertions(+), 190 deletions(-) create mode 100644 src/helpers/mentions.js diff --git a/package-lock.json b/package-lock.json index 2a3b643d8..03b296fd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18978,6 +18978,11 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" }, + "vue-at": { + "version": "2.5.0-beta.2", + "resolved": "https://registry.npmjs.org/vue-at/-/vue-at-2.5.0-beta.2.tgz", + "integrity": "sha512-WXjngEaNyNWFU9unUUdK5kGolCHgG3jmlUIgeRnKlHpskbgGjIE/HGTOWnMfLEqjYJl9DTzt/SKPWDoFVaND/A==" + }, "vue-click-outside": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/vue-click-outside/-/vue-click-outside-1.0.7.tgz", diff --git a/package.json b/package.json index b953efc15..41e5936c7 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@nextcloud/l10n": "^1.0.1", "@nextcloud/router": "^1.0.0", "@nextcloud/vue": "^1.3.0", + "escape-html": "^1.0.3", "fuse.js": "^3.4.6", "nextcloud-server": "^0.15.10", "nextcloud-vue-collections": "^0.7.1", @@ -41,6 +42,7 @@ "tiptap-extensions": "^1.28.6", "url-search-params-polyfill": "^7.0.1", "vue": "^2.6.11", + "vue-at": "^2.5.0-beta.2", "vue-click-outside": "^1.0.7", "vue-color": "^2.7.0", "vue-easymde": "^1.0.1", diff --git a/src/components/card/CardSidebarTabComments.vue b/src/components/card/CardSidebarTabComments.vue index 841fb272d..2856b0b41 100644 --- a/src/components/card/CardSidebarTabComments.vue +++ b/src/components/card/CardSidebarTabComments.vue @@ -8,11 +8,26 @@
-
- + + + + +
+
-
- -
- {{ t('deck', 'No users found') }} -
-
-
    diff --git a/src/components/card/CommentItem.vue b/src/components/card/CommentItem.vue index 273b0ac91..11efc52b3 100644 --- a/src/components/card/CommentItem.vue +++ b/src/components/card/CommentItem.vue @@ -1,12 +1,12 @@ @@ -32,6 +33,21 @@ import { Avatar, Actions, ActionButton, UserBubble } from '@nextcloud/vue' import RichText from '@juliushaertl/vue-richtext' import CommentForm from './CommentForm' +import { getCurrentUser } from '@nextcloud/auth' + +const AtMention = { + name: 'AtMention', + functional: true, + render(createElement, context) { + const { user, displayName } = context.props + return createElement( + 'span', + { attrs: { 'data-at-embedded': true, 'contenteditable': false } }, + [createElement(UserBubble, { props: { user, displayName }, attrs: { 'data-mention-id': user } })] + ) + }, +} + export default { name: 'CommentItem', components: { @@ -55,6 +71,9 @@ export default { }, computed: { + canEdit() { + return this.comment.actorId === getCurrentUser().uid + }, richText() { let message = this.parsedMessage this.comment.mentions.forEach((mention, index) => { @@ -68,7 +87,7 @@ export default { const result = mentions.reduce(function(result, item, index) { const itemKey = 'user-' + item.mentionId result[itemKey] = { - component: UserBubble, + component: AtMention, props: { user: item.mentionId, displayName: item.mentionDisplayName, @@ -88,7 +107,7 @@ export default { methods: { showUpdateForm() { - this.commentMsg = this.comment.message + this.commentMsg = this.$refs.richTextElement.$el.innerHTML this.edit = true }, hideUpdateForm() { diff --git a/src/components/cards/CardBadges.vue b/src/components/cards/CardBadges.vue index 4f5abe70c..4514ce832 100644 --- a/src/components/cards/CardBadges.vue +++ b/src/components/cards/CardBadges.vue @@ -26,7 +26,6 @@
    -
    {{ dueTime }}
    diff --git a/src/store/comment.js b/src/store/comment.js index 8b90c5978..276885e9a 100644 --- a/src/store/comment.js +++ b/src/store/comment.js @@ -77,7 +77,7 @@ export default { state.comments[cardId].comments.forEach(_comment => { Vue.set(_comment, 'isUnread', false) }) - } + }, }, actions: { async fetchComments({ commit }, { cardId, offset }) { @@ -119,6 +119,6 @@ export default { async markCommentsAsRead({ commit }, cardId) { await apiClient.markCommentsAsRead(cardId) await commit('markCommentsAsRead', cardId) - } + }, }, } From 466ce43678d8c291044af62f21d87f747b99a7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Fri, 31 Jan 2020 15:00:24 +0100 Subject: [PATCH 10/17] Cleanup dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- package-lock.json | 637 ---------------------------------------------- package.json | 7 - 2 files changed, 644 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9539f49b6..5dcd561ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3694,11 +3694,6 @@ "@types/istanbul-lib-report": "*" } }, - "@types/jquery": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.53.tgz", - "integrity": "sha512-MZKPWUhp5TKkoJ/58NSq6io+CSUCOHm2b3Z6U4+r9v70kktB0JM+eRjdp6YmDHtw0kK2XB7L2K7/FMIoziHjUA==" - }, "@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", @@ -8247,14 +8242,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "requires": { - "format": "^0.2.0" - } - }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", @@ -8799,11 +8786,6 @@ "mime-types": "^2.1.12" } }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -9433,11 +9415,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "fuse.js": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.4.6.tgz", - "integrity": "sha512-H6aJY4UpLFwxj1+5nAvufom5b2BT2v45P1MkPvdGIK8fWjQx/7o6tTT1+ALV0yawQvbmvCF0ufl2et8eJ7v7Cg==" - }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -9838,11 +9815,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "highlight.js": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.16.2.tgz", - "integrity": "sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw==" - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -12902,15 +12874,6 @@ "signal-exit": "^3.0.0" } }, - "lowlight": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.13.0.tgz", - "integrity": "sha512-bFXLa+UO1eM3zieFAcNqf6rTQ1D5ERFv64/euQbbH/LT3U9XXwH6tOrgUAGWDsQ1QgN3ZhgOcv8p3/S+qKGdTQ==", - "requires": { - "fault": "^1.0.2", - "highlight.js": "~9.16.0" - } - }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -13256,61 +13219,6 @@ "mime-db": "1.40.0" } }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -13471,14 +13379,6 @@ "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, - "nextcloud-server": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/nextcloud-server/-/nextcloud-server-0.15.10.tgz", - "integrity": "sha512-pCROf5Rz8TaIZDZMED4mJ/iUa/u03+h5r0OKBXG8Aw1Hn2GHX6SX82RD12+QMtL+5LPLxmoVNLAA8ngIUasHZQ==", - "requires": { - "@types/jquery": "^2.0.50" - } - }, "nextcloud-vue-collections": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/nextcloud-vue-collections/-/nextcloud-vue-collections-0.7.1.tgz", @@ -13804,18 +13704,6 @@ "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", "dev": true }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -14052,11 +13940,6 @@ "wordwrap": "~1.0.0" } }, - "orderedmap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.0.0.tgz", - "integrity": "sha1-2Q/Cuh7QhRkJB9YB3sbmpT+NQbo=" - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -14826,12 +14709,6 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", @@ -14904,166 +14781,6 @@ "sisteransi": "^1.0.3" } }, - "prosemirror-collab": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.2.2.tgz", - "integrity": "sha512-tBnHKMLgy5Qmx9MYVcLfs3pAyjtcqYYDd9kp3y+LSiQzkhMQDfZSV3NXWe4Gsly32adSef173BvObwfoSQL5MA==", - "requires": { - "prosemirror-state": "^1.0.0" - } - }, - "prosemirror-commands": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.2.tgz", - "integrity": "sha512-JBa06kjgX67d9JVUVJbCkxwvSGtQnWAN/85nq9csOMS5Z9WZLEvVDtVvZranNlu8l/XNVBWrZxOOK+pB03eTfA==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-dropcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz", - "integrity": "sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "prosemirror-gapcursor": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.2.tgz", - "integrity": "sha512-Z+eqk6RysZVxidGWN5aWoSTbn5bTHf1XZ+nQJVwUSdwdBVkfQMFdTHgfrXA8W5MhHHdNg/EEEYG3z3Zi/vE2QQ==", - "requires": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "prosemirror-history": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.2.tgz", - "integrity": "sha512-erhxYS5gm/6MiXP8jUoJBgc8IbaqjHDVPl9KGg5JrMZOSSOwHv85+4Fb0Q7sYtv2fYwAjOSw/kSA9vkxJ6wOwA==", - "requires": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "rope-sequence": "^1.3.0" - } - }, - "prosemirror-inputrules": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz", - "integrity": "sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-keymap": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.3.tgz", - "integrity": "sha512-PRA4NzkUMzV/NFf5pyQ6tmlIHiW/qjQ1kGWUlV2rF/dvlOxtpGpTEjIMhWgLuMf+HiDEFnUEP7uhYXu+t+491g==", - "requires": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "prosemirror-model": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.7.4.tgz", - "integrity": "sha512-yxdpPh9Uv5vAOZvmbhg4fsGUK1oHuQs69iX7cFZ0A4Y+AyMMWRCNKUt21uv84HbXb4I180l4pJE8ibaH/SwYiw==", - "requires": { - "orderedmap": "^1.0.0" - } - }, - "prosemirror-schema-list": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz", - "integrity": "sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-state": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.2.4.tgz", - "integrity": "sha512-ViXpXond3BbSL12ENARQGq3Y8igwFMbTcy96xUNK8kfIcfQRlYlgYrBPXIkHC5+QZtbPrYlpuJ2+QyeSlSX9Cw==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-tables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.0.0.tgz", - "integrity": "sha512-zFw5Us4G5Vdq0yIj8GiqZOGA6ud5UKpMKElux9O0HrfmhkuGa1jf1PCpz2R5pmIQJv+tIM24H1mox/ODBAX37Q==", - "requires": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" - }, - "dependencies": { - "orderedmap": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", - "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" - }, - "prosemirror-model": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.9.1.tgz", - "integrity": "sha512-Qblh8pm1c7Ll64sYLauwwzjimo/tFg1zW3Q3IWhKRhvfOEgRKqa6dC5pRrAa+XHOIjBFEYrqbi52J5bqA2dV8Q==", - "requires": { - "orderedmap": "^1.1.0" - } - }, - "prosemirror-state": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.2.tgz", - "integrity": "sha512-t/JqE3aR0SV9QrzFVkAXsQwsgrQBNs/BDbcFH20RssW0xauqNNdjTXxy/J/kM7F+0zYi6+BRmz7cMMQQFU3mwQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-transform": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.3.tgz", - "integrity": "sha512-PUfayeskQfuUBXktvL6207ZWRwHBFNPNPiek4fR+LgCPnBofuEb2+L0FfbNtrAwffHVs6M3DaFvJB1W2VQdV0A==", - "requires": { - "prosemirror-model": "^1.0.0" - } - } - } - }, - "prosemirror-transform": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.1.5.tgz", - "integrity": "sha512-hJyRcwykLrAAj/ziNbVK1P/ensiszWJ2fNwNiDM8ZWYiMPwM4cAd2jptj/znxJfIvaj0S0psWL1+VhKwPNJDSQ==", - "requires": { - "prosemirror-model": "^1.0.0" - } - }, - "prosemirror-utils": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", - "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==" - }, - "prosemirror-view": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.13.4.tgz", - "integrity": "sha512-mtgWEK16uYQFk3kijRlkSpAmDuy7rxYuv0pgyEBDmLT1PCPY8380CoaYnP8znUT6BXIGlJ8oTveK3M50U+B0vw==", - "requires": { - "prosemirror-model": "^1.1.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -15147,16 +14864,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -15964,11 +15671,6 @@ "inherits": "^2.0.1" } }, - "rope-sequence": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", - "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" - }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -16893,15 +16595,6 @@ "kind-of": "^3.2.0" } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -17111,12 +16804,6 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, "string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", @@ -18057,307 +17744,6 @@ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" }, - "tippy.js": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-4.3.5.tgz", - "integrity": "sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA==", - "requires": { - "popper.js": "^1.14.7" - } - }, - "tiptap": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/tiptap/-/tiptap-1.26.6.tgz", - "integrity": "sha512-U5qyYZi5IH7LhYwYrStRBp5MxF5MiGFLt9ogOAF/0N/LIg0XwVwe/AaSx0UH/s4dY7R8OvEa9u4qimO08Wp1LA==", - "requires": { - "prosemirror-commands": "1.1.2", - "prosemirror-dropcursor": "1.3.2", - "prosemirror-gapcursor": "1.1.2", - "prosemirror-inputrules": "1.1.2", - "prosemirror-keymap": "1.1.3", - "prosemirror-model": "1.8.2", - "prosemirror-state": "1.3.2", - "prosemirror-view": "1.13.4", - "tiptap-commands": "^1.12.5", - "tiptap-utils": "^1.8.3" - }, - "dependencies": { - "orderedmap": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", - "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" - }, - "prosemirror-model": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.8.2.tgz", - "integrity": "sha512-piffokzW7opZVCjf/9YaoXvTC0g7zMRWKJib1hpphPfC+4x6ZXe5CiExgycoWZJe59VxxP7uHX8aFiwg2i9mUQ==", - "requires": { - "orderedmap": "^1.1.0" - } - }, - "prosemirror-state": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.2.tgz", - "integrity": "sha512-t/JqE3aR0SV9QrzFVkAXsQwsgrQBNs/BDbcFH20RssW0xauqNNdjTXxy/J/kM7F+0zYi6+BRmz7cMMQQFU3mwQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - } - } - }, - "tiptap-commands": { - "version": "1.12.5", - "resolved": "https://registry.npmjs.org/tiptap-commands/-/tiptap-commands-1.12.5.tgz", - "integrity": "sha512-wzQCH3CL1VWy6E47Hy+9kt882w7SND+FD9e9xAAsYhG/QI0cmuvAf/8doZZhUmYwkraYeF7/2bU04IXr36t44Q==", - "requires": { - "prosemirror-commands": "1.1.2", - "prosemirror-inputrules": "1.1.2", - "prosemirror-model": "1.8.2", - "prosemirror-schema-list": "1.1.2", - "prosemirror-state": "1.3.2", - "prosemirror-tables": "1.0.0", - "prosemirror-utils": "0.9.6", - "tiptap-utils": "^1.8.3" - }, - "dependencies": { - "orderedmap": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", - "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" - }, - "prosemirror-model": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.8.2.tgz", - "integrity": "sha512-piffokzW7opZVCjf/9YaoXvTC0g7zMRWKJib1hpphPfC+4x6ZXe5CiExgycoWZJe59VxxP7uHX8aFiwg2i9mUQ==", - "requires": { - "orderedmap": "^1.1.0" - } - }, - "prosemirror-state": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.2.tgz", - "integrity": "sha512-t/JqE3aR0SV9QrzFVkAXsQwsgrQBNs/BDbcFH20RssW0xauqNNdjTXxy/J/kM7F+0zYi6+BRmz7cMMQQFU3mwQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - } - } - }, - "tiptap-extensions": { - "version": "1.28.6", - "resolved": "https://registry.npmjs.org/tiptap-extensions/-/tiptap-extensions-1.28.6.tgz", - "integrity": "sha512-hkYKJHxkqmeIRyuOaVvsrC/IcoXZmBw/Gx4JJHPiCAKvLQyjgYZpNjbVH9nIgdlxLvVjFDVBoPWGHy00qGp8qQ==", - "requires": { - "lowlight": "1.13.0", - "prosemirror-collab": "1.2.2", - "prosemirror-history": "1.1.2", - "prosemirror-model": "1.8.2", - "prosemirror-state": "1.3.2", - "prosemirror-tables": "1.0.0", - "prosemirror-transform": "1.2.2", - "prosemirror-utils": "0.9.6", - "prosemirror-view": "1.13.4", - "tiptap": "^1.26.6", - "tiptap-commands": "^1.12.5" - }, - "dependencies": { - "orderedmap": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", - "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" - }, - "prosemirror-commands": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.2.tgz", - "integrity": "sha512-JBa06kjgX67d9JVUVJbCkxwvSGtQnWAN/85nq9csOMS5Z9WZLEvVDtVvZranNlu8l/XNVBWrZxOOK+pB03eTfA==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-dropcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz", - "integrity": "sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "prosemirror-gapcursor": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.2.tgz", - "integrity": "sha512-Z+eqk6RysZVxidGWN5aWoSTbn5bTHf1XZ+nQJVwUSdwdBVkfQMFdTHgfrXA8W5MhHHdNg/EEEYG3z3Zi/vE2QQ==", - "requires": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "prosemirror-inputrules": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz", - "integrity": "sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-keymap": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.3.tgz", - "integrity": "sha512-PRA4NzkUMzV/NFf5pyQ6tmlIHiW/qjQ1kGWUlV2rF/dvlOxtpGpTEjIMhWgLuMf+HiDEFnUEP7uhYXu+t+491g==", - "requires": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "prosemirror-model": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.8.2.tgz", - "integrity": "sha512-piffokzW7opZVCjf/9YaoXvTC0g7zMRWKJib1hpphPfC+4x6ZXe5CiExgycoWZJe59VxxP7uHX8aFiwg2i9mUQ==", - "requires": { - "orderedmap": "^1.1.0" - } - }, - "prosemirror-schema-list": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz", - "integrity": "sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-state": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.2.tgz", - "integrity": "sha512-t/JqE3aR0SV9QrzFVkAXsQwsgrQBNs/BDbcFH20RssW0xauqNNdjTXxy/J/kM7F+0zYi6+BRmz7cMMQQFU3mwQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-tables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.0.0.tgz", - "integrity": "sha512-zFw5Us4G5Vdq0yIj8GiqZOGA6ud5UKpMKElux9O0HrfmhkuGa1jf1PCpz2R5pmIQJv+tIM24H1mox/ODBAX37Q==", - "requires": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" - } - }, - "prosemirror-transform": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.2.tgz", - "integrity": "sha512-expO11jAsxaHk2RdZtzPsumc1bAAZi4UiXwTLQbftsdnIUWZE5Snyag595p1lx/B8QHUZ6tYWWOaOkzXKoJmYw==", - "requires": { - "prosemirror-model": "^1.0.0" - } - }, - "prosemirror-view": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.13.4.tgz", - "integrity": "sha512-mtgWEK16uYQFk3kijRlkSpAmDuy7rxYuv0pgyEBDmLT1PCPY8380CoaYnP8znUT6BXIGlJ8oTveK3M50U+B0vw==", - "requires": { - "prosemirror-model": "^1.1.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "tiptap": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/tiptap/-/tiptap-1.26.6.tgz", - "integrity": "sha512-U5qyYZi5IH7LhYwYrStRBp5MxF5MiGFLt9ogOAF/0N/LIg0XwVwe/AaSx0UH/s4dY7R8OvEa9u4qimO08Wp1LA==", - "requires": { - "prosemirror-commands": "1.1.2", - "prosemirror-dropcursor": "1.3.2", - "prosemirror-gapcursor": "1.1.2", - "prosemirror-inputrules": "1.1.2", - "prosemirror-keymap": "1.1.3", - "prosemirror-model": "1.8.2", - "prosemirror-state": "1.3.2", - "prosemirror-view": "1.13.4", - "tiptap-commands": "^1.12.5", - "tiptap-utils": "^1.8.3" - } - }, - "tiptap-commands": { - "version": "1.12.5", - "resolved": "https://registry.npmjs.org/tiptap-commands/-/tiptap-commands-1.12.5.tgz", - "integrity": "sha512-wzQCH3CL1VWy6E47Hy+9kt882w7SND+FD9e9xAAsYhG/QI0cmuvAf/8doZZhUmYwkraYeF7/2bU04IXr36t44Q==", - "requires": { - "prosemirror-commands": "1.1.2", - "prosemirror-inputrules": "1.1.2", - "prosemirror-model": "1.8.2", - "prosemirror-schema-list": "1.1.2", - "prosemirror-state": "1.3.2", - "prosemirror-tables": "1.0.0", - "prosemirror-utils": "0.9.6", - "tiptap-utils": "^1.8.3" - } - }, - "tiptap-utils": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/tiptap-utils/-/tiptap-utils-1.8.3.tgz", - "integrity": "sha512-SgqDTCA5ux17KKTpEV2YC54ugBWU2jzpiFlCmVckPjYl5BhmOwuJ1Q5H/8v/XGcnHDqP31Ui4lk31Vts4NmtTA==", - "requires": { - "prosemirror-model": "1.8.2", - "prosemirror-state": "1.3.2", - "prosemirror-tables": "1.0.0", - "prosemirror-utils": "0.9.6" - } - }, - "w3c-keyname": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.2.tgz", - "integrity": "sha512-8Vs/aVwcy0IJACaPm4tyzh1fzehZE70bGSjEl3dDms5UXtWnaBElrSHC8lDDeak0Gk5jxKOFstL64/65o7Ge2A==" - } - } - }, - "tiptap-utils": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/tiptap-utils/-/tiptap-utils-1.8.3.tgz", - "integrity": "sha512-SgqDTCA5ux17KKTpEV2YC54ugBWU2jzpiFlCmVckPjYl5BhmOwuJ1Q5H/8v/XGcnHDqP31Ui4lk31Vts4NmtTA==", - "requires": { - "prosemirror-model": "1.8.2", - "prosemirror-state": "1.3.2", - "prosemirror-tables": "1.0.0", - "prosemirror-utils": "0.9.6" - }, - "dependencies": { - "orderedmap": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", - "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" - }, - "prosemirror-model": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.8.2.tgz", - "integrity": "sha512-piffokzW7opZVCjf/9YaoXvTC0g7zMRWKJib1hpphPfC+4x6ZXe5CiExgycoWZJe59VxxP7uHX8aFiwg2i9mUQ==", - "requires": { - "orderedmap": "^1.1.0" - } - }, - "prosemirror-state": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.2.tgz", - "integrity": "sha512-t/JqE3aR0SV9QrzFVkAXsQwsgrQBNs/BDbcFH20RssW0xauqNNdjTXxy/J/kM7F+0zYi6+BRmz7cMMQQFU3mwQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - } - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -19147,11 +18533,6 @@ "browser-process-hrtime": "^0.1.2" } }, - "w3c-keyname": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.2.tgz", - "integrity": "sha512-8Vs/aVwcy0IJACaPm4tyzh1fzehZE70bGSjEl3dDms5UXtWnaBElrSHC8lDDeak0Gk5jxKOFstL64/65o7Ge2A==" - }, "w3c-xmlserializer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", @@ -19804,24 +19185,6 @@ "lodash": "^4.17.15" } }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", diff --git a/package.json b/package.json index e3d9bf499..5d7b321a4 100644 --- a/package.json +++ b/package.json @@ -34,13 +34,7 @@ "@nextcloud/l10n": "^1.0.1", "@nextcloud/router": "^1.0.0", "@nextcloud/vue": "^1.3.0", - "escape-html": "^1.0.3", - "fuse.js": "^3.4.6", - "nextcloud-server": "^0.15.10", "nextcloud-vue-collections": "^0.7.1", - "tippy.js": "^4.3.5", - "tiptap": "^1.26.6", - "tiptap-extensions": "^1.28.6", "url-search-params-polyfill": "^7.0.1", "vue": "^2.6.11", "vue-at": "^2.5.0-beta.2", @@ -83,7 +77,6 @@ "file-loader": "^5.0.2", "jest": "^25.1.0", "jest-serializer-vue": "^2.0.2", - "mini-css-extract-plugin": "^0.9.0", "node-sass": "^4.13.1", "raw-loader": "^4.0.0", "sass-loader": "^8.0.2", From 6bbf01756d0b5ece37af10dc4e7914aef265d18c Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 1 Feb 2020 02:28:20 +0000 Subject: [PATCH 11/17] [tx-robot] updated from transifex --- l10n/sv.js | 7 +++++++ l10n/sv.json | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/l10n/sv.js b/l10n/sv.js index 7ee8a9379..c942fe9d2 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -106,6 +106,8 @@ OC.L10N.register( "Select a card" : "Välj ett kort", "Link to card" : "Länka till kort", "Cancel" : "Avbryt", + "Add new list" : "Lägg till en ny lista", + "List name" : "Namn på lista", "Show archived cards" : "Visa arkiverade kort", "Hide archived cards" : "Göm arkiverade kort", "Toggle compact mode" : "Växla kompakt läge", @@ -127,10 +129,13 @@ OC.L10N.register( "Can manage" : "Kan hanter", "Delete" : "Radera", "Add a new stack" : "Lägg till en ny stapel", + "Delete list" : "Radera lista", "Add card" : "Lägg till kort", + "Add a new card" : "Lägg till ett nytt kort", "Edit" : "Redigera", "Add a new label" : "Lägg till en ny etikett", "title and color value must be provided" : "titel och färg måste anges", + "Load More" : "Ladda mer", "Details" : "Detaljer", "Assign a tag to this card…" : "Tilldela en tagg till det här kortet ...", "Assign to users" : "Tilldela till användare", @@ -147,6 +152,8 @@ OC.L10N.register( "Upload attachment" : "Ladda upp bilaga", "New comment" : "Ny kommentar", "Save" : "Spara", + "No users found" : "Inga användare hittades", + "No comments yet. Begin the discussion!" : "Inga kommentarer än. Börja diskussionen!", "Update" : "Uppdatera", "Assign to me" : "Tilldela till mig", "Delete card" : "Ta bort kort", diff --git a/l10n/sv.json b/l10n/sv.json index 333303c62..c923e7405 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -104,6 +104,8 @@ "Select a card" : "Välj ett kort", "Link to card" : "Länka till kort", "Cancel" : "Avbryt", + "Add new list" : "Lägg till en ny lista", + "List name" : "Namn på lista", "Show archived cards" : "Visa arkiverade kort", "Hide archived cards" : "Göm arkiverade kort", "Toggle compact mode" : "Växla kompakt läge", @@ -125,10 +127,13 @@ "Can manage" : "Kan hanter", "Delete" : "Radera", "Add a new stack" : "Lägg till en ny stapel", + "Delete list" : "Radera lista", "Add card" : "Lägg till kort", + "Add a new card" : "Lägg till ett nytt kort", "Edit" : "Redigera", "Add a new label" : "Lägg till en ny etikett", "title and color value must be provided" : "titel och färg måste anges", + "Load More" : "Ladda mer", "Details" : "Detaljer", "Assign a tag to this card…" : "Tilldela en tagg till det här kortet ...", "Assign to users" : "Tilldela till användare", @@ -145,6 +150,8 @@ "Upload attachment" : "Ladda upp bilaga", "New comment" : "Ny kommentar", "Save" : "Spara", + "No users found" : "Inga användare hittades", + "No comments yet. Begin the discussion!" : "Inga kommentarer än. Börja diskussionen!", "Update" : "Uppdatera", "Assign to me" : "Tilldela till mig", "Delete card" : "Ta bort kort", From 7a2f9f9b342dcd59a7fa5875441fe36a31ca9e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Sat, 1 Feb 2020 13:50:18 +0100 Subject: [PATCH 12/17] Add FIXME about space in username MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- src/components/card/CommentForm.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/card/CommentForm.vue b/src/components/card/CommentForm.vue index 7a1b909f8..64af6929d 100644 --- a/src/components/card/CommentForm.vue +++ b/src/components/card/CommentForm.vue @@ -131,7 +131,9 @@ export default { // FIXME Adding a space after the mention should be improved to // do it or not based on the next element instead of always // adding it. - mention.replaceWith(' @' + mention.firstElementChild.attributes['data-mention-id'].value + ' ') + // FIXME user names can contain spaces, in that case they need to be wrapped @"user name" [a-zA-Z0-9\ _\.@\-']+ + const mentionValue = mention.firstElementChild.attributes['data-mention-id'].value + mention.replaceWith(' @' + mentionValue + ' ') }) return rawToParsed(node.innerHTML) From dc904f421c50d281541fd9f82121d7295029af9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Sat, 1 Feb 2020 14:45:42 +0100 Subject: [PATCH 13/17] Cleanup imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- package.json | 7 +++---- src/components/board/BoardSidebar.vue | 3 +-- src/components/board/SharingTabSidebar.vue | 6 +----- src/components/board/Stack.vue | 3 +-- src/components/board/TagsTabSidebar.vue | 2 +- src/components/boards/BoardItem.vue | 2 +- src/components/card/CardSidebar.vue | 9 +-------- src/components/cards/AvatarList.vue | 5 ++--- src/components/cards/CardItem.vue | 5 +---- src/components/navigation/AppNavigation.vue | 2 +- src/components/navigation/AppNavigationAddBoard.vue | 3 ++- src/components/navigation/AppNavigationBoard.vue | 3 +-- src/main.js | 2 +- 13 files changed, 17 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 5d7b321a4..576fa7a71 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "license": "agpl", "private": true, "scripts": { - "dev": "webpack --config webpack.dev.js", - "watch": "webpack --progress --watch --config webpack.dev.js", - "build": "webpack --progress --hide-modules --config webpack.prod.js", + "dev": "NODE_ENV=development webpack --config webpack.dev.js", + "watch": "NODE_ENV=development webpack --progress --watch --config webpack.dev.js", + "build": "NODE_ENV=production webpack --progress --hide-modules --config webpack.prod.js", "lint": "eslint --ext .js,.vue src", "lint:fix": "eslint --ext .js,.vue src --fix", "test": "jest", @@ -39,7 +39,6 @@ "vue": "^2.6.11", "vue-at": "^2.5.0-beta.2", "vue-click-outside": "^1.0.7", - "vue-color": "^2.7.0", "vue-easymde": "^1.0.1", "vue-infinite-loading": "^2.4.4", "vue-router": "^3.1.5", diff --git a/src/components/board/BoardSidebar.vue b/src/components/board/BoardSidebar.vue index c7a03e1b3..ba58d0295 100644 --- a/src/components/board/BoardSidebar.vue +++ b/src/components/board/BoardSidebar.vue @@ -62,8 +62,7 @@ import SharingTabSidebar from './SharingTabSidebar' import TagsTabSidebar from './TagsTabSidebar' import DeletedTabSidebar from './DeletedTabSidebar' import TimelineTabSidebar from './TimelineTabSidebar' -import { AppSidebar } from '@nextcloud/vue/dist/Components/AppSidebar' -import { AppSidebarTab } from '@nextcloud/vue/dist/Components/AppSidebarTab' +import { AppSidebar, AppSidebarTab } from '@nextcloud/vue' export default { name: 'BoardSidebar', diff --git a/src/components/board/SharingTabSidebar.vue b/src/components/board/SharingTabSidebar.vue index d31ea8619..53bb7e402 100644 --- a/src/components/board/SharingTabSidebar.vue +++ b/src/components/board/SharingTabSidebar.vue @@ -58,11 +58,7 @@