Compare commits

..

128 Commits

Author SHA1 Message Date
Pete Richards
a7d322d01c [Table] Add datatable bundle
Add the datatable bundle which takes care of the basics of displaying
tabular data.
2016-02-11 11:45:57 -08:00
Victor Woeltjen
42ce2aa7cf Merge pull request #666 from nasa/open656b
[Create] Utilize copyService during Save As
2016-02-11 09:55:21 -08:00
Victor Woeltjen
43d497e069 [Create] Clarify function naming
Per review feedback,
https://github.com/nasa/openmctweb/pull/666#discussion_r52625960
2016-02-11 09:49:26 -08:00
Victor Woeltjen
5306e96374 Merge pull request #668 from nasa/open659
[New Edit Mode] #659 Fix to timelines
2016-02-10 17:02:28 -08:00
Andrew Henry
156940f25b Merge pull request #667 from nasa/open659a
Review and integrate open659a into open659
2016-02-10 16:59:43 -08:00
Henry
10e0acddb3 [New Edit Mode] #659 Fix to prevent multi-composition with same object, fix to prevent composition of object with self 2016-02-10 16:43:08 -08:00
Charles Hacskaylo
ceee7e0da9 [Frontend] Fixed CSS issue with Timeline label elements
open #659
CSS for .rep-object-label modified; Added CSS class
to tabular-swimlane-cols-tree.html markup;
Also cleaned up .s-status-pending styles for related
label elements;
2016-02-10 16:38:39 -08:00
Victor Woeltjen
53a49a671b [Create] Test optional filter parameter 2016-02-10 14:31:56 -08:00
Victor Woeltjen
99a454f943 [Create] Update CopyService spec
...to reflect API usage after #656
2016-02-10 14:21:09 -08:00
Victor Woeltjen
cb53e1aaee [Create] Add object, not ID
Add domain object, and not its identifier, when suing
add method of composition from CopyTask, for consistency
with test expectations.
2016-02-10 14:17:36 -08:00
Victor Woeltjen
0f231838ec [Create] Update test inputs to CopyTask
...to reflect changes for #656
2016-02-10 14:05:04 -08:00
Victor Woeltjen
0bdf05e61c [Create] Always allow cloning self
Always allow cloning the newly-created object itself
when saving a newly-created domain object.
2016-02-10 13:49:15 -08:00
Victor Woeltjen
3146660833 [Create] Utilize filtering during clone 2016-02-10 13:46:19 -08:00
Victor Woeltjen
72df464f0f [Create] Utilize passed-in filter
...when determining which objects should be cloned.
2016-02-10 13:38:53 -08:00
Victor Woeltjen
f602aa9247 [Create] Add filter to copyService
Add an optional parameter to method signature of
copyService, used to determine if a domain object should
or should not be cloned.

This will be used to support usages of copyService
where links should remain links;
https://github.com/nasa/openmctweb/pull/666/files#r52525612
2016-02-10 13:29:56 -08:00
Victor Woeltjen
b37b82133e [Create] Return cloned object in context
...to allow copyService to be used in the context of a
Save As action, with an appropriate navigation change.
2016-02-10 12:23:10 -08:00
Victor Woeltjen
c43929f1c6 [Create] Add specificity to check
Explicitly check if an object has a persistence timestamp
at all (avoids false-positives due to falsiness of zero.)
2016-02-10 12:07:45 -08:00
Victor Woeltjen
88750d92ef [Create] Remove unused code, dependencies 2016-02-10 12:05:01 -08:00
Victor Woeltjen
8c602025d4 [Create] Avoid navigation warning
...when navigating to a clone created via Save As.
2016-02-10 11:59:17 -08:00
Victor Woeltjen
5604120d55 [Create] Use duplicate at end of Save
...for unpersisted objects. Ensures that they share the
persistence space of their parent. #656.
2016-02-10 11:42:35 -08:00
Victor Woeltjen
5daf2f54cd Merge pull request #665 from nasa/open660
[Edit Mode] Added ability to clear all dirty cache
2016-02-10 09:19:19 -08:00
Henry
668c02f278 [Edit Mode] Added ability to clear all dirty cache 2016-02-09 19:29:55 -08:00
Victor Woeltjen
0a5097a945 Merge pull request #642 from nasa/open460
[Build] Move to npm-based build
2016-02-08 12:21:01 -08:00
Victor Woeltjen
f615dc5409 [Build] Add JSDoc
...for third argument of TemplateLinker.link, per code review
https://github.com/nasa/openmctweb/pull/642#discussion_r52212006
2016-02-08 12:17:20 -08:00
Victor Woeltjen
b0e4947bf0 Merge pull request #500 from nasa/open480
[New Edit Mode] Adding sub objects to Timelines
2016-02-08 11:59:54 -08:00
Victor Woeltjen
5d4ace64cb Merge pull request #625 from nasa/open491
[Create] #491 Apply default context root in Locator when none available from object
2016-02-05 17:30:22 -08:00
Victor Woeltjen
215008253d [Build] Prevent accidental publish 2016-02-05 15:57:54 -08:00
Pete Richards
f5e0ad23ea Merge remote-tracking branch 'open/prod-uisymbols' into open-master 2016-02-04 14:37:18 -08:00
Victor Woeltjen
73324ce338 [Build] Update run-time licenses
Update licensing info shown in run-time Licenses page
available form About dialog.
2016-02-03 17:32:16 -08:00
Victor Woeltjen
ef708cf11c [Build] Update LICENSES.md
...to reflect updated versions of dependencies and new
dependencies acquired due to changes to build.
2016-02-03 17:20:37 -08:00
Victor Woeltjen
ad767d0db9 [Build] Update build instructions in documentation 2016-02-03 17:11:10 -08:00
Victor Woeltjen
f11cd589c5 [Build] Summarize dist contents 2016-02-02 16:06:45 -08:00
Victor Woeltjen
2036a467ce [Build] Update README.md
Include short instructions to build.
2016-02-02 16:04:17 -08:00
Victor Woeltjen
4cb183adc3 [Build] Remove obsolete README section 2016-02-02 15:59:17 -08:00
Victor Woeltjen
52b01e8bdb [Build] Remove obsolete test script 2016-02-02 15:57:06 -08:00
Victor Woeltjen
a10db656ce [Build] Allow bundles to be removed
Allow bundles to be removed by:

* Waiting for explicit activation before bootstrapping,
  providing a time period when bundles could be removed.
* Adding a remove method to BundleRegistry
2016-02-02 15:18:50 -08:00
Charles Hacskaylo
4926ccb07b [Frontend] Fixed wrong location for icomoon proj config file
open #188
Removed wrongly placed new file; updated old
file with latest project config;
2016-02-02 13:52:16 -08:00
Pete Richards
2dd9a16bf3 Merge remote-tracking branch 'open/prod-uisymbols' into open-master 2016-02-02 09:46:15 -08:00
Charles Hacskaylo
339faf5376 Updated json config file
open #188
2016-02-02 09:46:00 -08:00
Charles Hacskaylo
10c3ffc4be Added new e619 bullet symbol
open #188
2016-02-02 09:43:40 -08:00
Victor Woeltjen
aebae27391 [Tests] Remove suite.json files
Remove obsolete suite.json files; #482
2016-02-02 09:35:50 -08:00
Charles Hacskaylo
97d0a66684 [Frontend] Added VISTA Topic and Session glyphs to symbols font
open #188
See Google Doc UI Symbols Font Map
for char codes
2016-01-29 17:09:19 -08:00
Victor Woeltjen
bb7f4239f6 [Build] Just install during prepublish
Don't run verifications (tests, lint, etc)
2016-01-29 16:56:29 -08:00
Victor Woeltjen
9b524af3ce [Build] Allow build outside of git repo 2016-01-29 16:52:13 -08:00
Victor Woeltjen
5081e89590 [Build] Add spaces in description 2016-01-29 12:43:36 -08:00
Victor Woeltjen
d2a7e04b44 [Build] Unhyphenate name
...for consistency with GitHub repo name
2016-01-29 12:43:10 -08:00
Victor Woeltjen
fcb23b42a4 [Build] Trigger bower during prepublish 2016-01-29 12:42:46 -08:00
Victor Woeltjen
6b585d175b [Build] Move build back to prepublish 2016-01-29 12:30:22 -08:00
Victor Woeltjen
6b32db778a [Build] Trigger gulp install at postinstall time 2016-01-29 12:24:33 -08:00
Victor Woeltjen
924a4026ff [Build] Trigger gulp from prepublish 2016-01-29 11:54:18 -08:00
Victor Woeltjen
25a7df7885 [Build] Update JSDoc 2016-01-29 11:46:37 -08:00
Victor Woeltjen
ddb5837145 Merge branch 'master' into open460 2016-01-29 11:44:38 -08:00
Victor Woeltjen
6509d84a5d [Build] Update TemplateLinker spec 2016-01-29 11:42:14 -08:00
Victor Woeltjen
507f2391ff [Build] Update mct-include, mct-representation specs
...to reflect changes in TemplateLinker API allowing
templates to be explicitly included.
2016-01-29 11:27:08 -08:00
Victor Woeltjen
38e703a121 [Build] Fix failing test
Acquire reference to moment as an argument instead of
assuming global availability; this appears to be no longer
be present globally after build changes
2016-01-29 10:33:43 -08:00
Victor Woeltjen
e564baba1a [Build] Update test runner 2016-01-29 10:26:47 -08:00
Victor Woeltjen
0a546cd50c [Build] Run bower as a postinstall step 2016-01-29 10:17:44 -08:00
Victor Woeltjen
baf32dd62f [Build] Add verify task 2016-01-29 10:15:34 -08:00
Victor Woeltjen
71db4b38ab [Build] Remove obsolete pom.xml 2016-01-29 10:08:33 -08:00
Victor Woeltjen
2727c9544d Merge remote-tracking branch 'github/master' into open-master 2016-01-28 17:33:45 -08:00
Victor Woeltjen
a35b0c1d7b Remove erroneously committed file
From #474
2016-01-28 17:33:00 -08:00
Victor Woeltjen
df94d31cf3 [Build] Generate build info for About dialog 2016-01-28 17:16:44 -08:00
Victor Woeltjen
c3f819fa8c [Build] Begin adding build info 2016-01-28 17:08:02 -08:00
Victor Woeltjen
5b0ee8588c [Build] Respect shim config when optimizing 2016-01-28 15:23:37 -08:00
Victor Woeltjen
fcfb3eebda [Build] Include all static assets 2016-01-28 15:23:17 -08:00
Victor Woeltjen
84e1e87ce3 [Build] Copy run-time resources into dist 2016-01-28 15:06:07 -08:00
Victor Woeltjen
41cfd050a2 [Build] Change task name for code style check 2016-01-28 14:54:30 -08:00
Victor Woeltjen
d67ffa8401 [Build] Add fixstyle step 2016-01-28 14:39:14 -08:00
Victor Woeltjen
fd2f4128a0 [Build] Add code style checks 2016-01-28 14:33:57 -08:00
Victor Woeltjen
814fb3b513 [Build] Add lint step 2016-01-28 13:44:18 -08:00
Victor Woeltjen
e0fbaa83b0 [Build] Add compatibility with text plugin
Allow templates to be loaded via the text plugin, which
in turn will allow these to be built into the final JS
artifact.
2016-01-28 11:41:14 -08:00
Victor Woeltjen
967f8c9151 [Build] Update remaining library references 2016-01-28 11:25:44 -08:00
Victor Woeltjen
84ecfd3527 [Build] Remove remaining files in libs 2016-01-28 11:21:08 -08:00
Victor Woeltjen
3a4f6a7229 [Build] Update dependency references
...to reflect movement of third-party libraries to
bower_components.
2016-01-28 11:18:57 -08:00
Victor Woeltjen
7a160a0a98 [Build] Remove third-party libraries 2016-01-28 11:13:11 -08:00
Victor Woeltjen
cf15b6eed7 [Build] Add additional run-time dependencies 2016-01-28 11:12:18 -08:00
Victor Woeltjen
452b05eb7b [Build] Update RequireJS config
...to use bower_components paths
2016-01-28 10:55:22 -08:00
Victor Woeltjen
82261dfabc [Build] Add bower.json
...to declare front-end dependencies, to allow these to be
removed from repository.
2016-01-28 10:51:52 -08:00
Victor Woeltjen
fc7bd36dba [Build] Begin integrating compass
Convert SCSS to CSS as a build step.
2016-01-28 10:36:01 -08:00
Victor Woeltjen
918c667496 [Build] Update code coverage report path 2016-01-27 15:00:59 -08:00
Victor Woeltjen
7c23f803e8 Merge pull request #477 from nasa/open337
Review and integrate open337
2016-01-27 14:33:37 -08:00
Victor Woeltjen
97c69799b4 [Build] Use spaces instead of tabs 2016-01-27 14:30:40 -08:00
Victor Woeltjen
406fdd5efc [Build] Run karma tests from gulp 2016-01-27 14:30:07 -08:00
Victor Woeltjen
f334be8f23 [Build] Externalize source maps 2016-01-27 14:01:09 -08:00
Victor Woeltjen
e1b7f2af30 [Build] Add initial gulp task
Add initial gulp task (r.js optimization)
2016-01-27 13:23:17 -08:00
Victor Woeltjen
ad63b9ff1b [Build] Ignore dist 2016-01-27 13:03:08 -08:00
Victor Woeltjen
e83b19c84b [Build] Add gulp dependency
Add dependency on gulp to begin modifying build, per
#460
2016-01-27 13:00:20 -08:00
Victor Woeltjen
dbf196e014 Merge remote-tracking branch 'github/master' into open477
Resolve conflicts to complete merge of #477

Conflicts:
	platform/commonUI/general/bundle.json
	platform/commonUI/themes/espresso/res/css/theme-espresso.css
	platform/commonUI/themes/snow/res/css/theme-snow.css
2016-01-27 12:53:46 -08:00
Victor Woeltjen
b5c8ecc85f Merge pull request #475 from nasa/open325b
[Time Conductor] Update validation logic
2016-01-27 12:44:14 -08:00
Victor Woeltjen
9e6da94878 [Time Conductor] Reformat expression in template
...to use less line width, and to exhibit more normal
indentation, per code review feedback from #475
2016-01-22 15:24:27 -08:00
Victor Woeltjen
3a26c864b8 [Time Conductor] Fix comment text
Per code review feedback, #475
2016-01-22 15:22:54 -08:00
Pete Richards
be7827d6f8 Merge remote-tracking branch 'open/open445' into open-master 2016-01-22 11:47:05 -08:00
Henry
b8b5fdcabf [Copy] #497 Removed extraenuous persist call 2016-01-22 11:32:20 -08:00
Victor Woeltjen ★
45276183b9 Merge pull request #496 from nasa/open492
[Documentation] #492 Amended CircleCI configuration to add missing dependency
2016-01-22 09:30:27 -08:00
Henry
54653f3914 [Create] #491 Locator is not visible when creating a new object where selected object does not have location
Added additional test for default context

Fixed JSLint error
2016-01-21 16:35:18 -08:00
Henry
cd2b19eb1e [New Edit Mode] Fixed failing tests, and added new test in CreateWizard
[New Edit Mode] #480 fixed JSLint errors

[New Edit Mode] #480 do not show locator for sub objects

[New Edit Mode] Modified persistence in SaveAction

Removed redundant variable

Fixed Failing Test

Fixed JSLint errors

Improved some documentation
2016-01-21 12:01:38 -08:00
Henry
3850db268a [Documentation] #492 Added missing dependency for CircleCI 2016-01-21 10:54:49 -08:00
Henry
c65096f166 [New Edit Mode] Added AddAction, modified EditableDomainObject to properly wrap inherited functions, added new EditableInstantiationCapability 2016-01-20 18:49:39 -08:00
Victor Woeltjen ★
fcae3fd7a9 Merge pull request #487 from nasa/open486
Review and integrate open486
2016-01-19 11:38:50 -08:00
Victor Woeltjen ★
83dd23cd4b Merge pull request #490 from nasa/nem-build-fixes
NEM build fixes
2016-01-19 11:37:25 -08:00
Pete Richards
26c155da3b Merge branch 'open483' into open-master 2016-01-18 14:09:30 -08:00
Pete Richards
db7560c31f [Test] Use PhantomJS to run tests
Switch Karma to use PhantomJS to run tests.  CI machines no longer
need to have Chrome installed.

Implemented after changes to build process due to imperative registration.

https://github.com/nasa/openmctweb/issues/450
2016-01-18 13:57:32 -08:00
Pete Richards
6fc028e112 [Docs] remove dependencies for building docs
Remove depencendies necessary to build docs from package.json and
specify them in the readme.  Due to difficulty managing dependencies
for nomnoml on different platforms, this reduces dependency requirements
to only those needed for building the package.
2016-01-18 13:54:33 -08:00
Victor Woeltjen ★
9b6f3bff85 Merge pull request #485 from nasa/open337-filters
[Plot] Use filters to reverse tick labels
2016-01-15 13:30:41 -08:00
Victor Woeltjen
c2207fe7ce [Plot] Use reverse filter for range ticks too 2016-01-15 13:14:33 -08:00
Victor Woeltjen
119429bc42 [Plot] Test reverse filter 2016-01-15 13:13:08 -08:00
Victor Woeltjen
a94e99af70 [Plot] Use reverse filter for plot ticks
...to remove CSS-related reversal from scripts
2016-01-15 13:09:05 -08:00
Victor Woeltjen
96dc055f02 [Plot] Add reverse filter 2016-01-15 13:06:56 -08:00
Victor Woeltjen
a50410f8ed [Plot] Allow filters to be registered
https://github.com/nasa/openmctweb/pull/477/files#r49903975
2016-01-15 13:00:24 -08:00
Victor Woeltjen
0dc715199d [Build] Include examples in build 2016-01-15 11:44:26 -08:00
Victor Woeltjen
aab53c4ae1 [Build] Exclude target from build 2016-01-15 11:41:50 -08:00
Victor Woeltjen
b63812111d [Build] Include bundle.js files
https://github.com/nasa/openmctweb/issues/483
2016-01-15 11:34:58 -08:00
Charles Hacskaylo
442229fd42 Merge branch 'master' of https://github.com/nasa/openmctweb into open445
Conflicts:
	platform/features/plot/res/templates/plot.html
2016-01-13 16:01:02 -08:00
Charles Hacskaylo
a7a707595c [Frontend] Fixes to CSS for Chrome Linux
open #445
Mods and simplifications to wait-spinner classes;
Simplification and cleanup in plot.html to use loading
class instead of hide/show DOM element;
2016-01-13 13:54:00 -08:00
Charles Hacskaylo
8c325eb1b1 [Frontend] Mods to allow plot tick labels to ellipsis to left
open #337
Still fixing code due to circleci fail in pull request;
2016-01-13 10:11:14 -08:00
Charles Hacskaylo
5e628b1a25 [Frontend] Mods to allow plot tick labels to ellipsis to left
open #337
Still fixing code due to circleci fail in pull request;
2016-01-13 10:05:30 -08:00
Charles Hacskaylo
f8114ba6b6 [Frontend] Mods to allow plot tick labels to ellipsis to left
open #337
Fixing code due to circleci fail in pull request;
2016-01-12 18:23:30 -08:00
Charles Hacskaylo
a10f895904 [Frontend] Mods to allow plot tick labels to ellipsis to left
open #337
Fixing code due to circleci fail in pull request;
2016-01-12 18:20:52 -08:00
Charles Hacskaylo
9b59fd7eae [Frontend] Mods to allow plot tick labels to ellipsis to left
open #337
Tick label strings are now reversed in their char order in
PlotTickGenerator.js, then reversed again via CSS in
_plots-main.scss. This forces the browser to clip the label
at the left 'start' side, rather than the end, resulting in
the least significant portion of the label getting clipped.
2016-01-12 18:04:09 -08:00
Victor Woeltjen
9fe026a1f1 [Time Conductor] Decrease minimum outer span 2016-01-11 18:29:42 -08:00
Victor Woeltjen
3b5c1bf2e6 [Time Conductor] Update spec
Verify that validation occurs against state in formModel;
remove obsolete test case for enforcing minimum outer span
2016-01-11 18:28:44 -08:00
Victor Woeltjen
bb993dc94f [Time Conductor] Don't update invalid bounds
Don't enforce minimum time span when bounds are invalid;
https://github.com/nasa/openmctweb/issues/325#issuecomment-170755787
2016-01-11 18:23:32 -08:00
Victor Woeltjen
5beb1de805 [Time Conductor] Display validation errors consistently 2016-01-11 16:56:58 -08:00
Victor Woeltjen
0a012c67dd [Time Conductor] Test additions to TimeRangeController
Add test cases to cover validators added to display
start/end time violations.
2016-01-11 16:41:20 -08:00
Victor Woeltjen
11b71fae68 [Time Conductor] Display invalid state
...when text value can be parsed in a date-time field,
but numeric value violates externally-imposed validation
2016-01-11 15:29:43 -08:00
Victor Woeltjen
e6d0537e5e Revert "[Time Conductor] Validate numeric date-time fields"
This reverts commit 07c407edea.
2016-01-11 15:23:21 -08:00
Victor Woeltjen
99556ed6a5 [Time Conductor] Validate start/end times 2016-01-11 15:18:38 -08:00
Victor Woeltjen
07c407edea [Time Conductor] Validate numeric date-time fields
Allow injection of a validator for numeric values of
the date-time fields, to allow for these to be displayed
as invalid in cases where the text itself may be parsed
but the resulting value is not valid (e.g. when start
is greater than end.)

https://github.com/nasa/openmctweb/issues/325
2016-01-11 15:18:26 -08:00
145 changed files with 2383 additions and 35076 deletions

4
.gitignore vendored
View File

@@ -15,6 +15,7 @@
# Build output
target
dist
# Mac OS X Finder
.DS_Store
@@ -22,8 +23,9 @@ target
# Closed source libraries
closed-lib
# Node dependencies
# Node, Bower dependencies
node_modules
bower_components
# Protractor logs
protractor/logs

3
.jscsrc Normal file
View File

@@ -0,0 +1,3 @@
{
"preset": "crockford"
}

4
.jshintrc Normal file
View File

@@ -0,0 +1,4 @@
{
"validthis": true,
"laxbreak": true
}

View File

@@ -135,7 +135,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
* Link: http://requirejs.org/
* Version: 2.1.9
* Version: 2.1.22
* Author: The Dojo Foundation
@@ -153,13 +153,49 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
---
### requirejs-text
#### Info
* Link: https://github.com/requirejs/text
* Version: 2.0.14
* Author: The Dojo Foundation
* Description: Text loading plugin for RequireJS
#### License
Copyright (c) 2010-2014, The Dojo Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
### AngularJS
#### Info
* Link: http://angularjs.org/
* Version: 1.2.26
* Version: 1.4.4
* Author: Google
@@ -167,7 +203,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
#### License
Copyright (c) 2010-2014 Google, Inc. http://angularjs.org
Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -183,7 +219,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
* Link: http://angularjs.org/
* Version: 1.2.26
* Version: 1.4.4
* Author: Google
@@ -191,7 +227,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
#### License
Copyright (c) 2010-2014 Google, Inc. http://angularjs.org
Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -207,7 +243,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
* Link: https://github.com/jakearchibald/es6-promise
* Version: 2.0.0
* Version: 3.0.2
* Authors: Yehuda Katz, Tom Dale, Stefan Penner and contributors
@@ -231,7 +267,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
* Link: https://github.com/sindresorhus/screenfull.js/
* Version: 1.2.0
* Version: 3.0.0
* Author: Sindre Sorhus
@@ -255,15 +291,15 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
* Link: https://github.com/broofa/node-uuid
* Version: 1.4
* Version: 1.4.7
* Author: Robert Kieffer
* Description: Unique identifer generation (code adapted.)
* Description: Unique identifer generation.
#### License
Copyright (c) 2010 Robert Kieffer
Copyright (c) 2010-2012 Robert Kieffer
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -327,7 +363,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
* Link: http://momentjs.com
* Version: 2.7.0
* Version: 2.11.1
* Authors: Tim Wood, Iskren Chernev, Moment.js contributors

