From d8ad934643559b42980abe72bc957fd2940a9cd8 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 11 Jun 2023 17:37:49 +0200 Subject: [PATCH] feat(user): save quick add magic mode in api --- .../quick-actions/quick-actions.vue | 7 ++--- src/components/tasks/add-task.vue | 4 +-- .../tasks/partials/quick-add-magic.vue | 6 +++-- src/helpers/parseSubtasksViaIndention.ts | 8 +++--- src/helpers/playPop.ts | 9 ------- src/helpers/quickAddMagicMode.ts | 21 --------------- src/modules/parseTaskText.ts | 27 +++++++------------ src/stores/tasks.ts | 11 ++++---- src/views/user/settings/General.vue | 6 +---- 9 files changed, 31 insertions(+), 68 deletions(-) delete mode 100644 src/helpers/quickAddMagicMode.ts diff --git a/src/components/quick-actions/quick-actions.vue b/src/components/quick-actions/quick-actions.vue index f5606a181..a6a5d47ce 100644 --- a/src/components/quick-actions/quick-actions.vue +++ b/src/components/quick-actions/quick-actions.vue @@ -71,10 +71,10 @@ import {useBaseStore} from '@/stores/base' import {useProjectStore} from '@/stores/projects' import {useLabelStore} from '@/stores/labels' import {useTaskStore} from '@/stores/tasks' +import {useAuthStore} from '@/stores/auth' import {getHistory} from '@/modules/projectHistory' import {parseTaskText, PrefixMode, PREFIXES} from '@/modules/parseTaskText' -import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode' import {success} from '@/message' import type {ITeam} from '@/modelTypes/ITeam' @@ -88,6 +88,7 @@ const baseStore = useBaseStore() const projectStore = useProjectStore() const labelStore = useLabelStore() const taskStore = useTaskStore() +const authStore = useAuthStore() type DoAction = { type: ACTION_TYPE } & Type @@ -242,7 +243,7 @@ const hintText = computed(() => { } } const prefixes = - PREFIXES[getQuickAddMagicMode()] ?? PREFIXES[PrefixMode.Default] + PREFIXES[authStore.settings.frontendSettings.quickAddMagicMode] ?? PREFIXES[PrefixMode.Default] return t('quickActions.hint', prefixes) }) @@ -255,7 +256,7 @@ const availableCmds = computed(() => { return cmds }) -const parsedQuery = computed(() => parseTaskText(query.value, getQuickAddMagicMode())) +const parsedQuery = computed(() => parseTaskText(query.value, authStore.settings.frontendSettings.quickAddMagicMode)) const searchMode = computed(() => { if (query.value === '') { diff --git a/src/components/tasks/add-task.vue b/src/components/tasks/add-task.vue index 4c18f10b2..d377b20e8 100644 --- a/src/components/tasks/add-task.vue +++ b/src/components/tasks/add-task.vue @@ -116,12 +116,12 @@ async function addTask() { // This allows us to find the tasks with the title they had before being parsed // by quick add magic. const createdTasks: { [key: ITask['title']]: ITask } = {} - const tasksToCreate = parseSubtasksViaIndention(newTaskTitle.value) + const tasksToCreate = parseSubtasksViaIndention(newTaskTitle.value, authStore.settings.frontendSettings.quickAddMagicMode) // We ensure all labels exist prior to passing them down to the create task method // In the store it will only ever see one task at a time so there's no way to reliably // check if a new label was created before (because everything happens async). - const allLabels = tasksToCreate.map(({title}) => getLabelsFromPrefix(title) ?? []) + const allLabels = tasksToCreate.map(({title}) => getLabelsFromPrefix(title, authStore.settings.frontendSettings.quickAddMagicMode) ?? []) await taskStore.ensureLabelsExist(allLabels.flat()) const newTasks = tasksToCreate.map(async ({title, project}) => { diff --git a/src/components/tasks/partials/quick-add-magic.vue b/src/components/tasks/partials/quick-add-magic.vue index 39582e0c3..30818a0ff 100644 --- a/src/components/tasks/partials/quick-add-magic.vue +++ b/src/components/tasks/partials/quick-add-magic.vue @@ -99,11 +99,13 @@ import {ref, computed} from 'vue' import BaseButton from '@/components/base/BaseButton.vue' -import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode' import {PREFIXES} from '@/modules/parseTaskText' +import {useAuthStore} from '@/stores/auth' + +const authStore = useAuthStore() const visible = ref(false) -const mode = ref(getQuickAddMagicMode()) +const mode = computed(() => authStore.settings.frontendSettings.quickAddMagicMode) defineProps<{ highlightHintIcon: boolean, diff --git a/src/helpers/parseSubtasksViaIndention.ts b/src/helpers/parseSubtasksViaIndention.ts index 807301d5b..1956e671f 100644 --- a/src/helpers/parseSubtasksViaIndention.ts +++ b/src/helpers/parseSubtasksViaIndention.ts @@ -1,4 +1,4 @@ -import {getProjectFromPrefix} from '@/modules/parseTaskText' +import {getProjectFromPrefix, PrefixMode} from '@/modules/parseTaskText' export interface TaskWithParent { title: string, @@ -16,7 +16,7 @@ const spaceRegex = /^ */ * @param taskTitles should be multiple lines of task tiles with indention to declare their parent/subtask * relation between each other. */ -export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[] { +export function parseSubtasksViaIndention(taskTitles: string, prefixMode: PrefixMode): TaskWithParent[] { const titles = taskTitles.split(/[\r\n]+/) return titles.map((title, index) => { @@ -26,7 +26,7 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[] project: null, } - task.project = getProjectFromPrefix(task.title) + task.project = getProjectFromPrefix(task.title, prefixMode) if (index === 0) { return task @@ -49,7 +49,7 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[] task.parent = task.parent.replace(spaceRegex, '') if (task.project === null) { // This allows to specify a project once for the parent task and inherit it to all subtasks - task.project = getProjectFromPrefix(task.parent) + task.project = getProjectFromPrefix(task.parent, prefixMode) } } diff --git a/src/helpers/playPop.ts b/src/helpers/playPop.ts index 3f4e50c35..91b951e7f 100644 --- a/src/helpers/playPop.ts +++ b/src/helpers/playPop.ts @@ -2,15 +2,6 @@ import popSoundFile from '@/assets/audio/pop.mp3' export const playSoundWhenDoneKey = 'playSoundWhenTaskDone' -export function playPop() { - const enabled = localStorage.getItem(playSoundWhenDoneKey) === 'true' - if (!enabled) { - return - } - - playPopSound() -} - export function playPopSound() { const popSound = new Audio(popSoundFile) popSound.play() diff --git a/src/helpers/quickAddMagicMode.ts b/src/helpers/quickAddMagicMode.ts deleted file mode 100644 index 8ee23b270..000000000 --- a/src/helpers/quickAddMagicMode.ts +++ /dev/null @@ -1,21 +0,0 @@ -import {PrefixMode} from '@/modules/parseTaskText' - -const key = 'quickAddMagicMode' - -export const setQuickAddMagicMode = (mode: PrefixMode) => { - localStorage.setItem(key, mode) -} - -export const getQuickAddMagicMode = (): PrefixMode => { - const mode = localStorage.getItem(key) - - switch (mode) { - case null: - case PrefixMode.Default: - return PrefixMode.Default - case PrefixMode.Todoist: - return PrefixMode.Todoist - } - - return PrefixMode.Disabled -} diff --git a/src/modules/parseTaskText.ts b/src/modules/parseTaskText.ts index 0b4044d1c..e69ad58b2 100644 --- a/src/modules/parseTaskText.ts +++ b/src/modules/parseTaskText.ts @@ -1,7 +1,6 @@ import {parseDate} from '../helpers/time/parseDate' import {PRIORITIES} from '@/constants/priorities' import {REPEAT_TYPES, type IRepeatAfter, type IRepeatType} from '@/types/IRepeatAfter' -import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode' const VIKUNJA_PREFIXES: Prefixes = { label: '*', @@ -72,10 +71,10 @@ export const parseTaskText = (text: string, prefixesMode: PrefixMode = PrefixMod return result } - result.labels = getLabelsFromPrefix(text, prefixes.label) ?? [] + result.labels = getLabelsFromPrefix(text, prefixesMode) ?? [] result.text = cleanupItemText(result.text, result.labels, prefixes.label) - result.project = getProjectFromPrefix(result.text, prefixes.project) + result.project = getProjectFromPrefix(result.text, prefixesMode) result.text = result.project !== null ? cleanupItemText(result.text, [result.project], prefixes.project) : result.text result.priority = getPriority(result.text, prefixes.priority) @@ -131,25 +130,19 @@ const getItemsFromPrefix = (text: string, prefix: string): string[] => { return Array.from(new Set(items)) } -export const getProjectFromPrefix = (text: string, projectPrefix: string | null = null): string | null => { - if (projectPrefix === null) { - const prefixes = PREFIXES[getQuickAddMagicMode()] - if (prefixes === undefined) { - return null - } - projectPrefix = prefixes.project +export const getProjectFromPrefix = (text: string, prefixMode: PrefixMode): string | null => { + const projectPrefix = PREFIXES[prefixMode]?.project + if(typeof projectPrefix === 'undefined') { + return null } const projects: string[] = getItemsFromPrefix(text, projectPrefix) return projects.length > 0 ? projects[0] : null } -export const getLabelsFromPrefix = (text: string, projectPrefix: string | null = null): string[] | null => { - if (projectPrefix === null) { - const prefixes = PREFIXES[getQuickAddMagicMode()] - if (prefixes === undefined) { - return null - } - projectPrefix = prefixes.label +export const getLabelsFromPrefix = (text: string, prefixMode: PrefixMode): string[] | null => { + const projectPrefix = PREFIXES[prefixMode]?.project + if(typeof projectPrefix === 'undefined') { + return null } return getItemsFromPrefix(text, projectPrefix) } diff --git a/src/stores/tasks.ts b/src/stores/tasks.ts index 40e7f1bd1..3166e353f 100644 --- a/src/stores/tasks.ts +++ b/src/stores/tasks.ts @@ -6,8 +6,7 @@ import TaskService from '@/services/task' import TaskAssigneeService from '@/services/taskAssignee' import LabelTaskService from '@/services/labelTask' -import {playPop} from '@/helpers/playPop' -import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode' +import {playPopSound} from '@/helpers/playPop' import {cleanupItemText, parseTaskText, PREFIXES} from '@/modules/parseTaskText' import TaskAssigneeModel from '@/models/taskAssignee' @@ -29,6 +28,7 @@ import {useAttachmentStore} from '@/stores/attachments' import {useKanbanStore} from '@/stores/kanban' import {useBaseStore} from '@/stores/base' import ProjectUserService from '@/services/projectUsers' +import {useAuthStore} from '@/stores/auth' interface MatchedAssignee extends IUser { match: string, @@ -106,6 +106,7 @@ export const useTaskStore = defineStore('task', () => { const attachmentStore = useAttachmentStore() const labelStore = useLabelStore() const projectStore = useProjectStore() + const authStore = useAuthStore() const tasks = ref<{ [id: ITask['id']]: ITask }>({}) // TODO: or is this ITask[] const isLoading = ref(false) @@ -142,8 +143,8 @@ export const useTaskStore = defineStore('task', () => { try { const updatedTask = await taskService.update(task) kanbanStore.setTaskInBucket(updatedTask) - if (task.done) { - playPop() + if (task.done && useAuthStore().settings.frontendSettings.playSoundWhenDone) { + playPopSound() } return updatedTask } finally { @@ -398,7 +399,7 @@ export const useTaskStore = defineStore('task', () => { Partial, ) { const cancel = setModuleLoading(setIsLoading) - const quickAddMagicMode = getQuickAddMagicMode() + const quickAddMagicMode = authStore.settings.frontendSettings.quickAddMagicMode const parsedTask = parseTaskText(title, quickAddMagicMode) const foundProjectId = await findProjectId({ diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index e3872ed4a..ce026d34b 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -97,7 +97,7 @@ {{ $t('user.settings.quickAddMagic.title') }}
- @@ -160,7 +160,6 @@ import ProjectSearch from '@/components/tasks/partials/projectSearch.vue' import {SUPPORTED_LOCALES} from '@/i18n' import {playSoundWhenDoneKey, playPopSound} from '@/helpers/playPop' -import {getQuickAddMagicMode, setQuickAddMagicMode} from '@/helpers/quickAddMagicMode' import {createRandomID} from '@/helpers/randomId' import {success} from '@/message' import {AuthenticatedHTTPFactory} from '@/helpers/fetcher' @@ -259,9 +258,6 @@ const loading = computed(() => authStore.isLoadingGeneralSettings) // ) async function updateSettings() { - localStorage.setItem(playSoundWhenDoneKey, playSoundWhenDone.value ? 'true' : 'false') - setQuickAddMagicMode(quickAddMagicMode.value) - await authStore.saveUserSettings({ settings: {...settings.value}, })