diff --git a/frontend/assets/app.css b/frontend/assets/app.css
new file mode 100644
index 0000000..aa4d541
--- /dev/null
+++ b/frontend/assets/app.css
@@ -0,0 +1,19 @@
+.v-application.task-app code {
+ font-weight: initial;
+ background-color: #2f2f2f;
+ color: rgba(255, 255, 255, 0.9);
+ font-size: 95%;
+ display: inline-block;
+ padding: 1px 0.5em 1px 0.5em;
+ margin: 2px;
+ margin-bottom: 14px;
+}
+/* Code block */
+.v-application.task-app pre code {
+ display: block;
+ padding: 0.5em 0.8em 0.5em 0.8em;
+}
+.v-application.task-app code:before,
+.v-application.task-app code:after {
+ content: initial;
+}
diff --git a/frontend/components/SettingsDialog.vue b/frontend/components/SettingsDialog.vue
index cfc405e..5424ec8 100644
--- a/frontend/components/SettingsDialog.vue
+++ b/frontend/components/SettingsDialog.vue
@@ -36,7 +36,29 @@
+
+
+
+
+
+
+ Auto Sync
+
+ mdi-sync
+
+
+
+ in minutes (0 means no auto sync)
+ run task sync
periodically
+
+
+
+
@@ -83,12 +105,14 @@ export default defineComponent({
const formRef = ref(null);
const settings = reactive({
dark: context.root.$store.state.settings.dark,
- autoRefresh: context.root.$store.state.settings.autoRefresh
+ autoRefresh: context.root.$store.state.settings.autoRefresh,
+ autoSync: context.root.$store.state.settings.autoSync
});
const reset = () => {
settings.dark = context.root.$store.state.settings.dark;
settings.autoRefresh = context.root.$store.state.settings.autoRefresh;
+ settings.autoSync = context.root.$store.state.settings.autoSync;
};
const closeDialog = () => {
@@ -106,7 +130,12 @@ export default defineComponent({
}
};
+ const sync = async () => {
+ await context.root.$store.dispatch('syncTasks');
+ };
+
return {
+ sync,
showDialog,
closeDialog,
save,
diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue
index 6c6b330..347aea9 100644
--- a/frontend/layouts/default.vue
+++ b/frontend/layouts/default.vue
@@ -1,5 +1,5 @@
-
+
{
- if (interval)
- clearInterval(interval);
+ if (refreshInterval)
+ clearInterval(refreshInterval);
const freq = +context.root.$store.state.settings.autoRefresh;
if (freq > 0) {
- interval = setInterval(() => {
+ refreshInterval = setInterval(() => {
context.root.$store.dispatch('fetchTasks');
}, +context.root.$store.state.settings.autoRefresh * 60000);
}
@@ -65,6 +66,21 @@ export default defineComponent({
setAutoRefresh();
watch(() => context.root.$store.state.settings, setAutoRefresh);
+ // Auto Sync
+ let syncInterval: NodeJS.Timeout | null = null;
+ const setAutoSync = () => {
+ if (syncInterval)
+ clearInterval(syncInterval);
+ const freq = +context.root.$store.state.settings.autoSync;
+ if (freq > 0) {
+ syncInterval = setInterval(() => {
+ context.root.$store.dispatch('syncTasks');
+ }, +context.root.$store.state.settings.autoSync * 60000);
+ }
+ };
+ setAutoSync();
+ watch(() => context.root.$store.state.settings, setAutoSync);
+
const mode = ref('Tasks');
const allModes = ['Tasks', 'Projects'];
diff --git a/frontend/store/index.ts b/frontend/store/index.ts
index 7095216..e7252c6 100644
--- a/frontend/store/index.ts
+++ b/frontend/store/index.ts
@@ -11,7 +11,8 @@ export const state = () => ({
},
settings: {
dark: false,
- autoRefresh: '5' // in minutes
+ autoRefresh: '5', // in minutes
+ autoSync: '0' // in minutes
}
});
@@ -74,6 +75,10 @@ export const actions: ActionTree = {
await this.$axios.$put('/api/tasks', { tasks });
// Refresh
await context.dispatch('fetchTasks');
+ },
+
+ async syncTasks(_context) {
+ await this.$axios.$post('/api/sync');
}
};