diff options
author | René Gieling <github@dartcafe.de> | 2020-01-03 20:44:58 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-03 20:44:58 +0300 |
commit | 33ac9bb6fe284ea5b9f26e780e191c8551f075c7 (patch) | |
tree | 81d16914eea867003d48348001f042fee9e743d4 | |
parent | 6f6f21af69f23824b70cd9ce0fe1e7f3c70a4e7c (diff) | |
parent | ec848fd33eed15c3bad2267c6ae9cd247de6d3ef (diff) |
Merge pull request #705 from nextcloud/fixesv1.0-beta
Fixes
34 files changed, 428 insertions, 480 deletions
diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 00000000..b9937526 --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,26 @@ +module.exports = { + extends: 'stylelint-config-recommended-scss', + rules: { + indentation: 'tab', + 'selector-type-no-unknown': null, + 'number-leading-zero': null, + 'rule-empty-line-before': [ + 'always', + { + ignore: ['after-comment', 'inside-block'] + } + ], + 'declaration-empty-line-before': [ + 'never', + { + ignore: ['after-declaration'] + } + ], + 'comment-empty-line-before': null, + 'selector-type-case': null, + 'selector-list-comma-newline-after': null, + 'no-descending-specificity': null, + 'string-quotes': 'single' + }, + plugins: ['stylelint-scss'] +} diff --git a/.travis.yml b/.travis.yml index 702d1e5c..7b9a423a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ addons: env: global: - - CORE_BRANCH=stable14 + - CORE_BRANCH=stable17 - APP_NAME=polls matrix: - DB=mysql diff --git a/appinfo/info.xml b/appinfo/info.xml index 4546f507..ae42ca66 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -23,7 +23,7 @@ <screenshot>https://raw.githubusercontent.com/nextcloud/polls/master/screenshots/vote.png</screenshot> <screenshot>https://raw.githubusercontent.com/nextcloud/polls/master/screenshots/edit-poll.png</screenshot> <dependencies> - <nextcloud min-version="14" max-version="18" /> + <nextcloud min-version="16" max-version="18" /> </dependencies> <background-jobs> <job>OCA\Polls\Cron\NotificationCron</job> diff --git a/lib/Controller/ShareController.php b/lib/Controller/ShareController.php index d81006d9..821d7423 100644 --- a/lib/Controller/ShareController.php +++ b/lib/Controller/ShareController.php @@ -116,9 +116,10 @@ class ShareController extends Controller { * @return DataResponse */ public function getShares($pollId) { - + $this->logger->alert('enter'); if ($this->acl->setPollId($pollId)->getAllowEdit()) { try { + $this->logger->alert('try loading shares'); $shares = $this->mapper->findByPoll($pollId); return new DataResponse((array) $shares, Http::STATUS_OK); @@ -127,6 +128,8 @@ class ShareController extends Controller { } } else { + $this->logger->alert('no access'); + return new DataResponse(null, Http::STATUS_UNAUTHORIZED); } diff --git a/package.json b/package.json index d8331ee5..97cc70f3 100644 --- a/package.json +++ b/package.json @@ -26,13 +26,13 @@ "private": true, "main": "src/js/main.js", "scripts": { - "dev": "webpack --config webpack.dev.js", - "watch": "webpack --progress --watch --config webpack.dev.js", - "build": "webpack --progress --env.production --hide-modules --config webpack.prod.js", + "dev": "cross-env NODE_ENV=development webpack --config webpack.dev.js", + "watch": "cross-env NODE_ENV=development webpack --progress --watch --config webpack.dev.js", + "build": "cross-env 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", - "test:coverage": "jest --coverage" + "stylelint": "stylelint src", + "stylelint:fix": "stylelint src --fix" }, "dependencies": { "@babel/runtime": "^7.7.7", @@ -47,8 +47,6 @@ "fibers": "^4.0.2", "lodash": "^4.17.15", "moment": "^2.23.0", - "sass": "^1.23.7", - "stylelint-scss": "^3.13.0", "v-click-outside": "^3.0.0", "v-tooltip": "^3.0.0-alpha.11", "vue": "^2.6.10", @@ -72,28 +70,28 @@ "babel-eslint": "^10.0.2", "babel-loader": "^8.0.6", "babel-preset-env": "^1.7.0", + "cross-env": "^6.0.3", "css-loader": "^3.4.0", - "eslint": "^6.7.2", + "eslint": "^6.8.0", "eslint-config-standard": "^14.1.0", - "eslint-friendly-formatter": "^4.0.1", "eslint-loader": "^3.0.3", "eslint-plugin-import": "^2.19.1", "eslint-plugin-node": "^11.0.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", - "eslint-plugin-vue": "^6.0.1", + "eslint-plugin-vue": "^6.1.2", "file-loader": "^5.0.2", - "mini-css-extract-plugin": "^0.9.0", "node-sass": "^4.13.0", "prettier-eslint": "^9.0.1", "raw-loader": "^4.0.0", "sass-loader": "^8.0.0", - "stylelint": "^12.0.0", + "stylelint": "^12.0.1", "stylelint-config-recommended-scss": "^4.0.0", + "stylelint-scss": "^3.13.0", "vue-loader": "^15.7.2", "vue-style-loader": "^4.1.1", "vue-template-compiler": "^2.6.10", - "webpack": "^4.41.4", + "webpack": "^4.41.5", "webpack-cli": "^3.3.10", "webpack-merge": "^4.1.5" } diff --git a/src/js/App.vue b/src/js/App.vue index 59c8611a..ec588070 100644 --- a/src/js/App.vue +++ b/src/js/App.vue @@ -49,7 +49,7 @@ export default { }, watch: { - '$route'(to, from) { + $route() { this.loadNavigation = (this.$route.name !== 'publicVote') } } @@ -61,23 +61,24 @@ export default { .list-enter-active, .list-leave-active { - transition: all 0.5s ease; + transition: all 0.5s ease; } .list-enter, .list-leave-to { - opacity: 0; + opacity: 0; } .list-move { - transition: transform 0.5s; + transition: transform 0.5s; } .fade-leave-active { - transition: opacity 2.5s; + transition: opacity 2.5s; } + .fade-enter, .fade-leave-to { - opacity: 0; + opacity: 0; } #app-polls { @@ -86,7 +87,7 @@ export default { } #app-content { - display: flex; + display: flex; width: auto; input { diff --git a/src/js/assets/app.png b/src/js/assets/app.png Binary files differdeleted file mode 100644 index 84a879bb..00000000 --- a/src/js/assets/app.png +++ /dev/null diff --git a/src/js/components/Base/LoadingOverlay.vue b/src/js/components/Base/LoadingOverlay.vue index c8148854..48fab117 100644 --- a/src/js/components/Base/LoadingOverlay.vue +++ b/src/js/components/Base/LoadingOverlay.vue @@ -34,26 +34,26 @@ export default { <style lang="scss"> .loading-overlay { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #fff; - opacity: 0.9; - z-index: 1001; - .icon-loading { - position: fixed; - left: 50%; - top: 50%; - margin-left: -35px; - margin-top: -10px; - &::after { - border: 10px solid var(--color-loading-light); - border-top-color: var(--color-primary-element); - height: 70px; - width: 70px; - } - } + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #fff; + opacity: 0.9; + z-index: 1001; + .icon-loading { + position: fixed; + left: 50%; + top: 50%; + margin-left: -35px; + margin-top: -10px; + &::after { + border: 10px solid var(--color-loading-light); + border-top-color: var(--color-primary-element); + height: 70px; + width: 70px; + } + } } </style> diff --git a/src/js/components/Base/UserDiv.vue b/src/js/components/Base/UserDiv.vue index a4f8625e..af1ca5eb 100644 --- a/src/js/components/Base/UserDiv.vue +++ b/src/js/components/Base/UserDiv.vue @@ -125,30 +125,30 @@ export default { <style lang="scss"> .user-row { - display: flex; - flex: 1; - align-items: center; - margin-left: 0; - margin-top: 0; - - > div { - margin: 2px 4px; - } - - .description { - opacity: 0.7; - flex: 0; - } - - .avatar { - height: 32px; - width: 32px; - flex: 0; - } - - .user-name { - opacity: 0.5; - flex: 1; - } + display: flex; + flex: 1; + align-items: center; + margin-left: 0; + margin-top: 0; + + > div { + margin: 2px 4px; + } + + .description { + opacity: 0.7; + flex: 0; + } + + .avatar { + height: 32px; + width: 32px; + flex: 0; + } + + .user-name { + opacity: 0.5; + flex: 1; + } } </style> diff --git a/src/js/components/Create/CreateDlg.vue b/src/js/components/Create/CreateDlg.vue index 16888af4..3f95febe 100644 --- a/src/js/components/Create/CreateDlg.vue +++ b/src/js/components/Create/CreateDlg.vue @@ -31,12 +31,12 @@ {{ t('polls', 'Poll type') }} </label> <input id="datePoll" v-model="type" value="datePoll" - :disabled="protect" type="radio" class="radio"> + type="radio" class="radio"> <label for="datePoll"> {{ t('polls', 'Poll schedule') }} </label> <input id="textPoll" v-model="type" value="textPoll" - :disabled="protect" type="radio" class="radio"> + type="radio" class="radio"> <label for="textPoll"> {{ t('polls', 'Text based') }} </label> @@ -77,7 +77,7 @@ export default { }, methods: { - ...mapMutations([ 'setPollProperty', 'resetPoll', 'reset' ]), + ...mapMutations(['setPollProperty', 'resetPoll', 'reset']), cancel() { this.title = '' @@ -88,11 +88,11 @@ export default { confirm() { this.resetPoll() this.reset() - this.setPollProperty({ 'id': 0 }) - this.setPollProperty({ 'title': this.title }) - this.setPollProperty({ 'type': this.type }) + this.setPollProperty({ id: 0 }) + this.setPollProperty({ title: this.title }) + this.setPollProperty({ type: this.type }) this.$store.dispatch('writePollPromise') - .then((response) => { + .then(() => { this.cancel() OC.Notification.showTemporary(t('polls', 'Poll "%n" added', 1, this.poll.title), { type: 'success' }) this.$router.push({ name: 'vote', params: { id: this.poll.id } }) diff --git a/src/js/components/Navigation/Navigation.vue b/src/js/components/Navigation/Navigation.vue index 85e3dc88..71dcd386 100644 --- a/src/js/components/Navigation/Navigation.vue +++ b/src/js/components/Navigation/Navigation.vue @@ -144,7 +144,7 @@ export default { this.loading = true this.$store .dispatch('loadPolls') - .then(response => { + .then(() => { this.loading = false }) .catch(error => { @@ -182,7 +182,7 @@ export default { this.loading = true this.$store .dispatch('loadPolls') - .then(response => { + .then(() => { this.loading = false }) .catch(error => { diff --git a/src/js/components/PollList/PollListItem.vue b/src/js/components/PollList/PollListItem.vue index 9b3d014e..b144b37c 100644 --- a/src/js/components/PollList/PollListItem.vue +++ b/src/js/components/PollList/PollListItem.vue @@ -49,8 +49,6 @@ {{ pollType }} </div> - <!-- <div v-if="votedBycurrentUser" class="symbol icon-voted" /> --> - <router-link :to="{name: 'vote', params: {id: poll.id}}" class="title"> <div class="name"> {{ poll.title }} @@ -60,10 +58,6 @@ </div> </router-link> - <!-- <div v-if="countComments" v-tooltip.auto="countCommentsHint" class="app-navigation-entry-utils-counter highlighted"> - <span>{{ countComments }}</span> - </div> --> - <div class="actions"> <div class="toggleUserActions"> <div v-click-outside="hideMenu" class="icon-more" @click="toggleMenu" /> @@ -146,7 +140,7 @@ export default { }, menuItems() { - let items = [ + const items = [ { key: 'clonePoll', icon: 'icon-confirm', @@ -215,10 +209,6 @@ export default { } } -.thumbnail { - flex: 0 0 auto; -} - .icon-more { right: 14px; opacity: 0.3; @@ -245,15 +235,8 @@ export default { } } -.thumbnail.access, .owner { - flex: 0 0 auto; -} - -.thumbnail.access { - width: 75px; -} - .owner { + flex: 0 0 auto; width: 130px; overflow: hidden; white-space: nowrap; @@ -280,122 +263,64 @@ export default { } } - .thumbnail { - width: 44px; - height: 44px; - padding-right: 4px; - font-size: 0; - background-color: var(--color-text-light); - &.datePoll { - mask-image: var(--icon-calendar-000) no-repeat 50% 50%; - -webkit-mask: var(--icon-calendar-000) no-repeat 50% 50%; - mask-size: 16px; - } - &.textPoll { - mask-image: var(--icon-organization-000) no-repeat 50% 50%; - -webkit-mask: var(--icon-organization-000) no-repeat 50% 50%; - mask-size: 16px; - } - &.expired { - background-color: var(--color-background-darker); - } - &.access { - display: inherit; - &.hidden { - mask-image: var(--icon-password-000) no-repeat 50% 50%; - -webkit-mask: var(--icon-password-000) no-repeat 50% 50%; - mask-size: 16px; - } - &.public { - mask-image: var(--icon-link-000) no-repeat 50% 50%; - -webkit-mask: var(--icon-link-000) no-repeat 50% 50%; - mask-size: 16px; - } - &.select { - mask-image: var(--icon-share-000) no-repeat 50% 50%; - -webkit-mask: var(--icon-share-000) no-repeat 50% 50%; - mask-size: 16px; - } - &.registered { - mask-image: var(--icon-group-000) no-repeat 50% 50%; - -webkit-mask: var(--icon-group-000) no-repeat 50% 50%; - mask-size: 16px; - } - } +.thumbnail { + flex: 0 0 auto; + width: 44px; + height: 44px; + padding-right: 4px; + font-size: 0; + background-color: var(--color-text-light); + &.datePoll { + mask-image: var(--icon-calendar-000) no-repeat 50% 50%; + -webkit-mask: var(--icon-calendar-000) no-repeat 50% 50%; + mask-size: 16px; } - - .icon-voted { - background-image: var(--icon-checkmark-fff); + &.textPoll { + mask-image: var(--icon-organization-000) no-repeat 50% 50%; + -webkit-mask: var(--icon-organization-000) no-repeat 50% 50%; + mask-size: 16px; } - - .comment-badge { - position: absolute; - top: 0; - width: 26px; - line-height: 26px; - text-align: center; - font-size: 0.7rem; - color: white; - background-image: var(--icon-comment-49bc49); - background-repeat: no-repeat; - background-size: 26px; - z-index: 1; + &.expired { + background-color: var(--color-background-darker); } - - .app-navigation-entry-utils-counter { - padding-right: 0 !important; - overflow: hidden; - text-align: right; - font-size: 9pt; - line-height: 44px; - padding: 0 12px; - // min-width: 25px; - &.highlighted { - padding: 0; - text-align: center; - span { - padding: 2px 5px; - border-radius: 10px; - background-color: var(--color-primary); - color: var(--color-primary-text); - } + &.access { + display: inherit; + &.hidden { + mask-image: var(--icon-password-000) no-repeat 50% 50%; + -webkit-mask: var(--icon-password-000) no-repeat 50% 50%; + mask-size: 16px; + } + &.public { + mask-image: var(--icon-link-000) no-repeat 50% 50%; + -webkit-mask: var(--icon-link-000) no-repeat 50% 50%; + mask-size: 16px; } } +} - .symbol.icon-voted { - position: absolute; - left: 11px; - top: 16px; - background-size: 0; - min-width: 8px; - min-height: 8px; - background-color: var(--color-success); - border-radius: 50%; - } - - @media all and (max-width: (740px)) { - .dates { - flex-direction: column; - } +@media all and (max-width: (740px)) { + .dates { + flex-direction: column; } +} - @media all and (max-width: (620px)) { - .owner { - display: none; - } +@media all and (max-width: (620px)) { + .owner { + display: none; } +} - @media all and (max-width: (490px)) { - .dates { - display: none; - } +@media all and (max-width: (490px)) { + .dates { + display: none; } +} - @media all and (max-width: (380px)) { - .thumbnail.access, .access { - width: 140px; - display: none; - } +@media all and (max-width: (380px)) { + .thumbnail.access, .access { + width: 140px; + display: none; } +} </style> diff --git a/src/js/components/SideBar/CommentAdd.vue b/src/js/components/SideBar/CommentAdd.vue index 02e2285a..db058158 100644 --- a/src/js/components/SideBar/CommentAdd.vue +++ b/src/js/components/SideBar/CommentAdd.vue @@ -34,7 +34,7 @@ <script> export default { - name: 'AddComment', + name: 'CommentAdd', data() { return { comment: '' @@ -50,7 +50,7 @@ export default { methods: { writeComment() { this.$store.dispatch('setCommentAsync', { message: this.comment }) - .then(response => { + .then(() => { OC.Notification.showTemporary(t('polls', 'Your comment was added'), { type: 'success' }) }) .catch(error => { @@ -81,6 +81,7 @@ export default { color: grey; } } + .submitComment { align-self: last baseline; width: 30px; diff --git a/src/js/components/SideBar/SideBarTabConfiguration.vue b/src/js/components/SideBar/SideBarTabConfiguration.vue index 69781ce2..13ba6f84 100644 --- a/src/js/components/SideBar/SideBarTabConfiguration.vue +++ b/src/js/components/SideBar/SideBarTabConfiguration.vue @@ -84,7 +84,7 @@ import debounce from 'lodash/debounce' import { mapState, mapMutations, mapActions } from 'vuex' export default { - name: 'SideBarTab', + name: 'SideBarTabConfiguration', data() { return { @@ -107,7 +107,7 @@ export default { return this.poll.description }, set(value) { - this.writeValueDebounced({ 'description': value }) + this.writeValueDebounced({ description: value }) } }, @@ -116,7 +116,7 @@ export default { return this.poll.title }, set(value) { - this.writeValueDebounced({ 'title': value }) + this.writeValueDebounced({ title: value }) } }, @@ -125,7 +125,7 @@ export default { return this.poll.access }, set(value) { - this.writeValue({ 'access': value }) + this.writeValue({ access: value }) } }, @@ -135,7 +135,7 @@ export default { }, set(value) { - this.writeValue({ 'expire': moment(value).unix() }) + this.writeValue({ expire: moment(value).unix() }) } }, @@ -145,9 +145,9 @@ export default { }, set(value) { if (value) { - this.writeValue({ 'expire': moment().unix() }) + this.writeValue({ expire: moment().unix() }) } else { - this.writeValue({ 'expire': 0 }) + this.writeValue({ expire: 0 }) } } @@ -158,7 +158,7 @@ export default { return (this.poll.Fullanonymous > 0) }, set(value) { - this.writeValue({ 'fullAnonymous': value }) + this.writeValue({ fullAnonymous: value }) } }, @@ -167,7 +167,7 @@ export default { return (this.poll.anonymous > 0) }, set(value) { - this.writeValue({ 'anonymous': value }) + this.writeValue({ anonymous: value }) } }, @@ -176,9 +176,9 @@ export default { return this.poll.allowMaybe }, set(value) { - this.writeValue({ 'allowMaybe': value }) + this.writeValue({ allowMaybe: value }) if (value) { - this.writeValue({ 'options': ['yes', 'no', 'maybe'] }) + this.writeValue({ options: ['yes', 'no', 'maybe'] }) } } }, @@ -237,8 +237,8 @@ export default { }, methods: { - ...mapMutations([ 'setPollProperty' ]), - ...mapActions([ 'writePollPromise' ]), + ...mapMutations(['setPollProperty']), + ...mapActions(['writePollPromise']), writeValueDebounced: debounce(function(e) { this.writeValue(e) @@ -252,9 +252,9 @@ export default { switchDeleted() { if (this.poll.deleted) { - this.writeValue({ 'deleted': 0 }) + this.writeValue({ deleted: 0 }) } else { - this.writeValue({ 'deleted': moment.utc().unix() }) + this.writeValue({ deleted: moment.utc().unix() }) } }, diff --git a/src/js/components/SideBar/SideBarTabDateOptions.vue b/src/js/components/SideBar/SideBarTabDateOptions.vue index 63c4b79c..1595adc8 100644 --- a/src/js/components/SideBar/SideBarTabDateOptions.vue +++ b/src/js/components/SideBar/SideBarTabDateOptions.vue @@ -91,7 +91,7 @@ export default { options: state => state.options }), - ...mapGetters([ 'sortedOptions' ]), + ...mapGetters(['sortedOptions']), optionDatePicker() { return { @@ -131,9 +131,9 @@ export default { }, shiftDates(payload) { - let store = this.$store + const store = this.$store this.options.list.forEach(function(existingOption) { - let option = Object.assign({}, existingOption) + const option = Object.assign({}, existingOption) option.pollOptionText = moment(option.pollOptionText).add(payload.step, payload.unit).format('YYYY-MM-DD HH:mm:ss') option.timestamp = moment.utc(option.pollOptionText).unix() store.dispatch('updateOptionAsync', { option: option }) diff --git a/src/js/components/SideBar/SideBarTabShare.vue b/src/js/components/SideBar/SideBarTabShare.vue index e9f65bec..52847c9a 100644 --- a/src/js/components/SideBar/SideBarTabShare.vue +++ b/src/js/components/SideBar/SideBarTabShare.vue @@ -67,7 +67,7 @@ <div class="user-row user"> <div class="avatar icon-public" /> <div class="user-name"> - {{ t('polls', 'Share Link') }} + {{ t('polls', 'Public link (' + share.token + ')') }} </div> </div> <div class="options"> @@ -134,10 +134,10 @@ export default { copyLink(payload) { this.$copyText(window.location.origin + payload.url).then( - function(e) { + function() { OC.Notification.showTemporary(t('polls', 'Link copied to clipboard'), { type: 'success' }) }, - function(e) { + function() { OC.Notification.showTemporary(t('polls', 'Error while copying link to clipboard'), { type: 'error' }) } ) @@ -184,12 +184,12 @@ export default { addShare(payload) { this.$store.dispatch('writeSharePromise', { - 'share': { - 'type': payload.type, - 'userId': payload.user, - 'pollId': '0', - 'userEmail': payload.emailAddress, - 'token': '' + share: { + type: payload.type, + userId: payload.user, + pollId: '0', + userEmail: payload.emailAddress, + token: '' } }) // .then(response => { diff --git a/src/js/components/SideBar/SideBarTabTextOptions.vue b/src/js/components/SideBar/SideBarTabTextOptions.vue index ce141432..60b96551 100644 --- a/src/js/components/SideBar/SideBarTabTextOptions.vue +++ b/src/js/components/SideBar/SideBarTabTextOptions.vue @@ -87,78 +87,78 @@ export default { <style lang="scss"> .configBox { - display: flex; - flex-direction: column; - padding: 8px; - & > * { - padding-left: 21px; - } - - & > input { - margin-left: 24px; - width: auto; - - } - - & > textarea { - margin-left: 24px; - width: auto; - padding: 7px 6px; - } - - & > .title { - display: flex; - background-position: 0 2px; - padding-left: 24px; - opacity: 0.7; - font-weight: bold; - margin-bottom: 4px; - & > span { - padding-left: 4px; - } - } - - &.poll-table > li { - border-bottom-color: rgb(72, 72, 72); - margin-left: 18px; - } + display: flex; + flex-direction: column; + padding: 8px; + & > * { + padding-left: 21px; + } + + & > input { + margin-left: 24px; + width: auto; + + } + + & > textarea { + margin-left: 24px; + width: auto; + padding: 7px 6px; + } + + & > .title { + display: flex; + background-position: 0 2px; + padding-left: 24px; + opacity: 0.7; + font-weight: bold; + margin-bottom: 4px; + & > span { + padding-left: 4px; + } + } + + &.poll-table > li { + border-bottom-color: rgb(72, 72, 72); + margin-left: 18px; + } } .poll-table { - > li { - display: flex; - align-items: center; - padding-left: 8px; - padding-right: 8px; - line-height: 2em; - min-height: 4em; - border-bottom: 1px solid var(--color-border); - overflow: hidden; - white-space: nowrap; - - &:active, - &:hover { - transition: var(--background-dark) 0.3s ease; - background-color: var(--color-background-dark); //$hover-color; - } - - > div { - display: flex; - flex: 1; - font-size: 1.2em; - opacity: 0.7; - white-space: normal; - padding-right: 4px; - &.avatar { - flex: 0; - } - } - - > div:nth-last-child(1) { - justify-content: center; - flex: 0 0; - } - } + > li { + display: flex; + align-items: center; + padding-left: 8px; + padding-right: 8px; + line-height: 2em; + min-height: 4em; + border-bottom: 1px solid var(--color-border); + overflow: hidden; + white-space: nowrap; + + &:active, + &:hover { + transition: var(--background-dark) 0.3s ease; + background-color: var(--color-background-dark); //$hover-color; + } + + > div { + display: flex; + flex: 1; + font-size: 1.2em; + opacity: 0.7; + white-space: normal; + padding-right: 4px; + &.avatar { + flex: 0; + } + } + + > div:nth-last-child(1) { + justify-content: center; + flex: 0 0; + } + } } </style> diff --git a/src/js/components/VoteTable/VoteHeaderPublic.vue b/src/js/components/VoteTable/VoteHeaderPublic.vue index fe6f1989..b4e23261 100644 --- a/src/js/components/VoteTable/VoteHeaderPublic.vue +++ b/src/js/components/VoteTable/VoteHeaderPublic.vue @@ -105,10 +105,10 @@ export default { methods: { copyLink(payload) { this.$copyText(window.location.origin + payload.url).then( - function(e) { + function() { OC.Notification.showTemporary(t('polls', 'Link copied to clipboard'), { type: 'success' }) }, - function(e) { + function() { OC.Notification.showTemporary(t('polls', 'Error while copying link to clipboard'), { type: 'error' }) } ) @@ -118,7 +118,7 @@ export default { if (this.userName.length > 2) { this.checkingUserName = true return axios.post(OC.generateUrl('apps/polls/check/username'), { pollId: this.poll.id, userName: this.userName, token: this.$route.params.token }) - .then((response) => { + .then(() => { this.checkingUserName = false this.isValidName = true this.invalidUserNameMessage = 'User name is OK.' @@ -144,7 +144,7 @@ export default { .then((response) => { this.token = response.token this.redirecting = true - this.$router.replace({ name: 'publicVote', params: { 'token': response.token } }) + this.$router.replace({ name: 'publicVote', params: { token: response.token } }) }) .catch(() => { OC.Notification.showTemporary(t('polls', 'Error saving user name', 1, this.poll.title), { type: 'error' }) @@ -178,7 +178,6 @@ export default { & > label { margin-right: 12px; } - margin: 0 12px 12px 24px; border:2px solid var(--color-border-dark); font-size: 1.2em; @@ -204,7 +203,7 @@ export default { top: 0px; } - input[type="text"] + .icon-confirm, input[type="text"] + .icon-loading-small { + input[type='text'] + .icon-confirm, input[type='text'] + .icon-loading-small { flex: 0; margin-left: -8px !important; border-left-color: transparent !important; diff --git a/src/js/components/VoteTable/VoteTable.vue b/src/js/components/VoteTable/VoteTable.vue index a2dba197..010c5ec2 100644 --- a/src/js/components/VoteTable/VoteTable.vue +++ b/src/js/components/VoteTable/VoteTable.vue @@ -109,13 +109,16 @@ export default { width: 170px; flex: 0 0 auto; } + .header { height: 150px; } + .user { height: 44px; padding: 0 17px; } + .vote-table { display: flex; flex: 0; diff --git a/src/js/components/VoteTable/VoteTableHeader.vue b/src/js/components/VoteTable/VoteTableHeader.vue index 4a1b9957..45f181bb 100644 --- a/src/js/components/VoteTable/VoteTableHeader.vue +++ b/src/js/components/VoteTable/VoteTableHeader.vue @@ -88,21 +88,21 @@ export default { ]), yesVotes() { - let pollOptionText = this.option.pollOptionText + const pollOptionText = this.option.pollOptionText return this.votesRank.find(rank => { return rank.pollOptionText === pollOptionText }).yes }, maybeVotes() { - let pollOptionText = this.option.pollOptionText + const pollOptionText = this.option.pollOptionText return this.votesRank.find(rank => { return rank.pollOptionText === pollOptionText }).maybe }, isWinner() { - let pollOptionText = this.option.pollOptionText + const pollOptionText = this.option.pollOptionText return ( this.votesRank.find(rank => { return rank.pollOptionText === pollOptionText diff --git a/src/js/components/VoteTable/VoteTableItem.vue b/src/js/components/VoteTable/VoteTableItem.vue index c90b5f18..e1647fdd 100644 --- a/src/js/components/VoteTable/VoteTableItem.vue +++ b/src/js/components/VoteTable/VoteTableItem.vue @@ -105,7 +105,6 @@ export default { margin: auto; background-position: center; background-repeat: no-repeat; - background-size: 32px; background-image: var(--icon-close-000); min-width: 40px; min-height: 40px; @@ -138,7 +137,7 @@ export default { color: $fg-maybe; // background-image: var(--icon-polls-maybe-vote-variant-f0db98); > .icon { - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjE2IgogICBoZWlnaHQ9IjE2IgogICBzb2RpcG9kaTpkb2NuYW1lPSJtYXliZS12b3RlLXZhcmlhbnQuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjIgKDVjM2U4MGQsIDIwMTctMDgtMDYpIj4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQuNzUiCiAgICAgaW5rc2NhcGU6Y3g9IjgiCiAgICAgaW5rc2NhcGU6Y3k9IjE0Ljg2NTIwMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgaWQ9ImdyaWQ4MzYiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTAiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM4IiAvPgogIDx0ZXh0CiAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxNS4wMDY0OTA3MXB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiNmZmMxMDc7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDIzMTY5NzYiCiAgICAgeD0iLTAuODAzNjg5NDgiCiAgICAgeT0iMTIuNTU5MzEyIgogICAgIGlkPSJ0ZXh0ODE4IgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMS4wOTAxOSwwLjkxNzI3MTMpIj48dHNwYW4KICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICBpZD0idHNwYW44MTYiCiAgICAgICB4PSItMC44MDM2ODk0OCIKICAgICAgIHk9IjEyLjU1OTMxMiIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuNjY2NjY2OThweDtmaWxsOiNmZmMxMDc7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjEuMDIzMTY5NzYiPig8L3RzcGFuPjwvdGV4dD4KICA8dGV4dAogICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6NDAuOTI3MTQzMXB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiNmZmMxMDc7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDIzMTc4NDYiCiAgICAgeD0iOS45NjMwNDQyIgogICAgIHk9IjEyLjQ3ODk0NSIKICAgICBpZD0idGV4dDgyOCIKICAgICB0cmFuc2Zvcm09InNjYWxlKDEuMDkwMTk5MywwLjkxNzI2MzQ4KSI+PHRzcGFuCiAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgaWQ9InRzcGFuODI2IgogICAgICAgeD0iOS45NjMwNDQyIgogICAgICAgeT0iMTIuNDc4OTQ1IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC42NjY2NjY5OHB4O2ZpbGw6I2ZmYzEwNztmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MS4wMjMxNzg0NiI+KTwvdHNwYW4+PC90ZXh0PgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBkPSJtIDExLjkyNCw0LjA2NTk5OTIgLTQuOTMyMDAwMSw0Ljk3IC0yLjgyOCwtMi44MyBMIDIuNzUsNy42MTc5OTkyIDYuOTkxOTk5OSwxMS44NjEgMTMuMzU3LDUuNDk1OTk5MiBsIC0xLjQzMywtMS40MzIgeiIKICAgICBpZD0icGF0aDgxNiIKICAgICBzdHlsZT0iZmlsbDojZmZjMTA3O2ZpbGwtb3BhY2l0eToxIiAvPgo8L3N2Zz4K); + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjE2IgogICBoZWlnaHQ9IjE2IgogICBzb2RpcG9kaTpkb2NuYW1lPSJtYXliZS12b3RlLXZhcmlhbnQuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjIgKDVjM2U4MGQsIDIwMTctMDgtMDYpIj4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQuNzUiCiAgICAgaW5rc2NhcGU6Y3g9IjgiCiAgICAgaW5rc2NhcGU6Y3k9IjE0Ljg2NTIwMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgaWQ9ImdyaWQ4MzYiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTAiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM4IiAvPgogIDx0ZXh0CiAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxNS4wMDY0OTA3MXB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiNmZmMxMDc7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDIzMTY5NzYiCiAgICAgeD0iLTAuODAzNjg5NDgiCiAgICAgeT0iMTIuNTU5MzEyIgogICAgIGlkPSJ0ZXh0ODE4IgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMS4wOTAxOSwwLjkxNzI3MTMpIj48dHNwYW4KICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICBpZD0idHNwYW44MTYiCiAgICAgICB4PSItMC44MDM2ODk0OCIKICAgICAgIHk9IjEyLjU1OTMxMiIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuNjY2NjY2OThweDtmaWxsOiNmZmMxMDc7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjEuMDIzMTY5NzYiPig8L3RzcGFuPjwvdGV4dD4KICA8dGV4dAogICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6NDAuOTI3MTQzMXB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiNmZmMxMDc7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDIzMTc4NDYiCiAgICAgeD0iOS45NjMwNDQyIgogICAgIHk9IjEyLjQ3ODk0NSIKICAgICBpZD0idGV4dDgyOCIKICAgICB0cmFuc2Zvcm09InNjYWxlKDEuMDkwMTk5MywwLjkxNzI2MzQ4KSI+PHRzcGFuCiAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgaWQ9InRzcGFuODI2IgogICAgICAgeD0iOS45NjMwNDQyIgogICAgICAgeT0iMTIuNDc4OTQ1IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC42NjY2NjY5OHB4O2ZpbGw6I2ZmYzEwNztmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MS4wMjMxNzg0NiI+KTwvdHNwYW4+PC90ZXh0PgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBkPSJtIDExLjkyNCw0LjA2NTk5OTIgLTQuOTMyMDAwMSw0Ljk3IC0yLjgyOCwtMi44MyBMIDIuNzUsNy42MTc5OTkyIDYuOTkxOTk5OSwxMS44NjEgMTMuMzU3LDUuNDk1OTk5MiBsIC0xLjQzMywtMS40MzIgeiIKICAgICBpZD0icGF0aDgxNiIKICAgICBzdHlsZT0iZmlsbDojZmZjMTA3O2ZpbGwtb3BhY2l0eToxIiAvPgo8L3N2Zz4K); } } diff --git a/src/js/store/index.js b/src/js/store/index.js index 471b3127..f83cfe14 100644 --- a/src/js/store/index.js +++ b/src/js/store/index.js @@ -24,14 +24,7 @@ import Vue from 'vue' import Vuex from 'vuex' -import acl from './modules/acl' -import comments from './modules/comments' -import poll from './modules/poll' -import polls from './modules/polls' -import subscription from './modules/subscription' -import votes from './modules/votes' -import options from './modules/options' -import shares from './modules/shares' +import modules from './modules' Vue.use(Vuex) @@ -39,17 +32,6 @@ Vue.use(Vuex) const debug = process.env.NODE_ENV !== 'production' export default new Vuex.Store({ - - modules: { - acl, - comments, - poll, - polls, - subscription, - votes, - options, - shares - }, - + modules, strict: process.env.NODE_ENV !== 'production' }) diff --git a/src/js/store/modules/acl.js b/src/js/store/modules/acl.js index 173dc90e..928943f9 100644 --- a/src/js/store/modules/acl.js +++ b/src/js/store/modules/acl.js @@ -49,7 +49,7 @@ const mutations = { Object.assign(state, payload.acl) }, - reset(state) { + resetAcl(state) { Object.assign(state, defaultAcl()) } @@ -57,8 +57,7 @@ const mutations = { const actions = { - loadPoll({ commit, rootState }, payload) { - commit('reset') + loadAcl(context, payload) { let endPoint = 'apps/polls/acl/get/' if (payload.token !== undefined) { @@ -66,14 +65,15 @@ const actions = { } else if (payload.pollId !== undefined) { endPoint = endPoint.concat(payload.pollId) } else { + context.commit('resetAcl') return } return axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('setAcl', { 'acl': response.data }) + context.commit('setAcl', { acl: response.data }) }, (error) => { - console.error('Error loading comments', { 'error': error.response }, { 'payload': payload }) + console.error('Error loading comments', { error: error.response }, { payload: payload }) throw error }) } diff --git a/src/js/store/modules/comments.js b/src/js/store/modules/comments.js index 03b4b2d4..7d76cb5d 100644 --- a/src/js/store/modules/comments.js +++ b/src/js/store/modules/comments.js @@ -60,8 +60,7 @@ const getters = { const actions = { - loadPoll({ commit, rootState }, payload) { - commit('reset') + loadPoll(context, payload) { let endPoint = 'apps/polls/comments/get/' if (payload.token !== undefined) { @@ -69,36 +68,37 @@ const actions = { } else if (payload.pollId !== undefined) { endPoint = endPoint.concat(payload.pollId) } else { + context.commit('reset') return } return axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('setComments', { 'list': response.data }) + context.commit('setComments', { list: response.data }) }, (error) => { - console.error('Error loading comments', { 'error': error.response }, { 'payload': payload }) + console.error('Error loading comments', { error: error.response }, { payload: payload }) throw error }) }, - setCommentAsync({ commit, rootState }, payload) { + setCommentAsync(context, payload) { let endPoint = 'apps/polls/comment/write/' - if (rootState.acl.foundByToken) { + if (context.rootState.acl.foundByToken) { endPoint = endPoint.concat('s/') } return axios.post(OC.generateUrl(endPoint), { - pollId: rootState.poll.id, - token: rootState.acl.token, + pollId: context.rootState.poll.id, + token: context.rootState.acl.token, message: payload.message, - userId: rootState.acl.userId + userId: context.rootState.acl.userId }) .then((response) => { - commit('addComment', response.data) + context.commit('addComment', response.data) return response.data }, (error) => { - console.error('Error writing comment', { 'error': error.response }, { 'payload': payload }) + console.error('Error writing comment', { error: error.response }, { payload: payload }) throw error }) } diff --git a/src/js/store/modules/index.js b/src/js/store/modules/index.js new file mode 100644 index 00000000..339f6211 --- /dev/null +++ b/src/js/store/modules/index.js @@ -0,0 +1,37 @@ +/* + * @copyright Copyright (c) 2019 Rene Gieling <github@dartcafe.de> + * + * @author Rene Gieling <github@dartcafe.de> + * + * @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 <http://www.gnu.org/licenses/>. + * + */ + +import camelCase from 'lodash/camelCase' +const requireModule = require.context('.', false, /\.js$/) +const modules = {} + +requireModule.keys().forEach(fileName => { + if (fileName === './index.js') return + const moduleName = camelCase( + fileName.replace(/(\.\/|\.js)/g, '') + ) + modules[moduleName] = { + namespaced: false, + ...requireModule(fileName).default + } +}) +export default modules diff --git a/src/js/store/modules/options.js b/src/js/store/modules/options.js index e917e137..938c44b0 100644 --- a/src/js/store/modules/options.js +++ b/src/js/store/modules/options.js @@ -47,7 +47,7 @@ const mutations = { }, setOption(state, payload) { - let index = state.list.findIndex((option) => { + const index = state.list.findIndex((option) => { return option.id === payload.option.id }) @@ -61,7 +61,9 @@ const mutations = { const getters = { lastOptionId: state => { - return Math.max.apply(Math, state.list.map(function(option) { return option.id })) + return Math.max.apply(Math, state.list.map(function(option) { + return option.id + })) }, sortedOptions: state => { @@ -71,8 +73,7 @@ const getters = { const actions = { - loadPoll({ commit, rootState }, payload) { - commit('reset') + loadPoll(context, payload) { let endPoint = 'apps/polls/options/get/' if (payload.token !== undefined) { @@ -80,63 +81,65 @@ const actions = { } else if (payload.pollId !== undefined) { endPoint = endPoint.concat(payload.pollId) } else { + context.commit('reset') return } return axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('optionsSet', { 'list': response.data }) + context.commit('optionsSet', { list: response.data }) }, (error) => { - console.error('Error loading options', { 'error': error.response }, { 'payload': payload }) + context.commit('reset') + console.error('Error loading options', { error: error.response }, { payload: payload }) throw error }) }, - updateOptionAsync({ commit, getters, dispatch, rootState }, payload) { - let endPoint = 'apps/polls/option/update' + updateOptionAsync(context, payload) { + const endPoint = 'apps/polls/option/update' return axios.post(OC.generateUrl(endPoint), { option: payload.option }) - .then((response) => { - commit('setOption', { 'option': payload.option }) + .then(() => { + context.commit('setOption', { option: payload.option }) }, (error) => { - console.error('Error updating option', { 'error': error.response }, { 'payload': payload }) + console.error('Error updating option', { error: error.response }, { payload: payload }) throw error }) }, - addOptionAsync({ commit, getters, dispatch, rootState }, payload) { - let endPoint = 'apps/polls/option/add/' - let option = {} + addOptionAsync(context, payload) { + const endPoint = 'apps/polls/option/add/' + const option = {} option.id = 0 - option.pollId = rootState.poll.id + option.pollId = context.rootState.poll.id - if (rootState.poll.type === 'datePoll') { + if (context.rootState.poll.type === 'datePoll') { option.timestamp = moment(payload.pollOptionText).unix() option.pollOptionText = moment.utc(payload.pollOptionText).format() - } else if (rootState.poll.type === 'textPoll') { + } else if (context.rootState.poll.type === 'textPoll') { option.timestamp = 0 option.pollOptionText = payload.pollOptionText } return axios.post(OC.generateUrl(endPoint), { option: option }) .then((response) => { - commit('setOption', { 'option': response.data }) + context.commit('setOption', { option: response.data }) }, (error) => { - console.error('Error adding option', { 'error': error.response }, { 'payload': payload }) + console.error('Error adding option', { error: error.response }, { payload: payload }) throw error }) }, - removeOptionAsync({ commit, getters, dispatch, rootState }, payload) { - let endPoint = 'apps/polls/option/remove/' + removeOptionAsync(context, payload) { + const endPoint = 'apps/polls/option/remove/' return axios.post(OC.generateUrl(endPoint), { option: payload.option }) - .then((response) => { - commit('optionRemove', { 'option': payload.option }) + .then(() => { + context.commit('optionRemove', { option: payload.option }) }, (error) => { - console.error('Error removing option', { 'error': error.response }, { 'payload': payload }) + console.error('Error removing option', { error: error.response }, { payload: payload }) throw error }) } diff --git a/src/js/store/modules/poll.js b/src/js/store/modules/poll.js index b7be1637..5732152c 100644 --- a/src/js/store/modules/poll.js +++ b/src/js/store/modules/poll.js @@ -64,7 +64,7 @@ const mutations = { const getters = { - expired: (state, getters) => { + expired: (state) => { return (state.expire > 0 && moment.unix(state.expire).diff() < 0) }, @@ -86,7 +86,7 @@ const getters = { const actions = { - loadPollMain({ commit }, payload) { + loadPollMain(context, payload) { let endPoint = 'apps/polls/poll/get/' if (payload.token !== undefined) { @@ -94,40 +94,41 @@ const actions = { } else if (payload.pollId !== undefined) { endPoint = endPoint.concat(payload.pollId) } else { + context.commit('resetPoll') return } return axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('setPoll', { 'poll': response.data }) + context.commit('setPoll', { poll: response.data }) }, (error) => { if (error.response.status !== '404') { - console.error('Error loading poll', { 'error': error.response }, { 'payload': payload }) + console.error('Error loading poll', { error: error.response }, { payload: payload }) } throw error }) }, - deletePollPromise({ commit }, payload) { - let endPoint = 'apps/polls/poll/delete/' + deletePollPromise(context, payload) { + const endPoint = 'apps/polls/poll/delete/' return axios.post(OC.generateUrl(endPoint), { poll: payload.id }) .then((response) => { return response }, (error) => { - console.error('Error deleting poll', { 'error': error.response }, { 'payload': payload }) + console.error('Error deleting poll', { error: error.response }, { payload: payload }) throw error }) }, - writePollPromise({ commit, rootState }) { - let endPoint = 'apps/polls/poll/write/' + writePollPromise(context) { + const endPoint = 'apps/polls/poll/write/' return axios.post(OC.generateUrl(endPoint), { poll: state }) .then((response) => { - commit('setPoll', { 'poll': response.data }) + context.commit('setPoll', { poll: response.data }) return response.poll }, (error) => { - console.error('Error writing poll:', { 'error': error.response }, { 'state': state }) + console.error('Error writing poll:', { error: error.response }, { state: state }) throw error }) diff --git a/src/js/store/modules/polls.js b/src/js/store/modules/polls.js index 737ba516..dcb1873e 100644 --- a/src/js/store/modules/polls.js +++ b/src/js/store/modules/polls.js @@ -55,19 +55,19 @@ const getters = { } const actions = { - loadPolls({ commit }) { - let endPoint = 'apps/polls/polls/get/' + loadPolls(context) { + const endPoint = 'apps/polls/polls/get/' return axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('setPolls', { list: response.data }) + context.commit('setPolls', { list: response.data }) }, (error) => { console.error(error.response) }) }, deletePollPromise(context, payload) { - let endPoint = 'apps/polls/remove/poll' + const endPoint = 'apps/polls/remove/poll' return axios.post( OC.generateUrl(endPoint), diff --git a/src/js/store/modules/shares.js b/src/js/store/modules/shares.js index 3d265ef9..9aff38a9 100644 --- a/src/js/store/modules/shares.js +++ b/src/js/store/modules/shares.js @@ -58,14 +58,14 @@ const getters = { }, invitationShares: state => { - let invitationTypes = ['user', 'group', 'mail', 'external', 'contact'] + const invitationTypes = ['user', 'group', 'mail', 'external', 'contact'] return state.list.filter(function(share) { return invitationTypes.includes(share.type) }) }, publicShares: state => { - let invitationTypes = ['public'] + const invitationTypes = ['public'] return state.list.filter(function(share) { return invitationTypes.includes(share.type) }) @@ -77,75 +77,71 @@ const getters = { } const actions = { - loadPoll({ commit, rootState }, payload) { - commit('reset') + loadPoll(context, payload) { let endPoint = 'apps/polls/shares/get/' - if (payload.token !== undefined) { - return - } else if (!rootState.acl.allowEdit) { - return - } else if (payload.pollId !== undefined) { + if (payload.pollId && context.rootState.acl.allowEdit) { endPoint = endPoint.concat(payload.pollId) } else { + context.commit('reset') return } return axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('setShares', { 'list': response.data }) + context.commit('setShares', { list: response.data }) }, (error) => { - console.error('Error loading shares', { 'error': error.response }, { 'payload': payload }) + console.error('Error loading shares', { error: error.response }, { payload: payload }) throw error }) }, - getShareAsync({ commit }, payload) { + getShareAsync(context, payload) { - let endPoint = 'apps/polls/share/get/' + const endPoint = 'apps/polls/share/get/' return axios.get(OC.generateUrl(endPoint + payload.token)) .then((response) => { - return { 'share': response.data } + return { share: response.data } }, (error) => { - console.error('Error loading share', { 'error': error.response }, { 'payload': payload }) + console.error('Error loading share', { error: error.response }, { payload: payload }) throw error }) }, - addShareFromUser({ commit }, payload) { - let endPoint = 'apps/polls/share/write/s/' + addShareFromUser(context, payload) { + const endPoint = 'apps/polls/share/write/s/' return axios.post(OC.generateUrl(endPoint), { token: payload.token, userName: payload.userName }) .then((response) => { - return { 'token': response.data.token } + return { token: response.data.token } }, (error) => { - console.error('Error writing share', { 'error': error.response }, { 'payload': payload }) + console.error('Error writing share', { error: error.response }, { payload: payload }) throw error }) }, writeSharePromise({ commit, rootState }, payload) { - let endPoint = 'apps/polls/share/write/' + const endPoint = 'apps/polls/share/write/' payload.share.pollId = rootState.poll.id return axios.post(OC.generateUrl(endPoint), { pollId: rootState.poll.id, share: payload.share }) .then((response) => { commit('addShare', response.data) }, (error) => { - console.error('Error writing share', { 'error': error.response }, { 'payload': payload }) + console.error('Error writing share', { error: error.response }, { payload: payload }) throw error }) }, - removeShareAsync({ commit, getters, dispatch, rootState }, payload) { - let endPoint = 'apps/polls/share/remove/' + removeShareAsync({ commit }, payload) { + const endPoint = 'apps/polls/share/remove/' return axios.post(OC.generateUrl(endPoint), { share: payload.share }) - .then((response) => { - commit('removeShare', { 'share': payload.share }) + .then(() => { + commit('removeShare', { share: payload.share }) }, (error) => { - console.error('Error removing share', { 'error': error.response }, { 'payload': payload }) + console.error('Error removing share', { error: error.response }, { payload: payload }) throw error }) } diff --git a/src/js/store/modules/subscription.js b/src/js/store/modules/subscription.js index e5db59f6..23903b0d 100644 --- a/src/js/store/modules/subscription.js +++ b/src/js/store/modules/subscription.js @@ -40,19 +40,19 @@ const mutations = { } const actions = { - getSubscription({ commit }, payload) { + getSubscription(context, payload) { axios.get(OC.generateUrl('apps/polls/subscription/get/' + payload.pollId)) - .then((response) => { - commit('setSubscription', true) + .then(() => { + context.commit('setSubscription', true) }) .catch(() => { - commit('setSubscription', false) + context.commit('setSubscription', false) }) }, - writeSubscriptionPromise({ commit }, payload) { + writeSubscriptionPromise(context, payload) { return axios.post(OC.generateUrl('apps/polls/subscription/set/'), { pollId: payload.pollId, subscribed: state.subscribed }) - .then((response) => { + .then(() => { }, (error) => { console.error(error.response) }) diff --git a/src/js/store/modules/votes.js b/src/js/store/modules/votes.js index 63fa5cca..a5a01284 100644 --- a/src/js/store/modules/votes.js +++ b/src/js/store/modules/votes.js @@ -41,7 +41,7 @@ const mutations = { }, setVote(state, payload) { - let index = state.list.findIndex(vote => + const index = state.list.findIndex(vote => parseInt(vote.pollId) === payload.pollId && vote.userId === payload.vote.userId && vote.voteOptionText === payload.option.pollOptionText) @@ -64,7 +64,7 @@ const getters = { }, participants: (state, getters, rootState) => { - let list = [] + const list = [] state.list.forEach(function(vote) { if (!list.includes(vote.userId)) { list.push(vote.userId) @@ -79,17 +79,17 @@ const getters = { }, votesRank: (state, getters, rootGetters) => { - let rank = [] + const rank = [] rootGetters.options.list.forEach(function(option) { - let countYes = state.list.filter(vote => vote.voteOptionText === option.pollOptionText && vote.voteAnswer === 'yes').length - let countMaybe = state.list.filter(vote => vote.voteOptionText === option.pollOptionText && vote.voteAnswer === 'maybe').length - let countNo = state.list.filter(vote => vote.voteOptionText === option.pollOptionText && vote.voteAnswer === 'no').length + const countYes = state.list.filter(vote => vote.voteOptionText === option.pollOptionText && vote.voteAnswer === 'yes').length + const countMaybe = state.list.filter(vote => vote.voteOptionText === option.pollOptionText && vote.voteAnswer === 'maybe').length + const countNo = state.list.filter(vote => vote.voteOptionText === option.pollOptionText && vote.voteAnswer === 'no').length rank.push({ - 'rank': 0, - 'pollOptionText': option.pollOptionText, - 'yes': countYes, - 'no': countNo, - 'maybe': countMaybe + rank: 0, + pollOptionText: option.pollOptionText, + yes: countYes, + no: countNo, + maybe: countMaybe }) }) return orderBy(rank, ['yes', 'maybe'], ['desc', 'desc']) @@ -99,7 +99,7 @@ const getters = { return getters.votesRank[0] }, - getVote: (state, getters) => (payload) => { + getVote: (state) => (payload) => { return state.list.find(vote => { return (vote.userId === payload.userId && vote.voteOptionText === payload.option.pollOptionText) @@ -119,46 +119,46 @@ const getters = { const actions = { - loadPoll({ commit, rootState }, payload) { - commit('reset') + loadPoll(context, payload) { let endPoint = 'apps/polls/votes/get/' if (payload.token !== undefined) { endPoint = endPoint.concat('s/', payload.token) } else if (payload.pollId !== undefined) { endPoint = endPoint.concat(payload.pollId) } else { + context.commit('reset') return } axios.get(OC.generateUrl(endPoint)) .then((response) => { - commit('setVotes', { 'list': response.data }) + context.commit('setVotes', { list: response.data }) }, (error) => { - console.error('Error loading votes', { 'error': error.response }, { 'payload': payload }) + console.error('Error loading votes', { error: error.response }, { payload: payload }) throw error }) }, - setVoteAsync({ commit, getters, rootState }, payload) { + setVoteAsync(context, payload) { let endPoint = 'apps/polls/vote/set/' - if (rootState.acl.foundByToken) { + if (context.rootState.acl.foundByToken) { endPoint = endPoint.concat('s/') } return axios.post(OC.generateUrl(endPoint), { - pollId: rootState.poll.id, - token: rootState.acl.token, + pollId: context.rootState.poll.id, + token: context.rootState.acl.token, option: payload.option, userId: payload.userId, setTo: payload.setTo }) .then((response) => { - commit('setVote', { option: payload.option, pollId: rootState.poll.id, vote: response.data }) + context.commit('setVote', { option: payload.option, pollId: context.rootState.poll.id, vote: response.data }) return response.data }, (error) => { - console.error('Error setting vote', { 'error': error.response }, { 'payload': payload }) + console.error('Error setting vote', { error: error.response }, { payload: payload }) throw error }) } diff --git a/src/js/views/PollList.vue b/src/js/views/PollList.vue index 87ead742..c4eb15d9 100644 --- a/src/js/views/PollList.vue +++ b/src/js/views/PollList.vue @@ -107,7 +107,7 @@ export default { this.loading = true this.$store .dispatch('loadPolls') - .then(response => { + .then(() => { this.loading = false }) .catch(error => { @@ -116,35 +116,6 @@ export default { OC.Notification.showTemporary(t('polls', 'Error loading polls', 1, this.poll.title), { type: 'error' }) }) } - - // removePoll(index, poll) { - // const params = { - // title: t('polls', 'Delete poll'), - // text: t('polls', 'Do you want to delete "%n"?', 1, poll.title), - // buttonHideText: t('polls', 'No, keep poll.'), - // buttonConfirmText: t('polls', 'Yes, delete poll.'), - // // Call store action here - // onConfirm: () => { - // this.loading = true - // this.$store - // .dispatch({ - // type: 'deletePollPromise', - // poll: poll - // }) - // .then(response => { - // this.loading = false - // this.refreshPolls() - // OC.Notification.showTemporary(t('polls', 'Poll "%n" deleted', 1, poll.title), { type: 'success' }) - // }) - // .catch(error => { - // this.loading = false - // console.error('remove poll: ', error.response) - // OC.Notification.showTemporary(t('polls', 'Error while deleting Poll "%n"', 1, poll.title), { type: 'error' }) - // }) - // } - // } - // - // } } } </script> @@ -153,9 +124,11 @@ export default { #app-content { // flex-direction: column; } + .main-container { flex: 1; } + .table { width: 100%; // margin-top: 45px; diff --git a/src/js/views/PublicVote.vue b/src/js/views/PublicVote.vue index c120f782..22c4f841 100644 --- a/src/js/views/PublicVote.vue +++ b/src/js/views/PublicVote.vue @@ -77,7 +77,7 @@ export default { }, watch: { - '$route'(to, from) { + $route() { this.loadPoll() } }, @@ -90,7 +90,7 @@ export default { loadPoll() { this.loading = false this.$store.dispatch('loadPollMain', { token: this.$route.params.token }) - .then((response) => { + .then(() => { this.$store.dispatch('loadPoll', { token: this.$route.params.token }) .then(() => { this.loading = false @@ -115,7 +115,6 @@ export default { flex: 1; margin: 0; flex-direction: column; - flex: 1; flex-wrap: nowrap; overflow-x: scroll; h1, h2, h3, h4 { diff --git a/src/js/views/Vote.vue b/src/js/views/Vote.vue index 2e28b2c6..021cc947 100644 --- a/src/js/views/Vote.vue +++ b/src/js/views/Vote.vue @@ -86,17 +86,20 @@ export default { }, watch: { - '$route'(to, from) { + $route() { this.loadPoll() }, - 'poll.id'(to, from) { - this.$store.dispatch({ type: 'loadPoll', pollId: this.$route.params.id }) + 'poll.id': function() { + this.$store.dispatch({ type: 'loadAcl', pollId: this.$route.params.id }) .then(() => { - if (this.acl.allowEdit && moment.unix(this.poll.created).diff() > -10000) { - this.sideBarOpen = true - } - this.loading = false + this.$store.dispatch({ type: 'loadPoll', pollId: this.$route.params.id }) + .then(() => { + if (this.acl.allowEdit && moment.unix(this.poll.created).diff() > -10000) { + this.sideBarOpen = true + } + this.loading = false + }) }) } }, @@ -126,7 +129,6 @@ export default { flex: 1; margin: 0; flex-direction: column; - flex: 1; flex-wrap: nowrap; overflow-x: scroll; h1, h2, h3, h4 { |