Skip to content

[Studio] Add GraphQL Configuration#1024

Merged
markus-moser merged 44 commits intostudiofrom
studio-basics
Jan 29, 2026
Merged

[Studio] Add GraphQL Configuration#1024
markus-moser merged 44 commits intostudiofrom
studio-basics

Conversation

@markus-moser
Copy link
Contributor

@markus-moser markus-moser commented Jan 29, 2026

Some more fine tuning will be done in separate PRs

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds Studio-side GraphQL configuration management (UI + backend) including an update endpoint with optimistic concurrency using modification timestamps.

Changes:

  • Introduces backend update API contract (DTOs + controller) and configuration dehydration for storage format.
  • Adds a new Studio “Data Hub Configuration” module with GraphQL adapter UI (tabs for general, schema, security, permissions).
  • Adds operator/drag-and-drop tooling for composing schema fields and registers operator types in the Studio plugin.

Reviewed changes

Copilot reviewed 122 out of 124 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Service/Studio/ConfigurationServiceInterface.php Adds updateConfiguration() to the Studio configuration service API.
src/Schema/UpdateConfigurationResponse.php New response schema returning the updated modification timestamp.
src/Schema/UpdateConfiguration.php New request schema carrying config JSON + client modification date for conflict detection.
src/Resources/translations/studio_api_docs.en.yaml Adds API doc strings for the update endpoint.
src/Resources/translations/studio.en.yaml Adds Studio UI translations for GraphQL config editor and operators.
src/Resources/config/studio_backend.yaml Registers the new ConfigurationDehydrator service.
src/Hydrator/ConfigurationDehydratorInterface.php Defines the dehydration contract for client-to-storage conversion.
src/Hydrator/ConfigurationDehydrator.php Implements dehydration logic (entities indexing, special entities, apikey split).
src/Controller/Studio/Config/UpdateController.php New PUT endpoint to update a configuration and return new modification date.
assets/studio/package.json Bumps studio-ui-bundle dependency to a newer canary build.
assets/studio/js/src/plugins.ts Registers GraphQL module + adapters/operators into the DI container and module system.
assets/studio/js/src/modules/operators/operators/trimmer/trimmer-config-modal.tsx Adds operator config modal UI for Trimmer.
assets/studio/js/src/modules/operators/operators/trimmer/dynamic-type-operator-trimmer.tsx Adds Trimmer operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/translate-value/translate-value-config-modal.tsx Adds operator config modal UI for TranslateValue.
assets/studio/js/src/modules/operators/operators/translate-value/dynamic-type-operator-translate-value.tsx Adds TranslateValue operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/thumbnail/thumbnail-config-modal.tsx Adds operator config modal UI for Thumbnail.
assets/studio/js/src/modules/operators/operators/thumbnail/dynamic-type-operator-thumbnail.tsx Adds Thumbnail operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/thumbnail-html/thumbnail-html-config-modal.tsx Adds operator config modal UI for ThumbnailHtml.
assets/studio/js/src/modules/operators/operators/thumbnail-html/dynamic-type-operator-thumbnail-html.tsx Adds ThumbnailHtml operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/text/text-config-modal.tsx Adds operator config modal UI for Text.
assets/studio/js/src/modules/operators/operators/text/dynamic-type-operator-text.tsx Adds Text operator implementation.
assets/studio/js/src/modules/operators/operators/substring/substring-config-modal.tsx Adds operator config modal UI for Substring.
assets/studio/js/src/modules/operators/operators/substring/dynamic-type-operator-substring.tsx Adds Substring operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/locale-switcher/locale-switcher-config-modal.tsx Adds operator config modal UI for LocaleSwitcher.
assets/studio/js/src/modules/operators/operators/locale-switcher/dynamic-type-operator-locale-switcher.tsx Adds LocaleSwitcher operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/locale-collector/locale-collector-config-modal.tsx Adds operator config modal UI for LocaleCollector.
assets/studio/js/src/modules/operators/operators/locale-collector/dynamic-type-operator-locale-collector.tsx Adds LocaleCollector operator implementation + allowed child types.
assets/studio/js/src/modules/operators/operators/index.ts Central export barrel for operator classes.
assets/studio/js/src/modules/operators/operators/if-empty/if-empty-config-modal.tsx Adds operator config modal UI for IfEmpty.
assets/studio/js/src/modules/operators/operators/if-empty/dynamic-type-operator-if-empty.tsx Adds IfEmpty operator implementation.
assets/studio/js/src/modules/operators/operators/element-counter/element-counter-config-modal.tsx Adds operator config modal UI for ElementCounter.
assets/studio/js/src/modules/operators/operators/element-counter/dynamic-type-operator-element-counter.tsx Adds ElementCounter operator implementation.
assets/studio/js/src/modules/operators/operators/date-formatter/dynamic-type-operator-date-formatter.tsx Adds DateFormatter operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/date-formatter/date-formatter-config-modal.tsx Adds DateFormatter modal with help link and custom footer.
assets/studio/js/src/modules/operators/operators/concatenator/dynamic-type-operator-concatenator.tsx Adds Concatenator operator implementation + label rendering.
assets/studio/js/src/modules/operators/operators/concatenator/concatenator-config-modal.tsx Adds Concatenator operator config modal UI.
assets/studio/js/src/modules/operators/operators/alias/dynamic-type-operator-alias.tsx Adds Alias operator implementation.
assets/studio/js/src/modules/operators/operators/alias/alias-config-modal.tsx Adds Alias operator config modal UI.
assets/studio/js/src/modules/operators/hooks/use-operator.tsx Adds helper hook for operator localization/grouping/icon resolution.
assets/studio/js/src/modules/operators/hooks/use-operator-modal.tsx Adds helper hook for operator modal initial values + applying updates.
assets/studio/js/src/modules/operators/hooks/use-operator-groups.tsx Adds helper hook to resolve group icons from registry config.
assets/studio/js/src/modules/operators/dynamic-type-operator-registry.ts Adds operator registry + group config support.
assets/studio/js/src/modules/operators/dynamic-type-operator-abstract.ts Adds base operator abstraction + child-validation logic.
assets/studio/js/src/modules/operators/components/operator-modal.tsx Adds reusable operator modal wrapper.
assets/studio/js/src/modules/graphql/index.tsx Registers GraphQL operator types and group configs.
assets/studio/js/src/modules/graphql/graphql-api-slice.gen.ts Adds generated RTK Query client for GraphQL endpoints.
assets/studio/js/src/modules/graphql/graphql-api-slice-enhanced.ts Adds tag enhancements + exports hooks for GraphQL queries.
assets/studio/js/src/modules/graphql/components/types.ts Defines GraphQL form value types for the editor UI.
assets/studio/js/src/modules/graphql/components/tabs/security-definition-tab/workspace-grid.tsx Adds workspace grid editor for documents/assets/objects.
assets/studio/js/src/modules/graphql/components/tabs/security-definition-tab/workspace-accordion.tsx Adds accordion wrapper with “Add” action for workspaces.
assets/studio/js/src/modules/graphql/components/tabs/security-definition-tab/types.ts Defines workspace types for the security tab.
assets/studio/js/src/modules/graphql/components/tabs/security-definition-tab.tsx Implements auth + API key generation + workspace editors.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/types.ts Defines query/mutation/generic schema entity types.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/types.ts Adds types used by the schema fields modal/tree.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/schema-fields-modal.tsx Adds schema fields modal with sidebar + available fields tree editing.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/schema-fields-modal.styles.ts Styles for schema fields modal layout.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/hooks/use-sidebar-entries.tsx Builds sidebar entries (class attributes + operator groups).
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/drag-types.ts Defines drag/drop types used by the schema fields editor.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/definitions/system-column-definitions.ts Defines system column mapping/lookup for tree display.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/components/operators-sidebar.tsx UI rendering for operator groups/subgroups.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/components/operator-grid-item.tsx Draggable operator “tile” for sidebar.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/components/draggable-tree-title.tsx Makes class attribute tree nodes draggable.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/components/class-attributes-sidebar.tsx Sidebar to browse/search class attributes.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/components/class-attributes-sidebar.styles.tsx Styles for class attributes sidebar tree display.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/components/add-all-definitions-button.tsx Adds “Add all definitions” helper to seed columns.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/utils/tree-validation-utils.ts Validates DnD operations against operator constraints.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/utils/tree-conversion-utils.ts Converts persisted configs to internal tree nodes and back.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/tree-node-renderer.tsx Wraps tree nodes with draggable + hotspot droppable zones.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/tree-item/tree-item.ts Implements TreeItem model for fields/operators + child rules.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/source-config-utils.ts Derives SourceConfig for operator child validation.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/index.ts Exports the AvailableFieldsTree component.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/hooks/use-tree-nodes.tsx Derives UI tree nodes + icons from internal model.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/hooks/use-tree-context.tsx Provides tree context + DnD handlers and registry access.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/hooks/use-drop-validation.ts Adds additional drop validation based on operator rules.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/empty-tree-drop-zone.tsx Empty-state drop zone for initial DnD into an empty tree.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/empty-tree-drop-zone.styles.ts Styles for empty-state drop zone.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/available-fields-tree.tsx Main tree editor: DnD + operator modals + actions.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/available-fields-tree.styles.ts Styles for available fields tree.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-accordion.tsx Adds query/mutation schema selection and accordion UI.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/query-grid.tsx Query entities grid + schema fields modal integration.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/mutation-grid.tsx Mutation entities grid + schema fields modal integration.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/generic-types-grid.tsx Generic types permissions grid.
assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab.tsx Schema definition tab composition (query/mutation/generic).
assets/studio/js/src/modules/graphql/components/tabs/permissions-tab/types.ts Permission tab types.
assets/studio/js/src/modules/graphql/components/tabs/permissions-tab/permission-grid.tsx Grid editor for role/user permissions.
assets/studio/js/src/modules/graphql/components/tabs/permissions-tab/permission-accordion.tsx Adds role/user selection UI to add permission entries.
assets/studio/js/src/modules/graphql/components/tabs/permissions-tab.tsx Permissions tab composition (roles/users).
assets/studio/js/src/modules/graphql/components/tabs/general-tab.tsx General tab UI for GraphQL config.
assets/studio/js/src/modules/graphql/components/inline-dropdown-panel/inline-dropdown-panel.tsx Shared inline dropdown container for selection panels.
assets/studio/js/src/modules/graphql/components/inline-dropdown-panel/inline-dropdown-panel.styles.tsx Styles for the inline dropdown panel.
assets/studio/js/src/modules/graphql/components/graphql-adapter-form.tsx Main GraphQL adapter editor with save + open-in-tab actions.
assets/studio/js/src/modules/graphql/components/backend-types.ts Backend config typing for GraphQL adapter transformations.
assets/studio/js/src/modules/data-hub/index.tsx Removes old placeholder module.
assets/studio/js/src/modules/config/utils/tree-helpers.ts Adds tree helpers for finding/filtering configurations in a nested tree.
assets/studio/js/src/modules/config/utils/get-export-url.ts Adds helper for building export URL.
assets/studio/js/src/modules/config/utils/adapter-helpers.ts Adds helper to validate adapter presence in registry.
assets/studio/js/src/modules/config/providers/config-provider.tsx Adds context provider for config UI state (tree, loading, expanded keys).
assets/studio/js/src/modules/config/index.tsx Registers Data Hub Configuration widget + main nav entry.
assets/studio/js/src/modules/config/hooks/use-tab-manager.ts Adds tab open/close/active management for config editor tabs.
assets/studio/js/src/modules/config/hooks/use-data-hub-config.ts Adds CRUD handlers (add/clone/delete) with modals + refetch integration.
assets/studio/js/src/modules/config/dynamic-types/index.ts Exports adapter dynamic type infrastructure.
assets/studio/js/src/modules/config/dynamic-types/dynamic-type-data-hub-adapter-registry.ts Adds adapter registry for Data Hub adapters.
assets/studio/js/src/modules/config/dynamic-types/dynamic-type-data-hub-adapter-abstract.tsx Defines adapter abstract contract (icon + form component).
assets/studio/js/src/modules/config/dynamic-types/adapters/dynamic-type-data-hub-adapter-graphql.tsx Registers GraphQL adapter dynamic type.
assets/studio/js/src/modules/config/config-container.tsx Adds main config screen layout (sidebar + tabbed editors).
assets/studio/js/src/modules/config/config-api-slice-enhanced.ts Enhances RTK endpoints with tags + exports hooks.
assets/studio/js/src/modules/config/components/tabs/config-tabs.tsx Adds editor tabs, refresh handling, export, and portal slot for save button.
assets/studio/js/src/modules/config/components/tabs/config-tabs.styles.tsx Styles for tabs layout.
assets/studio/js/src/modules/config/components/tabs/config-tab-content.tsx Renders adapter form per config tab with fetch + dirty-state tracking.
assets/studio/js/src/modules/config/components/import-button/import-button.tsx Adds import UI and auto-open imported config.
assets/studio/js/src/modules/config/components/field-width-container.tsx Constrains form width to studio field width settings.
assets/studio/js/src/modules/config/components/export-button/index.ts Barrel export for ExportButton.
assets/studio/js/src/modules/config/components/export-button/export-button.tsx Adds export button (toolbar/context-menu variants).
assets/studio/js/src/modules/config/components/config-sidebar/components/config-sidebar-toolbar/toolbar.tsx Adds sidebar toolbar (refresh, import, new adapter dropdown).
assets/studio/js/src/main.ts Adds header-only file placeholder (lint/header handling).
assets/studio/js/src/config/service-ids.ts Centralizes DI service IDs for adapters and operators.
assets/studio/build/api/openapi-config.ts Adds RTK Query OpenAPI codegen config for config/graphql endpoints.
Files not reviewed (1)
  • assets/studio/package-lock.json: Language not supported
