In the CET 17.0 release in May 2026, Catalogue Component Tab and Component Tab Creator will reach their End-of-Life (EOL) and be retired completely.
As part of the EOL effort,
All developers are strongly encouraged to migrate to the new Table of Content (ToC) Toolbox introduced in 15.5 Major as the replacement for the Component Tab - (read more and learn how to migrate or build toolbox with ToC here) [https://dev-docs.configura.com/design-system/cet-developer-guides/catalogue-table-of-contents-with-the-new-ui]
Main MR: [https://git.configura.com/cet/external/base/-/merge_requests/42378]
Data symbol parts and picklists now follow the new 17.0 core Ind. Tag model. Stable Ind. Tag identity is based on sourceId(), user-modified tag text is stored through the shared UserTagInfoHolder, and legacy picklist tag data is migrated during load so existing user overrides can be preserved across reset-behavior changes and older drawings.
MR: Ind. Tag migration and restoration changes
Data-symbol product parts also participate in the 17.0 option-special storage split. Before 17.0, DsPart option specials were read from the shared owner-level PartSpecialHolder using data-symbol-specific combined keys. In 17.0, those option specials belong in the per-part OptionSpecialHolder introduced in cm.abstract.part, and DsPartSpecialMigrator exists to translate older DsSpecOption keys into the new holder layout.
If your catalogue package has older drawings that must preserve DsPart option specials or additional options, you need to opt in to that migration flow during load.
The following interfaces will be removed as part of the Component Tab and Component Tab Creator EOL effort:
// Functions: Removed: public bool dsCloneToolboxes(DataCatalog catalog, ProductCatalog productCatalog, DsToolboxCreatorToolboxCards toolboxCards) Removed: public str dsToolboxFileStr(DataCatalog catalog, DsToolboxCreatorToolboxCards cards, DsToolboxCreatorToolboxCard card)
Note: cm.abstract.dataSymbol.ui.toolboxCreator package is completely removed. If your extension has dependency to this package, please remove it.
// Constants Removed: public const str dsToolboxCreatorFileType = ".cmtbxc"; // Functions Removed: public Image DsToolboxCreatorLoadToolboxImage(Url file) Removed: public DsToolboxCreatorExtensionToolboxCard dsToolboxCreatorCreateExtensionToolboxCard(Window parent, symbol pkg, DsToolboxCreatorToolboxCard card, str sortKey, str groupId, str libraryFunctionName=null, Image image=null, str label=null) Removed: public str tbCatCardStatsEntityKey(DsCatalogToolboxData cData) Removed: public void dsToolboxCreatorToolboxCardSetSectionLabelAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public void dsToolboxCreatorToolboxCardSetSectionAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public void dsToolboxCreatorToolboxCardSetThumbnailViewAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public void dsToolboxCreatorToolboxCardSetToolboxSectionWindowAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public void dsToolboxCreatorToolboxCardSetHeaderAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public void dsToolboxCreatorToolboxCardSetImageSectionAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public void dsToolboxCreatorToolboxCardSetSchemeButtonAnimationEnv(Window window, DsDragAnimationEnv env) Removed: public Library dsToolboxCreatorLibraryFromCard(Card card, symbol pkg) Removed: public void faceliftPreprocess(Library library) Removed: public str->str dsDefaultSchemeDescriptionMap(str{} languages) // Classes Removed: public class DsToolboxCreatorCardPropertyWindow extends SubWindow Removed: public class DsToolboxCreatorCardWindow extends CardWindow Removed: public class DsToolboxCreatorControlWindow extends SubWindow Removed: public class DsToolboxCreatorDataCatalogHeader extends DsDataCatalogHeader Removed: public class DsToolboxCreatorDataCatalogSectionedLabel extends DsDataCatalogSectionedLabel Removed: public class DsToolboxCreatorDataCatalogSectionedScrollableSubWindow extends DsDataCatalogSectionedScrollableSubWindow Removed: public class DsToolboxCreatorDesignWindow extends SubWindow Removed: public class DsToolboxCreatorDialog extends DialogWindow Removed: public class DsToolboxCreatorDeletionSubWindow extends SubWindow Removed: public class DsToolboxCreatorDragAnimation extends DsDragAnimation Removed: public class DsToolboxCreatorDropDownTreeView extends DropDownTreeView Removed: public class DsToolboxCreatorDynamicCard extends DsDynamicCard Removed: public class DsToolboxCreatorExtensionToolboxCard extends ExtensionToolboxCard Removed: public class DsToolboxCreatorFillerInsertDragAnimation extends DsToolboxCreatorThumbnailViewMoveDragAnimation Removed: public class DsToolboxCreatorFillerMoveDragAnimation extends DsToolboxCreatorThumbnailViewMoveDragAnimation Removed: public class DsToolboxCreatorFillerThumbnail extends DsThumbnail Removed: public class DsToolboxCreatorFocusLines Removed: public class DsToolboxCreatorFocusRect Removed: public class DsToolboxCreatorGroupInsertDragAnimation extends DsToolboxCreatorDragAnimation Removed: public class DsToolboxCreatorGroupMoveDragAnimation extends DsToolboxCreatorGroupInsertDragAnimation Removed: public class DsToolboxCreatorHeaderInsertDragAnimation extends DsToolboxCreatorGroupInsertDragAnimation Removed: public class DsToolboxCreatorHeaderLimb extends DsDynamicHeaderLimb Removed: public class DsToolboxCreatorHeaderMoveDragAnimation extends DsToolboxCreatorGroupMoveDragAnimation Removed: public class DsToolboxCreatorHeaderPropertyWindow extends SubWindow Removed: public class DsToolboxCreatorImageSectionInsertDragAnimation extends DsToolboxCreatorDragAnimation Removed: public class DsToolboxCreatorImageSectionMoveDragAnimation extends DsToolboxCreatorImageSectionInsertDragAnimation Removed: public class DsToolboxCreatorImageSectionPropertyWindow extends ShrinkWindow Removed: public class DsToolboxCreatorLibraryLimb extends DsDynamicLibraryLimb Removed: public class DsToolboxCreatorProductCatalogLimbBuilder extends DsProductCatalogLimbBuilder Removed: public class DsToolboxCreatorProductLevelPropertySubWindow extends ShrinkWindow Removed: public class DsToolboxCreatorProductViewInsertDragAnimation extends DsDragAnimation Removed: public class DsToolboxCreatorPropertyWindow extends SubWindow Removed: public class DsToolboxCreatorSchemeButton extends DsDataCatalogSchemeButton Removed: public class DsToolboxCreatorSchemeButtonInsertDragAnimation extends DsToolboxCreatorDragAnimation Removed: public class DsToolboxCreatorSchemeButtonMoveDragAnimation extends DsToolboxCreatorSchemeButtonInsertDragAnimation Removed: public class DsToolboxCreatorSchemeButtonPropertyWindow extends ShrinkWindow Removed: public class DsToolboxCreatorSectionLabelPropertyWindow extends SubWindow Removed: public class DsToolboxCreatorSideBarPropertiesPropertyWindow extends DsInWindowSideBarProperties Removed: public class DsToolboxCreatorThumbnailsLimb extends DsThumbnailsLimb Removed: public class DsToolboxCreatorThumbnailPropertyWindow extends SubWindow Removed: public class DsToolboxCreatorThumbnailViewMoveDragAnimation extends DsThumbnailViewMoveDragAnimation Removed: public class DsToolboxCreatorToolboxCard Removed: public class DsToolboxCreatorToolboxCards Removed: public class DsToolboxCreatorToolboxSectionedScrollableSubWindow extends ToolboxSectionedScrollableSubWindow Removed: public class DsToolboxCreatorToolboxThumbnail extends DsToolboxThumbnail Removed: public class DsToolboxCreatorToolboxThumbnailView extends DsToolboxThumbnailView Removed: public class DsToolboxCreatorTooltip Removed: public class DsToolboxCreatorTreeViewItem extends TreeViewItem Removed: public class DsToolboxCreatorHeaderTreeViewItem extends DsToolboxCreatorTreeViewItem Removed: public class DsToolboxCreatorGroupTreeViewItem extends DsToolboxCreatorTreeViewItem Removed: public class DsToolboxCreatorProductViewTreeViewItem extends DsToolboxCreatorTreeViewItem Removed: public class DsToolboxCreatorFillerTreeViewItem extends DsToolboxCreatorTreeViewItem Removed: public class DsToolboxCreatorImageSectionTreeViewItem extends DsToolboxCreatorTreeViewItem Removed: public class DsToolboxCreatorSchemeButtonTreeViewItem extends DsToolboxCreatorTreeViewItem Removed: public class DsToolboxCreatorUIBuilder extends DsNewUIBuilder Removed: public class DsToolboxCreatorUIGroupBuilder extends DsUIGroupBuilder
DsPartIf your data symbol part subclass previously used itemTagKey() or partSourceId to control Ind. Tag identity, move that logic to sourceId().
Old: public constructor(Snapper snapper, DsPData data, double basePrice, Double optionPriceSum, double qty=1, str partSourceId=null) New: public constructor(Snapper snapper, DsPData data, double basePrice, Double optionPriceSum, double qty=1, str sourceId=null) Old: public constructor(Snapper snapper, DsPData data, str articleCode, str description, double basePrice, Double optionPriceSum, double quantity=1, double inPrice=0, bool flattenable=true, bool group=false, partStyle style=psNone, str flattenableKey=null, bool allowOtherParent=true, str partSourceId=null) New: public constructor(Snapper snapper, DsPData data, str articleCode, str description, double basePrice, Double optionPriceSum, double quantity=1, double inPrice=0, bool flattenable=true, bool group=false, partStyle style=psNone, str flattenableKey=null, bool allowOtherParent=true, str sourceId=null) Old override point: public str itemTagKey() New override point: public str sourceId()
DataSymbolOld: public void setItemTagInfo(Part part, str key, ItemTagInfo info, bool userMod=false) New: public void setItemTagInfo(Part part, str key, ItemTagInfo info)
DsPicklistThe following picklist-local user-tag storage fields have been removed. If your code accessed them directly, migrate to the shared helper APIs in cm.core.part.userTagInfoHolder.cm.
Removed: public str->ItemTagInfo tagInfos(); Removed: public str->str tagInfoKeys();
DsPicklistQuantityGridCellThe freeform picklist quantity cell now uses a custom numeric field instead of relying only on the older default text parsing path.
Old: public class DsPicklistQuantityGridCell extends PicklistInputGridCell New: public class DsPicklistQuantityGridCell extends DsPicklistInputGridCell Old: extend public FormattedTextField getCustomField(Control popup) New: extend public FormattedTextField getCustomField(GridWindow gw, Control popup) Old: public FormattedTextField getCustomField(Control popup) New: public FormattedTextField getCustomField(GridWindow gw, Control popup)
This is the class-level migration surface behind the quantity-input behavior change in Catalogue Explorer freeform picklists.
DsPartDsPart now exposes additional public hooks for the 17.0 option-identity and added-option workflows.
Removed: public str optSpecialKey(PartOptionItem opt) Old: public str getCompanyCode() New: public str companyCode() Old: extend public str catalogCode() New: public str catalogCode() Old: extend public double pkgCount() New: public double pkgCount() Added: extend public void xmlAdditionalOptions(DsiPDataOption dataOpt|, int index, str prefix, XmlStreamBuf buf, bool recurse=true) Added: extend public void xmlAdditionalOptions(SpecOption anchorOpt|, int index, str prefix, XmlStreamBuf buf, bool recurse=true) Added: extend public void xmlAdditionalOptions(str key|, int index, str prefix, XmlStreamBuf buf, bool recurse=true) Added: extend public void generateCustomOptionXmlTag(CustomSpecOption customOpt, int index, str prefix, XmlStreamBuf buf) Added: extend public void generateAdditionalOptions(DsiPDataOption dataOpt|, ItemData itemData, bool recurse=true) Added: extend public void generateAdditionalOptions(SpecOption anchorOpt|, ItemData itemData, bool recurse=true) Added: extend public void generateAdditionalOptions(str key|, ItemData itemData, bool recurse=true)
DsPart pricing behaviorDsPart now participates more directly in the shared 17.0 currency-translation pricing flow.
Changed behavior/important usage: public double basePrice(bool includeChildren=false, Space space=null, bool translatePrice=true) Changed behavior/important usage: public Double generateOptionPriceSum()
For data-symbol parts, this means base price and option-price calculations now flow through the shared CET-currency translation behavior more consistently.
The older data-symbol-specific package-count column interfaces have been removed. If your package references them directly, update that code to use the shared core package-count column instead.
Removed: public const DsPackageCountColumn dsPkgCountColumn() Removed: public class DsPackageCountColumn extends BasicPartColumn
Replacement: use cm.core.init.packageCountColumn() / PackageCountColumn.
DsPDataDsPData also gained new hooks for the 17.0 option-export flows.
Added: extend public void generateOptionRows(PartOptionItem opt, DsPart part, SifEnv env, Space space, str featureCode=null, str featureDesc=null) Added: extend public void generateAdditionalOptionRows(DsiPDataOption dataOpt|, DsPart part, SifEnv env, Space space, bool recurse=true) Added: extend public void generateAdditionalOptionRows(SpecOption anchorOpt|, DsPart part, SifEnv env, Space space, bool recurse=true) Added: extend public void generateAdditionalOptionRows(str key|, DsPart part, SifEnv env, Space space, bool recurse=true)
These methods are the entry points for packages that need to participate in SIF export of added options.
DsSpecOptionDsSpecOption should also be considered part of the 17.0 migration surface for data-symbol packages because its key generation feeds directly into option-special identity and migration.
Added/important usage: public class DsSpecOption extends SpecOption Added/important usage: public DsPDataOption option Added/important usage: public str generateKey() Added/important usage: public str adjustmentKey()
For data-symbol options, generateKey() and adjustmentKey() now depend on DsPDataOption.optionToRootPath() when available. generateKey() also includes groupCode when present. That is why data-symbol option-special migration and added-option ordering need their own DsPartSpecialMigrator handling instead of assuming base SpecOption keys are sufficient.
DsPartSpecialMigratorDsPartSpecialMigrator is the public data-symbol-specific migration helper for 17.0 option-special migration.
It extends ProdPartSpecialMigrator and adjusts the legacy-key logic for DsSpecOption and feature-option combinations.
Added: public class DsPartSpecialMigrator extends ProdPartSpecialMigrator Added: public str oldOptSpecialsKey(Part part, PartOptionItem opt) Added: public str oldOptSpecialsKey(PartOptionItem opt)
If your catalogue package historically used custom DsPart option keys, subclass DsPartSpecialMigrator and override those methods. The Fika example does exactly this by returning FikaDsPartSpecialMigrator from the snapper prop and overriding oldPartSpecialsKey(Part part) for its older key histories.
The migrator types are opt-in.
If your snapper package needs to preserve old part or option specials, expose a PartSpecialMigrator "partSpecialMigrator" prop on the snapper and return the right migrator instance for that snapper family.
A downstream example from custom.fika looks like this:
PartSpecialMigrator "partSpecialMigrator" { Object default(..) { return FikaDsPartSpecialMigrator(); } }
The searchable base types involved are:
New/important: class PartSpecialMigrator New/important: class ProdPartSpecialMigrator New/important: class DsPartSpecialMigrator
DsAPIPData which is the data used for snappers imported from stage has been removed. Stage snappers will now use DsPData which is used by regular catalogue symbols to be more consistent with CET catalogue symbols.
As part of the EOL effort, the Component Tab file format (.cmtbxt) will also be retired and no longer be loadable as the streamed Component Tab class packages are removed. Ideally the Component Tab interfaces should only be streamed as part of the cmtbxt file format, and should not (and is not supposed to) be streamed with other cm file format (e.g., drawings, favorites). However, if the classes were somehow streamed as part of other file format, a new PackageStreamRenamer class is introduced to redirect these missing classes to a temporary placeholder class. Do note that this class serves no meaningful purpose, as it merely exists to suppress or bypass any load failure/errors caused by missing Component Tab related packages.
In developMode, the renamer will print extra info and a short stack dump so that it won't go fully unnoticed.
In cm.abstract.dataSymbol.renamer.cm:
/** * Stream renamer for removed toolbox creator package (cm.abstract.dataSymbol.ui.toolboxCreator). * which was permanently removed starting 17.0. * * Handles and redirect the streamed objs to a dummy class so it does not crash CET. */ private class DsToolboxCreatorRenamer extends PackageStreamRenamer { public void type(version v, Symbol pkg, Str name, Str fileName=null) { if (pkg.v == "cm.abstract.dataSymbol.ui.toolboxCreator") { if (developMode) { pln("Attempting to load Component Tab interfaces!".eAngry; #pkg; #name); stackDump(3); } pkg.v = "cm.abstract.dataSymbol"; name.v = "DsDummyTBCreatorStreamPlaceHolder"; } } /** * Deprecate old packages. */ final private void deprecateOldPackages() { // Used to deprecate packages info stored in drawings to avoid load warnings about missing packages if (StreamRenamer r = globalStreamRenamer) { r.deprecatePkg((#"cm.abstract.dataSymbol.ui.toolboxCreator")); } } } /** * Placeholder for streamed classes from 'cm.abstract.dataSymbol.ui.toolboxCreator'. */ public class DsDummyTBCreatorStreamPlaceHolder : unstreamable { /** * Load failure event. */ public loadFailedResult loadFailed(ObjectFormatter formatter, LoadFailure failure) { return loadFailedResult.ignore; } }
sourceId()DsPart.sourceId() now resolves a stable identity in this order: super(), DsPData.dataId, DsPData.styleNr(), then article code. This is the identity used by the new core Ind. Tag and user-tag migration system.
DsPart.uniqueKey() no longer includes user-modified ItemTagInfo state. If your extension relied on customized Ind. Tag text to make data symbol parts unique, provide a stable sourceId() instead.
DsPicklist.loadFailed(..) now migrates the removed tagInfos and tagInfoKeys storage into the shared UserTagInfoHolder. This also reconstructs user-modified tag text for tags that were saved but were not actively materialized when the drawing was last open.
When a DsPicklistItem is removed, related user-modified Ind. Tag info is cleared from the shared holder instead of lingering on the picklist.
The quantity column in the freeform Catalogue Explorer picklist now accepts both , and . as decimal separators through the custom numeric input field used by DsPicklistQuantityGridCell.
This aligns the picklist quantity editor more closely with Calculations. Entering a value such as 1,2 should now preserve the decimal quantity instead of truncating everything after the comma.
DsPart option specials now belong in per-part OptionSpecialHolderAt runtime, DsPart option specials are no longer supposed to remain in the owner snapper's shared PartSpecialHolder.
They now belong in the per-part OptionSpecialHolder keyed from the part's sourceId(), just like other ProdPart option specials.
This matters for data-symbol packages because legacy DsSpecOption keys were not the same as base SpecOption keys. If you load older drawings without opting in to the right migrator, option specials or added options can be lost even though part specials still survive.
DsPart exports now include added options through anchor traversalDsPart.xmlOptions(...), DsPart.xmlAdditionalOptions(...), and DsPart.generateAdditionalOptions(...) now work with the 17.0 added-option model. Instead of assuming only catalogue-selected options exist, these flows follow the option anchor chain and include inserted custom options in XML and PMX item data.
If your package overrides export behavior, make sure it does not silently ignore added options that now live behind getFollowingCustom(...).
Root-level added options are anchored with cRootKey, so export code that only looks for options following normal catalogue options can still miss valid added options.
Data-symbol OFDA/XML export now participates in the shared Part.xmlUserDefined(...) price-export flow. OfdaXMLOrderLineDsProxy writes the part base price through cBasePriceTag, and DsPart continues to export option data through the 17.0 added-option-aware XML helpers.
For core data-symbol parts, base price and option pricing now follow the current CET currency setting more consistently. That affects shared BOM-visible outputs such as Calculations, query dialogs, print/report flows, article-view style UI, SIF export, and OFDA/XML export where those values are shown or exported.
This is a migration point for manufacturers. Packages that previously relied on untranslated data-symbol prices, or that added their own manual currency conversion, should verify pricing in both default-currency and non-default-currency scenarios.
The older data-symbol-specific package-count column registration is removed in favor of the shared core PackageCountColumn. Data-symbol parts still provide the actual count through DsPart.pkgCount(), but OFDA/XML and part-detail export now rely more on the shared core package-count path.
Older saved references to cm.abstract.dataSymbol.partColumns package-count and preview column types are redirected through the renamer to the shared core column types during load.
DsPartSpecialMigrator handles legacy data-symbol option keysDsPartSpecialMigrator translates the older data-symbol option-special key formats into the new per-part holder layout.
That includes the older DsSpecOption key forms and the feature-option combinations that were previously flattened into the shared holder key.
During load, the discovery path is:
Snapper.loaded1() calls initPartSpecialMigrator(formatter)initPartSpecialMigrator(...) checks whether the snapper already has a non-empty PartSpecialHolder and whether the loaded package version is older than the current runtimegetPartSpecialMigrator(init=true) then resolves this."partSpecialMigrator", calling the prop default if neededpendingMigration = true and the loaded package versionSnapper.migratePartSpecials(parts) calls migrateSpecials(parts, this)Because the migrator is opt-in, catalogue packages should verify older drawings that contain:
DsPart key historiesDsPData now has explicit added-option export hooksDsPData.generateOptionRows(...) and generateAdditionalOptionRows(...) are the new SIF-export helpers for both normal and added options.
If your package customizes SIF export, review those hooks so that added options remain visible in exported data.
Previously DsPData used G2 properties by default for its base class. This has now been changed so that subclasses of DsPData will also use G2 properties by default as well.
Old: extend public bool usingG2() { if (blockDataProxy == 0 and proxy) return proxy.usingG2(DsPDataProxyEnv(this)); return (this.class.toS in {"DsPData", "DcPData", "DcPRenderData"} and (!proxy or proxy.class.toS == "DsPDataProxy")); }
New: extend public bool usingG2() { if (blockDataProxy == 0 and proxy) return proxy.usingG2(DsPDataProxyEnv(this)); return true; }
To override the default behavior, override the usingG2 method in your DsPData subclass, or register a DsPDataProxy and override the public bool usingG2(DsPDataProxyEnv env) method to return false.