Compare commits

...

402 Commits

Author SHA1 Message Date
Pete Richards
262354c8cf [Enumerations] WIP for enumerated telemetry provider 2016-03-16 19:10:58 -07:00
Pete Richards
d30532a8bc Merge remote-tracking branch 'origin/open742' 2016-03-14 16:37:58 -07:00
Pete Richards
936079da92 Merge remote-tracking branch 'origin/tree-732' 2016-03-14 16:15:05 -07:00
Andrew Henry
4e89ffbe07 Merge pull request #735 from nasa/open729
Review and integrate open729
2016-03-14 16:12:18 -07:00
Henry
f9ed73c55e [Table] #742 Fixed digest-related bug in RTTelemetryController
Fixed failing test
2016-03-14 16:00:36 -07:00
Charles Hacskaylo
bf3b964ad2 Removed commented code
#729
#735
2016-03-14 15:45:10 -07:00
Victor Woeltjen
55ae755522 [Tree] Fix error in test case
Correctly expect both arguments to $watch
2016-03-14 15:04:58 -07:00
Victor Woeltjen
d522570c0b [Tree] Add spec for mct-tree 2016-03-14 14:54:57 -07:00
Victor Woeltjen
d72aaf54ca [Tree] Test inner tree creation 2016-03-14 14:40:46 -07:00
Victor Woeltjen
8f94751a35 [Tree] Add capabilities to child objects for testing 2016-03-14 14:14:34 -07:00
Andrew Henry
dfb0a570a3 Merge pull request #728 from nasa/warp135b
[Timelines] Export as CSV
2016-03-14 13:20:28 -07:00
Pete Richards
5d06979866 Merge remote-tracking branch 'origin/open707' 2016-03-14 13:05:59 -07:00
Victor Woeltjen
8b51ae32d2 [Tree] Begin testing selection change 2016-03-14 13:04:46 -07:00
Victor Woeltjen
ecb37c54be [Tree] Add TreeView test cases 2016-03-14 12:52:33 -07:00
Victor Woeltjen
43492d31ba [Tree] Begin writing spec for TreeView 2016-03-14 12:22:09 -07:00
Victor Woeltjen
0e1df444df [Tree] Update test configuration
...to account for new dependency on Zepto (and its necessary
shim.)
2016-03-14 12:21:58 -07:00
Victor Woeltjen
f2c040367b [Timeline] Rename TimelineCSVExporter
...to TimelineColumnizer, clarifying its role/responsibilities in the
context of the CSV export task;
https://github.com/nasa/openmctweb/pull/728#discussion_r56031331
2016-03-14 12:00:31 -07:00
Victor Woeltjen
0ff360ced3 [Timelines] Remove excessive ternaries
...to improve readability of logic to determine which columns
are needed for a given group of domain objects for CSV export,
as requested during code review,
https://github.com/nasa/openmctweb/pull/728#discussion_r55910477
2016-03-14 11:53:28 -07:00
Henry
fc08df4f6f [Tables] #733 Made code style changes for conformance with style guide 2016-03-14 11:25:26 -07:00
Henry
c5de90a951 [Tables] Changed the way that new rows are added to table
Fixed failing tests
2016-03-13 20:15:47 -07:00
Henry
ea0b86fe72 [Tables] Fixed issue with historical tables composed of multiple objects 2016-03-13 19:12:55 -07:00
Victor Woeltjen
d789e91c18 [Tree] Add wait spinner 2016-03-11 18:00:58 -08:00
Victor Woeltjen
f7ba24c0b6 [Tree] Enable gestures on labels 2016-03-11 17:43:18 -08:00
Victor Woeltjen
02ec6db104 [Tree] Trigger digest on tree selection change 2016-03-11 17:37:11 -08:00
Victor Woeltjen
a3a9393d1b [Tree] Change selection on click 2016-03-11 17:32:57 -08:00
Victor Woeltjen
217e697079 [Tree] Display selection state 2016-03-11 17:26:00 -08:00
Victor Woeltjen
82b6166408 [Tree] Begin wiring in selection 2016-03-11 17:09:17 -08:00
Victor Woeltjen
03ab3bddc4 [Tree] Begin handling selection state 2016-03-11 17:00:55 -08:00
Andrew Henry
abd5913f02 Merge pull request #727 from nasa/open377
[Search] Index directly on mutation
2016-03-11 15:39:43 -08:00
Victor Woeltjen
107ecfe687 [Search] Don't index objects being edited
https://github.com/nasa/openmctweb/pull/727#issuecomment-195570183
2016-03-11 14:55:16 -08:00
Victor Woeltjen
4a8222a152 [Tree] Update labels on mutation 2016-03-11 14:47:50 -08:00
Victor Woeltjen
7ee8d0a3f7 [Tree] Display tree correctly 2016-03-11 14:40:04 -08:00
Victor Woeltjen
dc2b3e85cc [Tree] Show tree with toggle 2016-03-11 14:33:05 -08:00
Victor Woeltjen
d4b15525ca [Tree] Begin using mct-tree for tree representation 2016-03-11 14:23:08 -08:00
Victor Woeltjen
cbd9509260 [Tree] Use TreeView from mct-tree 2016-03-11 14:13:14 -08:00
Victor Woeltjen
c5ab6c6c97 [Tree] Implement label for tree 2016-03-11 14:10:30 -08:00
Andrew Henry
cd84a017b8 Merge pull request #723 from nasa/open672
[Build] Enforce code coverage threshold
2016-03-11 13:34:26 -08:00
Andrew Henry
d39dea971f Merge pull request #721 from nasa/open716
[Info Bubble] Fix bug with arrow positioning
2016-03-11 13:13:49 -08:00
Victor Woeltjen
4f293f22a6 [Tree] Add Zepto dependency
...to support implementation of a jQuery-less tree.
2016-03-11 12:38:40 -08:00
Victor Woeltjen
cebf9f73da [Tree] Begin adding tree label 2016-03-11 12:29:24 -08:00
Victor Woeltjen
37e6b5a352 [Tree] Continue breaking apart tree view 2016-03-11 11:39:10 -08:00
Victor Woeltjen
ece8f7fded [Tree] Begin separating out TreeView 2016-03-11 11:12:43 -08:00
Victor Woeltjen
3b0a3733b4 [Tree] Begin adding controller for refactored tree 2016-03-11 10:23:06 -08:00
Victor Woeltjen
baab0be5af [Tree] Begin adding mct-tree directive
...to reduce watch counts associated with the tree;
#732 and #315
2016-03-11 10:04:33 -08:00
Victor Woeltjen
d14a2a6366 Merge pull request #736 from nasa/open718
Review and integrate open718
2016-03-11 09:52:18 -08:00
Charles Hacskaylo
377d533ec7 [Frontend] Fixed markup
open #718
Removed class from markup;
2016-03-10 18:11:10 -08:00
Charles Hacskaylo
a4c5854561 [Frontend] Bug fixing
open #729
open #498
Fixed markup to use proper CSS classes
to allow tree items in Inspector Elements to
ellipsize properly, and to apply scroll regions
to the proper elements;
2016-03-10 14:33:01 -08:00
Victor Woeltjen
5296255fa6 [Representation] Test for false-positives on refresh
#732
2016-03-10 14:26:20 -08:00
Victor Woeltjen
5d084c2618 [Representation] Fix unchanged check
Fix logic in unchanged check; compare booleans to detect if
they have changed, instead of just anding them. Partially
addresses #732
2016-03-10 14:21:20 -08:00
Henry
5208631528 [Tables] #707 removed redundant bundles 2016-03-10 13:55:59 -08:00
Henry
a56edb9ff4 [table] #707 Fixed sorting on insert for numbers
Added metadata to event generator
2016-03-10 13:39:16 -08:00
Henry
7da1a218ba [Tables] #707 Added auto-scroll, addressed race condition in Sinewave and event telemetry providers
Fixed issue with visible padding row

Incremental improvements

Added tests

