1
0

feat: improve ProjectSettingsViews

(cherry picked from commit e8be657d9775a592987b684250809eb3d170a6f1)
This commit is contained in:
Dominik Pschenitschni 2024-07-17 22:52:13 +02:00 committed by kolaente
parent d7c5451729
commit 811ccc1baa
No known key found for this signature in database
GPG Key ID: F40E70337AB24C9B
2 changed files with 31 additions and 26 deletions

View File

@ -1,4 +1,7 @@
export const calculateItemPosition = (positionBefore: number | null, positionAfter: number | null): number => { export const calculateItemPosition = (
positionBefore: number | null = null,
positionAfter: number | null = null,
): number => {
if (positionBefore === null) { if (positionBefore === null) {
if (positionAfter === null) { if (positionAfter === null) {
return 0 return 0
@ -13,6 +16,6 @@ export const calculateItemPosition = (positionBefore: number | null, positionAft
return positionBefore + Math.pow(2, 16) return positionBefore + Math.pow(2, 16)
} }
// If we have both a task before and after it, we acually calculate the position // If we have both a task before and after it, we actually calculate the position
return positionBefore + (positionAfter - positionBefore) / 2 return positionBefore + (positionAfter - positionBefore) / 2
} }

View File

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import CreateEdit from '@/components/misc/CreateEdit.vue' import CreateEdit from '@/components/misc/CreateEdit.vue'
import {watch, ref} from 'vue' import {watch, ref, shallowReactive} from 'vue'
import {useProjectStore} from '@/stores/projects' import {useProjectStore} from '@/stores/projects'
import ProjectViewModel from '@/models/projectView' import ProjectViewModel from '@/models/projectView'
import type {IProjectView} from '@/modelTypes/IProjectView' import type {IProjectView} from '@/modelTypes/IProjectView'
@ -25,20 +25,19 @@ const {t} = useI18n()
const views = ref<IProjectView[]>([]) const views = ref<IProjectView[]>([])
watch( watch(
projectStore.projects[props.projectId]?.views, () => projectStore.projects[props.projectId]?.views || [],
allViews => { allViews => {
if (!allViews) {
views.value = []
return
}
views.value = [...allViews] views.value = [...allViews]
}, },
{immediate: true}, {
deep: true,
immediate: true,
},
) )
const showCreateForm = ref(false) const showCreateForm = ref(false)
const projectViewService = ref(new ProjectViewService()) const projectViewService = shallowReactive(new ProjectViewService())
const newView = ref<IProjectView>(new ProjectViewModel({})) const newView = ref<IProjectView>(new ProjectViewModel({}))
const viewIdToDelete = ref<number | null>(null) const viewIdToDelete = ref<number | null>(null)
const showDeleteModal = ref(false) const showDeleteModal = ref(false)
@ -71,7 +70,7 @@ async function createView() {
: 'none' : 'none'
newView.value.projectId = props.projectId newView.value.projectId = props.projectId
const result: IProjectView = await projectViewService.value.create(newView.value) const result: IProjectView = await projectViewService.create(newView.value)
success({message: t('project.views.createSuccess')}) success({message: t('project.views.createSuccess')})
showCreateForm.value = false showCreateForm.value = false
projectStore.setProjectView(result) projectStore.setProjectView(result)
@ -81,26 +80,26 @@ async function createView() {
} }
} }
async function deleteView() { async function deleteView(viewId: number) {
if (!viewIdToDelete.value) { if (!viewId) {
return return
} }
await projectViewService.value.delete(new ProjectViewModel({ await projectViewService.delete(new ProjectViewModel({
id: viewIdToDelete.value, id: viewId,
projectId: props.projectId, projectId: props.projectId,
})) }))
projectStore.removeProjectView(props.projectId, viewIdToDelete.value) projectStore.removeProjectView(props.projectId, viewId)
showDeleteModal.value = false showDeleteModal.value = false
} }
async function saveView() { async function saveView(view: IProjectView) {
if (viewToEdit.value?.viewKind !== 'kanban') { if (view?.viewKind !== 'kanban') {
viewToEdit.value.bucketConfigurationMode = 'none' view.bucketConfigurationMode = 'none'
} }
const result = await projectViewService.value.update(viewToEdit.value) const result = await ProjectViewService.update(view)
projectStore.setProjectView(result) projectStore.setProjectView(result)
viewToEdit.value = null viewToEdit.value = null
success({message: t('project.views.updateSuccess')}) success({message: t('project.views.updateSuccess')})
@ -108,11 +107,14 @@ async function saveView() {
async function saveViewPosition(e) { async function saveViewPosition(e) {
const view = views.value[e.newIndex] const view = views.value[e.newIndex]
const viewBefore = views.value[e.newIndex - 1] ?? null const viewBefore = views.value[e.newIndex - 1]
const viewAfter = views.value[e.newIndex + 1] ?? null const viewAfter = views.value[e.newIndex + 1]
const position = calculateItemPosition(viewBefore !== null ? viewBefore.position : null, viewAfter !== null ? viewAfter.position : null) const position = calculateItemPosition(
const result = await projectViewService.value.update({ viewBefore?.position,
viewAfter?.position,
)
const result = await projectViewService.update({
...view, ...view,
position, position,
}) })
@ -180,7 +182,7 @@ async function saveViewPosition(e) {
:loading="projectViewService.loading" :loading="projectViewService.loading"
:show-save-buttons="true" :show-save-buttons="true"
@cancel="viewToEdit = null" @cancel="viewToEdit = null"
@update:modelValue="saveView" @update:modelValue="saveView(viewToEdit)"
/> />
</td> </td>
</template> </template>
@ -216,7 +218,7 @@ async function saveViewPosition(e) {
<Modal <Modal
:enabled="showDeleteModal" :enabled="showDeleteModal"
@close="showDeleteModal = false" @close="showDeleteModal = false"
@submit="deleteView" @submit="deleteView(viewIdToDelete)"
> >
<template #header> <template #header>
<span>{{ $t('project.views.delete') }}</span> <span>{{ $t('project.views.delete') }}</span>