140 lines
4.0 KiB
JavaScript
140 lines
4.0 KiB
JavaScript
/*
|
|
* Inspector object editor class.
|
|
*
|
|
* This class uses other editors.
|
|
*/
|
|
+function ($) { "use strict";
|
|
|
|
var Base = $.oc.inspector.propertyEditors.base,
|
|
BaseProto = Base.prototype
|
|
|
|
var ObjectEditor = function(inspector, propertyDefinition, containerCell, group) {
|
|
if (propertyDefinition.properties === undefined) {
|
|
this.throwError('The properties property should be specified in the object editor configuration.')
|
|
}
|
|
|
|
Base.call(this, inspector, propertyDefinition, containerCell, group)
|
|
}
|
|
|
|
ObjectEditor.prototype = Object.create(BaseProto)
|
|
ObjectEditor.prototype.constructor = Base
|
|
|
|
ObjectEditor.prototype.init = function() {
|
|
this.initControlGroup()
|
|
|
|
BaseProto.init.call(this)
|
|
}
|
|
|
|
//
|
|
// Building
|
|
//
|
|
|
|
ObjectEditor.prototype.build = function() {
|
|
var currentRow = this.containerCell.parentNode,
|
|
inspectorContainer = document.createElement('div'),
|
|
options = {
|
|
enableExternalParameterEditor: false,
|
|
onChange: this.proxy(this.onInspectorDataChange),
|
|
inspectorClass: this.inspector.options.inspectorClass
|
|
},
|
|
values = this.inspector.getPropertyValue(this.propertyDefinition.property)
|
|
|
|
if (values === undefined) {
|
|
values = {}
|
|
}
|
|
|
|
this.childInspector = new $.oc.inspector.surface(inspectorContainer,
|
|
this.propertyDefinition.properties,
|
|
values,
|
|
this.inspector.getInspectorUniqueId() + '-' + this.propertyDefinition.property,
|
|
options,
|
|
this.inspector,
|
|
this.group,
|
|
this.propertyDefinition.property)
|
|
|
|
this.inspector.mergeChildSurface(this.childInspector, currentRow)
|
|
}
|
|
|
|
//
|
|
// Helpers
|
|
//
|
|
|
|
ObjectEditor.prototype.cleanUpValue = function(value) {
|
|
if (value === undefined || typeof value !== 'object') {
|
|
return undefined
|
|
}
|
|
|
|
if (this.propertyDefinition.ignoreIfPropertyEmpty === undefined) {
|
|
return value
|
|
}
|
|
|
|
return this.getValueOrRemove(value)
|
|
}
|
|
|
|
ObjectEditor.prototype.getValueOrRemove = function(value) {
|
|
if (this.propertyDefinition.ignoreIfPropertyEmpty === undefined) {
|
|
return value
|
|
}
|
|
|
|
var targetProperty = this.propertyDefinition.ignoreIfPropertyEmpty,
|
|
targetValue = value[targetProperty]
|
|
|
|
if (this.isEmptyValue(targetValue)) {
|
|
return $.oc.inspector.removedProperty
|
|
}
|
|
|
|
return value
|
|
}
|
|
|
|
//
|
|
// Editor API methods
|
|
//
|
|
|
|
ObjectEditor.prototype.supportsExternalParameterEditor = function() {
|
|
return false
|
|
}
|
|
|
|
ObjectEditor.prototype.isGroupedEditor = function() {
|
|
return true
|
|
}
|
|
|
|
ObjectEditor.prototype.getUndefinedValue = function() {
|
|
var result = {}
|
|
|
|
for (var i = 0, len = this.propertyDefinition.properties.length; i < len; i++) {
|
|
var propertyName = this.propertyDefinition.properties[i].property,
|
|
editor = this.childInspector.findPropertyEditor(propertyName)
|
|
|
|
if (editor) {
|
|
result[propertyName] = editor.getUndefinedValue()
|
|
}
|
|
}
|
|
|
|
return this.getValueOrRemove(result)
|
|
}
|
|
|
|
ObjectEditor.prototype.validate = function(silentMode) {
|
|
var values = this.childInspector.getValues()
|
|
|
|
if (this.cleanUpValue(values) === $.oc.inspector.removedProperty) {
|
|
// Ignore any validation rules if the object's required
|
|
// property is empty (ignoreIfPropertyEmpty)
|
|
|
|
return true
|
|
}
|
|
|
|
return this.childInspector.validate(silentMode)
|
|
}
|
|
|
|
//
|
|
// Event handlers
|
|
//
|
|
|
|
ObjectEditor.prototype.onInspectorDataChange = function(property, value) {
|
|
var values = this.childInspector.getValues()
|
|
|
|
this.inspector.setPropertyValue(this.propertyDefinition.property, this.cleanUpValue(values))
|
|
}
|
|
|
|
$.oc.inspector.propertyEditors.object = ObjectEditor
|
|
}(window.jQuery); |