From e7fc0e8a9ab79e94933973c30dc392eea580c58d Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Tue, 24 Feb 2026 17:38:27 -0500 Subject: [PATCH] refactor: standardize frontend Signed-off-by: Sebastian Krupinski --- src/main.ts | 9 ++-- src/models/collection.ts | 61 +++---------------------- src/models/entity.ts | 76 ++++++++++++------------------- src/models/index.ts | 4 +- src/models/provider.ts | 2 +- src/services/collectionService.ts | 2 +- src/stores/index.ts | 4 +- src/types/collection.ts | 12 ++--- src/types/service.ts | 9 ++-- 9 files changed, 51 insertions(+), 128 deletions(-) diff --git a/src/main.ts b/src/main.ts index c79402b..8e9d92c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,13 +1,10 @@ /** - * Chrono Manager Module Boot Script - * - * This script is executed when the chrono_manager module is loaded. - * It initializes the chronoStore which manages calendars, events, tasks, and journals state. + * Chrono Manager Module Boot */ -console.log('[Chrono Manager] Booting Chrono Manager module...') +console.log('[Chrono Manager] Booting module...') -console.log('[Chrono Manager] Chrono Manager module booted successfully') +console.log('[Chrono Manager] Module booted successfully...') // CSS will be injected by build process //export const css = ['__CSS_FILENAME_PLACEHOLDER__'] diff --git a/src/models/collection.ts b/src/models/collection.ts index d3a2146..ef9b089 100644 --- a/src/models/collection.ts +++ b/src/models/collection.ts @@ -2,7 +2,7 @@ * Class model for Collection Interface */ -import type { CollectionContentsInterface, CollectionInterface, CollectionPropertiesInterface } from "@/types/collection"; +import type { CollectionContentTypes, CollectionInterface, CollectionPropertiesInterface } from "@/types/collection"; export class CollectionObject implements CollectionInterface { @@ -17,17 +17,7 @@ export class CollectionObject implements CollectionInterface { signature: null, created: null, modified: null, - properties: { - '@type': 'chrono.collection', - version: 1, - total: 0, - contents: {}, - label: '', - description: null, - rank: 0, - visibility: null, - color: null, - }, + properties: new CollectionPropertiesObject(), }; } @@ -35,8 +25,6 @@ export class CollectionObject implements CollectionInterface { this._data = data; if (data.properties) { this._data.properties = new CollectionPropertiesObject().fromJson(data.properties as CollectionPropertiesInterface); - } else { - this._data.properties = new CollectionPropertiesObject(); } return this; } @@ -115,10 +103,9 @@ export class CollectionPropertiesObject implements CollectionPropertiesInterface constructor() { this._data = { - '@type': 'chrono.collection', + '@type': 'chrono:collection', version: 1, - total: 0, - contents: {}, + content: [], label: '', description: null, rank: null, @@ -129,20 +116,6 @@ export class CollectionPropertiesObject implements CollectionPropertiesInterface fromJson(data: CollectionPropertiesInterface): CollectionPropertiesObject { this._data = data; - - const raw = this._data as any; - if ((!raw.contents || Object.keys(raw.contents).length === 0) && raw.content !== undefined && raw.content !== null) { - if (typeof raw.content === 'string') { - raw.contents = { - event: raw.content === 'event', - task: raw.content === 'task', - journal: raw.content === 'journal', - }; - } else if (typeof raw.content === 'object') { - raw.contents = raw.content; - } - } - return this; } @@ -166,30 +139,8 @@ export class CollectionPropertiesObject implements CollectionPropertiesInterface return this._data.version; } - get total(): number | undefined { - return this._data.total; - } - - get contents(): CollectionContentsInterface { - const raw = this._data as any; - - if (raw.contents && Object.keys(raw.contents).length > 0) { - return raw.contents; - } - - if (typeof raw.content === 'string') { - return { - event: raw.content === 'event', - task: raw.content === 'task', - journal: raw.content === 'journal', - }; - } - - if (raw.content && typeof raw.content === 'object') { - return raw.content; - } - - return {}; + get content(): CollectionContentTypes[] { + return this._data.content || []; } /** Mutable Properties */ diff --git a/src/models/entity.ts b/src/models/entity.ts index 719c1b4..069766a 100644 --- a/src/models/entity.ts +++ b/src/models/entity.ts @@ -9,15 +9,9 @@ import { EventObject } from "./event"; import { TaskObject } from "./task"; import { JournalObject } from "./journal"; -type EntityPropertiesData = EventInterface | TaskInterface | JournalInterface; -type EntityPropertiesObject = EventObject | TaskObject | JournalObject; -type EntityInternal = Omit, 'properties'> & { - properties: EntityPropertiesData | EntityPropertiesObject; -}; - export class EntityObject implements EntityInterface { - _data!: EntityInternal; + _data!: EntityInterface; constructor() { this._data = { @@ -28,99 +22,85 @@ export class EntityObject implements EntityInterface { signature: null, created: null, modified: null, - properties: new EventObject().toJson(), + properties: new EventObject(), }; } fromJson(data: EntityInterface): EntityObject { - this._data = data as EntityInternal; + this._data = data if (data.properties) { - this._data.properties = this.hydrateProperties(data.properties); - } else { - this._data.properties = new EventObject(); + const type = data.properties.type + if (type === 'task') { + this._data.properties = new TaskObject().fromJson(data.properties as TaskInterface); + } else if (type === 'journal') { + this._data.properties = new JournalObject().fromJson(data.properties as JournalInterface); + } else { + this._data.properties = new EventObject().fromJson(data.properties as EventInterface); + } } return this; } toJson(): EntityInterface { - const json = { ...this._data }; + const json = { ...this._data } if (this._data.properties instanceof EventObject || this._data.properties instanceof TaskObject || this._data.properties instanceof JournalObject) { json.properties = this._data.properties.toJson(); } - return json as EntityInterface; + return json as EntityInterface } clone(): EntityObject { - const cloned = new EntityObject(); - cloned._data = JSON.parse(JSON.stringify(this.toJson())) as EntityInternal; - return cloned; - } - - private hydrateProperties(properties: EntityPropertiesData): EntityPropertiesObject { - const type = properties.type; - if (type === 'task') { - return new TaskObject().fromJson(properties as TaskInterface); - } - - if (type === 'journal') { - return new JournalObject().fromJson(properties as JournalInterface); - } - - return new EventObject().fromJson(properties as EventInterface); + const cloned = new EntityObject() + cloned._data = { ...this._data } + return cloned } /** Immutable Properties */ get provider(): string { - return this._data.provider; + return this._data.provider } get service(): string { - return this._data.service; + return this._data.service } get collection(): string | number { - return this._data.collection; + return this._data.collection } get identifier(): string | number { - return this._data.identifier; + return this._data.identifier } get signature(): string | null { - return this._data.signature; + return this._data.signature } get created(): string | null { - return this._data.created; + return this._data.created } get modified(): string | null { - return this._data.modified; + return this._data.modified } - get properties(): EntityPropertiesObject { + get properties(): EventObject | TaskObject | JournalObject { if (this._data.properties instanceof EventObject || this._data.properties instanceof TaskObject || this._data.properties instanceof JournalObject) { - return this._data.properties; - } - - if (this._data.properties) { - const hydrated = this.hydrateProperties(this._data.properties as EntityPropertiesData); - this._data.properties = hydrated; - return hydrated; + return this._data.properties } const defaultProperties = new EventObject(); this._data.properties = defaultProperties; - return defaultProperties; + return defaultProperties } - set properties(value: EntityPropertiesObject) { - this._data.properties = value; + set properties(value: EventObject | TaskObject | JournalObject) { + this._data.properties = value } } diff --git a/src/models/index.ts b/src/models/index.ts index 7d8e145..ededa2d 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -1,10 +1,10 @@ +export { ProviderObject } from './provider'; +export { ServiceObject } from './service'; export { CollectionObject } from './collection'; export { EntityObject } from './entity'; export { EventObject } from './event'; export { TaskObject } from './task'; export { JournalObject } from './journal'; -export { ProviderObject } from './provider'; -export { ServiceObject } from './service'; export { Identity, IdentityNone, diff --git a/src/models/provider.ts b/src/models/provider.ts index 8ba61dc..0b223f8 100644 --- a/src/models/provider.ts +++ b/src/models/provider.ts @@ -13,7 +13,7 @@ export class ProviderObject implements ProviderInterface { constructor() { this._data = { - '@type': 'chrono.provider', + '@type': 'chrono:provider', identifier: '', label: '', capabilities: {}, diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index b255576..c91f5c0 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -27,7 +27,7 @@ import { CollectionObject, CollectionPropertiesObject } from '../models/collecti */ function createCollectionObject(data: CollectionInterface): CollectionObject { const integrationStore = useIntegrationStore(); - const factoryItem = integrationStore.getItemById('mail_collection_factory', data.provider) as any; + const factoryItem = integrationStore.getItemById('chrono_collection_factory', data.provider) as any; const factory = factoryItem?.factory; // Use provider factory if available, otherwise base class diff --git a/src/stores/index.ts b/src/stores/index.ts index 0bfe7cc..800c024 100644 --- a/src/stores/index.ts +++ b/src/stores/index.ts @@ -1,4 +1,4 @@ -export { useCollectionsStore } from './collectionsStore'; -export { useEntitiesStore } from './entitiesStore'; export { useProvidersStore } from './providersStore'; export { useServicesStore } from './servicesStore'; +export { useCollectionsStore } from './collectionsStore'; +export { useEntitiesStore } from './entitiesStore'; diff --git a/src/types/collection.ts b/src/types/collection.ts index a0b8751..24f2896 100644 --- a/src/types/collection.ts +++ b/src/types/collection.ts @@ -6,12 +6,6 @@ import type { ListFilter, ListSort, SourceSelector } from './common'; /** * Collection information */ -export interface CollectionContentsInterface { - event?: boolean; - task?: boolean; - journal?: boolean; -} - export interface CollectionInterface { provider: string; service: string | number; @@ -23,14 +17,15 @@ export interface CollectionInterface { properties: CollectionPropertiesInterface; } +export type CollectionContentTypes = 'event' | 'task' | 'journal'; + export interface CollectionBaseProperties { '@type': string; version: number; } export interface CollectionImmutableProperties extends CollectionBaseProperties { - total?: number; - contents: CollectionContentsInterface; + content: CollectionContentTypes[]; } export interface CollectionMutableProperties extends CollectionBaseProperties { @@ -119,7 +114,6 @@ export interface CollectionDeleteRequest { identifier: string | number; options?: { force?: boolean; // Whether to force delete even if collection is not empty - recursive?: boolean; // Whether to delete child collections/items as well }; } diff --git a/src/types/service.ts b/src/types/service.ts index d6c77dc..ce47898 100644 --- a/src/types/service.ts +++ b/src/types/service.ts @@ -29,8 +29,6 @@ export interface ServiceCapabilitiesInterface { EntityDelete?: boolean; EntityMove?: boolean; EntityCopy?: boolean; - // Send capability - EntityTransmit?: boolean; [key: string]: boolean | object | string | string[] | undefined; } @@ -271,7 +269,10 @@ export type ServiceListFilterCollection = { }; export type ServiceListFilterEntity = { - '*'?: string; + 'text'?: string; + 'label'?: string; + 'description'?: string; + 'location'?: string; 'before'?: string; 'after'?: string; [attribute: string]: string | undefined; @@ -281,7 +282,7 @@ export type ServiceListFilterEntity = { * Service list sort specification */ export type ServiceListSortCollection = ("label" | "rank" | string)[]; -export type ServiceListSortEntity = ( "sent" | "size" | string)[]; +export type ServiceListSortEntity = ( "label" | "start" | string)[]; export type ServiceListRange = { 'tally'?: string[]; -- 2.39.5