refactor: split uni store to per responsiblity store
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -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,
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user