diff --git a/.eslintrc.js b/.eslintrc.js
index 06874304a..f867aa193 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,67 +1,8 @@
module.exports = {
- root: true,
- env: {
- browser: true,
- es6: true,
- node: true,
- jest: true
- },
- globals: {
- t: true,
- n: true,
- OC: true,
- OCA: true,
- Vue: true,
- VueRouter: true
- },
- parserOptions: {
- parser: 'babel-eslint',
- ecmaVersion: 6
- },
extends: [
- 'eslint:recommended',
- 'plugin:node/recommended',
- 'plugin:vue/essential',
- 'plugin:vue/recommended',
- 'standard'
+ 'nextcloud'
],
- plugins: ['vue', 'node'],
rules: {
- // space before function ()
- 'space-before-function-paren': ['error', 'never'],
- // curly braces always space
- 'object-curly-spacing': ['error', 'always'],
- // stay consistent with array brackets
- 'array-bracket-newline': ['error', 'consistent'],
- // 1tbs brace style
- 'brace-style': 'error',
- // tabs only
- indent: ['error', 'tab'],
- 'no-tabs': 0,
- 'vue/html-indent': ['error', 'tab'],
- // only debug console
- 'no-console': ['warn', { allow: ['error', 'warn', 'debug'] }],
- // classes blocks
- 'padded-blocks': ['error', { classes: 'always' }],
- // always have the operator in front
- 'operator-linebreak': ['error', 'before'],
- // ternary on multiline
- 'multiline-ternary': ['error', 'always-multiline'],
- // es6 import/export and require
- 'node/no-unpublished-require': ['off'],
- 'node/no-unsupported-features/es-syntax': ['off'],
- // space before self-closing elements
- 'vue/html-closing-bracket-spacing': 'error',
- // code spacing with attributes
- 'vue/max-attributes-per-line': [
- 'error',
- {
- singleline: 3,
- multiline: {
- max: 3,
- allowFirstLine: true
- }
- }
- ]
+ 'valid-jsdoc': ['warn'],
}
}
diff --git a/package-lock.json b/package-lock.json
index e4981f728..ac2afc099 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6976,6 +6976,12 @@
}
}
},
+ "eslint-config-nextcloud": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-nextcloud/-/eslint-config-nextcloud-0.1.1.tgz",
+ "integrity": "sha512-/1VAkt7Y/m63eZfBiYkSzZMwQtmz0DFXuJnLebrzIY1GtpIj/Y3c//j4ZDiH5o0vbdn9laIc2Mb/01DIjzvt3g==",
+ "dev": true
+ },
"eslint-config-standard": {
"version": "12.0.0",
"resolved": "http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz",
@@ -7276,6 +7282,15 @@
}
}
},
+ "eslint-plugin-nextcloud": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-nextcloud/-/eslint-plugin-nextcloud-0.3.0.tgz",
+ "integrity": "sha512-LUD2qdirGL0BRt4uaMDGxen17mWVq9JwuGDt7P7Celz7bzdu0X48RrS8mhXn9e0w78+nYN5kPoULG2Bw04r4HA==",
+ "dev": true,
+ "requires": {
+ "requireindex": "~1.2.0"
+ }
+ },
"eslint-plugin-node": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz",
@@ -15232,6 +15247,12 @@
"integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
"dev": true
},
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
"resolve": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
diff --git a/package.json b/package.json
index 74dedc976..542a049a8 100644
--- a/package.json
+++ b/package.json
@@ -62,10 +62,12 @@
"babel-loader": "^8.0.6",
"css-loader": "^3.4.0",
"eslint": "^6.8.0",
+ "eslint-config-nextcloud": "^0.1.1",
"eslint-config-standard": "^12.0.0",
"eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^3.0.3",
"eslint-plugin-import": "^2.19.1",
+ "eslint-plugin-nextcloud": "^0.3.0",
"eslint-plugin-node": "^11.0.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
diff --git a/src/App.vue b/src/App.vue
index 427877404..784f1a394 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -41,7 +41,7 @@ const boardApi = new BoardApi()
export default {
name: 'App',
components: {
- AppNavigation
+ AppNavigation,
},
data: function() {
return {
@@ -54,19 +54,19 @@ export default {
action: () => {
},
reset: () => {
- }
+ },
},
action: () => {
this.addButton.classes.push('editing')
- }
- }
+ },
+ },
}
},
computed: {
...mapState({
navShown: state => state.navShown,
sidebarShownState: state => state.sidebarShown,
- currentBoard: state => state.currentBoard
+ currentBoard: state => state.currentBoard,
}),
// TODO: properly handle sidebar showing for route subview and board sidebar
sidebarRouterView() {
@@ -75,17 +75,17 @@ export default {
},
sidebarShown() {
return this.sidebarRouterView || this.sidebarShownState
- }
+ },
},
provide: function() {
return {
- boardApi: boardApi
+ boardApi: boardApi,
}
},
created: function() {
this.$store.dispatch('loadBoards')
this.$store.dispatch('loadSharees')
- }
+ },
}
diff --git a/src/BoardSelector.vue b/src/BoardSelector.vue
index 1422ee603..7e50bbe1c 100644
--- a/src/BoardSelector.vue
+++ b/src/BoardSelector.vue
@@ -25,10 +25,10 @@
{{ t('deck', 'Select the board to link to a project') }}
-
+ @click="selectedBoard=board.id">
{{ board.title }}
@@ -78,22 +78,22 @@ import { Modal } from '@nextcloud/vue/dist/Components/Modal'
import axios from 'nextcloud-axios'
export default {
- name: 'CollaborationView',
+ name: 'BoardSelector',
components: {
- Modal
+ Modal,
},
data() {
return {
boards: [],
selectedBoard: null,
loading: true,
- currentBoard: null
+ currentBoard: null,
}
},
computed: {
availableBoards() {
return this.boards.filter((board) => ('' + board.id !== '' + this.currentBoard))
- }
+ },
},
beforeMount() {
this.fetchBoards()
@@ -111,8 +111,8 @@ export default {
},
select() {
this.$root.$emit('select', this.selectedBoard)
- }
- }
+ },
+ },
}
diff --git a/src/CardSelector.vue b/src/CardSelector.vue
index b7b926e3b..4722fddbf 100644
--- a/src/CardSelector.vue
+++ b/src/CardSelector.vue
@@ -23,14 +23,16 @@
-
+ @select="fetchCardsFromBoard" />
-
+
{{ t('deck', 'Link to card') }}
@@ -48,10 +50,10 @@ import { Multiselect } from '@nextcloud/vue/dist/Components/Multiselect'
import axios from 'nextcloud-axios'
export default {
- name: 'CollaborationView',
+ name: 'CardSelector',
components: {
Modal,
- Multiselect
+ Multiselect,
},
data() {
return {
@@ -59,7 +61,7 @@ export default {
selectedBoard: '',
cardsFromBoard: [],
selectedCard: '',
- loading: true
+ loading: true,
}
},
computed: {
@@ -68,7 +70,7 @@ export default {
return false
}
return true
- }
+ },
},
beforeMount() {
this.fetchBoards()
@@ -83,8 +85,8 @@ export default {
async fetchCardsFromBoard(board) {
try {
this.cardsFromBoard = []
- let url = OC.generateUrl('/apps/deck/stacks/' + board.id)
- let response = await axios.get(url)
+ const url = OC.generateUrl('/apps/deck/stacks/' + board.id)
+ const response = await axios.get(url)
response.data.forEach(stack => {
this.cardsFromBoard.push(...stack.cards)
})
@@ -99,8 +101,8 @@ export default {
select() {
this.$root.$emit('select', this.selectedCard.id)
- }
- }
+ },
+ },
}
diff --git a/src/components/ActivityEntry.vue b/src/components/ActivityEntry.vue
index 0569e7857..82ddc8165 100644
--- a/src/components/ActivityEntry.vue
+++ b/src/components/ActivityEntry.vue
@@ -36,23 +36,23 @@ export default {
props: {
activity: {
type: Object,
- default: null
- }
+ default: null,
+ },
},
methods: {
getTime(timestamp) {
return OC.Util.relativeModifiedDate(timestamp)
},
parseMessage(activity) {
- let subject = activity.subject_rich[0]
- let parameters = activity.subject_rich[1]
+ const subject = activity.subject_rich[0]
+ const parameters = activity.subject_rich[1]
if (parameters.after && typeof parameters.after.id === 'string' && parameters.after.id.startsWith('dt:')) {
- let dateTime = parameters.after.id.substr(3)
+ const dateTime = parameters.after.id.substr(3)
parameters.after.name = window.moment(dateTime).format('L LTS')
}
return OCA.Activity.RichObjectStringParser.parseMessage(subject, parameters)
- }
- }
+ },
+ },
}
diff --git a/src/components/CollaborationView.vue b/src/components/CollaborationView.vue
index e5fdc42c2..61a8c404b 100644
--- a/src/components/CollaborationView.vue
+++ b/src/components/CollaborationView.vue
@@ -22,23 +22,20 @@
-
+
diff --git a/src/components/ColorPicker.vue b/src/components/ColorPicker.vue
index 52d463875..32e90f1eb 100644
--- a/src/components/ColorPicker.vue
+++ b/src/components/ColorPicker.vue
@@ -26,9 +26,10 @@
-
+
@@ -41,22 +42,22 @@ export default {
name: 'ColorPicker',
components: {
Compact,
- Chrome
+ Chrome,
},
directives: {
- ClickOutside
+ ClickOutside,
},
props: {
value: {
type: [String, Object],
- default: null
- }
+ default: null,
+ },
},
data() {
return {
color: { hex: this.value },
defaultColors: ['#31CC7C', '#317CCC', '#FF7A66', '#F1DB50', '#7C31CC', '#CC317C', '#3A3B3D', '#CACBCD'],
- showFullPicker: false
+ showFullPicker: false,
}
},
methods: {
@@ -65,8 +66,8 @@ export default {
},
hidePicker() {
this.showFullPicker = false
- }
- }
+ },
+ },
}
diff --git a/src/components/Controls.vue b/src/components/Controls.vue
index 898685869..a6a032a8d 100644
--- a/src/components/Controls.vue
+++ b/src/components/Controls.vue
@@ -39,25 +39,31 @@
-
-
-
+
+
+
@@ -71,19 +77,19 @@ export default {
board: {
type: Object,
required: false,
- default: null
- }
+ default: null,
+ },
},
data() {
return {
newStackTitle: '',
stack: '',
- showArchived: false
+ showArchived: false,
}
},
computed: {
...mapState({
- compactMode: state => state.compactMode
+ compactMode: state => state.compactMode,
}),
archivStyle() {
@@ -91,7 +97,7 @@ export default {
return 'opacity: 1.0'
}
return 'opacity: 0.3'
- }
+ },
},
methods: {
toggleNav() {
@@ -112,8 +118,8 @@ export default {
this.$store.dispatch('createStack', this.stack)
this.newStackTitle = ''
this.stack = null
- }
- }
+ },
+ },
}
diff --git a/src/components/List.vue b/src/components/List.vue
index fdfb710c5..dcfa29716 100644
--- a/src/components/List.vue
+++ b/src/components/List.vue
@@ -26,7 +26,7 @@
diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue
index 3a5234a00..b41af9c2c 100644
--- a/src/components/Sidebar.vue
+++ b/src/components/Sidebar.vue
@@ -30,8 +30,8 @@ export default {
methods: {
closeSidebar() {
this.$router.push({ name: 'board' })
- }
- }
+ },
+ },
}
diff --git a/src/components/board/Board.vue b/src/components/board/Board.vue
index bbf397b96..0cf5de2c2 100644
--- a/src/components/board/Board.vue
+++ b/src/components/board/Board.vue
@@ -24,11 +24,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -51,30 +51,30 @@ export default {
Controls,
Container,
Draggable,
- Stack
+ Stack,
},
inject: [
- 'boardApi'
+ 'boardApi',
],
props: {
id: {
type: Number,
- default: null
- }
+ default: null,
+ },
},
data: function() {
return {
- loading: true
+ loading: true,
}
},
computed: {
...mapState({
board: state => state.currentBoard,
- showArchived: state => state.showArchived
+ showArchived: state => state.showArchived,
}),
stacksByBoard() {
return this.$store.getters.stacksByBoard(this.board.id)
- }
+ },
/* cardsByStack() {
return (id) => this.$store.getters.cardsByStack(id)
} */
@@ -83,7 +83,7 @@ export default {
id: 'fetchData',
showArchived() {
this.fetchData()
- }
+ },
},
created() {
this.fetchData()
@@ -118,17 +118,17 @@ export default {
}
}, */
createStack() {
- let newStack = {
+ const newStack = {
title: 'FooBar',
boardId: this.id,
- order: this.stacksByBoard().length
+ order: this.stacksByBoard().length,
}
this.$store.dispatch('createStack', newStack)
- }
+ },
/* deleteStack(stack) {
this.$store.dispatch('deleteStack', stack)
} */
- }
+ },
}
diff --git a/src/components/board/BoardSidebar.vue b/src/components/board/BoardSidebar.vue
index eab5c1f57..760bb4dce 100644
--- a/src/components/board/BoardSidebar.vue
+++ b/src/components/board/BoardSidebar.vue
@@ -21,11 +21,10 @@
-->
-
+ @close="closeSidebar">
@@ -41,7 +40,7 @@
-
+
diff --git a/src/components/board/DeletedTabSidebar.vue b/src/components/board/DeletedTabSidebar.vue
index bfcbe132b..e1639236c 100644
--- a/src/components/board/DeletedTabSidebar.vue
+++ b/src/components/board/DeletedTabSidebar.vue
@@ -8,8 +8,7 @@
+ @click="stackUndoDelete(deletedStack)" />
@@ -24,8 +23,7 @@
+ @click="cardUndoDelete(deletedCard)" />
-
+ @close="closeSidebar">
@@ -34,10 +33,14 @@
{{ t('deck', 'Tags') }}
-
+
{{ scope.option.title }}
@@ -48,7 +51,7 @@
{{ scope.option.title }}
-
+
@@ -57,16 +60,18 @@
{{ t('deck', 'Assign to users') }}
-
+ @select="assignUserToCard"
+ @remove="removeUserFromCard">
-
+
{{ scope.option.displayname }}
-
+
@@ -75,9 +80,12 @@
{{ t('deck', 'Due date') }}
-
+
{{ t('deck', 'Remove due date') }}
@@ -87,9 +95,10 @@
-
+
Description
@@ -103,14 +112,15 @@
-
+
Load More
-
+
diff --git a/src/components/cards/AvatarList.vue b/src/components/cards/AvatarList.vue
index 10df44062..2b3641782 100644
--- a/src/components/cards/AvatarList.vue
+++ b/src/components/cards/AvatarList.vue
@@ -24,13 +24,15 @@
@@ -44,20 +46,20 @@ export default {
name: 'AvatarList',
components: {
Avatar,
- PopoverMenu
+ PopoverMenu,
},
directives: {
- tooltip: Tooltip
+ tooltip: Tooltip,
},
props: {
users: {
type: Array,
- default: () => { return {} }
- }
+ default: () => { return {} },
+ },
},
data() {
return {
- popoverVisible: false
+ popoverVisible: false,
}
},
computed: {
@@ -71,7 +73,7 @@ export default {
const avatarUrl = OC.generateUrl('/avatar/{user}/{size}',
{
user: user,
- size: size
+ size: size,
})
return window.location.protocol + '//' + window.location.host + avatarUrl
}
@@ -82,13 +84,13 @@ export default {
return {
href: '#',
icon: this.avatarUrl(session),
- text: session.participant.displayname
+ text: session.participant.displayname,
}
- })
+ }),
]
- }
+ },
- }
+ },
}
diff --git a/src/components/cards/CardBadges.vue b/src/components/cards/CardBadges.vue
index 24a6ecd7e..a816ce81f 100644
--- a/src/components/cards/CardBadges.vue
+++ b/src/components/cards/CardBadges.vue
@@ -34,7 +34,7 @@
-
+
diff --git a/src/components/cards/CardItem.vue b/src/components/cards/CardItem.vue
index db313ce62..98e766881 100644
--- a/src/components/cards/CardItem.vue
+++ b/src/components/cards/CardItem.vue
@@ -25,9 +25,10 @@
-->
-
+
{{ card.title }}
@@ -38,9 +39,10 @@
-
@@ -63,15 +65,17 @@
-
+
-
-
+ @select="loadStacksFromBoard" />
+
{{ t('deck', 'Move card') }}
@@ -80,7 +84,7 @@
{{ t('deck', 'Cancel') }}
-
+
-
+
@@ -109,14 +113,14 @@ export default {
name: 'CardItem',
components: { Modal, CardBadges, Actions, ActionButton, Multiselect },
directives: {
- ClickOutside
+ ClickOutside,
},
mixins: [Color],
props: {
id: {
type: Number,
- default: null
- }
+ default: null,
+ },
},
data() {
return {
@@ -126,14 +130,14 @@ export default {
modalShow: false,
selectedBoard: '',
selectedStack: '',
- stacksFromBoard: []
+ stacksFromBoard: [],
}
},
computed: {
...mapState({
compactMode: state => state.compactMode,
showArchived: state => state.showArchived,
- currentBoard: state => state.currentBoard
+ currentBoard: state => state.currentBoard,
}),
card() {
return this.$store.getters.cardById(this.id)
@@ -150,7 +154,7 @@ export default {
return (label) => {
return {
backgroundColor: '#' + label.color,
- color: this.textColor(label.color)
+ color: this.textColor(label.color),
}
}
},
@@ -162,7 +166,7 @@ export default {
return false
}
return true
- }
+ },
},
methods: {
openCard() {
@@ -202,8 +206,8 @@ export default {
},
async loadStacksFromBoard(board) {
try {
- let url = OC.generateUrl('/apps/deck/stacks/' + board.id)
- let response = await axios.get(url)
+ const url = OC.generateUrl('/apps/deck/stacks/' + board.id)
+ const response = await axios.get(url)
this.stacksFromBoard = response.data
} catch (err) {
return err
@@ -214,8 +218,8 @@ export default {
this.copiedCard.stackId = this.selectedStack.id
this.$store.dispatch('moveCard', this.copiedCard)
this.modalShow = false
- }
- }
+ },
+ },
}
diff --git a/src/components/navigation/AppNavigation.vue b/src/components/navigation/AppNavigation.vue
index 4e0a9936c..0035a33a0 100644
--- a/src/components/navigation/AppNavigation.vue
+++ b/src/components/navigation/AppNavigation.vue
@@ -23,41 +23,42 @@
-
-
+
-
+
-
+ icon="icon-shared" />
+
-
+
-
+ :disabled="groupLimitDisabled"
+ label="displayname"
+ track-by="id"
+ @input="updateConfig" />
{{ t('deck', 'Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them.') }}
@@ -78,36 +79,36 @@ export default {
components: {
AppNavigationAddBoard,
AppNavigationBoardCategory,
- Multiselect
+ Multiselect,
},
directives: {
- ClickOutside
+ ClickOutside,
},
props: {
loading: {
type: Boolean,
- default: false
- }
+ default: false,
+ },
},
data() {
return {
opened: false,
groups: [],
groupLimit: [],
- groupLimitDisabled: true
+ groupLimitDisabled: true,
}
},
computed: {
...mapGetters([
'noneArchivedBoards',
'archivedBoards',
- 'sharedBoards'
+ 'sharedBoards',
]),
isAdmin() {
// eslint-disable-next-line
//return oc_isadmin
return OC.isUserAdmin()
- }
+ },
},
beforeMount() {
if (this.isAdmin) {
@@ -121,7 +122,7 @@ export default {
this.groups = response.data.ocs.data.groups.reduce((obj, item) => {
obj.push({
id: item,
- displayname: item
+ displayname: item,
})
return obj
}, [])
@@ -140,14 +141,14 @@ export default {
updateConfig() {
this.groupLimitDisabled = true
axios.post(OC.generateUrl('apps/deck/config/groupLimit'), {
- value: this.groupLimit
+ value: this.groupLimit,
}).then(() => {
this.groupLimitDisabled = false
}, (error) => {
console.error('Error while saving groupLimit', error.response)
})
- }
- }
+ },
+ },
}