refactor: split uni store to per responsiblity store

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-06-29 20:41:01 -04:00
parent 460c31e224
commit 31d20448be
5 changed files with 508 additions and 487 deletions
+241
View File
@@ -0,0 +1,241 @@
import { computed, ref, shallowRef } from 'vue'
import { defineStore } from 'pinia'
import { CollectionObject } from '@ChronoManager/models/collection'
import { EntityObject } from '@ChronoManager/models/entity'
import { EventObject } from '@ChronoManager/models/event'
import { TaskObject } from '@ChronoManager/models/task'
import type { ServiceObject } from '@ChronoManager/models/service'
import { useChronoOperationsStore } from '@/stores/chronoOperationsStore'
export const useChronoUiStore = defineStore('chronoUiStore', () => {
const operationsStore = useChronoOperationsStore()
const viewMode = ref<'calendar' | 'tasks'>('calendar')
const currentDate = ref(new Date())
const sidebarVisible = ref(true)
const selectedCollection = shallowRef<CollectionObject | null>(null)
const selectedEntity = shallowRef<EntityObject | null>(null)
const showEventEditor = ref(false)
const showTaskEditor = ref(false)
const showCollectionEditor = ref(false)
const showImportDialog = ref(false)
const entityEditorMode = ref<'edit' | 'view'>('view')
const editingCollection = shallowRef<CollectionObject | null>(null)
const collectionEditorMode = ref<'create' | 'edit'>('create')
const collectionEditorType = ref<'calendar' | 'tasklist'>('calendar')
const isTaskView = computed(() => viewMode.value === 'tasks')
function setViewMode(mode: 'calendar' | 'tasks') {
viewMode.value = mode
}
function selectCalendar(calendar: CollectionObject) {
selectedCollection.value = calendar
}
function selectTaskList(list: CollectionObject) {
selectedCollection.value = list
}
function openCollectionEditor(type: 'calendar' | 'tasklist') {
const collection = new CollectionObject()
collection.properties.fromJson({
...collection.properties.toJson(),
content: [type === 'calendar' ? 'event' : 'task'],
})
editingCollection.value = collection
collectionEditorMode.value = 'create'
collectionEditorType.value = type
showCollectionEditor.value = true
}
function openCreateCalendar() {
openCollectionEditor('calendar')
}
function openCreateTaskList() {
openCollectionEditor('tasklist')
}
function openEditCalendar(collection: CollectionObject) {
editingCollection.value = collection
collectionEditorMode.value = 'edit'
collectionEditorType.value = 'calendar'
showCollectionEditor.value = true
}
function openEditTaskList(collection: CollectionObject) {
editingCollection.value = collection
collectionEditorMode.value = 'edit'
collectionEditorType.value = 'tasklist'
showCollectionEditor.value = true
}
function ensureSelectedCollection(type: 'calendar' | 'tasklist'): CollectionObject | null {
const candidates = type === 'calendar' ? operationsStore.calendars : operationsStore.taskLists
if (!selectedCollection.value && candidates.length > 0) selectedCollection.value = candidates[0]
return selectedCollection.value
}
function openEntityEditor(entity: EntityObject, type: 'event' | 'task', mode: 'edit' | 'view') {
selectedEntity.value = entity
entityEditorMode.value = mode
showEventEditor.value = type === 'event'
showTaskEditor.value = type === 'task'
}
function createEventFromDate(date?: Date) {
if (!ensureSelectedCollection('calendar')) return
const entity = new EntityObject()
entity.properties = new EventObject()
if (date) {
entity.properties.startsOn = date.toISOString()
entity.properties.endsOn = new Date(date.getTime() + 60 * 60 * 1000).toISOString()
}
openEntityEditor(entity, 'event', 'edit')
}
function createEvent() {
createEventFromDate()
}
function editEvent(entity: EntityObject) {
openEntityEditor(entity, 'event', 'view')
}
function createTask() {
if (!ensureSelectedCollection('tasklist')) return
const entity = new EntityObject()
entity.properties = new TaskObject()
openEntityEditor(entity, 'task', 'edit')
}
function editTask(entity: EntityObject) {
openEntityEditor(entity, 'task', 'view')
}
function startEditingSelectedEntity() {
entityEditorMode.value = 'edit'
}
function cancelEditingSelectedEntity() {
entityEditorMode.value = 'view'
}
function closeEntityEditor() {
selectedEntity.value = null
entityEditorMode.value = 'view'
showEventEditor.value = false
showTaskEditor.value = false
}
async function saveSelectedEntity(entity: EntityObject, collection: CollectionObject | null | undefined, kind: string) {
const targetCollection = collection instanceof CollectionObject ? collection : selectedCollection.value
if (!targetCollection) throw new Error(`No ${kind} collection selected`)
selectedEntity.value = await operationsStore.saveEntity(entity, targetCollection)
selectedCollection.value = targetCollection
entityEditorMode.value = 'view'
}
async function saveEvent(entity: EntityObject, collection?: CollectionObject | null) {
await saveSelectedEntity(entity, collection, 'calendar')
}
async function saveTask(entity: EntityObject, collection?: CollectionObject | null) {
await saveSelectedEntity(entity, collection, 'task list')
}
async function deleteSelectedEntity(entity: EntityObject, collection: CollectionObject | null | undefined, kind: string) {
if (!(collection instanceof CollectionObject) && !selectedCollection.value) {
throw new Error(`No ${kind} collection selected`)
}
await operationsStore.deleteEntity(entity)
closeEntityEditor()
}
async function deleteEvent(entity: EntityObject, collection?: CollectionObject | null) {
await deleteSelectedEntity(entity, collection, 'calendar')
}
async function deleteTask(entity: EntityObject, collection?: CollectionObject | null) {
await deleteSelectedEntity(entity, collection, 'task list')
}
async function saveCollection(collection: CollectionObject, service: ServiceObject) {
await operationsStore.saveCollection(collection, service, collectionEditorMode.value)
showCollectionEditor.value = false
}
async function deleteCollection(collection: CollectionObject) {
await operationsStore.deleteCollection(collection)
if (selectedCollection.value?.identifier === collection.identifier) {
selectedCollection.value = null
selectedEntity.value = null
}
showCollectionEditor.value = false
}
async function openImport(files: File[]) {
await operationsStore.prepareImport(files, selectedCollection.value)
showImportDialog.value = true
}
async function closeImport(refresh = false) {
showImportDialog.value = false
await operationsStore.finishImport(refresh)
}
async function initialize() {
await operationsStore.initialize()
if (selectedCollection.value && !operationsStore.collections.some(
collection => collection.identifier === selectedCollection.value?.identifier,
)) {
selectedCollection.value = null
}
}
return {
viewMode,
currentDate,
sidebarVisible,
selectedCollection,
selectedEntity,
showEventEditor,
showTaskEditor,
showCollectionEditor,
showImportDialog,
entityEditorMode,
editingCollection,
collectionEditorMode,
collectionEditorType,
isTaskView,
setViewMode,
selectCalendar,
selectTaskList,
openCreateCalendar,
openCreateTaskList,
openEditCalendar,
openEditTaskList,
createEvent,
editEvent,
createTask,
editTask,
createEventFromDate,
startEditingSelectedEntity,
cancelEditingSelectedEntity,
closeEntityEditor,
saveEvent,
deleteEvent,
saveTask,
deleteTask,
saveCollection,
deleteCollection,
openImport,
closeImport,
initialize,
}
})