Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
e4a4835
[Studio] Render the configuration editor from a configuration it is g…
markus-moser Sep 9, 2026
a4f2c3f
[Spike] Map between stored and form addressing of a configuration
markus-moser Sep 9, 2026
55e245d
Merge branch 'spike/configuration-path-mapper' into feat/change-contr…
markus-moser Sep 9, 2026
e49057d
[Change Control] An import configuration can be proposed instead of w…
markus-moser Sep 9, 2026
212877e
Automatic frontend build
markus-moser Sep 9, 2026
e0a0691
[Change Control] Mount the review on the whole configuration, not the…
markus-moser Sep 9, 2026
d3fddf6
Automatic frontend build
markus-moser Sep 9, 2026
ebe3c29
[Change Control] A review shows the configuration, not the runtime
markus-moser Sep 10, 2026
b4bcb80
Automatic frontend build
markus-moser Sep 10, 2026
b0f129d
[Change Control] The review rail is a map of the change, not a list o…
markus-moser Sep 10, 2026
9ac438a
Automatic frontend build
markus-moser Sep 10, 2026
8b1aaea
[Change Control] An agent can read and propose an import configuration
markus-moser Sep 10, 2026
a620ba0
Automatic frontend build
markus-moser Sep 10, 2026
61a38d9
[Change Control] The review rail is a list of places, and the rows ca…
markus-moser Sep 11, 2026
94aa91e
Automatic frontend build
markus-moser Sep 11, 2026
366f84f
[Change Control] A proposal can only name a type the installation has
markus-moser Sep 11, 2026
554d452
Automatic frontend build
markus-moser Sep 11, 2026
d4baf65
[Change Control] An agent can propose a new import configuration
markus-moser Sep 11, 2026
9cb7a5e
[Change Control] A change behind an off switch is refused, and a revi…
markus-moser Sep 11, 2026
17f771a
Automatic frontend build
markus-moser Sep 11, 2026
2bc3c0b
[Change Control] The review loads like the other surfaces and its rai…
markus-moser Sep 11, 2026
3c1e788
Automatic frontend build
markus-moser Sep 11, 2026
f4d6bef
[Change Control] The rail's headlines open the editor; what is under …
markus-moser Sep 11, 2026
c9b6091
Automatic frontend build
markus-moser Sep 11, 2026
5cd6a8b
[Change Control] The whole headline opens its section, and the change…
markus-moser Sep 11, 2026
fbb0d91
Automatic frontend build
markus-moser Sep 11, 2026
9f9f483
[Change Control] A new configuration reviews with the same map, and s…
markus-moser Sep 11, 2026
4e9c8e2
Automatic frontend build
markus-moser Sep 11, 2026
764af33
Preview data for a proposed configuration, scoped to its change set
markus-moser Sep 11, 2026
dcdcb9d
Automatic frontend build
markus-moser Sep 11, 2026
8e0a6fa
A new configuration reviews in one glance, not as a field list
markus-moser Sep 11, 2026
669ae2e
Automatic frontend build
markus-moser Sep 11, 2026
42b7f40
A relabelled mapping reads as changed, and a jump lands on the field
markus-moser Sep 11, 2026
49c4a6d
Automatic frontend build
markus-moser Sep 11, 2026
b30c11f
A copy of a stored configuration is not refused for the Data Hub's en…
markus-moser Sep 11, 2026
b18c1fb
A create is reviewed whole, so an inert setting it copies is not refused
markus-moser Sep 11, 2026
7ecfde3
The create summary says what the pipeline does, and how much is left …
markus-moser Sep 14, 2026
caa1226
Automatic frontend build
markus-moser Sep 14, 2026
65d2fde
The card says it is new itself, and the count line carries its own em…
markus-moser Sep 14, 2026
a35c1b8
Automatic frontend build
markus-moser Sep 14, 2026
c0edf37
Both proposal rails are the same card
markus-moser Sep 14, 2026
cd74735
Automatic frontend build
markus-moser Sep 14, 2026
2f64ac7
The rail is a column, not a box in a column
markus-moser Sep 14, 2026
108bfd8
Automatic frontend build
markus-moser Sep 14, 2026
075e8b5
The review sits in the modal's frame rather than beside it
markus-moser Sep 14, 2026
c85cc38
Automatic frontend build
markus-moser Sep 14, 2026
910691d
Every size in the proposal card is a token, not arithmetic on one
markus-moser Sep 14, 2026
c892f40
Automatic frontend build
markus-moser Sep 14, 2026
1997631
Say what actually failed, and let the marks breathe
markus-moser Sep 14, 2026
cf329dd
Automatic frontend build
markus-moser Sep 14, 2026
aea491a
The importer's history header is the one Change Control already ships
markus-moser Sep 15, 2026
f042815
Both rails are the Data Hub's summary
markus-moser Sep 16, 2026
59d6f7a
The review lane's contract comes from its package now
markus-moser Sep 21, 2026
d08efbd
The summary rail comes from Change Control
markus-moser Sep 21, 2026
c230eec
Automatic frontend build
markus-moser Sep 21, 2026
e13dc35
Clear the quality gate
markus-moser Sep 21, 2026
4c9860b
A membership test is a Set, and a language key is a string
markus-moser Sep 21, 2026
5e8c748
Automatic frontend build
markus-moser Sep 21, 2026
0ab5675
[Change Control] A proposal cannot name a field the configuration doe…
markus-moser Sep 22, 2026
e4be3e6
Automatic frontend build
markus-moser Sep 22, 2026
4f4944b
[Change Control] An unbound change says so where the reader can see it
markus-moser Sep 22, 2026
2505019
[Change Control] The rail leaves room for the summary's markers
markus-moser Sep 22, 2026
868f414
[Change Control] The rail places the summary, it no longer frames it
markus-moser Sep 22, 2026
2499e03
[Change Control] A new configuration reads by tab, not by pipeline
markus-moser Sep 22, 2026
6d77df9
[Change Control] General is the header, and one setting is not "1 set…
markus-moser Sep 22, 2026
b03c6c8
The importer asks for the width its editor needs
markus-moser Sep 22, 2026
863d1f6
[Change Control] An agent can propose who may use a configuration
markus-moser Sep 22, 2026
b27d667
[Change Control] The review reads its outcome from the shared header
markus-moser Sep 22, 2026
8473459
Pin the Change Control canary that carries the surface layout
markus-moser Sep 23, 2026
25ec69a
Automatic frontend build
markus-moser Sep 23, 2026
e82a12c
[Change Control] The outcome tag lines up with the title, and the SDK…
markus-moser Sep 23, 2026
292d820
Automatic frontend build
markus-moser Sep 23, 2026
94d96d6
[Change Control] Lock the canary that draws a changed row's note
markus-moser Sep 23, 2026
03a37ca
Automatic frontend build
markus-moser Sep 23, 2026
215d78f
[Pimcore Agent] The Configuration agent picks up the import-configura…
markus-moser Oct 5, 2026
3db3f62
[Change Control] Build the import-configuration lane on the Data Hub'…
markus-moser Oct 5, 2026
8cd4abd
[Change Control] The detail hydrator accepts the provisional subjects…
markus-moser Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion assets/studio/build/api/docs.jsonopenapi.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/**
* This source file is available under the terms of the
* Pimcore Open Core License (POCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
* @license Pimcore Open Core License (POCL)
*/

