define([
'module',
'components.dt/js/spi/registration/DropZoneAcceptorProvider',
'components.dt/js/spi/registration/DropZoneSupplierProvider',
'components.dt/js/spi/registration/PasterProvider',
'core/js/api/Listenable'
], function (
module,
DropZoneAcceptorProvider,
DropZoneSupplierProvider,
PasterProvider,
Listenable
) {
'use strict';
/**
* Registry of custom component service providers.
*
* <p>When writing a custom component that is about to be registered into
* ABCS you register its service providers in <em>ComponentProviderRegistry</em>.
* ABCS then picks the providers from here and ask them to return service
* instances ({@link components.dt/js/spi/creators/Creator Creators},
* {@link components.dt/js/spi/generators/Generator Generators},
* {@link components.dt/js/spi/propertyinspectors/PropertyInspector Property Inspectors}
* and others) when needed depending on the lifecycle phase applied to the component
* at the moment.</p>
*
* <p>Service providers (and the services themselves) that you may plug into ABCS
* are descibed by the {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration component registration object},
* registered into ABCS with {@link components.dt/js/api/ComponentProviderRegistry#registerComponent ComponentProviderRegistry.registerComponent}
* and unregistered (when the component is to be removed from ABCS) with
* {@link components.dt/js/api/ComponentProviderRegistry#unregisterComponent ComponentProviderRegistry.unregisterComponent}</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @exports components.dt/js/api/ComponentProviderRegistry
* @constructor
* @private
* @singleton
* @see {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration ComponentProviderRegistry.ComponentRegistration}
* for how to build a registration object.
* @see {@link components.dt/js/api/ComponentProviderRegistry#registerComponent ComponentProviderRegistry.registerComponent} how to register components.
* @see {@link components.dt/js/api/ComponentProviderRegistry#unregisterComponent ComponentProviderRegistry.unregisterComponent} how to unregister components.
*/
function ComponentProviderRegistry() {
AbcsLib.checkSingleton(ComponentProviderRegistry);
Listenable.apply(this, arguments);
this._registrations = {};
}
AbcsLib.mixin(ComponentProviderRegistry, Listenable);
ComponentProviderRegistry._LOGGER = Logger.get(module.id);
/**
* Fired when a component is (re)registered.
*/
ComponentProviderRegistry.prototype.COMPONENT_REGISTERED = 'ComponentProviderRegistry.componentRegistered';
/**
* Fired when a component is unregistered.
*/
ComponentProviderRegistry.prototype.COMPONENT_UNREGISTERED = 'ComponentProviderRegistry.componentUnregistered';
/**
* Registers component service providers into ABCS and with that basically
* activates the component's functionality inside ABCS UI.
*
* <p>This is to be called when you want to make your component active inside
* ABCS and make it able to be dropped from the Component Palette, properly
* render inside an ABCS page or let users modify its behaviour in Property
* Inspector UI.</p>
*
* <p>You are supposed to pass a {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration component registration object}
* defining providers of the various ABCS services as the method parameter.</p>
*
* <p>This <strong>does not overwrite</strong> previous registrations, if there
* is a registration with the same id already present, it will not be overwritten
* and <code>false</code> will be returned.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @param {components.dt/js/api/ComponentProviderRegistry.ComponentRegistration} componentRegistration component registration
* @return {Boolean} <code>true</code> when the component successfully registers
* its registration object. If there is an existing registration with the same id
* present, the method will return <code>false</code>.
* @throws {Error} When <code>componentRegistration</code> is invalid.
* @example <caption>Register component services</caption>
* define([
* 'components.dt/js/api/ComponentProviderRegistry',
* 'myComponent/PaletteRegistrationProvider',
* 'myComponent/CreatorProvider',
* 'myComponent/GeneratorProvider',
* 'myComponent/PropertyInspectorProvider',
* 'myComponent/DeleterProvider'
* ], function (
* componentProviderRegistry,
* myPaletteRegistrationProviderInstance,
* myCreatorProviderInstance,
* myGeneratorProviderInstance,
* myPropertyInspectorProviderInstance,
* myDeleterProviderInstance
* ) {
* // create registration object with all service providers to register
* var myComponentRegistration = {
* id: 'com.my.MyComponent',
* displayName: 'My Cool Component',
* paletteRegistrationProvider: myPaletteRegistrationProviderInstance,
* creatorProvider: myCreatorProviderInstance,
* generatorProvider: myGeneratorProviderInstance,
* propertyInspectorProvider: myPropertyInspectorProviderInstance,
* deleterProvider: myDeleterProviderInstance
* };
*
* // register the component registration into ABCS
* componentProviderRegistry.registerComponent(myComponentRegistration);
* });
* @see {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration ComponentProviderRegistry.ComponentRegistration}
* for how to build a registration object.
*/
ComponentProviderRegistry.prototype.registerComponent = function (componentRegistration) {
AbcsLib.checkParameterCount(1);
AbcsLib.checkDefined(componentRegistration, 'componentRegistration');
ComponentProviderRegistry._checkRegistration(componentRegistration);
if (this._registrations[componentRegistration.id]) {
return false;
}
this._registrations[componentRegistration.id] = {
id: componentRegistration.id,
displayName: componentRegistration.displayName,
creatorProvider: componentRegistration.creatorProvider,
propertyInspectorProvider: componentRegistration.propertyInspectorProvider,
generatorProvider: componentRegistration.generatorProvider,
deleterProvider: componentRegistration.extendedDeleterProvider || componentRegistration.deleterProvider,
extendedDeleterProvider: componentRegistration.extendedDeleterProvider,
pasterProvider: componentRegistration.pasterProvider,
paletteRegistrationProvider: componentRegistration.paletteRegistrationProvider,
dropZoneAcceptorProvider: componentRegistration.dropZoneAcceptorProvider,
dropZoneSupplierProvider: componentRegistration.dropZoneSupplierProvider
};
this.fireEvent(this.COMPONENT_REGISTERED, componentRegistration.id);
return true;
};
/**
* Removes existing component's registration.
*
* <p>Call this if you no longer want your component to be part of ABCS.</p>
*
* <p>Removes all its palette registration, creators, property inspectors, generators
* and other services from the ABCS system previously registered with
* {@link components.dt/js/api/ComponentProviderRegistry.registerComponent ComponentProviderRegistry.registerComponent}.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @param {String} componentID component id the component was registered with.
* @returns {Boolean} flag indicating the component has been unregistered
* successfully. Will be <code>true</code> only if a previously existing registration
* is successfully removed.
* @example <caption>Unregister component services</caption>
* // simply call ComponentProviderRegistry.unregisterComponent
* // to unregister all component service providers
* if (componentProviderRegistry.unregisterComponent('com.my.MyComponent')) {
* console.log('MyComponent successfully unregistered from ABCS');
* }
*/
ComponentProviderRegistry.prototype.unregisterComponent = function (componentID) {
AbcsLib.checkParameterCount(1);
AbcsLib.checkDefined(componentID, componentID);
AbcsLib.checkDataType(componentID, AbcsLib.Type.STRING);
var registration = this._registrations[componentID];
if (registration) {
delete this._registrations[componentID];
this.fireEvent(this.COMPONENT_UNREGISTERED, componentID);
return true;
}
return false;
};
ComponentProviderRegistry.prototype.findPropertyInspector = function (view) {
if (view) {
for (var key in this._registrations) {
var registration = this._registrations[key];
var provider = registration.propertyInspectorProvider;
if (provider) {
var propertyInspector = provider.getPropertyInspector(view);
if (propertyInspector) {
return propertyInspector;
}
}
}
}
return null;
};
ComponentProviderRegistry.prototype.findViewGenerator = function (view) {
if (view) {
for (var key in this._registrations) {
var registration = this._registrations[key];
var provider = registration.generatorProvider;
var generator = provider && provider.getGenerator(view);
if (generator) {
return generator;
}
}
}
return null;
};
ComponentProviderRegistry.prototype.findViewDeleter = function (view) {
if (view) {
for (var key in this._registrations) {
var registration = this._registrations[key];
var provider = registration.deleterProvider;
var deleter = provider && provider.getDeleter(view);
if (deleter) {
return deleter;
}
}
}
return null;
};
ComponentProviderRegistry.prototype.findViewToDelete = function (view) {
var viewToDelete = view;
if (viewToDelete) {
do {
view = viewToDelete;
viewToDelete = this._findViewToDelete(viewToDelete);
} while (view !== viewToDelete);
}
return viewToDelete;
};
ComponentProviderRegistry.prototype._findViewToDelete = function (view) {
for (var key in this._registrations) {
var registration = this._registrations[key];
var provider = registration.extendedDeleterProvider;
var viewToDelete = provider && provider.getTopViewToDelete(view);
if (viewToDelete && view !== viewToDelete) {
view = viewToDelete;
break;
}
}
return view;
};
ComponentProviderRegistry.prototype.findViewPaster = function (view) {
if (view) {
for (var key in this._registrations) {
var registration = this._registrations[key];
var provider = registration.pasterProvider;
var paster = provider && provider.getPaster(view);
if (paster && paster.canPaste(view)) {
return paster;
}
}
}
return null;
};
ComponentProviderRegistry.prototype.findCreator = function (componentId) {
if (componentId) {
var registration = this._registrations[componentId];
var provider = registration && registration.creatorProvider;
if (provider) {
return provider.getCreator();
}
}
};
ComponentProviderRegistry.prototype.getDisplayName = function (componentId) {
var result;
if (componentId) {
var registration = this._registrations[componentId];
result = registration && registration.displayName;
}
return result;
};
/**
* Get registration for all registered components.
*
* @param {String} [componentId] get registration only for the given component
* @returns {Array} palette item registrations
*/
ComponentProviderRegistry.prototype.getPaletteRegistrations = function (componentId) {
var self = this;
var items = [];
var keys = componentId && [componentId] || Object.keys(self._registrations);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var registration = this._registrations[key];
var paletteRegistrationProvider = registration.paletteRegistrationProvider;
var paletteItemConfig = paletteRegistrationProvider && paletteRegistrationProvider.getPaletteItemConfig();
if (paletteItemConfig) {
var categories = paletteItemConfig.categoryName;
if (!categories) {
categories = [];
} else if (!(categories instanceof Array)) {
categories = [categories];
}
items.push({
paletteItemConfig: paletteItemConfig,
categories: categories,
componentId: key,
displayName: registration.displayName,
creator: self.findCreator(key)
});
}
}
return items;
};
ComponentProviderRegistry.prototype.findDropZoneAcceptor = function (view) {
var result = null;
if (view) {
for (var key in this._registrations) {
var registration = this._registrations[key];
var dropZoneAcceptorProvider = registration.dropZoneAcceptorProvider;
var dropZoneAcceptor = dropZoneAcceptorProvider && dropZoneAcceptorProvider.getDropZoneAcceptor(view);
if (dropZoneAcceptor) {
result = dropZoneAcceptor;
break;
}
}
}
return result;
};
ComponentProviderRegistry.prototype.getDropZoneSuppliers = function () {
var items = [];
for (var key in this._registrations) {
var registration = this._registrations[key];
var dropZoneSupplierProvider = registration.dropZoneSupplierProvider;
if (dropZoneSupplierProvider) {
items.push(dropZoneSupplierProvider.getDropZoneSupplier());
}
}
return items;
};
ComponentProviderRegistry._checkRegistration = function (componentRegistration) {
AbcsLib.checkDefined(componentRegistration.id, 'componentRegistration.id');
AbcsLib.checkDataType(componentRegistration.id, AbcsLib.Type.STRING);
if (!componentRegistration.id) {
throw new Error('componentRegistration.id must not be empty');
}
AbcsLib.checkDefined(componentRegistration.displayName, 'componentRegistration.displayName');
AbcsLib.checkDataType(componentRegistration.displayName, AbcsLib.Type.STRING);
if (!componentRegistration.displayName) {
throw new Error('componentRegistration.displayName must not be empty');
}
AbcsLib.checkObjectLiteral(componentRegistration, [
'id',
'displayName',
'creatorProvider',
'propertyInspectorProvider',
'generatorProvider',
'deleterProvider',
'extendedDeleterProvider',
'pasterProvider',
'paletteRegistrationProvider',
'dropZoneAcceptorProvider',
'dropZoneSupplierProvider'
]);
// we may check only the unpublished SPIs as for those already out
// a failure would be an incompatible change
if (componentRegistration.dropZoneAcceptorProvider) {
AbcsLib.checkSPIImpl(componentRegistration.dropZoneAcceptorProvider, DropZoneAcceptorProvider);
}
if (componentRegistration.dropZoneSupplierProvider) {
AbcsLib.checkSPIImpl(componentRegistration.dropZoneSupplierProvider, DropZoneSupplierProvider);
}
if (componentRegistration.pasterProvider) {
AbcsLib.checkSPIImpl(componentRegistration.pasterProvider, PasterProvider);
}
if (componentRegistration.extendedDeleterProvider) {
AbcsLib.checkObjectLiteral(componentRegistration.extendedDeleterProvider, ['getDeleter', 'getTopViewToDelete']);
}
if (componentRegistration.extendedDeleterProvider && componentRegistration.deleterProvider) {
throw new Error('Cannot specify both deleterProvider and extendedDeleterProvider');
}
};
/**
* Component registration object containing info about component providers.
* Describes what ABCS Component services the component provides and wants
* to plug into ABCS and thus the component lifecycle it supports.
*
* <p>Custom UI components consists of several related services plugged into
* ABCS that define its lifecycle and behavior and specify how the component
* renders its model, how it is registered in the Component Palette, what {@link pages.dt/js/api/View view}
* hierarchy representing the component model it creates or how it lets users
* modify its behavior in the Property Inspector UI.</p>
*
* <p>Create an object described by this interface and register into ABCS
* with {@link components.dt/js/api/ComponentProviderRegistry#registerComponent ComponentProviderRegistry.registerComponent}.<br>
* ABCS lets you register the following providers returning ABCS component
* SPI implementations describing the lifecycle of your custom component:</p>
*
* <dl>
* <dt>{@link components.dt/js/spi/registration/CreatorProvider creatorProvider}</dt>
* <dd><p>Returns instances of your component {@link components.dt/js/spi/creators/Creator creator}.<br>
* Creator is called when ABCS makes new instances of your component, either
* when dropped from the Component Palette or made programatically via the
* {@link components.dt/js/api/ComponentFactory Creator API}.</p>
* <p>You should always register an instance of <em>CreatorProvider</em> as without
* it ABCS will not be able to create your components.</p></dd>
*
* <dt>{@link components.dt/js/spi/registration/PaletteRegistrationProvider paletteRegistrationProvider}</dt>
* <dd><p>Returns {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig palette registration configuration}
* defining the way your component is registered inside the ABCS Component Palette
* and how it behaves when being dropped into the ABCS designer (a page).</p>
* <p>Not all components need to be registered in the Component Palette as some
* may only be instantiated programatically through the {@link components.dt/js/api/ComponentFactory Creator API}
* meaning they will not be standalone components but will live only as part
* of a composite <dfn title="Component built from smaller blocks with ABCS designer understanding its hierarchy and able to customize its internals">white-box component</dfn>.</p></dd>
*
* <dt>{@link components.dt/js/spi/registration/GeneratorProvider generatorProvider}</dt>
* <dd><p>Returns component's {@link components.dt/js/spi/generators/Generator generator}
* transforming your component {@link pages.dt/js/api/View views} into DOM
* elements browser can then render in the page.</p>
* </dd>
*
* <dt>{@link components.dt/js/spi/registration/PropertyInspectorProvider propertyInspectorProvider}</dt>
* <dd><p>Returns an instance of a {@link components.dt/js/spi/propertyinspectors/PropertyInspector property inspector}.
* A property inspector defines how (and if) users are allowed to modify the component's
* behaviour inside the ABCS Property Inspector UI. It defines the view and model
* for the component's implementation of a Property inspector that will show
* when the component is selected in the ABCS designer.</p>
* <p>If you do not want to allow users to modify your component properties
* and behavior you do not need to register this provider in which case no
* Property Inspector UI will be displayed when the component is selected.</p></dd>
*
* <dt>{@link components.dt/js/spi/registration/DeleterProvider deleterProvider}</dt>
* <dd><p>Returns an instance of a {@link components.dt/js/spi/deleters/Deleter deleter}.
* This service is responsible for a cleanup of any artifacts created by your
* component during its lifecycle when the component is deleted from a page.</p>
* <p>Registering its instance is not always necessary, it is required only
* when the component creates artifacts that you no longer want to be part of
* the parent ABCS application.<br>
* It may also come in handy if you want to display a removal confirmation
* dialog prior to the actual removal.</p></dd>
* </dl>
*
* <p>The component lifecycle usually consists of:</p>
* <ul>
* <li>User looks the component up in the Component Palette where it is
* registered using a {@link components.dt/js/spi/registration/PaletteRegistrationProvider PaletteRegistrationProvider}.</li>
*
* <li>User drag and drops the component from the palette into the ABCS
* designer and at that point ABCS calls the component's {@link components.dt/js/spi/creators/Creator Creator}
* returned by registered {@link components.dt/js/spi/registration/CreatorProvider CreatorProvider}.
* The <em>creator</em> creates component's {@link pages.dt/js/api/View views} and
* combines them into the componet's view hierarchy (consisting of either one
* view or more complex treeish structure).</li>
*
* <li>ABCS renders the current page with component views created by the component's {@link components.dt/js/spi/creators/Creator Creator}
* and calls the component's {@link components.dt/js/spi/generators/Generator Generator}
* returned by the registered {@link components.dt/js/spi/registration/GeneratorProvider GeneratorProvider}
* to take care of transforming the views into DOM elements (wrapped in <i>jQuery</i>
* elements) browser then can properly render.</li>
*
* <li>When user selects the component (one of its views) ABCS calls the
* {@link components.dt/js/spi/propertyinspectors/PropertyInspector PropertyInspector} (if supported and returned by the component)
* returned by the registered {@link components.dt/js/spi/registration/PropertyInspectorProvider PropertyInspectorProvider}
* and renders the Property Inspector UI according to the view and model defined
* by it.</li>
*
* <li>Finally when the component is deleted from a page ABCS lets the component's
* {@link components.dt/js/spi/deleters/Deleter Deleter} (if supported and returned)
* returned by the registered {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}
* to clean up and artifacts created during the component's lifecycle that
* need to be removed along with the component.</li>
* </ul>
*
* @AbcsExtension stable
* @version 16.3.5
* @memberof components.dt/js/api/ComponentProviderRegistry
* @objectLiteral
* @see {@link components.dt/js/api/ComponentProviderRegistry ComponentProviderRegistry}
* @see {@link components.dt/js/spi/registration/PaletteRegistrationProvider PaletteRegistrationProvider}
* @see {@link components.dt/js/spi/registration/CreatorProvider CreatorProvider}
* @see {@link components.dt/js/spi/registration/GeneratorProvider GeneratorProvider}
* @see {@link components.dt/js/spi/registration/PropertyInspectorProvider PropertyInspectorProvider}
* @see {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}
* @example <caption>Registering component services</caption>
* define([
* 'components.dt/js/api/ComponentProviderRegistry',
* 'myComponent/PaletteRegistrationProvider',
* 'myComponent/CreatorProvider',
* 'myComponent/GeneratorProvider',
* 'myComponent/PropertyInspectorProvider',
* 'myComponent/DeleterProvider'
* ], function (
* componentProviderRegistry,
* myPaletteRegistrationProviderInstance,
* myCreatorProviderInstance,
* myGeneratorProviderInstance,
* myPropertyInspectorProviderInstance,
* myDeleterProviderInstance
* ) {
* // create registration object with all service providers to register
* var myComponentRegistration = {
* id: 'com.my.MyComponent',
* displayName: 'My Cool Component',
* paletteRegistrationProvider: myPaletteRegistrationProviderInstance,
* creatorProvider: myCreatorProviderInstance,
* generatorProvider: myGeneratorProviderInstance,
* propertyInspectorProvider: myPropertyInspectorProviderInstance,
* deleterProvider: myDeleterProviderInstance
* };
*
* // register the component registration into ABCS
* componentProviderRegistry.registerComponent(myComponentRegistration);
* });
*/
var ComponentRegistration = function () {
};
/**
* Specifies the component ID.
*
* <p><strong>Must</strong> be provided and must be a globally unique identifier.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @type {String}
*/
ComponentRegistration.prototype.id = '';
/**
* Specifies the component's display name.
*
* <p>The display name will be show up in various places in ABCS where the
* component takes place (such as in the Component Palette from where it may
* be dropped into the designer).</p>
*
* <p><strong>Must</strong> be specified.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @type {String}
*/
ComponentRegistration.prototype.displayName = '';
/**
* Provider of component's {@link components.dt/js/spi/creators/Creator creator}.
*
* <p>Returns instances of your component {@link components.dt/js/spi/creators/Creator creator}.<br>
* Creator is called when ABCS makes new instances of your component, either
* when dropped from the Component Palette or made programatically via the
* {@link components.dt/js/api/ComponentFactory Creator API}.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @type {components.dt/js/spi/registration/CreatorProvider}
* @see {@link components.dt/js/spi/registration/CreatorProvider CreatorProvider}
* @see {@link components.dt/js/spi/creators/Creator Creator}
*/
ComponentRegistration.prototype.creatorProvider = '';
/**
* Provider of component's {@link components.dt/js/spi/registration/PropertyInspectorProvider property inspector}.
*
* <p>Returns an instance of a {@link components.dt/js/spi/propertyinspectors/PropertyInspector property inspector}.<br>
* A property inspector defines how (and if) users are allowed to modify the component's
* behaviour inside the ABCS Property Inspector UI. It defines the view and model
* for the component's implementation of a Property inspector that will show
* when the component is selected in the ABCS designer.</p>
* <p>If you do not want to allow users to modify your component properties
* and behavior you do not need to register this provider in which case no
* Property Inspector UI will be displayed when the component is selected.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @type {components.dt/js/spi/registration/PropertyInspectorProvider}
* @see {@link components.dt/js/spi/registration/PropertyInspectorProvider PropertyInspectorProvider}
* @see {@link components.dt/js/spi/propertyinspectors/PropertyInspector PropertyInspector}
*/
ComponentRegistration.prototype.propertyInspectorProvider = '';
/**
* Provider of component's {@link components.dt/js/spi/generators/Generator generator}.
*
* <p>Returns component's {@link components.dt/js/spi/generators/Generator generator}.<br>
* Generator transforms your component {@link pages.dt/js/api/View views} into DOM
* elements browser can then render in the page.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @type {components.dt/js/spi/registration/GeneratorProvider}
* @see {@link components.dt/js/spi/registration/GeneratorProvider GeneratorProvider}
* @see {@link components.dt/js/spi/generators/Generator Generator}
*/
ComponentRegistration.prototype.generatorProvider = '';
/**
* Provider of component's {@link components.dt/js/spi/deleters/Deleter deleter}.
*
* <p>Returns an instance of a {@link components.dt/js/spi/deleters/Deleter deleter}.<br>
* This service is responsible for a cleanup of any artifacts created by your
* component during its lifecycle when the component is deleted from a page.</p>
* <p>Registering its instance is not always necessary, it is required only
* when the component creates artifacts that you no longer want to be part of
* the parent ABCS application.</p>
*
* @AbcsExtension stable
* @version 16.3.5
* @type {components.dt/js/spi/registration/DeleterProvider}
* @see {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}
* @see {@link components.dt/js/spi/deleters/Deleter Deleter}
*/
ComponentRegistration.prototype.deleterProvider = '';
/**
* Provider of component's {@link components.dt/js/spi/deleters/Deleter deleter}.
*
* <p>Returns an instance of a {@link components.dt/js/spi/deleters/Deleter deleter}
* and provides additional information useful when deleting views in oppose to
* the basic {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}.<br>
* This service is responsible for a cleanup of any artifacts created by your
* component during its lifecycle when the component is deleted from a page.</p>
* <p>Registering its instance is not always necessary, it is required only
* when the component creates artifacts that you no longer want to be part of
* the parent ABCS application.</p>
*
* @type {components.dt/js/spi/registration/ExtendedDeleterProvider}
* @see {@link components.dt/js/spi/registration/ExtendedDeleterProvider ExtendedDeleterProvider}
* @see {@link components.dt/js/spi/deleters/Deleter Deleter}
*/
ComponentRegistration.prototype.extendedDeleterProvider = '';
/**
* Provider of component's paster.
*
* @AbcsExtension unstable
* @type {components.dt/js/spi/registration/PasterProvider}
*/
ComponentRegistration.prototype.pasterProvider = '';
/**
* Provider of component's {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig palette registration}.
*
* <p>Returns {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig palette registration configuration}
* defining the way your component is registered inside the ABCS Component Palette
* and how it behaves when being dropped into the ABCS designer (a page).</p>
* <p>Not all components need to be registered in the Component Palette as some
* may only be instantiated programatically through the {@link components.dt/js/api/ComponentFactory Creator API}
* meaning they will not be standalone components but will live only as part
* of a composite <dfn title="Component built from smaller blocks with ABCS designer understanding its hierarchy and able to customize its internals">white-box component</dfn>.</p>
* @AbcsExtension stable
* @version 16.3.5
* @type {components.dt/js/spi/registration/PaletteRegistrationProvider}
* @see {@link components.dt/js/spi/registration/PaletteRegistrationProvider PaletteRegistrationProvider}
* @see {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig PaletteRegistrationProvider.PaletteItemConfig}
*/
ComponentRegistration.prototype.paletteRegistrationProvider = '';
/**
* Provider of component's drop zone acceptor.
*
* @type {components.dt/js/spi/registration/DropZoneAcceptorProvider}
*/
ComponentRegistration.prototype.dropZoneAcceptorProvider = '';
/**
* Provider of component's drop zone supplier.
*
* @type {components.dt/js/spi/registration/DropZoneSupplierProvider}
*/
ComponentRegistration.prototype.dropZoneSupplierProvider = '';
return AbcsLib.initSingleton(ComponentProviderRegistry);
});