Comments suppressed due to low confidence (5)

assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/available-fields-tree/hooks/use-tree-nodes.tsx:1

  • getDynamicType(..., false) typically returns undefined when not found (not null). With the current operatorType === null check, an unknown operator will fall through and getIcon(operatorType, ...) / operatorType.getLabel(...) will throw at runtime. Use an isNil (null-or-undefined) check (or explicitly check operatorType === undefined) before using it.
    assets/studio/js/src/modules/operators/components/operator-modal.tsx:1
  • This effect relies on getInitialValues, initialValues, and form, but uses an empty dependency array. If the modal is reused for a different operator/config without unmounting, it will show stale values. Include the relevant dependencies (or key the modal by operator/config) so initial values are applied reliably.
    assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/hooks/use-sidebar-entries.tsx:1
  • The useMemo callback uses t, operatorRegistry, getGroup, and getGroupIcon, but they are missing from the dependency array. That can lead to stale sidebars (e.g., after language change, registry changes, or group configs update). Add the missing dependencies (or memoize upstream values appropriately) so the sidebar updates deterministically.
    assets/studio/js/src/modules/graphql/components/tabs/schema-definition-tab/schema-fields-modal/hooks/use-sidebar-entries.tsx:1
  • The useMemo callback uses t, operatorRegistry, getGroup, and getGroupIcon, but they are missing from the dependency array. That can lead to stale sidebars (e.g., after language change, registry changes, or group configs update). Add the missing dependencies (or memoize upstream values appropriately) so the sidebar updates deterministically.
    src/Hydrator/ConfigurationDehydrator.php:1
  • Splitting API keys only on \"\\n\" can leave \"\\r\" characters when clients send Windows line endings (\\r\\n), resulting in invalid stored keys. Consider normalizing line endings (or using preg_split('/\\R+/', ...)) and trimming each line, filtering out empty strings.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@sonarqubecloud
Copy link

@markus-moser markus-moser marked this pull request as ready for review January 29, 2026 16:43
@markus-moser markus-moser merged commit 9544673 into studio Jan 29, 2026
12 checks passed
@markus-moser markus-moser deleted the studio-basics branch January 29, 2026 16:43
@github-actions github-actions bot locked and limited conversation to collaborators Jan 29, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants