define([], function () {
'use strict';
/**
* Provider interface for returning instances of components' view {@link components.dt/js/spi/propertyinspectors/PropertyInspector property inspectors}.
* Registers into ABCS with the {@link components.dt/js/api/ComponentProviderRegistry Component Registration API}.
*
* <p>Property inspector is part of the ABCS designer and serves as the customization
* UI for existing component {@link pages.dt/js/api/View views}. Property inspector is bound to a view it
* understands and lets users change its properties and behaviour in the UI.</p>
*
* <p>If you want to give users a chance to modify your component or its views implement
* this interface and return an instance of {@link components.dt/js/spi/propertyinspectors/PropertyInspector PropertyInspector}
* in {@link components.dt/js/spi/registration/PropertyInspectorProvider#getPropertyInspector PropertyInspectorProvider.getPropertyInspector}.</p>
*
* <p>When opening a property inspector for a view ABCS iterates over registered
* providers and opens the first property inspector returned from
* {@link components.dt/js/spi/registration/PropertyInspectorProvider#getPropertyInspector PropertyInspectorProvider.getPropertyInspector}.<br>
* That means your provider may be asked to return a property inspector for
* an unrelated view in which case you are to return <code>undefined</code>
* and ABCS will continue searching for the proper property inspector.</p>
*
* @AbcsExtension stable
* @exports components.dt/js/spi/registration/PropertyInspectorProvider
* @constructor
* @private
* @version 16.3.5
* @example <caption>An example of a component property inspector provider.</caption>
* define([
* 'components.dt/js/spi/propertyinspectors/PropertyInspector',
* 'components.dt/js/spi/propertyinspectors/TabNames',
* 'text!path/to/mycomponent/mycomponent_pi_properties.html'
* ], function (
* PropertyInspector,
* TabNames,
* piTemplateHtml
* ) {
* 'use strict';
*
* var MyPropertyInspectorProvider = function () {
* }
*
* MyPropertyInspectorProvider.prototype.getPropertyInspector = function (view) {
* if (view.getType() !== 'THE_SUPPORTED_VIEW_TYPE') {
* return undefined;
* }
* var sharedModel = this._getPIModel(view);
* return new PropertyInspector(
* [
* {
* 'id': 'properties',
* 'title': TabNames.TAB_PROPERTIES,
* 'model': sharedModel,
* 'html': piTemplateHtml
* }
* ],
* {
* 'activate': function () {
* sharedModel.start();
* },
* 'beforeDeactivate': function () {
* return sharedModel.canClosePropertyInspector();
* },
* 'deactivate': function () {
* sharedModel.end();
* }
* }
* });
*
* // Create Knockout view model for PI for the component view.
* //
* // (Model in this example is shared by all PI tabs, but we could also
* // create dedicated model for each tab.)
* //
* MyPropertyInspectorProvider.prototype._getPIModel = function (view) {
* var model = {};
* model.myText = ko.observable(view.getProperties().getProperty('my_text'));
* model.myText.subscribe(function (value) {
* view.getProperties().setProperty('my_text', value);
* });
*
* model.message = ko.observable();
*
* model.canClosePropertyInspector = function () {
* var res = !model.myText() || model.myText().length === 3;
* model.message(res ? '' : 'Text must be empty or 3 chars long');
* return res;
* };
* model.start = function () {
* // do whatever initialization you feel necessary
* };
* model.end = function () {
* // do whatever cleanup you need here
* }
* return model;
* }
*
* return new MyPropertyInspectorProvider();
* });
* @see {@link components.dt/js/api/ComponentProviderRegistry Component Registration API}
* @see {@link components.dt/js/spi/propertyinspectors/PropertyInspector Property Inspector SPI}
* @see {@link components.dt/js/spi/propertyinspectors/PropertyInspector Complex example of a property inspector}
*/
var PropertyInspectorProvider = function() {
AbcsLib.checkThis(this);
};
/**
* Gets custom property inspector for the component.
*
* <p>By returning <code>undefined</code> value you are saying that the view
* type is not related to your component, or that your component does not
* provide any PI.</p>
*
* @AbcsExtension stable
* @version 16.3.5
*
* @param {pages.dt/js/api/View} view - View for which the property
* inspector is going to be opened. The view may be completely unrelated to
* the component for which this <code>PropertyInspectorProvider</code> was
* registered, so the viewType must be always checked.
*
* @returns {components.dt/js/spi/propertyinspectors/PropertyInspector|undefined}
* property inspector instance for the given <code>view</code> or <code>undefined</code>
* if the component does not provide any for the <code>view</code>.
*/
PropertyInspectorProvider.prototype.getPropertyInspector = function (view) {
AbcsLib.checkDefined(view, 'view');
throw new Error('Should be overriden in implementations');
};
return PropertyInspectorProvider;
});