From ca5cb474baa47339955ec5387bccf3d3e7f0f58d Mon Sep 17 00:00:00 2001 From: les Date: Sun, 19 Jul 2020 22:05:11 +0200 Subject: [PATCH 001/363] minor --- server/helpers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/helpers.js b/server/helpers.js index cc9a1cbd..0f9cdacd 100644 --- a/server/helpers.js +++ b/server/helpers.js @@ -75,8 +75,8 @@ module.exports = { const outStream = fs.createWriteStream(finalPath) const thumbStream = fs.createWriteStream(thumbPath) - const resizer = sharp().resize(1200).jpg({ quality: 95 }) - const thumbnailer = sharp().resize(400).jpg({ quality: 90 }) + const resizer = sharp().resize(1200).jpeg({ quality: 95 }) + const thumbnailer = sharp().resize(400).jpeg({ quality: 90 }) const response = await axios({ method: 'GET', url, responseType: 'stream' }) From 59811e580cdb99f19b38ddeca6c7b5b1d838ad8d Mon Sep 17 00:00:00 2001 From: les Date: Sun, 19 Jul 2020 22:13:23 +0200 Subject: [PATCH 002/363] fix #81, reset logo --- components/admin/Settings.vue | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/components/admin/Settings.vue b/components/admin/Settings.vue index 5f488da8..f9cfb414 100644 --- a/components/admin/Settings.vue +++ b/components/admin/Settings.vue @@ -24,15 +24,17 @@ small.d-block.text-secondary {{$t('admin.description_description')}} div.mt-4 {{$t('admin.favicon')}} - el-upload(ref='upload' - :action='`${settings.baseurl}/api/settings/logo`' - :on-success="forceLogoReload" - name='logo' - :show-file-list="true" - accept='image/png' - :limit='1' - :multiple='false') - el-button(slot='trigger' size='small' type='primary' plain) Select file + el-upload(ref='upload' + :action='`${settings.baseurl}/api/settings/logo`' + :on-success="forceLogoReload" + name='logo' + :show-file-list="true" + accept='image/png' + :limit='1' + :multiple='false') + el-button-group + el-button(size='small' type='primary' plain) Select file + el-button(size='small' type='success' plain @click='resetLogo') Reset .el-upload__tip(slot='tip') png files with a size less than 500kb el-image(:src='`${settings.baseurl}/favicon.ico?${logoKey}`') el-switch.d-block.mt-4(v-model='allow_registration' @@ -106,6 +108,11 @@ export default { this.$refs.upload.clearFiles() this.logoKey++ }, + resetLogo (e) { + this.setSetting({ key: 'favicon', value: null }) + .then(this.forceLogoReload) + e.stopPropagation() + }, save (key, value) { if (this.settings[key] !== value) { this.setSetting({ key, value }) From 2758541df0f8a7136905be67163178257339a799 Mon Sep 17 00:00:00 2001 From: les Date: Sat, 25 Jul 2020 21:41:22 +0200 Subject: [PATCH 003/363] s/element/vuetify :D --- assets/event.less | 100 +++---- assets/style.less | 418 +++++++++++++++--------------- components/Announcement.vue | 51 ++-- components/Editor.vue | 116 ++++----- components/Event.vue | 129 +++++++-- components/Footer.vue | 15 ++ components/Home.vue | 16 +- components/Nav.vue | 212 ++++++++++----- components/Search.vue | 70 ++--- components/Snackbar.vue | 39 +++ components/admin/Announcement.vue | 34 ++- components/admin/Federation.vue | 99 ++++--- components/admin/Places.vue | 49 ++-- components/admin/Settings.vue | 105 +++++--- components/admin/Users.vue | 106 ++++---- layouts/default.vue | 39 ++- layouts/error.vue | 2 +- nuxt.config.js | 25 +- package.json | 96 +++---- pages/Admin.vue | 94 +++---- pages/Login.vue | 41 +-- pages/Register.vue | 28 +- pages/about.vue | 4 +- pages/add/_edit.vue | 149 ++++++----- pages/event/_id.vue | 395 +++++++++++++++------------- pages/event/eventAdmin.vue | 20 +- pages/export.vue | 64 +++-- plugins/element-ui.js | 68 ----- plugins/vue-awesome.js | 59 ----- plugins/vue-clipboard.js | 59 +++++ server/api/controller/settings.js | 2 +- vuetify.options.js | 14 + yarn.lock | 384 ++++++++++++++++++--------- 33 files changed, 1762 insertions(+), 1340 deletions(-) create mode 100644 components/Footer.vue create mode 100644 components/Snackbar.vue delete mode 100644 plugins/element-ui.js delete mode 100644 plugins/vue-awesome.js create mode 100644 plugins/vue-clipboard.js create mode 100644 vuetify.options.js diff --git a/assets/event.less b/assets/event.less index 0a4c2cf4..2bf07805 100644 --- a/assets/event.less +++ b/assets/event.less @@ -1,56 +1,56 @@ -.event { - width: 320px; - max-width: 450px; - flex-grow: 1; - margin: .2em; - background-color: #202020; - overflow: hidden; +// .event { +// width: 320px; +// max-width: 450px; +// flex-grow: 1; +// margin: .2em; +// background-color: #202020; +// overflow: hidden; - a:hover { - text-decoration: none; - .title { - border-bottom: 1px solid #888; - color: white; - } - } +// a:hover { +// text-decoration: none; +// .title { +// border-bottom: 1px solid #888; +// color: white; +// } +// } - .title { - margin-left: 1rem; - margin-top: 1rem; - margin-right: 1rem; - border-bottom: 1px solid #333; - transition: border-color .5s; - font-size: 1.2em; - max-height: 3em; - overflow: hidden; - color: white; - font-weight: bold; - } +// .title { +// margin-left: 1rem; +// margin-top: 1rem; +// margin-right: 1rem; +// border-bottom: 1px solid #333; +// transition: border-color .5s; +// font-size: 1.2em; +// max-height: 3em; +// overflow: hidden; +// color: white; +// font-weight: bold; +// } - .card-footer { - max-height: 4.5em; - overflow: hidden; - padding: .25rem 0.5rem; - line-height: 1.8rem; - min-height: 2.2rem; - } +// .card-footer { +// max-height: 4.5em; +// overflow: hidden; +// padding: .25rem 0.5rem; +// line-height: 1.8rem; +// min-height: 2.2rem; +// } - .card-body { - overflow: hidden; - } +// .card-body { +// overflow: hidden; +// } - .description { - color: #999; - font-size: 0.8em; - overflow: hidden; - max-height: 100%; - } +// .description { +// color: #999; +// font-size: 0.8em; +// overflow: hidden; +// max-height: 100%; +// } - .el-image { width: 100% } - img { - width: 100%; - max-height: 250px; - object-fit: cover; - object-position: top; - } -} +// .el-image { width: 100% } +// img { +// width: 100%; +// max-height: 250px; +// object-fit: cover; +// object-position: top; +// } +// } diff --git a/assets/style.less b/assets/style.less index a0bffed8..4ab71e68 100644 --- a/assets/style.less +++ b/assets/style.less @@ -1,215 +1,215 @@ -:focus {outline:none;} -::-moz-focus-inner {border:0;} +// :focus {outline:none;} +// ::-moz-focus-inner {border:0;} -blockquote { - border-left: 3px solid grey; - font-style: italic; - color: #666; - padding-left: 1em; -} - -code { - font-family: sans-serif; - display: inline-block; - padding: 0 .4rem; - border-radius: 5px; - font-size: .8rem; - font-weight: 700; - background: rgba(0,0,0,.1); - color: #888; -} - -html, body { - font-family: sans-serif; - scroll-behavior: smooth; - text-rendering: optimizeSpeed; - background-color: #111; - overflow-y: auto; - scrollbar-width: thin; - scrollbar-color: #555 #111; - padding: 0 !important; -} - -#__nuxt, #__layout { - min-height: 100vh; - display: flex; - flex-direction: column; -} - -#main { - min-height: 200px; - overflow: hidden; - scrollbar-width: thin; - transition: background-color .5s, opacity .5s; //, color 1s; - background-color: white; - &.dark { - background-color: #111; - } -} - -#content { - max-width: 1400px; - flex-grow: 1; - width: 100%; - margin: 0 auto; -} - -#header, #footer { - color: white; - background-color: #222; - font-size: 18px; - padding: 0 15px; -} - - -#footer { - a { - color: orangered; - transition: color .4s; - &:hover { - text-decoration: none; - color: orange; - } - } - - #links a { - margin-left: 15px; - } - min-height: 6em; - padding-top: 2em; - font-size: 1em; -} - -#header .el-menu--horizontal { - background-color: #222; - color: white; - .el-menu-item, .el-submenu__title { - color: white; - } - - .el-submenu .el-submenu__icon-arrow { - margin-left: 0px; - } - - .el-submenu .el-submenu__title { - padding: 0 15px; - } - - .el-menu-item:not(.is-disabled):focus, - .el-menu-item.is-active, - .el-menu-item:not(.is-disabled):hover, - .el-submenu:focus > .el-submenu__title, - .el-submenu:hover > .el-submenu__title, - .el-submenu.is-active > .el-submenu__title, - .el-submenu.is-opened { - color: white; - background-color: #111; - } -} - - -.page-enter-active { - transition: opacity .05s; -} - -.page-enter, .page-leave-active { - transition: opacity .3s; //, transform .3s; - opacity: 0; - // transform: translateX(30px); -} - -.el-card { - max-width: 700px; - margin: 0 auto; -} - -.el-menu-item { - height: 40px; - line-height: 40px; - a { - color: #303133; - display: block; - text-decoration: none; - text-overflow: ellipsis; - overflow: hidden; - } -} - -.el-message-box { - max-width: 90%; -} - -//TODO: refactoring -.el-button.is-plain, -.el-button.is-plain:focus, -.el-button.is-plain { - border-color: #ff450075; - background-color: transparent; - color: orangered; - - &:hover { - border-color: #ff450075; - background-color: transparent; - color: orange; - } -} - -// TODO: this should be a link - -.event .p-location { - transition: color .2s; - &:hover { - cursor: pointer; - color: orangered !important; - } -} - -.el-button--text { - color: orangered !important; - &:hover { - color: orange !important; - } -} - -.el-button--success.is-plain { - color: #2c8600; - border-color: #9de27b; - background-color: #f9fff6; -} - -.el-button--mini, .el-button--mini.is-round { - padding: 6px 12px; - font-size: 0.8rem; -} - -.bg-dark { - background-color: #292929 !important; -} - -.el-dialog { - min-height: 300px; - max-width: 600px; - width: 100%; - .el-dialog__body { - word-break: normal !important; - } -} - -.el-switch__label span { - position: absolute; -} - -// .el-input { -// max-width: 350px; +// blockquote { +// border-left: 3px solid grey; +// font-style: italic; +// color: #666; +// padding-left: 1em; // } -// @media only screen and (max-width: 768px) { - // .el-card { - // padding: 0px !important; - // border-radius: 0px; - // } +// code { +// font-family: sans-serif; +// display: inline-block; +// padding: 0 .4rem; +// border-radius: 5px; +// font-size: .8rem; +// font-weight: 700; +// background: rgba(0,0,0,.1); +// color: #888; +// } + +// html, body { +// font-family: sans-serif; +// scroll-behavior: smooth; +// text-rendering: optimizeSpeed; +// background-color: #111; +// overflow-y: auto; +// scrollbar-width: thin; +// scrollbar-color: #555 #111; +// padding: 0 !important; +// } + +// #__nuxt, #__layout { +// min-height: 100vh; +// display: flex; +// flex-direction: column; +// } + +// #main { +// min-height: 200px; +// overflow: hidden; +// scrollbar-width: thin; +// transition: background-color .5s, opacity .5s; //, color 1s; +// background-color: white; +// &.dark { +// background-color: #111; +// } +// } + +// #content { +// max-width: 1400px; +// flex-grow: 1; +// width: 100%; +// margin: 0 auto; +// } + +// #header, #footer { +// color: white; +// background-color: #222; +// font-size: 18px; +// padding: 0 15px; // } -@import './event.less'; -@import './editor.less'; \ No newline at end of file +// #footer { +// a { +// color: orangered; +// transition: color .4s; +// &:hover { +// text-decoration: none; +// color: orange; +// } +// } + +// #links a { +// margin-left: 15px; +// } +// min-height: 6em; +// padding-top: 2em; +// font-size: 1em; +// } + +// #header .el-menu--horizontal { +// background-color: #222; +// color: white; +// .el-menu-item, .el-submenu__title { +// color: white; +// } + +// .el-submenu .el-submenu__icon-arrow { +// margin-left: 0px; +// } + +// .el-submenu .el-submenu__title { +// padding: 0 15px; +// } + +// .el-menu-item:not(.is-disabled):focus, +// .el-menu-item.is-active, +// .el-menu-item:not(.is-disabled):hover, +// .el-submenu:focus > .el-submenu__title, +// .el-submenu:hover > .el-submenu__title, +// .el-submenu.is-active > .el-submenu__title, +// .el-submenu.is-opened { +// color: white; +// background-color: #111; +// } +// } + + +// .page-enter-active { +// transition: opacity .05s; +// } + +// .page-enter, .page-leave-active { +// transition: opacity .3s; //, transform .3s; +// opacity: 0; +// // transform: translateX(30px); +// } + +// .el-card { +// max-width: 700px; +// margin: 0 auto; +// } + +// .el-menu-item { +// height: 40px; +// line-height: 40px; +// a { +// color: #303133; +// display: block; +// text-decoration: none; +// text-overflow: ellipsis; +// overflow: hidden; +// } +// } + +// .el-message-box { +// max-width: 90%; +// } + +// //TODO: refactoring +// .el-button.is-plain, +// .el-button.is-plain:focus, +// .el-button.is-plain { +// border-color: #ff450075; +// background-color: transparent; +// color: orangered; + +// &:hover { +// border-color: #ff450075; +// background-color: transparent; +// color: orange; +// } +// } + +// // TODO: this should be a link + +// .event .p-location { +// transition: color .2s; +// &:hover { +// cursor: pointer; +// color: orangered !important; +// } +// } + +// .el-button--text { +// color: orangered !important; +// &:hover { +// color: orange !important; +// } +// } + +// .el-button--success.is-plain { +// color: #2c8600; +// border-color: #9de27b; +// background-color: #f9fff6; +// } + +// .el-button--mini, .el-button--mini.is-round { +// padding: 6px 12px; +// font-size: 0.8rem; +// } + +// .bg-dark { +// background-color: #292929 !important; +// } + +// .el-dialog { +// min-height: 300px; +// max-width: 600px; +// width: 100%; +// .el-dialog__body { +// word-break: normal !important; +// } +// } + +// .el-switch__label span { +// position: absolute; +// } + +// // .el-input { +// // max-width: 350px; +// // } + +// // @media only screen and (max-width: 768px) { +// // .el-card { +// // padding: 0px !important; +// // border-radius: 0px; +// // } +// // } + + +// @import './event.less'; +// @import './editor.less'; \ No newline at end of file diff --git a/components/Announcement.vue b/components/Announcement.vue index f94673e9..94eedd57 100644 --- a/components/Announcement.vue +++ b/components/Announcement.vue @@ -1,5 +1,16 @@ + diff --git a/plugins/v-calendar.js b/plugins/v-calendar.js deleted file mode 100644 index 29f0414e..00000000 --- a/plugins/v-calendar.js +++ /dev/null @@ -1,7 +0,0 @@ -// import Vue from 'vue' -// import VCalendar from 'v-calendar' -// export default () => { -// Vue.use(VCalendar, { -// firstDayOfWeek: 2 -// }) -// } From c41c930f7054702b7fbbca60d51c392d1835a166 Mon Sep 17 00:00:00 2001 From: les Date: Fri, 13 Nov 2020 00:12:14 +0100 Subject: [PATCH 132/363] fix Confirm title --- components/Confirm.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Confirm.vue b/components/Confirm.vue index 18702406..bc6d3bb0 100644 --- a/components/Confirm.vue +++ b/components/Confirm.vue @@ -63,7 +63,7 @@ export default { methods: { open (message, options = {}) { this.dialog = true - this.title = options.title || 'Confirm' + this.title = options.title || this.$t('common.confirm') this.message = this.$t(message, options) this.options = Object.assign(this.options, options) return new Promise((resolve, reject) => { From 95e473d531fdf5fb440fb233458ad5532abfc03a Mon Sep 17 00:00:00 2001 From: les Date: Fri, 13 Nov 2020 00:13:44 +0100 Subject: [PATCH 133/363] cleaning export --- assets/style.less | 5 ++ components/FollowMe.vue | 7 +- components/List.vue | 14 ++-- components/Search.vue | 15 ++-- docs/assets/css/style.css | 6 +- locales/it.json | 4 +- package.json | 12 ++-- pages/event/_id.vue | 1 + pages/export.vue | 146 ++++++++++++++++++++++---------------- plugins/api.js | 21 +++--- server/helpers.js | 6 +- store/index.js | 9 --- 12 files changed, 134 insertions(+), 112 deletions(-) diff --git a/assets/style.less b/assets/style.less index 11785459..2cc3e325 100644 --- a/assets/style.less +++ b/assets/style.less @@ -1,3 +1,8 @@ html, body { scrollbar-width: thin; + scrollbar-color: orange; } + +li { + margin-left: 10px; +} \ No newline at end of file diff --git a/components/FollowMe.vue b/components/FollowMe.vue index 620eed66..a486eb2f 100644 --- a/components/FollowMe.vue +++ b/components/FollowMe.vue @@ -1,5 +1,5 @@ diff --git a/components/Search.vue b/components/Search.vue index 8e8c3798..0732c2b7 100644 --- a/components/Search.vue +++ b/components/Search.vue @@ -6,11 +6,6 @@ :label="$t('event.show_recurrent')" @change="v => $emit('showrecurrent', v)") - v-switch.mt-0( - v-if='pastFilter' inset color='primary' - :label="$t('event.show_past')" - @change="v => $emit('showpast', v)") - v-autocomplete.mt-0( :label='$t("common.search")' :items='keywords' @@ -36,7 +31,7 @@ diff --git a/docs/assets/css/style.css b/docs/assets/css/style.css index 895bcced..632592e0 100644 --- a/docs/assets/css/style.css +++ b/docs/assets/css/style.css @@ -1,4 +1,4 @@ -.navigation-list-item { +/* .navigation-list-item { font-size: 18px !important; padding: 4px; } @@ -10,3 +10,7 @@ html, body { .page-content h1:first-of-type { font-weight: 500; } + +li { + margin-left: 10px; +} */ \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index ccde9915..4f864209 100644 --- a/locales/it.json +++ b/locales/it.json @@ -165,8 +165,8 @@ "user_create_ok": "Utente creato", "allow_registration_description": "Vuoi abilitare la registrazione?", "allow_anon_event": "Si possono inserire eventi anonimi (previa conferma)?", - "allow_recurrent_event": "Abilita eventi fissi", - "recurrent_event_visible": "Appuntamenti fissi visibili di default", + "allow_recurrent_event": "Abilita eventi ricorrenti", + "recurrent_event_visible": "Appuntamenti ricorrenti visibili di default", "federation": "Federazione / ActivityPub", "enable_federation": "Abilita la federazione", "enable_federation_help": "Sarà possibile seguire questa istanza dal fediverso", diff --git a/package.json b/package.json index bdfd5a4e..aafd1424 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "cors": "^2.8.5", "cross-env": "^7.0.2", "date-fns": "^2.16.1", - "dayjs": "^1.9.5", + "dayjs": "^1.9.6", "dompurify": "^2.2.2", "email-templates": "^7.1.2", "express": "^4.17.1", @@ -61,7 +61,7 @@ "multer": "^1.4.2", "nuxt": "^2.14.7", "nuxt-express-module": "^0.0.11", - "pg": "^8.4.2", + "pg": "^8.5.0", "sequelize": "^6.3.5", "sequelize-cli": "^6.2.0", "sharp": "^0.26.2", @@ -79,7 +79,7 @@ "@nuxtjs/eslint-config": "^4.0.0", "@nuxtjs/vuetify": "^1.11.2", "babel-eslint": "^10.1.0", - "eslint": "^7.12.1", + "eslint": "^7.13.0", "eslint-config-prettier": "^6.15.0", "eslint-config-standard": "^16.0.1", "eslint-loader": "^4.0.2", @@ -88,14 +88,14 @@ "eslint-plugin-nuxt": "^1.0.0", "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": ">=4.0.1", - "eslint-plugin-standard": "^4.0.2", + "eslint-plugin-standard": "^4.1.0", "eslint-plugin-vue": "^7.1.0", - "less-loader": "^7.0.2", + "less-loader": "^7.1.0", "nodemon": "^2.0.6", "prettier": "^2.1.2", "pug-plain-loader": "^1.0.0", "sass": "^1.29.0", - "sass-loader": "^10.0.5", + "sass-loader": "^10.1.0", "vue-cli-plugin-vuetify": "~2.0.7", "vuetify-loader": "^1.3.0", "webpack-cli": "^4.2.0" diff --git a/pages/event/_id.vue b/pages/event/_id.vue index 2ece5023..a3cc3227 100644 --- a/pages/event/_id.vue +++ b/pages/event/_id.vue @@ -144,6 +144,7 @@ const htmlToText = require('html-to-text') export default { name: 'Event', components: { EventAdmin, EmbedEvent, FollowMe }, + transition: null, async asyncData ({ $axios, params, error, store }) { try { const event = await $axios.$get(`/event/${params.id}`) diff --git a/pages/export.vue b/pages/export.vue index 3f673218..4e82bfe9 100644 --- a/pages/export.vue +++ b/pages/export.vue @@ -1,87 +1,109 @@ diff --git a/plugins/api.js b/plugins/api.js index 77e664a7..edd450e6 100644 --- a/plugins/api.js +++ b/plugins/api.js @@ -1,11 +1,10 @@ export default ({ $axios, store }, inject) => { - const api = { /** * Get events - * + * * filter: { * start_datetime: unix_timestamp (default now) * end_datetime: unix_timestamp @@ -13,16 +12,18 @@ export default ({ $axios, store }, inject) => { * places: [place_id], * limit: (default ∞) * } - * + * */ async getEvents (params) { try { - const events = await $axios.$get(`/events`, { params: { - start: params.start, - end: params.end, - places: params.places && params.places.join(','), - tags: params.tags && params.tags.join(',') - }} ) + const events = await $axios.$get('/events', { + params: { + start: params.start, + end: params.end, + places: params.places && params.places.join(','), + tags: params.tags && params.tags.join(',') + } + }) return events } catch (e) { console.error(e) @@ -31,4 +32,4 @@ export default ({ $axios, store }, inject) => { } } inject('api', api) -} \ No newline at end of file +} diff --git a/server/helpers.js b/server/helpers.js index 3aa5e0ae..f02278c2 100644 --- a/server/helpers.js +++ b/server/helpers.js @@ -1,6 +1,6 @@ const settingsController = require('./api/controller/settings') const acceptLanguage = require('accept-language') -const moment = require('moment-timezone') +const dayjs = require('dayjs') const config = require('config') const debug = require('debug')('helpers') const pkg = require('../package.json') @@ -66,8 +66,8 @@ module.exports = { acceptLanguage.languages(Object.keys(locales)) req.settings.locale = acceptLanguage.get(acceptedLanguages) req.settings.user_locale = settingsController.user_locale[req.settings.locale] - moment.locale(req.settings.locale) - moment.tz.setDefault(req.settings.instance_timezone) + dayjs.locale(req.settings.locale) + dayjs.tz.setDefault(req.settings.instance_timezone) next() }, diff --git a/store/index.js b/store/index.js index 7ee8c80a..23646ad9 100644 --- a/store/index.js +++ b/store/index.js @@ -72,21 +72,12 @@ export const actions = { const { tags, places } = await this.$axios.$get('/event/meta') commit('update', { tags, places }) }, - async addEvent ({ commit }, formData) { - await this.$axios.$post('/event', formData) - }, - async updateEvent ({ commit }, formData) { - await this.$axios.$put('/event', formData) - }, setFilters ({ commit }, filters) { commit('setFilters', filters) }, setAnnouncements ({ commit }, announcements) { commit('setAnnouncements', announcements) }, - delEvent ({ commit }, eventId) { - commit('delEvent', eventId) - }, async setSetting ({ commit }, setting) { await this.$axios.$post('/settings', setting) commit('setSetting', setting) From f22c6b848390bb628e0e200a56eda5c99991de65 Mon Sep 17 00:00:00 2001 From: les Date: Fri, 13 Nov 2020 00:13:59 +0100 Subject: [PATCH 134/363] DateInput --- pages/add/DateInput.vue | 29 +++++++++++++---------------- pages/add/_edit.vue | 16 +++++++++------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/pages/add/DateInput.vue b/pages/add/DateInput.vue index c5a1cf60..95e56101 100644 --- a/pages/add/DateInput.vue +++ b/pages/add/DateInput.vue @@ -20,11 +20,11 @@ v-row v-date-picker( :min='today' v-model="value.date" - :range="type === 'multidate'" + :range="value.type === 'multidate'" :locale='settings.locale' @input="pick") - v-btn-toggle.col-md-4(@change='changeType' color='primary' :value='type') + v-btn-toggle.col-md-4(@change='changeType' color='primary' :value='value.type') v-btn(value='normal') {{$t('event.normal')}} v-btn(value='multidate') {{$t('event.multidate')}} v-menu(v-if='settings.allow_recurrent_event' offset-y open-on-hover) @@ -34,8 +34,8 @@ v-row v-list-item(v-for='f in frequencies' :key='f.value' @click='selectFrequency(f.value)') {{f.text}} - //- //- p.col-12 {{$t(`event.${type}_description`)}} - //- v-btn-toggle(v-if="type === 'recurrent'" v-model='recurrent.frequency' color='primary') + p.col-12 {{$t(`event.${value.type}_description`)}} + //- v-btn-toggle(v-if="type === 'recurrent'" v-model='value.recurrent.frequency' color='primary') //- v-btn(v-for='f in frequencies' :value='f.value') {{f.text}} //- .datePicker @@ -49,9 +49,9 @@ v-row //- is-expanded //- :min-date='type !== "recurrent" && new Date()') - div.text-center.mb-2(v-if='type === "recurrent"') - span(v-if='recurrent.frequency !== "1m" && recurrent.frequency !== "2m"') {{whenPatterns}} - v-btn-toggle.mt-1(v-else v-model='recurrent.type' color='primary') + div.text-center.mb-2(v-if='value.type === "recurrent"') + span(v-if='value.recurrent.frequency !== "1m" && value.recurrent.frequency !== "2m"') {{whenPatterns}} + v-btn-toggle.mt-1(v-else v-model='value.recurrent.type' color='primary') v-btn(v-for='whenPattern in whenPatterns' :value='whenPattern.key' :key='whenPatterns.key' small) span {{whenPattern.label}} @@ -72,7 +72,6 @@ export default { }, data () { return { - date: null, datePickerMenu: false, today: dayjs().format('YYYY-MM-DD'), type: 'normal', @@ -95,10 +94,10 @@ export default { return modeMap[this.type] }, whenPatterns () { - if (!this.date) { return } - const date = dayjs(this.date) + if (!this.value.date) { return } + const date = dayjs(this.value.date) - const freq = this.recurrent.frequency + const freq = this.value.recurrent.frequency const weekDay = date.format('dddd') if (freq === '1w' || freq === '2w') { return this.$t(`event.recurrent_${freq}_days`, { days: weekDay }) @@ -219,15 +218,13 @@ export default { }, methods: { changeType (type) { - this.date = null - this.type = type || 'normal' + this.$emit('input', { type: type || 'normal', date: undefined }) }, selectFrequency (f) { - this.recurrent.frequency = f - this.type = 'recurrent' + this.$emit('input', { recurrent: { frequency: f }, date: null, type: 'recurrent' }) }, pick (value) { - if (this.type === 'normal' || this.type === 'recurrent' || this.date.length === 2) { + if (this.value.type === 'normal' || this.value.type === 'recurrent' || this.value.date.length === 2) { this.datePickerMenu = false } } diff --git a/pages/add/_edit.vue b/pages/add/_edit.vue index 205bb3a8..1b92a357 100644 --- a/pages/add/_edit.vue +++ b/pages/add/_edit.vue @@ -99,10 +99,11 @@ export default { data.event.place.address = event.place.address || '' data.date = {} if (event.multidate) { + const start = dayjs.unix(event.start_datetime).format('YYYY-MM-DD') + const end = dayjs.unix(event.end_datetime).format('YYYY-MM-DD') data.date = { type: 'multidate', - start: dayjs.unix(event.start_datetime).toDate(), - end: dayjs.unix(event.end_datetime).toDate() + date: [start, end] } } else if (event.recurrent) { data.date.type = 'recurrent' @@ -150,10 +151,10 @@ export default { } }, computed: { - ...mapState(['tags', 'places', 'events', 'settings']) + ...mapState(['tags', 'places', 'settings']) }, methods: { - ...mapActions(['addEvent', 'updateEvent', 'updateMeta', 'updateEvents']), + ...mapActions(['updateMeta']), eventImported (event) { this.event = Object.assign(this.event, event) }, @@ -179,6 +180,7 @@ export default { const formData = new FormData() if (this.date.type === 'multidate') { + console.error('sono in multidate!') start_datetime = dayjs(this.date.date[0]) .set('hour', start_hour).set('minute', start_minute) end_datetime = dayjs(this.date.date[1]) @@ -210,7 +212,7 @@ export default { formData.append('place_name', this.event.place.name) formData.append('place_address', this.event.place.address) formData.append('description', this.event.description) - formData.append('multidate', this.event.type === 'multidate') + formData.append('multidate', this.date.type === 'multidate') formData.append('start_datetime', start_datetime.unix()) formData.append('end_datetime', end_datetime.unix()) @@ -220,9 +222,9 @@ export default { if (this.event.tags) { this.event.tags.forEach(tag => formData.append('tags[]', tag.tag || tag)) } try { if (this.edit) { - await this.updateEvent(formData) + await this.$axios.$put('/event', formData) } else { - await this.addEvent(formData) + await this.$axios.$post('/event', formData) } this.updateMeta() this.$router.replace('/') From e87cbbad889e443b56b537e82d42211516ca85fd Mon Sep 17 00:00:00 2001 From: lesion Date: Fri, 13 Nov 2020 10:52:10 +0000 Subject: [PATCH 135/363] Translated using Weblate (German) Currently translated at 28.1% (63 of 224 strings) Translation: Gancio/Web Translate-URL: https://hosted.weblate.org/projects/gancio/web/de/ --- locales/de.json | 68 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index 0967ef42..614195c6 100644 --- a/locales/de.json +++ b/locales/de.json @@ -1 +1,67 @@ -{} +{ + "common": { + "title": "Titel", + "user": "Nutzer:in", + "moderation": "Moderation", + "follow": "Folgen", + "feed_url_copied": "Öffne die kopierte Feed-URL in deinem RSS-Reader", + "feed": "RSS Feed", + "embed_help": "Kopiere den folgenden Code in deine Webseite und die Veranstaltung wird wie hier angezeigt", + "embed_title": "Bette diese Veranstaltung in deine Webseite ein", + "embed": "Einbetten", + "copied": "Kopiert", + "instances": "Instanzen", + "add_to_calendar": "Zu einem Kalender hinzufügen", + "send_via_mail": "E-Mail versenden", + "copy_link": "Link kopieren", + "set_password": "Passwort erstellen", + "displayname": "Anzeigename", + "activate_user": "Bestätigt", + "password_updated": "Passwort geändert.", + "me": "Du", + "disable": "ausschalten", + "enable": "einschalten", + "cancel": "Abbrechen", + "ok": "Ok", + "new_user": "Neue:r Nutzer:in", + "new_password": "Neues Passwort", + "recover_password": "Passwort wiederherstellen", + "copy": "Kopieren", + "logout_ok": "Abgemeldet", + "add": "Hinzufügen", + "edit_event": "Veranstaltung bearbeiten", + "name": "Name", + "share": "Teilen", + "logout": "Ausloggen", + "preview": "Vorschau", + "save": "Speichern", + "activate": "Aktivieren", + "remove_admin": "Admin entfernen", + "deactivate": "Deaktivieren", + "actions": "Aktionen", + "settings": "Einstellungen", + "places": "Orte", + "events": "Veranstaltungen", + "users": "Nutzer:innen", + "admin": "Admin", + "confirm": "Bestätigen", + "edit": "Bearbeiten", + "search": "Suchen", + "hide": "Verstecken", + "remove": "Entfernen", + "description": "Beschreibung", + "register": "Registrieren", + "password": "Passwort", + "email": "E-Mail", + "login": "Login", + "media": "Dateien", + "what": "Was", + "when": "Wann", + "address": "Adresse", + "where": "Wo", + "send": "Abschicken", + "export": "Exportieren", + "next": "Weiter", + "add_event": "Veranstaltung hinzufügen" + } +} From 0d036eb70750a4827d95966c250d9b6d2cea5658 Mon Sep 17 00:00:00 2001 From: les Date: Tue, 17 Nov 2020 00:31:55 +0100 Subject: [PATCH 136/363] fix trusted instances --- components/Footer.vue | 16 ++++++++++++++++ components/admin/Federation.vue | 8 ++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/components/Footer.vue b/components/Footer.vue index 2b623f6c..8873532a 100644 --- a/components/Footer.vue +++ b/components/Footer.vue @@ -3,6 +3,22 @@ v-btn(color='primary' text href='https://gancio.org') Gancio {{settings.version}} v-btn(v-for='link in settings.footerLinks' :key='link.label' color='primary' text :href='link.href') {{link.label}} + + v-menu(v-if='settings.enable_trusted_instances && settings.trusted_instances && settings.trusted_instances.length' + offset-y bottom open-on-hover transition="slide-y-transition") + template(v-slot:activator="{ on, attrs }") + v-btn(v-bind='attrs' v-on='on' color='primary' text) {{$t('common.places')}} + v-list + v-list-item(v-for='instance in settings.trusted_instances' + :key='instance.name' + :href='instance.url' + two-line) + v-list-item-avatar + v-img(:src='`${instance.url}/favicon.ico`') + v-list-item-content + v-list-item-title {{instance.name}} + v-list-item-subtitle {{instance.label}} + //- v-btn(v-if='settings.enable_federation' text rel='me' @click.prevent='showFollowMe=true') follow me //- v-btn(nuxt to='/about' text) about //- v-btn(href='https://blog.gancio.org' text) blog diff --git a/components/admin/Federation.vue b/components/admin/Federation.vue index 061a2383..84fa007a 100644 --- a/components/admin/Federation.vue +++ b/components/admin/Federation.vue @@ -112,8 +112,11 @@ export default { methods: { ...mapActions(['setSetting']), async createTrustedInstance () { - if (!this.$refs.form.validate()) return + if (!this.$refs.form.validate()) { return } try { + if (!this.instance_url.startsWith('http')) { + this.instance_url = `https://${this.instance_url}` + } const instance = await axios.get(`${this.instance_url}/.well-known/nodeinfo/2.1`) this.setSetting({ key: 'trusted_instances', @@ -123,7 +126,8 @@ export default { label: instance.data.metadata.nodeLabel }) }) - this.instance_url = '' + this.$refs.form.reset() + this.dialogAddInstance = false } catch (e) { this.$root.$message(e, { color: 'error' }) } From 291c8360a8ea30e0ad2285515460ca036c9ff8e6 Mon Sep 17 00:00:00 2001 From: les Date: Tue, 17 Nov 2020 00:32:14 +0100 Subject: [PATCH 137/363] fix editor style / focus --- components/Editor.vue | 120 ++++++++++++++++++++++++++++++------------ 1 file changed, 85 insertions(+), 35 deletions(-) diff --git a/components/Editor.vue b/components/Editor.vue index 3f83f6b4..76623335 100644 --- a/components/Editor.vue +++ b/components/Editor.vue @@ -1,8 +1,9 @@ diff --git a/pages/add/_edit.vue b/pages/add/_edit.vue index 6dd51e17..207d244c 100644 --- a/pages/add/_edit.vue +++ b/pages/add/_edit.vue @@ -34,16 +34,15 @@ //- When DateInput.col-12(v-model='date') - HourInput.col-12(v-model='time') //- Description Editor.col-12.mb-3( + :label="$t('event.description_description')" v-model='event.description' :placeholder="$t('event.description_description')" max-height='400px') //- MEDIA / FLYER / POSTER - v-file-input.col-6.mt-3( :label="$t('common.media')" :hint="$t('event.media_description')" @@ -84,7 +83,7 @@ export default { }, async asyncData ({ params, $axios, error, store }) { if (params.edit) { - const data = { time: {}, event: { place: {} } } + const data = { event: { place: {} } } data.id = params.edit data.edit = true let event @@ -97,25 +96,12 @@ export default { data.event.place.name = event.place.name data.event.place.address = event.place.address || '' - data.date = {} - if (event.multidate) { - const start = dayjs.unix(event.start_datetime).format('YYYY-MM-DD') - const end = dayjs.unix(event.end_datetime).format('YYYY-MM-DD') - data.date = { - type: 'multidate', - date: [start, end] - } - } else if (event.recurrent) { - data.date.type = 'recurrent' - data.date.recurrent = event.recurrent - } else { - data.date.type = 'normal' - data.date.date = dayjs.unix(event.start_datetime).format('YYYY-MM-DD') + data.date = { + recurrent: event.recurrent, + from: new Date(dayjs.unix(event.start_datetime)), + due: new Date(dayjs.unix(event.end_datetime)) } - data.time.start = dayjs.unix(event.start_datetime).format('HH:mm') - data.time.end = dayjs.unix(event.end_datetime).format('HH:mm') - data.event.title = event.title data.event.description = event.description data.event.id = event.id @@ -131,25 +117,27 @@ export default { valid: false, openImportDialog: false, event: { - type: 'normal', place: { name: '', address: '' }, title: '', description: '', tags: [], - image: null, - recurrent: { frequency: '1m', days: [], type: 'weekday_desc' } + image: null }, page: { month, year }, fileList: [], id: null, - date: { type: 'normal', recurrent: {} }, - time: { start: null, end: null }, + date: { from: 0, due: 0, recurrent: null }, edit: false, loading: false, mediaUrl: '', disableAddress: false } }, + head () { + return { + title: `${this.settings.title} - ${this.$t('common.add_event')}` + } + }, computed: { ...mapState(['tags', 'places', 'settings']) }, @@ -158,46 +146,16 @@ export default { eventImported (event) { this.event = Object.assign(this.event, event) }, - // recurrentDays () { - // if (this.event.type !== 'recurrent' || !this.date || !this.date.length) { return } - // const type = this.event.recurrent.type - // if (type === 'ordinal') { return map(this.date, d => dayjs(d).date()) } else if (type === 'weekday') { return map(this.date, d => dayjs(d).day() + 1) } - // }, - // }, cleanFile () { this.event.image = {} }, async done () { if (!this.$refs.form.validate()) { return } this.loading = true - let start_datetime, end_datetime - const [start_hour, start_minute] = this.time.start.split(':') - if (!this.time.end) { - this.time.end = (Number(start_hour) + 2) + ':' + start_minute - } - const [end_hour, end_minute] = this.time.end.split(':') const formData = new FormData() - if (this.date.type === 'multidate') { - start_datetime = dayjs(this.date.date[0]) - .hour(start_hour).minute(start_minute) - end_datetime = dayjs(this.date.date[1]) - .hour(end_hour).minute(end_minute) - } else if (this.date.type === 'normal') { - start_datetime = dayjs(this.date.date).hour(start_hour).minute(start_minute) - end_datetime = dayjs(this.date.date).hour(end_hour).minute(end_minute) - if (end_hour < start_hour) { - end_datetime = end_datetime.add(1, 'day') - } - } else if (this.date.type === 'recurrent') { - start_datetime = dayjs(this.date.date).set('hour', start_hour).set('minute', start_minute) - end_datetime = dayjs(this.date.date).set('hour', end_hour).set('minute', end_minute) - if (end_hour < start_hour) { - end_datetime = end_datetime.add(1, 'day') - } - formData.append('recurrent', JSON.stringify(this.date.recurrent)) - } + formData.append('recurrent', JSON.stringify(this.date.recurrent)) if (this.event.image) { formData.append('image', this.event.image) @@ -206,9 +164,9 @@ export default { formData.append('place_name', this.event.place.name) formData.append('place_address', this.event.place.address) formData.append('description', this.event.description) - formData.append('multidate', this.date.type === 'multidate') - formData.append('start_datetime', start_datetime.unix()) - formData.append('end_datetime', end_datetime.unix()) + // formData.append('multidate', this.date.type === 'multidate') + formData.append('start_datetime', dayjs(this.date.from).unix()) + formData.append('end_datetime', this.date.due && dayjs(this.date.due).unix()) if (this.edit) { formData.append('id', this.event.id) @@ -222,7 +180,6 @@ export default { } this.updateMeta() this.$router.replace('/') - this.loading = false this.$root.$message(this.$auth.loggedIn ? 'event.added' : 'event.added_anon', { color: 'success' }) } catch (e) { switch (e.request.status) { @@ -235,11 +192,6 @@ export default { this.loading = false } } - }, - head () { - return { - title: `${this.settings.title} - ${this.$t('common.add_event')}` - } } } From f7d0f408503749952fdbcfaa81a971d1d205500e Mon Sep 17 00:00:00 2001 From: les Date: Fri, 4 Dec 2020 17:28:11 +0100 Subject: [PATCH 155/363] reuse v-calendar --- pages/event/_id.vue | 12 ------------ plugins/v-calendar.js | 15 ++++++++------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/pages/event/_id.vue b/pages/event/_id.vue index a3cc3227..6e403934 100644 --- a/pages/event/_id.vue +++ b/pages/event/_id.vue @@ -56,18 +56,6 @@ v-container v-btn.ml-2(large icon v-on='on' color='primary' :href='`/api/event/${event.id}.ics`') v-icon mdi-calendar-export - //- v-list - v-list-item(link) - v-list-item-content.primary--text.text-uppercase( - v-clipboard:success='copyLink' - v-clipboard:copy='`${settings.baseurl}/event/${event.id}`') {{$t('common.copy_link')}} - - v-list-item(link) - v-list-item-content.primary--text.text-uppercase(@click='showEmbed=true' text color='primary') {{$t('common.embed')}} - - v-list-item(link :href='`/api/event/${event.id}.ics`') - v-list-item-content.primary--text.text-uppercase - //- v-btn(nuxt block link :href='`/api/event/${event.id}.ics`' text color='primary') {{$t('common.add_to_calendar')}} .p-description.text-h6(v-html='event.description') v-chip.p-category.ml-1(v-for='tag in event.tags' color='primary' diff --git a/plugins/v-calendar.js b/plugins/v-calendar.js index 29f0414e..3d4aef0d 100644 --- a/plugins/v-calendar.js +++ b/plugins/v-calendar.js @@ -1,7 +1,8 @@ -// import Vue from 'vue' -// import VCalendar from 'v-calendar' -// export default () => { -// Vue.use(VCalendar, { -// firstDayOfWeek: 2 -// }) -// } + import Vue from 'vue' + import VCalendar from 'v-calendar' + export default () => { + Vue.use(VCalendar, { + // why is that ?! + firstDayOfWeek: 2 + }) + } From 08292c350d39d4cc99044d1b35ff56d885ef44c3 Mon Sep 17 00:00:00 2001 From: les Date: Fri, 4 Dec 2020 17:28:41 +0100 Subject: [PATCH 156/363] minor --- server/api/controller/event.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/api/controller/event.js b/server/api/controller/event.js index aadf30ae..199ef588 100644 --- a/server/api/controller/event.js +++ b/server/api/controller/event.js @@ -418,7 +418,6 @@ const eventController = { }, async _select ({ start, end, tags, places }) { - debug('_select start: %s, end: %s, tags: %s', dayjs.unix(start), end, tags) const where = { recurrent: null, // confirmed event only @@ -504,7 +503,7 @@ const eventController = { if (frequency[1] === 'w') { cursor = cursor.day(start_date.day()) if (cursor.isBefore(dayjs())) { - cursor = cursos.add(7, 'day') + cursor = cursor.add(7, 'day') } if (frequency[0] === 2) { cursor = cursor.add(7, 'day') From a44712c1f539453c849a9fbf3ccb4ab145be0e11 Mon Sep 17 00:00:00 2001 From: les Date: Fri, 4 Dec 2020 17:28:54 +0100 Subject: [PATCH 157/363] minor --- pages/index.vue | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/pages/index.vue b/pages/index.vue index 150c39a6..a1f0ebcd 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -4,22 +4,19 @@ //- Announcements Announcement(v-for='announcement in announcements' :key='`a_${announcement.id}`' :announcement='announcement') + //- Calendar and search bar v-row#calbarmb-2 .col-xl-5.col-lg-5.col-md-6.col-sm-12.col-xs-12 - v-date-picker( - @update:picker-date='monthChange' - @click:date='dayChange' - :locale='settings.locale' - :events='calendarEvents' - :value='date' - landscape) + //- this is needed as v-calendar does not support SSR + //- https://github.com/nathanreyes/v-calendar/issues/336 + client-only + Calendar(@dayclick='dayChange' @monthchange='monthChange' :events='events') .col - Search( - :filters='filters' - @update='updateFilters') + Search(:filters='filters' @update='updateFilters') v-chip(v-if='selectedDay' close @click:close='dayChange(selectedDay)') {{selectedDay}} + //- Events #events Event(v-for='event in events' :key='event.id' :event='event' @@ -33,10 +30,11 @@ import dayjs from 'dayjs' import Event from '@/components/Event' import Announcement from '@/components/Announcement' import Search from '@/components/Search' +import Calendar from '@/components/Calendar' export default { name: 'Index', - components: { Event, Search, Announcement }, + components: { Event, Search, Announcement, Calendar }, async asyncData ({ params, $api }) { const events = await $api.getEvents({ start: dayjs().unix() @@ -55,9 +53,6 @@ export default { }, computed: { ...mapState(['settings', 'announcements']), - calendarEvents () { - return this.events.map(e => dayjs.unix(e.start_datetime).format('YYYY-MM-DD')) - } }, methods: { ...mapActions(['setFilters']), @@ -90,9 +85,8 @@ export default { this.filters = filters this.updateEvents() }, - monthChange (monthYear) { + monthChange ({ year, month }) { this.selectedDay = null - const [year, month] = monthYear.split('-') // check if current month is selected if (month - 1 === dayjs().month()) { From 0726701b62360f21bcc0221af31b7e8335dd413b Mon Sep 17 00:00:00 2001 From: les Date: Fri, 4 Dec 2020 17:29:43 +0100 Subject: [PATCH 158/363] minor --- nuxt.config.js | 3 ++- package.json | 31 ++++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/nuxt.config.js b/nuxt.config.js index 610b4b3a..7a428010 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -41,7 +41,8 @@ module.exports = { '@/plugins/vue-clipboard', // vuetify '@/plugins/axios', // axios baseurl configuration '@/plugins/validators', // inject validators - '@/plugins/api' // api helpers + '@/plugins/api', // api helpers + { src: '@/plugins/v-calendar', ssr: false } // v-calendar ], render: { diff --git a/package.json b/package.json index 401e0aaa..3b15c245 100644 --- a/package.json +++ b/package.json @@ -28,26 +28,26 @@ ], "dependencies": { "@nuxtjs/auth": "^4.9.1", - "@nuxtjs/axios": "^5.12.2", + "@nuxtjs/axios": "^5.12.3", "accept-language": "^3.0.18", "axios": "^0.21.0", "bcryptjs": "^2.4.3", "body-parser": "^1.18.3", - "config": "^3.3.2", + "config": "^3.3.3", "consola": "^2.15.0", "cookie-parser": "^1.4.5", "cors": "^2.8.5", - "cross-env": "^7.0.2", + "cross-env": "^7.0.3", "date-fns": "^2.16.1", "dayjs": "^1.9.6", "dompurify": "^2.2.2", - "email-templates": "^7.1.2", + "email-templates": "^8.0.2", "express": "^4.17.1", "express-oauth-server": "^2.0.0", "fs": "^0.0.1-security", "http-signature": "^1.3.5", "ical.js": "^1.4.0", - "ics": "^2.26.1", + "ics": "^2.26.2", "inquirer": "^7.3.3", "jsdom": "^16.4.0", "jsonwebtoken": "^8.5.1", @@ -59,7 +59,7 @@ "moment-timezone": "^0.5.32", "morgan": "^1.10.0", "multer": "^1.4.2", - "nuxt": "^2.14.7", + "nuxt": "^2.14.9", "nuxt-express-module": "^0.0.11", "pg": "^8.5.1", "sequelize": "^6.3.5", @@ -70,8 +70,9 @@ "tiptap-extensions": "^1.33.2", "to-ico": "^1.1.5", "url": "^0.11.0", + "v-calendar": "^2.1.1", "vue-clipboard2": "^0.3.1", - "vue-i18n": "^8.22.1", + "vue-i18n": "^8.22.2", "yargs": "^16.1.1" }, "devDependencies": { @@ -79,29 +80,29 @@ "@nuxtjs/eslint-config": "^5.0.0", "@nuxtjs/vuetify": "^1.11.2", "babel-eslint": "^10.1.0", - "eslint": "^7.13.0", + "eslint": "^7.14.0", "eslint-config-prettier": "^6.15.0", - "eslint-config-standard": "^16.0.1", + "eslint-config-standard": "^16.0.2", "eslint-loader": "^4.0.2", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": ">=11.1.0", "eslint-plugin-nuxt": "^2.0.0", - "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-prettier": "^3.2.0", "eslint-plugin-promise": ">=4.0.1", - "eslint-plugin-standard": "^4.1.0", - "eslint-plugin-vue": "^7.1.0", + "eslint-plugin-standard": "^5.0.0", + "eslint-plugin-vue": "^7.2.0", "less-loader": "^7.1.0", "nodemon": "^2.0.6", - "prettier": "^2.1.2", + "prettier": "^2.2.1", "pug-plain-loader": "^1.0.0", "sass": "^1.29.0", "sass-loader": "^10.1.0", - "vue-cli-plugin-vuetify": "~2.0.7", + "vue-cli-plugin-vuetify": "~2.0.8", "vuetify-loader": "^1.3.0", "webpack-cli": "^4.2.0" }, "resolutions": { - "prosemirror-model": "1.11.2" + "prosemirror-model": "1.12.0" }, "bin": { "gancio": "server/cli.js" From 84d362ef1d41b3abeccf4c4b79c9ffebc0b47dff Mon Sep 17 00:00:00 2001 From: mv87 Date: Thu, 3 Dec 2020 23:00:17 +0000 Subject: [PATCH 159/363] Translated using Weblate (German) Currently translated at 59.8% (134 of 224 strings) Translation: Gancio/Web Translate-URL: https://hosted.weblate.org/projects/gancio/web/de/ --- locales/de.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index ded76100..60aea5a0 100644 --- a/locales/de.json +++ b/locales/de.json @@ -81,7 +81,8 @@ "federation": "Föderation", "n_resources": "keine Ressource|eine Ressource|{n} Ressourcen", "resources": "Ressourcen", - "info": "Infos" + "info": "Infos", + "theme": "Thema" }, "admin": { "delete_footer_link_confirm": "Sicher, diesen Link zu entfernen?", @@ -146,7 +147,9 @@ "list_description": "Wenn Sie eine Website haben und eine Liste von Ereignissen anzeigen möchten, verwenden Sie den folgenden Code", "ical_description": "Computer und Smartphones sind üblicherweise mit einer Kalenderanwendung ausgestattet, mit der ein Fernkalender importiert werden kann.", "insert_your_address": "Geben Sie Ihre E-Mail-Adresse ein", - "email_description": "Sie können interessante Ereignisse per E-Mail erhalten." + "email_description": "Sie können interessante Ereignisse per E-Mail erhalten.", + "feed_description": "Um Updates auf deinem Computer oder Smartphone zu erhalten, ohne regelmäßig diese Seite zu öffnen, kannst du RSS-Feeds benutzen.

\n\n

Mit RSS-Feeds nutzt du eine spezielle App, um Updates von den Seiten, die dich interessieren, zu erhalten. Damit kannst du rasch vielen Seiten folgen, ohne einen\nAccount erstellen zu müssen und ohne sonstige Komplikationen.

\n\n
  • Für Android-Geräte empfehlen wir Flym oder Feeder
  • \n
  • Auf iPhones / iPads kannst du Feed4U nutzen
  • \n
  • Auf Desktop-PCs oder Laptops empfehlen wir Feedbro, den du in Firefox oder Chrome installieren kannst.
  • \n
    \nIndem du diesen Link deinem RSS-Feed-Reader hinzufügst, wirst du auf dem Laufenden gehalten.", + "intro": "Anders als unsoziale Netzwerke, die alles unternehmen, um Nutzer und deren Daten bei sich zu (be)halten, glauben wir, dass Informationen und Leute gleichermaßen frei sein müssen. Deshalb kannst du dich über Veranstaltungen auf dem Laufenden halten, ohne zwangsläufig über diese Seite zu gehen." }, "recover": { "not_valid_code": "Etwas ist schief gelaufen." From 9854c7ad970faecd0a16228a9b59c7305838ac63 Mon Sep 17 00:00:00 2001 From: mv87 Date: Thu, 3 Dec 2020 22:51:24 +0000 Subject: [PATCH 160/363] Translated using Weblate (German) Currently translated at 100.0% (10 of 10 strings) Translation: Gancio/Email Translate-URL: https://hosted.weblate.org/projects/gancio/email/de/ --- locales/email/de.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/locales/email/de.json b/locales/email/de.json index 0967ef42..d9dffc37 100644 --- a/locales/email/de.json +++ b/locales/email/de.json @@ -1 +1,22 @@ -{} +{ + "admin_register": { + "content": "{{user.email}} hat eine Registrierung auf {{config.title}} angefordert:
    {{user.description}}

    Bitte bestätigen here.", + "subject": "Neue Registrierung" + }, + "recover": { + "content": "Hallo, du hast die Wiederherstellung deines Passworts angefordert {{config.title}}. Klicke hier, um zu bestätigen.", + "subject": "Passwortwiederherstellung" + }, + "user_confirm": { + "content": "Hallo, dein Account auf {{config.title}} wurde erstellt. Bestätige ihn und wähle ein Kennwort..", + "subject": "Du kannst jetzt damit beginnen, Events zu veröffentlichen" + }, + "confirm": { + "content": "Hallo, dein Account auf {{config.title}} wurde bestätigt. Anfragen kannst du an {{config.admin_email}} stellen.", + "subject": "Du kannst jetzt damit beginnen, Events zu veröffentlichen" + }, + "register": { + "content": "Wir haben die Registrierungsanfrage erhalten. Wir werden sie so bald wie möglich bestätigen.", + "subject": "Registrierungsanfrage erhalten" + } +} From 539c0fa9333f2124e0db811c01c60e31741912c7 Mon Sep 17 00:00:00 2001 From: les Date: Mon, 14 Dec 2020 18:48:15 +0100 Subject: [PATCH 161/363] left/right keys goes to prev/next event --- pages/event/_id.vue | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pages/event/_id.vue b/pages/event/_id.vue index 6e403934..b25fede3 100644 --- a/pages/event/_id.vue +++ b/pages/event/_id.vue @@ -249,7 +249,21 @@ export default { ) } }, + mounted () { + window.addEventListener('keydown', this.keyDown) + }, + destroyed () { + window.removeEventListener('keydown', this.keyDown) + }, methods: { + keyDown (ev) { + if (ev.key === 'ArrowRight' && this.event.next) { + this.$router.push(`/event/${this.event.next}`) + } + if (ev.key === 'ArrowLeft' && this.event.prev) { + this.$router.push(`/event/${this.event.prev}`) + } + }, showResource (resource) { this.showResources = true this.selectedResource = resource From 3abb39f62bde2f68d641e5f52b540dc45d025220 Mon Sep 17 00:00:00 2001 From: les Date: Mon, 11 Jan 2021 00:17:56 +0100 Subject: [PATCH 162/363] keep migrating to vuetify --- assets/style.less | 1 + components/Calendar.vue | 7 +- components/Event.vue | 125 +- components/Nav.vue | 22 +- components/Search.vue | 18 +- locales/esm.js | 2 +- locales/index.js | 2 +- locales/it.json | 9 +- package.json | 34 +- pages/Admin.vue | 2 +- pages/add/DateInput.vue | 53 +- pages/add/ImportDialog.vue | 14 +- pages/add/_edit.vue | 1 - pages/event/_id.vue | 5 +- pages/event/embedEvent.vue | 11 +- pages/event/eventAdmin.vue | 5 +- pages/export.vue | 10 +- pages/index.vue | 65 +- plugins/api.js | 5 +- plugins/filters.js | 6 +- server/api/controller/event.js | 41 +- server/helpers.js | 58 +- server/taskManager.js | 3 +- yarn.lock | 2272 +++++++++++++++----------------- 24 files changed, 1382 insertions(+), 1389 deletions(-) diff --git a/assets/style.less b/assets/style.less index 2cc3e325..00dd8007 100644 --- a/assets/style.less +++ b/assets/style.less @@ -1,6 +1,7 @@ html, body { scrollbar-width: thin; scrollbar-color: orange; + overflow: auto !important; } li { diff --git a/components/Calendar.vue b/components/Calendar.vue index 886d9319..2049405f 100644 --- a/components/Calendar.vue +++ b/components/Calendar.vue @@ -3,7 +3,7 @@ v-calendar( title-position='left' :is-dark="settings['theme.is_dark']" - :columns="$screens({ default: 1, md: 2 })" + :columns="2" @update:from-page='updatePage' :locale='$i18n.locale' :attributes='attributes' @@ -21,7 +21,7 @@ import { take, get } from 'lodash' export default { name: 'Calendar', props: { - events: { type: Array, default: [] } + events: { type: Array, default: () => [] } }, data () { const month = dayjs().month() + 1 @@ -35,13 +35,14 @@ export default { // TODO: could be better attributes () { + return [] const colors = ['blue', 'orange', 'yellow', 'teal', 'indigo', 'green', 'red', 'purple', 'pink', 'gray'] const tags = take(this.tags, 10).map(t => t.tag) let attributes = [] attributes.push({ key: 'today', dates: new Date(), highlight: { color: 'green', fillMode: 'outline' } }) function getColor (event) { - const color = { class: 'vc-rounded-full', color: 'blue', fillMode: 'outline' } + const color = { class: 'vc-rounded-full', color: 'blue', fillMode: 'normal' } const tag = get(event, 'tags[0]') if (!tag) { return color } const idx = tags.indexOf(tag) diff --git a/components/Event.vue b/components/Event.vue index 27292fea..562fac1a 100644 --- a/components/Event.vue +++ b/components/Event.vue @@ -1,78 +1,83 @@ -