fix: project table view fix: e2e tests fix: typo in readme fix: list view route fix: don't wait until background is loaded for list to show fix: rename component imports fix: lint fix: parse task text fix: use list card grid fix: use correct class names fix: i18n keys fix: load project fix: task overview fix: list view spacing fix: find project fix: setLoading when updating a project fix: loading saved filter fix: project store loading fix: color picker import fix: cypress tests feat: migrate old list settings chore: add const for project settings fix: wrong projecten rename from lists chore: rename unused variable fix: editor list fix: shortcut list class name fix: pagination list class name fix: notifications list class name fix: list view variable name chore: clarify comment fix: i18n keys fix: router imports fix: comment chore: remove debugging leftover fix: remove duplicate variables fix: change comment fix: list view variable name fix: list view css class name fix: list item property name fix: name update tasks function correctly fix: update comment fix: project create route fix: list view class names fix: list view component name fix: result list class name fix: animation class list name fix: change debug log fix: revert a few navigation changes fix: use @ for imports of all views fix: rename link share list class fix: remove unused css class fix: dynamically import project components again
158 lines
3.7 KiB
TypeScript
158 lines
3.7 KiB
TypeScript
import {computed, ref} from 'vue'
|
|
import {acceptHMRUpdate, defineStore} from 'pinia'
|
|
|
|
import LabelService from '@/services/label'
|
|
import {success} from '@/message'
|
|
import {i18n} from '@/i18n'
|
|
import {createNewIndexer} from '@/indexes'
|
|
import {setModuleLoading} from '@/stores/helper'
|
|
import type {ILabel} from '@/modelTypes/ILabel'
|
|
|
|
const {add, remove, update, search} = createNewIndexer('labels', ['title', 'description'])
|
|
|
|
async function getAllLabels(page = 1): Promise<ILabel[]> {
|
|
const labelService = new LabelService()
|
|
const labels = await labelService.getAll({}, {}, page) as ILabel[]
|
|
if (page < labelService.totalPages) {
|
|
const nextLabels = await getAllLabels(page + 1)
|
|
return labels.concat(nextLabels)
|
|
} else {
|
|
return labels
|
|
}
|
|
}
|
|
|
|
export interface LabelState {
|
|
[id: ILabel['id']]: ILabel
|
|
}
|
|
|
|
export const useLabelStore = defineStore('label', () => {
|
|
// The labels are stored as an object which has the label ids as keys.
|
|
const labels = ref<LabelState>({})
|
|
const isLoading = ref(false)
|
|
|
|
const getLabelsByIds = computed(() => {
|
|
return (ids: ILabel['id'][]) => Object.values(labels.value).filter(({id}) => ids.includes(id))
|
|
})
|
|
|
|
// **
|
|
// * Checks if a project of labels is available in the store and filters them then query
|
|
// **
|
|
const filterLabelsByQuery = computed(() => {
|
|
return (labelsToHide: ILabel[], query: string) => {
|
|
const labelIdsToHide: number[] = labelsToHide.map(({id}) => id)
|
|
|
|
return search(query)
|
|
?.filter(value => !labelIdsToHide.includes(value))
|
|
.map(id => labels.value[id])
|
|
|| []
|
|
}
|
|
})
|
|
|
|
const getLabelsByExactTitles = computed(() => {
|
|
return (labelTitles: string[]) => Object
|
|
.values(labels.value)
|
|
.filter(({title}) => labelTitles.some(l => l.toLowerCase() === title.toLowerCase()))
|
|
})
|
|
|
|
|
|
function setIsLoading(newIsLoading: boolean) {
|
|
isLoading.value = newIsLoading
|
|
}
|
|
|
|
function setLabels(newLabels: ILabel[]) {
|
|
newLabels.forEach(l => {
|
|
labels.value[l.id] = l
|
|
add(l)
|
|
})
|
|
}
|
|
|
|
function setLabel(label: ILabel) {
|
|
labels.value[label.id] = label
|
|
update(label)
|
|
}
|
|
|
|
function removeLabelById(label: ILabel) {
|
|
remove(label)
|
|
delete labels.value[label.id]
|
|
}
|
|
|
|
async function loadAllLabels({forceLoad} : {forceLoad?: boolean} = {}) {
|
|
if (isLoading.value && !forceLoad) {
|
|
return
|
|
}
|
|
|
|
const cancel = setModuleLoading(setIsLoading)
|
|
|
|
try {
|
|
const newLabels = await getAllLabels()
|
|
setLabels(newLabels)
|
|
return newLabels
|
|
} finally {
|
|
cancel()
|
|
}
|
|
}
|
|
|
|
async function deleteLabel(label: ILabel) {
|
|
const cancel = setModuleLoading(setIsLoading)
|
|
const labelService = new LabelService()
|
|
|
|
try {
|
|
const result = await labelService.delete(label)
|
|
removeLabelById(label)
|
|
success({message: i18n.global.t('label.deleteSuccess')})
|
|
return result
|
|
} finally {
|
|
cancel()
|
|
}
|
|
}
|
|
|
|
async function updateLabel(label: ILabel) {
|
|
const cancel = setModuleLoading(setIsLoading)
|
|
const labelService = new LabelService()
|
|
|
|
try {
|
|
const newLabel = await labelService.update(label)
|
|
setLabel(newLabel)
|
|
success({message: i18n.global.t('label.edit.success')})
|
|
return newLabel
|
|
} finally {
|
|
cancel()
|
|
}
|
|
}
|
|
|
|
async function createLabel(label: ILabel) {
|
|
const cancel = setModuleLoading(setIsLoading)
|
|
const labelService = new LabelService()
|
|
|
|
try {
|
|
const newLabel = await labelService.create(label) as ILabel
|
|
setLabel(newLabel)
|
|
return newLabel
|
|
} finally {
|
|
cancel()
|
|
}
|
|
}
|
|
|
|
return {
|
|
labels,
|
|
isLoading,
|
|
|
|
getLabelsByIds,
|
|
filterLabelsByQuery,
|
|
getLabelsByExactTitles,
|
|
|
|
setLabels,
|
|
setLabel,
|
|
removeLabelById,
|
|
loadAllLabels,
|
|
deleteLabel,
|
|
updateLabel,
|
|
createLabel,
|
|
|
|
}
|
|
})
|
|
|
|
// support hot reloading
|
|
if (import.meta.hot) {
|
|
import.meta.hot.accept(acceptHMRUpdate(useLabelStore, import.meta.hot))
|
|
} |