Inspector
The plugin implements an editor and viewer of Cell model properties.
To learn more about the plugin, check out the Property Editor and Viewer section.
constructorβ
constructor(opt: Inspector.Options);
The Inspector constructor accepts several parameters:
cellβ
cell?: mvc.Model;
[optional] The object whose model properties the Inspector will be showing to the user for viewing and editing. In this case, the Inspector retrieves the properties of the provided Cell.
Either this parameter or cellView
is required. The two options are mutually exclusive.
cellViewβ
cellView?: dia.CellView;
[optional] The object whose model properties the Inspector will be showing to the user for viewing and editing. In this case, the Inspector retrieves the properties of the CellView's associated Cell (cellView.model
).
Either this parameter or cell
is required. The two options are mutually exclusive.
containerβ
container?: mvc.$Element;
[optional] A DOM Element (or a CSS selector identifying one) that should serve as the container into which the options of any select-box
or color-palette
input fields should be appended.
The default is null
- in that case, the plugins use their respective default target values (as specified in the API reference: ui.SelectBox.options.target
, ui.ColorPalette.options.target
).
focusField()β
focusField?: (opt: { [key: string]: any }, path: string, element: HTMLElement, inspector: Inspector) => void;
[optional] A callback function that is called by the Inspector whenever it is trying to focus an input field (e.g. via inspector.focusField()
).
This function allows you to specify the focus behavior of custom input field types.
The same function is used for all input field definitions; you need to disambiguate between different cases on your own (e.g. via a switch
block).
The callback function is provided with the following arguments, which you may use in your logic:
opt
is theinputConfig
object provided within the Inspector'sinputs
object as a definition of the current input field.path
is a string containing the path to the definition of the current input field within the Inspector'sinputs
object, separated by slashes ('/'
).element
the rendered HTMLElement of this field (i.e. the value returned byrenderFieldContent()
callback)inspector
is a reference to the current Inspector instance (for context).
getFieldValue()β
getFieldValue?: (attribute: HTMLElement, type: string, inspector: Inspector) => any;
[optional] A callback function that is called by the Inspector whenever user input is detected in an input field. It is expected to return an object with a single property:
value
is the value read from the field (to be saved on the Cell model).
In other words, when used together with the renderFieldContent()
option, this option allows you to define custom input field types.
The same function is used for all input field definitions; you need to disambiguate between different cases on your own (e.g. via a switch
block). If the callback function is defined but returns undefined
in some cases, the Inspector will try to understand the input field definition in question as a built-in input field type (as if this function were not provided).
The callback function is provided with the following arguments, which you may use in your logic:
attribute
is the DOM Element container of the current input field in the Inspector (i.e. the value returned byrenderFieldContent()
callback).type
is theinputConfig.type
identifier of the current input field definition.inspector
is a reference to the current Inspector instance (for context).
groupsβ
groups?: any;
[optional] An object that defines the groups in the Inspector. Each group may contain any number of input fields from the Inspector.
The keys of this object are strings that uniquely identify the groups and values are groupConfig
objects that contain properties for a given group:
-
[optional]
closed
is a boolean specifying whether the group should be closed by default (when the Inspector is first opened). Default isfalse
(the group is open). -
[optional]
index
is a number specifying the index of the group relative to other groups. It isundefined
by default (groups are presented in no particular order within the Inspector). -
[optional]
label
is a string specifying a label for the group. This label is displayed as a header of the group section in the accordion-like Inspector. It is the group's key by default. -
[optional]
when
is an object containing conditional expressions that determine whether the group should be shown or hidden based on the value of other Cell model properties. There are no conditions by default, which means that the group is always shown. See the Property Editor and Viewer Conditional expressions section for more information.
inputsβ
inputs?: any;
[optional] An object that defines the input fields in the Inspector. (An input field is in charge of setting user input on the Cell model.)
The structure of the object mimics the structure of properties of the Cell model. The keys of this object are strings that match the properties within the Cell model (possibly nested) - until the deepest-level values, which specify inputConfig
objects that contain properties for a given input field.
The following is a list of inputConfig
options which are shared by all input fields. Some input field types may recognize additional options - those are listed inside their entries within the Input field types section.
-
[optional]
attrs
is an object of the form<selector>: { <attributeName>: <attributeValue>, ... }
, which allows you to set arbitrary HTML attributes on the HTML code generated for this input field. This is useful if you want to mark certain input fields (e.g. via an additionalclassName
) or to store some additional content in them (e.g. in order to display a tooltip). -
[optional]
defaultValue
specifies the value displayed in the input field when the corresponding Cell property isundefined
. It can either be a primitive value or a callback function with the signature(cell: dia.Cell, path: string) => any
, which dynamically returns the default value. -
[optional]
group
is a string matching a key of the Inspector'sgroups
object, indicating that the input field belongs to the specified group. It isundefined
by default (no group membership). See the Property Editor and Viewer Groups section for more information. -
[optional]
index
is a number indicating the index of the input field within itsgroup
(if one is specified). It isundefined
by default (input fields are presented in no particular order within the group). See the Property Editor and Viewer Groups section for more information. -
[optional]
label
is a string specifying the label that the input field should have in the Inspector. It is the input field's path by default. -
[optional]
overwrite
is a boolean switching whether a value entered into the input field should overwrite the current contents of the Cell (true
) or be merged with the previous contents (false
). The default isfalse
. Example resolution:// `overwrite: false` (default)
// - previous value of Cell model property:
{ existingProperty: 'value1' }
// - user input:
{ newProperty: 'value2' }
// => new value of Cell model property:
{ newProperty: 'value2', existingProperty: 'value1' }
// `overwrite: true`
// - previous value of Cell model property:
{ existingProperty: 'value1' }
// - user input:
{ newProperty: 'value2' }
// => new value of Cell model property:
{ newProperty: 'value2' } -
[required]
type
is a string specifying the type of the input field. See the Input field types section for a list of supported types and their additionalinputConfig
options. -
[optional]
valueRegExp
is a string specifying a regular expression that is used to interpret (and set) a value on the Cell. The default isundefined
(no modification of values). Example resolution:// `valueRegExp: '(prefix: )(.*)()'`
// - old value of Cell model property:
'prefix: Hello World!'
// => value presented in the input field:
'Hello World!'
// - user input:
'test'
// => new value of Cell model property:
'prefix: test'Throws the error
Inspector: defaultValue must be present when valueRegExp is used
if anundefined
value is encountered. You should use this option in combination with thedefaultValue
option to ensure thatundefined
is never encountered as a value. -
[optional]
when
is an object containing conditional expressions that determine whether the input field should be shown or hidden based on the value of other Cell model properties. See the Property Editor and Viewer Conditional expressions section for more information. There are no conditions by default, which means that the input field is always shown.Conditional expressions are objects with the following properties:
- [required] one property whose key identifies the operator of the expression, and whose value depends on the type of the operator (primitive, unary, multiary, custom primitive)
- [optional]
options
property which is an object that modifies the evaluation of the expression:- [optional]
dependencies
is an array of string paths pointing to Cell model properties whose values are necessary for the evaluation of the expression (relevant for custom operators), - [optional]
otherwise
is an object that modifies what happens when the expression evaluates tofalse
:- [optional]
unset
is a boolean which determines whether the input field should be cleared (or reverted to itsdefaultValue
) when it is hidden by Inspector (true
), or should remember its user-submitted content and present it again whenever the input field becomes visible (false
). The default isfalse
.
- [optional]
- [optional]
liveβ
live?: boolean;
[optional] Should the Inspector update the Cell properties immediately (i.e. in reaction to an onchange
event triggered on a form input)? The default is true
.
multiOpenGroupsβ
multiOpenGroups?: boolean;
[optional] Is the user allowed to have multiple groups opened in the Inspector at the same time? The default is true
.
If you are looking for the classical accordion
type of Inspector (only one group open at a time), set this option to false
.
operatorsβ
operators?: { [operatorName: string]: Operator };
[optional] An object that allows you to define custom primitive operators for use in conditional expressions.
The keys of this object are strings that uniquely identify the custom operators and values are callback functions which are expected to return true
when the custom operator's condition is met and false
when it is not. The callback function is provided with the following arguments which you may use in your logic:
cell
is a reference to the Cell modified by the current Inspector instance.value
is the value of the property at the path provided by the first operand of the expression....arguments
is anything that was passed to the operator, spread into arguments - if a single value is passed to the operator, it becomes a single argument, but if an array is passed to the operator, its contents become individual arguments.valuePath
(the last argument) is a string containing the resolved path to the property specified in the first operand of the expression (wildcards replaced).
renderFieldContent()β
renderFieldContent?: (opt: { [key: string]: any }, path: string, value: any, inspector: Inspector) => mvc.$HTMLElement;
[optional] A callback function that is called by the Inspector whenever it needs to render an input field. It is expected to return the content as an HTMLElement or a DOM Element.
In other words, this function allows you to define custom input field types.
The same function is used for all input field definitions; you need to disambiguate between different cases on your own (e.g. via a switch
block). If the function is defined but returns undefined
in some cases, the Inspector will try to understand the input field definition in question as a built-in input field type (as if this function were not provided).
The callback function is provided with the following arguments, which you may use in your logic:
opt
is theinputConfig
object provided within the Inspector'sinputs
object as a definition of the current input field.path
is a string containing the path to the definition of the current input field within the Inspector'sinputs
object, separated by slashes ('/'
).value
is the value read from the Cell property at the corresponding path at the time of rendering of the current input field. It takes the current input field definition'sinputConfig.defaultValue
andinputConfig.valueRegExp
into account (if any are specified).inspector
is a reference to the current Inspector instance (for context).
renderLabel()β
renderLabel?: (opt: { [key: string]: any }, path: string, inspector: Inspector) => mvc.$HTMLElement;
[optional] A callback function that is called by the Inspector whenever it needs to render the label of an input field. It is expected to return the content as an HTMLElement or a DOM Element.
This function allows you to specify custom input field labels.
The same function is used for all input field definitions; you need to disambiguate between different cases on your own (e.g. via a switch
block). If the function is defined but returns undefined
in some cases, the Inspector will create the label in question in the usual way (i.e. according to current input field definition's inputConfig.label
, as if this function were not provided).
The callback function is provided with the following arguments, which you may use in your logic:
opt
is theinputConfig
object provided within the Inspector'sinputs
object as a definition of the current input field.path
is a string containing the path to the definition of the current input field within the Inspector'sinputs
object, separated by slashes ('/'
).inspector
is a reference to the current Inspector instance (for context).
stateKey()β
stateKey?: (model: dia.Cell) => string;
[optional] A callback function that is expected to return a string specifying a unique identifier for saving/restoring the state of the groups (i.e. remembering which groups are opened and which ones are closed). The default function returns the id
of the current Cell, which means that every Cell has its own group state. (And that Inspectors opened on different instances of the same Cell type do not remember the previously opened/closed groups.)
The callback function is provided with the following argument, which you may use in your logic:
cell
is a reference to the Cell modified by the current Inspector instance.
One commonly used alternative function stores group state per Cell type:
function(model) { return model.get('type')}
When the above function is used as stateKey
, all Inspectors opened for a type (e.g. standard.Rectangle
) share the same group state.
validateInput()β
validateInput?: (input: any, path: string, type: string, inspector: Inspector) => boolean;
[optional] A callback function that is called by the Inspector to check whether user input into an input field is valid. The function is expected to return true
when the input is valid and false
when it is not. If false
is returned, the input field value is not saved to the Cell model.
See the Property Editor and Viewer Validation section for more information.
The same function is used for all input field definitions; you need to disambiguate between different cases on your own (e.g. via a switch
block).
The callback function is provided with the following arguments, which you may use in your logic:
input
is a reference to the input field's HTMLElement (usually<input>
) with which the user has interacted.path
is a string containing the path to the input field within the Inspector'sinputs
object, separated by slashes ('/'
).type
is a string containing the type of the input field.inspector
is a reference to the current Inspector instance (for context).
The default function checks the validity
property of input
:
function(input, path, type, inspector) {
return (input.validity ? input.validity.valid : true);
}
Methodsβ
closeGroup()β
closeGroup(name: string): void;
Close the group identified by name
.
closeGroups()β
closeGroups(): void;
Close all groups.
focusField()β
focusField(path: string): void;
Focus the input field identified by the provided slash-separated ('/'
) path
within the Inspector's inputs
object.
getGroupsState()β
getGroupsState(): string[];
Get the array of groups which are currently stored as closed in the group state. (This may differ from the currently rendered state if storeGroupsState()
has not been called recently.)
openGroup()β
openGroup(name: string): void;
Open the group identified by name
.
openGroups()β
openGroups(): void;
Open all groups.
refreshSource()β
refreshSource(path: string): void;
Manually refresh the source of the input field identified by the provided slash-separated ('/'
) path
within the Inspector's inputs
object. See the Property Editor and Viewer Options section (object rule) for more information.
refreshSources()β
refreshSources(): void;
Manually refresh sources of all input fields. See the Property Editor and Viewer Options section (object rule) for more information.
remove()β
remove(): this;
Remove the Inspector from the DOM. This method should be called once you are finished with using the Inspector.
render()β
render(): this;
Render the Inspector based on the options passed to the constructor function.
Note that this does not add the Inspector to the live DOM tree - that must be done manually by appending the Inspector DOM Element (accessible as the el
property) to a live DOM Element on the page. See the Property Editor and Viewer section for more information.
restoreGroupsState()β
restoreGroupsState(): void;
Apply the stored group state (which groups were opened and which ones were closed) by opening and closing groups to match. The state information is looked up by the current return value of the stateKey()
callback function.
Use together with storeGroupsState()
to manually manipulate group states (useful if you do not create your Inspector via the create()
method).
storeGroupsState()β
storeGroupsState(): void;
Save the current group state (which groups are opened and which ones are closed). The key for storing the state is the current return value of the stateKey()
callback function.
Use together with restoreGroupsState()
to manually manipulate group states (useful if you do not create your Inspector via the create()
method).
toggleGroup()β
toggleGroup(name: string): void;
Toggle the group identified by name
.
updateCell()β
updateCell(): void;
Manually update the Inspector's associated Cell based on the current values in the Inspector's input fields. This is especially useful if you use the Inspector with the live
mode disabled.
Static methodsβ
close()β
static close(): void;
A helper method for closing Inspector instances which were created via the create()
method.
create()β
static create(container: mvc.$HTMLElement, opt?: Inspector.CreateOptions): ui.Inspector;
A helper method for creating an instance of Inspector, where container
is an DOM Element (or a CSS selector identifying one) that should serve as the container into which the Inspector should be rendered, and opt
is an object specifying Inspector constructor options.
In addition to all Inspector constructor options, the opt
object of the create()
static method accepts three additional options:
- [optional]
storeGroupsState
is a boolean specifying whether current Inspector's group state should be saved before new Inspector is created by this method. (That is, whether Inspector should remember which groups were opened and which ones were closed when it is reopened for a Cell with the samestateKey()
return value.) The default istrue
. - [optional]
restoreGroupsState
is a boolean specifying whether previous group state should be restored for the new Inspector created by this method (if any group state had previously been saved for the current Cell'sstateKey()
return value). The default istrue
. - [optional]
updateCellOnClose
is a boolean specifying whether current Inspector input field values should be saved to the Inspector's associatedcell
before a new Inspector is created by this method. The default istrue
.
Eventsβ
The plugin fires the following events:
renderβ
Triggered when the Inspector re-renders itself partially.
If you are adding event listeners or your own custom HTML into the Inspector, you should always do it inside the render
event handler.
inspector.on('render', () => {
// Inspector has been rendered
});
change:[path]β
Triggered when the user changes a Cell model property at [path]
via an input field of the Inspector (only if the validateInput()
callback function returns true
).
inspector.on(`change:[path]`, (
value: any,
inputEl: any
) => {
// the Cell property `[path]` was changed
})
value
is the new value at the property path,inputEl
is a reference to the input field's HTMLElement (usually<input>
) with which the user has interacted.
Example usage:
inspector.on(`change:myProperty`, (value, inputEl) => {
console.log(`new value of myProperty: ${value}`);
})
closeβ
Triggered when the Inspector gets closed.
inspector.on('close', () => {
// Inspector has been closed
});
Typesβ
The plugin uses the following types:
CreateOptionsβ
interface CreateOptions extends Options {
storeGroupsState?: boolean;
restoreGroupsState?: boolean;
updateCellOnClose?: boolean;
}
Operatorβ
type Operator = (cell: dia.Cell, propertyValue: any, ...conditionValues: any[]) => boolean;
Optionsβ
interface Options extends mvc.ViewOptions<undefined> {
cellView?: dia.CellView;
cell?: mvc.Model;
live?: boolean;
validateInput?: (input: any, path: string, type: string, inspector: Inspector) => boolean;
groups?: any;
inputs?: any;
storeGroupsState?: boolean;
restoreGroupsState?: boolean;
updateCellOnClose?: boolean;
renderLabel?: (opt: { [key: string]: any }, path: string, inspector: Inspector) => mvc.$HTMLElement;
renderFieldContent?: (opt: { [key: string]: any }, path: string, value: any, inspector: Inspector) => mvc.$HTMLElement;
focusField?: (opt: { [key: string]: any }, path: string, element: HTMLElement, inspector: Inspector) => void;
getFieldValue?: (attribute: HTMLElement, type: string) => any;
multiOpenGroups?: boolean;
container?: mvc.$Element;
stateKey?: (model: dia.Cell) => string;
operators?: { [operatorName: string]: Operator };
}
OptionsSourceβ
interface OptionsSource {
dependencies?: string[],
source: (data: OptionsSourceData) => any[] | Promise<any[]>
}
OptionsSourceDataβ
interface OptionsSourceData {
model: mvc.Model,
inspector: Inspector,
initialized: boolean,
path: string,
dependencies: { [key: string]: {
path: string,
changedPath: string,
value: any
}}
}
Built-in input field typesβ
This is a list of input field types recognized by default by the inputConfig.type
property within the Inspector's inputs
object. The Inspector constructor matches the type
of each input field definition to one of those values and creates an input field accordingly. If a type is not recognized, the Inspector tries to understand it as a custom input field type.
Input fields are HTML form controls which allow the user to view and/or modify a value on the Cell model. See the Built-in input field types section for more information.
JointJS also contains mechanisms to define one's own custom input field types.
colorβ
Insert an HTML 5 color-type input field to the Inspector. See the Property Editor and Viewer color section for a code example.
color-paletteβ
Insert an instance of ColorPalette to the Inspector. See the Property Editor and Viewer color-palette section for a code example.
Additional optionsβ
See the ColorPalette documentation for additional options, with one change:
-
[optional]
options
specifies the options available to the user for selection in the same way asoptions
of theselect
input field type.Note that when using the object[] rules, you may provide objects with all properties of
ui.ColorPalette.options.options
. For example:myProperty: {
type: 'color-palette',
options: [
{ content: 'red', icon: 'image1.svg' },
{ content: 'blue' }
]
} -
[optional]
previewMode
is a boolean switching whether preview mode should be enabled on the input field. The default isfalse
. It works the same way aspreviewMode
of theselect-box
input field type.
content-editableβ
Insert a content-editable
div (which resizes automatically as the user types) to the Inspector. See the Property Editor and Viewer content-editable section for a code example.
Additional optionsβ
- [optional]
html
is a boolean switching how the content is interpreted - as HTML (true
) or as plain text (false
). The default istrue
(HTML). - [optional]
readonly
is a boolean determining whether the user is allowed to edit the content of the field. The default isfalse
(user is allowed to edit).
listβ
Insert a widget for adding/removing items to/from an arbitrary array. The inputs of each list item can be specified via the item
property. See the Property Editor and Viewer list section for a code example.
Additional optionsβ
- [optional]
addButtonLabel
andremoveButtonLabel
are strings specifying the labels of the "Add list item" and "Remove list item" button, respectively. The defaults are'+'
and'-'
. - [optional]
item
is an object defining a nestedinputs
object for a generic item of the list. This allows you to specify input field definitions for properties inside array items. See the Nested structures Array properties section for more information. - [optional]
min
andmax
are numbers specifying the minimum and maximum allowed number of items in the array property.
numberβ
Insert an HTML 5 number-type input field to the Inspector. See the Property Editor and Viewer number section for a code example.
Additional optionsβ
- [optional]
min
andmax
are numbers specifying the minimum and maximum values that are acceptable and valid for the input field. The defaults are-Infinity
andInfinity
.
objectβ
Insert a wrapper for the inputs of specified properties of an arbitrary object (specified via the properties
property). See the Property Editor and Viewer object section for a code example.
Additional optionsβ
- [optional]
properties
is an object defining nestedinputs
objects for specified properties. See the Nested structures Object properties section for more information.
radio-groupβ
Insert an instance of RadioGroup to the Inspector. See the Property Editor and Viewer radio-group section for a code example.
Additional optionsβ
See the RadioGroup documentation for additional options, with one change:
- [optional]
options
specifies the options available to the user for selection in the same way asoptions
of theselect
input field type. Note that when using the object[] rules, you may provide objects with all properties ofui.RadioGroup.options.options
.
rangeβ
Insert an HTML 5 range-type input field to the Inspector. See the Property Editor and Viewer range section for a code example.
Additional optionsβ
- [optional]
min
andmax
are numbers specifying the minimum and maximum values that are acceptable and valid for the input field. The defaults are-Infinity
andInfinity
. - [optional]
step
is a number specifying the granularity that the value must adhere to. The default is1
. - [optional]
unit
is a string specifying the unit displayed next to the value. The default is an empty string (''
).
selectβ
Insert a select box to the Inspector. See the Property Editor and Viewer select section for a code example.
Additional optionsβ
-
[optional]
multiple
is a boolean specifying whether multiple values can be selected at the same time. The default isfalse
. -
[optional]
size
is a number specifying (whenmultiple
istrue
) how many rows of the list should be visible at one time. -
[optional]
options
specifies the options available to the user for selection:-
undefined - By default, the property has a value of empty array (no options available).
-
string[] - If specified as an array of strings, the strings are used as values for the selection. The following is an example of a select box to set the availability of a worker (via
workdays
property on the Cell model):workdays: {
type: 'select',
options: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
multiple: true,
overwrite: true,
group: 'occupation'
} -
object[] - If specified as an array of objects, the objects are expected to contain two properties:
- [required]
content
is the label of the option (presented to the user). - [optional]
value
is the value of the option (will be written into the model on user selection). If novalue
is specified,content
is used as the value.
For example:
myProperty: {
type: 'select',
options: [
{ value: 'value1', content: 'option1' },
{ value: 'value2', content: 'option2' }
]
} - [required]
-
string - If specified as a string, the property is interpreted as a path pointing to another property on the Cell model (as determined by the
cell.prop()
function). The referenced property is expected to contain an array of options which can be interpreted by one of the array rules above. The Inspector keeps track of the referenced property and refreshes the list of options of this input field whenever there is a change. Example resolution:// `options: 'path/to/options'`
// => interpreted as:
cell.prop('path/to/options')
// => returned value (used as list of options):
['option1', 'option2'] -
object - If specified as an object, the property is expected to contain the following properties:
-
[optional]
dependencies
is an array of strings interpreted as paths to other properties on the Cell model (see above). The default is an empty array ([]
).You may choose to leave some (or all) of your dependencies out of the
dependencies
array. In that case, Inspector will not keep track of changes in those properties, but you can load current values of these properties manually via therefreshSources()
orrefreshSource()
functions inside yoursource()
callback.The paths may use
'${index}'
wildcards to specify a path to a sibling property inside a list. These wildcards are dynamically substituted for the actual index of the item inside which the dependency is evaluated. -
[required]
source()
is a callback function which is expected to return an array of options which can be interpreted as one of the array rules above (or a Promise of the same). It is provided with a singledata
object as an argument, which contains the following properties that may be useful for your logic:model
is a reference to the Cell modified by the current Inspector instance,inspector
is a reference to the current Inspector instance (for context),initialized
is a boolean recording whether the sources of this input field have been initialized (i.e. the values of this input field's dependencies have been calculated at least once - e.g. on render of the input field),path
is a string containing the path to the input field within the Inspector'sinputs
object, separated by slashes ('/'
).dependencies
is an object with the current status of all declareddependencies
(see above), where the keys are items of thedependencies
array, and the values are objects with the following properties:path
is a string containing the resolved path to the dependency on the Cell model, separated by slashes (/
) and with wildcards replaced,changedPath
is a string containing the resolved path to the input field within the Inspector'sinputs
object, separated by slashes (/
) and with wildcards replaced,value
is the resolved value of the dependency.
The Inspector keeps track of the dependencies and calls the
source()
callback to refresh the list of options of this input field whenever there is a change.
In the following example, the
myArray
property on the Cell is an array of objects with two properties:myValue
(a string) andmyOptions
(an array of strings). For each item inmyArray
, the user is allowed to choose amyValue
value in the Inspector via aradio-group
input field - the options available are taken from the same item'smyOptions
property. Whenever themyOptions
array is changed (i.e. an item is added/modified/removed), theradio-group
input field formyValue
is refreshed:const inspector = new ui.Inspector({
cellView: cellView,
inputs: {
myArray: {
type: 'list',
item: {
type: 'object',
properties: {
myValue: {
type: 'radio-group',
options: {
dependencies: ['myArray/${index}/myOptions'],
source: (data) => {
const { value } = data.dependencies['myArray/${index}/myOptions'];
const options = value;
if (Array.isArray(options)) {
return options.map(name => {
return { value: name, content: name };
});
}
return [];
}
}
},
myOptions: {
type: 'list',
item: {
type: 'text'
}
}
}
}
}
}
}); -
-
select-boxβ
Insert an instance of SelectBox to the Inspector. See the Property Editor and Viewer select-box section for a code example.
Additional optionsβ
See the SelectBox documentation for additional options, with one change:
-
[optional]
options
specifies the options available to the user for selection in the same way asoptions
of theselect
input field type.Note that when using the object[] rules, you may provide objects with all properties of
ui.SelectBox.options.options
. For example:myProperty: {
type: 'select-box',
options: [
{ icon: 'icon1.png', value: 'value1', content: 'option1' },
{ icon: 'icon2.png', value: 'value1', content: 'option2' }
]
} -
[optional]
previewMode
is a boolean switching whether preview mode should be enabled on the input field. The default isfalse
.In preview mode, when the user hovers over one of the items in the input field (i.e. a SelectBox dropdown item), the Inspector changes the Cell model but triggers the change with the
dry
flag set totrue
. This enables you to react to preview changes differently from real changes, as in the following example:myCell.on('change:myProperty', function(cell, change, opt) {
if (opt.dry) {
/* do something when in preview mode */
} else {
sendToDatabase(JSON.stringify(graph));
}
});This is useful, for example, if your application needs to reflect the values of the hovered items in the diagram but does not want to store the change to a database.
select-button-groupβ
Insert an instance of SelectButtonGroup to the Inspector. See the Property Editor and Viewer select-button-group section for a code example.
Additional optionsβ
See the SelectButtonGroup documentation for additional options, with one change:
-
[optional]
options
specifies the options available to the user for selection in the same way asoptions
of theselect
input field type.Note that when using the object[] rules, you may provide objects with all properties of
ui.SelectButtonGroup.options.options
. For example:myProperty: {
type: 'select-box',
options: [
{
value: 'value1',
content: 'option1',
buttonWidth: 20,
icon: 'image.png',
iconSelected: 'image2.png',
iconWidth: 20,
iconHeight: 20
}
]
} -
[optional]
previewMode
is a boolean switching whether preview mode should be enabled on the input field. The default isfalse
. It works the same way aspreviewMode
of theselect-box
input field type.
textβ
Insert a text input field to the Inspector. See the Property Editor and Viewer text section for a code example.
textareaβ
Insert a textarea input field to the Inspector. See the Property Editor and Viewer textarea section for a code example.
toggleβ
Insert a toggle (a checkbox-type input field) to the Inspector. See the Property Editor and Viewer toggle section for a code example.
Built-in operatorsβ
Operators are callback functions which define the evaluation rules of conditional expressions using values of arbitrary Cell model properties as arguments. They are uniquely identified by string identifiers.
Whenever an operator returns false
, it means that the condition observed by the conditional expression is not met, and vice versa. The Inspector relies on conditional expressions defined in the inputConfig.when
parameter of the inputs
option (and the groupConfig.when
parameter of the groups
option) to switch the visibility of input fields (and whole groups) within the rendered Inspector to modify the user experience.
JointJS comes with a built-in collection of operators (primitive, unary, and multiary), which are presented below.
JointJS also contains mechanisms to define one's own custom primitive operators.
Primitive operatorsβ
Primitive operators compare the value of a Cell model property with a fixed value.
More precisely, the value of an expression where the key is a primitive operator is an object with a single property:
- The key is a string path pointing to a Cell model property and the value is the value with which the value of the referenced property should be compared.
For example:
{ eq: { 'size/width': 300 }}
{ lt: { 'count': 10 }}
{ in: { 'index': [0, 2, 4] }}
{ regex: { 'attrs/label/text' : 'JointJS|Rappid' }}
As a rule, the order of the two operands of a primitive operator is key first, value second
. Therefore, the above example { lt: { 'count': 10 }}
would be read as follows: An expression that returns
.true
if count
is less than 10
The built-in primitive operators are listed below in order of their identifier:
eqβ
Returns true
if the value of the Cell model property identified by the object key equals the object value. Uses ==
internally.
{ eq: { 'size/width': 300 }}
equalβ
Returns true
if the value of the Cell model property identified by the object key equals the object value. Uses util.isEqual()
internally, which supports deep comparison.
{ equal: { 'size': { 'width': 300 }}}
gtβ
Returns true
if the value of the Cell model property identified by the object key is greater than the object value. Uses >
internally.
{ gt: { 'count': 10 }}
gteβ
Returns true
if the value of the Cell model property identified by the object key is greater than or equal to the object value. Uses >=
internally.
{ gte: { 'count': 10 }}
inβ
Returns false
if the object value is not an array.
Returns true
if the value of the Cell model property identified by the object key is an item in the object value. Uses array.includes()
internally.
{ in: { 'index': [0, 2, 4] }}
ltβ
Returns true
if the value of the Cell model property identified by the object key is less than the object value. Uses <
internally.
{ lt: { 'count': 10 }}
lteβ
Returns true
if the value of the Cell model property identified by the object key is less than or equal to the object value. Uses <=
internally.
{ lte: { 'count': 10 }}
neβ
Returns true
if the value of the Cell model property identified by the object key does not equal the object value. Uses !=
internally.
{ eq: { 'size/width': 300 }}
ninβ
Returns false
if the object value is not an array.
Returns true
if the value of the Cell model property identified by the object key is not an item in the object value. Uses !array.includes()
internally.
{ nin: { 'index': [0, 2, 4] }}
regexβ
Returns true
if the value of the Cell model property identified by the object key matches a regular expression described in the object value. Uses regex.test()
internally.
{ regex: { 'attrs/label/text' : 'JointJS|Rappid' }}
textβ
Returns false
if the object value is not a string.
Returns true
if the object value is an empty string (''
).
Returns true
if the value of the Cell model property identified by the object key converted to lowercase contains the object value as a substring. Uses string.indexOf()
internally.
{ text: { 'attrs/label/text' : 'jointjs' }}
Unary operatorsβ
Unary operators return a value based on the result of a single expression.
More precisely, the value of an expression where the key is an unary operator is a single expression. The unary operator takes the result of the provided expression and returns a result based on the value.
The following example showcases the NOT operator. It returns true
when the size
property is not an object with precisely one property, width
, that has a value of 300
:
{ not: { equal: { 'size': { 'width': 300 }}}}
Only one unary operator is built-in to JointJS:
notβ
Returns the logical negation of the provided expression, i.e. !expr
.
{ not: { equal: { 'size': { 'width': 300 }}}}
Multiary operatorsβ
Multiary operators return a value based on the result of multiple expressions.
More precisely, the value of an expression where the key is a multiary operator is an array of at least one expression. The multiary operator takes the result of all the provided expressions and returns a result based on their value.
The following example showcases the AND operator. It returns true
when all provided expressions are true
:
{ and: [
{ gte: { 'position/x': 100 }},
{ lte: { 'position/x': 400 }},
{ gte: { 'position/y': 200 }},
{ lte: { 'position/y': 300 }}
]}
The built-in multiary operators are listed below in order of their identifier:
andβ
Returns the logical conjunction of all provided expressions, i.e. expr1 && expr2 && expr3 && ...
.
{ and: [
{ gte: { 'position/x': 100 }},
{ lte: { 'position/x': 400 }},
{ gte: { 'position/y': 200 }},
{ lte: { 'position/y': 300 }}
]}
norβ
Returns the logical negation of the disjunction of all provided expressions, i.e. !(expr1 || expr2 || expr3 || ...)
.
{ nor: [
{ eq: { 'myProperty1': true }},
{ eq: { 'myProperty2': true }},
{ eq: { 'myProperty3': true }}
]}
orβ
Returns the logical disjunction of all provided expressions, i.e. expr1 || expr2 || expr3 || ...
.
{ or: [
{ eq: { 'myProperty1': true }},
{ eq: { 'myProperty2': true }},
{ eq: { 'myProperty3': true }}
]}