Added tests for sorted insert, and fixed lint errors
2016-03-10 13:21:57 -08:00
Henry
a4eb9d6a94 [Tables] #707 Supporting realtime telemetry tables
Added real-time table type
2016-03-10 13:21:57 -08:00
Henry
20f1dcef45 Fixed scrolling 2016-03-10 13:21:01 -08:00
Charles Hacskaylo
4983d35ca6 [Frontend] Cleanups to Inspector config elements
open #729
Spacing tweaks; set PlotOptionsForm.js > Autoscale
to not use control-first layout;
Checked in snow theme;
2016-03-10 13:18:57 -08:00
Charles Hacskaylo
7171fd01e3 [Frontend] Cleanups to Inspector config elements
open #729
In-progress
Moved CSS def to be more globally applicable;
Simplified layout obj props location display;
2016-03-10 11:07:26 -08:00
Charles Hacskaylo
0957fbc6f9 [Frontend] Cleanups to Inspector config elements
open #729
In-progress
Moved reduced-min-width into _inspector.scss;
Removed <style> defs in markup files;
2016-03-10 10:50:00 -08:00
Charles Hacskaylo
bdbb045005 [Frontend] Cleanups to Inspector config elements
open #729
In-progress!
Markup and CSS mods continued;
Config params added to PlotOptionsForm.js to
allow control-first layout per form row;
Changed titles of Inspector parts;
2016-03-10 10:31:05 -08:00
Charles Hacskaylo
318df9878d [Frontend] Cleanups to Inspector config elements
open #729
In-progress!
Markup and CSS modified to cleanup control layout
and styling in Plot and Table config options;
gulpfile.js modified to include SASS source line numbers
in rendered CSS;
2016-03-09 17:22:41 -08:00
Victor Woeltjen
406a31889e [Timeline] Add specs for remaining columns 2016-03-08 12:34:08 -08:00
Victor Woeltjen
9e4e3e9c43 [Timeline] Add JSDoc
Add JSDoc to classes implemented Export Timeline as CSV
2016-03-08 11:59:53 -08:00
Victor Woeltjen
bd7cb98a4c [Timeline] Add missing semicolon
...to pass code style checks
2016-03-08 11:40:54 -08:00
Victor Woeltjen
0d419fa5fd [Timeline] Test TimelineTraverser 2016-03-08 11:30:26 -08:00
Victor Woeltjen
5ee5e7fea1 [Timeline] Add capabilities to test inputs 2016-03-08 10:47:01 -08:00
Victor Woeltjen
66b1a92554 [Timeline] Add test cases for TimelineTraverser 2016-03-08 10:43:13 -08:00
Victor Woeltjen
c23c2b84bf [Timeline] Test inclusion of timespan properties
...in prepared data for CSV export
2016-03-08 10:31:31 -08:00
Victor Woeltjen
0c2285719e [Timeline] Test inclusion of metadata headers 2016-03-08 10:27:50 -08:00
Victor Woeltjen
fd92c5f970 [Timeline] Add more tests for rows 2016-03-08 10:22:46 -08:00
Victor Woeltjen
938c266b4e [Timeline] Add Id column to CSV export 2016-03-08 10:20:25 -08:00
Victor Woeltjen
9e6e33983b [Timeline] Add more objects to test case 2016-03-08 10:17:10 -08:00
Victor Woeltjen
40895ec1b9 [Timelines] Begin spec for exporter 2016-03-08 10:07:21 -08:00
Victor Woeltjen
43db52fd70 [Timeline] Simplify interface
...such that responsibility for knowing exportService interface
is more localized.
2016-03-08 10:04:09 -08:00
Victor Woeltjen
75d6803c9f [Timeline] Test mode columns in CSV Export 2016-03-08 09:59:54 -08:00
Victor Woeltjen
ed679756b3 [Timelines] Test metadata columns in CSV Export
...and additionally refactor to run in a test environment
(don't use Array.prototype.find)
2016-03-08 09:56:21 -08:00
Victor Woeltjen
dd66cb60d8 [Timeline] Test export task 2016-03-08 09:47:09 -08:00
Victor Woeltjen
d5283d57e4 [Timeline] Add missing semicolon 2016-03-07 16:35:40 -08:00
Victor Woeltjen
7c140c06dc [Timeline] Test CSV Export action itself 2016-03-07 16:33:03 -08:00
Victor Woeltjen
f9ff9921a9 [Timelines] Continue testing CSV Export
...with initial test cases for the action itself.
2016-03-07 16:22:39 -08:00
Victor Woeltjen
cdac0ad67f [Timeline] Add test cases for CSV Export 2016-03-07 16:17:19 -08:00
Victor Woeltjen
5d771edcf7 [Timeline] Begin testing CSV Export 2016-03-07 16:13:23 -08:00
Victor Woeltjen
c4f1c4ad1f [Timeline] Show progress notification during export 2016-03-07 16:09:23 -08:00
Victor Woeltjen
14b8e02f27 [Timeline] Format exported start/end times 2016-03-07 16:02:33 -08:00
Victor Woeltjen
b383921f2a [Timeline] Export start/end to CSV 2016-03-07 16:00:13 -08:00
Victor Woeltjen
a509dfb840 [Timelines] Remove unused TaskService
https://developer.nasa.gov/mct/warp/issues/135
2016-03-07 15:30:57 -08:00
Victor Woeltjen
b7a44a7557 Merge branch 'master' into warp135b 2016-03-07 15:21:28 -08:00
Victor Woeltjen
2d305415b3 [Search] Index directly on mutation
Pass model directly when indexing is triggered via object mutation,
to avoid issuing an extra, unnecessary request to the server.

Additionally supports indexing of objects which have been created
but not yet persisted.

Addresses #377.
2016-03-07 14:46:36 -08:00
Victor Woeltjen
ff5f37dfbe [Build] Bump version number
...and add SNAPSHOT status, to begin sprint Gibson.
https://github.com/nasa/openmctweb/milestones/Gibson
2016-03-04 13:59:41 -08:00
Victor Woeltjen
7c2ddf3926 [Build] Remove snapshot status
...to close sprint Ellison,
https://github.com/nasa/openmctweb/milestones/Ellison
2016-03-04 13:48:31 -08:00
Victor Woeltjen
18167eddf8 [Build] Enforce code coverage threshold
Addresses #672
2016-03-03 17:14:04 -08:00
Victor Woeltjen
f302bd6cb2 [Info Bubble] Test arrow class application
#716
2016-03-03 16:17:01 -08:00
Victor Woeltjen
071a908c10 [Info Bubble] Don't clobber arrow classes
#716
2016-03-03 15:58:28 -08:00
Pete Richards
7e60593501 Merge remote-tracking branch 'origin/open670' 2016-03-03 11:28:28 -08:00
Henry
f653362247 Fixed issue with non-named columns 2016-03-03 10:12:25 -08:00
Henry
b63b7b1e5d [Tables] #670 Addressed issues from code review 2016-03-03 09:26:12 -08:00
Henry
55e00baeaf [Table] #670 Addressed comments from code review 2016-03-02 21:40:56 -08:00
Victor Woeltjen
75178576dd Merge pull request #712 from nasa/open627_no_regions_master
[Edit Mode] #627 Remove edit-related concerns from Browse controllers
2016-03-02 12:12:11 -08:00
Henry
670c06103f [Edit Mode] Rebased over master 2016-03-02 11:45:15 -08:00
Henry
7b5218c5ba [Edit Mode] #627 Fixed failing tests
Removed reference to defunct NavigationServiceDecorator

Removed virtual panels from drop gesture
2016-03-02 11:12:41 -08:00
Henry
f192544be3 Addressing issues from code review 2016-03-02 11:10:49 -08:00
Henry
2cc2c6a9d3 [Edit Mode] #627 removed edit concerns from browse controllers and markup
Fixed elements not appearing in edit mode

Fixed failing tests
2016-03-02 11:05:23 -08:00
Henry
a910fa8f37 Removed unused 'controller as' 2016-03-02 11:01:34 -08:00
Henry
65ca78d8aa Added missing dependency on 2016-03-02 11:00:08 -08:00
Henry
2f036a89e4 Refactoring out regions 2016-03-02 11:00:08 -08:00
Henry
fa46d31ac2 [Edit Mode] #627 slightly modified edit representer to detect newly created objects
Added some comments, renamed controller variable in markup

Removed edit references from BrowseController
2016-03-02 10:57:05 -08:00
Henry
549dfab5aa [Edit Mode] #627 remove edit concerns from browse controller 2016-03-02 10:55:18 -08:00
Victor Woeltjen
494212a448 Merge pull request #653 from nasa/open499
[Notifications] #499 All notifications now dismissable by default.
2016-03-01 14:50:56 -08:00
Victor Woeltjen
8511dc93b5 Merge pull request #714 from nasa/ci-test-reporter
[Build] run JSHint on circleci, generate test reports
2016-03-01 13:47:24 -08:00
Pete Richards
751414a686 [CI] Save coverage in artifacts
Save code coverage results in artifacts when building on circleci.
2016-03-01 13:37:52 -08:00
Pete Richards
668b09b789 [Style] Pull functions out of loop
Pull functions out of loop for jshint compliance.
2016-03-01 13:25:37 -08:00
Pete Richards
b9e0a77655 [CI] Run JSHINT after tests 2016-03-01 13:07:16 -08:00
Henry
b9a7ee423a Merge branch 'master' into open670_master 2016-03-01 12:56:08 -08:00
Henry
b5c6b70993 Merge branch 'master' into open670_master 2016-03-01 12:55:45 -08:00
Pete Richards
d9b2034550 [Tests] Add jUnit reporter
Add jUnit reporter to allow CircleCI to store test results.
2016-03-01 12:53:32 -08:00
Pete Richards
183bd9793c Merge branch 'open677' 2016-03-01 11:33:31 -08:00
Pete Richards
d176797307 [Style] Add missing semicolon 2016-03-01 10:59:23 -08:00
Pete Richards
96d9f8c194 [Templates] load plot templates with require
Load templates with requirejs.

https://github.com/nasa/openmctweb/issues/673
2016-03-01 10:52:07 -08:00
Pete Richards
748673f99b Merge branch 'master' into open638_rebase 2016-03-01 10:48:53 -08:00
Pete Richards
78374f8241 Merge branch 'open401' 2016-03-01 10:37:12 -08:00
Pete Richards
bc6185f76d [Browse] Remove unused constant
https://github.com/nasa/openmctweb/issues/401
2016-03-01 10:36:30 -08:00
Henry
747a98d130 Addressed issues from code review 2016-02-29 18:42:48 -08:00
Andrew Henry
7daaecbf8f Merge pull request #710 from nasa/open673
[Templates] Load templates using RequireJS text plugin
2016-02-29 18:45:46 +00:00
Andrew Henry
6f9e78a14f Merge pull request #711 from nasa/open442a
[Frontend] Markup, CSS changes
2016-02-29 17:36:54 +00:00
Victor Woeltjen
beee4136a6 Merge pull request #702 from nasa/open164
Review and integrate open164
2016-02-26 16:49:26 -08:00
Charles Hacskaylo
5a9bcfa938 [Frontend] Markup, CSS changes
#442
Removed white space from markup;
Moved getGlyphClass up to status-block-holder
element out of status-block;
CSS mods to selectors and style defs
in _messages.scss;
2016-02-26 16:48:23 -08:00
Victor Woeltjen
721557b814 [Templates] Exercise selection method
...add to TimelineSwimlanePopulator to reflect changes to
time at which selection object may become available as
a consequence to changes in the way templates are normally
loaded. #673
2016-02-26 16:29:06 -08:00
Victor Woeltjen
70ed16491a [Templates] Change watch order
...to work around order-sensitive test case
2016-02-26 16:26:31 -08:00
Victor Woeltjen
7240ff4f8d [Templates] Update mct-control spec
...to reflect usage of templateLinker, to support including
templates via RequireJS text plugin
2016-02-26 16:22:55 -08:00
Victor Woeltjen
3a6e0be2d7 [Templates] Update FixedController spec
...to reflect changes to how selection object is obtained,
which in turn reflects change to using templates obtained
via RequireJS text plugin, instead of loading by URL.
2016-02-26 16:19:14 -08:00
Victor Woeltjen
9b21b0b7f2 [Templates] Update mct-container spec
...to reflect change to template over templateUrl
2016-02-26 16:17:33 -08:00
Victor Woeltjen
164c2faf07 Merge branch 'master' into open673
Merge latest from master into topic branch for #673
2016-02-26 15:54:41 -08:00
Victor Woeltjen
894cf5c461 [Templates] Include templates in test configuration
...such that they are available to the RequireJS text plugin
for loading.
2016-02-26 15:53:35 -08:00
Victor Woeltjen
fe419714f5 [Templates] Check for availability of timespan
...as ordering changes due to change from templateUrl to template
may mean this is not available when first initialized.
2016-02-26 15:50:07 -08:00
Victor Woeltjen
f3fd2e67fc [Templates] Watch for selection object
...from Timeline, to ensure toolbar appears etc.
Reflects changes to ordering triggered by use of
template instead of templateUrl
2016-02-26 15:49:21 -08:00
Victor Woeltjen
931fa77cbe [Templates] Handle deferred selection availability
Loading templates via RequireJS text plugin means they are
immediately available; appears to have caused a change in
ordering wherein controllers for views may be initialized
before representers have installed things like selection
state. As such, need to watch for changes instead of simply
checking for a selection object when the controller is
initialized.
2016-02-26 15:37:19 -08:00
Andrew Henry
872c4021e3 Merge pull request #82 from tarikozket/patch-1
Fixed typo
2016-02-26 23:28:24 +00:00
Andrew Henry
26d29c3d92 Merge pull request #652 from nasa/open649
[CSV Export] Implement exportService
2016-02-26 23:18:12 +00:00
Victor Woeltjen
596735352a [Templates] Simplify MCTToolbar
Use mct-form as a basis; simply change the template.
2016-02-26 15:17:31 -08:00
Henry
402512a461 Merged from master to resolve conflict 2016-02-26 15:15:22 -08:00
Victor Woeltjen
2d03e3e6d4 [Templates] Remove unused template path calculation 2016-02-26 15:03:45 -08:00
Victor Woeltjen
19b442cc0b [Templates] Require data table templates
...via text plugin
2016-02-26 15:02:04 -08:00
Victor Woeltjen
5c3d8508a2 [Templates] Use templateLinker for forms
...for compatibility with both template and templateUrl
2016-02-26 15:01:40 -08:00
Victor Woeltjen
8581547a9c [Templates] Allow only template property for containers
...to work around difficulties with transclusion using
templateLinker.
2016-02-26 14:49:55 -08:00
Charles Hacskaylo
192bbae6e5 [Frontend] Fix paths, includes
#702
Per https://github.com/nasa/openmctweb/pull/702;
Removed include of _logo-and-bg.scss into _about.scss;
2016-02-26 14:49:34 -08:00
Victor Woeltjen
e61711688e [Templates] Use templateLinker from MCTContainer
...for compatibility with both template and templateUrl.
2016-02-26 14:24:41 -08:00
Victor Woeltjen
a73f1ebbbd Merge pull request #637 from nasa/rems_data
[Examples] Rems data integration
2016-02-26 14:21:30 -08:00
Henry
4674918b4b [Examples] #359 Updated to attempt connection to remote data source and fallback to local if unavailable
Minor change to readme

Fixed JSLint errors

More JSLint errors

[Example] Rems data integration - disabled bundle by default.

[Examples] REMS data integration - added newlines at end of files

[Example] Added time conductor support to REMS data integration

Added caching of results

[Examples] Added domain format to REMS data #359

[Example] #637 Added local proxy to app.js to allow cross-origin requests

Updated readme
2016-02-26 14:03:10 -08:00
Victor Woeltjen
741d4476e6 [Templates] Use text plugin for toolbar 2016-02-26 13:12:35 -08:00
Victor Woeltjen
bf1fa0ac4c [Templates] Include templates using text plugin
Resolves #673
2016-02-26 13:07:50 -08:00
Victor Woeltjen
60efdb4ad3 [Templates] Add in-place rewrite step 2016-02-26 13:07:32 -08:00
Victor Woeltjen
8ea56486c5 [Templates] Normalize spacing 2016-02-26 13:03:06 -08:00
Victor Woeltjen
e13e068b6e [Templates] Begin teplacing templateUrl properties 2016-02-26 13:00:50 -08:00
Victor Woeltjen
852faf061e [Templates] Add parameter names for required templates 2016-02-26 12:52:02 -08:00
Victor Woeltjen
f2e4b01721 [Templates] Add template paths
...with text! prefix
2016-02-26 12:50:28 -08:00
Victor Woeltjen
930fed83e8 [Templates] Create variable names by template URL 2016-02-26 12:17:57 -08:00
Victor Woeltjen
4666292907 [Templates] Begin writing migration script
...to rewrite bundle.js files to load templates via
the RequireJS text plugin. #673
2016-02-26 12:12:13 -08:00
Henry
f04c3692c1 [Table] #670 Name column only prepended if multiple objects 2016-02-26 11:22:16 -08:00
Henry
ffa497f22f [Table] #670 Added new view type 'table' 2016-02-26 11:09:51 -08:00
Victor Woeltjen
0068348bb2 Merge pull request #704 from nasa/open703
[Examples] #703 Changed imagery telemetry metadata to use 'utc' format
2016-02-26 11:00:26 -08:00
Charles Hacskaylo
bc3eb4ab8d [Frontend] New logo art
#164
New logo art for Open MCT added;
Removed console.log;
2016-02-26 10:59:54 -08:00
Charles Hacskaylo
d203f3adc0 [Frontend] New logo art; paths changed
#164
Per comments in #702, abs paths changed
to relative;
New logo art for Open MCT added;
CSS tweaked as needed;
2016-02-26 10:15:15 -08:00
Henry
5e7eb7e87e [Examples] #703 Changed imagery telemetry metadata to use 'utc' format for time 2016-02-26 09:32:03 -08:00
Charles Hacskaylo
1a2a2e66ca [Frontend] Removed commented styling
open #164
2016-02-25 12:41:54 -08:00
Charles Hacskaylo
129b554f9d [Frontend] Significant markup/CSS mods for splash screen
#164
https://github.jpl.nasa.gov/MissionControl/vista/issues/299
App logo and bg files renamed;
Added openmct.scss to hold openmct-specific styles;
Renamed _startup.scss to startup-base.scss
which now renders its own .css file;

Still to-do: apply to WARP including needed
mods to its About dialog screen;
2016-02-24 17:47:24 -08:00
Charles Hacskaylo
164d959f60 [Frontend] Significant markup/CSS mods for splash screen
#164
Markup in index.html and about-dialog.html
changed to simplify and use :before/:after psuedos;
CSS in _logo-and-bg.scss modded for same;
Added _startup.scss to hold general CSS for
the startup screen;
Renamed startup.scss to startup-open.scss;
Modified SplashScreenManager.js to target renamed
outer container .l-splash-holder;
Added media query for startup screen on phone;
Cleanup: moved classes out of _effects into _global;
Still to-do: apply to WARP and VISTA, including needed
mods to their About dialog screens;
2016-02-23 18:30:21 -08:00
Charles Hacskaylo
99cf690ad4 Merge branch 'master' into open164 2016-02-23 16:03:24 -08:00
Henry
aabeb72203 [Plots] #638 Fixed failing test 2016-02-23 15:22:21 -08:00
Pete Richards
fcdf89a4ee Merge branch 'master' into open638_rebase 2016-02-23 10:56:13 -08:00
Pete Richards
77a2e0a70b Merge branch 'master' into open639 2016-02-23 10:46:33 -08:00
Victor Woeltjen
f379db55e7 Merge pull request #699 from nasa/remove-compass
Remove compass, add bourbon
2016-02-23 10:00:01 -08:00
Pete Richards
51fbbfe601 [Gulp] Revert accidental change 2016-02-22 19:07:36 -08:00
Pete Richards
eaab70741a [Build] Generate CSS sourcemaps
Generate CSS sourcemaps to aide in debugging.

https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:57:05 -08:00
Pete Richards
a05d6d8ee8 [Build] Rebuild scss when starting server
Rebuild scss when starting the development server.

https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:30:07 -08:00
Pete Richards
88945c48d4 [Build] Gracefully handle sass error
https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:29:26 -08:00
Pete Richards
bd7ad85bd7 [Build] Remove unused dependency
https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:28:45 -08:00
Pete Richards
9b3c8dce25 [SCSS] Remove old references to compass
Remove any old references to compass.

https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:22:44 -08:00
Pete Richards
4d800d26e2 [CSS] Add reset to replace compass/reset
Add reset.css which replaces compass/reset.

https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:18:06 -08:00
Pete Richards
0a71835687 [Build] Switch compass to bourbon
Change mixin library to bourbon.  Significantly reduces sass build time.

https://github.com/nasa/openmctweb/issues/698
2016-02-22 18:02:16 -08:00
Pete Richards
25f3b1e110 [Frontend] Add splash screen manager
Add a runtime extension that detects the splash screen and triggers a fade out
after the application has loaded.  Once the fade out has ended, it removes the
element from the page.

Related to https://github.com/nasa/openmctweb/issues/164
2016-02-22 16:39:20 -08:00
Charles Hacskaylo
31a983966b [Frontend] In-progress on adding branded per-app screens
open #164
CSS, markup;
2016-02-22 15:44:57 -08:00
Victor Woeltjen
87934df0d5 Merge pull request #697 from nasa/handle-scss-errors
[Build] Gracefully handle scss errors
2016-02-22 15:34:59 -08:00
Pete Richards
db1a7e37e8 [Build] Gracefully handle scss errors
Log errors in SCSS processing but don't crash watch process.

Fixes https://github.com/nasa/openmctweb/issues/696
2016-02-22 15:29:00 -08:00
Victor Woeltjen
d3e274bfdd Merge branch 'master' into open401
Resolve conflicts for #416

Conflicts:
	platform/commonUI/browse/bundle.json
	platform/commonUI/browse/src/BrowseController.js
2016-02-22 14:27:21 -08:00
Pete Richards
b5c88e5c5c Merge pull request #695 from nasa/open442
Review and integrate open442
2016-02-22 13:43:59 -08:00
Victor Woeltjen
5d8efebc55 Merge pull request #694 from nasa/fix-watch
[Build] reinstantiate compass per task execution
2016-02-22 12:54:29 -08:00
Charles Hacskaylo
729d91e7f3 [Frontend] CSS sanding and shimming
open #442
Fixed white space problem with .status-block-holder
applied to mct-include; Added new status 'available'
class and updated theme constants files;
2016-02-22 12:51:32 -08:00
Pete Richards
34b0b55b97 [Build] reinstantiate compass per task execution
Reinstantiate compass wrapper for each task execution.  Allows stylesheets
task to be run multiple times by watch.  Fixes a bug that prevents watch
from working properly.
2016-02-22 12:45:41 -08:00
Charles Hacskaylo
bd0867b79d Merge branch 'master' into open442
Conflicts:
	platform/commonUI/themes/espresso/res/css/theme-espresso.css
	platform/commonUI/themes/snow/res/css/theme-snow.css
2016-02-22 11:11:32 -08:00
Victor Woeltjen
6d036a5d67 Merge pull request #693 from nasa/build-css
[Build] Add stylesheets to build
2016-02-22 10:59:46 -08:00
Pete Richards
c0168088a1 Merge pull request #692 from nasa/prod-uisymbols
Integrate new VISTA Topic and Session glyphs
2016-02-22 10:58:24 -08:00
Pete Richards
5f81e95c87 [Build] Add Gemfile, use bundle exec
Add a Gemfile to specify ruby dependencies and update gulp-compass to use
bundle exec to execute compass.

Addresses comments in https://github.com/nasa/openmctweb/pull/693
2016-02-22 10:37:30 -08:00
Charles Hacskaylo
ebf501ce71 [Frontend] Markup and CSS related to indicators; hover styles
open #442
https://github.jpl.nasa.gov/MissionControl/vista/issues/293

s-btn hover styling cleaned up;
Spacing, styles, etc. for indicators refined;
Constants, colors added to, cleaned up and normalized;
Animation code in _effects refactored;
2016-02-19 17:59:32 -08:00
Pete Richards
ed09214f59 [Build] Save stylesheets to proper location
Updates the stylesheet task to output CSS in the correct locations. Remove
config.rb for running compass manually, and remove compiled css files from
project.  Add a .gitignore to ensure they don't get included accidentally.

Add a gulp task for running the development server and watching for scss
changes at the same time.

resolves https://github.com/nasa/openmctweb/issues/238
2016-02-19 13:26:20 -08:00
Charles Hacskaylo
b0b2db24e0 [Frontend] Mods to .status.block
open #442
Added clickable class; tweaks to indicator.html
to introduce s-btn element look;
2016-02-18 18:03:43 -08:00
Charles Hacskaylo
a2f8f4334f Updated font to include new VISTA session and topic glyphs 2016-02-18 16:42:56 -08:00
Charles Hacskaylo
626cc502fb [Frontend] Removed -moz-osx-font-smoothing property
open #687
2016-02-18 13:24:06 -08:00
Charles Hacskaylo
95f1768fb7 [Frontend] Refactoring to use Victorizr instead of media queries
open #639
open #683
open #169
Tweak to espresso tree view control color and hover color
for espresso theme; reordered elements in _constants;
2016-02-18 13:10:54 -08:00
Charles Hacskaylo
fb20af24bc [Frontend] Refactoring to use Victorizr instead of media queries
open #639
open #683
open #169
open #335
    Fixed wrong application of body.desktop.mini-tab...;
    Increased size of pane collapse/expand icons;
    Removed max-width applied to search input holder;
2016-02-18 11:25:12 -08:00
Charles Hacskaylo
f6cb76354e [Frontend] Refactoring to use Victorizr instead of media queries
open #639
open #683
open #169
MQs refactored in mobile/_layout.scss;
2016-02-17 16:34:33 -08:00
Charles Hacskaylo
66905cbcbb [Frontend] Refactoring to use Victorizr instead of media queries
open #639
open #683
open #169
open #494
Replaced MQ around mobile/_tree.scss ul.tree;
Removed MQ desktop around hover in mixin btnBase;
Reversed orientation of mobile tree arrows for #494;
2016-02-17 16:12:18 -08:00
Charles Hacskaylo
a4f24adb8a [Frontend] Refactoring to use Victorizr instead of media queries
open #639
Replaced MQ around _controls webkit-scrollbar CSS;
2016-02-17 10:26:42 -08:00
Charles Hacskaylo
242e02e9af Added compass_scripts directory
open #639
Added dir to .gitignore
2016-02-17 10:20:58 -08:00
Charles Hacskaylo
0ddaa52a8a [Frontend] Refactor CSS to not use 'desktop' media query
open #639
Refactored all usage of @include desktop to use CSS selector body.desktop
instead; Still to-do: deal with desktopandtablet usage with hover bubbles
and mixins btnBase;
2016-02-16 18:38:06 -08:00
Pete Richards
6fee4f340f [Build] Start 0.9.2-SNAPSHOT 2016-02-12 12:34:54 -08:00
Pete Richards
1eb372177d [Build] Add npmignore to allow packing
Add .npmignore to facilitate packing of package with npm pack.
2016-02-12 11:47:28 -08:00
Pete Richards
3de094e311 [Version] Remove snapshot for tag
Update the version in advance of tagging a release.
2016-02-12 11:17:11 -08:00
Melanie Lean
53c60ee64f [Timelines] #677 Applied fix to prevent editing of timelines in browse mode
Fixed failing test
2016-02-11 21:52:05 -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
Henry
7d0de68db9 [Plot] #638 Changed plot series to an array 2016-02-10 20:27:04 -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
24c750b41e [Plot] Fixed jsLint, removed onchange
Removed ngChange from mct-control

Removed ng-change
2016-02-09 21:19:47 -08:00
Henry
ab1c79f25d [Plot] Switched to $watchCollection on form model 2016-02-09 20:52:47 -08:00
Henry
668c02f278 [Edit Mode] Added ability to clear all dirty cache 2016-02-09 19:29:55 -08:00
Victor Woeltjen
437b235361 [CSV Export] Update JSDoc
Fill in complete JSDoc and separate out callback documentation
per code review:

https://github.com/nasa/openmctweb/pull/652/files#r52263213
https://github.com/nasa/openmctweb/pull/652/files#r52264447
2016-02-09 12:30:53 -08:00
Victor Woeltjen
6880c82719 [CSV Export] Restructure example
Restructure CSV export example to reflect recommended style
for plugins, per code review;
https://github.com/nasa/openmctweb/pull/652#discussion_r52263869
2016-02-09 12:13:33 -08:00
Henry
645bd5743f [Plots] #638 Addressing feedback from code review
[Plots] #638 Fixing failing tests

[Plot] Changed PlotOptionsController to prototype form

Fixed spacing

Fixed jslint issue
2016-02-08 23:36:45 -08:00
Victor Woeltjen
273cf1c14f [Timeline] Fix columns exported 2016-02-08 18:07:03 -08:00
Henry
be031285b9 Added form-level change event 2016-02-08 17:46:21 -08:00
Victor Woeltjen
303e870b0d Merge branch 'open649' into warp135 2016-02-08 17:42:30 -08:00
Victor Woeltjen
b42ccebd5a [Timeline] Fix imports, dependencies
Fix imports and dependencies needed by Export Timeline as CSV
2016-02-08 17:42:26 -08:00
Victor Woeltjen
a444fc01ad [Timeline] Fix column module definitions 2016-02-08 17:34:10 -08:00
Victor Woeltjen
a126e43286 [Timelines] Handle columns during CSV export 2016-02-08 16:11:00 -08:00
Victor Woeltjen
32fc50bbd3 [Timelines] Begin sketching in taskService
...to separate out immediate commonality with other long-running
actions which need to show a blocking progress dialog.
2016-02-08 15:04:39 -08:00
Victor Woeltjen
4adb075a2b [Timelines] Separate out timeline traversal
...from rest of CSV export.
2016-02-08 13:59:34 -08:00
Victor Woeltjen
d8b1e570d9 [CSV Export] Begin implementing
Begin implementing initial step, wherein timelines composition
is traversed to build up a list of objects to export.
2016-02-08 13:36:25 -08:00
Victor Woeltjen
5033e2cdbb [Timeline] Begin adding Export as CSV
Sketch in solution for
https://developer.nasa.gov/mct/warp/issues/135
2016-02-08 13:04:41 -08:00
Victor Woeltjen
b40ac6f44f Merge remote-tracking branch 'origin/master' into open649 2016-02-08 12:25:25 -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
Henry
5292b27e7d [Notifications] #499 All notifications now dismissable by default.
jslint
2016-02-05 17:51:31 -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
3adc5f1e26 [CSV Export] Upgrade to phantomjs launcher 1.0.0 2016-02-05 16:56:26 -08:00
Victor Woeltjen
92e49d6b76 [CSV Export] Add licensing info for run-time
Add licensing info for CSV.js and FileSaver.js as licenses
which can be displayed at run-time.
2016-02-05 16:10:30 -08:00
Victor Woeltjen
659d05f73a [CSV Export] Update LICENSES.md
...to reflect usage of CSV.js and FileSaver.js, added to
support export.
2016-02-05 16:05:41 -08:00
Victor Woeltjen
215008253d [Build] Prevent accidental publish 2016-02-05 15:57:54 -08:00
Victor Woeltjen
2f0fd8eebd [CSV Export] Add JSDoc to ExportService 2016-02-05 15:12:47 -08:00
Victor Woeltjen
882cf80ba9 [CSV Export] Include exportService as active bundle 2016-02-05 15:07:51 -08:00
Victor Woeltjen
8c1264ab22 [CSV Export] Add example of exportService usage 2016-02-05 15:07:18 -08:00
Victor Woeltjen
cb0f191ab3 [CSV Export] Add FileSaver dependency
...to handle export part of CSV export.
2016-02-05 14:39:28 -08:00
Victor Woeltjen
c07dc0ea8b [CSV Export] Test with specified filename 2016-02-05 14:08:47 -08:00
Victor Woeltjen
c4d5643ea7 [CSV Export] Test with headers specified 2016-02-05 14:06:40 -08:00
Victor Woeltjen
300d71ddc2 [CSV Export] Verify CSV data content 2016-02-05 14:03:15 -08:00
Victor Woeltjen
54c67b891c [CSV Export] Update PhantomJS version
Use version 2.1+ for availability of Linux binaries;
incidentally addresses #258.
2016-02-05 13:59:03 -08:00
Victor Woeltjen
013690e0df [CSV Export] Add test case which examines CSV 2016-02-05 13:58:17 -08:00
Victor Woeltjen
8868b6a130 [CSV Export] Begin testing exportService
...including fixes to immediately-identified errors.
2016-02-05 13:32:21 -08:00
Victor Woeltjen
750a5648d2 [CSV Export] Upgrade PhantomJS
...for Blob support.
2016-02-05 13:31:08 -08:00
Victor Woeltjen
cec6295d24 [CSV Export] Sketch in exportService 2016-02-05 13:02:21 -08:00
Victor Woeltjen
15eb4b047f [CSV Export] Add empty scripts for CSV export 2016-02-05 12:47:57 -08:00
Victor Woeltjen
3ae8fcc8b4 [CSV Export] Add CSV library as dependency
For use in general-purpose CSV export service, #649
2016-02-05 12:21:09 -08:00
Henry
9371fcbc4c [Plot] #638 Added a new plot options example bundle and rebased
Fixed jsdoc

Fixed incorrect memberof declaration

Corrected memberof statement
2016-02-04 15:17:07 -08:00
Pete Richards
f5e0ad23ea Merge remote-tracking branch 'open/prod-uisymbols' into open-master 2016-02-04 14:37:18 -08:00
Henry
abf5f22155 [Plots] #638 added onchange handling in order to synchronize forms with domain object model.
Fixed failing test

Added tests

jslint errors

Minor refactoring of layout bundle

revert layout/bundle.json
2016-02-04 14:26:21 -08:00
Charles Hacskaylo
f2903f4030 [Frontend] Final styling on properties form in Inspector
open #638
Added custom radio button control and modified
PlotOptionsController / plotOptionsStructure
accordingly; spacing, borders, etc. are
all as finally intended;
2016-02-04 14:25:02 -08:00
Charles Hacskaylo
371669fbce [Frontend] Mods in progress to form layout
open #638
Major progress on form-row markup and CSS when
in Inspector 'part' context; General fixes cleanups
to custom checkbox/radio CSS;
2016-02-04 14:23:29 -08:00
Charles Hacskaylo
68f3cd087d [Frontend] Mods in progress to form layout
open #638
In progress;
2016-02-04 14:23:29 -08:00
Charles Hacskaylo
115ffe7963 [Frontend] Fixes to scrolling and layout in Inspector
open #638
In progress;
2016-02-04 14:23:29 -08:00
Henry
e3a0cae5fd [Plot] #638 Fleshing out form structures 2016-02-04 14:23:29 -08:00
Charles Hacskaylo
8bb5a47b88 CSS updated to use new e619 character
open #638
2016-02-04 14:23:28 -08:00
Charles Hacskaylo
f1b6d7f749 [Frontend] New custom radio mctControl
open #638
Markup and initial CSS
2016-02-04 14:23:28 -08:00
Henry
6fb6761abf [Plots] #638 New plot display options 2016-02-04 14:23:28 -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
Henry
c091063b83 [Examples] #359 Cleaned up REMS data integration example. 2016-01-22 10:49:40 -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
Charles Hacskaylo
2d44cf78f9 [Frontend] Fixed HTML and CSS for grid-item
open #486
Normalized grid-item to use similar HTML structure
as label template;
Fixed CSS accordingly.
2016-01-15 15:33:10 -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
Henry
2e65a6a63e Updating code to conform to code style 2015-12-11 15:39:53 -08:00
Victor Woeltjen
43f6981ba1 [Browse] Test navigation when path is not found 2015-12-11 13:21:52 -08:00
Victor Woeltjen
b8206b8824 [Browse] Ensure selection at startup
...even when domain object identified by default path is
not found.
2015-12-11 13:18:25 -08:00
Victor Woeltjen
5f7f349f29 [Browse] Specify default selection in a constant
https://github.com/nasa/openmctweb/issues/401
2015-12-11 12:31:06 -08:00
Henry
ef0a918b59 Merge branch 'open338' into rems_data 2015-12-03 19:02:28 -08:00
Henry
5fd1f6a055 Merge branch 'open338' into rems_data 2015-12-03 18:57:07 -08:00
Henry
d45c5e2ffb Added 'setLocation' flag 2015-12-03 18:56:59 -08:00
Henry
1fef6b30b7 Merge branch 'open338' into rems_data 2015-12-03 18:41:50 -08:00
Henry
461cc59b3e #338 changed isLink check to check whether location is set 2015-12-03 18:41:13 -08:00
Henry
c038ccd0d2 Removed unused parameter 2015-12-03 18:24:38 -08:00
Henry
e16b156d1d Merge branch 'open338' into rems_data 2015-12-03 15:28:25 -08:00
Henry
1f6284257e Merge branch 'open338' into rems_data 2015-12-03 14:48:02 -08:00
Henry
16bf800257 Merge branch 'open338' into rems_data 2015-12-02 19:19:08 -08:00
Henry
7fad2f6f2e Merge branch 'open338' into rems_data 2015-12-02 19:10:33 -08:00
Henry
73ca30e654 Merged changes from Master 2015-12-01 10:44:42 -08:00
Andrew Henry
fc751b1332 Merge remote-tracking branch 'origin/open181' into rems_data_merge 2015-10-22 21:31:45 -07:00
Andrew Henry
cdc2a407dc Fixed erroneous data 2015-10-22 21:30:13 -07:00
Andrew Henry
14722a6ef5 Reset histories before fetching 2015-10-16 08:32:44 -07:00
Andrew Henry
0538d6e60f Initial working version 2015-10-12 19:54:03 -07:00
Andrew Henry
1fcf900271 Added telemetry request ID prefix 2015-10-12 10:41:21 -07:00
Andrew Henry
183468fcbf Trying to figure out why requests have no 'source' property 2015-10-10 12:17:30 -07:00
Henry
9b11d95437 shuttle 2015-10-08 16:04:14 -07:00
Henry
67d78772fa Added providers, adapters, data dictionary 2015-10-08 08:46:44 -07:00
Tarik
7f0f03e787 Fixed typo 2015-08-25 14:20:27 +03:00
395 changed files with 11696 additions and 56700 deletions

7
.gitignore vendored
View File

@@ -4,8 +4,11 @@
*.tgz
*.DS_Store
# Compiled CSS, unless directly added
*.sass-cache
*COMPILE.css
*.css
*.css.map
# Intellij project configuration files
*.idea
@@ -15,6 +18,7 @@
# Build output
target
dist
# Mac OS X Finder
.DS_Store
@@ -22,8 +26,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
}

