Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
7a472a6
feat(cmdb-import): show the import mapping read-only in the CMDB impo…
WilcoLouwerse Oct 12, 2026
bcd4697
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 12, 2026
a3f4da3
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 12, 2026
dc86739
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 12, 2026
a2b951d
fix(cmdb-import): show the import's write rules in the mapping block
WilcoLouwerse Oct 12, 2026
2e381f7
fix(cmdb-import): name every sheet the profile reads in the help texts
WilcoLouwerse Oct 12, 2026
ae92947
test(cmdb-import): run the sheet-name wiring and the mapping error st…
WilcoLouwerse Oct 12, 2026
7db0b2a
docs(cmdb-import): narrow the mapping block's claim to what it shows
WilcoLouwerse Oct 12, 2026
abc7108
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 12, 2026
e7f9125
test(cmdb-import): fixture follows the overview's createOnlyFields
WilcoLouwerse Oct 12, 2026
f04bf82
fix(cmdb-import): name every sheet in the missing-sheet and too-large…
WilcoLouwerse Oct 12, 2026
27d1ec2
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 12, 2026
9450c84
feat(cmdb-import): show where each import pack comes from and link to…
WilcoLouwerse Oct 12, 2026
6420306
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 12, 2026
0d97674
Merge origin/feat/woo588-cmdb-import-mapping-view-2-ui into the OpenR…
WilcoLouwerse Oct 12, 2026
8a8e81a
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 12, 2026
62bfb52
fix(cmdb-import): link a broken stored pack to its editor and test th…
WilcoLouwerse Oct 12, 2026
f93adfd
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 12, 2026
4110559
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 12, 2026
a1f91b0
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 13, 2026
6f6ec40
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 13, 2026
836107c
style(cmdb-import): prettier on the CMDB import specs
WilcoLouwerse Oct 13, 2026
ce55ebc
feat(cmdb-import): show the mapping as tables and shorten the option …
WilcoLouwerse Oct 13, 2026
c09e9c9
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 13, 2026
49bc84b
fix(cmdb-import): announce the mapping block's loading state, and tid…
WilcoLouwerse Oct 13, 2026
3ddbffd
Merge branch 'woo588-or-1' into woo588-or-2
WilcoLouwerse Oct 13, 2026
50cde19
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 13, 2026
7fc5172
fix(cmdb-import): show field mappings, write rules and pending update…
WilcoLouwerse Oct 13, 2026
d5a7795
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 13, 2026
9fd025a
fix(cmdb-import): announce the mapping load and its failure through a…
WilcoLouwerse Oct 13, 2026
ba983a7
Merge branch 'feat/woo588-cmdb-import-mapping-view-1-endpoint' into f…
WilcoLouwerse Oct 13, 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
32 changes: 26 additions & 6 deletions docs/features/cmdb-import.md
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,14 @@ Nextcloud admins only) answers, per pack, where the import takes it from
link to its editor in OpenRegister. Reading it changes nothing: it does not
store or update a pack.

**In the settings.** Open **Administration settings → Stackiq → CMDB import**
and press **Mapping** under the import form. One table lists the sheets the
import reads and its match, name, required and date columns; a second table
lists the four packs, each with where the import takes it from, its version
and, for a pack kept in OpenRegister, an **Edit in OpenRegister** link. The
municipality pack is not listed: it maps the municipality you choose for the
import, not a column. Opening the page changes nothing.

Each pack has a list of field mappings, one per column: the column name in
the export, the field it goes to, whether it is required, and a
transformation such as trim, a date, or a lookup table of export values to
Expand Down Expand Up @@ -405,15 +413,27 @@ rules, so it checks every pack before it reads a row. It refuses a pack, with
defaults of the vendor and municipality packs stay as shipped.

The mapping endpoint answers the same reason, with the link to the pack's
editor in `details.editUrl`, so you can correct it there and try again.
editor in `details.editUrl`, and the **Mapping** block shows it with an
**Edit in OpenRegister** link, so you can correct the pack there. After saving
it, reload the settings page: **Mapping** then shows the new version, or the
reason the pack is still refused.

