mirror of
https://github.com/nasa/openmct.git
synced 2025-06-14 05:08:15 +00:00
Merge pull request #1107 from nasa/api-type-forms
[API] Handle forms with a "properties" region
This commit is contained in:
@ -31,10 +31,12 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
require(['main'], function (mct) {
|
require(['main'], function (mct) {
|
||||||
require([
|
require([
|
||||||
|
'./tutorials/todo/todo',
|
||||||
'./example/imagery/bundle',
|
'./example/imagery/bundle',
|
||||||
'./example/eventGenerator/bundle',
|
'./example/eventGenerator/bundle',
|
||||||
'./example/generator/bundle',
|
'./example/generator/bundle',
|
||||||
], function () {
|
], function (todo) {
|
||||||
|
todo(mct);
|
||||||
mct.run();
|
mct.run();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
25
src/MCT.js
25
src/MCT.js
@ -4,7 +4,6 @@ define([
|
|||||||
'uuid',
|
'uuid',
|
||||||
'./api/api',
|
'./api/api',
|
||||||
'text!./adapter/templates/edit-object-replacement.html',
|
'text!./adapter/templates/edit-object-replacement.html',
|
||||||
'./ui/Dialog',
|
|
||||||
'./Selection',
|
'./Selection',
|
||||||
'./api/objects/object-utils'
|
'./api/objects/object-utils'
|
||||||
], function (
|
], function (
|
||||||
@ -13,13 +12,21 @@ define([
|
|||||||
uuid,
|
uuid,
|
||||||
api,
|
api,
|
||||||
editObjectTemplate,
|
editObjectTemplate,
|
||||||
Dialog,
|
|
||||||
Selection,
|
Selection,
|
||||||
objectUtils
|
objectUtils
|
||||||
) {
|
) {
|
||||||
function MCT() {
|
function MCT() {
|
||||||
EventEmitter.call(this);
|
EventEmitter.call(this);
|
||||||
this.legacyBundle = { extensions: {} };
|
this.legacyBundle = { extensions: {
|
||||||
|
services: [
|
||||||
|
{
|
||||||
|
key: "mct",
|
||||||
|
implementation: function () {
|
||||||
|
return this;
|
||||||
|
}.bind(this)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
} };
|
||||||
|
|
||||||
this.selection = new Selection();
|
this.selection = new Selection();
|
||||||
this.on('navigation', this.selection.clear.bind(this.selection));
|
this.on('navigation', this.selection.clear.bind(this.selection));
|
||||||
@ -94,13 +101,6 @@ define([
|
|||||||
region: region,
|
region: region,
|
||||||
key: viewKey
|
key: viewKey
|
||||||
});
|
});
|
||||||
|
|
||||||
this.legacyExtension('services', {
|
|
||||||
key: 'PublicAPI',
|
|
||||||
implementation: function () {
|
|
||||||
return this;
|
|
||||||
}.bind(this)
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MCT.prototype.type = function (key, type) {
|
MCT.prototype.type = function (key, type) {
|
||||||
@ -117,10 +117,6 @@ define([
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
MCT.prototype.dialog = function (view, title) {
|
|
||||||
return new Dialog(view, title).show();
|
|
||||||
};
|
|
||||||
|
|
||||||
MCT.prototype.start = function () {
|
MCT.prototype.start = function () {
|
||||||
this.legacyExtension('runs', {
|
this.legacyExtension('runs', {
|
||||||
depends: ['navigationService'],
|
depends: ['navigationService'],
|
||||||
@ -147,6 +143,7 @@ define([
|
|||||||
|
|
||||||
MCT.prototype.regions = {
|
MCT.prototype.regions = {
|
||||||
main: "MAIN",
|
main: "MAIN",
|
||||||
|
properties: "PROPERTIES",
|
||||||
toolbar: "TOOLBAR"
|
toolbar: "TOOLBAR"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
44
src/adapter/actions/ActionDialogDecorator.js
Normal file
44
src/adapter/actions/ActionDialogDecorator.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
define([
|
||||||
|
'../../api/objects/object-utils'
|
||||||
|
], function (objectUtils) {
|
||||||
|
function ActionDialogDecorator(mct, newViews, actionService) {
|
||||||
|
this.actionService = actionService;
|
||||||
|
this.mct = mct;
|
||||||
|
this.definitions = newViews.filter(function (newView) {
|
||||||
|
return newView.region === mct.regions.properties;
|
||||||
|
}).map(function (newView) {
|
||||||
|
return newView.factory;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ActionDialogDecorator.prototype.getActions = function (context) {
|
||||||
|
var mct = this.mct;
|
||||||
|
var definitions = this.definitions;
|
||||||
|
|
||||||
|
return this.actionService.getActions(context).map(function (action) {
|
||||||
|
if (action.dialogService) {
|
||||||
|
var domainObject = objectUtils.toNewFormat(
|
||||||
|
context.domainObject.getModel(),
|
||||||
|
objectUtils.parseKeyString(context.domainObject.getId())
|
||||||
|
);
|
||||||
|
|
||||||
|
definitions = definitions.filter(function (definition) {
|
||||||
|
return definition.canView(domainObject);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (definitions.length > 0) {
|
||||||
|
action.dialogService = Object.create(action.dialogService);
|
||||||
|
action.dialogService.getUserInput = function (form, value) {
|
||||||
|
return new mct.Dialog(
|
||||||
|
definitions[0].view(context.domainObject),
|
||||||
|
form.title
|
||||||
|
).show();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return action;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return ActionDialogDecorator;
|
||||||
|
});
|
@ -1,10 +1,12 @@
|
|||||||
define([
|
define([
|
||||||
'legacyRegistry',
|
'legacyRegistry',
|
||||||
|
'./actions/ActionDialogDecorator',
|
||||||
'./directives/MCTView',
|
'./directives/MCTView',
|
||||||
'./services/Instantiate',
|
'./services/Instantiate',
|
||||||
'./capabilities/APICapabilityDecorator'
|
'./capabilities/APICapabilityDecorator'
|
||||||
], function (
|
], function (
|
||||||
legacyRegistry,
|
legacyRegistry,
|
||||||
|
ActionDialogDecorator,
|
||||||
MCTView,
|
MCTView,
|
||||||
Instantiate,
|
Instantiate,
|
||||||
APICapabilityDecorator
|
APICapabilityDecorator
|
||||||
@ -17,7 +19,7 @@ define([
|
|||||||
implementation: MCTView,
|
implementation: MCTView,
|
||||||
depends: [
|
depends: [
|
||||||
"newViews[]",
|
"newViews[]",
|
||||||
"PublicAPI"
|
"mct"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -41,6 +43,12 @@ define([
|
|||||||
depends: [
|
depends: [
|
||||||
"$injector"
|
"$injector"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "decorator",
|
||||||
|
provides: "actionService",
|
||||||
|
implementation: ActionDialogDecorator,
|
||||||
|
depends: [ "mct", "newViews[]" ]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -3,19 +3,22 @@ define([
|
|||||||
'./TimeConductor',
|
'./TimeConductor',
|
||||||
'./View',
|
'./View',
|
||||||
'./objects/ObjectAPI',
|
'./objects/ObjectAPI',
|
||||||
'./composition/CompositionAPI'
|
'./composition/CompositionAPI',
|
||||||
|
'./ui/Dialog'
|
||||||
], function (
|
], function (
|
||||||
Type,
|
Type,
|
||||||
TimeConductor,
|
TimeConductor,
|
||||||
View,
|
View,
|
||||||
ObjectAPI,
|
ObjectAPI,
|
||||||
CompositionAPI
|
CompositionAPI,
|
||||||
|
Dialog
|
||||||
) {
|
) {
|
||||||
return {
|
return {
|
||||||
Type: Type,
|
Type: Type,
|
||||||
TimeConductor: new TimeConductor(),
|
TimeConductor: new TimeConductor(),
|
||||||
View: View,
|
View: View,
|
||||||
Objects: ObjectAPI,
|
Objects: ObjectAPI,
|
||||||
Composition: CompositionAPI
|
Composition: CompositionAPI,
|
||||||
|
Dialog: Dialog
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -2,9 +2,15 @@ define(['text!./dialog.html', 'zepto'], function (dialogTemplate, $) {
|
|||||||
function Dialog(view, title) {
|
function Dialog(view, title) {
|
||||||
this.view = view;
|
this.view = view;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
|
this.showing = false;
|
||||||
|
this.enabledState = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dialog.prototype.show = function () {
|
Dialog.prototype.show = function () {
|
||||||
|
if (this.showing) {
|
||||||
|
throw new Error("Dialog already showing.");
|
||||||
|
}
|
||||||
|
|
||||||
var $body = $('body');
|
var $body = $('body');
|
||||||
var $dialog = $(dialogTemplate);
|
var $dialog = $(dialogTemplate);
|
||||||
var $contents = $dialog.find('.contents .editor');
|
var $contents = $dialog.find('.contents .editor');
|
||||||
@ -13,31 +19,45 @@ define(['text!./dialog.html', 'zepto'], function (dialogTemplate, $) {
|
|||||||
var $ok = $dialog.find('.ok');
|
var $ok = $dialog.find('.ok');
|
||||||
var $cancel = $dialog.find('.cancel');
|
var $cancel = $dialog.find('.cancel');
|
||||||
|
|
||||||
var view = this.view;
|
|
||||||
|
|
||||||
function dismiss() {
|
|
||||||
$dialog.remove();
|
|
||||||
view.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.title) {
|
if (this.title) {
|
||||||
$dialog.find('.title').text(this.title);
|
$dialog.find('.title').text(this.title);
|
||||||
}
|
}
|
||||||
|
|
||||||
$body.append($dialog);
|
$body.append($dialog);
|
||||||
this.view.show($contents[0]);
|
this.view.show($contents[0]);
|
||||||
|
this.$dialog = $dialog;
|
||||||
|
this.$ok = $ok;
|
||||||
|
this.showing = true;
|
||||||
|
|
||||||
|
[$ok, $cancel, $close].forEach(function ($button) {
|
||||||
|
$button.on('click', this.hide.bind(this));
|
||||||
|
}.bind(this));
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
$ok.on('click', resolve);
|
$ok.on('click', resolve);
|
||||||
$ok.on('click', dismiss);
|
|
||||||
|
|
||||||
$cancel.on('click', reject);
|
$cancel.on('click', reject);
|
||||||
$cancel.on('click', dismiss);
|
|
||||||
|
|
||||||
$close.on('click', reject);
|
$close.on('click', reject);
|
||||||
$close.on('click', dismiss);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Dialog.prototype.hide = function () {
|
||||||
|
if (!this.showing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.$dialog.remove();
|
||||||
|
this.view.destroy();
|
||||||
|
this.showing = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
Dialog.prototype.enabled = function (state) {
|
||||||
|
if (state !== undefined) {
|
||||||
|
this.enabledState = state;
|
||||||
|
if (this.showing) {
|
||||||
|
this.$ok.toggleClass('disabled', !state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.enabledState;
|
||||||
|
};
|
||||||
|
|
||||||
return Dialog;
|
return Dialog;
|
||||||
});
|
});
|
@ -48,7 +48,6 @@ define([
|
|||||||
var self = this;
|
var self = this;
|
||||||
this.destroy();
|
this.destroy();
|
||||||
|
|
||||||
mct.Objects.get(utils.parseKeyString(self.domainObject.getId())).then(function (object) {
|
|
||||||
self.$els = $(todoTemplate);
|
self.$els = $(todoTemplate);
|
||||||
self.$buttons = {
|
self.$buttons = {
|
||||||
all: self.$els.find('.example-todo-button-all'),
|
all: self.$els.find('.example-todo-button-all'),
|
||||||
@ -60,10 +59,9 @@ define([
|
|||||||
|
|
||||||
|
|
||||||
self.initialize();
|
self.initialize();
|
||||||
self.objectChanged(object);
|
self.objectChanged(this.domainObject);
|
||||||
|
|
||||||
mct.selection.on('change', self.render);
|
mct.selection.on('change', self.render);
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TodoView.prototype.destroy = function () {
|
TodoView.prototype.destroy = function () {
|
||||||
@ -148,9 +146,7 @@ define([
|
|||||||
var self = this;
|
var self = this;
|
||||||
this.destroy();
|
this.destroy();
|
||||||
|
|
||||||
mct.Objects.get(utils.parseKeyString(this.domainObject.getId())).then(function (wrappedObject){
|
self.mutableObject = mct.Objects.getMutable(this.domainObject);
|
||||||
|
|
||||||
self.mutableObject = mct.Objects.getMutable(wrappedObject);
|
|
||||||
|
|
||||||
var $els = $(toolbarTemplate);
|
var $els = $(toolbarTemplate);
|
||||||
var $add = $els.find('a.example-add');
|
var $add = $els.find('a.example-add');
|
||||||
@ -167,7 +163,7 @@ define([
|
|||||||
destroy: function () {}
|
destroy: function () {}
|
||||||
};
|
};
|
||||||
|
|
||||||
mct.dialog(view, "Add a Task").then(function () {
|
new mct.Dialog(view, "Add a Task").show().then(function () {
|
||||||
var description = $dialog.find('input').val();
|
var description = $dialog.find('input').val();
|
||||||
var tasks = self.mutableObject.get('tasks');
|
var tasks = self.mutableObject.get('tasks');
|
||||||
tasks.push({ description: description });
|
tasks.push({ description: description });
|
||||||
@ -188,7 +184,6 @@ define([
|
|||||||
self.$remove = $remove;
|
self.$remove = $remove;
|
||||||
self.handleSelectionChange();
|
self.handleSelectionChange();
|
||||||
mct.selection.on('change', self.handleSelectionChange);
|
mct.selection.on('change', self.handleSelectionChange);
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TodoToolbarView.prototype.handleSelectionChange = function () {
|
TodoToolbarView.prototype.handleSelectionChange = function () {
|
||||||
|
Reference in New Issue
Block a user