183 lines
4.7 KiB
Vue
183 lines
4.7 KiB
Vue
<!--
|
|
Nextcloud - Tasks
|
|
|
|
@author Raimund Schlüßler
|
|
@copyright 2018 Raimund Schlüßler <raimund.schluessler@mailbox.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
License as published by the Free Software Foundation; either
|
|
version 3 of the License, or any later version.
|
|
|
|
This library 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
-->
|
|
|
|
<template>
|
|
<NcContent app-name="tasks">
|
|
<AppNavigation @click="closeAppSidebar($event)" />
|
|
|
|
<NcAppContent @click="closeAppSidebar($event)">
|
|
<RouterView />
|
|
</NcAppContent>
|
|
|
|
<RouterView name="AppSidebar" />
|
|
</NcContent>
|
|
</template>
|
|
|
|
<script>
|
|
import AppNavigation from './views/AppNavigation.vue'
|
|
import client from './services/cdav.js'
|
|
|
|
import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
|
|
import { translate as t } from '@nextcloud/l10n'
|
|
import NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'
|
|
import NcContent from '@nextcloud/vue/dist/Components/NcContent.js'
|
|
|
|
import { mapGetters } from 'vuex'
|
|
|
|
export default {
|
|
name: 'App',
|
|
components: {
|
|
AppNavigation,
|
|
NcAppContent,
|
|
NcContent,
|
|
},
|
|
inject: ['$OCA'],
|
|
data() {
|
|
return {
|
|
searchString: '',
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters({
|
|
calendars: 'getTaskCalendars',
|
|
}),
|
|
},
|
|
mounted() {
|
|
subscribe('nextcloud:unified-search.search', this.filterProxy)
|
|
subscribe('nextcloud:unified-search.reset', this.cleanSearch)
|
|
},
|
|
beforeUnmount() {
|
|
unsubscribe('nextcloud:unified-search.search', this.filterProxy)
|
|
unsubscribe('nextcloud:unified-search.reset', this.cleanSearch)
|
|
},
|
|
async beforeMount() {
|
|
this.$store.dispatch('loadCollections')
|
|
this.$store.dispatch('loadSettings')
|
|
// get calendars then get tasks
|
|
await client.connect({ enableCalDAV: true })
|
|
await this.$store.dispatch('fetchCurrentUserPrincipal')
|
|
let { calendars } = await this.$store.dispatch('getCalendarsAndTrashBin')
|
|
calendars = calendars.filter(calendar => calendar.supportsTasks)
|
|
const owners = []
|
|
calendars.forEach((calendar) => {
|
|
if (owners.indexOf(calendar.owner) === -1) {
|
|
owners.push(calendar.owner)
|
|
}
|
|
})
|
|
owners.forEach((owner) => {
|
|
this.$store.dispatch('fetchPrincipalByUrl', {
|
|
url: owner,
|
|
})
|
|
})
|
|
// No calendars? Create a new one!
|
|
if (calendars.length === 0) {
|
|
const color = this.$OCA.Theming?.color || '#0082C9'
|
|
await this.$store.dispatch('appendCalendar', { displayName: t('tasks', 'Tasks'), color })
|
|
this.fetchTasks()
|
|
// else, let's get those tasks!
|
|
} else {
|
|
this.fetchTasks()
|
|
}
|
|
},
|
|
methods: {
|
|
/**
|
|
* Fetch the tasks of each calendar
|
|
*/
|
|
fetchTasks() {
|
|
// wait for all calendars to have fetch their tasks
|
|
Promise.all(this.calendars.map(calendar =>
|
|
this.$store.dispatch('getTasksFromCalendar', { calendar, completed: false, related: null }),
|
|
)).then(results => {
|
|
this.loading = false
|
|
// console.log(results)
|
|
})
|
|
},
|
|
|
|
/**
|
|
* Close the details view
|
|
*
|
|
* @param {object} $event the event
|
|
*/
|
|
closeAppSidebar($event) {
|
|
if (!($event.target.closest('.reactive') || $event.target.classList.contains('reactive')) && this.$route.params.taskId) {
|
|
emit('tasks:close-appsidebar')
|
|
}
|
|
},
|
|
filterProxy({ query }) {
|
|
this.filter(query)
|
|
},
|
|
filter(query) {
|
|
this.$store.commit('setSearchQuery', query)
|
|
},
|
|
cleanSearch() {
|
|
this.$store.commit('setSearchQuery', '')
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
/**
|
|
* Since CSS variables can't be used in media queries (yet, see e.g.
|
|
* https://stackoverflow.com/questions/40722882/css-native-variables-not-working-in-media-queries),
|
|
* and var(--breakpoint-mobile) can be used with server v25 upwards only anyway,
|
|
* we have to redefine the value here.
|
|
*/
|
|
$breakpoint-mobile: 1024px;
|
|
|
|
// Adjust app-navigation-toggle position
|
|
.app-navigation-toggle-wrapper {
|
|
top: 18px !important;
|
|
right: -15px !important;
|
|
|
|
@media only screen and (max-width: $breakpoint-mobile) {
|
|
right: 0 !important;
|
|
}
|
|
}
|
|
|
|
// Hack for https://github.com/nextcloud/nextcloud-vue/issues/1384
|
|
body {
|
|
min-height: 100%;
|
|
height: auto;
|
|
// Adjustment necessary to use nc/vue@6 with NC25
|
|
position: initial;
|
|
}
|
|
|
|
</style>
|
|
|
|
<style lang="scss" scoped>
|
|
// Adjustment necessary to use nc/vue@6 with NC25
|
|
#content-vue {
|
|
max-height: 100vh;
|
|
}
|
|
|
|
.app-content {
|
|
// Adjustment necessary to use nc/vue@6 with NC25
|
|
overflow-y: scroll;
|
|
background-color: var(--color-background-dark) !important;
|
|
|
|
> div {
|
|
box-sizing: border-box;
|
|
padding-bottom: 75px;
|
|
}
|
|
}
|
|
</style>
|