**What the Mapping block shows.** Below the table of packs, each pack has a
collapsible block "Columns and fields": which column of the export goes to
which field, whether the mapping is required and which transform it uses, and
the rules for what the import writes (the values it sets, the fields written
only on a new record, the fields it never writes on an existing record). When
an unedited pack in OpenRegister is older than the shipped one, the row says
"Update pending": the next import replaces it with the shipped version.

**What a pack does not change.** Which sheets are read, the APPID and
"Applicatie Naam" columns, the values that mean empty (`NB`), the constant
each sheet adds (`Beheer geregeld: ja` or `nee`), the limits, and which fields
are written only on create or never on an existing record are part of the app
(`lib/Settings/cmdb-import/topdesk-profile.json`) and cannot be changed. The
each sheet adds (`Beheer geregeld: ja` or `nee`) and the limits are part of
the app (`lib/Settings/cmdb-import/topdesk-profile.json`) and cannot be
changed; the **Mapping** block shows the sheets and the match, name, required
and date columns, not the empty values, the constants or the limits. The
municipality is mapped from the name you choose for the import, not from the
export; that pack is not stored in OpenRegister.
export; that pack is not stored in OpenRegister and the block does not list it.

**Reading more columns.** The import reads only the columns the mapping
names. When you map a new column in a pack, the import reads that column from
Expand All @@ -428,7 +448,7 @@ endpoint already shows the new pack, with `updatePending` true, before the
next import runs). A pack you changed
is never overwritten, also not when you save it while an import is updating
it. When an update ships a newer version of a pack you changed, the mapping
endpoint reports it (`newerShipped`); compare the two and copy what you need
endpoint reports it (`newerShipped`) and the **Mapping** block says so; compare the two and copy what you need
into your pack in OpenRegister.

