JavaScript Extension Development API for Oracle Visual Builder Cloud Service - Classic Applications

Source: components.dt/js/spi/registration/PropertyInspectorProvider.js

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;

});