View File

@@ -20,27 +20,6 @@ directory names) to include in a running instance of Open MCT Web. Adding or
removing paths from this list will add or remove bundles from the running
application.
### Bundle Contents
A bundle directory will contain:
* `bundle.json`, the declaration of the bundles contents.
* A source code directory, named `src` by convention. This contains all
JavaScript sources exposed by the bundle. These are declared as
AMD modules.
* A directory for other resources, named `res` by convention. This
contains all HTML templates, CSS files, images, and so forth to be
used within a given bundle.
* A library directory, named `lib` by convention. This contains all
external libraries used and/or exposed by the bundle.
* A test directory, named `test` by convention. This contains all unit
tests declared for the bundle, as well as a `suite.json` that acts
as a listing of these dependencies. See the section on unit testing
below.
Following these bundle conventions is required, at present, to ensure
that Open MCT Web (and its build and tests) execute correctly.
## Tests
Tests are written for [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html)
@@ -77,39 +56,36 @@ To run:
## Build
Open MCT Web includes a Maven command line build. Although Open MCT Web
can be run as-is using the repository contents (that is, by viewing
`index.html` in a web browser), the command
line build allows machine-driven verification and packaging.
Open MCT Web is built using [`npm`](http://npmjs.com/)
and [`gulp`](http://gulpjs.com/).
This build will:
To build:
* Check all sources (excluding those in directories named `lib`) with
JSLint for code style compliance. The build will fail if any sources
do not satisfy JSLint.
* Run the [unit test suite](#tests).
* Package the application as a `war` (web archive) file. This is
convenient for deployment on Tomcat or similar. This archive will
include sources, resources, and libraries for bundles, as well
as the top-level files used to initiate running of the application
(`index.html` and `bundles.json`).
`npm run prepublish`
Run as `mvn clean install`.
This will compile and minify JavaScript sources, as well as copy over assets.
The contents of the `dist` folder will contain a runnable Open MCT Web
instance (e.g. by starting an HTTP server in that directory), including:
* A `main.js` file containing Open MCT Web source code.
* Various assets in the `example` and `platform` directories.
* An `index.html` that runs Open MCT Web in its default configuration.
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
### Building Documentation
Open MCT Web's documentation is generated by an
[npm](https://www.npmjs.com/)-based build:
[npm](https://www.npmjs.com/)-based build. It has additional dependencies that
may not be available on every platform and thus is not covered in the standard
npm install. Ensure your system has [libcairo](http://cairographics.org/)
installed and then run the following commands:
* `npm install` _(only needs to run once)_
* `npm install`
* `npm install canvas nomnoml`
* `npm run docs`
Documentation will be generated in `target/docs`. Note that diagram
generation is dependent on having [Cairo](http://cairographics.org/download/)
installed; see
[node-canvas](https://github.com/Automattic/node-canvas#installation)'s
documentation for help with installation.
Documentation will be generated in `target/docs`.
# Glossary

20
bower.json Normal file
View File

@@ -0,0 +1,20 @@
{
"name": "openmctweb",
"description": "The OpenMCTWeb core platform",
"main": "",
"license": "Apache-2.0",
"moduleType": [],
"homepage": "http://nasa.github.io/openmctweb/",
"private": true,
"dependencies": {
"angular": "1.4.4",
"angular-route": "1.4.4",
"moment": "^2.11.1",
"moment-duration-format": "^1.3.0",
"requirejs": "~2.1.22",
"text": "requirejs-text#^2.0.14",
"es6-promise": "^3.0.2",
"screenfull": "^3.0.0",
"node-uuid": "^1.4.7"
}
}

View File

@@ -2,6 +2,7 @@ deployment:
production:
branch: master
commands:
- npm install canvas nomnoml
- ./build-docs.sh
- git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master
openmctweb-staging-un:

View File

@@ -2245,18 +2245,27 @@ options. The sources can be deployed in the same directory structure used during
development. A few utilities are included to support development processes.
## Command-line Build
Open MCT Web includes a script for building via command line using Maven 3.3.9
https://maven.apache.org/ .
Invoking mvn clean install will:
* Check code style using JSLint. The build will fail if JSLint raises any warnings.
* Run the test suite (see below.) The build will fail if any tests fail.
* Populate version info (e.g. commit hash, build time.)
* Produce a web archive (`.war`) artifact in the `target` directory.
Open MCT Web is built using [`npm`](http://npmjs.com/)
and [`gulp`](http://gulpjs.com/).
The produced artifact contains a subset of the repository's own folder
hierarchy, omitting tests and example bundles.
To install build dependencies (only needs to be run once):
`npm install`
To build:
`npm run prepublish`
This will compile and minify JavaScript sources, as well as copy over assets.
The contents of the `dist` folder will contain a runnable Open MCT Web
instance (e.g. by starting an HTTP server in that directory), including:
* A `main.js` file containing Open MCT Web source code.
* Various assets in the `example` and `platform` directories.
* An `index.html` that runs Open MCT Web in its default configuration.
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
Note that an internet connection is required to run this build, in order to
download build dependencies.

122
gulpfile.js Normal file
View File

@@ -0,0 +1,122 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global require,__dirname*/
var gulp = require('gulp'),
requirejsOptimize = require('gulp-requirejs-optimize'),
sourcemaps = require('gulp-sourcemaps'),
compass = require('gulp-compass'),
jshint = require('gulp-jshint'),
jscs = require('gulp-jscs'),
replace = require('gulp-replace-task'),
karma = require('karma'),
path = require('path'),
fs = require('fs'),
git = require('git-rev-sync'),
moment = require('moment'),
project = require('./package.json'),
paths = {
main: 'main.js',
dist: 'dist',
assets: 'dist/assets',
scss: 'platform/**/*.scss',
scripts: [ 'main.js', 'platform/**/*.js', 'src/**/*.js' ],
static: [
'index.html',
'platform/**/*',
'example/**/*',
'bower_components/**/*'
]
},
options = {
requirejsOptimize: {
name: paths.main.replace(/\.js$/, ''),
mainConfigFile: paths.main,
wrapShim: true
},
karma: {
configFile: path.resolve(__dirname, 'karma.conf.js'),
singleRun: true
},
compass: {
sass: __dirname,
css: paths.assets
},
replace: {
variables: {
version: project.version,
timestamp: moment.utc(Date.now()).format(),
revision: fs.existsSync('.git') ? git.long() : 'Unknown',
branch: fs.existsSync('.git') ? git.branch() : 'Unknown'
}
}
};
gulp.task('scripts', function () {
return gulp.src(paths.main)
.pipe(sourcemaps.init())
.pipe(requirejsOptimize(options.requirejsOptimize))
.pipe(sourcemaps.write('.'))
.pipe(replace(options.replace))
.pipe(gulp.dest(paths.dist));
});
gulp.task('test', function (done) {
new karma.Server(options.karma, done).start();
});
gulp.task('stylesheets', function () {
return gulp.src(paths.scss)
.pipe(compass(options.compass))
.pipe(gulp.dest(paths.assets));
});
gulp.task('lint', function () {
return gulp.src(paths.scripts)
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(jshint.reporter('fail'));
});
gulp.task('checkstyle', function () {
return gulp.src(paths.scripts)
.pipe(jscs())
.pipe(jscs.reporter())
.pipe(jscs.reporter('fail'));
});
gulp.task('fixstyle', function () {
return gulp.src(paths.scripts, { base: '.' })
.pipe(jscs({ fix: true }))
.pipe(gulp.dest('.'));
});
gulp.task('static', function () {
return gulp.src(paths.static, { base: '.' })
.pipe(gulp.dest(paths.dist));
});
gulp.task('install', [ 'static', 'scripts' ]);
gulp.task('verify', [ 'lint', 'test' ]);
gulp.task('build', [ 'verify', 'install' ]);

View File

@@ -26,8 +26,12 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title></title>
<script type="text/javascript"
src="platform/framework/lib/require.js"
data-main="main.js">
src="bower_components/requirejs/require.js">
</script>
<script type="text/javascript">
require(['main'], function (mct) {
mct.run();
});
</script>
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96">

View File

@@ -34,6 +34,7 @@ module.exports = function(config) {
// List of files / patterns to load in the browser.
// By default, files are also included in a script tag.
files: [
{pattern: 'bower_components/**/*.js', included: false},
{pattern: 'src/**/*.js', included: false},
{pattern: 'example/**/*.js', included: false},
{pattern: 'platform/**/*.js', included: false},
@@ -49,7 +50,8 @@ module.exports = function(config) {
// Preprocess matching files before serving them to the browser.
// https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'**/src/**/!(*Spec).js': [ 'coverage' ]
'src/**/src/**/!(*Spec).js': [ 'coverage' ],
'platform/**/src/**/!(*Spec).js': [ 'coverage' ]
},
// Test results reporter to use
@@ -71,12 +73,12 @@ module.exports = function(config) {
// Specify browsers to run tests in.
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: [
'Chrome'
'PhantomJS'
],
// Code coverage reporting.
coverageReporter: {
dir: "target/coverage"
dir: "dist/coverage"
},
// HTML test reporting.

24
main.js
View File

@@ -24,12 +24,24 @@
requirejs.config({
"paths": {
"legacyRegistry": "src/legacyRegistry",
"angular": "platform/framework/lib/angular.min",
"moment": 'platform/telemetry/lib/moment.min'
"angular": "bower_components/angular/angular.min",
"angular-route": "bower_components/angular-route/angular-route.min",
"es6-promise": "bower_components/es6-promise/promise.min",
"moment": "bower_components/moment/moment",
"moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format",
"screenfull": "bower_components/screenfull/dist/screenfull.min",
"text": "bower_components/text/text",
"uuid": "bower_components/node-uuid/uuid"
},
"shim": {
"angular": {
"exports": "angular"
},
"angular-route": {
"deps": [ "angular" ]
},
"moment-duration-format": {
"deps": [ "moment" ]
}
}
});
@@ -77,5 +89,11 @@ define([
'./example/generator/bundle'
], function (Main, legacyRegistry) {
'use strict';
new Main().run(legacyRegistry);
return {
legacyRegistry: legacyRegistry,
run: function () {
return new Main().run(legacyRegistry);
}
};
});

View File

@@ -1,30 +1,39 @@
{
"name": "open-mct-web",
"version": "0.7.2",
"description": "The OpenMCTWeb core platform",
"name": "openmctweb",
"version": "0.9.1-SNAPSHOT",
"description": "The Open MCT Web core platform",
"dependencies": {
"express": "^4.13.1",
"minimist": "^1.1.1"
},
"devDependencies": {
"canvas": "^1.2.7",
"bower": "^1.7.7",
"git-rev-sync": "^1.4.0",
"glob": ">= 3.0.0",
"gulp": "^3.9.0",
"gulp-compass": "^2.1.0",
"gulp-jscs": "^3.0.2",
"gulp-jshint": "^2.0.0",
"gulp-replace-task": "^0.11.0",
"gulp-requirejs-optimize": "^0.3.1",
"gulp-sourcemaps": "^1.6.0",
"jasmine-core": "^2.3.0",
"jsdoc": "^3.3.2",
"jshint": "^2.7.0",
"karma": "^0.12.31",
"karma": "^0.13.3",
"karma-chrome-launcher": "^0.1.8",
"karma-cli": "0.0.4",
"karma-coverage": "^0.5.3",
"karma-html-reporter": "^0.2.7",
"karma-jasmine": "^0.1.5",
"karma-phantomjs-launcher": "^0.1.4",
"karma-phantomjs-launcher": "^0.2.3",
"karma-requirejs": "^0.2.2",
"lodash": "^3.10.1",
"markdown-toc": "^0.11.7",
"marked": "^0.3.5",
"mkdirp": "^0.5.1",
"nomnoml": "^0.0.3",
"moment": "^2.11.1",
"phantomjs": "^1.9.19",
"requirejs": "^2.1.17",
"split": "^1.0.0"
},
@@ -35,12 +44,14 @@
"watch": "karma start",
"jsdoc": "jsdoc -c jsdoc.json -r -d target/docs/api",
"otherdoc": "node docs/gendocs.js --in docs/src --out target/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'",
"docs": "npm run jsdoc ; npm run otherdoc"
"docs": "npm run jsdoc ; npm run otherdoc",
"prepublish": "./node_modules/bower/bin/bower install && ./node_modules/gulp/bin/gulp.js install"
},
"repository": {
"type": "git",
"url": "https://github.com/nasa/openmctweb.git"
},
"author": "",
"license": "Apache-2.0"
"license": "Apache-2.0",
"private": true
}

View File

@@ -22,11 +22,13 @@
/*global define*/
define([
"text!./res/templates/about-dialog.html",
"./src/LogoController",
"./src/AboutController",
"./src/LicenseController",
'legacyRegistry'
], function (
aboutDialogTemplate,
LogoController,
AboutController,
LicenseController,
@@ -50,7 +52,7 @@ define([
},
{
"key": "about-dialog",
"templateUrl": "templates/about-dialog.html"
"template": aboutDialogTemplate
},
{
"key": "overlay-about",

View File

@@ -1,5 +0,0 @@
[
"AboutController",
"LicenseController",
"LogoController"
]

View File

@@ -34,6 +34,7 @@ define([
"./src/windowing/NewTabAction",
"./src/windowing/FullscreenAction",
"./src/creation/CreateActionProvider",
"./src/creation/AddActionProvider",
"./src/creation/CreationService",
"./src/windowing/WindowTitler",
'legacyRegistry'
@@ -50,6 +51,7 @@ define([
NewTabAction,
FullscreenAction,
CreateActionProvider,
AddActionProvider,
CreationService,
WindowTitler,
legacyRegistry
@@ -117,7 +119,8 @@ define([
"implementation": LocatorController,
"depends": [
"$scope",
"$timeout"
"$timeout",
"objectService"
]
},
{
@@ -271,6 +274,18 @@ define([
"policyService"
]
},
{
"key": "AddActionProvider",
"provides": "actionService",
"type": "provider",
"implementation": AddActionProvider,
"depends": [
"$q",
"typeService",
"dialogService",
"policyService"
]
},
{
"key": "CreationService",
"provides": "creationService",

View File

@@ -1,6 +0,0 @@
/*!
* screenfull
* v1.2.0 - 2014-04-29
* (c) Sindre Sorhus; MIT License
*/
!function(){"use strict";var a="undefined"!=typeof module&&module.exports,b="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var a,b,c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],d=0,e=c.length,f={};e>d;d++)if(a=c[d],a&&a[1]in document){for(d=0,b=a.length;b>d;d++)f[c[0][d]]=a[d];return f}return!1}(),d={request:function(a){var d=c.requestFullscreen;a=a||document.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[d]():a[d](b&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){document[c.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:c};return c?(Object.defineProperties(d,{isFullscreen:{get:function(){return!!document[c.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!document[c.fullscreenEnabled]}}}),document.addEventListener(c.fullscreenchange,function(a){d.onchange.call(d,a)}),document.addEventListener(c.fullscreenerror,function(a){d.onerror.call(d,a)}),void(a?module.exports=d:window.screenfull=d)):void(a?module.exports=!1:window.screenfull=!1)}();

View File

@@ -0,0 +1,139 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define,Promise*/
/**
* Module defining AddAction. Created by ahenry on 01/21/16.
*/
define(
[
'./CreateWizard'
],
function (CreateWizard) {
"use strict";
/**
* The Add Action is performed to create new instances of
* domain objects of a specific type that are subobjects of an
* object being edited. This is the action that is performed when a
* user uses the Add menu option.
*
* @memberof platform/commonUI/browse
* @implements {Action}
* @constructor
*
* @param {Type} type the type of domain object to create
* @param {DomainObject} parent the domain object that should
* act as a container for the newly-created object
* (note that the user will have an opportunity to
* override this)
* @param {ActionContext} context the context in which the
* action is being performed
* @param {DialogService} dialogService
*/
function AddAction(type, parent, context, $q, dialogService, policyService) {
this.metadata = {
key: 'add',
glyph: type.getGlyph(),
name: type.getName(),
type: type.getKey(),
description: type.getDescription(),
context: context
};
this.type = type;
this.parent = parent;
this.$q = $q;
this.dialogService = dialogService;
this.policyService = policyService;
}
/**
*
* Create a new object of the given type.
* This will prompt for user input first.
*
* @returns {Promise} that will be resolved with the object that the
* action was originally invoked on (ie. the 'parent')
*/
AddAction.prototype.perform = function () {
var newModel = this.type.getInitialModel(),
newObject,
parentObject = this.parent,
wizard;
newModel.type = this.type.getKey();
newObject = parentObject.getCapability('instantiation').instantiate(newModel);
newObject.useCapability('mutation', function(model){
model.location = parentObject.getId();
});
wizard = new CreateWizard(newObject, this.parent, this.policyService);
function populateObjectFromInput (formValue) {
return wizard.populateObjectFromInput(formValue, newObject);
}
function addToParent (populatedObject) {
parentObject.getCapability('composition').add(populatedObject);
return parentObject.getCapability('persistence').persist().then(function(){
return parentObject;
});
}
function save(object) {
/*
It's necessary to persist the new sub-object in order
that it can be retrieved for composition in the parent.
Future refactoring that allows temporary objects to be
retrieved from object services will make this unnecessary.
*/
return object.getCapability('editor').save(true);
}
return this.dialogService
.getUserInput(wizard.getFormStructure(false), wizard.getInitialFormValue())
.then(populateObjectFromInput)
.then(save)
.then(addToParent);
};
/**
* Metadata associated with a Add action.
* @typedef {ActionMetadata} AddActionMetadata
* @property {string} type the key for the type of domain object
* to be created
*/
/**
* Get metadata about this action.
* @returns {AddActionMetadata} metadata about this action
*/
AddAction.prototype.getMetadata = function () {
return this.metadata;
};
return AddAction;
}
);

View File

@@ -0,0 +1,87 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define,Promise*/
/**
* Module defining AddActionProvider.js. Created by ahenry on 01/21/16.
*/
define(
["./AddAction"],
function (AddAction) {
"use strict";
/**
* The AddActionProvider is an ActionProvider which introduces
* an Add action for creating sub objects.
*
* @memberof platform/commonUI/browse
* @constructor
* @implements {ActionService}
*
* @param {TypeService} typeService the type service, used to discover
* available types
* @param {DialogService} dialogService the dialog service, used by
* specific Create actions to get user input to populate the
* model of the newly-created domain object.
* @param {CreationService} creationService the creation service (also
* introduced in this bundle), responsible for handling actual
* object creation.
*/
function AddActionProvider($q, typeService, dialogService, policyService) {
this.typeService = typeService;
this.dialogService = dialogService;
this.$q = $q;
this.policyService = policyService;
}
AddActionProvider.prototype.getActions = function (actionContext) {
var context = actionContext || {},
key = context.key,
destination = context.domainObject,
self = this;
// We only provide Add actions, and we need a
// domain object to serve as the container for the
// newly-created object (although the user may later
// make a different selection)
if (key !== 'add' || !destination) {
return [];
}
// Introduce one create action per type
return this.typeService.listTypes().filter(function (type) {
return self.policyService.allow("creation", type) && self.policyService.allow("composition", destination.getCapability('type'), type);
}).map(function (type) {
return new AddAction(
type,
destination,
context,
self.$q,
self.dialogService,
self.policyService
);
});
};
return AddActionProvider;
}
);

View File

@@ -26,18 +26,21 @@ define(
'use strict';
/**
* Construct a new CreateWizard.
* A class for capturing user input data from an object creation
* dialog, and populating a domain object with that data.
*
* @param {TypeImpl} type the type of domain object to be created
* @param {DomainObject} domainObject the newly created object to
* populate with user input
* @param {DomainObject} parent the domain object to serve as
* the initial parent for the created object, in the dialog
* @memberof platform/commonUI/browse
* @constructor
*/
function CreateWizard(type, parent, policyService, initialModel) {
this.type = type;
this.model = initialModel || type.getInitialModel();
this.properties = type.getProperties();
function CreateWizard(domainObject, parent, policyService) {
this.type = domainObject.getCapability('type');
this.model = domainObject.getModel();
this.domainObject = domainObject;
this.properties = this.type.getProperties();
this.parent = parent;
this.policyService = policyService;
}
@@ -46,11 +49,14 @@ define(
* Get the form model for this wizard; this is a description
* that will be rendered to an HTML form. See the
* platform/forms bundle
*
* @param {boolean} includeLocation if true, a 'location' section
* will be included that will allow the user to select the location
* of the newly created object, otherwise the .location property of
* the model will be used.
* @return {FormModel} formModel the form model to
* show in the create dialog
*/
CreateWizard.prototype.getFormStructure = function () {
CreateWizard.prototype.getFormStructure = function (includeLocation) {
var sections = [],
type = this.type,
policyService = this.policyService;
@@ -84,12 +90,16 @@ define(
});
// Ensure there is always a "save in" section
sections.push({ name: 'Location', rows: [{
name: "Save In",
control: "locator",
validate: validateLocation,
key: "createParent"
}]});
if (includeLocation) {
sections.push({
name: 'Location', rows: [{
name: "Save In",
control: "locator",
validate: validateLocation,
key: "createParent"
}]
});
}
return {
sections: sections,
@@ -97,6 +107,23 @@ define(
};
};
/**
* Given some form input values and a domain object, populate the
* domain object used to create this wizard from the given form values.
* @param formValue
* @returns {DomainObject}
*/
CreateWizard.prototype.populateObjectFromInput = function(formValue) {
var parent = this.getLocation(formValue),
formModel = this.createModel(formValue);
formModel.location = parent.getId();
this.domainObject.useCapability("mutation", function(){
return formModel;
});
return this.domainObject;
};
/**
* Get the initial value for the form being described.
* This will include the values for all properties described
@@ -120,6 +147,7 @@ define(
/**
* Based on a populated form, get the domain object which
* should be used as a parent for the newly-created object.
* @private
* @return {DomainObject}
*/
CreateWizard.prototype.getLocation = function (formValue) {
@@ -129,6 +157,7 @@ define(
/**
* Create the domain object model for a newly-created object,
* based on user input read from a formModel.
* @private
* @return {object} the domain object model
*/
CreateWizard.prototype.createModel = function (formValue) {

View File

@@ -33,7 +33,7 @@ define(
* @memberof platform/commonUI/browse
* @constructor
*/
function LocatorController($scope, $timeout) {
function LocatorController($scope, $timeout, objectService) {
// Populate values needed by the locator control. These are:
// * rootObject: The top-level object, since we want to show
// the full tree
@@ -52,6 +52,18 @@ define(
$scope.rootObject =
(context && context.getRoot()) || $scope.rootObject;
}, 0);
} else if (!contextRoot){
//If no context root is available, default to the root
// object
$scope.rootObject = undefined;
// Update the displayed tree on a timeout to avoid
// an infinite digest exception.
objectService.getObjects(['ROOT'])
.then(function(objects){
$timeout(function () {
$scope.rootObject = objects.ROOT;
}, 0);
});
}
$scope.treeModel.selectedObject = domainObject;

View File

@@ -25,7 +25,7 @@
* Module defining FullscreenAction. Created by vwoeltje on 11/18/14.
*/
define(
["../../lib/screenfull.min"],
["screenfull"],
function () {
"use strict";

View File

@@ -0,0 +1,137 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine,xit,xdescribe*/
/**
* MCTRepresentationSpec. Created by ahenry on 01/21/14.
*/
define(
["../../src/creation/AddActionProvider"],
function (AddActionProvider) {
"use strict";
describe("The add action provider", function () {
var mockTypeService,
mockDialogService,
mockPolicyService,
mockCreationPolicy,
mockCompositionPolicy,
mockPolicyMap = {},
mockTypes,
mockDomainObject,
mockQ,
provider;
function createMockType(name) {
var mockType = jasmine.createSpyObj(
"type" + name,
[
"getKey",
"getGlyph",
"getName",
"getDescription",
"getProperties",
"getInitialModel",
"hasFeature"
]
);
mockType.hasFeature.andReturn(true);
mockType.getName.andReturn(name);
return mockType;
}
beforeEach(function () {
mockTypeService = jasmine.createSpyObj(
"typeService",
[ "listTypes" ]
);
mockDialogService = jasmine.createSpyObj(
"dialogService",
[ "getUserInput" ]
);
mockPolicyService = jasmine.createSpyObj(
"policyService",
[ "allow" ]
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[ "getCapability" ]
);
//Mocking getCapability because AddActionProvider uses the
// type capability of the destination object.
mockDomainObject.getCapability.andReturn({});
mockTypes = [ "A", "B", "C" ].map(createMockType);
mockTypes.forEach(function(type){
mockPolicyMap[type.getName()] = true;
});
mockCreationPolicy = function(type){
return mockPolicyMap[type.getName()];
};
mockCompositionPolicy = function(){
return true;
};
mockPolicyService.allow.andReturn(true);
mockTypeService.listTypes.andReturn(mockTypes);
provider = new AddActionProvider(
mockQ,
mockTypeService,
mockDialogService,
mockPolicyService
);
});
it("checks for creatability", function () {
provider.getActions({
key: "add",
domainObject: mockDomainObject
});
// Make sure it was creation which was used to check
expect(mockPolicyService.allow)
.toHaveBeenCalledWith("creation", mockTypes[0]);
});
it("checks for composability of type", function () {
provider.getActions({
key: "add",
domainObject: mockDomainObject
});
expect(mockPolicyService.allow).toHaveBeenCalledWith(
"composition",
jasmine.any(Object),
jasmine.any(Object)
);
expect(mockDomainObject.getCapability).toHaveBeenCalledWith('type');
});
});
}
);

View File

@@ -32,11 +32,12 @@ define(
describe("The create action provider", function () {
var mockTypeService,
mockDialogService,
mockCreationService,
mockNavigationService,
mockPolicyService,
mockCreationPolicy,
mockPolicyMap = {},
mockTypes,
mockQ,
provider;
function createMockType(name) {
@@ -66,9 +67,9 @@ define(
"dialogService",
[ "getUserInput" ]
);
mockCreationService = jasmine.createSpyObj(
"creationService",
[ "createObject" ]
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[ "setNavigation" ]
);
mockPolicyService = jasmine.createSpyObj(
"policyService",
@@ -92,15 +93,14 @@ define(
mockTypeService.listTypes.andReturn(mockTypes);
provider = new CreateActionProvider(
mockQ,
mockTypeService,
mockDialogService,
mockCreationService,
mockNavigationService,
mockPolicyService
);
});
//TODO: Disabled for NEM Beta
xit("exposes one create action per type", function () {
it("exposes one create action per type", function () {
expect(provider.getActions({
key: "create",
domainObject: {}
@@ -114,8 +114,7 @@ define(
}).length).toEqual(0);
});
//TODO: Disabled for NEM Beta
xit("does not expose non-creatable types", function () {
it("does not expose non-creatable types", function () {
// One of the types won't have the creation feature...
mockPolicyMap[mockTypes[0].getName()] = false;
// ...so it should have been filtered out.

View File

@@ -35,6 +35,7 @@ define(
mockProperties,
mockPolicyService,
testModel,
mockDomainObject,
wizard;
function createMockProperty(name) {
@@ -81,8 +82,18 @@ define(
mockType.getInitialModel.andReturn(testModel);
mockType.getProperties.andReturn(mockProperties);
mockDomainObject = jasmine.createSpyObj(
'domainObject',
['getCapability', 'useCapability', 'getModel']
);
//Mocking the getCapability('type') call
mockDomainObject.getCapability.andReturn(mockType);
mockDomainObject.useCapability.andReturn();
mockDomainObject.getModel.andReturn(testModel);
wizard = new CreateWizard(
mockType,
mockDomainObject,
mockParent,
mockPolicyService
);
@@ -130,6 +141,18 @@ define(
});
});
it("populates the model on the associated object", function () {
var formValue = {
"A": "ValueA",
"B": "ValueB",
"C": "ValueC"
},
compareModel = wizard.createModel(formValue);
wizard.populateObjectFromInput(formValue);
expect(mockDomainObject.useCapability).toHaveBeenCalledWith('mutation', jasmine.any(Function));
expect(mockDomainObject.useCapability.mostRecentCall.args[1]()).toEqual(compareModel);
});
it("validates selection types using policy", function () {
var mockDomainObject = jasmine.createSpyObj(
'domainObject',
@@ -139,7 +162,8 @@ define(
'otherType',
['getKey']
),
structure = wizard.getFormStructure(),
//Create a form structure with location
structure = wizard.getFormStructure(true),
sections = structure.sections,
rows = structure.sections[sections.length - 1].rows,
locationRow = rows[rows.length - 1];
@@ -156,6 +180,12 @@ define(
);
});
it("creates a form model without a location if not requested", function () {
expect(wizard.getFormStructure(false).sections.some(function(section){
return section.name === 'Location';
})).toEqual(false);
});
});
}

View File

@@ -35,6 +35,8 @@ define(
mockDomainObject,
mockRootObject,
mockContext,
mockObjectService,
getObjectsPromise,
controller;
beforeEach(function () {
@@ -55,73 +57,106 @@ define(
"context",
[ "getRoot" ]
);
mockObjectService = jasmine.createSpyObj(
"objectService",
["getObjects"]
);
getObjectsPromise = jasmine.createSpyObj(
"promise",
["then"]
);
mockDomainObject.getCapability.andReturn(mockContext);
mockContext.getRoot.andReturn(mockRootObject);
mockObjectService.getObjects.andReturn(getObjectsPromise);
mockScope.ngModel = {};
mockScope.field = "someField";
controller = new LocatorController(mockScope, mockTimeout);
controller = new LocatorController(mockScope, mockTimeout, mockObjectService);
});
describe("when context is available", function () {
it("adds a treeModel to scope", function () {
expect(mockScope.treeModel).toBeDefined();
});
beforeEach(function () {
mockContext.getRoot.andReturn(mockRootObject);
controller = new LocatorController(mockScope, mockTimeout, mockObjectService);
});
it("watches for changes to treeModel", function () {
// This is what the embedded tree representation
// will be modifying.
expect(mockScope.$watch).toHaveBeenCalledWith(
"treeModel.selectedObject",
jasmine.any(Function)
);
});
it("adds a treeModel to scope", function () {
expect(mockScope.treeModel).toBeDefined();
});
it("changes its own model on embedded model updates", function () {
// Need to pass on selection changes as updates to
// the control's value
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.ngModel.someField).toEqual(mockDomainObject);
expect(mockScope.rootObject).toEqual(mockRootObject);
it("watches for changes to treeModel", function () {
// This is what the embedded tree representation
// will be modifying.
expect(mockScope.$watch).toHaveBeenCalledWith(
"treeModel.selectedObject",
jasmine.any(Function)
);
});
// Verify that the capability we expect to have been used
// was used.
expect(mockDomainObject.getCapability)
.toHaveBeenCalledWith("context");
});
it("changes its own model on embedded model updates", function () {
// Need to pass on selection changes as updates to
// the control's value
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.ngModel.someField).toEqual(mockDomainObject);
expect(mockScope.rootObject).toEqual(mockRootObject);
it("rejects changes which fail validation", function () {
mockScope.structure = { validate: jasmine.createSpy('validate') };
mockScope.structure.validate.andReturn(false);
// Verify that the capability we expect to have been used
// was used.
expect(mockDomainObject.getCapability)
.toHaveBeenCalledWith("context");
});
// Pass selection change
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
it("rejects changes which fail validation", function () {
mockScope.structure = { validate: jasmine.createSpy('validate') };
mockScope.structure.validate.andReturn(false);
expect(mockScope.structure.validate).toHaveBeenCalled();
// Change should have been rejected
expect(mockScope.ngModel.someField).not.toEqual(mockDomainObject);
});
// Pass selection change
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
it("treats a lack of a selection as invalid", function () {
mockScope.ngModelController = jasmine.createSpyObj(
'ngModelController',
[ '$setValidity' ]
);
expect(mockScope.structure.validate).toHaveBeenCalled();
// Change should have been rejected
expect(mockScope.ngModel.someField).not.toEqual(mockDomainObject);
});
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.ngModelController.$setValidity)
.toHaveBeenCalledWith(jasmine.any(String), true);
it("treats a lack of a selection as invalid", function () {
mockScope.ngModelController = jasmine.createSpyObj(
'ngModelController',
[ '$setValidity' ]
);
mockScope.$watch.mostRecentCall.args[1](undefined);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.ngModelController.$setValidity)
.toHaveBeenCalledWith(jasmine.any(String), false);
});
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.ngModelController.$setValidity)
.toHaveBeenCalledWith(jasmine.any(String), true);
mockScope.$watch.mostRecentCall.args[1](undefined);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.ngModelController.$setValidity)
.toHaveBeenCalledWith(jasmine.any(String), false);
});
});
describe("when no context is available", function () {
var defaultRoot = "DEFAULT_ROOT";
beforeEach(function () {
mockContext.getRoot.andReturn(undefined);
getObjectsPromise.then.andCallFake(function(callback){
callback({'ROOT':defaultRoot});
});
controller = new LocatorController(mockScope, mockTimeout, mockObjectService);
});
it("provides a default context where none is available", function () {
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
mockTimeout.mostRecentCall.args[0]();
expect(mockScope.rootObject).toBe(defaultRoot);
});
});
});
}
);

View File

@@ -1,18 +0,0 @@
[
"BrowseController",
"BrowseObjectController",
"PaneController",
"MenuArrowController",
"creation/CreateAction",
"creation/CreateActionProvider",
"creation/CreateMenuController",
"creation/CreateWizard",
"creation/CreationService",
"creation/CreationPolicy",
"creation/LocatorController",
"navigation/NavigateAction",
"navigation/NavigationService",
"windowing/FullscreenAction",
"windowing/NewTabAction",
"windowing/WindowTitler"
]

View File

@@ -1,4 +0,0 @@
[
"DialogService",
"OverlayService"
]

View File

@@ -156,14 +156,11 @@ define([
"name": "Save",
"description": "Save changes made to these objects.",
"depends": [
"$q",
"$location",
"$injector",
"urlService",
"navigationService",
"policyService",
"dialogService",
"creationService"
"creationService",
"copyService"
],
"priority": "mandatory"
},

View File

@@ -36,18 +36,22 @@ define(
* @implements {Action}
* @memberof platform/commonUI/edit
*/
function SaveAction($q, $location, $injector, urlService, navigationService, policyService, dialogService, creationService, context) {
function SaveAction(
$injector,
policyService,
dialogService,
creationService,
copyService,
context
) {
this.domainObject = (context || {}).domainObject;
this.$location = $location;
this.injectObjectService = function(){
this.objectService = $injector.get("objectService");
};
this.urlService = urlService;
this.navigationService = navigationService;
this.policyService = policyService;
this.dialogService = dialogService;
this.creationService = creationService;
this.$q = $q;
this.copyService = copyService;
}
SaveAction.prototype.getObjectService = function(){
@@ -67,77 +71,29 @@ define(
*/
SaveAction.prototype.perform = function () {
var domainObject = this.domainObject,
$location = this.$location,
urlService = this.urlService,
copyService = this.copyService,
self = this;
function resolveWith(object){
return function() {
return function () {
return object;
};
}
function doWizardSave(parent) {
var context = domainObject.getCapability("context"),
wizard = new CreateWizard(domainObject.useCapability('type'), parent, self.policyService, domainObject.getModel());
function mergeObjects(fromObject, toObject){
Object.keys(fromObject).forEach(function(key) {
toObject[key] = fromObject[key];
});
}
// Create and persist the new object, based on user
// input.
function buildObjectFromInput(formValue) {
var parent = wizard.getLocation(formValue),
formModel = wizard.createModel(formValue);
formModel.location = parent.getId();
//Replace domain object model with model collected
// from user form.
domainObject.useCapability("mutation", function(){
//Replace object model with the model from the form
return formModel;
});
return domainObject;
}
function getAllComposees(domainObject){
return domainObject.useCapability('composition');
}
function addComposeesToObject(object){
return function(composees){
return self.$q.all(composees.map(function (composee) {
return object.getCapability('composition').add(composee);
})).then(resolveWith(object));
};
}
/**
* Add the composees of the 'virtual' object to the
* persisted object
* @param object
* @returns {*}
*/
function composeNewObject(object){
if (self.$q.when(object.hasCapability('composition') && domainObject.hasCapability('composition'))) {
return getAllComposees(domainObject)
.then(addComposeesToObject(object));
}
}
wizard = new CreateWizard(
domainObject,
parent,
self.policyService
);
return self.dialogService
.getUserInput(wizard.getFormStructure(), wizard.getInitialFormValue())
.then(buildObjectFromInput);
}
function persistObject(object){
return ((object.hasCapability('editor') && object.getCapability('editor').save(true)) ||
object.getCapability('persistence').persist())
.then(resolveWith(object));
.getUserInput(
wizard.getFormStructure(true),
wizard.getInitialFormValue()
)
.then(wizard.populateObjectFromInput.bind(wizard));
}
function fetchObject(objectId){
@@ -150,14 +106,18 @@ define(
return fetchObject(object.getModel().location);
}
function locateObjectInParent(parent){
parent.getCapability('composition').add(domainObject.getId());
return parent;
function allowClone(objectToClone) {
return (objectToClone.getId() === domainObject.getId()) ||
objectToClone.getCapability('location').isOriginal();
}
function doNothing() {
// Create cancelled, do nothing
return false;
function cloneIntoParent(parent) {
return copyService.perform(domainObject, parent, allowClone);
}
function cancelEditingAfterClone(clonedObject) {
return domainObject.getCapability("editor").cancel()
.then(resolveWith(clonedObject));
}
// Invoke any save behavior introduced by the editor capability;
@@ -167,18 +127,13 @@ define(
function doSave() {
//This is a new 'virtual object' that has not been persisted
// yet.
if (!domainObject.getModel().persisted){
if (domainObject.getModel().persisted === undefined){
return getParent(domainObject)
.then(doWizardSave)
.then(persistObject)
.then(getParent)//Parent may have changed based
// on user selection
.then(locateObjectInParent)
.then(persistObject)
.then(function(){
return fetchObject(domainObject.getId());
})
.catch(doNothing);
.then(doWizardSave)
.then(getParent)
.then(cloneIntoParent)
.then(cancelEditingAfterClone)
.catch(resolveWith(false));
} else {
return domainObject.getCapability("editor").save()
.then(resolveWith(domainObject.getOriginalObject()));
@@ -189,7 +144,7 @@ define(
// UI, which will have been pushed atop the Browse UI.)
function returnToBrowse(object) {
if (object) {
self.navigationService.setNavigation(object);
object.getCapability("action").perform("navigate");
}
return object;
}

View File

@@ -0,0 +1,60 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define*/
define(
['./EditableLookupCapability'],
function (EditableLookupCapability) {
'use strict';
/**
* Wrapper for the "instantiation" capability;
* ensures that any domain objects instantiated in Edit mode
* are also wrapped as EditableDomainObjects.
*
* Meant specifically for use by EditableDomainObject and the
* associated cache; the constructor signature is particular
* to a pattern used there and may contain unused arguments.
* @constructor
* @memberof platform/commonUI/edit
* @implements {CompositionCapability}
*/
return function EditableInstantiationCapability(
contextCapability,
editableObject,
domainObject,
cache
) {
// This is a "lookup" style capability (it looks up other
// domain objects), but we do not want to return the same
// specific value every time (composition may change)
return new EditableLookupCapability(
contextCapability,
editableObject,
domainObject,
cache,
false // Not idempotent
);
};
}
);

View File

@@ -45,7 +45,8 @@ define(
cache,
idempotent
) {
var capability = Object.create(contextCapability);
var capability = Object.create(contextCapability),
method;
// Check for domain object interface. If something has these
// three methods, we assume it's a domain object.
@@ -114,7 +115,9 @@ define(
}
// Wrap all methods; return only editable domain objects.
Object.keys(contextCapability).forEach(wrapMethod);
for (method in contextCapability) {
wrapMethod(method);
}
return capability;
};

View File

@@ -81,7 +81,8 @@ define(
var domainObject = this.domainObject,
editableObject = this.editableObject,
self = this,
cache = this.cache;
cache = this.cache,
returnPromise;
// Update the underlying, "real" domain object's model
// with changes made to the copy used for editing.
@@ -99,14 +100,18 @@ define(
editableObject.getCapability("status").set("editing", false);
if (nonrecursive) {
return resolvePromise(doMutate())
returnPromise = resolvePromise(doMutate())
.then(doPersist)
.then(function(){
self.cancel();
});
} else {
return resolvePromise(cache.saveAll());
returnPromise = resolvePromise(cache.saveAll());
}
//Return the original (non-editable) object
return returnPromise.then(function() {
return domainObject.getOriginalObject ? domainObject.getOriginalObject() : domainObject;
});
};
/**
@@ -120,7 +125,7 @@ define(
EditorCapability.prototype.cancel = function () {
this.editableObject.getCapability("status").set("editing", false);
//TODO: Reset the cache as well here.
this.cache.markClean(this.editableObject);
this.cache.markClean();
return resolvePromise(undefined);
};

View File

@@ -36,6 +36,7 @@ define(
'../capabilities/EditableContextCapability',
'../capabilities/EditableCompositionCapability',
'../capabilities/EditableRelationshipCapability',
'../capabilities/EditableInstantiationCapability',
'../capabilities/EditorCapability',
'../capabilities/EditableActionCapability',
'./EditableDomainObjectCache'
@@ -45,6 +46,7 @@ define(
EditableContextCapability,
EditableCompositionCapability,
EditableRelationshipCapability,
EditableInstantiationCapability,
EditorCapability,
EditableActionCapability,
EditableDomainObjectCache
@@ -56,6 +58,7 @@ define(
context: EditableContextCapability,
composition: EditableCompositionCapability,
relationship: EditableRelationshipCapability,
instantiation: EditableInstantiationCapability,
editor: EditorCapability
};

View File

@@ -126,7 +126,14 @@ define(
* @param {DomainObject} domainObject the domain object
*/
EditableDomainObjectCache.prototype.markClean = function (domainObject) {
delete this.dirtyObjects[domainObject.getId()];
var self = this;
if (!domainObject) {
Object.keys(this.dirtyObjects).forEach(function(key) {
delete self.dirtyObjects[key];
});
} else {
delete this.dirtyObjects[domainObject.getId()];
}
};
/**

View File

@@ -118,6 +118,29 @@ define(
expect(mockContext.getDomainObject.calls.length).toEqual(2);
});
it("wraps inherited methods", function () {
var CapabilityClass = function(){
};
CapabilityClass.prototype.inheritedMethod=function () {
return "an inherited method";
};
mockContext = new CapabilityClass();
capability = new EditableLookupCapability(
mockContext,
mockEditableObject,
mockDomainObject,
factory,
false
);
expect(capability.inheritedMethod()).toEqual("an inherited method");
expect(capability.hasOwnProperty('inheritedMethod')).toBe(true);
// The presence of an own property indicates that the method
// has been wrapped on the object itself and this is a valid
// test that the inherited method has been wrapped.
});
});
}
);

View File

@@ -1,28 +0,0 @@
[
"actions/CancelAction",
"actions/EditAction",
"actions/LinkAction",
"actions/PropertiesAction",
"actions/PropertiesDialog",
"actions/RemoveAction",
"actions/SaveAction",
"capabilities/EditableCompositionCapability",
"capabilities/EditableContextCapability",
"capabilities/EditableLookupCapability",
"capabilities/EditablePersistenceCapability",
"capabilities/EditableRelationshipCapability",
"capabilities/EditorCapability",
"controllers/EditActionController",
"controllers/EditController",
"controllers/EditPanesController",
"directives/MCTBeforeUnload",
"objects/EditableDomainObject",
"objects/EditableDomainObjectCache",
"objects/EditableModelCache",
"policies/EditableViewPolicy",
"policies/EditActionPolicy",
"representers/EditRepresenter",
"representers/EditToolbar",
"representers/EditToolbarRepresenter",
"representers/EditToolbarSelection"
]

View File

@@ -1,4 +0,0 @@
[
"FormatProvider",
"UTCTimeFormat"
]

View File

@@ -119,6 +119,12 @@ define([
]
}
],
"filters": [
{
"implementation": "filters/ReverseFilter.js",
"key": "reverse"
}
],
"stylesheets": [
{
"stylesheetUrl": "css/normalize.min.css",

View File

@@ -1,19 +1,43 @@
{
"metadata": {
"name": "WTD Symbols",
"lastOpened": 1446670352108,
"created": 1446670349721
"lastOpened": 1454115620456,
"created": 1454115616211
},
"iconSets": [
{
"selection": [
{
"order": 119,
"id": 96,
"prevSize": 32,
"code": 58905,
"name": "icon-bullet",
"tempChar": ""
},
{
"order": 117,
"id": 95,
"prevSize": 32,
"code": 58904,
"name": "icon-session",
"tempChar": ""
},
{
"order": 118,
"id": 94,
"prevSize": 32,
"code": 58903,
"name": "icon-topic",
"tempChar": ""
},
{
"order": 116,
"id": 93,
"prevSize": 32,
"code": 58902,
"name": "icon-eye-open-no-gleam",
"tempChar": ""
"tempChar": ""
},
{
"order": 115,
@@ -21,7 +45,7 @@
"prevSize": 32,
"code": 58901,
"name": "icon-eye-open",
"tempChar": ""
"tempChar": ""
},
{
"order": 110,
@@ -29,7 +53,7 @@
"prevSize": 32,
"code": 58899,
"name": "icon-collapse-pane-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 111,
@@ -37,7 +61,7 @@
"prevSize": 32,
"code": 58900,
"name": "icon-collapse-pane-right",
"tempChar": ""
"tempChar": ""
},
{
"order": 109,
@@ -45,7 +69,7 @@
"prevSize": 32,
"code": 58898,
"name": "icon-save",
"tempChar": ""
"tempChar": ""
},
{
"order": 108,
@@ -53,7 +77,7 @@
"prevSize": 32,
"code": 58897,
"name": "icon-dataset",
"tempChar": ""
"tempChar": ""
},
{
"order": 90,
@@ -61,7 +85,7 @@
"prevSize": 32,
"code": 58896,
"name": "icon-bell",
"tempChar": ""
"tempChar": ""
},
{
"order": 91,
@@ -69,7 +93,7 @@
"prevSize": 32,
"code": 58889,
"name": "icon-hourglass",
"tempChar": ""
"tempChar": ""
},
{
"order": 92,
@@ -82,7 +106,7 @@
58890
],
"name": "icon-info-v15",
"tempChar": ""
"tempChar": ""
},
{
"order": 93,
@@ -90,7 +114,7 @@
"prevSize": 32,
"code": 58887,
"name": "icon-x-in-circle",
"tempChar": ""
"tempChar": ""
},
{
"order": 94,
@@ -98,7 +122,7 @@
"prevSize": 32,
"code": 58881,
"name": "icon-datatable",
"tempChar": ""
"tempChar": ""
},
{
"order": 95,
@@ -106,7 +130,7 @@
"prevSize": 32,
"code": 58882,
"name": "icon-tabular-scrolling",
"tempChar": ""
"tempChar": ""
},
{
"order": 96,
@@ -114,7 +138,7 @@
"prevSize": 32,
"code": 58884,
"name": "icon-tabular",
"tempChar": ""
"tempChar": ""
},
{
"order": 97,
@@ -122,7 +146,7 @@
"prevSize": 32,
"code": 58885,
"name": "icon-calendar",
"tempChar": ""
"tempChar": ""
},
{
"order": 98,
@@ -130,7 +154,7 @@
"prevSize": 32,
"code": 58886,
"name": "icon-paint-bucket",
"tempChar": ""
"tempChar": ""
},
{
"order": 99,
@@ -138,7 +162,7 @@
"prevSize": 32,
"code": 123,
"name": "icon-pointer-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 100,
@@ -146,7 +170,7 @@
"prevSize": 32,
"code": 125,
"name": "icon-pointer-right",
"tempChar": ""
"tempChar": ""
},
{
"order": 101,
@@ -154,7 +178,7 @@
"prevSize": 32,
"code": 80,
"name": "icon-person",
"tempChar": ""
"tempChar": ""
},
{
"order": 102,
@@ -162,7 +186,7 @@
"prevSize": 32,
"code": 232,
"name": "icon-chain-links",
"tempChar": ""
"tempChar": ""
},
{
"order": 103,
@@ -170,7 +194,7 @@
"prevSize": 32,
"code": 115,
"name": "icon-database-in-brackets",
"tempChar": ""
"tempChar": ""
},
{
"order": 104,
@@ -178,7 +202,7 @@
"prevSize": 32,
"code": 114,
"name": "icon-refresh",
"tempChar": ""
"tempChar": ""
},
{
"order": 105,
@@ -186,7 +210,7 @@
"prevSize": 32,
"code": 108,
"name": "icon-lock",
"tempChar": ""
"tempChar": ""
},
{
"order": 106,
@@ -194,7 +218,7 @@
"prevSize": 32,
"code": 51,
"name": "icon-box-with-dashed-lines",
"tempChar": ""
"tempChar": ""
},
{
"order": 10,
@@ -202,7 +226,7 @@
"prevSize": 32,
"code": 58880,
"name": "icon-box-with-arrow-cursor",
"tempChar": ""
"tempChar": ""
},
{
"order": 11,
@@ -210,7 +234,7 @@
"prevSize": 32,
"code": 65,
"name": "icon-activity-mode",
"tempChar": ""
"tempChar": ""
},
{
"order": 12,
@@ -218,7 +242,7 @@
"prevSize": 32,
"code": 97,
"name": "icon-activity",
"tempChar": ""
"tempChar": ""
},
{
"order": 87,
@@ -226,7 +250,7 @@
"prevSize": 32,
"code": 33,
"name": "icon-alert-rect",
"tempChar": ""
"tempChar": ""
},
{
"order": 14,
@@ -234,7 +258,7 @@
"prevSize": 32,
"code": 58883,
"name": "icon-alert-triangle",
"tempChar": ""
"tempChar": ""
},
{
"order": 15,
@@ -242,7 +266,7 @@
"prevSize": 32,
"code": 238,
"name": "icon-arrow-double-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 16,
@@ -250,7 +274,7 @@
"prevSize": 32,
"code": 235,
"name": "icon-arrow-double-up",
"tempChar": ""
"tempChar": ""
},
{
"order": 2,
@@ -258,7 +282,7 @@
"prevSize": 32,
"code": 118,
"name": "icon-arrow-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 19,
@@ -266,7 +290,7 @@
"prevSize": 32,
"code": 60,
"name": "icon-arrow-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 20,
@@ -274,7 +298,7 @@
"prevSize": 32,
"code": 62,
"name": "icon-arrow-right",
"tempChar": ""
"tempChar": ""
},
{
"order": 21,
@@ -282,7 +306,7 @@
"prevSize": 32,
"code": 236,
"name": "icon-arrow-tall-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 22,
@@ -290,7 +314,7 @@
"prevSize": 32,
"code": 237,
"name": "icon-arrow-tall-up",
"tempChar": ""
"tempChar": ""
},
{
"order": 23,
@@ -298,7 +322,7 @@
"prevSize": 32,
"code": 94,
"name": "icon-arrow-up",
"tempChar": ""
"tempChar": ""
},
{
"order": 24,
@@ -306,7 +330,7 @@
"prevSize": 32,
"code": 73,
"name": "icon-arrows-out",
"tempChar": ""
"tempChar": ""
},
{
"order": 25,
@@ -314,7 +338,7 @@
"prevSize": 32,
"code": 58893,
"name": "icon-arrows-right-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 33,
@@ -322,7 +346,7 @@
"prevSize": 32,
"code": 53,
"name": "icon-arrows-up-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 26,
@@ -330,7 +354,7 @@
"prevSize": 32,
"code": 42,
"name": "icon-asterisk",
"tempChar": ""
"tempChar": ""
},
{
"order": 27,
@@ -338,7 +362,7 @@
"prevSize": 32,
"code": 72,
"name": "icon-autoflow-tabular",
"tempChar": ""
"tempChar": ""
},
{
"order": 28,
@@ -346,7 +370,7 @@
"prevSize": 32,
"code": 224,
"name": "icon-box",
"tempChar": ""
"tempChar": ""
},
{
"order": 29,
@@ -354,7 +378,7 @@
"prevSize": 32,
"code": 50,
"name": "icon-check",
"tempChar": ""
"tempChar": ""
},
{
"order": 30,
@@ -362,7 +386,7 @@
"prevSize": 32,
"code": 67,
"name": "icon-clock",
"tempChar": ""
"tempChar": ""
},
{
"order": 31,
@@ -370,7 +394,7 @@
"prevSize": 32,
"code": 46,
"name": "icon-connectivity",
"tempChar": ""
"tempChar": ""
},
{
"order": 32,
@@ -378,7 +402,7 @@
"prevSize": 32,
"code": 100,
"name": "icon-database-query",
"tempChar": ""
"tempChar": ""
},
{
"order": 17,
@@ -386,7 +410,7 @@
"prevSize": 32,
"code": 68,
"name": "icon-database",
"tempChar": ""
"tempChar": ""
},
{
"order": 35,
@@ -394,7 +418,7 @@
"prevSize": 32,
"code": 81,
"name": "icon-dictionary",
"tempChar": ""
"tempChar": ""
},
{
"order": 36,
@@ -402,7 +426,7 @@
"prevSize": 32,
"code": 242,
"name": "icon-duplicate",
"tempChar": ""
"tempChar": ""
},
{
"order": 37,
@@ -410,7 +434,7 @@
"prevSize": 32,
"code": 102,
"name": "icon-folder-new",
"tempChar": ""
"tempChar": ""
},
{
"order": 38,
@@ -418,7 +442,7 @@
"prevSize": 32,
"code": 70,
"name": "icon-folder",
"tempChar": ""
"tempChar": ""
},
{
"order": 39,
@@ -426,7 +450,7 @@
"prevSize": 32,
"code": 95,
"name": "icon-fullscreen-collapse",
"tempChar": ""
"tempChar": ""
},
{
"order": 40,
@@ -434,7 +458,7 @@
"prevSize": 32,
"code": 122,
"name": "icon-fullscreen-expand",
"tempChar": ""
"tempChar": ""
},
{
"order": 41,
@@ -442,7 +466,7 @@
"prevSize": 32,
"code": 71,
"name": "icon-gear",
"tempChar": ""
"tempChar": ""
},
{
"order": 49,
@@ -450,7 +474,7 @@
"prevSize": 32,
"code": 227,
"name": "icon-image",
"tempChar": ""
"tempChar": ""
},
{
"order": 42,
@@ -458,7 +482,7 @@
"prevSize": 32,
"code": 225,
"name": "icon-layers",
"tempChar": ""
"tempChar": ""
},
{
"order": 43,
@@ -466,7 +490,7 @@
"prevSize": 32,
"code": 76,
"name": "icon-layout",
"tempChar": ""
"tempChar": ""
},
{
"order": 44,
@@ -474,7 +498,7 @@
"prevSize": 32,
"code": 226,
"name": "icon-line-horz",
"tempChar": ""
"tempChar": ""
},
{
"order": 75,
@@ -482,7 +506,7 @@
"prevSize": 32,
"code": 244,
"name": "icon-link",
"tempChar": ""
"tempChar": ""
},
{
"order": 46,
@@ -490,7 +514,7 @@
"prevSize": 32,
"code": 88,
"name": "icon-magnify-in",
"tempChar": ""
"tempChar": ""
},
{
"order": 47,
@@ -498,7 +522,7 @@
"prevSize": 32,
"code": 89,
"name": "icon-magnify-out",
"tempChar": ""
"tempChar": ""
},
{
"order": 48,
@@ -506,7 +530,7 @@
"prevSize": 32,
"code": 77,
"name": "icon-magnify",
"tempChar": ""
"tempChar": ""
},
{
"order": 34,
@@ -514,7 +538,7 @@
"prevSize": 32,
"code": 109,
"name": "icon-menu",
"tempChar": ""
"tempChar": ""
},
{
"order": 50,
@@ -522,7 +546,7 @@
"prevSize": 32,
"code": 243,
"name": "icon-move",
"tempChar": ""
"tempChar": ""
},
{
"order": 51,
@@ -530,7 +554,7 @@
"prevSize": 32,
"code": 121,
"name": "icon-new-window",
"tempChar": ""
"tempChar": ""
},
{
"order": 52,
@@ -538,7 +562,7 @@
"prevSize": 32,
"code": 111,
"name": "icon-object",
"tempChar": ""
"tempChar": ""
},
{
"order": 73,
@@ -546,7 +570,7 @@
"prevSize": 32,
"code": 63,
"name": "icon-object-unknown",
"tempChar": ""
"tempChar": ""
},
{
"order": 53,
@@ -554,7 +578,7 @@
"prevSize": 32,
"code": 86,
"name": "icon-packet",
"tempChar": ""
"tempChar": ""
},
{
"order": 54,
@@ -562,7 +586,7 @@
"prevSize": 32,
"code": 234,
"name": "icon-page",
"tempChar": ""
"tempChar": ""
},
{
"order": 55,
@@ -570,7 +594,7 @@
"prevSize": 32,
"code": 241,
"name": "icon-pause",
"tempChar": ""
"tempChar": ""
},
{
"order": 56,
@@ -578,7 +602,7 @@
"prevSize": 32,
"code": 112,
"name": "icon-pencil",
"tempChar": ""
"tempChar": ""
},
{
"order": 65,
@@ -586,7 +610,7 @@
"prevSize": 32,
"code": 79,
"name": "icon-people",
"tempChar": ""
"tempChar": ""
},
{
"order": 57,
@@ -594,7 +618,7 @@
"prevSize": 32,
"code": 239,
"name": "icon-play",
"tempChar": ""
"tempChar": ""
},
{
"order": 58,
@@ -602,7 +626,7 @@
"prevSize": 32,
"code": 233,
"name": "icon-plot-resource",
"tempChar": ""
"tempChar": ""
},
{
"order": 59,
@@ -610,7 +634,7 @@
"prevSize": 32,
"code": 43,
"name": "icon-plus",
"tempChar": ""
"tempChar": ""
},
{
"order": 60,
@@ -618,7 +642,7 @@
"prevSize": 32,
"code": 45,
"name": "icon-minus",
"tempChar": ""
"tempChar": ""
},
{
"order": 61,
@@ -626,7 +650,7 @@
"prevSize": 32,
"code": 54,
"name": "icon-sine",
"tempChar": ""
"tempChar": ""
},
{
"order": 62,
@@ -634,7 +658,7 @@
"prevSize": 32,
"code": 228,
"name": "icon-T",
"tempChar": ""
"tempChar": ""
},
{
"order": 63,
@@ -642,7 +666,7 @@
"prevSize": 32,
"code": 116,
"name": "icon-telemetry-panel",
"tempChar": ""
"tempChar": ""
},
{
"order": 64,
@@ -650,7 +674,7 @@
"prevSize": 32,
"code": 84,
"name": "icon-telemetry",
"tempChar": ""
"tempChar": ""
},
{
"order": 18,
@@ -658,7 +682,7 @@
"prevSize": 32,
"code": 246,
"name": "icon-thumbs-strip",
"tempChar": ""
"tempChar": ""
},
{
"order": 67,
@@ -666,7 +690,7 @@
"prevSize": 32,
"code": 83,
"name": "icon-timeline",
"tempChar": ""
"tempChar": ""
},
{
"order": 68,
@@ -674,7 +698,7 @@
"prevSize": 32,
"code": 245,
"name": "icon-timer",
"tempChar": ""
"tempChar": ""
},
{
"order": 69,
@@ -682,7 +706,7 @@
"prevSize": 32,
"code": 90,
"name": "icon-trash",
"tempChar": ""
"tempChar": ""
},
{
"order": 70,
@@ -690,7 +714,7 @@
"prevSize": 32,
"code": 229,
"name": "icon-two-parts-both",
"tempChar": ""
"tempChar": ""
},
{
"order": 71,
@@ -698,7 +722,7 @@
"prevSize": 32,
"code": 231,
"name": "icon-two-parts-one-only",
"tempChar": ""
"tempChar": ""
},
{
"order": 72,
@@ -706,7 +730,7 @@
"prevSize": 32,
"code": 120,
"name": "icon-x-heavy",
"tempChar": ""
"tempChar": ""
},
{
"order": 66,
@@ -714,7 +738,7 @@
"prevSize": 32,
"code": 58946,
"name": "icon-x",
"tempChar": ""
"tempChar": ""
}
],
"id": 2,
@@ -729,6 +753,58 @@
"height": 1024,
"prevSize": 32,
"icons": [
{
"id": 96,
"paths": [
"M832 752c0 44-36 80-80 80h-480c-44 0-80-36-80-80v-480c0-44 36-80 80-80h480c44 0 80 36 80 80v480z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-bullet"
],
"colorPermutations": {
"16161751": []
}
},
{
"id": 95,
"paths": [
"M101.2 287.6c57.2-69.6 118.6-104.8 182.8-104.8s125.6 35.2 182.8 104.8c51.4 62.6 89.8 141.2 112.6 196.2 27.6 65.8 58.8 121 90.6 159.6 10 12 44.2 51.4 69.8 51.4 6.4 0 30.4-3.8 69.8-51.4 31.8-38.6 63.2-93.8 90.6-159.6 23-55 61.2-133.6 112.6-196.2 3.6-4.4 7.2-8.6 10.8-12.8v-18.8c0.4-140.8-114.8-256-255.6-256h-512c-140.8 0-256 115.2-256 256v201c23.4-51.8 57.4-116.4 101.2-169.4zM744 182c54 0 106.4 24.4 156 72.8-31.6 44.6-57.4 92.2-77.6 134.2-33.4-42-61.8-59.4-78.4-59.4-17.4 0-47.8 19.2-83.2 65.8-27-57.6-54-102.4-77.4-136 51-51.2 104.8-77.4 160.6-77.4z",
"M922.8 736.4c-57.2 69.6-118.8 104.8-182.8 104.8s-125.6-35.2-182.8-104.8c-51.4-62.6-89.8-141.2-112.6-196.2-27.6-65.8-58.8-121-90.6-159.6-10-12-44.2-51.4-69.8-51.4-6.4 0-30.4 3.8-69.8 51.4-31.8 38.6-63.2 93.8-90.6 159.6-23 55-61.2 133.6-112.6 196.2-3.6 4.4-7.2 8.6-10.8 12.8v18.8c0 140.8 115.2 256 256 256h512c140.8 0 256-115.2 256-256v-201c-23.8 51.8-57.8 116.4-101.6 169.4zM280 842c-54 0-106.4-24.4-156-72.8 31.6-44.6 57.4-92.2 77.6-134.2 33.4 42 61.8 59.4 78.4 59.4 17.4 0 47.8-19.2 83.2-65.8 27 57.6 54 102.4 77.4 136-51 51.2-104.8 77.4-160.6 77.4z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-session"
],
"colorPermutations": {
"16161751": [],
"125525525516161751": []
}
},
{
"id": 94,
"paths": [
"M832 0h-128v192h127.6c0.2 0 0.2 0.2 0.4 0.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-127.6v192h128c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192z",
"M192 831.6v-639.4c0-0.2 0.2-0.2 0.4-0.4h127.6v-191.8h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192h-127.6c-0.2 0-0.4-0.2-0.4-0.4z",
"M686 384c7.2 0 21 7.4 38.6 25.8 11.8-24.8 26.4-52.2 43.4-79v-50c-26.4-16.4-53.8-24.6-82-24.6-37.6 0-74.2 14.8-108.8 44.2 27.4 37.8 49.6 78.6 66.2 113.8 19.4-21.6 34.8-30.2 42.6-30.2z",
"M338 640c-7.2 0-21-7.4-38.6-25.8-11.8 24.8-26.4 52.2-43.4 79v74.8h82c37.6 0 74.2-14.8 108.8-44.2-27.4-37.8-49.6-78.6-66.2-113.8-19.4 21.4-34.8 30-42.6 30z",
"M768 544.2c-38.2 70.6-72.8 95.8-85 95.8-15 0-64.2-38.4-112-152.8-17.4-41.8-46.6-101.6-85.8-149.4-44.8-54.4-93.2-82-144.2-82-29.2 0-57.6 9-85 27v196.8c38.2-70.6 72.8-95.8 85-95.8 15 0 64.2 38.4 112 152.8 17.4 41.8 46.6 101.6 85.8 149.4 44.8 54.4 93.2 82 144.2 82 29.2 0 57.6-9 85-27v-196.8z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-topic"
],
"colorPermutations": {
"16161751": [],
"125525525516161751": []
}
},
{
"id": 93,
"paths": [
@@ -749,6 +825,10 @@
"icon-eye-open-no-gleam"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -775,6 +855,10 @@
"icon-crosshair"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -801,6 +885,10 @@
"icon-collapse-pane-left"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -827,6 +915,10 @@
"icon-collapse-pane-right"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -853,6 +945,10 @@
"icon-save-v2"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -872,6 +968,7 @@
"icon-dataset"
],
"colorPermutations": {
"16161751": [],
"125525525516161751": []
}
},
@@ -895,6 +992,10 @@
"icon-bell"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -921,6 +1022,10 @@
"icon-hourglass"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -943,6 +1048,9 @@
"icon-info-v1.5"
],
"colorPermutations": {
"16161751": [
0
],
"125525525516161751": [
0
]
@@ -1336,6 +1444,10 @@
"icon-box-with-arrow-cursor"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -2367,12 +2479,6 @@
161,
75,
1
],
[
255,
255,
255,
1
]
]
],

View File

@@ -94,5 +94,8 @@
<glyph unicode="&#xe614;" glyph-name="icon-collapse-pane-right" d="M768 960h256v-1024h-256c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192zM512 640l-512-320v640z" />
<glyph unicode="&#xe615;" glyph-name="icon-eye-open" d="M512 896c-261 0-480.6-195.4-512-448 31.4-252.6 251-448 512-448s480.6 195.4 512 448c-31.4 252.6-251 448-512 448zM768.2 225.4c-71.4-62.8-162.8-97.4-257.6-97.4s-186.2 34.6-257.6 97.4c-66.6 58.6-110.6 137.2-125 222.6 0 0 0 0.2 0 0.2 76.8 154 220.8 257.6 384 257.6s307.2-103.8 384-257.6c0 0 0-0.2 0-0.2-14.4-85.4-61.2-164-127.8-222.6zM512 672c-123.8 0-224-100.2-224-224s100.2-224 224-224 224 100.2 224 224-100.2 224-224 224z" />
<glyph unicode="&#xe616;" glyph-name="icon-eye-open-no-gleam" d="M512 896c-261 0-480.6-195.4-512-448 31.4-252.6 251-448 512-448s480.6 195.4 512 448c-31.4 252.6-251 448-512 448zM768.2 225.4c-71.4-62.8-162.8-97.4-257.6-97.4s-186.2 34.6-257.6 97.4c-66.6 58.6-110.6 137.2-125 222.6 0 0 0 0.2 0 0.2 76.8 154 220.8 257.6 384 257.6s307.2-103.8 384-257.6c0 0 0-0.2 0-0.2-14.4-85.4-61.2-164-127.8-222.6zM512 672c-123.8 0-224-100.2-224-224s100.2-224 224-224 224 100.2 224 224-100.2 224-224 224zM576 416c-53 0-96 43-96 96s43 96 96 96 96-43 96-96c0-53-43-96-96-96z" />
<glyph unicode="&#xe617;" glyph-name="icon-topic" d="M832 960h-128v-192h127.6c0.2 0 0.2-0.2 0.4-0.4v-639.4c0-0.2-0.2-0.2-0.4-0.4h-127.6v-192h128c105.6 0 192 86.4 192 192v640.2c0 105.6-86.4 192-192 192zM192 128.4v639.4c0 0.2 0.2 0.2 0.4 0.4h127.6v191.8h-128c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h128v192h-127.6c-0.2 0-0.4 0.2-0.4 0.4zM686 576c7.2 0 21-7.4 38.6-25.8 11.8 24.8 26.4 52.2 43.4 79v50c-26.4 16.4-53.8 24.6-82 24.6-37.6 0-74.2-14.8-108.8-44.2 27.4-37.8 49.6-78.6 66.2-113.8 19.4 21.6 34.8 30.2 42.6 30.2zM338 320c-7.2 0-21 7.4-38.6 25.8-11.8-24.8-26.4-52.2-43.4-79v-74.8h82c37.6 0 74.2 14.8 108.8 44.2-27.4 37.8-49.6 78.6-66.2 113.8-19.4-21.4-34.8-30-42.6-30zM768 415.8c-38.2-70.6-72.8-95.8-85-95.8-15 0-64.2 38.4-112 152.8-17.4 41.8-46.6 101.6-85.8 149.4-44.8 54.4-93.2 82-144.2 82-29.2 0-57.6-9-85-27v-196.8c38.2 70.6 72.8 95.8 85 95.8 15 0 64.2-38.4 112-152.8 17.4-41.8 46.6-101.6 85.8-149.4 44.8-54.4 93.2-82 144.2-82 29.2 0 57.6 9 85 27v196.8z" />
<glyph unicode="&#xe618;" glyph-name="icon-session" d="M101.2 672.4c57.2 69.6 118.6 104.8 182.8 104.8s125.6-35.2 182.8-104.8c51.4-62.6 89.8-141.2 112.6-196.2 27.6-65.8 58.8-121 90.6-159.6 10-12 44.2-51.4 69.8-51.4 6.4 0 30.4 3.8 69.8 51.4 31.8 38.6 63.2 93.8 90.6 159.6 23 55 61.2 133.6 112.6 196.2 3.6 4.4 7.2 8.6 10.8 12.8v18.8c0.4 140.8-114.8 256-255.6 256h-512c-140.8 0-256-115.2-256-256v-201c23.4 51.8 57.4 116.4 101.2 169.4zM744 778c54 0 106.4-24.4 156-72.8-31.6-44.6-57.4-92.2-77.6-134.2-33.4 42-61.8 59.4-78.4 59.4-17.4 0-47.8-19.2-83.2-65.8-27 57.6-54 102.4-77.4 136 51 51.2 104.8 77.4 160.6 77.4zM922.8 223.6c-57.2-69.6-118.8-104.8-182.8-104.8s-125.6 35.2-182.8 104.8c-51.4 62.6-89.8 141.2-112.6 196.2-27.6 65.8-58.8 121-90.6 159.6-10 12-44.2 51.4-69.8 51.4-6.4 0-30.4-3.8-69.8-51.4-31.8-38.6-63.2-93.8-90.6-159.6-23-55-61.2-133.6-112.6-196.2-3.6-4.4-7.2-8.6-10.8-12.8v-18.8c0-140.8 115.2-256 256-256h512c140.8 0 256 115.2 256 256v201c-23.8-51.8-57.8-116.4-101.6-169.4zM280 118c-54 0-106.4 24.4-156 72.8 31.6 44.6 57.4 92.2 77.6 134.2 33.4-42 61.8-59.4 78.4-59.4 17.4 0 47.8 19.2 83.2 65.8 27-57.6 54-102.4 77.4-136-51-51.2-104.8-77.4-160.6-77.4z" />
<glyph unicode="&#xe619;" glyph-name="icon-bullet" d="M832 208c0-44-36-80-80-80h-480c-44 0-80 36-80 80v480c0 44 36 80 80 80h480c44 0 80-36 80-80v-480z" />
<glyph unicode="&#xe642;" glyph-name="icon-x" d="M384 448l-365.332-365.332c-24.89-24.89-24.89-65.62 0-90.51l37.49-37.49c24.89-24.89 65.62-24.89 90.51 0 0 0 365.332 365.332 365.332 365.332l365.332-365.332c24.89-24.89 65.62-24.89 90.51 0l37.49 37.49c24.89 24.89 24.89 65.62 0 90.51l-365.332 365.332c0 0 365.332 365.332 365.332 365.332 24.89 24.89 24.89 65.62 0 90.51l-37.49 37.49c-24.89 24.89-65.62 24.89-90.51 0 0 0-365.332-365.332-365.332-365.332l-365.332 365.332c-24.89 24.89-65.62 24.89-90.51 0l-37.49-37.49c-24.89-24.89-24.89-65.62 0-90.51 0 0 365.332-365.332 365.332-365.332z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -41,16 +41,9 @@ mct-representation {
.t-item-icon {
&:before {
$spinBW: 4px;
$spinD: 0;
@include spinner($spinBW);
content: "";
display: block;
position: absolute;
left: 50%;
top: 50%;
padding: 30%;
width: $spinD;
height: $spinD;
}
.t-item-icon-glyph {
display: none;
@@ -63,7 +56,8 @@ mct-representation {
}
}
}
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba($colorItemTreeSelectedFg, 0.25);
border-top-color: rgba($colorItemTreeSelectedFg, 1.0);
border-color: rgba($colorItemTreeSelectedFg, 0.25) !important;
border-top-color: rgba($colorItemTreeSelectedFg, 1.0) !important;
}

View File

@@ -20,62 +20,37 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
@include keyframes(rotation) {
0% { transform: rotate(0deg); }
100% { transform: rotate(359deg); }
100% { @include transform(rotate(360deg)); }
}
@mixin spinner($b: 5px) {
@include keyframes(rotateCentered) {
0% { @include transform(translateX(-50%) translateY(-50%) rotate(0deg)); }
100% { @include transform(translateX(-50%) translateY(-50%) rotate(359deg)); }
}
@include animation-name(rotateCentered);
@include keyframes(rotation-centered) {
0% { @include transform(translate(-50%, -50%) rotate(0deg)); }
100% { @include transform(translate(-50%, -50%) rotate(360deg)); }
}
@mixin spinner($b: 5px, $c: $colorKey) {
@include transform-origin(center);
@include animation-name(rotation-centered);
@include animation-duration(0.5s);
@include animation-iteration-count(infinite);
@include animation-timing-function(linear);
@include transform-origin(center);
border-style: solid;
border-width: $b;
@include border-radius(100%);
}
@mixin wait-spinner2($b: 5px, $c: $colorAlt1) {
@include spinner($b);
@include box-sizing(border-box);
border-color: rgba($c, 0.25);
border-top-color: rgba($c, 1.0);
border-style: solid;
border-width: $b;
display: block;
position: absolute;
height: 0; width: 0;
padding: 7%;
left: 50%; top: 50%;
}
@mixin wait-spinner($b: 5px, $c: $colorAlt1) {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
border-color: rgba($c, 0.25);
border-top-color: rgba($c, 1.0);
border-style: solid;
border-width: $b;
@include border-radius(100%);
}
.t-wait-spinner,
.wait-spinner {
$d: 5%;
@include wait-spinner(0.5em, $colorKey);
top: 50%; left: 50%;
@include spinner(0.5em, $colorKey);
height: auto; width: auto;
padding: $d; // Will size object based on parent container WIDTH
pointer-events: none;
margin-top: $d / -1;
margin-left: $d / -1;
z-index: 2;
&.inline {
display: inline-block !important;
@@ -85,46 +60,15 @@
}
}
.l-wait-spinner-holder {
pointer-events: none;
position: absolute;
&.align-left {
.t-wait-spinner {
left: 0;
margin-left: 0;
}
}
&.full-size {
display: inline-block;
height: 100%; width: 100%;
.t-wait-spinner {
top: 0;
margin-top: 0;
padding: 30%;
}
}
}
.treeview .wait-spinner {
// Only used in subtree.html, which I don't think this is actually being used
$d: 10px;
@include wait-spinner(0.25em, $colorKey);
height: $d; width: $d;
margin: 0 !important;
padding: 0 !important;
top: 2px; left: 0;
}
.wait-spinner.sm {
$d: 13px;
@include wait-spinner(0.25em, $colorKey);
height: $d; width: $d;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
top: 0; left: 0;
}
.loading {
// Can be applied to any block element with height and width
pointer-events: none;
@@ -133,7 +77,8 @@
content: '';
}
&:before {
@include wait-spinner2(5px, $colorLoadingFg);
@include spinner(5px, $colorLoadingFg);
padding: 5%;
z-index: 10;
}
&:after {
@@ -146,5 +91,4 @@
padding: $menuLineH / 4;
border-width: 2px;
}
}

View File

@@ -266,6 +266,8 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa
.gl-plot-tick,
.tick-label {
direction: rtl;
unicode-bidi:bidi-override;
font-size: 0.7rem;
position: absolute;
overflow: hidden;

View File

@@ -34,7 +34,6 @@ ul.tree {
.tree-item,
.search-result-item {
$runningItemW: 0;
@extend .l-flex-row;
@include box-sizing(border-box);
@include border-radius($basicCr);
@@ -129,26 +128,13 @@ mct-representation {
.t-object-label {
.t-item-icon {
&:before {
$spinBW: 4px;
@include spinner($spinBW);
border-color: rgba($colorItemTreeIcon, 0.25);
border-top-color: rgba($colorItemTreeIcon, 1.0);
}
.t-item-icon-glyph {
display: none;
}
}
.t-title-label {
font-style: italic;
opacity: 0.6;
}
}
}
}
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba($colorItemTreeSelectedFg, 0.25);
border-top-color: rgba($colorItemTreeSelectedFg, 1.0);
}
.tree .s-status-editing,
.search-results .s-status-editing {

View File

@@ -24,7 +24,11 @@
<input type="text"
ng-model="textValue"
ng-blur="restoreTextValue(); ngBlur()"
ng-class="{ error: textInvalid }">
ng-class="{
error: textInvalid ||
(structure.validate &&
!structure.validate(ngModel[field]))
}">
</input>
<a class="ui-symbol icon icon-calendar"
ng-if="structure.format === 'utc' || !structure.format"

View File

@@ -25,7 +25,7 @@
<span class="l-time-range-inputs-elem ui-symbol type-icon">&#x43;</span>
<span class="l-time-range-input">
<mct-control key="'datetime-field'"
structure="{ format: parameters.format }"
structure="{ format: parameters.format, validate: validateStart }"
ng-model="formModel"
ng-blur="updateBoundsFromForm()"
field="'start'"
@@ -37,7 +37,7 @@
<span class="l-time-range-input" ng-controller="ToggleController as t2">
<mct-control key="'datetime-field'"
structure="{ format: parameters.format }"
structure="{ format: parameters.format, validate: validateEnd }"
ng-model="formModel"
ng-blur="updateBoundsFromForm()"
field="'end'"

View File

@@ -43,7 +43,7 @@ define(
function TimeRangeController($scope, formatService, defaultFormat, now) {
var tickCount = 2,
innerMinimumSpan = 1000, // 1 second
outerMinimumSpan = 1000 * 60 * 60, // 1 hour
outerMinimumSpan = 1000, // 1 second
initialDragValue,
formatter = formatService.getFormat(defaultFormat);
@@ -185,13 +185,6 @@ define(
function updateOuterStart(t) {
var ngModel = $scope.ngModel;
ngModel.outer.start = t;
ngModel.outer.end = Math.max(
ngModel.outer.start + outerMinimumSpan,
ngModel.outer.end
);
ngModel.inner.start =
Math.max(ngModel.outer.start, ngModel.inner.start);
ngModel.inner.end = Math.max(
@@ -207,13 +200,6 @@ define(
function updateOuterEnd(t) {
var ngModel = $scope.ngModel;
ngModel.outer.end = t;
ngModel.outer.start = Math.min(
ngModel.outer.end - outerMinimumSpan,
ngModel.outer.start
);
ngModel.inner.end =
Math.min(ngModel.outer.end, ngModel.inner.end);
ngModel.inner.start = Math.min(
@@ -233,11 +219,20 @@ define(
}
function updateBoundsFromForm() {
$scope.ngModel = $scope.ngModel || {};
$scope.ngModel.outer = {
start: $scope.formModel.start,
end: $scope.formModel.end
};
var start = $scope.formModel.start,
end = $scope.formModel.end;
if (end >= start + outerMinimumSpan) {
$scope.ngModel = $scope.ngModel || {};
$scope.ngModel.outer = { start: start, end: end };
}
}
function validateStart(startValue) {
return startValue <= $scope.formModel.end - outerMinimumSpan;
}
function validateEnd(endValue) {
return endValue >= $scope.formModel.start + outerMinimumSpan;
}
$scope.startLeftDrag = startLeftDrag;
@@ -249,6 +244,9 @@ define(
$scope.updateBoundsFromForm = updateBoundsFromForm;
$scope.validateStart = validateStart;
$scope.validateEnd = validateEnd;
$scope.ticks = [];
// Initialize scope to defaults

View File

@@ -0,0 +1,44 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define*/
define(function () {
'use strict';
/**
* Implements the `reverse` filter, which reverses text strings.
* Useful in cases where text should be reversed for presentational
* reasons (e.g. in conjunction with CSS tricks involing text direction),
* allowing such behavior to be handled independently from the controller
* layer.
*
* @constructor
* @memberof platform/commonUI/general
*/
function ReverseFilter() {
return function reverse(value) {
return value && value.toString().split('').reverse().join('');
};
}
return ReverseFilter;
});

View File

@@ -91,6 +91,24 @@ define(
.toHaveBeenCalledWith("ngModel", jasmine.any(Function));
});
it("exposes start time validator", function () {
var testValue = 42000000;
mockScope.formModel = { end: testValue };
expect(mockScope.validateStart(testValue + 1))
.toBe(false);
expect(mockScope.validateStart(testValue - 60 * 60 * 1000 - 1))
.toBe(true);
});
it("exposes end time validator", function () {
var testValue = 42000000;
mockScope.formModel = { start: testValue };
expect(mockScope.validateEnd(testValue - 1))
.toBe(false);
expect(mockScope.validateEnd(testValue + 60 * 60 * 1000 + 1))
.toBe(true);
});
describe("when changes are made via form entry", function () {
beforeEach(function () {
mockScope.ngModel = {
@@ -194,26 +212,6 @@ define(
fireWatchCollection("ngModel", mockScope.ngModel);
});
it("enforces a minimum outer span", function () {
mockScope.ngModel.outer.end =
mockScope.ngModel.outer.start - DAY * 100;
fireWatch(
"ngModel.outer.end",
mockScope.ngModel.outer.end
);
expect(mockScope.ngModel.outer.end)
.toBeGreaterThan(mockScope.ngModel.outer.start);
mockScope.ngModel.outer.start =
mockScope.ngModel.outer.end + DAY * 100;
fireWatch(
"ngModel.outer.start",
mockScope.ngModel.outer.start
);
expect(mockScope.ngModel.outer.end)
.toBeGreaterThan(mockScope.ngModel.outer.start);
});
it("enforces a minimum inner span when outer span changes", function () {
mockScope.ngModel.outer.end =
mockScope.ngModel.outer.start - DAY * 100;

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
define(
['../../src/filters/ReverseFilter'],
function (ReverseFilter) {
'use strict';
describe("The reverse filter", function () {
var reverse;
beforeEach(function () {
reverse = new ReverseFilter();
});
it("reverses text", function () {
expect(reverse('foo')).toEqual('oof');
});
it("returns undefined for undefined inputs", function () {
expect(reverse(undefined)).toBeUndefined();
});
});
}
);

View File

@@ -20,6 +20,7 @@
"directives/MCTScroll",
"directives/MCTSplitPane",
"directives/MCTSplitter",
"filters/ReverseFilter",
"services/Popup",
"services/PopupService",
"services/UrlService",

View File

@@ -1,5 +0,0 @@
[
"gestures/InfoGesture",
"gestures/InfoButtonGesture",
"services/InfoService"
]

View File

@@ -1,6 +0,0 @@
[
"AgentService",
"DeviceClassifier",
"DeviceMatchers",
"MCTDevice"
]

View File

@@ -1,4 +0,0 @@
[
"NotificationService",
"NotificationIndicatorController"
]

View File

@@ -810,7 +810,7 @@ mct-container {
.search-results .s-status-editing .search-result-item.t-item-icon:before {
color: #0099cc;
font-size: inherit; }
/* line 40, ../../../../general/res/sass/_icons.scss */
/* line 39, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon.alert, .alert.t-item-icon, .icon.alert.s-icon-btn, .l-datetime-picker .l-month-year-pager .icon.alert.pager, .l-datetime-picker .l-month-year-pager .alert.pager.t-item-icon, .tree .s-status-editing .icon.alert.tree-item:before, .tree .s-status-editing .alert.tree-item.t-item-icon:before,
.tree .s-status-editing .icon.alert.search-result-item:before,
.tree .s-status-editing .alert.search-result-item.t-item-icon:before,
@@ -819,7 +819,7 @@ mct-container {
.search-results .s-status-editing .icon.alert.search-result-item:before,
.search-results .s-status-editing .alert.search-result-item.t-item-icon:before {
color: #ff3c00; }
/* line 42, ../../../../general/res/sass/_icons.scss */
/* line 41, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon.alert:hover, .alert.t-item-icon:hover, .icon.alert.s-icon-btn:hover, .l-datetime-picker .l-month-year-pager .icon.alert.pager:hover, .tree .s-status-editing .icon.alert.tree-item:hover:before, .tree .s-status-editing .alert.tree-item.t-item-icon:hover:before,
.tree .s-status-editing .icon.alert.search-result-item:hover:before,
.tree .s-status-editing .alert.search-result-item.t-item-icon:hover:before,
@@ -828,7 +828,7 @@ mct-container {
.search-results .s-status-editing .icon.alert.search-result-item:hover:before,
.search-results .s-status-editing .alert.search-result-item.t-item-icon:hover:before {
color: #ff8a66; }
/* line 46, ../../../../general/res/sass/_icons.scss */
/* line 45, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon.major, .major.t-item-icon, .icon.major.s-icon-btn, .l-datetime-picker .l-month-year-pager .icon.major.pager, .l-datetime-picker .l-month-year-pager .major.pager.t-item-icon, .tree .s-status-editing .icon.major.tree-item:before, .tree .s-status-editing .major.tree-item.t-item-icon:before,
.tree .s-status-editing .icon.major.search-result-item:before,
.tree .s-status-editing .major.search-result-item.t-item-icon:before,
@@ -837,11 +837,11 @@ mct-container {
.search-results .s-status-editing .icon.major.search-result-item:before,
.search-results .s-status-editing .major.search-result-item.t-item-icon:before {
font-size: 1.65em; }
/* line 50, ../../../../general/res/sass/_icons.scss */
/* line 49, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon-calendar:after, .icon-calendar.t-item-icon:after, .icon-calendar.s-icon-btn:after, .l-datetime-picker .l-month-year-pager .icon-calendar.pager:after {
content: "\e605"; }
/* line 55, ../../../../general/res/sass/_icons.scss */
/* line 54, ../../../../general/res/sass/_icons.scss */
.bar .ui-symbol, .bar .t-item-icon, .bar .s-icon-btn, .bar .l-datetime-picker .l-month-year-pager .pager, .l-datetime-picker .l-month-year-pager .bar .pager, .bar .tree .s-status-editing .tree-item:before, .tree .s-status-editing .bar .tree-item:before,
.bar .tree .s-status-editing .search-result-item:before,
.tree .s-status-editing .bar .search-result-item:before,
@@ -851,36 +851,36 @@ mct-container {
.search-results .s-status-editing .bar .search-result-item:before {
display: inline-block; }
/* line 59, ../../../../general/res/sass/_icons.scss */
/* line 58, ../../../../general/res/sass/_icons.scss */
.invoke-menu {
text-shadow: none;
display: inline-block; }
/* line 64, ../../../../general/res/sass/_icons.scss */
/* line 63, ../../../../general/res/sass/_icons.scss */
.s-menu-btn .invoke-menu,
.icon.major .invoke-menu,
.major.t-item-icon .invoke-menu {
margin-left: 3px; }
/* line 69, ../../../../general/res/sass/_icons.scss */
/* line 68, ../../../../general/res/sass/_icons.scss */
.menu .type-icon,
.tree-item .type-icon,
.super-menu.menu .type-icon {
position: absolute; }
/* line 75, ../../../../general/res/sass/_icons.scss */
/* line 74, ../../../../general/res/sass/_icons.scss */
.l-icon-alert {
display: none !important; }
/* line 77, ../../../../general/res/sass/_icons.scss */
/* line 76, ../../../../general/res/sass/_icons.scss */
.l-icon-alert:before {
color: #ff3c00;
content: "!"; }
/* line 83, ../../../../general/res/sass/_icons.scss */
/* line 82, ../../../../general/res/sass/_icons.scss */
.t-item-icon {
line-height: normal;
position: relative; }
/* line 94, ../../../../general/res/sass/_icons.scss */
/* line 90, ../../../../general/res/sass/_icons.scss */
.t-item-icon.l-icon-link .t-item-icon-glyph:before {
color: #49dedb;
content: "\f4";
@@ -1284,87 +1284,90 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
* at runtime from the About dialog for additional information.
*****************************************************************************/
@-moz-keyframes rotation {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(359deg); } }
-moz-transform: rotate(360deg);
transform: rotate(360deg); } }
@-webkit-keyframes rotation {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(359deg); } }
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@keyframes rotation {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(359deg); } }
/* line 69, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.t-wait-spinner,
-moz-transform: rotate(360deg);
-ms-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@-moz-keyframes rotation-centered {
0% {
-moz-transform: translate(-50%, -50%) rotate(0deg);
transform: translate(-50%, -50%) rotate(0deg); }
100% {
-moz-transform: translate(-50%, -50%) rotate(360deg);
transform: translate(-50%, -50%) rotate(360deg); } }
@-webkit-keyframes rotation-centered {
0% {
-webkit-transform: translate(-50%, -50%) rotate(0deg);
transform: translate(-50%, -50%) rotate(0deg); }
100% {
-webkit-transform: translate(-50%, -50%) rotate(360deg);
transform: translate(-50%, -50%) rotate(360deg); } }
@keyframes rotation-centered {
0% {
-moz-transform: translate(-50%, -50%) rotate(0deg);
-ms-transform: translate(-50%, -50%) rotate(0deg);
-webkit-transform: translate(-50%, -50%) rotate(0deg);
transform: translate(-50%, -50%) rotate(0deg); }
100% {
-moz-transform: translate(-50%, -50%) rotate(360deg);
-ms-transform: translate(-50%, -50%) rotate(360deg);
-webkit-transform: translate(-50%, -50%) rotate(360deg);
transform: translate(-50%, -50%) rotate(360deg); } }
/* line 48, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.wait-spinner {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
-moz-animation-name: rotation-centered;
-webkit-animation-name: rotation-centered;
animation-name: rotation-centered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
-moz-animation-iteration-count: infinite;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 0.5em;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
top: 50%;
display: block;
position: absolute;
left: 50%;
top: 50%;
height: auto;
width: auto;
padding: 5%;
pointer-events: none;
margin-top: -5%;
margin-left: -5%;
z-index: 2; }
/* line 80, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.t-wait-spinner.inline,
/* line 55, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.wait-spinner.inline {
display: inline-block !important;
margin-right: 5px;
position: relative !important;
vertical-align: middle; }
/* line 88, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder {
pointer-events: none;
position: absolute; }
/* line 92, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder.align-left .t-wait-spinner {
left: 0;
margin-left: 0; }
/* line 97, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder.full-size {
display: inline-block;
height: 100%;
width: 100%; }
/* line 100, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder.full-size .t-wait-spinner {
top: 0;
margin-top: 0;
padding: 30%; }
/* line 109, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 63, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.treeview .wait-spinner {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 0.25em;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
height: 10px;
width: 10px;
margin: 0 !important;
@@ -1372,40 +1375,21 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
top: 2px;
left: 0; }
/* line 118, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.wait-spinner.sm {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 0.25em;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
height: 13px;
width: 13px;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
top: 0;
left: 0; }
/* line 128, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 72, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading {
pointer-events: none; }
/* line 131, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 75, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading:before, .loading:after {
content: ''; }
/* line 135, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 79, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading:before {
-moz-animation-name: rotateCentered;
-webkit-animation-name: rotateCentered;
animation-name: rotateCentered;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
-moz-animation-name: rotation-centered;
-webkit-animation-name: rotation-centered;
animation-name: rotation-centered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
@@ -1415,12 +1399,6 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
border-style: solid;
border-width: 5px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
@@ -1429,40 +1407,15 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
box-sizing: border-box;
border-color: rgba(255, 199, 0, 0.25);
border-top-color: #ffc700;
border-style: solid;
border-width: 5px;
display: block;
position: absolute;
height: 0;
width: 0;
padding: 7%;
left: 50%;
top: 50%;
padding: 5%;
z-index: 10; }
@-moz-keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@-webkit-keyframes rotateCentered {
0% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
/* line 139, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 84, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading:after {
overflow: hidden;
position: absolute;
@@ -1475,7 +1428,7 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
background: rgba(153, 153, 153, 0.2);
display: block;
z-index: 9; }
/* line 145, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 90, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading.tree-item:before {
padding: 0.375rem;
border-width: 2px; }
@@ -6173,7 +6126,7 @@ ul.tree {
margin-bottom: 3px;
padding: 0 3px;
position: relative; }
/* line 49, ../../../../general/res/sass/tree/_tree.scss */
/* line 48, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control,
.search-result-item .view-control {
color: rgba(255, 255, 255, 0.3);
@@ -6182,7 +6135,7 @@ ul.tree {
height: 100%;
line-height: inherit;
width: 10px; }
/* line 57, ../../../../general/res/sass/tree/_tree.scss */
/* line 56, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control.has-children:before,
.search-result-item .view-control.has-children:before {
position: absolute;
@@ -6207,7 +6160,7 @@ ul.tree {
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%; }
/* line 63, ../../../../general/res/sass/tree/_tree.scss */
/* line 62, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control.has-children.expanded:before,
.search-result-item .view-control.has-children.expanded:before {
-moz-transform: rotate(90deg);
@@ -6215,138 +6168,80 @@ ul.tree {
-webkit-transform: rotate(90deg);
transform: rotate(90deg); }
@media only screen and (min-device-width: 1025px) and (-webkit-min-device-pixel-ratio: 1) {
/* line 68, ../../../../general/res/sass/tree/_tree.scss */
/* line 67, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control:hover,
.search-result-item .view-control:hover {
color: #ffc700 !important; } }
/* line 74, ../../../../general/res/sass/tree/_tree.scss */
/* line 73, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .t-object-label,
.search-result-item .t-object-label {
line-height: 1.5rem; }
/* line 76, ../../../../general/res/sass/tree/_tree.scss */
/* line 75, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .t-object-label .t-item-icon,
.search-result-item .t-object-label .t-item-icon {
text-shadow: rgba(0, 0, 0, 0.6) 0 1px 2px;
font-size: 1.4em;
color: #0099cc;
width: 18px; }
/* line 82, ../../../../general/res/sass/tree/_tree.scss */
/* line 81, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .t-object-label .t-title-label,
.search-result-item .t-object-label .t-title-label {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
/* line 87, ../../../../general/res/sass/tree/_tree.scss */
/* line 86, ../../../../general/res/sass/tree/_tree.scss */
.tree-item.selected,
.search-result-item.selected {
background: #006080;
color: #cccccc; }
/* line 90, ../../../../general/res/sass/tree/_tree.scss */
/* line 89, ../../../../general/res/sass/tree/_tree.scss */
.tree-item.selected .view-control,
.search-result-item.selected .view-control {
color: rgba(255, 255, 255, 0.3); }
/* line 93, ../../../../general/res/sass/tree/_tree.scss */
/* line 92, ../../../../general/res/sass/tree/_tree.scss */
.tree-item.selected .t-object-label .t-item-icon,
.search-result-item.selected .t-object-label .t-item-icon {
color: #cccccc; }
@media only screen and (min-device-width: 1025px) and (-webkit-min-device-pixel-ratio: 1) {
/* line 100, ../../../../general/res/sass/tree/_tree.scss */
/* line 99, ../../../../general/res/sass/tree/_tree.scss */
.tree-item:not(.selected):hover,
.search-result-item:not(.selected):hover {
background: rgba(153, 153, 153, 0.1);
color: #cccccc; }
/* line 103, ../../../../general/res/sass/tree/_tree.scss */
/* line 102, ../../../../general/res/sass/tree/_tree.scss */
.tree-item:not(.selected):hover .t-item-icon,
.search-result-item:not(.selected):hover .t-item-icon {
color: #33ccff; } }
/* line 110, ../../../../general/res/sass/tree/_tree.scss */
/* line 109, ../../../../general/res/sass/tree/_tree.scss */
.tree-item:not(.loading),
.search-result-item:not(.loading) {
cursor: pointer; }
/* line 114, ../../../../general/res/sass/tree/_tree.scss */
/* line 113, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .context-trigger,
.search-result-item .context-trigger {
top: -1px;
position: absolute;
right: 3px; }
/* line 119, ../../../../general/res/sass/tree/_tree.scss */
/* line 118, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .context-trigger .invoke-menu,
.search-result-item .context-trigger .invoke-menu {
font-size: 0.75em;
height: 0.9rem;
line-height: 0.9rem; }
/* line 131, ../../../../general/res/sass/tree/_tree.scss */
/* line 130, ../../../../general/res/sass/tree/_tree.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon:before {
-moz-animation-name: rotateCentered;
-webkit-animation-name: rotateCentered;
animation-name: rotateCentered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
-moz-animation-iteration-count: infinite;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
border-style: solid;
border-width: 4px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc; }
@-moz-keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@-webkit-keyframes rotateCentered {
0% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
/* line 137, ../../../../general/res/sass/tree/_tree.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon .t-item-icon-glyph {
display: none; }
/* line 141, ../../../../general/res/sass/tree/_tree.scss */
mct-representation.s-status-pending .t-object-label .t-title-label {
font-style: italic;
opacity: 0.6; }
/* line 148, ../../../../general/res/sass/tree/_tree.scss */
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba(204, 204, 204, 0.25);
border-top-color: #cccccc; }
/* line 156, ../../../../general/res/sass/tree/_tree.scss */
/* line 142, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item,
.tree .s-status-editing .search-result-item,
.search-results .s-status-editing .tree-item,
.search-results .s-status-editing .search-result-item {
background: #344154;
pointer-events: none; }
/* line 160, ../../../../general/res/sass/tree/_tree.scss */
/* line 146, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item:before,
.tree .s-status-editing .search-result-item:before,
.search-results .s-status-editing .tree-item:before,
@@ -6384,7 +6279,7 @@ mct-representation.s-status-pending .t-object-label .t-title-label {
opacity: 0.25; }
100% {
opacity: 1; } }
/* line 169, ../../../../general/res/sass/tree/_tree.scss */
/* line 155, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item .t-object-label .t-item-icon,
.tree .s-status-editing .tree-item .t-object-label .t-title-label,
.tree .s-status-editing .search-result-item .t-object-label .t-item-icon,
@@ -6395,13 +6290,13 @@ mct-representation.s-status-pending .t-object-label .t-title-label {
.search-results .s-status-editing .search-result-item .t-object-label .t-title-label {
color: #587ab5;
text-shadow: none; }
/* line 174, ../../../../general/res/sass/tree/_tree.scss */
/* line 160, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item .t-object-label .t-title-label,
.tree .s-status-editing .search-result-item .t-object-label .t-title-label,
.search-results .s-status-editing .tree-item .t-object-label .t-title-label,
.search-results .s-status-editing .search-result-item .t-object-label .t-title-label {
font-style: italic; }
/* line 178, ../../../../general/res/sass/tree/_tree.scss */
/* line 164, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item .view-control, .tree .s-status-editing .tree-item + .tree-item-subtree,
.tree .s-status-editing .search-result-item .view-control,
.tree .s-status-editing .search-result-item + .tree-item-subtree,
@@ -6448,9 +6343,13 @@ mct-representation.s-status-pending .t-object-label .t-title-label {
/* line 42, ../../../../general/res/sass/_object-label.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon:before {
-moz-animation-name: rotateCentered;
-webkit-animation-name: rotateCentered;
animation-name: rotateCentered;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
-moz-animation-name: rotation-centered;
-webkit-animation-name: rotation-centered;
animation-name: rotation-centered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
@@ -6460,60 +6359,34 @@ mct-representation.s-status-pending .t-object-label .t-item-icon:before {
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
border-style: solid;
border-width: 4px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
content: "";
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 4px;
display: block;
position: absolute;
left: 50%;
top: 50%;
padding: 30%;
width: 0;
height: 0; }
@-moz-keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@-webkit-keyframes rotateCentered {
0% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
/* line 55, ../../../../general/res/sass/_object-label.scss */
content: "";
padding: 30%; }
/* line 48, ../../../../general/res/sass/_object-label.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon .t-item-icon-glyph {
display: none; }
/* line 59, ../../../../general/res/sass/_object-label.scss */
/* line 52, ../../../../general/res/sass/_object-label.scss */
mct-representation.s-status-pending .t-object-label .t-title-label {
font-style: italic;
opacity: 0.6; }
/* line 66, ../../../../general/res/sass/_object-label.scss */
/* line 60, ../../../../general/res/sass/_object-label.scss */
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba(204, 204, 204, 0.25);
border-top-color: #cccccc; }
border-color: rgba(204, 204, 204, 0.25) !important;
border-top-color: #cccccc !important; }
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
@@ -7412,12 +7285,14 @@ table {
/* line 267, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick,
.tick-label {
direction: rtl;
unicode-bidi: bidi-override;
font-size: 0.7rem;
position: absolute;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis; }
/* line 274, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 276, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-x-tick-label, .gl-plot-tick.tick-label-x,
.tick-label.gl-plot-x-tick-label,
.tick-label.tick-label-x {
@@ -7428,7 +7303,7 @@ table {
width: 20%;
margin-left: -10%;
text-align: center; }
/* line 284, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 286, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-y-tick-label, .gl-plot-tick.tick-label-y,
.tick-label.gl-plot-y-tick-label,
.tick-label.tick-label-y {
@@ -7438,18 +7313,18 @@ table {
margin-bottom: -0.5em;
text-align: right; }
/* line 295, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 297, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-x-tick-label {
top: 5px; }
/* line 298, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 300, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-y-tick-label {
right: 5px;
left: 5px; }
/* line 305, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 307, ../../../../general/res/sass/plots/_plots-main.scss */
.tick-label.tick-label-x {
top: 0; }
/* line 308, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 310, ../../../../general/res/sass/plots/_plots-main.scss */
.tick-label.tick-label-y {
right: 0;
left: 0; }

View File

@@ -810,7 +810,7 @@ mct-container {
.search-results .s-status-editing .search-result-item.t-item-icon:before {
color: #0099cc;
font-size: inherit; }
/* line 40, ../../../../general/res/sass/_icons.scss */
/* line 39, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon.alert, .alert.t-item-icon, .icon.alert.s-icon-btn, .l-datetime-picker .l-month-year-pager .icon.alert.pager, .l-datetime-picker .l-month-year-pager .alert.pager.t-item-icon, .tree .s-status-editing .icon.alert.tree-item:before, .tree .s-status-editing .alert.tree-item.t-item-icon:before,
.tree .s-status-editing .icon.alert.search-result-item:before,
.tree .s-status-editing .alert.search-result-item.t-item-icon:before,
@@ -819,7 +819,7 @@ mct-container {
.search-results .s-status-editing .icon.alert.search-result-item:before,
.search-results .s-status-editing .alert.search-result-item.t-item-icon:before {
color: #ff3c00; }
/* line 42, ../../../../general/res/sass/_icons.scss */
/* line 41, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon.alert:hover, .alert.t-item-icon:hover, .icon.alert.s-icon-btn:hover, .l-datetime-picker .l-month-year-pager .icon.alert.pager:hover, .tree .s-status-editing .icon.alert.tree-item:hover:before, .tree .s-status-editing .alert.tree-item.t-item-icon:hover:before,
.tree .s-status-editing .icon.alert.search-result-item:hover:before,
.tree .s-status-editing .alert.search-result-item.t-item-icon:hover:before,
@@ -828,7 +828,7 @@ mct-container {
.search-results .s-status-editing .icon.alert.search-result-item:hover:before,
.search-results .s-status-editing .alert.search-result-item.t-item-icon:hover:before {
color: #ff8a66; }
/* line 46, ../../../../general/res/sass/_icons.scss */
/* line 45, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon.major, .major.t-item-icon, .icon.major.s-icon-btn, .l-datetime-picker .l-month-year-pager .icon.major.pager, .l-datetime-picker .l-month-year-pager .major.pager.t-item-icon, .tree .s-status-editing .icon.major.tree-item:before, .tree .s-status-editing .major.tree-item.t-item-icon:before,
.tree .s-status-editing .icon.major.search-result-item:before,
.tree .s-status-editing .major.search-result-item.t-item-icon:before,
@@ -837,11 +837,11 @@ mct-container {
.search-results .s-status-editing .icon.major.search-result-item:before,
.search-results .s-status-editing .major.search-result-item.t-item-icon:before {
font-size: 1.65em; }
/* line 50, ../../../../general/res/sass/_icons.scss */
/* line 49, ../../../../general/res/sass/_icons.scss */
.ui-symbol.icon-calendar:after, .icon-calendar.t-item-icon:after, .icon-calendar.s-icon-btn:after, .l-datetime-picker .l-month-year-pager .icon-calendar.pager:after {
content: "\e605"; }
/* line 55, ../../../../general/res/sass/_icons.scss */
/* line 54, ../../../../general/res/sass/_icons.scss */
.bar .ui-symbol, .bar .t-item-icon, .bar .s-icon-btn, .bar .l-datetime-picker .l-month-year-pager .pager, .l-datetime-picker .l-month-year-pager .bar .pager, .bar .tree .s-status-editing .tree-item:before, .tree .s-status-editing .bar .tree-item:before,
.bar .tree .s-status-editing .search-result-item:before,
.tree .s-status-editing .bar .search-result-item:before,
@@ -851,36 +851,36 @@ mct-container {
.search-results .s-status-editing .bar .search-result-item:before {
display: inline-block; }
/* line 59, ../../../../general/res/sass/_icons.scss */
/* line 58, ../../../../general/res/sass/_icons.scss */
.invoke-menu {
text-shadow: none;
display: inline-block; }
/* line 64, ../../../../general/res/sass/_icons.scss */
/* line 63, ../../../../general/res/sass/_icons.scss */
.s-menu-btn .invoke-menu,
.icon.major .invoke-menu,
.major.t-item-icon .invoke-menu {
margin-left: 3px; }
/* line 69, ../../../../general/res/sass/_icons.scss */
/* line 68, ../../../../general/res/sass/_icons.scss */
.menu .type-icon,
.tree-item .type-icon,
.super-menu.menu .type-icon {
position: absolute; }
/* line 75, ../../../../general/res/sass/_icons.scss */
/* line 74, ../../../../general/res/sass/_icons.scss */
.l-icon-alert {
display: none !important; }
/* line 77, ../../../../general/res/sass/_icons.scss */
/* line 76, ../../../../general/res/sass/_icons.scss */
.l-icon-alert:before {
color: #ff3c00;
content: "!"; }
/* line 83, ../../../../general/res/sass/_icons.scss */
/* line 82, ../../../../general/res/sass/_icons.scss */
.t-item-icon {
line-height: normal;
position: relative; }
/* line 94, ../../../../general/res/sass/_icons.scss */
/* line 90, ../../../../general/res/sass/_icons.scss */
.t-item-icon.l-icon-link .t-item-icon-glyph:before {
color: #49dedb;
content: "\f4";
@@ -1265,87 +1265,90 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
* at runtime from the About dialog for additional information.
*****************************************************************************/
@-moz-keyframes rotation {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(359deg); } }
-moz-transform: rotate(360deg);
transform: rotate(360deg); } }
@-webkit-keyframes rotation {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(359deg); } }
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@keyframes rotation {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(359deg); } }
/* line 69, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.t-wait-spinner,
-moz-transform: rotate(360deg);
-ms-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@-moz-keyframes rotation-centered {
0% {
-moz-transform: translate(-50%, -50%) rotate(0deg);
transform: translate(-50%, -50%) rotate(0deg); }
100% {
-moz-transform: translate(-50%, -50%) rotate(360deg);
transform: translate(-50%, -50%) rotate(360deg); } }
@-webkit-keyframes rotation-centered {
0% {
-webkit-transform: translate(-50%, -50%) rotate(0deg);
transform: translate(-50%, -50%) rotate(0deg); }
100% {
-webkit-transform: translate(-50%, -50%) rotate(360deg);
transform: translate(-50%, -50%) rotate(360deg); } }
@keyframes rotation-centered {
0% {
-moz-transform: translate(-50%, -50%) rotate(0deg);
-ms-transform: translate(-50%, -50%) rotate(0deg);
-webkit-transform: translate(-50%, -50%) rotate(0deg);
transform: translate(-50%, -50%) rotate(0deg); }
100% {
-moz-transform: translate(-50%, -50%) rotate(360deg);
-ms-transform: translate(-50%, -50%) rotate(360deg);
-webkit-transform: translate(-50%, -50%) rotate(360deg);
transform: translate(-50%, -50%) rotate(360deg); } }
/* line 48, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.wait-spinner {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
-moz-animation-name: rotation-centered;
-webkit-animation-name: rotation-centered;
animation-name: rotation-centered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
-moz-animation-iteration-count: infinite;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 0.5em;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
top: 50%;
display: block;
position: absolute;
left: 50%;
top: 50%;
height: auto;
width: auto;
padding: 5%;
pointer-events: none;
margin-top: -5%;
margin-left: -5%;
z-index: 2; }
/* line 80, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.t-wait-spinner.inline,
/* line 55, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.wait-spinner.inline {
display: inline-block !important;
margin-right: 5px;
position: relative !important;
vertical-align: middle; }
/* line 88, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder {
pointer-events: none;
position: absolute; }
/* line 92, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder.align-left .t-wait-spinner {
left: 0;
margin-left: 0; }
/* line 97, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder.full-size {
display: inline-block;
height: 100%;
width: 100%; }
/* line 100, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.l-wait-spinner-holder.full-size .t-wait-spinner {
top: 0;
margin-top: 0;
padding: 30%; }
/* line 109, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 63, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.treeview .wait-spinner {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 0.25em;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
height: 10px;
width: 10px;
margin: 0 !important;
@@ -1353,40 +1356,21 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
top: 2px;
left: 0; }
/* line 118, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.wait-spinner.sm {
display: block;
position: absolute;
-webkit-animation: rotation .6s infinite linear;
-moz-animation: rotation .6s infinite linear;
-o-animation: rotation .6s infinite linear;
animation: rotation .6s infinite linear;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 0.25em;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
height: 13px;
width: 13px;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
top: 0;
left: 0; }
/* line 128, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 72, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading {
pointer-events: none; }
/* line 131, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 75, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading:before, .loading:after {
content: ''; }
/* line 135, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 79, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading:before {
-moz-animation-name: rotateCentered;
-webkit-animation-name: rotateCentered;
animation-name: rotateCentered;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
-moz-animation-name: rotation-centered;
-webkit-animation-name: rotation-centered;
animation-name: rotation-centered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
@@ -1396,12 +1380,6 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
border-style: solid;
border-width: 5px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
@@ -1410,40 +1388,15 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
box-sizing: border-box;
border-color: rgba(119, 107, 162, 0.25);
border-top-color: #776ba2;
border-style: solid;
border-width: 5px;
display: block;
position: absolute;
height: 0;
width: 0;
padding: 7%;
left: 50%;
top: 50%;
padding: 5%;
z-index: 10; }
@-moz-keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@-webkit-keyframes rotateCentered {
0% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
/* line 139, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 84, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading:after {
overflow: hidden;
position: absolute;
@@ -1456,7 +1409,7 @@ tr[class*="s-limit"].s-limit-lwr td:first-child:before {
background: rgba(119, 107, 162, 0.1);
display: block;
z-index: 9; }
/* line 145, ../../../../general/res/sass/helpers/_wait-spinner.scss */
/* line 90, ../../../../general/res/sass/helpers/_wait-spinner.scss */
.loading.tree-item:before {
padding: 0.375rem;
border-width: 2px; }
@@ -6047,7 +6000,7 @@ ul.tree {
margin-bottom: 3px;
padding: 0 3px;
position: relative; }
/* line 49, ../../../../general/res/sass/tree/_tree.scss */
/* line 48, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control,
.search-result-item .view-control {
color: #666;
@@ -6056,7 +6009,7 @@ ul.tree {
height: 100%;
line-height: inherit;
width: 10px; }
/* line 57, ../../../../general/res/sass/tree/_tree.scss */
/* line 56, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control.has-children:before,
.search-result-item .view-control.has-children:before {
position: absolute;
@@ -6081,7 +6034,7 @@ ul.tree {
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%; }
/* line 63, ../../../../general/res/sass/tree/_tree.scss */
/* line 62, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control.has-children.expanded:before,
.search-result-item .view-control.has-children.expanded:before {
-moz-transform: rotate(90deg);
@@ -6089,137 +6042,79 @@ ul.tree {
-webkit-transform: rotate(90deg);
transform: rotate(90deg); }
@media only screen and (min-device-width: 1025px) and (-webkit-min-device-pixel-ratio: 1) {
/* line 68, ../../../../general/res/sass/tree/_tree.scss */
/* line 67, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .view-control:hover,
.search-result-item .view-control:hover {
color: #0099cc !important; } }
/* line 74, ../../../../general/res/sass/tree/_tree.scss */
/* line 73, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .t-object-label,
.search-result-item .t-object-label {
line-height: 1.5rem; }
/* line 76, ../../../../general/res/sass/tree/_tree.scss */
/* line 75, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .t-object-label .t-item-icon,
.search-result-item .t-object-label .t-item-icon {
font-size: 1.4em;
color: #0099cc;
width: 18px; }
/* line 82, ../../../../general/res/sass/tree/_tree.scss */
/* line 81, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .t-object-label .t-title-label,
.search-result-item .t-object-label .t-title-label {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
/* line 87, ../../../../general/res/sass/tree/_tree.scss */
/* line 86, ../../../../general/res/sass/tree/_tree.scss */
.tree-item.selected,
.search-result-item.selected {
background: #1ac6ff;
color: #fcfcfc; }
/* line 90, ../../../../general/res/sass/tree/_tree.scss */
/* line 89, ../../../../general/res/sass/tree/_tree.scss */
.tree-item.selected .view-control,
.search-result-item.selected .view-control {
color: #fcfcfc; }
/* line 93, ../../../../general/res/sass/tree/_tree.scss */
/* line 92, ../../../../general/res/sass/tree/_tree.scss */
.tree-item.selected .t-object-label .t-item-icon,
.search-result-item.selected .t-object-label .t-item-icon {
color: #fcfcfc; }
@media only screen and (min-device-width: 1025px) and (-webkit-min-device-pixel-ratio: 1) {
/* line 100, ../../../../general/res/sass/tree/_tree.scss */
/* line 99, ../../../../general/res/sass/tree/_tree.scss */
.tree-item:not(.selected):hover,
.search-result-item:not(.selected):hover {
background: rgba(102, 102, 102, 0.1);
color: #333333; }
/* line 103, ../../../../general/res/sass/tree/_tree.scss */
/* line 102, ../../../../general/res/sass/tree/_tree.scss */
.tree-item:not(.selected):hover .t-item-icon,
.search-result-item:not(.selected):hover .t-item-icon {
color: #0099cc; } }
/* line 110, ../../../../general/res/sass/tree/_tree.scss */
/* line 109, ../../../../general/res/sass/tree/_tree.scss */
.tree-item:not(.loading),
.search-result-item:not(.loading) {
cursor: pointer; }
/* line 114, ../../../../general/res/sass/tree/_tree.scss */
/* line 113, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .context-trigger,
.search-result-item .context-trigger {
top: -1px;
position: absolute;
right: 3px; }
/* line 119, ../../../../general/res/sass/tree/_tree.scss */
/* line 118, ../../../../general/res/sass/tree/_tree.scss */
.tree-item .context-trigger .invoke-menu,
.search-result-item .context-trigger .invoke-menu {
font-size: 0.75em;
height: 0.9rem;
line-height: 0.9rem; }
/* line 131, ../../../../general/res/sass/tree/_tree.scss */
/* line 130, ../../../../general/res/sass/tree/_tree.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon:before {
-moz-animation-name: rotateCentered;
-webkit-animation-name: rotateCentered;
animation-name: rotateCentered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
-moz-animation-iteration-count: infinite;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
border-style: solid;
border-width: 4px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc; }
@-moz-keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@-webkit-keyframes rotateCentered {
0% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
/* line 137, ../../../../general/res/sass/tree/_tree.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon .t-item-icon-glyph {
display: none; }
/* line 141, ../../../../general/res/sass/tree/_tree.scss */
mct-representation.s-status-pending .t-object-label .t-title-label {
font-style: italic;
opacity: 0.6; }
/* line 148, ../../../../general/res/sass/tree/_tree.scss */
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba(252, 252, 252, 0.25);
border-top-color: #fcfcfc; }
/* line 156, ../../../../general/res/sass/tree/_tree.scss */
/* line 142, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item,
.tree .s-status-editing .search-result-item,
.search-results .s-status-editing .tree-item,
.search-results .s-status-editing .search-result-item {
background: #caf1ff;
pointer-events: none; }
/* line 160, ../../../../general/res/sass/tree/_tree.scss */
/* line 146, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item:before,
.tree .s-status-editing .search-result-item:before,
.search-results .s-status-editing .tree-item:before,
@@ -6257,7 +6152,7 @@ mct-representation.s-status-pending .t-object-label .t-title-label {
opacity: 0.25; }
100% {
opacity: 1; } }
/* line 169, ../../../../general/res/sass/tree/_tree.scss */
/* line 155, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item .t-object-label .t-item-icon,
.tree .s-status-editing .tree-item .t-object-label .t-title-label,
.tree .s-status-editing .search-result-item .t-object-label .t-item-icon,
@@ -6268,13 +6163,13 @@ mct-representation.s-status-pending .t-object-label .t-title-label {
.search-results .s-status-editing .search-result-item .t-object-label .t-title-label {
color: #4bb1c7;
text-shadow: none; }
/* line 174, ../../../../general/res/sass/tree/_tree.scss */
/* line 160, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item .t-object-label .t-title-label,
.tree .s-status-editing .search-result-item .t-object-label .t-title-label,
.search-results .s-status-editing .tree-item .t-object-label .t-title-label,
.search-results .s-status-editing .search-result-item .t-object-label .t-title-label {
font-style: italic; }
/* line 178, ../../../../general/res/sass/tree/_tree.scss */
/* line 164, ../../../../general/res/sass/tree/_tree.scss */
.tree .s-status-editing .tree-item .view-control, .tree .s-status-editing .tree-item + .tree-item-subtree,
.tree .s-status-editing .search-result-item .view-control,
.tree .s-status-editing .search-result-item + .tree-item-subtree,
@@ -6321,9 +6216,13 @@ mct-representation.s-status-pending .t-object-label .t-title-label {
/* line 42, ../../../../general/res/sass/_object-label.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon:before {
-moz-animation-name: rotateCentered;
-webkit-animation-name: rotateCentered;
animation-name: rotateCentered;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
-moz-animation-name: rotation-centered;
-webkit-animation-name: rotation-centered;
animation-name: rotation-centered;
-moz-animation-duration: 0.5s;
-webkit-animation-duration: 0.5s;
animation-duration: 0.5s;
@@ -6333,60 +6232,34 @@ mct-representation.s-status-pending .t-object-label .t-item-icon:before {
-moz-animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-timing-function: linear;
-moz-transform-origin: center 50%;
-ms-transform-origin: center 50%;
-webkit-transform-origin: center 50%;
transform-origin: center 50%;
border-style: solid;
border-width: 4px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
content: "";
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border-color: rgba(0, 153, 204, 0.25);
border-top-color: #0099cc;
border-style: solid;
border-width: 4px;
display: block;
position: absolute;
left: 50%;
top: 50%;
padding: 30%;
width: 0;
height: 0; }
@-moz-keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@-webkit-keyframes rotateCentered {
0% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
@keyframes rotateCentered {
0% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(0deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
transform: translateX(-50%) translateY(-50%) rotate(0deg); }
100% {
-moz-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-ms-transform: translateX(-50%) translateY(-50%) rotate(359deg);
-webkit-transform: translateX(-50%) translateY(-50%) rotate(359deg);
transform: translateX(-50%) translateY(-50%) rotate(359deg); } }
/* line 55, ../../../../general/res/sass/_object-label.scss */
content: "";
padding: 30%; }
/* line 48, ../../../../general/res/sass/_object-label.scss */
mct-representation.s-status-pending .t-object-label .t-item-icon .t-item-icon-glyph {
display: none; }
/* line 59, ../../../../general/res/sass/_object-label.scss */
/* line 52, ../../../../general/res/sass/_object-label.scss */
mct-representation.s-status-pending .t-object-label .t-title-label {
font-style: italic;
opacity: 0.6; }
/* line 66, ../../../../general/res/sass/_object-label.scss */
/* line 60, ../../../../general/res/sass/_object-label.scss */
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba(252, 252, 252, 0.25);
border-top-color: #fcfcfc; }
border-color: rgba(252, 252, 252, 0.25) !important;
border-top-color: #fcfcfc !important; }
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
@@ -7285,12 +7158,14 @@ table {
/* line 267, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick,
.tick-label {
direction: rtl;
unicode-bidi: bidi-override;
font-size: 0.7rem;
position: absolute;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis; }
/* line 274, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 276, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-x-tick-label, .gl-plot-tick.tick-label-x,
.tick-label.gl-plot-x-tick-label,
.tick-label.tick-label-x {
@@ -7301,7 +7176,7 @@ table {
width: 20%;
margin-left: -10%;
text-align: center; }
/* line 284, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 286, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-y-tick-label, .gl-plot-tick.tick-label-y,
.tick-label.gl-plot-y-tick-label,
.tick-label.tick-label-y {
@@ -7311,18 +7186,18 @@ table {
margin-bottom: -0.5em;
text-align: right; }
/* line 295, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 297, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-x-tick-label {
top: 5px; }
/* line 298, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 300, ../../../../general/res/sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-y-tick-label {
right: 5px;
left: 5px; }
/* line 305, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 307, ../../../../general/res/sass/plots/_plots-main.scss */
.tick-label.tick-label-x {
top: 0; }
/* line 308, ../../../../general/res/sass/plots/_plots-main.scss */
/* line 310, ../../../../general/res/sass/plots/_plots-main.scss */
.tick-label.tick-label-y {
right: 0;
left: 0; }

View File

@@ -55,11 +55,12 @@ define(
this.policyService = this.policyService || this.getPolicyService();
// ...and delegate to the composition policy
return this.policyService.allow(
'composition',
containerType,
selectedType
);
return containerObject.getId() !== selectedObject.getId() &&
this.policyService.allow(
'composition',
containerType,
selectedType
);
};
/**

View File

@@ -1,8 +0,0 @@
[
"CapabilityTable",
"ComposeActionPolicy",
"CompositionModelPolicy",
"CompositionMutabilityPolicy",
"CompositionPolicy",
"ContainmentTable"
]

View File

@@ -99,25 +99,25 @@ define([
"versions": [
{
"name": "Version",
"value": "${project.version}",
"value": "@@version",
"priority": 999
},
{
"name": "Built",
"value": "${timestamp}",
"value": "@@timestamp",
"description": "The date on which this version of the client was built.",
"priority": 990
},
{
"name": "Revision",
"value": "${buildNumber}",
"value": "@@revision",
"description": "A unique revision identifier for the client sources.",
"priority": 995
},
{
"name": "Branch",
"value": "${scmBranch}",
"description": "The date on which this version of the client was built.",
"value": "@@branch",
"description": "The name of the branch that was used during the build.",
"priority": 994
}
],
@@ -407,11 +407,11 @@ define([
"licenses": [
{
"name": "Math.uuid.js",
"version": "1.4",
"version": "1.4.7",
"description": "Unique identifer generation (code adapted.)",
"author": "Robert Kieffer",
"website": "https://github.com/broofa/node-uuid",
"copyright": "Copyright (c) 2010 Robert Kieffer",
"copyright": "Copyright (c) 2010-2012 Robert Kieffer",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
}

View File

@@ -1,40 +0,0 @@
/*global define*/
/*
Adapted from:
Math.uuid.js (v1.4)
http://www.broofa.com
mailto:robert@broofa.com
Copyright (c) 2010 Robert Kieffer
Dual licensed under the MIT and GPL licenses.
*/
define(
function () {
'use strict';
return function generateUUID() {
var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
uuid = new Array(36),
rnd = 0,
r,
i,
offset = Math.floor(Date.now()) % 0xF;
for (i = 0; i < 36; i = i + 1) {
if (i === 8 || i === 13 || i === 18 || i === 23) {
uuid[i] = '-';
} else if (i === 14) {
uuid[i] = '4';
} else {
if (rnd <= 0x02) {
rnd = 0x2000000 + Math.floor(Math.random() * 0x1000000);
}
r = rnd % 0xf;
rnd = Math.floor(rnd / 16);
uuid[i] = chars[(i === 19) ? ((r % 0x3) + 0x8) : r];
}
}
return uuid.join('');
};
}
);

View File

@@ -22,7 +22,7 @@
/*global define*/
define(
["../../lib/uuid", "./Identifier"],
["uuid", "./Identifier"],
function (uuid, Identifier) {
'use strict';

View File

@@ -1,46 +0,0 @@
[
"actions/ActionAggregator",
"actions/ActionCapability",
"actions/ActionProvider",
"actions/LoggingActionDecorator",
"capabilities/CompositionCapability",
"capabilities/ContextCapability",
"capabilities/ContextualDomainObject",
"capabilities/CoreCapabilityProvider",
"capabilities/DelegationCapability",
"capabilities/InstantiationCapability",
"capabilities/MetadataCapability",
"capabilities/MutationCapability",
"capabilities/PersistenceCapability",
"capabilities/RelationshipCapability",
"identifiers/Identifier",
"identifiers/IdentifierProvider",
"models/ModelAggregator",
"models/MissingModelDecorator",
"models/PersistedModelProvider",
"models/RootModelProvider",
"models/StaticModelProvider",
"models/CachingModelDecorator",
"objects/DomainObject",
"objects/DomainObjectProvider",
"services/Contextualize",
"services/Instantiate",
"services/Now",
"services/Throttle",
"services/Topic",
"types/MergeModels",
"types/TypeCapability",
"types/TypeImpl",
"types/TypeProperty",
"types/TypePropertyConversion",
"types/TypeProvider",
"views/ViewCapability",
"views/ViewProvider"
]

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define*/
define([
"./src/directives/MCTDataTable",
"legacyRegistry"
], function (
MCTDataTable,
legacyRegistry
) {
"use strict";
legacyRegistry.register("platform/datatable", {
"extensions": {
"directives": [
{
"key": "mctDataTable",
"implementation": MCTDataTable,
"depends": ["$timeout"]
}
]
}
});
});

View File

@@ -0,0 +1,65 @@
<div class="l-view-section scrolling"
ng-style="overrideRowPositioning ?
{'overflow': 'auto'} :
{'overflow': 'scroll'}
"
>
<table class="filterable" ng-style="overrideRowPositioning && {
height: totalHeight + 'px',
'table-layout': overrideRowPositioning ? 'fixed' : 'auto',
'box-sizing': 'border-box'
}">
<thead>
<tr>
<th ng-repeat="header in displayHeaders"
ng-style="overrideRowPositioning && {
width: columnWidths[$index] + 'px',
'max-width': columnWidths[$index] + 'px',
overflow: 'none',
'box-sizing': 'border-box'
}"
ng-class="[
enableSort ? 'sortable' : '',
sortColumn === header ? 'sort' : '',
sortDirection || ''
].join(' ')"
ng-click="toggleSort(header)">
{{ header }}
</th>
</tr>
<tr ng-if="enableFilter" class="s-filters">
<th ng-repeat="header in displayHeaders"
ng-style="overrideRowPositioning && {
width: columnWidths[$index] + 'px',
'max-width': columnWidths[$index] + 'px',
overflow: 'none',
'box-sizing': 'border-box'
}">
<input type="text"
ng-model="filters[header]"/>
</th>
</tr>
</thead>
<tbody ng-style="overrideRowPositioning || {
'opacity': 0.0
}">
<tr ng-repeat="visibleRow in visibleRows track by visibleRow.rowIndex"
ng-style="overrideRowPositioning && {
position: 'absolute',
top: visibleRow.offsetY + 'px',
}">
<td ng-repeat="header in displayHeaders"
ng-style="overrideRowPositioning && {
width: columnWidths[$index] + 'px',
'max-width': columnWidths[$index] + 'px',
overflow: 'none',
'box-sizing': 'border-box'
}">
{{ visibleRow.contents[header] }}
</td>
</tr>
</tbody>
</table>
</div>

View File

@@ -0,0 +1,341 @@
/*global define*/
define(
[],
function () {
"use strict";
function MCTDataTable($timeout) {
/**
* Set default values for optional parameters on a given scope
*/
function setDefaults($scope) {
if (typeof $scope.enableFilter === 'undefined') {
$scope.enableFilter = true;
$scope.filters = {};
}
if (typeof $scope.enableSort === 'undefined') {
$scope.enableSort = true;
$scope.sortColumn = undefined;
$scope.sortDirection = undefined;
}
}
function link($scope, element) {
setDefaults($scope);
var maxDisplayRows = 50;
$scope.visibleRows = [];
$scope.overrideRowPositioning = false;
/**
* Returns true if row matches all filters.
*/
function matchRow(filters, row) {
return Object.keys(filters).every(function(key) {
if (!row[key]) {
return false;
}
var testVal = String(row[key]).toLowerCase();
return testVal.indexOf(filters[key]) !== -1;
});
}
/**
* Filter rows.
*/
function filterRows(rowsToFilter) {
if (!Object.keys($scope.filters).length) {
return rowsToFilter;
}
var filters = {};
Object.keys($scope.filters).forEach(function(key) {
if (!$scope.filters[key]) {
return;
}
filters[key] = $scope.filters[key].toLowerCase();
});
return rowsToFilter.filter(matchRow.bind(null, filters));
}
/**
* Compare two variables, returning a number that represents
* which is larger. Similar to the default array sort
* comparator, but does not coerce all values to string before
* conversion. Strings are lowercased before comparison.
*/
function genericComparator(a, b) {
if (typeof a === "string" && typeof b === "string") {
a = a.toLowerCase();
b = b.toLowerCase();
}
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}
/**
* Returns a new array which is a result of applying the sort
* criteria defined in $scope.
*
* Does not modify the array that was passed in.
*/
function sortRows(rowsToSort) {
if (!$scope.sortColumn || !$scope.sortDirection) {
return rowsToSort;
}
var sortKey = $scope.sortColumn,
sortDirectionMultiplier;
if ($scope.sortDirection === 'asc') {
sortDirectionMultiplier = 1;
} else if ($scope.sortDirection === 'desc') {
sortDirectionMultiplier = -1;
}
return rowsToSort.slice(0).sort(function(a, b) {
return genericComparator(a[sortKey], b[sortKey]) *
sortDirectionMultiplier;
});
}
/**
* Returns an object which contains the largest values
* for each key in the given set of rows. This is used to
* pre-calculate optimal column sizes without having to render
* every row.
*/
function findLargestRow(rows) {
var largestRow = rows.reduce(function (largestRow, row) {
Object.keys(row).forEach(function (key) {
var currentColumnLength =
(row[key] && row[key].length) ?
row[key].length :
row[key],
largestColumnLength =
(largestRow[key] && largestRow[key].length) ?
largestRow[key].length :
largestRow[key];
if (currentColumnLength > largestColumnLength) {
largestRow[key] = row[key];
}
});
return largestRow;
}, JSON.parse(JSON.stringify(rows[0])));
// Pad with characters to accomodate variable-width fonts,
// and remove characters that would allow word-wrapping.
Object.keys(largestRow).forEach(function(key) {
var padCharacters,
i;
largestRow[key] = String(largestRow[key]);
padCharacters = largestRow[key].length / 10;
for (i = 0; i < padCharacters; i++) {
largestRow[key] = largestRow[key] + 'W';
}
largestRow[key] = largestRow[key]
.replace(/[ \-_]/g, 'W');
});
return largestRow;
}
/**
* Read styles from the DOM and use them to calculate offsets
* for individual rows.
*/
function setElementSizes() {
var thead = element.find('thead'),
tbody = element.find('tbody'),
firstRow = tbody.find('tr'),
column = firstRow.find('td'),
headerHeight = thead.prop('offsetHeight'),
rowHeight = firstRow.prop('offsetHeight'),
overallHeight = headerHeight + (rowHeight * ($scope.displayRows ? $scope.displayRows.length - 1 : 0));
$scope.columnWidths = [];
while (column.length) {
$scope.columnWidths.push(column.prop('offsetWidth'));
column = column.next();
}
$scope.headerHeight = headerHeight;
$scope.rowHeight = rowHeight;
$scope.totalHeight = overallHeight;
$scope.visibleRows = $scope.displayRows.slice(0, maxDisplayRows).map(function(row, i) {
return {
rowIndex: i,
offsetY: (i * $scope.rowHeight) + $scope.headerHeight,
contents: row
};
});
$scope.overrideRowPositioning = true;
}
/**
* Update rows with new data. If filtering is enabled, rows
* will be sorted before display.
*/
function updateRows(newRows) {
var largestRow;
$scope.visibleRows = [];
$scope.displayRows = [];
$scope.overrideRowPositioning = false;
if (!$scope.displayHeaders) {
return;
}
if ($scope.enableFilter) {
$scope.displayRows = newRows = filterRows(newRows);
}
if ($scope.enableSort) {
$scope.displayRows = newRows = sortRows(newRows);
}
largestRow = findLargestRow(newRows);
$scope.visibleRows = [
{
rowIndex: 0,
offsetY: undefined,
contents: largestRow
}
];
$timeout(setElementSizes, 0);
}
/**
* Update table headers with new headers. If filtering is
* enabled, reset filters. If sorting is enabled, reset
* sorting.
*/
function updateHeaders(newHeaders) {
$scope.displayHeaders = newHeaders;
if ($scope.enableFilter) {
$scope.filters = {};
}
if ($scope.enableSort) {
$scope.sortColumn = undefined;
$scope.sortDirection = undefined;
}
}
/**
* On scroll, calculate which rows indexes are visible and
* ensure that an equal number of rows are preloaded for
* scrolling in either direction.
*/
function onScroll(event) {
var topScroll = event.target.scrollTop,
bottomScroll = topScroll + event.target.offsetHeight,
firstVisible,
lastVisible,
totalVisible,
numberOffscreen,
start,
end;
if ($scope.displayRows.length < maxDisplayRows) {
return;
}
if (topScroll < $scope.headerHeight) {
firstVisible = 0;
} else {
firstVisible = Math.floor(
(topScroll - $scope.headerHeight) / $scope.rowHeight
);
}
lastVisible = Math.ceil(
(bottomScroll - $scope.headerHeight) / $scope.rowHeight
);
totalVisible = lastVisible - firstVisible;
numberOffscreen = maxDisplayRows - totalVisible;
start = firstVisible - Math.floor(numberOffscreen / 2);
end = lastVisible + Math.ceil(numberOffscreen / 2);
if (start < 0) {
start = 0;
end = $scope.visibleRows.length - 1;
} else if (end >= $scope.displayRows.length) {
end = $scope.displayRows.length - 1;
start = end - maxDisplayRows + 1;
}
if ($scope.visibleRows[0].rowIndex === start &&
$scope.visibleRows[$scope.visibleRows.length-1]
.rowIndex === end) {
return; // don't update if no changes are required.
}
$scope.visibleRows = $scope.displayRows.slice(start, end)
.map(function(row, i) {
return {
rowIndex: start + i,
offsetY: ((start + i) * $scope.rowHeight) +
$scope.headerHeight,
contents: row
};
});
$scope.$digest();
}
element.find('div').on('scroll', onScroll);
$scope.toggleSort = function (key) {
if (!$scope.enableSort) {
return;
}
if ($scope.sortColumn !== key) {
$scope.sortColumn = key;
$scope.sortDirection = 'asc';
} else if ($scope.sortDirection === 'asc') {
$scope.sortDirection = 'desc';
} else if ($scope.sortDirection === 'desc') {
$scope.sortColumn = undefined;
$scope.sortDirection = undefined;
}
updateRows($scope.rows);
};
$scope.$watchCollection('filters', function () {
updateRows($scope.rows);
});
$scope.$watch('headers', updateHeaders);
$scope.$watch('rows', updateRows);
}
return {
restrict: "E",
templateUrl: "platform/datatable/res/templates/mct-data-table.html",
link: link,
scope: {
headers: "=",
rows: "=",
enableFilter: "=?",
enableSort: "=?"
}
};
}
return MCTDataTable;
}
);

View File

@@ -54,20 +54,52 @@ define(
);
};
/**
* A function used to check if a domain object should be cloned
* or not.
* @callback platform/entanglement.CopyService~filter
* @param {DomainObject} domainObject the object to be cloned
* @returns {boolean} true if the object should be cloned; false
* if it should be linked
*/
/**
* Creates a duplicate of the object tree starting at domainObject to
* the new parent specified.
* @param domainObject
* @param parent
* @param progress
*
* Any domain objects which cannot be created will not be cloned;
* instead, these will appear as links. If a filtering function
* is provided, any objects which fail that check will also be
* linked instead of cloned
*
* @param {DomainObject} domainObject the object to duplicate
* @param {DomainObject} parent the destination for the clone
* @param {platform/entanglement.CopyService~filter} [filter]
* an optional function used to filter out objects from
* the cloning process
* @returns a promise that will be completed with the clone of
* domainObject when the duplication is successful.
*/
CopyService.prototype.perform = function (domainObject, parent) {
var $q = this.$q,
copyTask = new CopyTask(domainObject, parent, this.policyService, this.$q);
CopyService.prototype.perform = function (domainObject, parent, filter) {
var policyService = this.policyService;
// Combines caller-provided filter (if any) with the
// baseline behavior of respecting creation policy.
function filterWithPolicy(domainObject) {
return (!filter || filter(domainObject)) &&
policyService.allow(
"creation",
domainObject.getCapability("type")
);
}
if (this.validate(domainObject, parent)) {
return copyTask.perform();
return new CopyTask(
domainObject,
parent,
filterWithPolicy,
this.$q
).perform();
} else {
throw new Error(
"Tried to copy objects without validating first."

View File

@@ -31,18 +31,21 @@ define(
* This class encapsulates the process of copying a domain object
* and all of its children.
*
* @param domainObject The object to copy
* @param parent The new location of the cloned object tree
* @param $q
* @param {DomainObject} domainObject The object to copy
* @param {DomainObject} parent The new location of the cloned object tree
* @param {platform/entanglement.CopyService~filter} filter
* a function used to filter out objects from
* the cloning process
* @param $q Angular's $q, for promises
* @constructor
*/
function CopyTask (domainObject, parent, policyService, $q){
function CopyTask (domainObject, parent, filter, $q){
this.domainObject = domainObject;
this.parent = parent;
this.firstClone = undefined;
this.$q = $q;
this.deferred = undefined;
this.policyService = policyService;
this.filter = filter;
this.persisted = 0;
this.clones = [];
this.idMap = {};
@@ -101,10 +104,14 @@ define(
* Will add a list of clones to the specified parent's composition
*/
function addClonesToParent(self) {
return self.firstClone.getCapability("persistence").persist()
.then(function(){self.parent.getCapability("composition").add(self.firstClone.getId());})
.then(function(){return self.parent.getCapability("persistence").persist();})
.then(function(){return self.firstClone;});
return self.parent.getCapability("composition")
.add(self.firstClone)
.then(function (addedClone) {
return self.parent.getCapability("persistence").persist()
.then(function () {
return addedClone;
});
});
}
/**
@@ -194,7 +201,7 @@ define(
//Check if the type of the object being copied allows for
// creation of new instances. If it does not, then a link to the
// original will be created instead.
if (this.policyService.allow("creation", originalObject.getCapability("type"))){
if (this.filter(originalObject)) {
//create a new clone of the original object. Use the
// creation capability of the targetParent to create the
// new clone. This will ensure that the correct persistence

View File

@@ -162,6 +162,7 @@ define(
'compositionCapability',
['invoke', 'add']
);
compositionCapability.add.andCallFake(synchronousPromise);
locationCapability = jasmine.createSpyObj(
'locationCapability',
@@ -387,6 +388,7 @@ define(
expect(childObjectClone.getModel().location).toEqual(objectClone.getId());
});
});
describe("when cloning non-creatable objects", function() {
beforeEach(function () {
policyService.allow.andCallFake(function(category){
@@ -401,8 +403,33 @@ define(
it ("creates link instead of clone", function() {
var copiedObject = copyFinished.calls[0].args[0];
expect(copiedObject).toBe(object);
expect(compositionCapability.add).toHaveBeenCalledWith(copiedObject.getId());
//expect(newParent.getModel().composition).toContain(copiedObject.getId());
expect(compositionCapability.add)
.toHaveBeenCalledWith(copiedObject);
});
});
describe("when provided a filtering function", function () {
function accept() {
return true;
}
function reject() {
return false;
}
it("does not create new instances of objects " +
"rejected by the filter", function() {
copyService.perform(object, newParent, reject)
.then(copyFinished);
expect(copyFinished.mostRecentCall.args[0])
.toBe(object);
});
it("does create new instances of objects " +
"accepted by the filter", function() {
copyService.perform(object, newParent, accept)
.then(copyFinished);
expect(copyFinished.mostRecentCall.args[0])
.not.toBe(object);
});
});
});

View File

@@ -44,11 +44,10 @@ define(
describe("CopyTask", function () {
var mockDomainObject,
mockParentObject,
mockPolicyService,
mockFilter,
mockQ,
mockDeferred,
testModel,
mockCallback,
counter,
cloneIds,
task;
@@ -119,17 +118,14 @@ define(
mockParentObject = domainObjectFactory({
capabilities: makeMockCapabilities()
});
mockPolicyService = jasmine.createSpyObj(
'policyService',
[ 'allow' ]
);
mockFilter = jasmine.createSpy('filter');
mockQ = jasmine.createSpyObj('$q', ['when', 'defer', 'all']);
mockDeferred = jasmine.createSpyObj(
'deferred',
[ 'notify', 'resolve', 'reject' ]
);
mockPolicyService.allow.andReturn(true);
mockFilter.andReturn(true);
mockQ.when.andCallFake(synchronousPromise);
mockQ.defer.andReturn(mockDeferred);
@@ -156,7 +152,7 @@ define(
task = new CopyTask(
mockDomainObject,
mockParentObject,
mockPolicyService,
mockFilter,
mockQ
);
@@ -218,7 +214,7 @@ define(
task = new CopyTask(
mockComposingObject,
mockParentObject,
mockPolicyService,
mockFilter,
mockQ
);

View File

@@ -1,17 +0,0 @@
[
"actions/AbstractComposeAction",
"actions/CopyAction",
"actions/GoToOriginalAction",
"actions/LinkAction",
"actions/MoveAction",
"actions/SetPrimaryLocationAction",
"policies/CrossSpacePolicy",
"services/CopyService",
"services/CopyTask",
"services/LinkService",
"services/MoveService",
"services/LocationService",
"services/LocatingCreationDecorator",
"services/LocatingObjectDecorator",
"capabilities/LocationCapability"
]

View File

@@ -1,3 +0,0 @@
[
"WorkerService"
]

View File

@@ -1,482 +0,0 @@
/*! Moment Duration Format v1.3.0
* https://github.com/jsmreese/moment-duration-format
* Date: 2014-07-15
*
* Duration format plugin function for the Moment.js library
* http://momentjs.com/
*
* Copyright 2014 John Madhavan-Reese
* Released under the MIT license
*/
(function (root, undefined) {
// repeatZero(qty)
// returns "0" repeated qty times
function repeatZero(qty) {
var result = "";
// exit early
// if qty is 0 or a negative number
// or doesn't coerce to an integer
qty = parseInt(qty, 10);
if (!qty || qty < 1) { return result; }
while (qty) {
result += "0";
qty -= 1;
}
return result;
}
// padZero(str, len [, isRight])
// pads a string with zeros up to a specified length
// will not pad a string if its length is aready
// greater than or equal to the specified length
// default output pads with zeros on the left
// set isRight to `true` to pad with zeros on the right
function padZero(str, len, isRight) {
if (str == null) { str = ""; }
str = "" + str;
return (isRight ? str : "") + repeatZero(len - str.length) + (isRight ? "" : str);
}
// isArray
function isArray(array) {
return Object.prototype.toString.call(array) === "[object Array]";
}
// isObject
function isObject(obj) {
return Object.prototype.toString.call(obj) === "[object Object]";
}
// findLast
function findLast(array, callback) {
var index = array.length;
while (index -= 1) {
if (callback(array[index])) { return array[index]; }
}
}
// find
function find(array, callback) {
var index = 0,
max = array.length,
match;
if (typeof callback !== "function") {
match = callback;
callback = function (item) {
return item === match;
};
}
while (index < max) {
if (callback(array[index])) { return array[index]; }
index += 1;
}
}
// each
function each(array, callback) {
var index = 0,
max = array.length;
if (!array || !max) { return; }
while (index < max) {
if (callback(array[index], index) === false) { return; }
index += 1;
}
}
// map
function map(array, callback) {
var index = 0,
max = array.length,
ret = [];
if (!array || !max) { return ret; }
while (index < max) {
ret[index] = callback(array[index], index);
index += 1;
}
return ret;
}
// pluck
function pluck(array, prop) {
return map(array, function (item) {
return item[prop];
});
}
// compact
function compact(array) {
var ret = [];
each(array, function (item) {
if (item) { ret.push(item); }
});
return ret;
}
// unique
function unique(array) {
var ret = [];
each(array, function (_a) {
if (!find(ret, _a)) { ret.push(_a); }
});
return ret;
}
// intersection
function intersection(a, b) {
var ret = [];
each(a, function (_a) {
each(b, function (_b) {
if (_a === _b) { ret.push(_a); }
});
});
return unique(ret);
}
// rest
function rest(array, callback) {
var ret = [];
each(array, function (item, index) {
if (!callback(item)) {
ret = array.slice(index);
return false;
}
});
return ret;
}
// initial
function initial(array, callback) {
var reversed = array.slice().reverse();
return rest(reversed, callback).reverse();
}
// extend
function extend(a, b) {
for (var key in b) {
if (b.hasOwnProperty(key)) { a[key] = b[key]; }
}
return a;
}
// define internal moment reference
var moment;
if (typeof require === "function") {
try { moment = require('moment'); }
catch (e) {}
}
if (!moment && root.moment) {
moment = root.moment;
}
if (!moment) {
throw "Moment Duration Format cannot find Moment.js";
}
// moment.duration.format([template] [, precision] [, settings])
moment.duration.fn.format = function () {
var tokenizer, tokens, types, typeMap, momentTypes, foundFirst, trimIndex,
args = [].slice.call(arguments),
settings = extend({}, this.format.defaults),
// keep a shadow copy of this moment for calculating remainders
remainder = moment.duration(this);
// add a reference to this duration object to the settings for use
// in a template function
settings.duration = this;
// parse arguments
each(args, function (arg) {
if (typeof arg === "string" || typeof arg === "function") {
settings.template = arg;
return;
}
if (typeof arg === "number") {
settings.precision = arg;
return;
}
if (isObject(arg)) {
extend(settings, arg);
}
});
// types
types = settings.types = (isArray(settings.types) ? settings.types : settings.types.split(" "));
// template
if (typeof settings.template === "function") {
settings.template = settings.template.apply(settings);
}
// tokenizer regexp
tokenizer = new RegExp(map(types, function (type) {
return settings[type].source;
}).join("|"), "g");
// token type map function
typeMap = function (token) {
return find(types, function (type) {
return settings[type].test(token);
});
};
// tokens array
tokens = map(settings.template.match(tokenizer), function (token, index) {
var type = typeMap(token),
length = token.length;
return {
index: index,
length: length,
// replace escaped tokens with the non-escaped token text
token: (type === "escape" ? token.replace(settings.escape, "$1") : token),
// ignore type on non-moment tokens
type: ((type === "escape" || type === "general") ? null : type)
// calculate base value for all moment tokens
//baseValue: ((type === "escape" || type === "general") ? null : this.as(type))
};
}, this);
// unique moment token types in the template (in order of descending magnitude)
momentTypes = intersection(types, unique(compact(pluck(tokens, "type"))));
// exit early if there are no momentTypes
if (!momentTypes.length) {
return pluck(tokens, "token").join("");
}
// calculate values for each token type in the template
each(momentTypes, function (momentType, index) {
var value, wholeValue, decimalValue, isLeast, isMost;
// calculate integer and decimal value portions
value = remainder.as(momentType);
wholeValue = (value > 0 ? Math.floor(value) : Math.ceil(value));
decimalValue = value - wholeValue;
// is this the least-significant moment token found?
isLeast = ((index + 1) === momentTypes.length);
// is this the most-significant moment token found?
isMost = (!index);
// update tokens array
// using this algorithm to not assume anything about
// the order or frequency of any tokens
each(tokens, function (token) {
if (token.type === momentType) {
extend(token, {
value: value,
wholeValue: wholeValue,
decimalValue: decimalValue,
isLeast: isLeast,
isMost: isMost
});
if (isMost) {
// note the length of the most-significant moment token:
// if it is greater than one and forceLength is not set, default forceLength to `true`
if (settings.forceLength == null && token.length > 1) {
settings.forceLength = true;
}
// rationale is this:
// if the template is "h:mm:ss" and the moment value is 5 minutes, the user-friendly output is "5:00", not "05:00"
// shouldn't pad the `minutes` token even though it has length of two
// if the template is "hh:mm:ss", the user clearly wanted everything padded so we should output "05:00"
// if the user wanted the full padded output, they can set `{ trim: false }` to get "00:05:00"
}
}
});
// update remainder
remainder.subtract(wholeValue, momentType);
});
// trim tokens array
if (settings.trim) {
tokens = (settings.trim === "left" ? rest : initial)(tokens, function (token) {
// return `true` if:
// the token is not the least moment token (don't trim the least moment token)
// the token is a moment token that does not have a value (don't trim moment tokens that have a whole value)
return !(token.isLeast || (token.type != null && token.wholeValue));
});
}
// build output
// the first moment token can have special handling
foundFirst = false;
// run the map in reverse order if trimming from the right
if (settings.trim === "right") {
tokens.reverse();
}
tokens = map(tokens, function (token) {
var val,
decVal;
if (!token.type) {
// if it is not a moment token, use the token as its own value
return token.token;
}
// apply negative precision formatting to the least-significant moment token
if (token.isLeast && (settings.precision < 0)) {
val = (Math.floor(token.wholeValue * Math.pow(10, settings.precision)) * Math.pow(10, -settings.precision)).toString();
} else {
val = token.wholeValue.toString();
}
// remove negative sign from the beginning
val = val.replace(/^\-/, "");
// apply token length formatting
// special handling for the first moment token that is not the most significant in a trimmed template
if (token.length > 1 && (foundFirst || token.isMost || settings.forceLength)) {
val = padZero(val, token.length);
}
// add decimal value if precision > 0
if (token.isLeast && (settings.precision > 0)) {
decVal = token.decimalValue.toString().replace(/^\-/, "").split(/\.|e\-/);
switch (decVal.length) {
case 1:
val += "." + padZero(decVal[0], settings.precision, true).slice(0, settings.precision);
break;
case 2:
val += "." + padZero(decVal[1], settings.precision, true).slice(0, settings.precision);
break;
case 3:
val += "." + padZero(repeatZero((+decVal[2]) - 1) + (decVal[0] || "0") + decVal[1], settings.precision, true).slice(0, settings.precision);
break;
default:
throw "Moment Duration Format: unable to parse token decimal value.";
}
}
// add a negative sign if the value is negative and token is most significant
if (token.isMost && token.value < 0) {
val = "-" + val;
}
foundFirst = true;
return val;
});
// undo the reverse if trimming from the right
if (settings.trim === "right") {
tokens.reverse();
}
return tokens.join("");
};
moment.duration.fn.format.defaults = {
// token definitions
escape: /\[(.+?)\]/,
years: /[Yy]+/,
months: /M+/,
weeks: /[Ww]+/,
days: /[Dd]+/,
hours: /[Hh]+/,
minutes: /m+/,
seconds: /s+/,
milliseconds: /S+/,
general: /.+?/,
// token type names
// in order of descending magnitude
// can be a space-separated token name list or an array of token names
types: "escape years months weeks days hours minutes seconds milliseconds general",
// format options
// trim
// "left" - template tokens are trimmed from the left until the first moment token that has a value >= 1
// "right" - template tokens are trimmed from the right until the first moment token that has a value >= 1
// (the final moment token is not trimmed, regardless of value)
// `false` - template tokens are not trimmed
trim: "left",
// precision
// number of decimal digits to include after (to the right of) the decimal point (positive integer)
// or the number of digits to truncate to 0 before (to the left of) the decimal point (negative integer)
precision: 0,
// force first moment token with a value to render at full length even when template is trimmed and first moment token has length of 1
forceLength: null,
// template used to format duration
// may be a function or a string
// template functions are executed with the `this` binding of the settings object
// so that template strings may be dynamically generated based on the duration object
// (accessible via `this.duration`)
// or any of the other settings
template: function () {
var types = this.types,
dur = this.duration,
lastType = findLast(types, function (type) {
return dur._data[type];
});
// default template strings for each duration dimension type
switch (lastType) {
case "seconds":
return "h:mm:ss";
case "minutes":
return "d[d] h:mm";
case "hours":
return "d[d] h[h]";
case "days":
return "M[m] d[d]";
case "weeks":
return "y[y] w[w]";
case "months":
return "y[y] M[m]";
case "years":
return "y[y]";
default:
return "y[y] M[m] d[d] h:mm:ss";
}
}
};
})(this);

View File

@@ -21,16 +21,8 @@
*****************************************************************************/
/*global define,requirejs*/
requirejs.config({
shim: {
'platform/features/clock/lib/moment-duration-format': {
deps: [ 'moment' ]
}
}
});
define(
['moment', '../../lib/moment-duration-format'],
['moment', 'moment-duration-format'],
function (moment) {
"use strict";

View File

@@ -1,11 +0,0 @@
[
"actions/AbstractStartTimerAction",
"actions/RestartTimerAction",
"actions/StartTimerAction",
"controllers/ClockController",
"controllers/RefreshingController",
"controllers/TimerController",
"controllers/TimerFormatter",
"indicators/ClockIndicator",
"services/TickerService"
]

View File

@@ -1,6 +0,0 @@
[
"ConductorRepresenter",
"ConductorService",
"ConductorTelemetryDecorator",
"TimeConductor"
]

View File

@@ -1,7 +0,0 @@
[
"DomainColumn",
"EventListController",
"EventListPopulator",
"policies/MessagesViewPolicy",
"RangeColumn"
]

View File

@@ -1,5 +0,0 @@
[
"controllers/ImageryController",
"directives/MCTBackgroundImage",
"policies/ImageryViewPolicy"
]

View File

@@ -1,17 +0,0 @@
[
"FixedController",
"FixedDragHandle",
"FixedProxy",
"LayoutCompositionPolicy",
"LayoutController",
"LayoutDrag",
"elements/AccessorMutator",
"elements/BoxProxy",
"elements/ElementFactory",
"elements/ElementProxies",
"elements/ElementProxy",
"elements/LineProxy",
"elements/ResizeHandle",
"elements/TelemetryProxy",
"elements/TextProxy"
]

View File

@@ -1,3 +0,0 @@
[
"EmbeddedPageController"
]

View File

@@ -47,7 +47,7 @@
<div ng-repeat="tick in subplot.getRangeTicks()"
class="gl-plot-tick gl-plot-y-tick-label"
ng-style="{ bottom: (100 * $index / (subplot.getRangeTicks().length - 1)) + '%' }">
{{tick.label}}
{{tick.label | reverse}}
</div>
<div class="gl-plot-y-options gl-plot-local-controls"
ng-if="axes[1].options.length > 1">
@@ -61,7 +61,8 @@
</div>
<div class="gl-plot-display-area"
ng-mouseenter="subplot.isHovering(true);"
ng-mouseleave="subplot.isHovering(false)">
ng-mouseleave="subplot.isHovering(false)"
ng-class="{ loading: plot.isRequestPending() }">
<!-- Out-of-bounds data indicators -->
<!-- ng-show is temporarily hard-coded in next element -->
<div ng-show="false" class="l-oob-data l-oob-data-up"></div>
@@ -118,15 +119,13 @@
</div>
</div>
</div>
<span class="t-wait-spinner loading" ng-show="plot.isRequestPending()">
</span>
</div>
<div ng-if="$last" class="gl-plot-axis-area gl-plot-x">
<div ng-repeat="tick in subplot.getDomainTicks()"
class="gl-plot-tick gl-plot-x-tick-label"
ng-show="$index > 0 && $index < (subplot.getDomainTicks().length - 1)"
ng-style="{ left: (100 * $index / (subplot.getDomainTicks().length - 1)) + '%' }">
{{tick.label}}
{{tick.label | reverse}}
</div>
<div class="gl-plot-label gl-plot-x-label">
{{axes[0].active.name}}

View File

@@ -1,26 +0,0 @@
[
"Canvas2DChart",
"GLChart",
"MCTChart",
"PlotController",
"SubPlot",
"SubPlotFactory",
"elements/PlotAxis",
"elements/PlotLimitTracker",
"elements/PlotLine",
"elements/PlotLineBuffer",
"elements/PlotPalette",
"elements/PlotPanZoomStack",
"elements/PlotPanZoomStackGroup",
"elements/PlotPosition",
"elements/PlotPreparer",
"elements/PlotSeriesWindow",
"elements/PlotTelemetryFormatter",
"elements/PlotTickGenerator",
"elements/PlotUpdater",
"modes/PlotModeOptions",
"modes/PlotOverlayMode",
"modes/PlotStackMode",
"policies/PlotViewPolicy"
]

View File

@@ -1,6 +0,0 @@
[
"DomainColumn",
"policies/RTMessagesViewPolicy",
"RangeColumn",
"RTEventListController"
]

View File

@@ -1,7 +0,0 @@
[
"DomainColumn",
"NameColumn",
"RangeColumn",
"ScrollingListController",
"ScrollingListPopulator"
]

View File

@@ -142,11 +142,13 @@
right: 0;
left: auto; }
/* line 58, ../sass/_activities.scss */
.edit-mode .s-timeline-gantt .handle {
/* line 59, ../sass/_activities.scss */
.edit-mode .s-timeline-gantt .handle,
.s-status-editing .s-timeline-gantt .handle {
cursor: col-resize; }
/* line 60, ../sass/_activities.scss */
.edit-mode .s-timeline-gantt .handle.mid {
/* line 61, ../sass/_activities.scss */
.edit-mode .s-timeline-gantt .handle.mid,
.s-status-editing .s-timeline-gantt .handle.mid {
cursor: ew-resize; }
/*****************************************************************************
@@ -527,24 +529,39 @@
/* line 257, ../sass/_timelines.scss */
.l-timeline-holder .l-cols .l-col.l-title {
width: 250px; }
/* line 261, ../sass/_timelines.scss */
/* line 259, ../sass/_timelines.scss */
.l-timeline-holder .l-cols .l-col.l-title .rep-object-label[draggable="true"] {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
-moz-transition: background-color 0.25s;
-o-transition: background-color 0.25s;
-webkit-transition: background-color 0.25s;
transition: background-color 0.25s;
cursor: pointer;
display: inline-block;
padding: 0 3px; }
/* line 265, ../sass/_timelines.scss */
.l-timeline-holder .l-cols .l-col.l-title .rep-object-label[draggable="true"]:hover {
background-color: rgba(153, 153, 153, 0.1); }
/* line 271, ../sass/_timelines.scss */
.l-timeline-holder .l-cols .l-col.l-start, .l-timeline-holder .l-cols .l-col.l-end, .l-timeline-holder .l-cols .l-col.l-duration {
width: 110px; }
/* line 267, ../sass/_timelines.scss */
/* line 277, ../sass/_timelines.scss */
.l-timeline-holder .l-cols .l-col.l-activity-modes {
display: none;
width: 250px; }
/* line 275, ../sass/_timelines.scss */
/* line 285, ../sass/_timelines.scss */
.l-timeline-holder .s-timeline-tabular .l-header .l-cols {
top: 5px;
bottom: 5px; }
/* line 281, ../sass/_timelines.scss */
/* line 291, ../sass/_timelines.scss */
.l-timeline-holder .s-timeline-tabular .l-pane-l .l-cols {
left: 5px; }
/* line 287, ../sass/_timelines.scss */
/* line 297, ../sass/_timelines.scss */
.l-timeline-holder .splitter {
top: 0; }
/* line 293, ../sass/_timelines.scss */
/* line 303, ../sass/_timelines.scss */
.l-timeline-holder .l-ticks,
.l-timeline-holder .l-subticks {
overflow: hidden;
@@ -557,9 +574,9 @@
height: auto;
top: auto;
bottom: 3px; }
/* line 299, ../sass/_timelines.scss */
/* line 309, ../sass/_timelines.scss */
.l-timeline-holder .l-ticks {
height: 10px; }
/* line 303, ../sass/_timelines.scss */
/* line 313, ../sass/_timelines.scss */
.l-timeline-holder .l-subticks {
height: 5px; }

View File

@@ -256,6 +256,16 @@
&.l-title {
width: $timelineColTitleW;
.rep-object-label[draggable="true"] {
@include border-radius($basicCr);
@include single-transition(background-color, 0.25s);
cursor: pointer;
display: inline-block;
padding: 0 $interiorMarginSm;
&:hover {
background-color: $colorItemTreeHoverBg;
}
}
}
&.l-start,

View File

@@ -50,6 +50,7 @@
ng-style="{ 'margin-left': 15 * ngModel.depth + 'px' }">
<mct-representation key="'label'"
mct-object="ngModel.domainObject"
class="rep-object-label"
mct-swimlane-drag="ngModel">
</mct-representation>
</span>

View File

@@ -39,7 +39,7 @@ define(
function populateActionMap(domainObject) {
var actionCapability = domainObject.getCapability('action'),
actions = actionCapability ?
actionCapability.getActions('create') : [];
actionCapability.getActions('add') : [];
actions.forEach(function (action) {
actionMap[action.getMetadata().type] = action;
});

View File

@@ -85,6 +85,7 @@ define(
);
if (id) {
event.stopPropagation();
// Delegate the drop to the swimlane itself
swimlane.drop(id, (draggedSwimlane || {}).domainObject);
}

View File

@@ -74,7 +74,7 @@ define(
expect(mockDomainObject.getCapability)
.toHaveBeenCalledWith('action');
expect(mockActionCapability.getActions)
.toHaveBeenCalledWith('create');
.toHaveBeenCalledWith('add');
});
it("invokes the action on the selection, if any", function () {

View File

@@ -87,7 +87,8 @@ define(
testEvent = {
pageY: TEST_TOP + TEST_HEIGHT / 10,
dataTransfer: { getData: jasmine.createSpy() },
preventDefault: jasmine.createSpy()
preventDefault: jasmine.createSpy(),
stopPropagation: jasmine.createSpy()
};
testEvent.dataTransfer.getData.andReturn('abc');

View File

@@ -1,50 +0,0 @@
[
"TimelineConstants",
"TimelineFormatter",
"capabilities/ActivityTimespan",
"capabilities/ActivityTimespanCapability",
"capabilities/ActivityUtilization",
"capabilities/CostCapability",
"capabilities/GraphCapability",
"capabilities/CumulativeGraph",
"capabilities/ResourceGraph",
"capabilities/TimelineTimespan",
"capabilities/TimelineTimespanCapability",
"capabilities/TimelineUtilization",
"capabilities/UtilizationCapability",
"controllers/ActivityModeValuesController",
"controllers/TimelineController",
"controllers/TimelineGanttController",
"controllers/TimelineGraphController",
"controllers/TimelineTableController",
"controllers/TimelineTickController",
"controllers/TimelineZoomController",
"controllers/TimelineDateTimeController",
"controllers/drag/TimelineDragHandler",
"controllers/drag/TimelineDragHandleFactory",
"controllers/drag/TimelineDragPopulator",
"controllers/drag/TimelineSnapHandler",
"controllers/drag/TimelineStartHandle",
"controllers/drag/TimelineMoveHandle",
"controllers/drag/TimelineEndHandle",
"controllers/graph/TimelineGraph",
"controllers/graph/TimelineGraphPopulator",
"controllers/graph/TimelineGraphRenderer",
"controllers/swimlane/TimelineColorAssigner",
"controllers/swimlane/TimelineProxy",
"controllers/swimlane/TimelineSwimlane",
"controllers/swimlane/TimelineSwimlaneDecorator",
"controllers/swimlane/TimelineSwimlaneDropHandler",
"controllers/swimlane/TimelineSwimlanePopulator",
"directives/SwimlaneDragConstants",
"directives/MCTSwimlaneDrag",
"directives/MCTSwimlaneDrop",
"services/ObjectLoader"
]

File diff suppressed because one or more lines are too long

View File

@@ -22,8 +22,8 @@
/*global define,moment*/
define(
["../../lib/moment.min"],
function () {
["moment"],
function (moment) {
"use strict";
var DATE_FORMAT = "YYYY-MM-DD";

View File

@@ -26,7 +26,7 @@ define(
function (DateTimeController) {
"use strict";
describe("The date-time directive", function () {
describe("The date-time controller", function () {
var mockScope,
controller;

View File

@@ -1,9 +0,0 @@
[
"MCTControl",
"MCTForm",
"controllers/ColorController",
"controllers/CompositeController",
"controllers/DateTimeController",
"controllers/DialogButtonController",
"controllers/FormController"
]

View File

@@ -68,7 +68,7 @@ define([
},
{
"name": "RequireJS",
"version": "2.1.9",
"version": "2.1.22",
"description": "Script loader",
"author": "The Dojo Foundation",
"website": "http://requirejs.org/",
@@ -78,27 +78,27 @@ define([
},
{
"name": "AngularJS",
"version": "1.2.26",
"version": "1.4.4",
"description": "Client-side web application framework",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2014 Google, Inc. http://angularjs.org",
"copyright": "Copyright (c) 2010-2015 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.2.26/LICENSE"
"link": "https://github.com/angular/angular.js/blob/v1.4.4/LICENSE"
},
{
"name": "Angular-Route",
"version": "1.2.26",
"version": "1.4.4",
"description": "Client-side view routing",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2014 Google, Inc. http://angularjs.org",
"copyright": "Copyright (c) 2010-2015 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.2.26/LICENSE"
"link": "https://github.com/angular/angular.js/blob/v1.4.4/LICENSE"
},
{
"name": "ES6-Promise",
"version": "2.0.0",
"version": "3.0.2",
"description": "Promise polyfill for pre-ECMAScript 6 browsers",
"author": "Yehuda Katz, Tom Dale, Stefan Penner and contributors",
"website": "https://github.com/jakearchibald/es6-promise",

Some files were not shown because too many files have changed in this diff Show More