**Back to the shipped pack.** Delete the pack in OpenRegister. The next
Expand Down
59 changes: 52 additions & 7 deletions l10n/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -974,7 +974,6 @@ OC.L10N.register(
"Error code: {code}": "Error code: {code}",
"Excel workbook (.xlsx), at most 10 MB, with the sheet \"Onbeh Applicaties CMDB\" or \"Beheerde Applicaties CMDB\".": "Excel workbook (.xlsx), at most 10 MB, with the sheet \"Onbeh Applicaties CMDB\" or \"Beheerde Applicaties CMDB\".",
"Existing municipalities could not be loaded. You can still type the name of a municipality.": "Existing municipalities could not be loaded. You can still type the name of a municipality.",
"Expected a sheet named \"{first}\" or \"{second}\". Sheet names must match exactly.": "Expected a sheet named \"{first}\" or \"{second}\". Sheet names must match exactly.",
"Failed": "Failed",
"Import": "Import",
"Import a TOPdesk CMDB export (.xlsx) as the applications one municipality uses": "Import a TOPdesk CMDB export (.xlsx) as the applications one municipality uses",
Expand All @@ -991,10 +990,9 @@ OC.L10N.register(
"No rows with this outcome": "No rows with this outcome",
"Nothing more is known on this page; the Nextcloud log has the details.": "Nothing more is known on this page; the Nextcloud log has the details.",
"Only Nextcloud administrators can import a CMDB export.": "Only Nextcloud administrators can import a CMDB export.",
"OpenRegister's mapping engine is missing or a mapping file is invalid. Update OpenRegister and check the Nextcloud log.": "OpenRegister's mapping engine is missing or a mapping file is invalid. Update OpenRegister and check the Nextcloud log.",
"OpenRegister's mapping engine is missing, or a mapping pack is invalid or breaks a rule of the import. The reason below names the pack: correct it in OpenRegister, or check the Nextcloud log.": "OpenRegister's mapping engine is missing, or a mapping pack is invalid or breaks a rule of the import. The reason below names the pack: correct it in OpenRegister, or check the Nextcloud log.",
"Outcome": "Outcome",
"Pick an existing municipality or type the name of a new one.": "Pick an existing municipality or type the name of a new one.",
"Pick an existing organisation of type Municipality, or type a new name and press Enter.": "Pick an existing organisation of type Municipality, or type a new name and press Enter.",
"Pick an organisation of type Municipality, or type the name of a new one.": "Pick an organisation of type Municipality, or type the name of a new one.",
"Reasons and warnings": "Reasons and warnings",
"Records missing from the export can only be kept.": "Records missing from the export can only be kept.",
Expand Down Expand Up @@ -1091,8 +1089,6 @@ OC.L10N.register(
"The file is larger than the server accepts.": "The file is larger than the server accepts.",
"A source sheet may hold at most {limit} rows. Split the export and import the parts one after the other.": "A source sheet may hold at most {limit} rows. Split the export and import the parts one after the other.",
"Split the export and import the parts one after the other.": "Split the export and import the parts one after the other.",
"Excel workbook (.xlsx) with the sheet \"{first}\" or \"{second}\". By default the file may be at most {size}.": "Excel workbook (.xlsx) with the sheet \"{first}\" or \"{second}\". By default the file may be at most {size}.",
"The sheets \"{first}\" (applications without arranged maintenance) and \"{second}\" (with arranged maintenance) are read; other sheets, including the \"Invoer\" sheets, are ignored.": "The sheets \"{first}\" (applications without arranged maintenance) and \"{second}\" (with arranged maintenance) are read; other sheets, including the \"Invoer\" sheets, are ignored.",
"The page got no answer from the import.": "The page got no answer from the import.",
"The connection was cut off before the import answered, so it may still be running or may have finished. Wait a few minutes and check the applications of the municipality before you import again. Importing the same file again creates no duplicates.": "The connection was cut off before the import answered, so it may still be running or may have finished. Wait a few minutes and check the applications of the municipality before you import again. Importing the same file again creates no duplicates.",
"The import cannot be cancelled now: the server has not started its rows yet, or has already finished them. If the import keeps running, press Cancel import again in a moment.": "The import cannot be cancelled now: the server has not started its rows yet, or has already finished them. If the import keeps running, press Cancel import again in a moment.",
Expand Down Expand Up @@ -1131,12 +1127,61 @@ OC.L10N.register(
"Split the rows over two copies of the export and import them one after the other.": "Split the rows over two copies of the export and import them one after the other.",
"The sheet \"{sheet}\" is too large to import: unpacked it is {size}, and the import reads at most {limit} of one sheet.": "The sheet \"{sheet}\" is too large to import: unpacked it is {size}, and the import reads at most {limit} of one sheet.",
"The part {part} of the workbook is too large to import: unpacked it is {size}, and the import reads at most {limit} of one part.": "The part {part} of the workbook is too large to import: unpacked it is {size}, and the import reads at most {limit} of one part.",
"Delete the sheets the import does not read from a copy of the export (it reads only \"{first}\" and \"{second}\"), and import that copy.": "Delete the sheets the import does not read from a copy of the export (it reads only \"{first}\" and \"{second}\"), and import that copy.",
"The workbook holds more than {count} different texts, the most the import reads.": "The workbook holds more than {count} different texts, the most the import reads.",
"Together, the cells of the workbook reference more than {size} of shared text, the most the import reads.": "Together, the cells of the workbook reference more than {size} of shared text, the most the import reads.",
"In development since": "In development since",
"In use since": "In use since",
"The import mapping could not be read. The details are in the Nextcloud log.": "The import mapping could not be read. The details are in the Nextcloud log."
"Application (module)": "Application (module)",
"Supplier organisation (Vendor)": "Supplier organisation (Vendor)",
"Business owner (contact person)": "Business owner (contact person)",
"Loading the mapping…": "Loading the mapping…",
"The mapping could not be loaded.": "The mapping could not be loaded.",
"Sheets read": "Sheets read",
"Match column": "Match column",
"Name column": "Name column",
"Required columns": "Required columns",
"Date columns": "Date columns",
"The import mapping could not be read. The details are in the Nextcloud log.": "The import mapping could not be read. The details are in the Nextcloud log.",
"Mapping": "Mapping",
"OpenRegister's pack store is not available, so the import uses the mapping shipped with stackiq. Update or enable OpenRegister to view and edit the mapping there.": "OpenRegister's pack store is not available, so the import uses the mapping shipped with stackiq. Update or enable OpenRegister to view and edit the mapping there.",
"OpenRegister": "OpenRegister",
"Shipped file": "Shipped file",
"Version {version}": "Version {version}",
"Version {version} (shipped: {shipped})": "Version {version} (shipped: {shipped})",
"Edited": "Edited",
"Edit in OpenRegister": "Edit in OpenRegister",
"Edit in OpenRegister: {target} (opens in a new tab)": "Edit in OpenRegister: {target} (opens in a new tab)",
"Stackiq ships a newer version of this pack ({version}). It was not applied, because the pack was edited in OpenRegister. Delete the pack there to use the shipped version from the next import on; your edits are then lost.": "Stackiq ships a newer version of this pack ({version}). It was not applied, because the pack was edited in OpenRegister. Delete the pack there to use the shipped version from the next import on; your edits are then lost.",
"Excel workbook (.xlsx) with the sheet {sheets}. By default the file may be at most {size}.": "Excel workbook (.xlsx) with the sheet {sheets}. By default the file may be at most {size}.",
"Excel workbook (.xlsx) with one of the sheets {sheets}. By default the file may be at most {size}.": "Excel workbook (.xlsx) with one of the sheets {sheets}. By default the file may be at most {size}.",
"The sheet {sheets} is read; other sheets, including the \"Invoer\" sheets, are ignored.": "The sheet {sheets} is read; other sheets, including the \"Invoer\" sheets, are ignored.",
"The sheets {sheets} are read; other sheets, including the \"Invoer\" sheets, are ignored.": "The sheets {sheets} are read; other sheets, including the \"Invoer\" sheets, are ignored.",
"Expected the sheet {sheets}. Sheet names must match exactly.": "Expected the sheet {sheets}. Sheet names must match exactly.",
"Expected one of the sheets {sheets}. Sheet names must match exactly.": "Expected one of the sheets {sheets}. Sheet names must match exactly.",
"Delete the sheets the import does not read from a copy of the export (it reads only {sheets}), and import that copy.": "Delete the sheets the import does not read from a copy of the export (it reads only {sheets}), and import that copy.",
"A pack deleted in OpenRegister is restored from the shipped file at the next import.": "A pack deleted in OpenRegister is restored from the shipped file at the next import.",
"Choose a municipality, or type a new name and press Enter.": "Choose a municipality, or type a new name and press Enter.",
"Kind of record": "Kind of record",
"New applications become visible to everyone, also without logging in.": "New applications become visible to everyone, also without logging in.",
"Overwrites applications imported before with the values from the export. The (i) button above lists the fields.": "Overwrites applications imported before with the values from the export. The (i) button above lists the fields.",
"Stored in": "Stored in",
"The export": "The export",
"Which columns of the export the next import reads, and where each column goes.": "Which columns of the export the next import reads, and where each column goes.",
"Packs": "Packs",
"Update pending: shipped {version} replaces stored {storedVersion} at the next import.": "Update pending: shipped {version} replaces stored {storedVersion} at the next import.",
"Columns and fields: {target}": "Columns and fields: {target}",
"Which column of the export goes to which field": "Which column of the export goes to which field",
"Column of the export": "Column of the export",
"Field": "Field",
"Transform": "Transform",
"Yes": "Yes",
"No": "No",
"What the import writes": "What the import writes",
"Set on every record": "Set on every record",
"Set on a new record only": "Set on a new record only",
"Written on a new record, or on an existing one only when empty": "Written on a new record, or on an existing one only when empty",
"Never written on an existing record": "Never written on an existing record",
"The mapping could not be loaded. Open Mapping for the reason.": "The mapping could not be loaded. Open Mapping for the reason."
},
"nplurals=2; plural=(n != 1);"
)
Loading
Loading