[Studio] Add GraphQL Configuration#1024
Merged
markus-moser merged 44 commits intostudiofrom Jan 29, 2026
Merged
Conversation
* Added update endpoint * Adapted schema for update endpoint * Service cleanup
Contributor
There was a problem hiding this comment.
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 returnsundefinedwhen not found (notnull). With the currentoperatorType === nullcheck, an unknown operator will fall through andgetIcon(operatorType, ...)/operatorType.getLabel(...)will throw at runtime. Use anisNil(null-or-undefined) check (or explicitly checkoperatorType === undefined) before using it.
assets/studio/js/src/modules/operators/components/operator-modal.tsx:1- This effect relies on
getInitialValues,initialValues, andform, 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
useMemocallback usest,operatorRegistry,getGroup, andgetGroupIcon, 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
useMemocallback usest,operatorRegistry,getGroup, andgetGroupIcon, 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 usingpreg_split('/\\R+/', ...)) and trimming each line, filtering out empty strings.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
assets/studio/js/src/modules/graphql/components/graphql-adapter-form.tsx
Outdated
Show resolved
Hide resolved
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Some more fine tuning will be done in separate PRs