diff --git a/.drone.yml b/.drone.yml
index eaa7556ba..e0cc61ad6 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -225,6 +225,10 @@ trigger:
kind: pipeline
name: frontend
steps:
+ - name: install
+ image: node:11-alpine
+ commands:
+ - npm install
- name: eslint
image: node:11-alpine
commands:
@@ -232,7 +236,6 @@ steps:
- name: jsbuild
image: node:11-alpine
commands:
- - npm install
- npm run build
trigger:
branch:
diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue
index 625fee610..3a5234a00 100644
--- a/src/components/Sidebar.vue
+++ b/src/components/Sidebar.vue
@@ -21,9 +21,7 @@
-->
-
+
-
-
diff --git a/src/components/board/DeletedTabSidebard.vue b/src/components/board/DeletedTabSidebard.vue
new file mode 100644
index 000000000..eb4076b14
--- /dev/null
+++ b/src/components/board/DeletedTabSidebard.vue
@@ -0,0 +1,26 @@
+
+
+ deleted
+
+
+
+
diff --git a/src/components/board/SharingTabSidebard.vue b/src/components/board/SharingTabSidebard.vue
new file mode 100644
index 000000000..da5e75e36
--- /dev/null
+++ b/src/components/board/SharingTabSidebard.vue
@@ -0,0 +1,65 @@
+
+
+
+
+ {{ scope.option.label }}
+
+
+
+
+ -
+
+
+ {{ board.owner.displayname }}
+
+
+ -
+
+
+ {{ acl.participant.displayname }}
+
+
+
+
+
+
+
diff --git a/src/components/board/TagsTabSidebard.vue b/src/components/board/TagsTabSidebard.vue
new file mode 100644
index 000000000..6b79db502
--- /dev/null
+++ b/src/components/board/TagsTabSidebard.vue
@@ -0,0 +1,164 @@
+
+
+
+ -
+
+
+
+
+
+
+ {{ label.title }}
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/board/TimelineTabSidebard.vue b/src/components/board/TimelineTabSidebard.vue
new file mode 100644
index 000000000..ff9cd5526
--- /dev/null
+++ b/src/components/board/TimelineTabSidebard.vue
@@ -0,0 +1,26 @@
+
+
+ timeline
+
+
+
+
diff --git a/src/mixins/color.js b/src/mixins/color.js
index 43d2b5cf2..fbc90580a 100644
--- a/src/mixins/color.js
+++ b/src/mixins/color.js
@@ -81,6 +81,15 @@ export default {
return '#000000'
}
+ },
+ colorIsValid(hex) {
+
+ var re = new RegExp('[A-Fa-f0-9]{6}')
+ if (re.test(hex)) {
+ return true
+ }
+ return false
+
}
}
diff --git a/src/models/index.js b/src/models/index.js
index 4649a5e57..10da0feee 100644
--- a/src/models/index.js
+++ b/src/models/index.js
@@ -46,3 +46,10 @@
* @property {boolean} archived
* @property {number} order
*/
+/**
+ * Label model
+ *
+ * @typedef {Object} Label
+ * @property {String} title
+ * @property {String} color
+ */
diff --git a/src/services/BoardApi.js b/src/services/BoardApi.js
index ebb493168..8f8efb23f 100644
--- a/src/services/BoardApi.js
+++ b/src/services/BoardApi.js
@@ -135,4 +135,50 @@ export class BoardApi {
})
}
+ // Label API Calls
+ deleteLabel(id) {
+ return axios.delete(this.url(`/labels/${id}`))
+ .then(
+ (response) => {
+ return Promise.resolve(response.data)
+ },
+ (err) => {
+ return Promise.reject(err)
+ }
+ )
+ .catch((err) => {
+ return Promise.reject(err)
+ })
+ }
+
+ updateLabel(label) {
+ return axios.put(this.url(`/labels/${label.id}`), label)
+ .then(
+ (response) => {
+ return Promise.resolve(response.data)
+ },
+ (err) => {
+ return Promise.reject(err)
+ }
+ )
+ .catch((err) => {
+ return Promise.reject(err)
+ })
+ }
+
+ createLabel(labelData) {
+ return axios.post(this.url('/labels'), labelData)
+ .then(
+ (response) => {
+ return Promise.resolve(response.data)
+ },
+ (err) => {
+ return Promise.reject(err)
+ }
+ )
+ .catch((err) => {
+ return Promise.reject(err)
+ })
+ }
+
}
diff --git a/src/store/main.js b/src/store/main.js
index a31610595..1cb946e12 100644
--- a/src/store/main.js
+++ b/src/store/main.js
@@ -51,12 +51,16 @@ export default new Vuex.Store({
sidebarShown: false,
currentBoard: null,
boards: [],
+ sharees: [],
boardFilter: BOARD_FILTERS.ALL
},
getters: {
boards: state => {
return state.boards
},
+ sharees: state => {
+ return state.sharees
+ },
noneArchivedBoards: state => {
return state.boards.filter(board => {
return board.archived === false && !board.deletedAt
@@ -80,6 +84,9 @@ export default new Vuex.Store({
|| (state.boardFilter === BOARD_FILTERS.SHARED && board.shared === 1)
})
return boards.map(boardToMenuItem)
+ },
+ currentBoardLabels: state => {
+ return state.currentBoard.labels
}
},
mutations: {
@@ -132,6 +139,30 @@ export default new Vuex.Store({
},
setCurrentBoard(state, board) {
state.currentBoard = board
+ },
+
+ // label mutators
+ removeLabelFromCurrentBoard(state, labelId) {
+ const removeIndex = state.currentBoard.labels.findIndex((l) => {
+ return labelId === l.id
+ })
+
+ if (removeIndex > -1) {
+ state.currentBoard.labels.splice(removeIndex, 1)
+ }
+ },
+ updateLabelFromCurrentBoard(state, newLabel) {
+
+ let labelToUpdate = state.currentBoard.labels.find((l) => {
+ return newLabel.id === l.id
+ })
+
+ labelToUpdate.title = newLabel.title
+ labelToUpdate.color = newLabel.color
+ },
+ addLabelToCurrentBoard(state, newLabel) {
+
+ state.currentBoard.labels.push(newLabel)
}
},
actions: {
@@ -185,14 +216,15 @@ export default new Vuex.Store({
const boards = await apiClient.loadBoards()
commit('setBoards', boards)
},
- async loadSharees({ commit }) {
- const params = {
- format: 'json',
- perPage: 4,
- itemType: [0, 1]
- }
- const { data } = await axios.get(OC.linkToOCS('apps/files_sharing/api/v1') + 'sharees', { params })
- commit('setSharees', data.users)
+ loadSharees({ commit }) {
+ const params = new URLSearchParams()
+ params.append('format', 'json')
+ params.append('perPage', 4)
+ params.append('itemType', 0)
+ params.append('itemType', 1)
+ axios.get(OC.linkToOCS('apps/files_sharing/api/v1') + 'sharees', { params }).then((response) => {
+ commit('setSharees', response.data.ocs.data.users)
+ })
},
setBoardFilter({ commmit }, filter) {
commmit('setBoardFilter', filter)
@@ -208,6 +240,27 @@ export default new Vuex.Store({
},
setCurrentBoard({ commit }, board) {
commit('setCurrentBoard', board)
+ },
+
+ // label actions
+ removeLabelFromCurrentBoard({ commit }, label) {
+ apiClient.deleteLabel(label)
+ .then((label) => {
+ commit('removeLabelFromCurrentBoard', label.id)
+ })
+ },
+ updateLabelFromCurrentBoard({ commit }, newLabel) {
+ apiClient.updateLabel(newLabel)
+ .then((newLabel) => {
+ commit('updateLabelFromCurrentBoard', newLabel)
+ })
+ },
+ addLabelToCurrentBoard({ commit }, newLabel) {
+ newLabel.boardId = this.state.currentBoard.id
+ apiClient.createLabel(newLabel)
+ .then((newLabel) => {
+ commit('addLabelToCurrentBoard', newLabel)
+ })
}
}
})