From 6b25e41af7a27f94c3399083e3f18d00243ec37b Mon Sep 17 00:00:00 2001 From: DaxServer Date: Wed, 13 Aug 2025 16:18:43 +0200 Subject: [PATCH] refactor(wikibase-schema-editor): harmonize component structure --- .kiro/specs/wikibase-schema-editor/tasks.md | 59 +- frontend/.eslintrc-auto-import.json | 4 +- frontend/auto-imports.d.ts | 10 +- frontend/components.d.ts | 8 +- .../components/ColumnPalette.vue | 115 ++- .../__tests__/useColumnConversion.test.ts | 191 ----- .../composables/useColumnConversion.ts | 39 - .../stores/project.store.ts | 23 + .../components/ClaimEditor.vue | 668 ++++++++++++++++++ .../components/QualifiersEditor.vue | 293 +++----- .../components/ReferencesEditor.vue | 421 +++++------ .../components/SingleQualifierEditor.vue | 97 +++ .../components/SingleReferenceEditor.vue | 114 +++ .../components/StatementEditor.vue | 505 ++++++------- .../components/StatementManager.vue | 120 ++++ .../components/StatementPreview.vue | 149 ---- .../components/StatementsEditor.vue | 342 --------- .../components/TermSection.vue | 26 +- .../components/TermsEditor.vue | 5 +- .../components/ValidationDisplay.vue | 316 +++++---- .../components/WikibaseSchemaEditor.vue | 234 +----- .../useSchemaCompletenessValidation.ts | 4 +- .../wikibase-schema/stores/schema.store.ts | 2 + 23 files changed, 1807 insertions(+), 1938 deletions(-) delete mode 100644 frontend/src/features/data-processing/composables/__tests__/useColumnConversion.test.ts delete mode 100644 frontend/src/features/data-processing/composables/useColumnConversion.ts create mode 100644 frontend/src/features/wikibase-schema/components/ClaimEditor.vue create mode 100644 frontend/src/features/wikibase-schema/components/SingleQualifierEditor.vue create mode 100644 frontend/src/features/wikibase-schema/components/SingleReferenceEditor.vue create mode 100644 frontend/src/features/wikibase-schema/components/StatementManager.vue delete mode 100644 frontend/src/features/wikibase-schema/components/StatementPreview.vue delete mode 100644 frontend/src/features/wikibase-schema/components/StatementsEditor.vue diff --git a/.kiro/specs/wikibase-schema-editor/tasks.md b/.kiro/specs/wikibase-schema-editor/tasks.md index 1136d0c..ac3bd13 100644 --- a/.kiro/specs/wikibase-schema-editor/tasks.md +++ b/.kiro/specs/wikibase-schema-editor/tasks.md @@ -200,66 +200,9 @@ - Update validation to trigger on dragstart events - _Requirements: 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7_ -- [ ] 34. Implement autosave functionality in schema store +- [x] 34. Implement autosave functionality in schema store - Write tests for immediate Pinia store updates on all schema changes - Write tests for isDirty flag management and lastSyncedAt tracking - Write tests for automatic store persistence without manual save operations - Implement autosave mutations in schema store for all schema operations - _Requirements: 10.1, 10.2, 10.8_ - -- [ ] 35. Remove save/cancel buttons from TermsEditor component - - Write tests for immediate term mapping updates without save buttons - - Write tests for automatic language selection persistence - - Remove save/cancel buttons from TermsEditor interface - - Update TermsEditor to use autosave store mutations - - _Requirements: 3.6, 3.7, 10.5_ - -- [ ] 36. Remove save/cancel buttons from StatementEditor component - - Write tests for immediate statement configuration updates without save buttons - - Write tests for automatic property selection and rank changes persistence - - Remove save/cancel buttons from StatementEditor interface - - Update StatementEditor to use autosave store mutations - - _Requirements: 4.7, 4.8, 5.6, 5.7, 10.5_ - -- [ ] 37. Remove save/cancel buttons from QualifiersEditor component - - Write tests for immediate qualifier updates without save buttons - - Write tests for automatic qualifier property and value mapping persistence - - Remove save/cancel buttons from QualifiersEditor interface - - Update QualifiersEditor to use autosave store mutations - - _Requirements: 6.6, 6.7, 10.5_ - -- [ ] 38. Remove save/cancel buttons from ReferencesEditor component - - Write tests for immediate reference updates without save buttons - - Write tests for automatic reference property and value mapping persistence - - Remove save/cancel buttons from ReferencesEditor interface - - Update ReferencesEditor to use autosave store mutations - - _Requirements: 7.6, 7.7, 10.5_ - -- [ ] 39. Ensure existing manual backend sync works with autosave store state - - Write tests to verify existing backend sync functionality works with autosave-enabled store - - Write tests to confirm manual "Save to Server" button continues to work as currently implemented - - Verify existing persistence layer correctly reads from autosave-updated Pinia store state - - Ensure no changes to existing manual backend synchronization behavior - - _Requirements: 10.3, 10.4_ - -- [ ] 40. Update drag-and-drop operations to use autosave - - Write tests for immediate store updates on column drop operations - - Write tests for automatic mapping persistence without confirmation dialogs - - Update all drop zone handlers to use autosave store mutations - - Remove any remaining save/cancel patterns from drag-and-drop workflows - - _Requirements: 10.1, 10.2, 10.5_ - -- [ ] 41. Update schema selection workflow for autosave - - Write tests for autosave enablement when loading existing schemas - - Write tests for autosave enablement when creating new schemas - - Update SchemaSelector to initialize autosave behavior on schema selection - - Ensure seamless transition from selection to autosave-enabled editor - - _Requirements: 9.4, 9.5, 9.8_ - -- [ ] 42. Update all existing test cases for autosave behavior - - Update TermsEditor tests to expect immediate store updates instead of save button interactions - - Update StatementEditor tests to expect automatic persistence instead of manual save operations - - Update QualifiersEditor and ReferencesEditor tests for autosave behavior - - Update drag-and-drop tests to expect immediate store persistence - - Update schema store tests to validate autosave mutations and dirty flag management - - _Requirements: 10.1, 10.2, 10.5, 10.8_ diff --git a/frontend/.eslintrc-auto-import.json b/frontend/.eslintrc-auto-import.json index 0c60450..c2b5912 100644 --- a/frontend/.eslintrc-auto-import.json +++ b/frontend/.eslintrc-auto-import.json @@ -49,6 +49,7 @@ "SchemaCompletenessResult": true, "SchemaDragDropContext": true, "SchemaRequest": true, + "ShallowRef": true, "Slot": true, "Slots": true, "StatementRank": true, @@ -106,6 +107,7 @@ "getActivePinia": true, "getCurrentInstance": true, "getCurrentScope": true, + "getCurrentWatcher": true, "h": true, "ignorableWatch": true, "inject": true, @@ -115,6 +117,7 @@ "isReactive": true, "isReadonly": true, "isRef": true, + "isShallow": true, "makeDestructurable": true, "mapActions": true, "mapGetters": true, @@ -218,7 +221,6 @@ "useClipboardItems": true, "useCloned": true, "useColorMode": true, - "useColumnConversion": true, "useColumnDataTypeIndicators": true, "useColumnGeneration": true, "useConfirm": true, diff --git a/frontend/auto-imports.d.ts b/frontend/auto-imports.d.ts index b63dbc1..d7b4647 100644 --- a/frontend/auto-imports.d.ts +++ b/frontend/auto-imports.d.ts @@ -45,6 +45,7 @@ declare global { const getActivePinia: typeof import('pinia')['getActivePinia'] const getCurrentInstance: typeof import('vue')['getCurrentInstance'] const getCurrentScope: typeof import('vue')['getCurrentScope'] + const getCurrentWatcher: typeof import('vue')['getCurrentWatcher'] const h: typeof import('vue')['h'] const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] const inject: typeof import('vue')['inject'] @@ -54,6 +55,7 @@ declare global { const isReactive: typeof import('vue')['isReactive'] const isReadonly: typeof import('vue')['isReadonly'] const isRef: typeof import('vue')['isRef'] + const isShallow: typeof import('vue')['isShallow'] const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] const mapActions: typeof import('pinia')['mapActions'] const mapGetters: typeof import('pinia')['mapGetters'] @@ -157,7 +159,6 @@ declare global { const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] const useCloned: typeof import('@vueuse/core')['useCloned'] const useColorMode: typeof import('@vueuse/core')['useColorMode'] - const useColumnConversion: typeof import('./src/features/data-processing/composables/useColumnConversion')['useColumnConversion'] const useColumnDataTypeIndicators: typeof import('./src/features/data-processing/composables/useColumnDataTypeIndicators')['useColumnDataTypeIndicators'] const useColumnGeneration: typeof import('./src/features/data-processing/composables/useColumnGeneration')['useColumnGeneration'] const useConfirm: typeof import('primevue/useconfirm')['useConfirm'] @@ -217,7 +218,6 @@ declare global { const useInterval: typeof import('@vueuse/core')['useInterval'] const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] - const useLanguageDropZone: typeof import('./src/features/data-processing/composables/useLanguageDropZone')['useLanguageDropZone'] const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] const useLink: typeof import('vue-router')['useLink'] const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] @@ -270,7 +270,6 @@ declare global { const useSchemaApi: typeof import('./src/features/wikibase-schema/composables/useSchemaApi')['useSchemaApi'] const useSchemaBuilder: typeof import('./src/features/wikibase-schema/composables/useSchemaBuilder')['useSchemaBuilder'] const useSchemaCompletenessValidation: typeof import('./src/features/wikibase-schema/composables/useSchemaCompletenessValidation')['useSchemaCompletenessValidation'] - const useSchemaDropZone: typeof import('./src/features/wikibase-schema/composables/useSchemaDropZone')['useSchemaDropZone'] const useSchemaPersistence: typeof import('./src/features/wikibase-schema/composables/useSchemaPersistence')['useSchemaPersistence'] const useSchemaSelection: typeof import('./src/features/wikibase-schema/composables/useSchemaSelection')['useSchemaSelection'] const useSchemaStore: typeof import('./src/features/wikibase-schema/stores/schema.store')['useSchemaStore'] @@ -356,7 +355,7 @@ declare global { // for type re-export declare global { // @ts-ignore - export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' import('vue') // @ts-ignore export type { FileUploadUploaderEvent } from 'primevue/fileupload' @@ -443,6 +442,7 @@ declare module 'vue' { readonly getActivePinia: UnwrapRef readonly getCurrentInstance: UnwrapRef readonly getCurrentScope: UnwrapRef + readonly getCurrentWatcher: UnwrapRef readonly h: UnwrapRef readonly ignorableWatch: UnwrapRef readonly inject: UnwrapRef @@ -452,6 +452,7 @@ declare module 'vue' { readonly isReactive: UnwrapRef readonly isReadonly: UnwrapRef readonly isRef: UnwrapRef + readonly isShallow: UnwrapRef readonly makeDestructurable: UnwrapRef readonly mapActions: UnwrapRef readonly mapGetters: UnwrapRef @@ -555,7 +556,6 @@ declare module 'vue' { readonly useClipboardItems: UnwrapRef readonly useCloned: UnwrapRef readonly useColorMode: UnwrapRef - readonly useColumnConversion: UnwrapRef readonly useColumnDataTypeIndicators: UnwrapRef readonly useColumnGeneration: UnwrapRef readonly useConfirm: UnwrapRef diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 2b874b2..6bb4d2b 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -12,6 +12,7 @@ declare module 'vue' { Button: typeof import('primevue/button')['default'] Card: typeof import('primevue/card')['default'] Chip: typeof import('primevue/chip')['default'] + ClaimEditor: typeof import('./src/features/wikibase-schema/components/ClaimEditor.vue')['default'] Column: typeof import('primevue/column')['default'] ColumnPalette: typeof import('./src/features/data-processing/components/ColumnPalette.vue')['default'] ConfirmDialog: typeof import('primevue/confirmdialog')['default'] @@ -20,13 +21,10 @@ declare module 'vue' { DataTable: typeof import('primevue/datatable')['default'] DataTabPanel: typeof import('./src/features/data-processing/components/DataTabPanel.vue')['default'] DefaultLayout: typeof import('./src/core/layouts/DefaultLayout.vue')['default'] - Dialog: typeof import('primevue/dialog')['default'] - Dropdown: typeof import('primevue/dropdown')['default'] FileUpload: typeof import('primevue/fileupload')['default'] Header: typeof import('./src/shared/components/Header.vue')['default'] InputText: typeof import('primevue/inputtext')['default'] ItemEditor: typeof import('./src/features/wikibase-schema/components/ItemEditor.vue')['default'] - LanguageDropZone: typeof import('./src/features/data-processing/components/LanguageDropZone.vue')['default'] MainContent: typeof import('./src/shared/components/MainContent.vue')['default'] OpenProject: typeof import('./src/features/project-management/pages/OpenProject.vue')['default'] Paginator: typeof import('primevue/paginator')['default'] @@ -43,10 +41,12 @@ declare module 'vue' { SchemaTabPanel: typeof import('./src/features/wikibase-schema/components/SchemaTabPanel.vue')['default'] Select: typeof import('primevue/select')['default'] Sidebar: typeof import('./src/shared/components/Sidebar.vue')['default'] + SingleQualifierEditor: typeof import('./src/features/wikibase-schema/components/SingleQualifierEditor.vue')['default'] + SingleReferenceEditor: typeof import('./src/features/wikibase-schema/components/SingleReferenceEditor.vue')['default'] StatementConfigEditor: typeof import('./src/features/wikibase-schema/components/StatementConfigEditor.vue')['default'] StatementEditor: typeof import('./src/features/wikibase-schema/components/StatementEditor.vue')['default'] + StatementManager: typeof import('./src/features/wikibase-schema/components/StatementManager.vue')['default'] StatementPreview: typeof import('./src/features/wikibase-schema/components/StatementPreview.vue')['default'] - StatementsEditor: typeof import('./src/features/wikibase-schema/components/StatementsEditor.vue')['default'] Tab: typeof import('primevue/tab')['default'] TabList: typeof import('primevue/tablist')['default'] TabPanel: typeof import('primevue/tabpanel')['default'] diff --git a/frontend/src/features/data-processing/components/ColumnPalette.vue b/frontend/src/features/data-processing/components/ColumnPalette.vue index 609d98c..5bbb1a3 100644 --- a/frontend/src/features/data-processing/components/ColumnPalette.vue +++ b/frontend/src/features/data-processing/components/ColumnPalette.vue @@ -2,7 +2,6 @@ const projectStore = useProjectStore() const dragDropStore = useDragDropStore() -const { convertProjectColumnsToColumnInfo } = useColumnConversion() const { formatDataTypeDisplayName, generateColumnTooltip, getDataTypeIcon, getDataTypeSeverity } = useColumnDataTypeIndicators() @@ -12,10 +11,6 @@ const { triggerDragStartValidation } = useValidation() // Sample data visibility state (hidden by default) const showSampleData = ref(false) -const dataColumns = computed(() => { - return convertProjectColumnsToColumnInfo(projectStore.columns, projectStore.data) -}) - const handleDragStart = (event: DragEvent, dataCol: ColumnInfo) => { if (!event.dataTransfer) return @@ -50,7 +45,7 @@ const formatSampleValues = (sampleValues: string[]) => {