2015-05-13 23:42:35 +00:00
|
|
|
/*****************************************************************************
|
|
|
|
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
|
|
* as represented by the Administrator of the National Aeronautics and Space
|
|
|
|
* Administration. All rights reserved.
|
|
|
|
*
|
|
|
|
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*
|
|
|
|
* Open MCT Web includes source code licensed under additional open source
|
|
|
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
|
|
* this source code distribution or the Licensing information page available
|
|
|
|
* at runtime from the About dialog for additional information.
|
|
|
|
*****************************************************************************/
|
2014-11-22 17:29:41 +00:00
|
|
|
/*global define,Promise*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Module defining MCTInclude. Created by vwoeltje on 11/7/14.
|
|
|
|
*/
|
|
|
|
define(
|
|
|
|
[],
|
|
|
|
function () {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Defines the mct-include directive. This acts like the
|
|
|
|
* ng-include directive, except it accepts a symbolic
|
2014-11-22 21:02:51 +00:00
|
|
|
* key which can be exposed by bundles, instead of requiring
|
|
|
|
* an explicit path.
|
|
|
|
*
|
|
|
|
* This directive uses two-way binding for three attributes:
|
|
|
|
*
|
|
|
|
* * `key`, matched against the key of a defined template extension
|
|
|
|
* in order to determine which actual template to include.
|
|
|
|
* * `ng-model`, populated as `ngModel` in the loaded template's
|
|
|
|
* scope; used for normal ng-model purposes (e.g. if the
|
|
|
|
* included template is meant to two-way bind to a data model.)
|
|
|
|
* * `parameters`, used to communicate display parameters to
|
|
|
|
* the included template (e.g. title.) The difference between
|
|
|
|
* `parameters` and `ngModel` is intent: Both are two-way
|
|
|
|
* bound, but `ngModel` is useful for data models (more like
|
|
|
|
* an output) and `parameters` is meant to be useful for
|
|
|
|
* display parameterization (more like an input.)
|
|
|
|
*
|
2015-08-07 18:44:54 +00:00
|
|
|
* @memberof platform/representation
|
2014-11-22 17:29:41 +00:00
|
|
|
* @constructor
|
2014-11-22 21:02:51 +00:00
|
|
|
* @param {TemplateDefinition[]} templates an array of
|
|
|
|
* template extensions
|
2014-11-22 17:29:41 +00:00
|
|
|
*/
|
2015-10-28 21:51:30 +00:00
|
|
|
function MCTInclude(templates, templateLinker) {
|
2014-11-22 17:29:41 +00:00
|
|
|
var templateMap = {};
|
|
|
|
|
2015-10-28 22:29:57 +00:00
|
|
|
function link(scope, element) {
|
2015-10-29 15:17:25 +00:00
|
|
|
var changeTemplate = templateLinker.link(
|
|
|
|
scope,
|
|
|
|
element,
|
|
|
|
scope.key && templateMap[scope.key]
|
|
|
|
);
|
2015-10-28 17:29:41 +00:00
|
|
|
|
2015-10-28 21:51:30 +00:00
|
|
|
scope.$watch('key', function (key) {
|
2015-10-29 15:17:25 +00:00
|
|
|
changeTemplate(key && templateMap[key]);
|
2015-10-28 17:18:59 +00:00
|
|
|
});
|
2014-11-22 17:29:41 +00:00
|
|
|
}
|
|
|
|
|
2015-10-28 18:13:53 +00:00
|
|
|
// Prepopulate templateMap for easy look up by key
|
|
|
|
templates.forEach(function (template) {
|
2015-10-30 18:02:13 +00:00
|
|
|
var key = template.key;
|
2015-10-28 18:13:53 +00:00
|
|
|
// First found should win (priority ordering)
|
2015-10-30 18:02:13 +00:00
|
|
|
templateMap[key] =
|
|
|
|
templateMap[key] || templateLinker.getPath(template);
|
2015-10-28 18:13:53 +00:00
|
|
|
});
|
|
|
|
|
2014-11-22 17:29:41 +00:00
|
|
|
return {
|
2014-11-22 21:02:51 +00:00
|
|
|
// Only show at the element level
|
2014-11-22 17:29:41 +00:00
|
|
|
restrict: "E",
|
2014-11-22 21:02:51 +00:00
|
|
|
|
|
|
|
// Use the included controller to populate scope
|
2015-10-28 17:29:41 +00:00
|
|
|
link: link,
|
2014-11-22 21:02:51 +00:00
|
|
|
|
2015-10-28 22:57:47 +00:00
|
|
|
// May hide the element, so let other directives act first
|
|
|
|
priority: -1000,
|
|
|
|
|
2014-11-22 21:02:51 +00:00
|
|
|
// Two-way bind key, ngModel, and parameters
|
2014-11-22 17:29:41 +00:00
|
|
|
scope: { key: "=", ngModel: "=", parameters: "=" }
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return MCTInclude;
|
|
|
|
}
|
2015-06-18 21:43:14 +00:00
|
|
|
);
|
2015-08-07 18:44:54 +00:00
|
|
|
|