import React from 'react'
import { ConfigSummary, type ConfigSummarySection } from '@pimcore/change-control-bundle/sdk'
import { useTranslation } from '@pimcore/studio-ui-bundle/app'
import type { BackendConfiguration } from '../utils/transformers'
import { type ChangeGroup, type ConfigChange } from './config-review-model'
import { type MappingRowDiff } from './mapping-diff'

const T = 'data-importer.review'

/** the mapping step sits between the resolver and the processing settings in the editor */
const MAPPINGS_AFTER = 'resolver'

const text = (value: unknown): string | undefined =>
typeof value === 'string' && value !== '' ? value : undefined

interface ListProps {
readonly configuration: BackendConfiguration
readonly groups: ChangeGroup[]
readonly mappings: MappingRowDiff[]
/** the section the editor currently shows, so the reader knows where they are */
readonly activeSection: string | undefined
readonly labelFor: (change: ConfigChange) => string
readonly onJump: (section: string) => void
}

/**
* The rail for a configuration that already exists. Data Hub draws the summary — every
* configuration type's review shows the same one — so this is only the translation from
* Change Control's shapes into its two.
*/
export const ChangeList: React.FC<ListProps> = ({
configuration, groups, mappings, activeSection, labelFor, onJump
}) => {
const { t } = useTranslation()

const sections: ConfigSummarySection[] = groups.map((group) => ({
key: group.section,
label: t(group.label),
rows: group.changes.map((change) => ({
key: change.address,
label: labelFor(change),
hint: change.address,
// the editor shows nothing for an unbound change, so the rail has to say it outright
note: change.unbound ? t(`${T}.unbound`, { address: change.address }) : undefined,
status: change.status
}))
}))

// the mapping list rides one address, so it is a section of its own rather than a field
const mappingSection: ConfigSummarySection | null = mappings.length === 0
? null
: {
key: 'mapping',
label: t(`${T}.mappings`),
rows: mappings.map((row) => ({
key: row.key,
label: row.label,
status: row.status === 'unchanged' ? undefined : row.status
}))
}

const at = groups.findIndex((group) => group.section === MAPPINGS_AFTER)
const ordered = mappingSection === null
? sections
: at === -1
? [...sections, mappingSection]
: [...sections.slice(0, at + 1), mappingSection, ...sections.slice(at + 1)]

return (
<ConfigSummary
activeKey={ activeSection }
name={ text(configuration.general?.name) ?? '' }
onOpenSection={ onJump }
sections={ ordered }
/>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* This source file is available under the terms of the
* Pimcore Open Core License (POCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
* @license Pimcore Open Core License (POCL)
*/

import React from 'react'
import { useTranslation } from '@pimcore/studio-ui-bundle/app'
import { ConfigSummary, type ConfigSummarySection } from '@pimcore/change-control-bundle/sdk'
import { type ConfigBrief } from './config-outline'

interface Props {
readonly brief: ConfigBrief
/** the section the editor is showing, so the reader knows where they are */
readonly activeSection: string | undefined
readonly onJump: (section: string) => void
}

/**
* The rail for a configuration that does not exist yet. It reads as the change rail does —
* the same sections, in the same order, opening the same steps — but a section that is all
* new has nothing to mark field by field, so it says what it is set to instead.
*/
export const ConfigBriefCard: React.FC<Props> = ({ brief, activeSection, onJump }) => {
const { t } = useTranslation()

const sections: ConfigSummarySection[] = brief.sections.map((section) => ({
key: section.key,
label: t(section.label),
rows: section.value === undefined
? []
: [{ key: section.key, label: section.value, note: section.note }]
}))

return (
<ConfigSummary
active={ brief.active }
activeKey={ activeSection }
description={ brief.description }
name={ brief.name }
onOpenSection={ onJump }
sections={ sections }
variant="description"
/>
)
}
Loading
Loading