Overview

Component Tab and Component Tab Creator End of Life

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 component tab related interfaces will be removed. They will no longer receive bugfixes or be shipped as part of CET abstract/custom builds, and you will no longer be able to reference these classes in your packages. See compile-time changes below under "Component Tab and Component Tab Creator End of Life" section.
  • The Component Tab file format (.cmtbxt) will also be retired and no longer be supported starting from 17.0. See runtime/behaviour changes below under "Component Tab File Format (*.cmtbxc) End of Life"

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]

Ind. Tag storage and migration

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 option-special migration

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.

Compile Time Changes

Component Tab and Component Tab Creator End of Life

The following interfaces will be removed as part of the Component Tab and Component Tab Creator EOL effort:

cm.abstract.dataSymbol

// Functions:
Removed: public bool dsCloneToolboxes(DataCatalog catalog, ProductCatalog productCatalog, DsToolboxCreatorToolboxCards toolboxCards)
Removed: public str dsToolboxFileStr(DataCatalog catalog, DsToolboxCreatorToolboxCards cards, DsToolboxCreatorToolboxCard card)

cm.abstract.dataSymbol.ui.toolboxCreator

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

Ind. Tag identity and user-tag storage

class DsPart

If 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()

class DataSymbol

Old: public void setItemTagInfo(Part part, str key, ItemTagInfo info, bool userMod=false)
New: public void setItemTagInfo(Part part, str key, ItemTagInfo info)

class DsPicklist

The 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();

class DsPicklistQuantityGridCell

The 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.

class DsPart

DsPart 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)

class DsPart pricing behavior

DsPart 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.

Removed data-symbol package-count column APIs

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.

class DsPData

DsPData 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.

class DsSpecOption

DsSpecOption 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.

class DsPartSpecialMigrator

DsPartSpecialMigrator 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.

Opt-in migration hook for snappers

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

Runtime/Behavior Changes

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.

Component Tab File Format (*.cmtbxc) End of Life

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;
    }
}

Data symbol Ind. Tags now use 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.

Legacy picklist tag data is migrated on load

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.

Removing a picklist item now removes related user-tag info

When a DsPicklistItem is removed, related user-modified Ind. Tag info is cleared from the shared holder instead of lingering on the picklist.

Picklist quantity input now accepts comma decimals in freeform Catalogue Explorer

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 OptionSpecialHolder

At 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 traversal

DsPart.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.

OFDA/XML export now writes data-symbol base price data

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.

Data-symbol prices now translate to the current CET currency in shared outputs

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.

Package count now uses the shared core column and export path

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 keys

DsPartSpecialMigrator 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 runtime
  • getPartSpecialMigrator(init=true) then resolves this."partSpecialMigrator", calling the prop default if needed
  • the migrator is marked with pendingMigration = true and the loaded package version
  • later, Snapper.migratePartSpecials(parts) calls migrateSpecials(parts, this)

Because the migrator is opt-in, catalogue packages should verify older drawings that contain:

  • option specials
  • additional custom options
  • data-symbol-specific option adjustments
  • package-specific DsPart key histories

DsPData now has explicit added-option export hooks

DsPData.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.

Miscellaneous

DsPData now defaults to using G2 properties

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.