35
.npmignore Normal file
View File

@@ -0,0 +1,35 @@
*.scssc
*.zip
*.gzip
*.tgz
*.DS_Store
*.sass-cache
*COMPILE.css
# Intellij project configuration files
*.idea
*.iml
# External dependencies
# Build output
target
# Mac OS X Finder
.DS_Store
# Closed source libraries
closed-lib
# Node, Bower dependencies
node_modules
bower_components
Procfile
# Protractor logs
protractor/logs
# npm-debug log
npm-debug.log

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
@@ -380,6 +416,104 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
### CSV.js
#### Info
* Link: https://github.com/knrz/CSV.js
* Version: 3.6.4
* Authors: Kash Nouroozi
* Description: Encoder for CSV (comma separated values) export
#### License
Copyright (c) 2014 Kash Nouroozi
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.
---
### FileSaver.js
#### Info
* Link: https://github.com/eligrey/FileSaver.js/
* Version: 0.0.2
* Authors: Eli Grey
* Description: File download initiator (for file exports)
#### License
Copyright © 2015 Eli Grey.
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.
---
### Zepto
#### Info
* Link: http://zeptojs.com/
* Version: 1.1.6
* Authors: Thomas Fuchs
* Description: DOM manipulation
#### License
Copyright (c) 2010-2016 Thomas Fuchs
http://zeptojs.com/
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.
---
### Json.NET
#### Info

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)
@@ -66,7 +45,7 @@ When `npm test` is run, test results will be written as HTML to
The tests described above are all at the unit-level; an additional
test suite using [Protractor](https://angular.github.io/protractor/)
us under development, in the `protractor` folder.
is under development, in the `protractor` folder.
To run:
@@ -77,24 +56,22 @@ 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
@@ -105,7 +82,7 @@ npm install. Ensure your system has [libcairo](http://cairographics.org/)
installed and then run the following commands:
* `npm install`
* `npm install nomnoml`
* `npm install canvas nomnoml`
* `npm run docs`
Documentation will be generated in `target/docs`.

11
app.js
View File

@@ -14,7 +14,8 @@
options = require('minimist')(process.argv.slice(2)),
express = require('express'),
app = express(),
fs = require('fs');
fs = require('fs'),
request = require('request');
// Defaults
options.port = options.port || options.p || 8080;
@@ -61,6 +62,14 @@
res.send(JSON.stringify(bundles));
});
app.use('/proxyUrl', function proxyRequest(req, res, next) {
console.log('Proxying request to: ', req.query.url);
req.pipe(request({
url: req.query.url,
strictSSL: false
}).on('error', next)).pipe(res);
});
// Expose everything else as static files
app.use(express['static']('.'));

23
bower.json Normal file
View File

@@ -0,0 +1,23 @@
{
"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",
"comma-separated-values": "^3.6.4",
"FileSaver.js": "^0.0.2",
"zepto": "^1.1.6"
}
}

View File

@@ -2,7 +2,7 @@ deployment:
production:
branch: master
commands:
- npm install nomnoml
- npm install canvas nomnoml
- ./build-docs.sh
- git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master
openmctweb-staging-un:
@@ -13,3 +13,6 @@ deployment:
branch: mobile
heroku:
appname: openmctweb-staging-deux
test:
post:
- npm run jshint --silent

View File

@@ -910,7 +910,24 @@ A capability's implementation may also expose a static method `appliesTo(model)`
which should return a boolean value, and will be used by the platform to filter
down capabilities to those which should be exposed by specific domain objects,
based on their domain object models.
## Containers Category
Containers provide options for the `mct-container` directive.
The definition for an extension in the `containers` category should include:
* `key`: An identifier for the container.
* `template`: An Angular template for the container, including an
`ng-transclude` where contained content should go.
* `attributes`: An array of attribute names. The values associated with
these attributes will be exposed in the template's scope under the
name provided by the `alias` property.
* `alias`: The property name in scope under which attributes will be
exposed. Optional; defaults to "container".
Note that `templateUrl` is not supported for `containers`.
## Controls Category
Controls provide options for the `mct-control` directive.
@@ -2245,18 +2262,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.

View File

@@ -0,0 +1,111 @@
/*****************************************************************************
* 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/EnumeratedTelemetryProvider",
'legacyRegistry'
], function (
EnumeratedTelemetryProvider,
legacyRegistry
) {
"use strict";
legacyRegistry.register("example/enumeratedTelemetry", {
"name": "Enumerated telemetry generator",
"description": "Example telemetry source that provides enumerated telemetry.",
"extensions": {
"components": [
{
"implementation": EnumeratedTelemetryProvider,
"type": "provider",
"provides": "telemetryService",
"depends": [
"$q",
"$interval"
]
}
],
"types": [
{
"key": "example.telemetry.enumerated",
"name": "Enumerated Telemetry Generator",
"glyph": "T",
"description": "Generated enumerated telemetry data",
"features": "creation",
"model": {
"telemetry": {
}
},
"telemetry": {
"source": "example.telemetry.enumerated",
"domains": [
{
"key": "time",
"name": "Time"
}
],
"ranges": [
{
"key": "eu",
"name": "Engineering Unit"
},
{
"key": "eu",
"name": "Enum",
"type": "enum",
"format": "enum",
"enumerations": [
{
"key": "eu",
"format": "enum",
"value": 0,
"string": "OFF"
},
{
"key": "eu",
"format": "enum",
"value": 1,
"string": "IDLE"
},
{
"key": "eu",
"format": "enum",
"value": 2,
"string": "RECEIVE"
},
{
"key": "eu",
"format": "enum",
"value": 3,
"string": "TRANSMIT"
}
]
}
]
}
}
]
}
});
});

View File

@@ -0,0 +1,163 @@
/*****************************************************************************
* 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.
*****************************************************************************/
define(
["./EnumeratedTelemetrySeries"],
function (EnumeratedTelemetrySeries) {
"use strict";
function EnumeratedTelemetryProvider($q, $interval) {
this.$q = $q;
this.$interval = $interval;
}
EnumeratedTelemetryProvider.prototype.matchRequest = function (
request
) {
return request.source === 'example.telemetry.enumerated';
};
// Return a telemetry series between start and end time with
// 1000 telemetry points.
EnumeratedTelemetryProvider.prototype.getSeries = function (
start,
end,
request
) {
var elapsedSeconds = (end - start) / 1000,
valueEvery = elapsedSeconds / 1000,
currentSecond = 0,
values = [],
currentValue = 0;
while (currentSecond < elapsedSeconds) {
values.push({
time: +new Date(+start + (currentSecond * 1000)),
eu: currentValue
});
if ((values.length % Math.pow(3, currentValue + 1)) === 0) {
if (currentValue === 3) {
currentValue = 0;
} else {
currentValue += 1;
}
}
currentSecond += valueEvery;
}
return new EnumeratedTelemetrySeries(values);
};
EnumeratedTelemetryProvider.prototype.requestTelemetry = function (
requests
) {
var validRequests = requests.filter(this.matchRequest),
generatedTelemetry = {},
response = {
'example.telemetry.enumerated': generatedTelemetry
};
validRequests.forEach(function (validRequest) {
var start = validRequest.start,
end = validRequest.end;
if (!end) {
end = new Date(Date.now());
}
if (!start) {
start = new Date(Date.UTC(
end.getUTCFullYear(),
end.getUTCMonth(),
end.getUTCDate() - 1,
end.getUTCHours(),
end.getUTCMinutes(),
end.getUTCSeconds(),
end.getUTCMilliseconds()
));
}
generatedTelemetry[validRequest.key] =
this.getSeries(start, end);
}, this);
return this.$q.resolve(response);
};
EnumeratedTelemetryProvider.prototype.makeTelemetryEmitter = function (
request,
callback
) {
var valueEvery = 1000,
currentSecond = 0,
valuesGenerated = 0,
currentValue = 0,
interval;
interval = this.$interval(function () {
var value = {
time: +new Date(Date.now()),
eu: currentValue
},
series = new EnumeratedTelemetrySeries([value]);
valuesGenerated += 1;
if ((valuesGenerated % Math.pow(3, currentValue + 1)) === 0) {
if (currentValue === 3) {
currentValue = 0;
} else {
currentValue += 1;
}
}
callback(series);
}, valueEvery);
return function () {
this.$interval.cancel(interval);
}.bind(this);
}
EnumeratedTelemetryProvider.prototype.subscribe = function (
callback,
requests
) {
var validRequests = requests.filter(this.matchRequest),
unsubscribes = validRequests.map(function (request) {
var cb = function (series) {
var telem = {},
response = {
'example.telemetry.enumerated': telem
};
telem[request.key] = series;
callback(response);
}
return this.makeTelemetryEmitter(request, cb);
}, this)
return function () {
unsubscribes.forEach(function(unsubscribe) {
unsubscribe();
});
};
};
return EnumeratedTelemetryProvider;
}
);

View File

@@ -0,0 +1,63 @@
/*****************************************************************************
* 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.
*****************************************************************************/
define([
], function (
) {
'use strict';
function EnumeratedTelemetrySeries(data) {
this.data = data;
}
EnumeratedTelemetrySeries.prototype.getPointCount = function (index) {
return this.data.length;
};
EnumeratedTelemetrySeries.prototype.getDatum = function (index) {
if (index > this.data.length || index < 0) {
throw new Error('IndexOutOfRange: index not available in series.');
}
return this.data[index];
};
EnumeratedTelemetrySeries.prototype.getRangeValue = function (
index,
range
) {
range = range || 'eu';
return this.getDatum(index)[range];
};
EnumeratedTelemetrySeries.prototype.getDomainValue = function (
index,
domain
) {
domain = domain || 'time';
return this.getDatum(index)[domain];
};
return EnumeratedTelemetrySeries;
});

View File

