Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

201 lines
6.5 KiB

/**
* This class encapsulates the creation of items for a `Dashboard`. Generally a `Part` is a
* component factory that allows all parts of a common type to be easily coordinated as
* needed for that type. For example, an RSS feed might need certain configuration data to
* properly initialize. Perahps not all of this data can or should be supplied from the UI
* that creates new instances for the `Dashboard`.
*
* ## Part Configuration
*
* The primary role of a `Part` is to provide an abstract way to define the configuration
* needed to create views. For example, an RSS Part would at least need the URL for the
* feed.
*
* To implement this a derived class provides a `displayForm` method:
*
* Ext.define('App.parts.RSS', {
* extend: 'Ext.dashboard.Part',
* alias: 'part.rss',
*
* displayForm: function (instance, currentConfig, callback, scope) {
* var me = this,
* title = instance ? 'Edit RSS Feed' : 'Add RSS Feed';
*
* // Display a prompt using current URL as default text.
* //
* Ext.Msg.prompt(title, 'RSS Feed URL', function (btn, text) {
* if (btn === 'ok') {
* var config = {
* feedUrl: text
* };
*
* callback.call(scope || me, config);
* }
* }, me, false, currentConfig ? currentConfig.feedUrl : '');
* }
* });
*
* The returned configuration object is used to create views. It is also passed back to
* `displayForm` to allow the user to edit the configuration for an existing view.
*
* ## Creating Views
*
* The next step is to define the view (the components) appropriate for the part. To
* continue with the above example.
*
* Ext.define('App.parts.RSS', {
* extend: 'Ext.dashboard.Part',
* alias: 'part.rss',
*
* // The viewTemplate is "component template" that is evaluated against the
* // configuration (as returned by displayForm). The top-most component is
* // a panel specific to the Dashboard so it can be configured but should
* // not be replaced. Instead, fit an appropriate component to the panel.
* //
* viewTemplate: {
* layout: 'fit',
* items: [{
* xtype: 'feedpanel',
* feedUrl: '{feedUrl}' // from the configuration object
* }]
* },
*
* displayForm: ...
* });
*
* You can instead choose to override the `createView` method if `viewTemplate` does not
* provide enough flexibility. It is usually a better solution to create a class (like
* in the above example) and pass basic configurations to it rather than over-complicate
* either the `viewTemplate` or a custom `createView` method.
*
* @since 5.0.0
*/
Ext.define('Ext.dashboard.Part', {
mixins: [
'Ext.mixin.Factoryable',
'Ext.mixin.Identifiable'
],
requires: [
'Ext.util.ObjectTemplate'
],
alias: 'part.part',
factoryConfig: {
type: 'part'
},
isPart: true,
/**
* The last assigned identifier for instances created by this `Part`.
* @private
*/
_lastId: 0,
config: {
id: null,
/**
* The `Dashboard` instance that owns this `part`.
* @property {Ext.dashboard.Panel} dashboard
* @readonly
*/
dashboard: null,
/**
* @cfg {Object/Ext.util.ObjectTemplate} viewTemplate
* The configuration object used for creating instances of this `Part`. This is
* used by the `createView` method to create views.
*/
viewTemplate: {
collapsed: '{collapsed}',
columnIndex: '{columnIndex}',
id: '{id}',
title: '{title}',
height: '{height}'
}
},
viewTemplateOptions: {
excludeProperties: {
bind: 1
}
},
valueRe: /^[{][a-z]*[}]$/i,
constructor: function (config) {
this.initConfig(config);
},
applyViewTemplate: function (template) {
//<debug>
if (!Ext.isObject(template)) {
Ext.Error.raise('The viewTemplate for ' + this.$className + ' is not an Object');
}
//</debug>
return Ext.util.ObjectTemplate.create(template, this.viewTemplateOptions);
},
/**
* This method should display an appropriate edit form (probably a modal `Ext.Window`
* or `Ext.Msg.prompt`) to get or edit configuration for an instance of this part.
*
* See the class documentation for examples on implementing this method.
*
* @param {Ext.Component} instance The already existing view or `null` if called to
* configure a new instance.
*
* @param {Object} currentConfig The configuration returned from this method for the
* existing view (`instance`) or `null` if called to configure a new instance.
*
* @param {Function} callback The function to call passing
* @param {Object} callback.config The configuration that defines the instance to be
* created. This value is passed to `createView` and applied to the `viewTemplate`.
*
* @param {Object} scope The scope with which to call the `callback`.
*
* @method displayForm
* @abstract
* @since 5.0.0
*/
displayForm: function (instance, currentConfig, callback, scope) {
callback.call(scope || this, {});
},
/**
* This method is responsible for converting a configuration object from `displayForm`
* into a "view" (an object that can be passed to `Ext.widget`).
*
* If you override this method it is recommended that you `callParent` to get the view
* produced and then edit that result. This is because there are several private
* properties placed on the returned configuration object.
*
* createView: function (config) {
* var view = this.callParent([config]);
*
* // edit view
*
* return view;
* }
*
* @param {Object} config The object returned from `displayForm`.
* @return {Object} The view configuration object.
* @protected
* @since 5.0.0
*/
createView: function (config) {
var me = this,
template = me.getViewTemplate(),
ret = template.apply(config);
ret.dashboard = me.getDashboard();
ret.part = me;
ret._partConfig = config;
return ret;
}
});