@@ -57,8 +57,17 @@ define([
},
"telemetry": {
"source": "eventGenerator",
"domains": [
{
"key": "time",
"name": "Time",
"format": "utc"
}
],
"ranges": [
{
"key": "message",
"name": "Message",
"format": "string"
}
]

View File

@@ -37,7 +37,8 @@ define(
var
subscriptions = [],
genInterval = 1000,
startTime = Date.now();
generating = false,
id = Math.random() * 100000;
//
function matchesSource(request) {
@@ -79,11 +80,13 @@ define(
}
function startGenerating() {
generating = true;
$timeout(function () {
//console.log("startGenerating... " + Date.now());
handleSubscriptions();
if (subscriptions.length > 0) {
if (generating && subscriptions.length > 0) {
startGenerating();
} else {
generating = false;
}
}, genInterval);
}
@@ -93,7 +96,6 @@ define(
callback: callback,
requests: requests
};
function unsubscribe() {
subscriptions = subscriptions.filter(function (s) {
return s !== subscription;
@@ -101,8 +103,7 @@ define(
}
subscriptions.push(subscription);
if (subscriptions.length === 1) {
if (!generating) {
startGenerating();
}

View File

@@ -0,0 +1,89 @@
/*****************************************************************************
* 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';
/**
* An example of using the `exportService`; queries for telemetry
* and provides the results as a CSV file.
* @param {platform/exporters.ExportService} exportService the
* service which will handle the CSV export
* @param {ActionContext} context the action's context
* @constructor
* @memberof example/export
* @implements {Action}
*/
function ExportTelemetryAsCSVAction(exportService, context) {
this.exportService = exportService;
this.context = context;
}
ExportTelemetryAsCSVAction.prototype.perform = function () {
var context = this.context,
domainObject = context.domainObject,
telemetry = domainObject.getCapability("telemetry"),
metadata = telemetry.getMetadata(),
domains = metadata.domains,
ranges = metadata.ranges,
exportService = this.exportService;
function getName(domainOrRange) {
return domainOrRange.name;
}
telemetry.requestData({}).then(function (series) {
var headers = domains.map(getName).concat(ranges.map(getName)),
rows = [],
row,
i;
function copyDomainsToRow(row, index) {
domains.forEach(function (domain) {
row[domain.name] = series.getDomainValue(index, domain.key);
});
}
function copyRangesToRow(row, index) {
ranges.forEach(function (range) {
row[range.name] = series.getRangeValue(index, range.key);
});
}
for (i = 0; i < series.getPointCount(); i += 1) {
row = {};
copyDomainsToRow(row, i);
copyRangesToRow(row, i);
rows.push(row);
}
exportService.exportCSV(rows, { headers: headers });
});
};
ExportTelemetryAsCSVAction.appliesTo = function (context) {
return context.domainObject &&
context.domainObject.hasCapability("telemetry");
};
return ExportTelemetryAsCSVAction;
});

View File

@@ -22,40 +22,22 @@
/*global define*/
define([
"./src/RTScrollingListController",
'legacyRegistry'
], function (
RTScrollingListController,
legacyRegistry
) {
'legacyRegistry',
'./ExportTelemetryAsCSVAction'
], function (legacyRegistry, ExportTelemetryAsCSVAction) {
"use strict";
legacyRegistry.register("platform/features/rtscrolling", {
"name": "Scrolling Lists",
"description": "Time-ordered list of latest data.",
legacyRegistry.register("example/export", {
"name": "Example of using CSV Export",
"extensions": {
"views": [
"actions": [
{
"key": "scrolling",
"name": "Scrolling",
"glyph": "5",
"description": "Scrolling list of data values.",
"templateUrl": "templates/rtscrolling.html",
"needs": [
"telemetry"
],
"delegation": true
}
],
"controllers": [
{
"key": "RTScrollingListController",
"implementation": RTScrollingListController,
"depends": [
"$scope",
"telemetryHandler",
"telemetryFormatter"
]
"key": "example.export",
"name": "Export Telemetry as CSV",
"implementation": ExportTelemetryAsCSVAction,
"category": "contextual",
"glyph": "\u0033",
"depends": [ "exportService" ]
}
]
}

View File

@@ -34,7 +34,8 @@ define(
* @constructor
*/
function SinewaveTelemetryProvider($q, $timeout) {
var subscriptions = [];
var subscriptions = [],
generating = false;
//
function matchesSource(request) {
@@ -75,10 +76,13 @@ define(
}
function startGenerating() {
generating = true;
$timeout(function () {
handleSubscriptions();
if (subscriptions.length > 0) {
if (generating && subscriptions.length > 0) {
startGenerating();
} else {
generating = false;
}
}, 1000);
}
@@ -97,7 +101,7 @@ define(
subscriptions.push(subscription);
if (subscriptions.length === 1) {
if (!generating) {
startGenerating();
}

View File

@@ -60,7 +60,7 @@ define([
{
"name": "Time",
"key": "time",
"format": "timestamp"
"format": "utc"
}
],
"ranges": [

View File

@@ -1,26 +0,0 @@
# Require any additional compass plugins here.
# require "compass-growl"
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "js"
# You can select your preferred output style here (can be overridden via the command line):
# :expanded, :compressed, :nested
output_style = :nested
# To enable relative paths to assets via compass helper functions. Uncomment:
relative_assets = true
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass vfn_platform/static/sass scss && rm -rf sass && mv scss sass

View File

@@ -1,103 +0,0 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*****************************************************************************
* 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.
*****************************************************************************/
/************************** FEATURES */
/************************** VERY INFLUENTIAL GLOBAL DIMENSIONS */
/************************** RATIOS */
/************************** LAYOUT */
/************************** CONTROLS */
/************************** PATHS */
/************************** TIMINGS */
/************************** LIMITS */
/*****************************************************************************
* 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.
*****************************************************************************/
/************************** MOBILE REPRESENTATION ITEMS DIMENSIONS */
/************************** MOBILE TREE MENU DIMENSIONS */
/************************** WINDOW DIMENSIONS FOR RWD */
/************************** MEDIA QUERIES: WINDOW CHECKS FOR SPECIFIC ORIENTATIONS FOR EACH DEVICE */
/************************** MEDIA QUERIES: WINDOWS FOR SPECIFIC ORIENTATIONS FOR EACH DEVICE */
/************************** DEVICE PARAMETERS FOR MENUS/REPRESENTATIONS */
/*****************************************************************************
* 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.
*****************************************************************************/
/* REQUIRES mobile/_constants */
@media screen and (orientation: portrait) and (max-width: 514px) and (max-height: 740px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (max-height: 514px) and (max-width: 740px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (max-height: 514px) and (max-width: 740px) and (max-device-width: 1024px) and (max-device-height: 799px), screen and (orientation: portrait) and (min-width: 515px) and (max-width: 799px) and (min-height: 741px) and (max-height: 1024px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (min-height: 515px) and (max-height: 799px) and (min-width: 741px) and (max-width: 1024px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (min-height: 515px) and (max-height: 799px) and (min-width: 741px) and (max-width: 1024px) and (max-device-width: 1024px) and (max-device-height: 799px) {
/* line 28, ../sass/mobile-example.scss */
.create-btn-holder {
display: block !important; } }

20
example/msl/README.md Normal file
View File

@@ -0,0 +1,20 @@
To use this bundle, add the following paths to /main.js -
'./platform/features/conductor/bundle',
'./example/msl/bundle',
An example plugin that integrates with public data from the Curiosity rover.
The data shown used by this plugin is published by the Centro de
Astrobiología (CSIC-INTA) at http://cab.inta-csic.es/rems/
Fetching data from this source requires a cross-origin request which will
fail on most modern browsers due to restrictions on such requests. As such,
it is proxied through a local proxy defined in app.js. In order to use this
example you will need to run app.js locally.
This example shows integration with an historical telemetry source, as
opposed to a real-time data source that is streaming back current information
about the state of a system. This example is atypical of a historical data
source in that it fetches all data in one request. The server infrastructure
of an historical telemetry source should ideally allow queries bounded by
time and other data attributes.

118
example/msl/bundle.js Normal file
View File

@@ -0,0 +1,118 @@
/*****************************************************************************
* 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/RemsTelemetryServerAdapter",
"./src/RemsTelemetryInitializer",
"./src/RemsTelemetryModelProvider",
"./src/RemsTelemetryProvider",
'legacyRegistry',
"module"
], function (
RemsTelemetryServerAdapter,
RemsTelemetryInitializer,
RemsTelemetryModelProvider,
RemsTelemetryProvider,
legacyRegistry
) {
"use strict";
legacyRegistry.register("example/notifications", {
"name" : "Mars Science Laboratory Data Adapter",
"extensions" : {
"types": [
{
"name":"Mars Science Laboratory",
"key": "msl.curiosity",
"glyph": "o"
},
{
"name": "Instrument",
"key": "msl.instrument",
"glyph": "o",
"model": {"composition": []}
},
{
"name": "Measurement",
"key": "msl.measurement",
"glyph": "T",
"model": {"telemetry": {}},
"telemetry": {
"source": "rems.source",
"domains": [
{
"name": "Time",
"key": "timestamp",
"format": "utc"
}
]
}
}
],
"constants": [
{
"key": "REMS_WS_URL",
"value": "/proxyUrl?url=http://cab.inta-csic.es/rems/wp-content/plugins/marsweather-widget/api.php"
}
],
"roots": [
{
"id": "msl:curiosity",
"priority" : "preferred",
"model": {
"type": "msl.curiosity",
"name": "Mars Science Laboratory",
"composition": []
}
}
],
"services": [
{
"key":"rems.adapter",
"implementation": RemsTelemetryServerAdapter,
"depends": ["$q", "$http", "$log", "REMS_WS_URL"]
}
],
"runs": [
{
"implementation": RemsTelemetryInitializer,
"depends": ["rems.adapter", "objectService"]
}
],
"components": [
{
"provides": "modelService",
"type": "provider",
"implementation": RemsTelemetryModelProvider,
"depends": ["rems.adapter"]
},
{
"provides": "telemetryService",
"type": "provider",
"implementation": RemsTelemetryProvider,
"depends": ["rems.adapter", "$q"]
}
]
}
});
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,79 @@
/*****************************************************************************
* 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(
[],
/**
* A data dictionary describes the telemetry available from a data
* source and its data types. The data dictionary will be parsed by a custom
* server provider for this data source (in this case
* {@link RemsTelemetryServerAdapter}).
*
* Typically a data dictionary would be made available alongside the
* telemetry data source itself.
*/
function () {
return {
"name": "Mars Science Laboratory",
"identifier": "msl",
"instruments": [
{
"name":"rems",
"identifier": "rems",
"measurements": [
{
"name": "Min. Air Temperature",
"identifier": "min_temp",
"units": "degrees",
"type": "float"
},
{
"name": "Max. Air Temperature",
"identifier": "max_temp",
"units": "degrees",
"type": "float"
},
{
"name": "Atmospheric Pressure",
"identifier": "pressure",
"units": "pascals",
"type": "float"
},
{
"name": "Min. Ground Temperature",
"identifier": "min_gts_temp",
"units": "degrees",
"type": "float"
},
{
"name": "Max. Ground Temperature",
"identifier": "max_gts_temp",
"units": "degrees",
"type": "float"
}
]
}
]
};
}
);

View File

@@ -0,0 +1,71 @@
/*****************************************************************************
* 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";
var TAXONOMY_ID = "msl:curiosity",
PREFIX = "msl_tlm:";
/**
* Function that is executed on application startup and populates
* the navigation tree with objects representing the MSL REMS
* telemetry points. The tree is populated based on the data
* dictionary on the provider.
*
* @param {RemsTelemetryServerAdapter} adapter The server adapter
* (necessary in order to retrieve data dictionary)
* @param objectService the ObjectService which allows for lookup of
* objects by ID
* @constructor
*/
function RemsTelemetryInitializer(adapter, objectService) {
function makeId(element) {
return PREFIX + element.identifier;
}
function initializeTaxonomy(dictionary) {
function getTaxonomyObject(domainObjects) {
return domainObjects[TAXONOMY_ID];
}
function populateModel (taxonomyObject) {
return taxonomyObject.useCapability(
"mutation",
function (model) {
model.name = dictionary.name;
model.composition = dictionary.instruments.map(makeId);
}
);
}
objectService.getObjects([TAXONOMY_ID])
.then(getTaxonomyObject)
.then(populateModel);
}
initializeTaxonomy(adapter.dictionary);
}
return RemsTelemetryInitializer;
}
);

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*/
define(
function (){
"use strict";
var PREFIX = "msl_tlm:",
FORMAT_MAPPINGS = {
float: "number",
integer: "number",
string: "string"
};
function RemsTelemetryModelProvider(adapter){
function isRelevant(id) {
return id.indexOf(PREFIX) === 0;
}
function makeId(element){
return PREFIX + element.identifier;
}
function buildTaxonomy(dictionary){
var models = {};
function addMeasurement(measurement){
var format = FORMAT_MAPPINGS[measurement.type];
models[makeId(measurement)] = {
type: "msl.measurement",
name: measurement.name,
telemetry: {
key: measurement.identifier,
ranges: [{
key: "value",
name: measurement.units,
units: measurement.units,
format: format
}]
}
};
}
function addInstrument(subsystem) {
var measurements = (subsystem.measurements || []);
models[makeId(subsystem)] = {
type: "msl.instrument",
name: subsystem.name,
composition: measurements.map(makeId)
};
measurements.forEach(addMeasurement);
}
(dictionary.instruments || []).forEach(addInstrument);
return models;
}
return {
getModels: function (ids) {
return ids.some(isRelevant) ? buildTaxonomy(adapter.dictionary) : {};
}
};
}
return RemsTelemetryModelProvider;
}
);

View File

@@ -0,0 +1,83 @@
/*****************************************************************************
* 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 (
['./RemsTelemetrySeries'],
function (RemsTelemetrySeries) {
"use strict";
var SOURCE = "rems.source";
function RemsTelemetryProvider(adapter, $q) {
this.adapter = adapter;
this.$q = $q;
}
/**
* Retrieve telemetry from this telemetry source.
* @memberOf example/msl
* @param {Array<TelemetryRequest>} requests An array of all request
* objects (which needs to be filtered to only those relevant to this
* source)
* @returns {Promise} A {@link Promise} resolved with a {@link RemsTelemetrySeries}
* object that wraps the telemetry returned from the telemetry source.
*/
RemsTelemetryProvider.prototype.requestTelemetry = function (requests) {
var packaged = {},
relevantReqs,
adapter = this.adapter;
function matchesSource(request) {
return (request.source === SOURCE);
}
function addToPackage(history) {
packaged[SOURCE][history.id] =
new RemsTelemetrySeries(history.values);
}
function handleRequest(request) {
return adapter.history(request).then(addToPackage);
}
relevantReqs = requests.filter(matchesSource);
packaged[SOURCE] = {};
return this.$q.all(relevantReqs.map(handleRequest))
.then(function () {
return packaged;
});
};
/**
* This data source does not support real-time subscriptions
*/
RemsTelemetryProvider.prototype.subscribe = function (callback, requests) {
return function() {};
};
RemsTelemetryProvider.prototype.unsubscribe = function (callback, requests) {
return function() {};
};
return RemsTelemetryProvider;
}
);

View File

@@ -0,0 +1,84 @@
/*****************************************************************************
* 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";
/**
* @typedef {Object} RemsTelemetryValue
* @memberOf example/msl
* @property {number} date The date/time of the telemetry value. Constitutes the domain value of this value pair
* @property {number} value The value of this telemetry datum.
* A floating point value representing some observable quantity (eg.
* temperature, air pressure, etc.)
*/
/**
* A representation of a collection of telemetry data. The REMS
* telemetry data is time ordered, with the 'domain' value
* constituting the time stamp of each data value and the
* 'range' being the value itself.
*
* TelemetrySeries will typically wrap an array of telemetry data,
* and provide an interface for retrieving individual an telemetry
* value.
* @memberOf example/msl
* @param {Array<RemsTelemetryValue>} data An array of telemetry values
* @constructor
*/
function RemsTelemetrySeries(data) {
this.data = data;
}
/**
* @returns {number} A count of the number of data values available in
* this series
*/
RemsTelemetrySeries.prototype.getPointCount = function() {
return this.data.length;
};
/**
* The domain value at the given index. The Rems telemetry data is
* time ordered, so the domain value is the time stamp of each data
* value.
* @param index
* @returns {number} the time value in ms since 1 January 1970
*/
RemsTelemetrySeries.prototype.getDomainValue = function(index) {
return this.data[index].date;
};
/**
* The range value of the REMS data set is the value of the thing
* being measured, be it temperature, air pressure, etc.
* @param index The datum in the data series to return the range
* value of.
* @returns {number} A floating point number
*/
RemsTelemetrySeries.prototype.getRangeValue = function(index) {
return this.data[index].value;
};
return RemsTelemetrySeries;
}
);

View File

@@ -0,0 +1,142 @@
/*****************************************************************************
* 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*/
/*jslint es5: true */
define(
[
"./MSLDataDictionary",
"module"
],
function (MSLDataDictionary, module) {
"use strict";
var TERRESTRIAL_DATE = "terrestrial_date",
LOCAL_DATA = "../data/rems.json";
/**
* Fetches historical data from the REMS instrument on the Curiosity
* Rover.
* @memberOf example/msl
* @param $q
* @param $http
* @param REMS_WS_URL The location of the REMS telemetry data.
* @constructor
*/
function RemsTelemetryServerAdapter($q, $http, $log, REMS_WS_URL) {
this.localDataURI = module.uri.substring(0, module.uri.lastIndexOf('/') + 1) + LOCAL_DATA;
this.deferreds = {};
this.REMS_WS_URL = REMS_WS_URL;
this.$q = $q;
this.$http = $http;
this.$log = $log;
this.cache = undefined;
}
/**
* The data dictionary for this data source.
* @type {MSLDataDictionary}
*/
RemsTelemetryServerAdapter.prototype.dictionary = MSLDataDictionary;
/**
* Fetches historical data from source, and associates it with the
* given request ID.
* @private
*/
RemsTelemetryServerAdapter.prototype.requestHistory = function(request) {
var self = this,
id = request.key,
deferred = this.$q.defer();
function processResponse(response){
var data = [];
/*
* Currently all data is returned for entire history of the mission. Cache response to avoid unnecessary re-queries.
*/
self.cache = response;
/*
* History data is organised by Sol. Iterate over sols...
*/
response.data.soles.forEach(function(solData){
/*
* Check that valid data exists
*/
if (!isNaN(solData[id])) {
/*
* Append each data point to the array of values
* for this data point property (min. temp, etc).
*/
data.unshift({
date: Date.parse(solData[TERRESTRIAL_DATE]),
value: solData[id]
});
}
});
return data;
}
function fallbackToLocal() {
self.$log.warn("Loading REMS data failed, probably due to" +
" cross origin policy. Falling back to local data");
return self.$http.get(self.localDataURI);
}
//Filter results to match request parameters
function filterResults(results) {
return results.filter(function(result){
return result.date >= (request.start || Number.MIN_VALUE) &&
result.date <= (request.end || Number.MAX_VALUE);
});
}
function packageAndResolve(results){
deferred.resolve({id: id, values: results});
}
this.$q.when(this.cache || this.$http.get(this.REMS_WS_URL))
.catch(fallbackToLocal)
.then(processResponse)
.then(filterResults)
.then(packageAndResolve);
return deferred.promise;
};
/**
* Requests historical telemetry for the named data attribute. In
* the case of REMS, this data source exposes multiple different
* data variables from the REMS instrument, including temperature
* and others
* @param id The telemetry data point key to be queried.
* @returns {Promise | Array<RemsTelemetryValue>} that resolves with an Array of {@link RemsTelemetryValue} objects for the request data key.
*/
RemsTelemetryServerAdapter.prototype.history = function(request) {
var id = request.key;
return this.requestHistory(request);
};
return RemsTelemetryServerAdapter;
}
);

View File

@@ -1,10 +1,9 @@
<span class="status block ok" ng-controller="DialogLaunchController">
<span class="ui-symbol status-indicator">&#xe600;</span>
<span class="label">
<!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! -->
<span class="ui-symbol status-indicator">&#xe600;</span><span class="label">
<a ng-click="launchProgress(true)">Known</a> |
<a ng-click="launchProgress(false)">Unknown</a> |
<a ng-click="launchError()">Error</a> |
<a ng-click="launchInfo()">Info</a>
</span>
<span class="count">Dialogs</span>
</span><span class="count">Dialogs</span>
</span>

View File

@@ -1,10 +1,9 @@
<span class="status block ok" ng-controller="NotificationLaunchController">
<span class="ui-symbol status-indicator">&#xe600;</span>
<span class="label">
<!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! -->
<span class="ui-symbol status-indicator">&#xe600;</span><span class="label">
<a ng-click="newInfo()">Success</a> |
<a ng-click="newError()">Error</a> |
<a ng-click="newAlert()">Alert</a> |
<a ng-click="newProgress()">Progress</a>
</span>
<span class="count">Notifications</span>
</span><span class="count">Notifications</span>
</span>

View File

@@ -0,0 +1,145 @@
/*****************************************************************************
* 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([
'legacyRegistry',
'../../platform/commonUI/browse/src/InspectorRegion',
'../../platform/commonUI/regions/src/Region'
], function (
legacyRegistry,
InspectorRegion,
Region
) {
"use strict";
/**
* Add a 'plot options' region part to the inspector region for the
* Telemetry Plot type only. {@link InspectorRegion} is a default region
* implementation that is added automatically to all types. In order to
* customize what appears in the inspector region, you can start from a
* blank slate by using Region, or customize the default inspector
* region by using {@link InspectorRegion}.
*/
var plotInspector = new InspectorRegion(),
/**
* Two region parts are defined here. One that appears only in browse
* mode, and one that appears only in edit mode. For not they both point
* to the same representation, but a different key could be used here to
* include a customized representation for edit mode.
*/
plotOptionsBrowseRegion = new Region({
name: "plot-options",
title: "Plot Options",
modes: ['browse'],
content: {
key: "plot-options-browse"
}
}),
plotOptionsEditRegion = new Region({
name: "plot-options",
title: "Plot Options",
modes: ['edit'],
content: {
key: "plot-options-browse"
}
});
/**
* Both parts are added, and policies of type 'region' will determine
* which is shown based on domain object state. A default policy is
* provided which will check the 'modes' attribute of the region part
* definition.
*/
plotInspector.addRegion(plotOptionsBrowseRegion);
plotInspector.addRegion(plotOptionsEditRegion);
legacyRegistry.register("example/plotType", {
"name": "Plot Type",
"description": "Example illustrating registration of a new object type",
"extensions": {
"types": [
{
"key": "plot",
"name": "Telemetry Plot",
"glyph": "t",
"description": "A plot for displaying telemetry",
"delegates": [
"telemetry"
],
"features": "creation",
"contains": [
{
"has": "telemetry"
}
],
"model": {
"composition": []
},
"inspector": plotInspector,
"telemetry": {
"source": "generator",
"domains": [
{
"key": "time",
"name": "Time"
},
{
"key": "yesterday",
"name": "Yesterday"
},
{
"key": "delta",
"name": "Delta",
"format": "example.delta"
}
],
"ranges": [
{
"key": "sin",
"name": "Sine"
},
{
"key": "cos",
"name": "Cosine"
}
]
},
"properties": [
{
"name": "Period",
"control": "textfield",
"cssclass": "l-small l-numeric",
"key": "period",
"required": true,
"property": [
"telemetry",
"period"
],
"pattern": "^\\d*(\\.\\d*)?$"
}
]
}
]
}
});
});

141
gulpfile.js Normal file
View File

@@ -0,0 +1,141 @@
/*****************************************************************************
* 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'),
rename = require('gulp-rename'),
sass = require('gulp-sass'),
bourbon = require('node-bourbon'),
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', './example/**/*.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
},
sass: {
includePaths: bourbon.includePaths,
sourceComments: true
},
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, {base: '.'})
.pipe(sourcemaps.init())
.pipe(sass(options.sass).on('error', sass.logError))
.pipe(rename(function (file) {
file.dirname = file.dirname.replace('/sass', '/css');
return file;
}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(__dirname));
});
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', ['stylesheets'], function () {
return gulp.src(paths.static, { base: '.' })
.pipe(gulp.dest(paths.dist));
});
gulp.task('watch', function () {
gulp.watch(paths.scss, ['stylesheets']);
});
gulp.task('serve', function () {
console.log('Running development server with all defaults');
var app = require('./app.js');
});
gulp.task('develop', ['serve', 'stylesheets', 'watch']);
gulp.task('install', [ 'static', 'scripts' ]);
gulp.task('verify', [ 'lint', 'test' ]);
gulp.task('build', [ 'verify', 'install' ]);

View File

@@ -26,16 +26,25 @@
<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="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
<link rel="stylesheet" href="platform/commonUI/general/res/css/openmct.css">
<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">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16">
<link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico">
</head>
<body class="user-environ" ng-view>
<body class="user-environ">
<div class="l-splash-holder s-splash-holder">
<div class="l-splash s-splash"></div>
</div>
<div ng-view></div>
</body>
</html>

View File

@@ -20,7 +20,7 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global module*/
/*global module,process*/
module.exports = function(config) {
config.set({
@@ -34,10 +34,12 @@ 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},
{pattern: 'warp/**/*.js', included: false},
{pattern: 'platform/**/*.html', included: false},
'test-main.js'
],
@@ -49,13 +51,14 @@ 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
// Possible values: 'dots', 'progress'
// Available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress', 'coverage', 'html'],
reporters: ['progress', 'coverage', 'html', 'junit'],
// Web server port.
port: 9876,
@@ -76,7 +79,14 @@ module.exports = function(config) {
// Code coverage reporting.
coverageReporter: {
dir: "target/coverage"
dir: process.env.CIRCLE_ARTIFACTS ?
process.env.CIRCLE_ARTIFACTS + '/coverage' :
"dist/coverage",
check: {
global: {
lines: 80
}
}
},
// HTML test reporting.
@@ -86,6 +96,10 @@ module.exports = function(config) {
foldAll: false
},
junitReporter: {
outputDir: process.env.CIRCLE_TEST_REPORTS || 'target/junit'
},
// Continuous Integration mode.
// If true, Karma captures browsers, runs the tests and exits.
singleRun: true

41
main.js
View File

@@ -24,12 +24,30 @@
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",
"csv": "bower_components/comma-separated-values/csv.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",
"saveAs": "bower_components/FileSaver.js/FileSaver.min",
"screenfull": "bower_components/screenfull/dist/screenfull.min",
"text": "bower_components/text/text",
"uuid": "bower_components/node-uuid/uuid",
"zepto": "bower_components/zepto/zepto.min"
},
"shim": {
"angular": {
"exports": "angular"
},
"angular-route": {
"deps": [ "angular" ]
},
"moment-duration-format": {
"deps": [ "moment" ]
},
"zepto": {
"exports": "Zepto"
}
}
});
@@ -53,15 +71,15 @@ define([
'./platform/commonUI/notification/bundle',
'./platform/containment/bundle',
'./platform/execution/bundle',
'./platform/exporters/bundle',
'./platform/telemetry/bundle',
'./platform/features/clock/bundle',
'./platform/features/events/bundle',
'./platform/features/imagery/bundle',
'./platform/features/layout/bundle',
'./platform/features/pages/bundle',
'./platform/features/plot/bundle',
'./platform/features/scrolling/bundle',
'./platform/features/timeline/bundle',
'./platform/features/table/bundle',
'./platform/forms/bundle',
'./platform/identity/bundle',
'./platform/persistence/aggregator/bundle',
@@ -71,11 +89,20 @@ define([
'./platform/entanglement/bundle',
'./platform/search/bundle',
'./platform/status/bundle',
'./platform/commonUI/regions/bundle',
'./example/imagery/bundle',
'./example/eventGenerator/bundle',
'./example/generator/bundle'
'./example/generator/bundle',
'./example/enumeratedTelemetry/bundle'
], function (Main, legacyRegistry) {
'use strict';
new Main().run(legacyRegistry);
});
return {
legacyRegistry: legacyRegistry,
run: function () {
return new Main().run(legacyRegistry);
}
};
});

View File

@@ -1,45 +1,61 @@
{
"name": "open-mct-web",
"version": "0.7.2",
"description": "The OpenMCTWeb core platform",
"name": "openmctweb",
"version": "0.9.3-SNAPSHOT",
"description": "The Open MCT Web core platform",
"dependencies": {
"express": "^4.13.1",
"minimist": "^1.1.1"
"minimist": "^1.1.1",
"request": "^2.69.0"
},
"devDependencies": {
"bower": "^1.7.7",
"git-rev-sync": "^1.4.0",
"glob": ">= 3.0.0",
"gulp": "^3.9.0",
"gulp-jscs": "^3.0.2",
"gulp-jshint": "^2.0.0",
"gulp-rename": "^1.2.2",
"gulp-replace-task": "^0.11.0",
"gulp-requirejs-optimize": "^0.3.1",
"gulp-sass": "^2.2.0",
"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.2.3",
"karma-junit-reporter": "^0.3.8",
"karma-phantomjs-launcher": "^1.0.0",
"karma-requirejs": "^0.2.2",
"lodash": "^3.10.1",
"markdown-toc": "^0.11.7",
"marked": "^0.3.5",
"mkdirp": "^0.5.1",
"phantomjs": "^1.9.19",
"moment": "^2.11.1",
"node-bourbon": "^4.2.3",
"phantomjs-prebuilt": "^2.1.0",
"requirejs": "^2.1.17",
"split": "^1.0.0"
},
"scripts": {
"start": "node app.js",
"test": "karma start --single-run",
"jshint": "jshint platform example || exit 0",
"jshint": "jshint platform example",
"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,14 +22,30 @@
/*global define*/
define([
"text!./res/templates/about-dialog.html",
"./src/LogoController",
"./src/AboutController",
"./src/LicenseController",
"text!./res/templates/app-logo.html",
"text!./res/templates/about-logo.html",
"text!./res/templates/overlay-about.html",
"text!./res/templates/license-apache.html",
"text!./res/templates/license-mit.html",
"text!./res/templates/licenses.html",
"text!./res/templates/licenses-export-md.html",
'legacyRegistry'
], function (
aboutDialogTemplate,
LogoController,
AboutController,
LicenseController,
appLogoTemplate,
aboutLogoTemplate,
overlayAboutTemplate,
licenseApacheTemplate,
licenseMitTemplate,
licensesTemplate,
licensesExportMdTemplate,
legacyRegistry
) {
"use strict";
@@ -41,28 +57,28 @@ define([
{
"key": "app-logo",
"priority": "optional",
"templateUrl": "templates/app-logo.html"
"template": appLogoTemplate
},
{
"key": "about-logo",
"priority": "preferred",
"templateUrl": "templates/about-logo.html"
"template": aboutLogoTemplate
},
{
"key": "about-dialog",
"templateUrl": "templates/about-dialog.html"
"template": aboutDialogTemplate
},
{
"key": "overlay-about",
"templateUrl": "templates/overlay-about.html"
"template": overlayAboutTemplate
},
{
"key": "license-apache",
"templateUrl": "templates/license-apache.html"
"template": licenseApacheTemplate
},
{
"key": "license-mit",
"templateUrl": "templates/license-mit.html"
"template": licenseMitTemplate
}
],
"controllers": [
@@ -154,11 +170,11 @@ define([
"routes": [
{
"when": "/licenses",
"templateUrl": "templates/licenses.html"
"template": licensesTemplate
},
{
"when": "/licenses-md",
"templateUrl": "templates/licenses-export-md.html"
"template": licensesExportMdTemplate
}
]
}

View File

@@ -20,11 +20,7 @@
at runtime from the About dialog for additional information.
-->
<div class="abs t-about l-about t-about-openmctweb s-about" ng-controller = "AboutController as about">
<div class="l-logo-holder s-logo-holder">
<div class="l-logo s-logo s-logo-nasa"></div>
<div class="l-logo l-logo-app s-logo s-logo-openmctweb"></div>
</div>
<div class="l-splash s-splash"></div>
<div class="s-text l-content">
<h1 class="l-title s-title">OpenMCT Web</h1>
<div class="l-description s-description">

View File

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

View File

@@ -34,8 +34,21 @@ define([
"./src/windowing/NewTabAction",
"./src/windowing/FullscreenAction",
"./src/creation/CreateActionProvider",
"./src/creation/AddActionProvider",
"./src/creation/CreationService",
"./src/windowing/WindowTitler",
"text!./res/templates/browse.html",
"text!./res/templates/create/locator.html",
"text!./res/templates/browse-object.html",
"text!./res/templates/create/create-button.html",
"text!./res/templates/create/create-menu.html",
"text!./res/templates/items/grid-item.html",
"text!./res/templates/browse/object-header.html",
"text!./res/templates/menu-arrow.html",
"text!./res/templates/back-arrow.html",
"text!./res/templates/items/items.html",
"text!./res/templates/browse/object-properties.html",
"text!./res/templates/browse/inspector-region.html",
'legacyRegistry'
], function (
BrowseController,
@@ -50,8 +63,21 @@ define([
NewTabAction,
FullscreenAction,
CreateActionProvider,
AddActionProvider,
CreationService,
WindowTitler,
browseTemplate,
locatorTemplate,
browseObjectTemplate,
createButtonTemplate,
createMenuTemplate,
gridItemTemplate,
objectHeaderTemplate,
menuArrowTemplate,
backArrowTemplate,
itemsTemplate,
objectPropertiesTemplate,
inspectorRegionTemplate,
legacyRegistry
) {
"use strict";
@@ -61,15 +87,22 @@ define([
"routes": [
{
"when": "/browse/:ids*",
"templateUrl": "templates/browse.html",
"template": browseTemplate,
"reloadOnSearch": false
},
{
"when": "",
"templateUrl": "templates/browse.html",
"template": browseTemplate,
"reloadOnSearch": false
}
],
"constants": [
{
"key": "DEFAULT_PATH",
"value": "mine",
"priority": "fallback"
}
],
"controllers": [
{
"key": "BrowseController",
@@ -78,10 +111,12 @@ define([
"$scope",
"$route",
"$location",
"$q",
"$window",
"objectService",
"navigationService",
"urlService"
"urlService",
"policyService",
"DEFAULT_PATH"
]
},
{
@@ -100,9 +135,7 @@ define([
"depends": [
"$scope",
"$location",
"$route",
"$q",
"navigationService"
"$route"
]
},
{
@@ -117,7 +150,8 @@ define([
"implementation": LocatorController,
"depends": [
"$scope",
"$timeout"
"$timeout",
"objectService"
]
},
{
@@ -131,13 +165,17 @@ define([
"controls": [
{
"key": "locator",
"templateUrl": "templates/create/locator.html"
"template": locatorTemplate
}
],
"representations": [
{
"key": "view-object",
"templateUrl": "templates/view-object.html"
},
{
"key": "browse-object",
"templateUrl": "templates/browse-object.html",
"template": browseObjectTemplate,
"gestures": [
"drop"
],
@@ -147,18 +185,18 @@ define([
},
{
"key": "create-button",
"templateUrl": "templates/create/create-button.html"
"template": createButtonTemplate
},
{
"key": "create-menu",
"templateUrl": "templates/create/create-menu.html",
"template": createMenuTemplate,
"uses": [
"action"
]
},
{
"key": "grid-item",
"templateUrl": "templates/items/grid-item.html",
"template": gridItemTemplate,
"uses": [
"type",
"action",
@@ -171,14 +209,14 @@ define([
},
{
"key": "object-header",
"templateUrl": "templates/browse/object-header.html",
"template": objectHeaderTemplate,
"uses": [
"type"
]
},
{
"key": "menu-arrow",
"templateUrl": "templates/menu-arrow.html",
"template": menuArrowTemplate,
"uses": [
"action"
],
@@ -191,7 +229,15 @@ define([
"uses": [
"context"
],
"templateUrl": "templates/back-arrow.html"
"template": backArrowTemplate
},
{
"key": "object-properties",
"template": objectPropertiesTemplate
},
{
"key": "inspector-region",
"template": inspectorRegionTemplate
}
],
"services": [
@@ -247,7 +293,7 @@ define([
"name": "Items",
"glyph": "9",
"description": "Grid of available items",
"templateUrl": "templates/items/items.html",
"template": itemsTemplate,
"uses": [
"composition"
],
@@ -271,6 +317,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

@@ -44,14 +44,9 @@
</div>
</div>
<div class="holder l-flex-col flex-elem grows l-object-wrapper">
<div class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
<div ng-if="isEditable" class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
<!-- Toolbar and Save/Cancel buttons -->
<div class="l-edit-controls flex-elem l-flex-row flex-align-end">
<mct-toolbar name="mctToolbar"
structure="toolbar.structure"
ng-model="toolbar.state"
class="flex-elem grows">
</mct-toolbar>
<mct-representation key="'edit-action-buttons'"
mct-object="domainObject"
class='flex-elem conclude-editing'>
@@ -63,6 +58,20 @@
class="abs flex-elem grows object-holder-main scroll"
toolbar="toolbar">
</mct-representation>
</div><!--/ l-object-wrapper-inner -->
</div>
<div ng-if="!isEditable" class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
<!-- Toolbar and Save/Cancel buttons -->
<div class="l-edit-controls flex-elem l-flex-row flex-align-end">
<mct-representation key="'edit-action-buttons'"
mct-object="domainObject"
class='flex-elem conclude-editing'>
</mct-representation>
</div>
<mct-representation key="representation.selected.key"
mct-object="representation.selected.key && domainObject"
class="abs flex-elem grows object-holder-main scroll">
</mct-representation>
</div>
</div>
</div>

View File

@@ -63,7 +63,7 @@
<mct-split-pane class='l-object-and-inspector contents abs' anchor='right'>
<div class='split-pane-component t-object pane primary-pane left'>
<mct-representation mct-object="navigatedObject"
key="'browse-object'"
key="'view-object'"
class="abs holder holder-object">
</mct-representation>
</div>

View File

@@ -19,14 +19,12 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<div content="jquery-wrapper"
class="abs holder-all edit-mode"
ng-controller="EditController as editMode"
mct-before-unload="editMode.getUnloadWarning()">
<mct-representation key="'edit-object'" mct-object="editMode.navigatedObject()">
</mct-representation>
<mct-include key="'bottombar'"></mct-include>
<div ng-controller="InspectorController">
<div ng-repeat="region in regions">
<mct-representation
key="region.content.key"
mct-object="domainObject"
ng-model="ngModel">
</mct-representation>
</div>
</div>

View File

@@ -0,0 +1,61 @@
<!--
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.
-->
<div ng-controller="ObjectInspectorController as controller">
<ul class="flex-elem grows l-inspector-part">
<li>
<em class="t-inspector-part-header">Properties</em>
<div class="inspector-properties"
ng-repeat="data in metadata"
ng-class="{ first:$index === 0 }">
<div class="label">{{ data.name }}</div>
<div class="value">{{ data.value }}</div>
</div>
</li>
<li ng-if="contextutalParents.length > 0">
<em class="t-inspector-part-header" title="The location of this linked object.">Location</em>
<div ng-if="primaryParents.length > 0" class="section-header">This Object</div>
<span class="inspector-location"
ng-repeat="parent in contextutalParents"
ng-class="{ last:($index + 1) === contextualParents.length }">
<mct-representation key="'label'"
mct-object="parent"
ng-model="ngModel"
ng-click="ngModel.selectedObject = parent"
class="location-item">
</mct-representation>
</span>
</li>
<li ng-if="primaryParents.length > 0">
<div class="section-header">Object's Original</div>
<span class="inspector-location"
ng-repeat="parent in primaryParents"
ng-class="{ last:($index + 1) === primaryParents.length }">
<mct-representation key="'label'"
mct-object="parent"
ng-model="ngModel"
ng-click="ngModel.selectedObject = parent"
class="location-item">
</mct-representation>
</span>
</li>
</ul>
</div>

View File

@@ -27,7 +27,9 @@
<mct-representation class="desktop-hide" key="'info-button'" mct-object="domainObject"></mct-representation>
</div>
<div class='item-main abs lg'>
<span class="t-item-icon" ng-class="{ 'l-icon-link':location.isLink() }">{{type.getGlyph()}}</span>
<span class="t-item-icon" ng-class="{ 'l-icon-link':location.isLink() }">
<span class="t-item-icon-glyph ng-binding">{{type.getGlyph()}}</span>
</span>
<div class='ui-symbol abs item-open'>}</div>
</div>
<div class='bottom-bar bar abs'>

View File

@@ -19,19 +19,15 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<table class="tabular">
<thead>
<tr>
<th ng-repeat="header in headers">
{{header}}
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in rows">
<td ng-repeat="cell in row">
{{cell}}
</td>
</tr>
</tbody>
</table>
<!--
A representation that allows the 'View' region of an object view to change
dynamically (eg. between browse and edit modes). Values correspond to a
representation key, and currently defaults to 'browse-object'.
In the case of edit, the EditRepresenter will change this to editable
representation of the object as needed.
-->
<mct-representation mct-object="domainObject"
key="viewObjectTemplate || 'browse-object'"
class="abs holder">
</mct-representation>

View File

@@ -27,15 +27,12 @@
*/
define(
[
'../../../representation/src/gestures/GestureConstants',
'../../edit/src/objects/EditableDomainObject'
'../../../representation/src/gestures/GestureConstants'
],
function (GestureConstants, EditableDomainObject) {
function (GestureConstants) {
"use strict";
var ROOT_ID = "ROOT",
DEFAULT_PATH = "mine",
CONFIRM_MSG = "Unsaved changes will be lost if you leave this page.";
var ROOT_ID = "ROOT";
/**
* The BrowseController is used to populate the initial scope in Browse
@@ -47,18 +44,21 @@ define(
* @memberof platform/commonUI/browse
* @constructor
*/
function BrowseController($scope, $route, $location, $q, objectService, navigationService, urlService) {
function BrowseController(
$scope,
$route,
$location,
$window,
objectService,
navigationService,
urlService,
policyService,
defaultPath
) {
var path = [ROOT_ID].concat(
($route.current.params.ids || DEFAULT_PATH).split("/")
($route.current.params.ids || defaultPath).split("/")
);
function isDirty(){
var editorCapability = $scope.navigatedObject &&
$scope.navigatedObject.getCapability("editor"),
hasChanges = editorCapability && editorCapability.dirty();
return hasChanges;
}
function updateRoute(domainObject) {
var priorRoute = $route.current,
// Act as if params HADN'T changed to avoid page reload
@@ -75,31 +75,35 @@ define(
// urlService.urlForLocation used to adjust current
// path to new, addressed, path based on
// domainObject
$location.path(urlService.urlForLocation("browse",
domainObject.hasCapability('editor') ?
domainObject.getOriginalObject() : domainObject));
$location.path(urlService.urlForLocation("browse", domainObject));
}
// Callback for updating the in-scope reference to the object
// that is currently navigated-to.
function setNavigation(domainObject) {
var navigationAllowed = true;
if (domainObject === $scope.navigatedObject){
//do nothing;
return;
}
if (isDirty() && !confirm(CONFIRM_MSG)) {
$scope.treeModel.selectedObject = $scope.navigatedObject;
navigationService.setNavigation($scope.navigatedObject);
} else {
if ($scope.navigatedObject && $scope.navigatedObject.hasCapability("editor")){
$scope.navigatedObject.getCapability("editor").cancel();
}
policyService.allow("navigation", $scope.navigatedObject, domainObject, function(message){
navigationAllowed = $window.confirm(message + "\r\n\r\n" +
" Are you sure you want to continue?");
});
if (navigationAllowed) {
$scope.navigatedObject = domainObject;
$scope.treeModel.selectedObject = domainObject;
navigationService.setNavigation(domainObject);
updateRoute(domainObject);
} else {
//If navigation was unsuccessful (ie. blocked), reset
// the selected object in the tree to the currently
// navigated object
$scope.treeModel.selectedObject = $scope.navigatedObject ;
}
}
@@ -143,6 +147,12 @@ define(
} else {
doNavigate(nextObject, index + 1);
}
} else if (index === 1 && c.length > 0) {
// Roots are in a top-level container that we don't
// want to be selected, so if we couldn't find an
// object at the path we wanted, at least select
// one of its children.
navigateTo(c[c.length - 1]);
} else {
// Couldn't find the next element of the path
// so navigate to the last path object we did find
@@ -170,18 +180,13 @@ define(
selectedObject: navigationService.getNavigation()
};
$scope.beforeUnloadWarning = function() {
return isDirty() ?
"Unsaved changes will be lost if you leave this page." :
undefined;
};
// Listen for changes in navigation state.
navigationService.addListener(setNavigation);
// Also listen for changes which come from the tree
// Also listen for changes which come from the tree. Changes in
// the tree will trigger a change in browse navigation state.
$scope.$watch("treeModel.selectedObject", setNavigation);
// Clean up when the scope is destroyed
$scope.$on("$destroy", function () {
navigationService.removeListener(setNavigation);

View File

@@ -22,11 +22,8 @@
/*global define,Promise*/
define(
[
'../../../representation/src/gestures/GestureConstants',
'../../edit/src/objects/EditableDomainObject'
],
function (GestureConstants, EditableDomainObject) {
[],
function () {
"use strict";
/**
@@ -35,7 +32,7 @@ define(
* @memberof platform/commonUI/browse
* @constructor
*/
function BrowseObjectController($scope, $location, $route, $q, navigationService) {
function BrowseObjectController($scope, $location, $route) {
var navigatedObject;
function setViewForDomainObject(domainObject) {
@@ -57,10 +54,9 @@ define(
function updateQueryParam(viewKey) {
var unlisten,
priorRoute = $route.current,
isEditMode = $scope.domainObject && $scope.domainObject.hasCapability('editor');
priorRoute = $route.current;
if (viewKey && !isEditMode) {
if (viewKey) {
$location.search('view', viewKey);
unlisten = $scope.$on('$locationChangeSuccess', function () {
// Checks path to make sure /browse/ is at front
@@ -76,10 +72,6 @@ define(
$scope.$watch('domainObject', setViewForDomainObject);
$scope.$watch('representation.selected.key', updateQueryParam);
$scope.cancelEditing = function() {
navigationService.setNavigation($scope.domainObject.getDomainObject());
};
$scope.doAction = function (action){
return $scope[action] && $scope[action]();
};

View File

@@ -0,0 +1,69 @@
/*****************************************************************************
* 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,window*/
define(
[
'../../regions/src/Region'
],
function (Region) {
"use strict";
/**
* Defines the a default Inspector region. Captured in a class to
* allow for modular extension and customization of regions based on
* the typical case.
* @memberOf platform/commonUI/regions
* @constructor
*/
function InspectorRegion() {
Region.call(this, {'name': 'Inspector'});
this.buildRegion();
}
InspectorRegion.prototype = Object.create(Region.prototype);
InspectorRegion.prototype.constructor = Region;
/**
* @private
*/
InspectorRegion.prototype.buildRegion = function() {
var metadataRegion = {
name: 'metadata',
title: 'Metadata Region',
// Which modes should the region part be visible in? If
// nothing provided here, then assumed that part is visible
// in both. The visibility or otherwise of a region part
// should be decided by a policy. In this case, 'modes' is a
// shortcut that is used by the EditableRegionPolicy.
modes: ['browse', 'edit'],
content: {
key: 'object-properties'
}
};
this.addRegion(new Region(metadataRegion), 0);
};
return InspectorRegion;
}
);

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

@@ -59,6 +59,7 @@ define(
callback(value);
});
}
return true;
};
/**

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

@@ -29,8 +29,7 @@ define(
function (BrowseController) {
"use strict";
//TODO: Disabled for NEM Beta
xdescribe("The browse controller", function () {
describe("The browse controller", function () {
var mockScope,
mockRoute,
mockLocation,
@@ -40,6 +39,9 @@ define(
mockUrlService,
mockDomainObject,
mockNextObject,
mockWindow,
mockPolicyService,
testDefaultRoot,
controller;
function mockPromise(value) {
@@ -50,7 +52,32 @@ define(
};
}
function instantiateController() {
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockWindow,
mockObjectService,
mockNavigationService,
mockUrlService,
mockPolicyService,
testDefaultRoot
);
}
beforeEach(function () {
mockWindow = jasmine.createSpyObj('$window', [
"confirm"
]);
mockWindow.confirm.andReturn(true);
mockPolicyService = jasmine.createSpyObj('policyService', [
'allow'
]);
testDefaultRoot = "some-root-level-domain-object";
mockScope = jasmine.createSpyObj(
"$scope",
[ "$on", "$watch" ]
@@ -101,41 +128,28 @@ define(
]));
mockNextObject.useCapability.andReturn(undefined);
mockNextObject.getId.andReturn("next");
mockDomainObject.getId.andReturn("mine");
mockDomainObject.getId.andReturn(testDefaultRoot);
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService,
mockUrlService
);
instantiateController();
});
it("uses composition to set the navigated object, if there is none", function () {
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService,
mockUrlService
);
instantiateController();
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
});
it("navigates to a root-level object, even when default path is not found", function () {
mockDomainObject.getId
.andReturn("something-other-than-the-" + testDefaultRoot);
instantiateController();
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
});
it("does not try to override navigation", function () {
mockNavigationService.getNavigation.andReturn(mockDomainObject);
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService,
mockUrlService
);
instantiateController();
expect(mockScope.navigatedObject).toBe(mockDomainObject);
});
@@ -162,14 +176,8 @@ define(
});
it("uses route parameters to choose initially-navigated object", function () {
mockRoute.current.params.ids = "mine/next";
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService
);
mockRoute.current.params.ids = testDefaultRoot + "/next";
instantiateController();
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
@@ -179,14 +187,8 @@ define(
// Idea here is that if we get a bad path of IDs,
// browse controller should traverse down it until
// it hits an invalid ID.
mockRoute.current.params.ids = "mine/junk";
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService
);
mockRoute.current.params.ids = testDefaultRoot + "/junk";
instantiateController();
expect(mockScope.navigatedObject).toBe(mockDomainObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
@@ -196,14 +198,8 @@ define(
// Idea here is that if we get a path which passes
// through an object without a composition, browse controller
// should stop at it since remaining IDs cannot be loaded.
mockRoute.current.params.ids = "mine/next/junk";
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService
);
mockRoute.current.params.ids = testDefaultRoot + "/next/junk";
instantiateController();
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
@@ -230,7 +226,10 @@ define(
// prior to setting $route.current
mockLocation.path.andReturn("/browse/");
mockNavigationService.setNavigation.andReturn(true);
// Exercise the Angular workaround
mockNavigationService.addListener.mostRecentCall.args[0]();
mockScope.$on.mostRecentCall.args[1]();
expect(mockUnlisten).toHaveBeenCalled();
@@ -241,6 +240,36 @@ define(
);
});
it("after successful navigation event sets the selected tree " +
"object", function () {
mockScope.navigatedObject = mockDomainObject;
mockNavigationService.setNavigation.andReturn(true);
//Simulate a change in selected tree object
mockScope.treeModel = {selectedObject: mockDomainObject};
mockScope.$watch.mostRecentCall.args[1](mockNextObject);
expect(mockScope.treeModel.selectedObject).toBe(mockNextObject);
expect(mockScope.treeModel.selectedObject).not.toBe(mockDomainObject);
});
it("after failed navigation event resets the selected tree" +
" object", function () {
mockScope.navigatedObject = mockDomainObject;
mockWindow.confirm.andReturn(false);
mockPolicyService.allow.andCallFake(function(category, object, context, callback){
callback("unsaved changes");
return false;
});
//Simulate a change in selected tree object
mockScope.treeModel = {selectedObject: mockDomainObject};
mockScope.$watch.mostRecentCall.args[1](mockNextObject);
expect(mockScope.treeModel.selectedObject).not.toBe(mockNextObject);
expect(mockScope.treeModel.selectedObject).toBe(mockDomainObject);
});
});
}
);

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*/
/**
* MCTIncudeSpec. Created by vwoeltje on 11/6/14.
*/
define(
["../src/InspectorRegion"],
function (InspectorRegion) {
"use strict";
describe("The inspector region", function () {
var inspectorRegion;
beforeEach(function () {
inspectorRegion = new InspectorRegion();
});
it("creates default region parts", function () {
expect(inspectorRegion.regions.length).toBe(1);
});
});
}
);

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

@@ -86,4 +86,4 @@ define(
});
}
);
);

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

@@ -24,10 +24,24 @@
define([
"./src/DialogService",
"./src/OverlayService",
"text!./res/templates/overlay-dialog.html",
"text!./res/templates/overlay-options.html",
"text!./res/templates/dialog.html",
"text!./res/templates/overlay-blocking-message.html",
"text!./res/templates/message.html",
"text!./res/templates/overlay-message-list.html",
"text!./res/templates/overlay.html",
'legacyRegistry'
], function (
DialogService,
OverlayService,
overlayDialogTemplate,
overlayOptionsTemplate,
dialogTemplate,
overlayBlockingMessageTemplate,
messageTemplate,
overlayMessageListTemplate,
overlayTemplate,
legacyRegistry
) {
"use strict";
@@ -57,33 +71,33 @@ define([
"templates": [
{
"key": "overlay-dialog",
"templateUrl": "templates/overlay-dialog.html"
"template": overlayDialogTemplate
},
{
"key": "overlay-options",
"templateUrl": "templates/overlay-options.html"
"template": overlayOptionsTemplate
},
{
"key": "form-dialog",
"templateUrl": "templates/dialog.html"
"template": dialogTemplate
},
{
"key": "overlay-blocking-message",
"templateUrl": "templates/overlay-blocking-message.html"
"template": overlayBlockingMessageTemplate
},
{
"key": "message",
"templateUrl": "templates/message.html"
"template": messageTemplate
},
{
"key": "overlay-message-list",
"templateUrl": "templates/overlay-message-list.html"
"template": overlayMessageListTemplate
}
],
"containers": [
{
"key": "overlay",
"templateUrl": "templates/overlay.html"
"template": overlayTemplate
}
]
}

View File

@@ -6,7 +6,9 @@
</div>
</div>
<div class="abs message-body">
<mct-include ng-repeat="msg in ngModel.dialog.messages | orderBy: '-'" key="'message'" ng-model="msg"></mct-include>
<mct-include
ng-repeat="msg in ngModel.dialog.messages | orderBy: '-'"
key="'message'" ng-model="msg.model"></mct-include>
</div>
<div class="abs bottom-bar">
<a ng-repeat="dialogAction in ngModel.dialog.actions"

View File

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

View File

@@ -22,10 +22,10 @@
/*global define*/
define([
"./src/controllers/EditController",
"./src/controllers/EditActionController",
"./src/controllers/EditPanesController",
"./src/controllers/ElementsController",
"./src/controllers/EditObjectController",
"./src/directives/MCTBeforeUnload",
"./src/actions/LinkAction",
"./src/actions/EditAction",
@@ -34,14 +34,20 @@ define([
"./src/actions/SaveAction",
"./src/actions/CancelAction",
"./src/policies/EditActionPolicy",
"./src/policies/EditNavigationPolicy",
"./src/representers/EditRepresenter",
"./src/representers/EditToolbarRepresenter",
"text!./res/templates/library.html",
"text!./res/templates/edit-object.html",
"text!./res/templates/edit-action-buttons.html",
"text!./res/templates/elements.html",
"text!./res/templates/topbar-edit.html",
'legacyRegistry'
], function (
EditController,
EditActionController,
EditPanesController,
ElementsController,
EditObjectController,
MCTBeforeUnload,
LinkAction,
EditAction,
@@ -50,30 +56,21 @@ define([
SaveAction,
CancelAction,
EditActionPolicy,
EditNavigationPolicy,
EditRepresenter,
EditToolbarRepresenter,
libraryTemplate,
editObjectTemplate,
editActionButtonsTemplate,
elementsTemplate,
topbarEditTemplate,
legacyRegistry
) {
"use strict";
legacyRegistry.register("platform/commonUI/edit", {
"extensions": {
"routes": [
{
"when": "/edit",
"templateUrl": "templates/edit.html"
}
],
"controllers": [
{
"key": "EditController",
"implementation": EditController,
"depends": [
"$scope",
"$q",
"navigationService"
]
},
{
"key": "EditActionController",
"implementation": EditActionController,
@@ -94,6 +91,15 @@ define([
"depends": [
"$scope"
]
},
{
"key": "EditObjectController",
"implementation": EditObjectController,
"depends": [
"$scope",
"$location",
"policyService"
]
}
],
"directives": [
@@ -156,14 +162,11 @@ define([
"name": "Save",
"description": "Save changes made to these objects.",
"depends": [
"$q",
"$location",
"$injector",
"urlService",
"navigationService",
"policyService",
"dialogService",
"creationService"
"creationService",
"copyService"
],
"priority": "mandatory"
},
@@ -183,32 +186,41 @@ define([
{
"category": "action",
"implementation": EditActionPolicy
},
{
"category": "navigation",
"message": "There are unsaved changes.",
"implementation": EditNavigationPolicy
}
],
"templates": [
{
"key": "edit-library",
"templateUrl": "templates/library.html"
"template": libraryTemplate
}
],
"representations": [
{
"key": "edit-object",
"templateUrl": "templates/edit-object.html",
"template": editObjectTemplate,
"uses": [
"view"
],
"gestures": [
"drop"
]
},
{
"key": "edit-action-buttons",
"templateUrl": "templates/edit-action-buttons.html",
"template": editActionButtonsTemplate,
"uses": [
"action"
]
},
{
"key": "edit-elements",
"templateUrl": "templates/elements.html",
"template": elementsTemplate,
"uses": [
"composition"
],
@@ -218,7 +230,7 @@ define([
},
{
"key": "topbar-edit",
"templateUrl": "templates/topbar-edit.html"
"template": topbarEditTemplate
}
],
"representers": [

View File

@@ -19,50 +19,51 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<mct-representation key="'topbar-edit'"
mct-object="domainObject"
ng-model="representation">
</mct-representation>
<div class="holder edit-area abs">
<mct-split-pane class='contents abs' anchor='right'>
<div class='split-pane-component pane left edit-main'>
<mct-toolbar name="mctToolbar"
structure="toolbar.structure"
ng-model="toolbar.state">
</mct-toolbar>
<mct-representation key="representation.selected.key"
toolbar="toolbar"
mct-object="representation.selected.key && domainObject"
class="holder abs object-holder work-area">
<div class="abs l-flex-col" ng-controller="EditObjectController as EditObjectController">
<div mct-before-unload="EditObjectController.getUnloadWarning()"
class="holder flex-elem l-flex-row object-browse-bar ">
<div class="items-select left flex-elem l-flex-row grows">
<mct-representation key="'back-arrow'"
mct-object="domainObject"
class="flex-elem l-back"></mct-representation>
<mct-representation key="'object-header'"
mct-object="domainObject"
class="l-flex-row flex-elem grows object-header">
</mct-representation>
</div>
<mct-splitter></mct-splitter>
<div
class='split-pane-component pane right edit-objects menus-to-left'
ng-controller='EditPanesController as editPanes'
>
<mct-split-pane class='contents abs' anchor='bottom'>
<div
class="abs pane top accordion"
ng-controller="ToggleController as toggle"
>
<mct-container key="accordion" label="Library">
<mct-representation key="'tree'"
mct-object="editPanes.getRoot()">
</mct-representation>
</mct-container>
</div>
<mct-splitter></mct-splitter>
<div
class="abs pane bottom accordion"
ng-controller="ToggleController as toggle"
>
<mct-container key="accordion" label="Elements">
<mct-representation key="'edit-elements'" mct-object="domainObject">
</mct-representation>
</mct-container>
</div>
</mct-split-pane>
<div class="btn-bar right l-flex-row flex-elem flex-justify-end flex-fixed">
<mct-representation key="'switcher'"
mct-object="domainObject"
ng-model="representation">
</mct-representation>
<!-- Temporarily, on mobile, the action buttons are hidden-->
<mct-representation key="'action-group'"
mct-object="domainObject"
parameters="{ category: 'view-control' }"
class="mobile-hide">
</mct-representation>
</div>
</mct-split-pane>
</div>
<div class="holder l-flex-col flex-elem grows l-object-wrapper">
<div class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
<!-- Toolbar and Save/Cancel buttons -->
<div class="l-edit-controls flex-elem l-flex-row flex-align-end">
<mct-toolbar name="mctToolbar"
structure="toolbar.structure"
ng-model="toolbar.state"
class="flex-elem grows">
</mct-toolbar>
<mct-representation key="'edit-action-buttons'"
mct-object="domainObject"
class='flex-elem conclude-editing'>
</mct-representation>
</div>
<mct-representation key="representation.selected.key"
mct-object="representation.selected.key && domainObject"
class="abs flex-elem grows object-holder-main scroll"
toolbar="toolbar">
</mct-representation>
</div><!--/ l-object-wrapper-inner -->
</div>
</div>

View File

@@ -19,16 +19,19 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<div ng-controller="ElementsController">
<div ng-controller="ElementsController" class="flex-elem l-flex-col holder grows">
<mct-include key="'input-filter'"
class="flex-elem holder"
ng-model="filterBy">
</mct-include>
<div class="current-elements abs" style="height: 100%;">
<div class="flex-elem grows vscroll">
<ul class="tree">
<li ng-repeat="containedObject in composition | filter:searchText">
<span class="tree-item">
<mct-representation key="'label'" mct-object="containedObject">
<mct-representation
class="rep-object-label"
key="'label'"
mct-object="containedObject">
</mct-representation>
</span>
</li>

View File

@@ -72,13 +72,26 @@ define(
* Enter edit mode.
*/
EditAction.prototype.perform = function () {
var editableObject;
var self = this;
if (!this.domainObject.hasCapability("editor")) {
editableObject = new EditableDomainObject(this.domainObject, this.$q);
editableObject.getCapability('status').set('editing', true);
this.navigationService.setNavigation(editableObject);
//TODO: This is only necessary because the drop gesture is
// wrapping the object itself, need to refactor this later.
// All responsibility for switching into edit mode should be
// in the edit action, and not duplicated in the gesture
this.domainObject = new EditableDomainObject(this.domainObject, this.$q);
}
//this.$location.path("/edit");
this.navigationService.setNavigation(this.domainObject);
this.domainObject.getCapability('status').set('editing', true);
//Register a listener to automatically cancel this edit action
//if the user navigates away from this object.
function cancelEditing(navigatedTo){
if (!navigatedTo || navigatedTo.getId() !== self.domainObject.getId()) {
self.domainObject.getCapability('editor').cancel();
self.navigationService.removeListener(cancelEditing);
}
}
this.navigationService.addListener(cancelEditing);
};
/**

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

@@ -19,44 +19,42 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/*global define*/
/**
* Module defining DomainColumn. Created by vwoeltje on 11/18/14.
*/
define(
[],
function () {
"use strict";
['./EditableLookupCapability'],
function (EditableLookupCapability) {
'use strict';
/**
* A column which will report telemetry range values
* (typically, measurements.) Used by the ScrollingListController.
* Wrapper for the "instantiation" capability;
* ensures that any domain objects instantiated in Edit mode
* are also wrapped as EditableDomainObjects.
*
* @memberof platform/features/events
* 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
* @implements {platform/features/events.EventsColumn}
* @param rangeMetadata an object with the machine- and human-
* readable names for this range (in `key` and `name`
* fields, respectively.)
* @param {TelemetryFormatter} telemetryFormatter the telemetry
* formatting service, for making values human-readable.
* @memberof platform/commonUI/edit
* @implements {CompositionCapability}
*/
function RangeColumn(rangeMetadata, telemetryFormatter) {
this.rangeMetadata = rangeMetadata;
this.telemetryFormatter = telemetryFormatter;
}
RangeColumn.prototype.getTitle = function () {
return this.rangeMetadata.name;
};
RangeColumn.prototype.getValue = function (domainObject, data, index) {
var rangeKey = this.rangeMetadata.key;
return this.telemetryFormatter.formatRangeValue(
data.getRangeValue(index, rangeKey)
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
);
};
return RangeColumn;
}
);

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;
});
};
/**
@@ -119,8 +124,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

@@ -26,41 +26,45 @@
* @namespace platform/commonUI/edit
*/
define(
["../objects/EditableDomainObject"],
function (EditableDomainObject) {
[],
function () {
"use strict";
/**
* Controller which is responsible for populating the scope for
* Edit mode; introduces an editable version of the currently
* navigated domain object into the scope.
* Edit mode
* @memberof platform/commonUI/edit
* @constructor
*/
function EditController($scope, $q, navigationService) {
var self = this;
function EditObjectController($scope, $location, policyService) {
this.scope = $scope;
this.policyService = policyService;
function setNavigation(domainObject) {
// Wrap the domain object such that all mutation is
// confined to edit mode (until Save)
self.navigatedDomainObject =
domainObject && new EditableDomainObject(domainObject, $q);
var navigatedObject;
function setViewForDomainObject(domainObject) {
var locationViewKey = $location.search().view;
function selectViewIfMatching(view) {
if (view.key === locationViewKey) {
$scope.representation = $scope.representation || {};
$scope.representation.selected = view;
}
}
if (locationViewKey) {
((domainObject && domainObject.useCapability('view')) || [])
.forEach(selectViewIfMatching);
}
navigatedObject = domainObject;
}
setNavigation(navigationService.getNavigation());
navigationService.addListener(setNavigation);
$scope.$on("$destroy", function () {
navigationService.removeListener(setNavigation);
});
}
$scope.$watch('domainObject', setViewForDomainObject);
/**
* Get the domain object which is navigated-to.
* @returns {DomainObject} the domain object that is navigated-to
*/
EditController.prototype.navigatedObject = function () {
return this.navigatedDomainObject;
};
$scope.doAction = function (action){
return $scope[action] && $scope[action]();
};
}
/**
* Get the warning to show if the user attempts to navigate
@@ -68,17 +72,18 @@ define(
* @returns {string} the warning to show, or undefined if
* there are no unsaved changes
*/
EditController.prototype.getUnloadWarning = function () {
var navigatedObject = this.navigatedDomainObject,
editorCapability = navigatedObject &&
navigatedObject.getCapability("editor"),
hasChanges = editorCapability && editorCapability.dirty();
EditObjectController.prototype.getUnloadWarning = function () {
var navigatedObject = this.scope.domainObject,
policyMessage;
this.policyService.allow("navigation", navigatedObject, undefined, function(message) {
policyMessage = message;
});
return policyMessage;
return hasChanges ?
"Unsaved changes will be lost if you leave this page." :
undefined;
};
return EditController;
return EditObjectController;
}
);

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

@@ -19,45 +19,49 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,moment*/
/*global define*/
/**
* Module defining DomainColumn. Created by vwoeltje on 11/18/14.
*/
define(
[],
function () {
"use strict";
/**
* A column which will report telemetry domain values
* (typically, timestamps.) Used by the ScrollingListController.
*
* @memberof platform/features/events
* Policy controlling whether navigation events should proceed
* when object is being edited.
* @memberof platform/commonUI/edit
* @constructor
* @implements {platform/features/events.EventsColumn}
* @param domainMetadata an object with the machine- and human-
* readable names for this domain (in `key` and `name`
* fields, respectively.)
* @param {TelemetryFormatter} telemetryFormatter the telemetry
* formatting service, for making values human-readable.
* @implements {Policy.<Action, ActionContext>}
*/
function DomainColumn(domainMetadata, telemetryFormatter) {
this.domainMetadata = domainMetadata;
this.telemetryFormatter = telemetryFormatter;
function EditNavigationPolicy(policyService) {
this.policyService = policyService;
}
DomainColumn.prototype.getTitle = function () {
return this.domainMetadata.name;
/**
* @private
*/
EditNavigationPolicy.prototype.isDirty = function(domainObject) {
var navigatedObject = domainObject,
editorCapability = navigatedObject &&
navigatedObject.getCapability("editor"),
statusCapability = navigatedObject &&
navigatedObject.getCapability("status");
return statusCapability && statusCapability.get('editing')
&& editorCapability && editorCapability.dirty();
};
DomainColumn.prototype.getValue = function (domainObject, data, index) {
var domainKey = this.domainMetadata.key;
return this.telemetryFormatter.formatDomainValue(
data.getDomainValue(index, domainKey)
);
/**
* Allow navigation if an object is not dirty, or if the user elects
* to proceed anyway.
* @param currentNavigation
* @returns {boolean|*} true if the object model is clean; or if
* it's dirty and the user wishes to proceed anyway.
*/
EditNavigationPolicy.prototype.allow = function (currentNavigation) {
return !this.isDirty(currentNavigation);
};
return DomainColumn;
return EditNavigationPolicy;
}
);

View File

@@ -49,6 +49,7 @@ define(
var self = this;
this.scope = scope;
this.listenHandle = undefined;
// Mutate and persist a new version of a domain object's model.
function doPersist(model) {
@@ -100,22 +101,53 @@ define(
// Place the "commit" method in the scope
scope.commit = commit;
scope.setEditable = setEditable;
// Clean up when the scope is destroyed
scope.$on("$destroy", function () {
self.destroy();
});
}
// Handle a specific representation of a specific domain object
EditRepresenter.prototype.represent = function represent(representation, representedObject) {
var scope = this.scope,
self = this;
// Track the key, to know which view configuration to save to.
this.key = (representation || {}).key;
// Track the represented object
this.domainObject = representedObject;
this.scope.isEditable = representedObject.getCapability('status').get('editing');
// Ensure existing watches are released
this.destroy();
function setEditing(){
scope.viewObjectTemplate = 'edit-object';
}
/**
* Listen for changes in object state. If the object becomes
* editable then change the view and inspector regions
* object representation accordingly
*/
this.listenHandle = this.domainObject.getCapability('status').listen(function(statuses){
if (statuses.indexOf('editing')!=-1){
setEditing();
} else {
delete scope.viewObjectTemplate;
}
});
if (representedObject.getCapability('status').get('editing')){
setEditing();
}
};
// Respond to the destruction of the current representation.
EditRepresenter.prototype.destroy = function destroy() {
// Nothing to clean up
return this.listenHandle && this.listenHandle();
};
return EditRepresenter;

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

@@ -22,102 +22,110 @@
/*global define,describe,it,expect,beforeEach,jasmine*/
define(
["../../src/controllers/EditController"],
function (EditController) {
["../../src/controllers/EditObjectController"],
function (EditObjectController) {
"use strict";
describe("The Edit mode controller", function () {
var mockScope,
mockQ,
mockNavigationService,
mockObject,
mockType,
mockLocation,
mockStatusCapability,
mockCapabilities,
mockPolicyService,
controller;
// Utility function; look for a $watch on scope and fire it
function fireWatch(expr, value) {
mockScope.$watch.calls.forEach(function (call) {
if (call.args[0] === expr) {
call.args[1](value);
}
});
}
beforeEach(function () {
mockPolicyService = jasmine.createSpyObj(
"policyService",
[
"allow"
]
);
mockScope = jasmine.createSpyObj(
"$scope",
[ "$on" ]
);
mockQ = jasmine.createSpyObj('$q', ['when', 'all']);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[ "getNavigation", "addListener", "removeListener" ]
[ "$on", "$watch" ]
);
mockObject = jasmine.createSpyObj(
"domainObject",
[ "getId", "getModel", "getCapability", "hasCapability" ]
[ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ]
);
mockType = jasmine.createSpyObj(
"type",
[ "hasFeature" ]
);
mockStatusCapability = jasmine.createSpyObj('statusCapability',
["get"]
);
mockCapabilities = {
"type" : mockType,
"status": mockStatusCapability
};
mockLocation = jasmine.createSpyObj('$location',
["search"]
);
mockLocation.search.andReturn({"view": "fixed"});
mockNavigationService.getNavigation.andReturn(mockObject);
mockObject.getId.andReturn("test");
mockObject.getModel.andReturn({ name: "Test object" });
mockObject.getCapability.andCallFake(function (key) {
return key === 'type' && mockType;
return mockCapabilities[key];
});
mockType.hasFeature.andReturn(true);
controller = new EditController(
mockScope.domainObject = mockObject;
controller = new EditObjectController(
mockScope,
mockQ,
mockNavigationService
mockLocation,
mockPolicyService
);
});
it("exposes the currently-navigated object", function () {
expect(controller.navigatedObject()).toBeDefined();
expect(controller.navigatedObject().getId()).toEqual("test");
});
it("adds an editor capability to the navigated object", function () {
// Should provide an editor capability...
expect(controller.navigatedObject().getCapability("editor"))
.toBeDefined();
// Shouldn't have been the mock capability we provided
expect(controller.navigatedObject().getCapability("editor"))
.not.toEqual(mockType);
});
it("detaches its navigation listener when destroyed", function () {
var navCallback = mockNavigationService
.addListener.mostRecentCall.args[0];
expect(mockScope.$on).toHaveBeenCalledWith(
"$destroy",
jasmine.any(Function)
);
// Verify precondition
expect(mockNavigationService.removeListener)
.not.toHaveBeenCalled();
// Trigger destroy
mockScope.$on.mostRecentCall.args[1]();
// Listener should have been removed
expect(mockNavigationService.removeListener)
.toHaveBeenCalledWith(navCallback);
});
it("exposes a warning message for unload", function () {
var obj = controller.navigatedObject(),
mockEditor = jasmine.createSpyObj('editor', ['dirty']);
var obj = mockObject,
errorMessage = "Unsaved changes";
// Normally, should be undefined
expect(controller.getUnloadWarning()).toBeUndefined();
// Override the object's editor capability, make it look
// like there are unsaved changes.
obj.getCapability = jasmine.createSpy();
obj.getCapability.andReturn(mockEditor);
mockEditor.dirty.andReturn(true);
// Override the policy service to prevent navigation
mockPolicyService.allow.andCallFake(function(category, object, context, callback){
callback(errorMessage);
});
// Should have some warning message here now
expect(controller.getUnloadWarning()).toEqual(jasmine.any(String));
expect(controller.getUnloadWarning()).toEqual(errorMessage);
});
it("sets the active view from query parameters", function () {
var testViews = [
{ key: 'abc' },
{ key: 'def', someKey: 'some value' },
{ key: 'xyz' }
];
mockObject.useCapability.andCallFake(function (c) {
return (c === 'view') && testViews;
});
mockLocation.search.andReturn({ view: 'def' });
fireWatch('domainObject', mockObject);
expect(mockScope.representation.selected)
.toEqual(testViews[1]);
});
});

View File

@@ -33,6 +33,8 @@ define(
testRepresentation,
mockDomainObject,
mockPersistence,
mockStatusCapability,
mockCapabilities,
representer;
function mockPromise(value) {
@@ -46,7 +48,7 @@ define(
beforeEach(function () {
mockQ = { when: mockPromise };
mockLog = jasmine.createSpyObj("$log", ["info", "debug"]);
mockScope = jasmine.createSpyObj("$scope", ["$watch"]);
mockScope = jasmine.createSpyObj("$scope", ["$watch", "$on"]);
testRepresentation = { key: "test" };
mockDomainObject = jasmine.createSpyObj("domainObject", [
"getId",
@@ -57,11 +59,20 @@ define(
]);
mockPersistence =
jasmine.createSpyObj("persistence", ["persist"]);
mockStatusCapability =
jasmine.createSpyObj("statusCapability", ["get", "listen"]);
mockStatusCapability.get.andReturn(false);
mockCapabilities = {
'persistence': mockPersistence,
'status': mockStatusCapability
};
mockDomainObject.getModel.andReturn({});
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.useCapability.andReturn(true);
mockDomainObject.getCapability.andReturn(mockPersistence);
mockDomainObject.getCapability.andCallFake(function(capability){
return mockCapabilities[capability];
});
representer = new EditRepresenter(mockQ, mockLog, mockScope);
representer.represent(testRepresentation, mockDomainObject);
@@ -71,6 +82,17 @@ define(
expect(mockScope.commit).toEqual(jasmine.any(Function));
});
it("Sets edit view template on edit mode", function () {
mockStatusCapability.listen.mostRecentCall.args[0](['editing']);
expect(mockScope.viewObjectTemplate).toEqual('edit-object');
});
it("Cleans up listeners on scope destroy", function () {
representer.listenHandle = jasmine.createSpy('listen');
mockScope.$on.mostRecentCall.args[1]();
expect(representer.listenHandle).toHaveBeenCalled();
});
it("mutates and persists upon observed changes", function () {
mockScope.model = { someKey: "some value" };
mockScope.configuration = { someConfiguration: "something" };
@@ -101,4 +123,4 @@ define(
});
}
);
);

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

@@ -24,6 +24,7 @@
define([
"./src/services/UrlService",
"./src/services/PopupService",
"./src/SplashScreenManager",
"./src/StyleSheetLoader",
"./src/UnsupportedBrowserWarning",
"./src/controllers/TimeRangeController",
@@ -48,10 +49,31 @@ define([
"./src/directives/MCTScroll",
"./src/directives/MCTSplitPane",
"./src/directives/MCTSplitter",
"./src/directives/MCTTree",
"text!./res/templates/bottombar.html",
"text!./res/templates/controls/action-button.html",
"text!./res/templates/controls/input-filter.html",
"text!./res/templates/indicator.html",
"text!./res/templates/message-banner.html",
"text!./res/templates/progress-bar.html",
"text!./res/templates/controls/time-controller.html",
"text!./res/templates/containers/accordion.html",
"text!./res/templates/subtree.html",
"text!./res/templates/tree.html",
"text!./res/templates/tree-node.html",
"text!./res/templates/label.html",
"text!./res/templates/controls/action-group.html",
"text!./res/templates/menu/context-menu.html",
"text!./res/templates/controls/switcher.html",
"text!./res/templates/object-inspector.html",
"text!./res/templates/controls/selector.html",
"text!./res/templates/controls/datetime-picker.html",
"text!./res/templates/controls/datetime-field.html",
'legacyRegistry'
], function (
UrlService,
PopupService,
SplashScreenManager,
StyleSheetLoader,
UnsupportedBrowserWarning,
TimeRangeController,
@@ -76,6 +98,26 @@ define([
MCTScroll,
MCTSplitPane,
MCTSplitter,
MCTTree,
bottombarTemplate,
actionButtonTemplate,
inputFilterTemplate,
indicatorTemplate,
messageBannerTemplate,
progressBarTemplate,
timeControllerTemplate,
accordionTemplate,
subtreeTemplate,
treeTemplate,
treeNodeTemplate,
labelTemplate,
actionGroupTemplate,
contextMenuTemplate,
switcherTemplate,
objectInspectorTemplate,
selectorTemplate,
datetimePickerTemplate,
datetimeFieldTemplate,
legacyRegistry
) {
"use strict";
@@ -117,42 +159,58 @@ define([
"notificationService",
"agentService"
]
},
{
"implementation": SplashScreenManager,
"depends": [
"$document"
]
}
],
"filters": [
{
"implementation": "filters/ReverseFilter.js",
"key": "reverse"
}
],
"stylesheets": [
{
"stylesheetUrl": "css/normalize.min.css",
"priority": "mandatory"
},
{
"stylesheetUrl": "css/reset.css",
"priority": "mandatory"
}
],
"templates": [
{
"key": "bottombar",
"templateUrl": "templates/bottombar.html"
"template": bottombarTemplate
},
{
"key": "action-button",
"templateUrl": "templates/controls/action-button.html"
"template": actionButtonTemplate
},
{
"key": "input-filter",
"templateUrl": "templates/controls/input-filter.html"
"template": inputFilterTemplate
},
{
"key": "indicator",
"templateUrl": "templates/indicator.html"
"template": indicatorTemplate
},
{
"key": "message-banner",
"templateUrl": "templates/message-banner.html"
"template": messageBannerTemplate
},
{
"key": "progress-bar",
"templateUrl": "templates/progress-bar.html"
"template": progressBarTemplate
},
{
"key": "time-controller",
"templateUrl": "templates/controls/time-controller.html"
"template": timeControllerTemplate
}
],
"controllers": [
@@ -333,6 +391,11 @@ define([
{
"key": "mctSplitter",
"implementation": MCTSplitter
},
{
"key": "mctTree",
"implementation": MCTTree,
"depends": [ '$parse', 'gestureService' ]
}
],
"constants": [
@@ -361,7 +424,7 @@ define([
"containers": [
{
"key": "accordion",
"templateUrl": "templates/containers/accordion.html",
"template": accordionTemplate,
"attributes": [
"label"
]
@@ -370,7 +433,7 @@ define([
"representations": [
{
"key": "tree",
"templateUrl": "templates/subtree.html",
"template": subtreeTemplate,
"uses": [
"composition"
],
@@ -379,25 +442,25 @@ define([
},
{
"key": "tree",
"templateUrl": "templates/tree.html"
"template": treeTemplate
},
{
"key": "subtree",
"templateUrl": "templates/subtree.html",
"template": subtreeTemplate,
"uses": [
"composition"
]
},
{
"key": "tree-node",
"templateUrl": "templates/tree-node.html",
"template": treeNodeTemplate,
"uses": [
"action"
]
},
{
"key": "label",
"templateUrl": "templates/label.html",
"template": labelTemplate,
"uses": [
"type",
"location"
@@ -410,7 +473,7 @@ define([
},
{
"key": "node",
"templateUrl": "templates/label.html",
"template": labelTemplate,
"uses": [
"type"
],
@@ -421,42 +484,42 @@ define([
},
{
"key": "action-group",
"templateUrl": "templates/controls/action-group.html",
"template": actionGroupTemplate,
"uses": [
"action"
]
},
{
"key": "context-menu",
"templateUrl": "templates/menu/context-menu.html",
"template": contextMenuTemplate,
"uses": [
"action"
]
},
{
"key": "switcher",
"templateUrl": "templates/controls/switcher.html",
"template": switcherTemplate,
"uses": [
"view"
]
},
{
"key": "object-inspector",
"templateUrl": "templates/object-inspector.html"
"template": objectInspectorTemplate
}
],
"controls": [
{
"key": "selector",
"templateUrl": "templates/controls/selector.html"
"template": selectorTemplate
},
{
"key": "datetime-picker",
"templateUrl": "templates/controls/datetime-picker.html"
"template": datetimePickerTemplate
},
{
"key": "datetime-field",
"templateUrl": "templates/controls/datetime-field.html"
"template": datetimeFieldTemplate
}
],
"licenses": [
@@ -479,6 +542,16 @@ define([
"copyright": "Copyright (c) Nicolas Gallagher and Jonathan Neal",
"license": "license-mit",
"link": "https://github.com/necolas/normalize.css/blob/v1.1.2/LICENSE.md"
},
{
"name": "Zepto",
"version": "1.1.6",
"description": "DOM manipulation",
"author": "Thomas Fuchs",
"website": "http://zeptojs.com/",
"copyright": "Copyright (c) 2010-2016 Thomas Fuchs",
"license": "license-mit",
"link": "https://github.com/madrobby/zepto/blob/master/MIT-LICENSE"
}
]
}

View File

@@ -1,26 +0,0 @@
# Require any additional compass plugins here.
# require "compass-growl"
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "js"
# You can select your preferred output style here (can be overridden via the command line):
# :expanded, :compressed, :nested
output_style = :nested
# To enable relative paths to assets via compass helper functions. Uncomment:
relative_assets = true
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass vfn_platform/static/sass scss && rm -rf sass && mv scss sass

View File

@@ -0,0 +1,48 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}

View File

@@ -1,19 +1,43 @@
{
"metadata": {
"name": "WTD Symbols",
"lastOpened": 1446670352108,
"created": 1446670349721
"lastOpened": 1455833272792,
"created": 1455833268424
},
"iconSets": [
{
"selection": [
{
"order": 119,
"id": 96,
"prevSize": 32,
"code": 58905,
"name": "icon-bullet",
"tempChar": ""
},
{
"order": 120,
"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,65 @@
"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": [
"M923 438.2l-151-100.6c-36-24-103.8-24-139.8 0l-151 100.6c-44.6 29.8-102.6 46.2-163 46.2s-118.4-16.4-163-46.2l-151.4-100.6c-1.8-1.2-3.8-2.4-5.8-3.6v208c36.6 7.4 70.6 20.8 99 39.8l151 100.6c36 24 103.8 24 139.8 0l151-100.6c44.6-29.8 102.6-46.2 163-46.2s118.4 16.4 163 46.2l151 100.6c1.8 1.2 3.8 2.4 5.8 3.6v-208c-36.2-7.2-70.2-20.8-98.6-39.8z",
"M923 822.2l-151-100.6c-36-24-103.8-24-139.8 0l-151 100.6c-44.6 29.8-102.6 46.2-163 46.2s-118.4-16.4-163-46.2l-151.4-100.6c-1.8-1.2-3.8-2.4-5.8-3.6v112c0 105.6 86.4 192 192 192h640c94.8 0 174.2-69.8 189.4-160.4-35.6-7.4-68.6-20.8-96.4-39.4z",
"M97 197.8l151 100.6c36 24 103.8 24 139.8 0l151-100.6c44.8-29.8 102.6-46.2 163.2-46.2s118.4 16.4 163 46.2l151 100.6c1.8 1.2 3.8 2.4 5.8 3.6v-112c0-105.6-86.4-192-192-192h-639.8c-94.8 0-174.2 69.8-189.4 160.4 35.6 7.4 68.6 20.8 96.4 39.4z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-session"
],
"colorPermutations": {
"16161751": [
0,
0,
0
]
}
},
{
"id": 94,
"paths": [
"M546.4 431.2l32-24c31.6-23.8 91.6-23.8 123.2 0l32 24c10.8 8 22.2 15.2 34.4 21.4v-201.2c-38-19.6-82.2-30-128-30-60.4 0-118.2 18.2-162.4 51.4l-32 24c-31.6 23.8-91.6 23.8-123.2 0l-32-24c-10.8-8-22.2-15.2-34.4-21.4v201.2c38 19.6 82.2 30 128 30 60.4 0 118.2-18.2 162.4-51.4z",
"M640 541.4c-60.4 0-118.2 18.2-162.4 51.4l-32 24c-31.6 23.8-91.6 23.8-123.2 0l-32-24c-10.8-8-22.2-15.2-34.4-21.4v201.2c38 19.6 82.2 30 128 30 60.4 0 118.2-18.2 162.4-51.4l32-24c31.6-23.8 91.6-23.8 123.2 0l32 24c10.8 8 22.2 15.2 34.4 21.4v-201.2c-38-19.6-82.2-30-128-30z",
"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",
"M320 832h-127.6c-0.2 0-0.2-0.2-0.4-0.4v-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-192z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-topic"
],
"colorPermutations": {
"16161751": [
0,
0,
0,
0
]
}
},
{
"id": 93,
"paths": [
@@ -749,6 +832,10 @@
"icon-eye-open-no-gleam"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -775,6 +862,10 @@
"icon-crosshair"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -801,6 +892,10 @@
"icon-collapse-pane-left"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -827,6 +922,10 @@
"icon-collapse-pane-right"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -853,6 +952,10 @@
"icon-save-v2"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -872,6 +975,7 @@
"icon-dataset"
],
"colorPermutations": {
"16161751": [],
"125525525516161751": []
}
},
@@ -895,6 +999,10 @@
"icon-bell"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -921,6 +1029,10 @@
"icon-hourglass"
],
"colorPermutations": {
"16161751": [
1,
1
],
"125525525516161751": [
1,
1
@@ -943,6 +1055,9 @@
"icon-info-v1.5"
],
"colorPermutations": {
"16161751": [
0
],
"125525525516161751": [
0
]
@@ -1336,6 +1451,10 @@
"icon-box-with-arrow-cursor"
],
"colorPermutations": {
"16161751": [
0,
0
],
"125525525516161751": [
0,
0
@@ -2367,12 +2486,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="M546.4 528.8l32 24c31.6 23.8 91.6 23.8 123.2 0l32-24c10.8-8 22.2-15.2 34.4-21.4v201.2c-38 19.6-82.2 30-128 30-60.4 0-118.2-18.2-162.4-51.4l-32-24c-31.6-23.8-91.6-23.8-123.2 0l-32 24c-10.8 8-22.2 15.2-34.4 21.4v-201.2c38-19.6 82.2-30 128-30 60.4 0 118.2 18.2 162.4 51.4zM640 418.6c-60.4 0-118.2-18.2-162.4-51.4l-32-24c-31.6-23.8-91.6-23.8-123.2 0l-32 24c-10.8 8-22.2 15.2-34.4 21.4v-201.2c38-19.6 82.2-30 128-30 60.4 0 118.2 18.2 162.4 51.4l32 24c31.6 23.8 91.6 23.8 123.2 0l32-24c10.8-8 22.2-15.2 34.4-21.4v201.2c-38 19.6-82.2 30-128 30zM832 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 192zM320 128h-127.6c-0.2 0-0.2 0.2-0.4 0.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-192h128v192z" />
<glyph unicode="&#xe618;" glyph-name="icon-session" d="M923 521.8l-151 100.6c-36 24-103.8 24-139.8 0l-151-100.6c-44.6-29.8-102.6-46.2-163-46.2s-118.4 16.4-163 46.2l-151.4 100.6c-1.8 1.2-3.8 2.4-5.8 3.6v-208c36.6-7.4 70.6-20.8 99-39.8l151-100.6c36-24 103.8-24 139.8 0l151 100.6c44.6 29.8 102.6 46.2 163 46.2s118.4-16.4 163-46.2l151-100.6c1.8-1.2 3.8-2.4 5.8-3.6v208c-36.2 7.2-70.2 20.8-98.6 39.8zM923 137.8l-151 100.6c-36 24-103.8 24-139.8 0l-151-100.6c-44.6-29.8-102.6-46.2-163-46.2s-118.4 16.4-163 46.2l-151.4 100.6c-1.8 1.2-3.8 2.4-5.8 3.6v-112c0-105.6 86.4-192 192-192h640c94.8 0 174.2 69.8 189.4 160.4-35.6 7.4-68.6 20.8-96.4 39.4zM97 762.2l151-100.6c36-24 103.8-24 139.8 0l151 100.6c44.8 29.8 102.6 46.2 163.2 46.2s118.4-16.4 163-46.2l151-100.6c1.8-1.2 3.8-2.4 5.8-3.6v112c0 105.6-86.4 192-192 192h-639.8c-94.8 0-174.2-69.8-189.4-160.4 35.6-7.4 68.6-20.8 96.4-39.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: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="20 0 640 150" enable-background="new 20 0 640 150" xml:space="preserve">
<filter height="130%" width="150%" id="AI_Shadow_Custom" x="-15%" filterUnits="objectBoundingBox" y="-15%">
<feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="6"></feGaussianBlur>
<feOffset in="blur" dy="3" result="offsetBlurredAlpha" dx="0"></feOffset>
<feMerge>
<feMergeNode in="offsetBlurredAlpha"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<g filter="url(#AI_Shadow_Custom)">
<path fill="#FFFFFF" d="M90.7,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8H62.8c-14.8,0-22.8-8-22.8-22.8V36
c0-14.8,8-22.8,22.8-22.8H90.7z M97.8,36.2c0-5.8-3.1-9.2-9.2-9.2h-24c-5.8,0-9.2,3.2-9.2,9.2v45.9c0,6,3.4,9.2,9.2,9.2h24
c6,0,9.2-3.2,9.2-9.2V36.2z"/>
<path fill="#FFFFFF" d="M173.2,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8h-9c-11.2,0-19.2-6.6-26.5-13.6v44.2
h-15.5V13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6H173.2z M180.3,36.2c0-5.8-3.1-9.2-9.2-9.2h-8.3c-9.4,0-17,3.6-25.2,9.2v45.9
c8.2,5.6,15.8,9.2,25.2,9.2h8.3c6.1,0,9.2-3.4,9.2-9.2V36.2z"/>
<path fill="#FFFFFF" d="M220.3,82.8c0,6,3.2,9.2,9.2,9.2h23c6,0,9.2-3.4,9.2-9.2V76h15.6v6.3c0,14.8-8,22.8-22.8,22.8h-27
c-14.8,0-22.8-8-22.8-22.8V36c0-14.8,8-22.8,22.8-22.8h27c14.8,0,22.8,8,22.8,22.8v26.9h-57V82.8z M229.5,26.3
c-6,0-9.2,3.2-9.2,9.2v15.8h41.3V35.5c0-6-3.1-9.2-9.2-9.2H229.5z"/>
<path fill="#FFFFFF" d="M285.7,13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6h7.1c14.8,0,22.8,8,22.8,22.8v69.1h-15.5V36.6
c0-6-3.2-9.2-9.2-9.2h-6.6c-9.4,0-17,3.4-25.2,9.2v68.5h-15.5V13.2z"/>
<path fill="#4F79F7" d="M495.4,105.1c-12.5,0-18.4-6-18.4-18.4V28.7c0-12.5,6.2-18.4,18.7-18.4h42.2c12.5,0,18.1,6,18.1,18.4v17.7
h-25.4V33.9c0-1.9-0.5-2.4-2.4-2.4h-23.3c-1.9,0-2.4,0.5-2.4,2.4v47.6c0,1.9,0.5,2.4,2.4,2.4h23.3c1.9,0,2.4-0.5,2.4-2.4V69H556
v17.7c0,12.5-6,18.4-18.4,18.4H495.4z"/>
<path fill="#4F79F7" d="M613.7,32v73.1h-25.4V32H562V10.3h78V32H613.7z"/>
<path fill="#4F79F7" d="M425.3,93.6l17.4-42.4v48.6c0,3,2.4,5.4,5.4,5.4h19V15.7c0-3-2.4-5.4-5.4-5.4h-23.3l-21.2,49.4l-21.2-49.4
h-23.3c-3,0-5.4,2.4-5.4,5.4v89.5h19c3,0,5.4-2.4,5.4-5.4V51.2l17.4,42.4H425.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="20 0 640 150" enable-background="new 20 0 640 150" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M90.7,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8H62.8c-14.8,0-22.8-8-22.8-22.8V36
c0-14.8,8-22.8,22.8-22.8H90.7z M97.8,36.2c0-5.8-3.1-9.2-9.2-9.2h-24c-5.8,0-9.2,3.2-9.2,9.2v45.9c0,6,3.4,9.2,9.2,9.2h24
c6,0,9.2-3.2,9.2-9.2V36.2z"/>
<path fill="#FFFFFF" d="M173.2,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8h-9c-11.2,0-19.2-6.6-26.5-13.6v44.2
h-15.5V13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6H173.2z M180.3,36.2c0-5.8-3.1-9.2-9.2-9.2h-8.3c-9.4,0-17,3.6-25.2,9.2v45.9
c8.2,5.6,15.8,9.2,25.2,9.2h8.3c6.1,0,9.2-3.4,9.2-9.2V36.2z"/>
<path fill="#FFFFFF" d="M220.3,82.8c0,6,3.2,9.2,9.2,9.2h23c6,0,9.2-3.4,9.2-9.2V76h15.6v6.3c0,14.8-8,22.8-22.8,22.8h-27
c-14.8,0-22.8-8-22.8-22.8V36c0-14.8,8-22.8,22.8-22.8h27c14.8,0,22.8,8,22.8,22.8v26.9h-57V82.8z M229.5,26.3
c-6,0-9.2,3.2-9.2,9.2v15.8h41.3V35.5c0-6-3.1-9.2-9.2-9.2H229.5z"/>
<path fill="#FFFFFF" d="M285.7,13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6h7.1c14.8,0,22.8,8,22.8,22.8v69.1h-15.5V36.6
c0-6-3.2-9.2-9.2-9.2h-6.6c-9.4,0-17,3.4-25.2,9.2v68.5h-15.5V13.2z"/>
<path fill="#4F79F7" d="M495.4,105.1c-12.5,0-18.4-6-18.4-18.4V28.7c0-12.5,6.2-18.4,18.7-18.4h42.2c12.5,0,18.1,6,18.1,18.4v17.7
h-25.4V33.9c0-1.9-0.5-2.4-2.4-2.4h-23.3c-1.9,0-2.4,0.5-2.4,2.4v47.6c0,1.9,0.5,2.4,2.4,2.4h23.3c1.9,0,2.4-0.5,2.4-2.4V69H556
v17.7c0,12.5-6,18.4-18.4,18.4H495.4z"/>
<path fill="#4F79F7" d="M613.7,32v73.1h-25.4V32H562V10.3h78V32H613.7z"/>
<path fill="#4F79F7" d="M425.3,93.6l17.4-42.4v48.6c0,3,2.4,5.4,5.4,5.4h19V15.7c0-3-2.4-5.4-5.4-5.4h-23.3l-21.2,49.4l-21.2-49.4
h-23.3c-3,0-5.4,2.4-5.4,5.4v89.5h19c3,0,5.4-2.4,5.4-5.4V51.2l17.4,42.4H425.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,99 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1040px" height="150px" viewBox="0 0 1040 150" enable-background="new 0 0 1040 150" xml:space="preserve">
<filter width="150%" height="130%" x="-15%" y="-15%" filterUnits="objectBoundingBox" id="AI_Shadow_Custom">
<feGaussianBlur in="SourceAlpha" stdDeviation="6" result="blur"></feGaussianBlur>
<feOffset dy="3" dx="0" in="blur" result="offsetBlurredAlpha"></feOffset>
<feMerge>
<feMergeNode in="offsetBlurredAlpha"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<g filter="url(#AI_Shadow_Custom)">
<path fill="#FFFFFF" d="M121.932,76.064c0,5.952-0.992,11.507-3.174,16.665c-1.984,4.96-4.96,9.324-8.531,13.094
c-3.769,3.769-7.936,6.547-13.094,8.531c-4.96,1.984-10.515,2.976-16.466,2.976H56.463c-5.952,0-11.507-0.992-16.466-2.976
s-9.523-4.96-13.094-8.531c-3.769-3.769-6.547-8.134-8.729-13.094C15.992,87.57,15,82.015,15,76.064V57.217
c0-5.952,0.992-11.507,3.174-16.665s4.96-9.523,8.729-13.094c3.571-3.571,7.936-6.547,12.895-8.531s10.515-3.174,16.466-3.174
h24.203c5.952,0,11.507,0.992,16.466,3.174c4.96,1.984,9.324,4.96,13.094,8.531s6.547,7.936,8.531,13.094
c1.984,5.158,3.174,10.515,3.174,16.665v18.847H121.932z M103.878,57.217c0-3.571-0.595-6.745-1.786-9.523
c-1.19-2.777-2.777-5.357-4.761-7.34c-1.984-1.984-4.563-3.571-7.34-4.761c-2.777-1.19-5.952-1.786-9.523-1.786H56.463
c-3.571,0-6.745,0.595-9.523,1.786c-2.777,1.19-5.357,2.777-7.34,4.761c-1.984,1.984-3.571,4.563-4.761,7.34
c-1.389,2.777-1.984,5.952-1.984,9.523v18.847c0,3.571,0.595,6.745,1.786,9.523c1.19,2.976,2.777,5.357,4.761,7.34
s4.563,3.571,7.34,4.761c2.777,1.19,6.15,1.786,9.523,1.786h24.203c3.571,0,6.745-0.595,9.523-1.786
c2.777-1.19,5.357-2.777,7.34-4.761s3.571-4.563,4.761-7.34c1.19-2.777,1.786-6.15,1.786-9.523L103.878,57.217z"/>
<path fill="#FFFFFF" d="M209.62,90.943c0,3.174-0.397,5.753-1.19,8.332c-0.794,2.381-1.786,4.563-3.174,6.547
c-1.19,1.786-2.777,3.373-4.563,4.761c-1.786,1.389-3.571,2.381-5.357,3.174c-1.786,0.794-3.769,1.389-5.555,1.786
c-1.984,0.397-3.769,0.595-5.357,0.595h-32.337V98.283h32.337c2.381,0,4.166-0.595,5.357-1.786c1.19-1.19,1.786-2.976,1.786-5.357
V66.739c0-2.579-0.595-4.365-1.786-5.555c-1.19-1.19-2.976-1.786-5.357-1.786h-32.139c-2.381,0-4.365,0.595-5.555,1.786
c-1.19,1.19-1.786,2.976-1.786,5.357v72.809H127.09V66.541c0-3.174,0.397-5.753,1.19-8.332c0.794-2.381,1.786-4.563,3.174-6.547
c1.389-1.786,2.777-3.373,4.563-4.761s3.571-2.381,5.357-3.174s3.769-1.389,5.555-1.786c1.984-0.397,3.769-0.595,5.357-0.595
h32.337c3.174,0,5.753,0.397,8.332,1.19c2.381,0.794,4.563,1.786,6.348,3.174c1.786,1.19,3.373,2.777,4.761,4.563
s2.381,3.571,3.174,5.357c0.794,1.786,1.389,3.769,1.785,5.555c0.397,1.984,0.595,3.769,0.595,5.357L209.62,90.943L209.62,90.943z"
/>
<path fill="#FFFFFF" d="M295.126,66.144c0,2.579-0.397,5.158-1.389,7.936c-0.794,2.777-2.381,5.555-4.166,7.936
c-1.984,2.381-4.563,4.563-7.737,6.15c-3.174,1.587-6.944,2.579-11.507,2.579H237.99V73.683h32.337
c2.381,0,4.365-0.794,5.555-2.182c1.389-1.587,1.984-3.373,1.984-5.555c0-2.381-0.794-4.166-2.182-5.555
c-1.587-1.389-3.373-1.984-5.357-1.984H237.99c-2.381,0-4.365,0.794-5.753,2.182c-1.389,1.587-1.984,3.373-1.984,5.555V91.34
c0,2.381,0.794,4.166,2.182,5.555c1.587,1.389,3.373,1.984,5.555,1.984h46.82v17.061h-47.018c-2.579,0-5.158-0.397-7.936-1.389
c-2.777-0.794-5.555-2.381-7.936-4.166c-2.381-1.984-4.563-4.563-6.15-7.737c-1.587-3.174-2.381-6.944-2.381-11.507V66.144
c0-2.579,0.397-5.158,1.389-7.936c0.794-2.777,2.381-5.555,4.166-7.936c1.984-2.381,4.563-4.563,7.737-6.15
s6.944-2.579,11.507-2.579h32.337c2.579,0,5.158,0.397,7.936,1.389c2.777,0.794,5.555,2.381,7.936,4.166
c2.381,1.984,4.563,4.563,6.15,7.737C294.332,57.812,295.126,61.78,295.126,66.144z"/>
<path fill="#FFFFFF" d="M379.838,116.138h-17.855V74.675c0-2.381-0.397-4.365-1.19-6.348c-0.794-1.785-1.984-3.373-3.373-4.761
c-1.389-1.389-2.976-2.381-4.96-2.976c-1.785-0.794-3.968-0.992-5.952-0.992h-31.346v56.541h-17.855V50.471
c0-1.19,0.198-2.381,0.595-3.571c0.397-0.992,1.19-1.984,1.984-2.777c0.794-0.794,1.785-1.389,2.976-1.984
c1.19-0.397,2.182-0.595,3.571-0.595h40.471c2.182,0,4.563,0.198,7.142,0.794c2.579,0.595,4.96,1.389,7.539,2.381
c2.381,1.19,4.761,2.579,6.944,4.365c2.182,1.786,4.166,3.769,5.952,6.348c1.785,2.381,3.174,5.357,4.166,8.531
c0.992,3.174,1.587,6.944,1.587,10.911v41.265H379.838z"/>
<path fill="#FFFFFF" d="M502.839,116.138h-18.053V57.217l-31.742,55.946c-0.794,1.389-1.785,2.579-3.373,3.174
c-1.389,0.794-2.976,1.19-4.563,1.19s-2.976-0.397-4.365-1.19c-1.389-0.794-2.381-1.786-3.174-3.174l-31.941-55.946v58.922h-17.855
V24.879c0-1.984,0.595-3.968,1.785-5.555c1.19-1.587,2.777-2.777,4.761-3.174c0.992-0.198,1.984-0.397,2.976-0.198
c0.992,0,1.984,0.198,2.777,0.595c0.992,0.397,1.785,0.794,2.381,1.389c0.794,0.595,1.389,1.389,1.785,2.182l40.868,71.023
l40.868-71.023c0.992-1.786,2.579-2.976,4.365-3.769c1.785-0.794,3.769-0.794,5.753-0.397c1.984,0.595,3.571,1.587,4.761,3.174
c1.19,1.587,1.785,3.373,1.785,5.555v91.457H502.839z"/>
<path fill="#FFFFFF" d="M595.685,116.138h-62.493c-1.587,0-3.373-0.198-5.357-0.595c-1.984-0.397-3.769-0.992-5.753-1.786
c-1.786-0.794-3.571-1.984-5.357-3.174c-1.786-1.389-3.174-2.976-4.563-4.761c-1.389-1.786-2.381-3.968-3.174-6.547
c-0.794-2.381-1.19-5.158-1.19-8.332V42.337c0-1.587,0.198-3.373,0.595-5.357c0.397-1.984,0.992-3.769,1.785-5.753
c0.794-1.786,1.984-3.571,3.174-5.357c1.389-1.786,2.976-3.174,4.761-4.563c1.786-1.389,3.968-2.381,6.348-3.174
c2.381-0.794,5.158-1.19,8.332-1.19h62.493v17.855h-62.493c-2.381,0-4.166,0.595-5.357,1.786c-1.19,1.19-1.785,3.174-1.785,5.555
v48.407c0,2.381,0.595,4.166,1.984,5.357c1.19,1.19,2.976,1.984,5.357,1.984h62.493v18.252H595.685z"/>
<path fill="#FFFFFF" d="M697.658,35.195h-39.479v80.943h-17.855V35.195h-39.479V17.34h97.012v17.855H697.658z"/>
<path fill="#4F79F7" d="M98.125,49.083c-0.992-2.381-2.182-4.166-3.769-5.952c-1.587-1.587-3.571-2.777-5.952-3.769
c-2.381-0.992-4.96-1.389-7.936-1.389H65.192c-1.389,7.34-1.389,12.697-0.794,15.474c0.198-0.198,0.397-0.198,0.397-0.397
c1.587-1.389,3.571-3.174,6.15-4.166c1.785-0.794,3.769-1.19,5.555-1.19c3.174,0,5.952,1.19,7.936,3.373
c2.777,3.174,3.968,8.332,3.174,14.879c-1.984,16.07-11.308,17.26-14.086,17.26c-1.786,0-3.769-0.397-5.555-1.19
c-2.579-1.19-4.365-2.976-5.555-4.365l-0.198-0.198c-1.389,2.579-2.976,8.531-3.571,17.26h21.823c2.976,0,5.555-0.397,7.936-1.389
c2.381-0.992,4.365-2.182,5.952-3.769c1.587-1.587,2.777-3.571,3.769-5.753c0.992-2.381,1.389-4.96,1.389-7.936V57.018
C99.514,54.241,99.117,51.463,98.125,49.083z M61.82,72.096c2.777,0,4.365,4.365,7.936,5.952c4.761,2.182,11.308,0.397,12.895-12.3
s-4.761-14.482-9.919-12.3c-3.968,1.587-6.547,5.952-9.324,5.952c-3.571,0-5.158-8.134-2.976-21.426h-4.166
c-2.976,0-5.555,0.397-7.936,1.389c-2.381,0.992-4.365,2.182-5.952,3.769c-1.587,1.587-2.976,3.571-3.769,5.952
c-0.992,2.381-1.389,4.96-1.389,7.936v18.847c0,2.976,0.397,5.753,1.389,7.936c0.992,2.381,2.182,4.166,3.769,5.753
c1.587,1.587,3.571,2.777,5.952,3.769c1.587,0.595,3.373,0.992,5.357,1.19C54.479,80.825,58.249,72.096,61.82,72.096z"/>
<path fill="#4F79F7" d="M858.155,17.142l-16.665,93.045c-0.397,1.786-1.19,3.373-2.579,4.761c-1.389,1.389-2.777,2.182-4.761,2.579
s-3.769,0.198-5.357-0.595c-1.587-0.794-2.976-1.984-3.968-3.373l-32.933-54.16l-32.933,54.16
c-0.794,1.389-1.786,2.381-3.174,3.174c-1.389,0.794-2.777,1.19-4.365,1.19c-2.182,0-4.166-0.595-5.753-1.984
s-2.579-3.174-2.976-5.357l-16.665-93.045h18.252l11.903,65.468l28.37-45.233c0.794-1.389,1.786-2.381,3.174-3.174
s2.777-1.19,4.365-1.19c1.587,0,2.976,0.397,4.365,1.19c1.389,0.794,2.381,1.786,3.373,3.174l28.171,45.233l11.903-65.468h18.252
V17.142z"/>
<path fill="#4F79F7" d="M1024.802,91.141c0,1.786-0.198,3.571-0.595,5.357c-0.397,1.984-0.992,3.769-1.786,5.555
c-0.794,1.786-1.984,3.571-3.174,5.357c-1.389,1.786-2.976,3.174-4.761,4.563c-1.786,1.389-3.968,2.381-6.547,3.174
c-2.381,0.794-5.158,1.19-8.332,1.19H967.07c-1.786,0-3.571-0.198-5.357-0.595c-1.984-0.397-3.769-0.992-5.555-1.786
c-1.785-0.794-3.571-1.984-5.357-3.174c-1.786-1.389-3.174-2.976-4.563-4.761c-1.389-1.786-2.381-3.968-3.174-6.547
c-0.794-2.381-1.19-5.158-1.19-8.332V10h18.053v81.141c0,2.182,0.595,3.968,1.984,5.357s3.174,1.984,5.158,1.984h32.536
c2.182,0,3.968-0.595,5.357-1.984c1.19-1.389,1.984-3.174,1.984-5.357V66.938c0-2.182-0.595-3.968-1.984-5.357
c-1.389-1.19-2.976-1.984-5.158-1.984h-32.536V41.544h32.536c1.786,0,3.571,0.198,5.357,0.595c1.984,0.397,3.769,0.992,5.555,1.786
c1.786,0.794,3.571,1.984,5.357,3.174c1.785,1.389,3.174,2.976,4.563,4.761s2.381,3.968,3.174,6.547
c0.794,2.381,1.19,5.158,1.19,8.332v24.402H1024.802z"/>
<path fill="#4F79F7" d="M937.709,66.144c0,2.579-0.397,5.158-1.389,7.936c-0.794,2.777-2.381,5.555-4.166,7.936
c-1.984,2.381-4.563,4.563-7.737,6.15c-3.174,1.587-6.944,2.579-11.507,2.579h-32.337V73.683h32.337
c2.381,0,4.365-0.794,5.555-2.182c1.389-1.587,1.984-3.373,1.984-5.555c0-2.381-0.794-4.166-2.182-5.555
c-1.587-1.389-3.373-1.984-5.357-1.984h-32.337c-2.381,0-4.365,0.794-5.753,2.182c-1.389,1.587-1.984,3.373-1.984,5.555V91.34
c0,2.381,0.794,4.166,2.182,5.555c1.587,1.389,3.373,1.984,5.555,1.984h47.018v17.061h-47.018c-2.579,0-5.158-0.397-7.936-1.389
c-2.777-0.794-5.555-2.381-7.936-4.166c-2.381-1.984-4.563-4.563-6.15-7.737c-1.587-3.174-2.381-6.944-2.381-11.507V66.144
c0-2.579,0.397-5.158,1.389-7.936c0.794-2.777,2.381-5.555,4.166-7.936c1.984-2.381,4.563-4.563,7.737-6.15
c3.174-1.587,6.944-2.579,11.507-2.579h32.337c2.579,0,5.158,0.397,7.936,1.389c2.777,0.794,5.555,2.381,7.936,4.166
c2.381,1.984,4.563,4.563,6.15,7.737C936.717,57.812,937.709,61.78,937.709,66.144z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 509 65.2" enable-background="new 0 0 509 65.2" xml:space="preserve">
<g id="logo_s3_4_">
<g>
<g>
<path fill="#FFFFFF" d="M53.9,33.3c0,3-0.5,5.8-1.6,8.4c-1,2.5-2.5,4.7-4.3,6.6c-1.9,1.9-4,3.3-6.6,4.3c-2.5,1-5.3,1.5-8.3,1.5
H20.9c-3,0-5.8-0.5-8.3-1.5c-2.5-1-4.8-2.5-6.6-4.3c-1.9-1.9-3.3-4.1-4.4-6.6C0.5,39.1,0,36.3,0,33.3v-9.5c0-3,0.5-5.8,1.6-8.4
c1.1-2.6,2.5-4.8,4.4-6.6C7.8,7,10,5.5,12.5,4.5c2.5-1,5.3-1.6,8.3-1.6h12.2c3,0,5.8,0.5,8.3,1.6c2.5,1,4.7,2.5,6.6,4.3
c1.9,1.8,3.3,4,4.3,6.6c1,2.6,1.6,5.3,1.6,8.4V33.3z M44.8,23.8c0-1.8-0.3-3.4-0.9-4.8c-0.6-1.4-1.4-2.7-2.4-3.7
c-1-1-2.3-1.8-3.7-2.4c-1.4-0.6-3-0.9-4.8-0.9H20.9c-1.8,0-3.4,0.3-4.8,0.9c-1.4,0.6-2.7,1.4-3.7,2.4c-1,1-1.8,2.3-2.4,3.7
C9.3,20.4,9,22,9,23.8v9.5c0,1.8,0.3,3.4,0.9,4.8c0.6,1.5,1.4,2.7,2.4,3.7c1,1,2.3,1.8,3.7,2.4c1.4,0.6,3.1,0.9,4.8,0.9H33
c1.8,0,3.4-0.3,4.8-0.9c1.4-0.6,2.7-1.4,3.7-2.4c1-1,1.8-2.3,2.4-3.7c0.6-1.4,0.9-3.1,0.9-4.8V23.8z"/>
<path fill="#FFFFFF" d="M98.1,40.8c0,1.6-0.2,2.9-0.6,4.2c-0.4,1.2-0.9,2.3-1.6,3.3c-0.6,0.9-1.4,1.7-2.3,2.4
c-0.9,0.7-1.8,1.2-2.7,1.6c-0.9,0.4-1.9,0.7-2.8,0.9c-1,0.2-1.9,0.3-2.7,0.3H69.1v-9h16.3c1.2,0,2.1-0.3,2.7-0.9
c0.6-0.6,0.9-1.5,0.9-2.7V28.6c0-1.3-0.3-2.2-0.9-2.8c-0.6-0.6-1.5-0.9-2.7-0.9H69.2c-1.2,0-2.2,0.3-2.8,0.9
c-0.6,0.6-0.9,1.5-0.9,2.7v36.7h-9V28.5c0-1.6,0.2-2.9,0.6-4.2c0.4-1.2,0.9-2.3,1.6-3.3c0.7-0.9,1.4-1.7,2.3-2.4
c0.9-0.7,1.8-1.2,2.7-1.6c0.9-0.4,1.9-0.7,2.8-0.9c1-0.2,1.9-0.3,2.7-0.3h16.3c1.6,0,2.9,0.2,4.2,0.6c1.2,0.4,2.3,0.9,3.2,1.6
c0.9,0.6,1.7,1.4,2.4,2.3c0.7,0.9,1.2,1.8,1.6,2.7c0.4,0.9,0.7,1.9,0.9,2.8c0.2,1,0.3,1.9,0.3,2.7V40.8z"/>
<path fill="#FFFFFF" d="M141.2,28.3c0,1.3-0.2,2.6-0.7,4c-0.4,1.4-1.2,2.8-2.1,4c-1,1.2-2.3,2.3-3.9,3.1
c-1.6,0.8-3.5,1.3-5.8,1.3h-16.3v-8.6h16.3c1.2,0,2.2-0.4,2.8-1.1c0.7-0.8,1-1.7,1-2.8c0-1.2-0.4-2.1-1.1-2.8
c-0.8-0.7-1.7-1-2.7-1h-16.3c-1.2,0-2.2,0.4-2.9,1.1c-0.7,0.8-1,1.7-1,2.8V41c0,1.2,0.4,2.1,1.1,2.8c0.8,0.7,1.7,1,2.8,1h23.6
v8.6h-23.7c-1.3,0-2.6-0.2-4-0.7c-1.4-0.4-2.8-1.2-4-2.1c-1.2-1-2.3-2.3-3.1-3.9c-0.8-1.6-1.2-3.5-1.2-5.8V28.3
c0-1.3,0.2-2.6,0.7-4c0.4-1.4,1.2-2.8,2.1-4c1-1.2,2.3-2.3,3.9-3.1c1.6-0.8,3.5-1.3,5.8-1.3h16.3c1.3,0,2.6,0.2,4,0.7
c1.4,0.4,2.8,1.2,4,2.1c1.2,1,2.3,2.3,3.1,3.9C140.8,24.1,141.2,26.1,141.2,28.3z"/>
<path fill="#FFFFFF" d="M183.9,53.5h-9V32.6c0-1.2-0.2-2.2-0.6-3.2c-0.4-0.9-1-1.7-1.7-2.4c-0.7-0.7-1.5-1.2-2.5-1.5
c-0.9-0.4-2-0.5-3-0.5h-15.8v28.5h-9V20.4c0-0.6,0.1-1.2,0.3-1.8c0.2-0.5,0.6-1,1-1.4c0.4-0.4,0.9-0.7,1.5-1
c0.6-0.2,1.1-0.3,1.8-0.3h20.4c1.1,0,2.3,0.1,3.6,0.4c1.3,0.3,2.5,0.7,3.8,1.2c1.2,0.6,2.4,1.3,3.5,2.2c1.1,0.9,2.1,1.9,3,3.2
c0.9,1.2,1.6,2.7,2.1,4.3c0.5,1.6,0.8,3.5,0.8,5.5V53.5z"/>
<path fill="#FFFFFF" d="M245.9,53.5h-9.1V23.8l-16,28.2c-0.4,0.7-0.9,1.3-1.7,1.6c-0.7,0.4-1.5,0.6-2.3,0.6
c-0.8,0-1.5-0.2-2.2-0.6c-0.7-0.4-1.2-0.9-1.6-1.6l-16.1-28.2v29.7h-9v-46c0-1,0.3-2,0.9-2.8c0.6-0.8,1.4-1.4,2.4-1.6
c0.5-0.1,1-0.2,1.5-0.1c0.5,0,1,0.1,1.4,0.3c0.5,0.2,0.9,0.4,1.2,0.7c0.4,0.3,0.7,0.7,0.9,1.1l20.6,35.8l20.6-35.8
c0.5-0.9,1.3-1.5,2.2-1.9c0.9-0.4,1.9-0.4,2.9-0.2c1,0.3,1.8,0.8,2.4,1.6c0.6,0.8,0.9,1.7,0.9,2.8V53.5z"/>
<path fill="#FFFFFF" d="M292.7,53.5h-31.5c-0.8,0-1.7-0.1-2.7-0.3c-1-0.2-1.9-0.5-2.9-0.9c-0.9-0.4-1.8-1-2.7-1.6
c-0.9-0.7-1.6-1.5-2.3-2.4c-0.7-0.9-1.2-2-1.6-3.3c-0.4-1.2-0.6-2.6-0.6-4.2V16.3c0-0.8,0.1-1.7,0.3-2.7c0.2-1,0.5-1.9,0.9-2.9
c0.4-0.9,1-1.8,1.6-2.7c0.7-0.9,1.5-1.6,2.4-2.3c0.9-0.7,2-1.2,3.2-1.6c1.2-0.4,2.6-0.6,4.2-0.6h31.5v9h-31.5
c-1.2,0-2.1,0.3-2.7,0.9c-0.6,0.6-0.9,1.6-0.9,2.8v24.4c0,1.2,0.3,2.1,1,2.7c0.6,0.6,1.5,1,2.7,1h31.5V53.5z"/>
<path fill="#FFFFFF" d="M344.1,12.7h-19.9v40.8h-9V12.7h-19.9v-9h48.9V12.7z"/>
<path fill="#4F79F7" d="M41.9,19.7c-0.5-1.2-1.1-2.1-1.9-3c-0.8-0.8-1.8-1.4-3-1.9c-1.2-0.5-2.5-0.7-4-0.7h-7.7
c-0.7,3.7-0.7,6.4-0.4,7.8c0.1-0.1,0.2-0.1,0.2-0.2c0.8-0.7,1.8-1.6,3.1-2.1c0.9-0.4,1.9-0.6,2.8-0.6c1.6,0,3,0.6,4,1.7
c1.4,1.6,2,4.2,1.6,7.5c-1,8.1-5.7,8.7-7.1,8.7c-0.9,0-1.9-0.2-2.8-0.6c-1.3-0.6-2.2-1.5-2.8-2.2c0,0-0.1-0.1-0.1-0.1
c-0.7,1.3-1.5,4.3-1.8,8.7h11c1.5,0,2.8-0.2,4-0.7c1.2-0.5,2.2-1.1,3-1.9c0.8-0.8,1.4-1.8,1.9-2.9c0.5-1.2,0.7-2.5,0.7-4v-9.5
C42.6,22.3,42.4,20.9,41.9,19.7z M23.6,31.3c1.4,0,2.2,2.2,4,3c2.4,1.1,5.7,0.2,6.5-6.2c0.8-6.4-2.4-7.3-5-6.2
c-2,0.8-3.3,3-4.7,3c-1.8,0-2.6-4.1-1.5-10.8h-2.1c-1.5,0-2.8,0.2-4,0.7c-1.2,0.5-2.2,1.1-3,1.9c-0.8,0.8-1.5,1.8-1.9,3
c-0.5,1.2-0.7,2.5-0.7,4v9.5c0,1.5,0.2,2.9,0.7,4c0.5,1.2,1.1,2.1,1.9,2.9c0.8,0.8,1.8,1.4,3,1.9c0.8,0.3,1.7,0.5,2.7,0.6
C19.9,35.7,21.8,31.3,23.6,31.3z"/>
</g>
<g>
<path fill="#4F79F7" d="M425,3.6l-8.4,46.9c-0.2,0.9-0.6,1.7-1.3,2.4c-0.7,0.7-1.4,1.1-2.4,1.3c-1,0.2-1.9,0.1-2.7-0.3
c-0.8-0.4-1.5-1-2-1.7l-16.6-27.3L375,52.2c-0.4,0.7-0.9,1.2-1.6,1.6s-1.4,0.6-2.2,0.6c-1.1,0-2.1-0.3-2.9-1
c-0.8-0.7-1.3-1.6-1.5-2.7l-8.4-46.9h9.2l6,33l14.3-22.8c0.4-0.7,0.9-1.2,1.6-1.6c0.7-0.4,1.4-0.6,2.2-0.6c0.8,0,1.5,0.2,2.2,0.6
c0.7,0.4,1.2,0.9,1.7,1.6l14.2,22.8l6-33H425z"/>
<path fill="#4F79F7" d="M509,40.9c0,0.9-0.1,1.8-0.3,2.7c-0.2,1-0.5,1.9-0.9,2.8c-0.4,0.9-1,1.8-1.6,2.7
c-0.7,0.9-1.5,1.6-2.4,2.3c-0.9,0.7-2,1.2-3.3,1.6c-1.2,0.4-2.6,0.6-4.2,0.6h-16.4c-0.9,0-1.8-0.1-2.7-0.3
c-1-0.2-1.9-0.5-2.8-0.9c-0.9-0.4-1.8-1-2.7-1.6c-0.9-0.7-1.6-1.5-2.3-2.4c-0.7-0.9-1.2-2-1.6-3.3c-0.4-1.2-0.6-2.6-0.6-4.2V0
h9.1v40.9c0,1.1,0.3,2,1,2.7c0.7,0.7,1.6,1,2.6,1h16.4c1.1,0,2-0.3,2.7-1c0.6-0.7,1-1.6,1-2.7V28.7c0-1.1-0.3-2-1-2.7
c-0.7-0.6-1.5-1-2.6-1h-16.4v-9.1h16.4c0.9,0,1.8,0.1,2.7,0.3c1,0.2,1.9,0.5,2.8,0.9c0.9,0.4,1.8,1,2.7,1.6
c0.9,0.7,1.6,1.5,2.3,2.4c0.7,0.9,1.2,2,1.6,3.3c0.4,1.2,0.6,2.6,0.6,4.2V40.9z"/>
<path fill="#4F79F7" d="M465.1,28.3c0,1.3-0.2,2.6-0.7,4c-0.4,1.4-1.2,2.8-2.1,4c-1,1.2-2.3,2.3-3.9,3.1
c-1.6,0.8-3.5,1.3-5.8,1.3h-16.3v-8.6h16.3c1.2,0,2.2-0.4,2.8-1.1c0.7-0.8,1-1.7,1-2.8c0-1.2-0.4-2.1-1.1-2.8
c-0.8-0.7-1.7-1-2.7-1h-16.3c-1.2,0-2.2,0.4-2.9,1.1c-0.7,0.8-1,1.7-1,2.8V41c0,1.2,0.4,2.1,1.1,2.8c0.8,0.7,1.7,1,2.8,1H460v8.6
h-23.7c-1.3,0-2.6-0.2-4-0.7c-1.4-0.4-2.8-1.2-4-2.1c-1.2-1-2.3-2.3-3.1-3.9c-0.8-1.6-1.2-3.5-1.2-5.8V28.3c0-1.3,0.2-2.6,0.7-4
c0.4-1.4,1.2-2.8,2.1-4c1-1.2,2.3-2.3,3.9-3.1c1.6-0.8,3.5-1.3,5.8-1.3h16.3c1.3,0,2.6,0.2,4,0.7c1.4,0.4,2.8,1.2,4,2.1
c1.2,1,2.3,2.3,3.1,3.9C464.6,24.1,465.1,26.1,465.1,28.3z"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.6 KiB

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