Compare commits

..

10 Commits

Author SHA1 Message Date
charlesh88
371d132bfc Missing/unknown item should appear visually distinct
- Remove unneeded in-progress CSS;
2019-07-01 14:37:17 -07:00
charlesh88
91904ec22d Missing/unknown item should appear visually distinct
- Add missing/unknown styling to browse-bar;
2019-07-01 13:29:02 -07:00
charlesh88
afaee9a483 Missing/unknown item should appear visually distinct
- Apply missing/unknown styling to tabs view;
- Augment `isUnknown` mixin to also target same element with class
icon*;
2019-07-01 13:21:59 -07:00
charlesh88
709e1eb10e Missing/unknown item should appear visually distinct
- 'no-frame' CSS class application only allowed if domainObject.type is
not unknown;
- Show telemetry-view label element if domainObject.type is unknown;
2019-07-01 12:42:43 -07:00
charlesh88
6740677652 Missing/unknown item should appear visually distinct
- Styling applied to telemetry views for type unknown;
2019-06-28 09:42:51 -07:00
charlesh88
ee7521915f Missing/unknown item should appear visually distinct
- New "isUnknown" sass mixin to consolidate styling;
- Refined styling for grid, list-item and object label views;
- Flex and Display Layout frame headers now style properly for
missing/unknown items;
- TODO: visual indication when header is hidden (alphanumerics, summary
widgets, frame hidden manually, etc.)
2019-06-26 16:41:55 -07:00
charlesh88
bc590081b3 Missing/unknown item should appear visually distinct
- Styling for grid and list-item views;
- Refactor of item hover approach to use filters rather than discrete
colors;
2019-06-26 09:52:13 -07:00
charlesh88
854ffb9153 Missing/unknown item should appear visually distinct
- Theme color added;
- Styling for tree items;
- Removed unused tree item hover styling;
2019-06-26 06:12:07 -07:00
Charles Hacskaylo
e0587bf0e7 Status styling (#2422)
- Primarily needed by VISTA Data Products table UI;
- Adds new styling for inline links with icons;
- Adds new status colors in theme files;
2019-06-25 17:02:23 -07:00
Andrew Henry
f1494fd285 Vista table sync (#2423)
* Working version of integrated tables

* Fixed bug with multi-composition in tables

* Changes to support tables from VISTA
2019-06-25 13:56:39 -07:00
43 changed files with 519 additions and 580 deletions

View File

@@ -99,10 +99,10 @@ define([
GeneratorMetadataProvider.prototype.getMetadata = function (domainObject) {
return _.extend(
{},
domainObject.telemetry,
METADATA_BY_TYPE[domainObject.type]
);
{},
domainObject.telemetry,
METADATA_BY_TYPE[domainObject.type]
);
};
return GeneratorMetadataProvider;

View File

@@ -22,7 +22,7 @@
<template>
<layout-frame :item="item"
:grid-size="gridSize"
:title="domainObject && domainObject.name"
:title="domainObject && domainObject.name + ': ' + domainObject.type"
@move="(gridDelta) => $emit('move', gridDelta)"
@endMove="() => $emit('endMove')">
<object-frame v-if="domainObject"

View File

@@ -23,12 +23,14 @@
<template>
<layout-frame :item="item"
:grid-size="gridSize"
:title="domainObject && domainObject.name + ': ' + domainObject.type"
:class="{'c-telemetry-view--unknown': domainObject.type.indexOf('unknown') !== -1}"
@move="(gridDelta) => $emit('move', gridDelta)"
@endMove="() => $emit('endMove')">
<div class="c-telemetry-view"
:style="styleObject"
v-if="domainObject">
<div v-if="showLabel"
<div v-if="showLabel || domainObject.type.indexOf('unknown') !== -1"
class="c-telemetry-view__label">
<div class="c-telemetry-view__label-text">{{ domainObject.name }}</div>
</div>
@@ -50,6 +52,21 @@
display: flex;
align-items: stretch;
&--unknown {
.c-telemetry-view__label-text {
@include isUnknown();
display: flex;
align-items: center;
&:before {
content: $glyph-icon-object-unknown;
font-family: symbolsfont;
font-style: normal;
display: inline-block;
margin-right: $interiorMarginSm;
}
}
}
> * {
// Label and value holders
flex: 1 1 auto;

View File

@@ -77,14 +77,6 @@ export default {
this.$emit('updateFilters', this.keyString, this.updatedFilters);
},
updateTextFilter(key, comparator, value) {
if (value.trim() === '') {
if (this.updatedFilters[key]) {
delete this.updatedFilters[key];
this.$emit('updateFilters', this.keyString, this.updatedFilters);
}
return;
}
if (!this.updatedFilters[key]) {
this.$set(this.updatedFilters, key, {});
this.$set(this.updatedFilters[key], comparator, '');

View File

@@ -1,6 +1,6 @@
<template>
<a class="l-grid-view__item c-grid-item"
:class="{ 'is-alias': item.isAlias === true }"
:class="{ 'is-alias': item.isAlias === true, 'c-grid-item--unknown': item.type.cssClass === undefined || item.type.cssClass.indexOf('unknown') !== -1 }"
:href="objectLink">
<div class="c-grid-item__type-icon"
:class="(item.type.cssClass != undefined) ? 'bg-' + item.type.cssClass : 'bg-icon-object-unknown'">
@@ -34,10 +34,13 @@
padding: $interiorMarginLg;
&__type-icon {
filter: $colorKeyFilter;
flex: 0 0 $gridItemMobile;
font-size: floor($gridItemMobile / 2);
margin-right: $interiorMarginLg;
&:before {
filter: $colorKeyFilter;
height: 100%;
}
}
&.is-alias {
@@ -48,6 +51,22 @@
}
}
&--unknown {
@include isUnknown();
/*[class*='__'] {
opacity: 0.7;
}
[class*='__name'],
[class*='__metadata'] {
font-style: italic;
}*/
[class*='__type-icon__glyph'] {
filter: $filterItemUnknown;
}
}
&__details {
display: flex;
flex-flow: column nowrap;
@@ -93,11 +112,10 @@
transition: background $transOutMs ease-in-out;
&:hover {
background: $colorItemBgHov;
transition: $transIn;
filter: $filterItemHoverFg;
//transition: $transIn;
.c-grid-item__type-icon {
filter: $colorKeyFilterHov;
transform: scale(1);
transition: $transInBounce;
}

View File

@@ -1,5 +1,5 @@
<template>
<div class="l-grid-view">
<div class="l-grid-view foo">
<grid-item v-for="(item, index) in items"
:key="index"
:item="item"
@@ -31,129 +31,6 @@
}
}
}
/******************************* GRID ITEMS */
.c-grid-item {
// Mobile-first
@include button($bg: $colorItemBg, $fg: $colorItemFg);
cursor: pointer;
display: flex;
padding: $interiorMarginLg;
&__type-icon {
filter: $colorKeyFilter;
flex: 0 0 $gridItemMobile;
font-size: floor($gridItemMobile / 2);
margin-right: $interiorMarginLg;
}
&.is-alias {
// Object is an alias to an original.
[class*='__type-icon'] {
@include isAlias();
color: $colorIconAliasForKeyFilter;
}
}
&__details {
display: flex;
flex-flow: column nowrap;
flex: 1 1 auto;
}
&__name {
@include ellipsize();
color: $colorItemFg;
font-size: 1.2em;
font-weight: 400;
margin-bottom: $interiorMarginSm;
}
&__metadata {
color: $colorItemFgDetails;
font-size: 0.9em;
body.mobile & {
[class*='__item-count'] {
&:before {
content: ' - ';
}
}
}
}
&__controls {
color: $colorItemFgDetails;
flex: 0 0 64px;
font-size: 1.2em;
display: flex;
align-items: center;
justify-content: flex-end;
> * + * {
margin-left: $interiorMargin;
}
}
body.desktop & {
$transOutMs: 300ms;
flex-flow: column nowrap;
transition: background $transOutMs ease-in-out;
&:hover {
background: $colorItemBgHov;
transition: $transIn;
.c-grid-item__type-icon {
filter: $colorKeyFilterHov;
transform: scale(1);
transition: $transInBounce;
}
}
> * {
margin: 0; // Reset from mobile
}
&__controls {
align-items: start;
flex: 0 0 auto;
order: 1;
.c-info-button,
.c-pointer-icon { display: none; }
}
&__type-icon {
flex: 1 1 auto;
font-size: floor($gridItemDesk / 3);
margin: $interiorMargin 22.5% $interiorMargin * 3 22.5%;
order: 2;
transform: scale(0.9);
transform-origin: center;
transition: all $transOutMs ease-in-out;
}
&__details {
flex: 0 0 auto;
justify-content: flex-end;
order: 3;
}
&__metadata {
display: flex;
&__type {
flex: 1 1 auto;
@include ellipsize();
}
&__item-count {
opacity: 0.7;
flex: 0 0 auto;
}
}
}
}
</style>
<script>

View File

@@ -1,6 +1,6 @@
<template>
<tr class="c-list-item"
:class="{ 'is-alias': item.isAlias === true }"
:class="{ 'is-alias': item.isAlias === true, 'c-list-item--unknown': item.type.cssClass === undefined || item.type.cssClass.indexOf('unknown') !== -1 }"
@click="navigate">
<td class="c-list-item__name">
<a :href="objectLink" ref="objectLink">
@@ -20,6 +20,7 @@
/******************************* LIST ITEM */
.c-list-item {
&__name a {
color: $colorItemFg;
display: flex;
> * + * { margin-left: $interiorMarginSm; }
@@ -53,6 +54,11 @@
}
}
}
&--unknown {
@include isUnknown();
filter: $filterItemUnknown;
}
}
</style>

View File

@@ -62,15 +62,16 @@
tbody tr {
background: $colorListItemBg;
transition: $transOut;
}
body.desktop & {
tbody tr {
transition: $transOut;
cursor: pointer;
&:hover {
background: $colorListItemBgHov;
background: $colorItemTreeHoverBg;
filter: $filterItemHoverFg;
transition: $transIn;
}
}

View File

@@ -16,7 +16,10 @@
v-for="(tab,index) in tabsList"
:key="index"
:class="[
{'is-current': isCurrent(tab)},
{
'is-current': isCurrent(tab),
'c-tab--unknown': tab.type.definition.cssClass.indexOf('unknown') !== -1
},
tab.type.definition.cssClass
]"
@click="showTab(tab)">
@@ -29,7 +32,12 @@
:class="{'c-tabs-view__object-holder--hidden': !isCurrent(tab)}">
<div v-if="currentTab"
class="c-tabs-view__object-name l-browse-bar__object-name--w"
:class="currentTab.type.definition.cssClass">
:class="[
{
'c-tabs-view__object--unknown': tab.type.definition.cssClass.indexOf('unknown') !== -1
},
currentTab.type.definition.cssClass
]">
<div class="l-browse-bar__object-name">
{{currentTab.domainObject.name}}
</div>
@@ -102,6 +110,13 @@
width: 100%;
}
}
.c-tab,
.c-tabs-view__object {
&--unknown {
@include isUnknown();
}
}
</style>
<script>

View File

@@ -26,6 +26,7 @@ define([
'./collections/BoundedTableRowCollection',
'./collections/FilteredTableRowCollection',
'./TelemetryTableRow',
'./TelemetryTableColumn',
'./TelemetryTableConfiguration'
], function (
EventEmitter,
@@ -33,6 +34,7 @@ define([
BoundedTableRowCollection,
FilteredTableRowCollection,
TelemetryTableRow,
TelemetryTableColumn,
TelemetryTableConfiguration
) {
class TelemetryTable extends EventEmitter {
@@ -94,8 +96,6 @@ define([
this.tableComposition.load().then((composition) => {
composition = composition.filter(this.isTelemetryObject);
this.configuration.addColumnsForAllObjects(composition);
composition.forEach(this.addTelemetryObject);
this.tableComposition.on('add', this.addTelemetryObject);
@@ -105,7 +105,7 @@ define([
}
addTelemetryObject(telemetryObject) {
this.configuration.addColumnsForObject(telemetryObject, true);
this.addColumnsForObject(telemetryObject, true);
this.requestDataFor(telemetryObject);
this.subscribeTo(telemetryObject);
this.telemetryObjects.push(telemetryObject);
@@ -132,6 +132,13 @@ define([
this.emit('object-removed', objectIdentifier);
}
/**
* @private
*/
createRow(datum, columnMap, keyString, limitEvaluator) {
return new TelemetryTableRow(datum, columnMap, keyString, limitEvaluator);
}
requestDataFor(telemetryObject) {
this.incrementOutstandingRequests();
let requestOptions = this.buildOptionsFromConfiguration(telemetryObject);
@@ -145,7 +152,7 @@ define([
let columnMap = this.getColumnMapForObject(keyString);
let limitEvaluator = this.openmct.telemetry.limitEvaluator(telemetryObject);
let telemetryRows = telemetryData.map(datum => new TelemetryTableRow(datum, columnMap, keyString, limitEvaluator));
let telemetryRows = telemetryData.map(datum => this.createRow(datum, columnMap, keyString, limitEvaluator));
this.boundedRows.add(telemetryRows);
}).finally(() => {
this.decrementOutstandingRequests();
@@ -191,6 +198,19 @@ define([
}, {});
}
addColumnsForObject(telemetryObject) {
let metadataValues = this.openmct.telemetry.getMetadata(telemetryObject).values();
metadataValues.forEach(metadatum => {
let column = this.createColumn(metadatum);
this.configuration.addSingleColumnForObject(telemetryObject, column);
});
}
createColumn(metadatum) {
return new TelemetryTableColumn(this.openmct, metadatum);
}
subscribeTo(telemetryObject) {
let subscribeOptions = this.buildOptionsFromConfiguration(telemetryObject);
let keyString = this.openmct.objects.makeKeyString(telemetryObject.identifier);
@@ -202,7 +222,7 @@ define([
if (!this.telemetryObjects.includes(telemetryObject)) {
return;
}
this.boundedRows.add(new TelemetryTableRow(datum, columnMap, keyString, limitEvaluator));
this.boundedRows.add(this.createRow(datum, columnMap, keyString, limitEvaluator));
}, subscribeOptions);
}

View File

@@ -22,9 +22,8 @@
define([
'lodash',
'EventEmitter',
'./TelemetryTableColumn'
], function (_, EventEmitter, TelemetryTableColumn) {
'EventEmitter'
], function (_, EventEmitter) {
class TelemetryTableConfiguration extends EventEmitter {
constructor(domainObject, openmct) {
@@ -34,7 +33,6 @@ define([
this.openmct = openmct;
this.columns = {};
this.addColumnsForObject = this.addColumnsForObject.bind(this);
this.removeColumnsForObject = this.removeColumnsForObject.bind(this);
this.objectMutated = this.objectMutated.bind(this);
//Make copy of configuration, otherwise change detection is impossible if shared instance is being modified.
@@ -48,6 +46,7 @@ define([
configuration.hiddenColumns = configuration.hiddenColumns || {};
configuration.columnWidths = configuration.columnWidths || {};
configuration.columnOrder = configuration.columnOrder || [];
configuration.cellFormat = configuration.cellFormat || {};
configuration.autosize = configuration.autosize === undefined ? true : configuration.autosize;
return configuration;
@@ -65,26 +64,18 @@ define([
//Synchronize domain object reference. Duplicate object otherwise change detection becomes impossible.
this.domainObject = object;
//Was it the configuration that changed?
if (!_.eq(object.configuration, this.oldConfiguration)) {
if (object.configuration !== undefined && !_.eq(object.configuration, this.oldConfiguration)) {
//Make copy of configuration, otherwise change detection is impossible if shared instance is being modified.
this.oldConfiguration = JSON.parse(JSON.stringify(this.getConfiguration()));
this.emit('change', object.configuration);
}
}
addColumnsForAllObjects(objects) {
objects.forEach(object => this.addColumnsForObject(object, false));
}
addColumnsForObject(telemetryObject) {
let metadataValues = this.openmct.telemetry.getMetadata(telemetryObject).values();
addSingleColumnForObject(telemetryObject, column, position) {
let objectKeyString = this.openmct.objects.makeKeyString(telemetryObject.identifier);
this.columns[objectKeyString] = [];
metadataValues.forEach(metadatum => {
let column = new TelemetryTableColumn(this.openmct, metadatum);
this.columns[objectKeyString].push(column);
});
this.columns[objectKeyString] = this.columns[objectKeyString] || [];
position = position || this.columns[objectKeyString].length;
this.columns[objectKeyString].splice(position, 0, column);
}
removeColumnsForObject(objectIdentifier) {

View File

@@ -42,12 +42,19 @@ define([], function () {
return column && column.getFormattedValue(this.datum[key]);
}
getRowLimitClass() {
if (!this.rowLimitClass) {
getCellComponentName(key) {
let column = this.columns[key];
return column &&
column.getCellComponentName &&
column.getCellComponentName();
}
getRowClass() {
if (!this.rowClass) {
let limitEvaluation = this.limitEvaluator.evaluate(this.datum);
this.rowLimitClass = limitEvaluation && limitEvaluation.cssClass;
this.rowClass = limitEvaluation && limitEvaluation.cssClass;
}
return this.rowLimitClass;
return this.rowClass;
}
getCellLimitClasses() {

View File

@@ -22,12 +22,10 @@
define([
'./components/table.vue',
'../../exporters/CSVExporter',
'./TelemetryTable',
'vue'
], function (
TableComponent,
CSVExporter,
TelemetryTable,
Vue
) {
@@ -51,7 +49,6 @@ define([
return domainObject.type === 'table';
},
view(domainObject) {
let csvExporter = new CSVExporter.default();
let table = new TelemetryTable(domainObject, openmct);
let component;
return {
@@ -67,7 +64,6 @@ define([
},
provide: {
openmct,
csvExporter,
table
},
el: element,

View File

@@ -1,142 +0,0 @@
<template>
<div v-if="filterNames.length > 0"
:title=title
class="c-filter-indication"
:class="{'c-filter-indication--mixed':mixed}">
<span class="c-filter-indication__mixed">{{label}}</span>
<span v-for="(name, index) in filterNames"
class="c-filter-indication__label">
{{name}}
</span>
</div>
</template>
<style lang="scss">
@import "~styles/sass-base";
.c-filter-indication {
@include userSelectNone();
background: $colorFilterBg;
color: $colorFilterFg;
display: flex;
align-items: center;
font-size: 0.9em;
margin-top: $interiorMarginSm;
padding: 2px;
text-transform: uppercase;
&:before {
font-family: symbolsfont-12px;
content: $glyph-icon-filter;
display: block;
font-size: 12px;
margin-right: $interiorMarginSm;
}
&__mixed {
font-weight: bold;
margin-right: $interiorMarginSm;
}
&--mixed {
.c-filter-indication__mixed {
font-style: italic;
}
}
&__label {
+ .c-filter-indication__label {
&:before {
content: ',';
}
}
}
}
</style>
<script>
const FILTER_INDICATOR_LABEL = 'Filters:';
const FILTER_INDICATOR_LABEL_MIXED = 'Mixed Filters:';
const FILTER_INDICATOR_TITLE = 'Data filters are being applied to this view.';
const FILTER_INDICATOR_TITLE_MIXED = 'A mix of data filter values are being applied to this view.';
export default {
inject: ['openmct', 'table'],
data() {
return {
filterNames: [],
telemetryFilters: {},
mixed: false,
label: FILTER_INDICATOR_LABEL,
title: FILTER_INDICATOR_TITLE
}
},
methods: {
isTelemetryObject(domainObject) {
return domainObject.hasOwnProperty('telemetry');
},
setFilterNames() {
let names = [];
let composition = this.openmct.composition.get(this.table.configuration.domainObject);
composition.load().then((domainObjects) => {
domainObjects.forEach(telemetryObject => {
let keyString= this.openmct.objects.makeKeyString(telemetryObject.identifier);
let filters = this.telemetryFilters[keyString];
if (filters !== undefined) {
let metadataValues = this.openmct.telemetry.getMetadata(telemetryObject).values();
Object.keys(filters).forEach(key => {
metadataValues.forEach(metadaum => {
if (key === metadaum.key) {
names.push(metadaum.name);
}
});
});
}
});
this.filterNames = Array.from(new Set(names));
});
},
handleConfigurationChanges(configuration) {
if (!_.eq(this.telemetryFilters, configuration.filters)) {
this.updateFilters(configuration.filters || {});
}
},
checkFiltersForMixedValues() {
let valueToCompare = this.telemetryFilters[Object.keys(this.telemetryFilters)[0]];
let mixed = false;
Object.values(this.telemetryFilters).forEach(value => {
if (!_.isEqual(valueToCompare, value)) {
mixed = true;
return;
}
});
this.mixed = mixed;
},
setLabels() {
if (this.mixed) {
this.label = FILTER_INDICATOR_LABEL_MIXED;
this.title = FILTER_INDICATOR_TITLE_MIXED;
} else {
this.label = FILTER_INDICATOR_LABEL;
this.title = FILTER_INDICATOR_TITLE;
}
},
updateFilters(filters) {
this.telemetryFilters = JSON.parse(JSON.stringify(filters));
this.setFilterNames();
this.checkFiltersForMixedValues();
this.setLabels();
}
},
mounted() {
let filters = this.table.configuration.getConfiguration().filters || {};
this.table.configuration.on('change', this.handleConfigurationChanges);
this.updateFilters(filters);
},
destroyed() {
this.table.configuration.off('change', this.handleConfigurationChanges);
}
}
</script>

View File

@@ -0,0 +1,44 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT 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 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.
*****************************************************************************/
<template>
<td>{{formattedValue}}</td>
</template>
<script>
export default {
inject: ['openmct'],
props: {
row: {
type: Object,
required: true
},
columnKey: {
type: String,
require: true
}
},
computed: {
formattedValue() {
return this.row.getFormattedValue(this.columnKey);
}
}
};
</script>

View File

@@ -23,6 +23,8 @@
</style>
<script>
import TelemetryTableColumn from '../TelemetryTableColumn';
export default {
inject: ['tableConfiguration', 'openmct'],
data() {
@@ -43,7 +45,7 @@ export default {
this.tableConfiguration.updateConfiguration(this.configuration);
},
addObject(domainObject) {
this.tableConfiguration.addColumnsForObject(domainObject, true);
this.addColumnsForObject(domainObject, true);
this.updateHeaders(this.tableConfiguration.getAllHeaders());
},
removeObject(objectIdentifier) {
@@ -56,6 +58,17 @@ export default {
toggleAutosize() {
this.configuration.autosize = !this.configuration.autosize;
this.tableConfiguration.updateConfiguration(this.configuration);
},
addColumnsForAllObjects(objects) {
objects.forEach(object => this.addColumnsForObject(object, false));
},
addColumnsForObject(telemetryObject) {
let metadataValues = this.openmct.telemetry.getMetadata(telemetryObject).values();
metadataValues.forEach(metadatum => {
let column = new TelemetryTableColumn(this.openmct, metadatum);
this.tableConfiguration.addSingleColumnForObject(telemetryObject, column);
});
}
},
mounted() {
@@ -65,7 +78,7 @@ export default {
compositionCollection.load()
.then((composition) => {
this.tableConfiguration.addColumnsForAllObjects(composition);
this.addColumnsForAllObjects(composition);
this.updateHeaders(this.tableConfiguration.getAllHeaders());
compositionCollection.on('add', this.addObject);

View File

@@ -20,12 +20,18 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
<template>
<tr :style="{ top: rowTop }" :class="rowLimitClass">
<td v-for="(title, key) in headers"
<tr :style="{ top: rowTop }" :class="rowClass">
<component
v-for="(title, key) in headers"
:key="key"
:is="componentList[key]"
:columnKey="key"
:style="columnWidths[key] === undefined ? {} : { width: columnWidths[key] + 'px', 'max-width': columnWidths[key] + 'px'}"
:title="formattedRow[key]"
:class="cellLimitClasses[key]">{{formattedRow[key]}}</td>
:class="cellLimitClasses[key]"
class="is-selectable"
@click="selectCell($event.currentTarget, key)"
:row="row"></component>
</tr>
</template>
@@ -33,13 +39,19 @@
</style>
<script>
import TableCell from './table-cell.vue';
export default {
data: function () {
return {
rowTop: (this.rowOffset + this.rowIndex) * this.rowHeight + 'px',
formattedRow: this.row.getFormattedDatum(this.headers),
rowLimitClass: this.row.getRowLimitClass(),
cellLimitClasses: this.row.getCellLimitClasses()
rowClass: this.row.getRowClass(),
cellLimitClasses: this.row.getCellLimitClasses(),
componentList: Object.keys(this.headers).reduce((components, header) => {
components[header] = this.row.getCellComponentName(header) || 'table-cell';
return components
}, {})
}
},
props: {
@@ -77,8 +89,25 @@ export default {
},
formatRow: function (row) {
this.formattedRow = row.getFormattedDatum(this.headers);
this.rowLimitClass = row.getRowLimitClass();
this.rowClass = row.getRowClass();
this.cellLimitClasses = row.getCellLimitClasses();
},
selectCell(element, columnKey) {
//TODO: This is a hack. Cannot get parent this way.
this.openmct.selection.select([{
element: element,
context: {
type: 'table-cell',
row: this.row.objectKeyString,
column: columnKey
}
},{
element: this.openmct.layout.$refs.browseObject.$el,
context: {
item: this.openmct.router.path[0]
}
}], false);
event.stopPropagation();
}
},
// TODO: use computed properties
@@ -88,6 +117,9 @@ export default {
handler: 'formatRow',
deep: false
}
},
components: {
TableCell
}
}
</script>

View File

@@ -22,7 +22,8 @@
<template>
<div class="c-table c-telemetry-table c-table--filterable c-table--sortable has-control-bar"
:class="{'loading': loading}">
<div class="c-table__control-bar c-control-bar">
<div :style="{ 'max-width': widthWithScroll, 'min-width': '150px'}"><slot></slot></div>
<div v-if="allowExport" class="c-table__control-bar c-control-bar">
<button class="c-button icon-download labeled"
v-on:click="exportAsCSV()"
title="Export This View's Data">
@@ -40,7 +41,7 @@
:key="key"
:headerKey="key"
:headerIndex="headerIndex"
@sort="sortBy(key)"
@sort="allowSorting && sortBy(key)"
@resizeColumn="resizeColumn"
@dropTargetOffsetChanged="setDropTargetOffset"
@dropTargetActive="dropTargetActive"
@@ -105,7 +106,6 @@
:row="sizingRowData">
</telemetry-table-row>
</table>
<telemetry-filter-indicator></telemetry-filter-indicator>
</div>
</template>
@@ -280,7 +280,7 @@
import TelemetryTableRow from './table-row.vue';
import search from '../../../ui/components/search.vue';
import TableColumnHeader from './table-column-header.vue';
import TelemetryFilterIndicator from './TelemetryFilterIndicator.vue';
import CSVExporter from '../../../exporters/CSVExporter.js';
import _ from 'lodash';
const VISIBLE_ROW_COUNT = 100;
@@ -295,14 +295,25 @@ export default {
components: {
TelemetryTableRow,
TableColumnHeader,
search,
TelemetryFilterIndicator
search
},
inject: ['table', 'openmct', 'csvExporter'],
inject: ['table', 'openmct'],
props: {
isEditing: {
type: Boolean,
default: false
},
allowExport: {
type: Boolean,
default: true
},
allowFiltering: {
'type': Boolean,
'default': true
},
allowSorting: {
'type': Boolean,
'default': true
}
},
data() {
@@ -614,12 +625,17 @@ export default {
scrollTop = this.scrollable.scrollTop;
}, RESIZE_POLL_INTERVAL);
},
clearRowsAndRerender() {
this.visibleRows = [];
this.$nextTick().then(this.updateVisibleRows);
}
},
created() {
this.filterChanged = _.debounce(this.filterChanged, 500);
},
mounted() {
this.csvExporter = new CSVExporter();
this.rowsAdded = _.throttle(this.rowsAdded, 200);
this.rowsRemoved = _.throttle(this.rowsRemoved, 200);
this.scroll = _.throttle(this.scroll, 100);
@@ -627,6 +643,7 @@ export default {
this.table.on('object-added', this.addObject);
this.table.on('object-removed', this.removeObject);
this.table.on('outstanding-requests', this.outstandingRequests);
this.table.on('refresh', this.clearRowsAndRerender);
this.table.filteredRows.on('add', this.rowsAdded);
this.table.filteredRows.on('remove', this.rowsRemoved);
@@ -652,6 +669,7 @@ export default {
this.table.off('object-added', this.addObject);
this.table.off('object-removed', this.removeObject);
this.table.off('outstanding-requests', this.outstandingRequests);
this.table.off('refresh', this.clearRowsAndRerender);
this.table.filteredRows.off('add', this.rowsAdded);
this.table.filteredRows.off('remove', this.rowsRemoved);

View File

@@ -1,6 +0,0 @@
<tr :style="{ top: rowTop }" :class="rowLimitClass">
<td v-for="(title, key, headerIndex) in headers"
:style="{ width: columnWidths[headerIndex], 'max-width': columnWidths[headerIndex]}"
:title="formattedRow[key]"
:class="cellLimitClasses[key]">{{formattedRow[key]}}</td>
</tr>

View File

@@ -108,6 +108,10 @@
a {
color: $colorAboutLink;
&:hover {
color: $colorAHov;
}
}
em {

View File

@@ -101,6 +101,8 @@ $colorStatusAlertFilter: invert(78%) sepia(26%) saturate(1160%) hue-rotate(324de
$colorStatusError: #da0004;
$colorStatusErrorFilter: invert(10%) sepia(96%) saturate(4360%) hue-rotate(351deg) brightness(111%) contrast(115%);
$colorStatusBtnBg: #666; // Where is this used?
$colorStatusPartialBg: #3f5e8b;
$colorStatusCompleteBg: #457638;
$colorAlert: #ff3c00;
$colorAlertFg: #fff;
$colorWarningHi: #990000;
@@ -115,9 +117,6 @@ $colorInfo: #2294a2;
$colorInfoFg: #fff;
$colorOk: #33cc33;
$colorOkFg: #fff;
$colorFilterBg: #44449c;
$colorFilterFg: #8984e9;
// States
$colorPausedBg: #ff9900;
@@ -143,6 +142,8 @@ $browseFrameColor: pullForward($colorBodyBg, 10%);
$browseFrameBorder: 1px solid $browseFrameColor; // Frames in Disp and Flex Layouts when frame is showing
$browseSelectableShdwHov: rgba($colorBodyFg, 0.3) 0 0 3px;
$browseSelectedBorder: 1px solid rgba($colorBodyFg, 0.4);
$filterItemHoverFg: brightness(1.2);
$filterItemUnknown: contrast(0);
/************************************************** EDITING */
$editUIColor: $uiColor; // Base color

View File

@@ -105,6 +105,8 @@ $colorStatusAlertFilter: invert(78%) sepia(26%) saturate(1160%) hue-rotate(324de
$colorStatusError: #da0004;
$colorStatusErrorFilter: invert(10%) sepia(96%) saturate(4360%) hue-rotate(351deg) brightness(111%) contrast(115%);
$colorStatusBtnBg: #666; // Where is this used?
$colorStatusPartialBg: #3f5e8b;
$colorStatusCompleteBg: #457638;
$colorAlert: #ff3c00;
$colorAlertFg: #fff;
$colorWarningHi: #990000;
@@ -144,6 +146,8 @@ $browseFrameColor: pullForward($colorBodyBg, 10%);
$browseFrameBorder: 1px solid $browseFrameColor; // Frames in Disp and Flex Layouts when frame is showing
$browseSelectableShdwHov: rgba($colorBodyFg, 0.3) 0 0 3px;
$browseSelectedBorder: 1px solid rgba($colorBodyFg, 0.4);
$filterItemHoverFg: brightness(1.2);
$filterItemUnknown: contrast(0);
/************************************************** EDITING */
$editUIColor: $uiColor; // Base color

View File

@@ -101,6 +101,8 @@ $colorStatusAlertFilter: invert(89%) sepia(26%) saturate(5035%) hue-rotate(316de
$colorStatusError: #da0004;
$colorStatusErrorFilter: invert(8%) sepia(96%) saturate(4511%) hue-rotate(352deg) brightness(136%) contrast(114%);
$colorStatusBtnBg: #666; // Where is this used?
$colorStatusPartialBg: #c9d6ff;
$colorStatusCompleteBg: #a4e4b4;
$colorAlert: #ff3c00;
$colorAlertFg: #fff;
$colorWarningHi: #990000;
@@ -115,8 +117,6 @@ $colorInfo: #2294a2;
$colorInfoFg: #fff;
$colorOk: #33cc33;
$colorOkFg: #fff;
$colorFilterBg: #a29fe2;
$colorFilterFg: #fff;
// States
$colorPausedBg: #ff9900;
@@ -142,6 +142,8 @@ $browseFrameColor: pullForward($colorBodyBg, 10%);
$browseFrameBorder: 1px solid $browseFrameColor; // Frames in Disp and Flex Layouts when frame is showing
$browseSelectableShdwHov: rgba($colorBodyFg, 0.3) 0 0 3px;
$browseSelectedBorder: 1px solid rgba($colorBodyFg, 0.4);
$filterItemHoverFg: brightness(0.9);
$filterItemUnknown: contrast(0);
/************************************************** EDITING */
$editUIColor: $uiColor; // Base color

View File

@@ -141,8 +141,6 @@ $glyph-icon-grid: '\e922';
$glyph-icon-grippy-ew: '\e923';
$glyph-icon-columns: '\e924';
$glyph-icon-rows: '\e925';
$glyph-icon-filter: '\e926';
$glyph-icon-filter-outline: '\e927';
$glyph-icon-arrows-right-left: '\ea00';
$glyph-icon-arrows-up-down: '\ea01';
$glyph-icon-bullet: '\ea02';

View File

@@ -60,11 +60,17 @@ button {
}
}
/********* Icon Buttons */
/********* Icon Buttons and Links */
.c-click-icon {
@include cClickIcon();
}
.c-click-link {
// A clickable element, typically inline, with an icon and label
@include cControl();
cursor: pointer;
}
.c-icon-button,
.c-click-swatch {
@include cClickIconButton();

View File

@@ -79,9 +79,6 @@ a {
color: $colorA;
cursor: pointer;
text-decoration: none;
&:hover {
color: $colorAHov;
}
}
body, html {

View File

@@ -30,10 +30,10 @@
}
@font-face {
// Use https://icomoon.io/app with icomoon-project-Open-MCT-Symbols-12px.json to generate font files
// Use https://icomoon.io/app with icomoon-project-openmct-symbols-12px.json to generate font files
font-family: 'symbolsfont-12px';
src: url('./fonts/Open-MCT-Symbols-12px.woff') format('woff'),
url('./fonts/Open-MCT-Symbols-12px.ttf') format('truetype');
src: url('./fonts/openmct-symbols-12px.woff') format('woff'),
url('./fonts/openmct-symbols-12px.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@@ -77,8 +77,6 @@
.icon-grippy-ew { @include glyphBefore($glyph-icon-grippy-ew); }
.icon-columns { @include glyphBefore($glyph-icon-columns); }
.icon-rows { @include glyphBefore($glyph-icon-rows); }
.icon-filter { @include glyphBefore($glyph-icon-filter); }
.icon-filter-outline { @include glyphBefore($glyph-icon-filter-outline); }
.icon-arrows-right-left { @include glyphBefore($glyph-icon-arrows-right-left); }
.icon-arrows-up-down { @include glyphBefore($glyph-icon-arrows-up-down); }
.icon-bullet { @include glyphBefore($glyph-icon-bullet); }
@@ -166,8 +164,6 @@
/************************** 12 PX CLASSES */
// TODO: sync with 16px redo as of 10/25/18
.icon-filter-12px { @include glyphBefore($glyph-icon-filter,'symbolsfont-12px'); }
.icon-filter-outline-12px { @include glyphBefore($glyph-icon-filter-outline,'symbolsfont-12px'); }
.icon-crosshair-12px { @include glyphBefore($glyph-icon-crosshair,'symbolsfont-12px'); }
.icon-folder-12px { @include glyphBefore($glyph-icon-folder,'symbolsfont-12px'); }
.icon-list-view-12px { @include glyphBefore($glyph-icon-list-view,'symbolsfont-12px'); }

View File

@@ -36,10 +36,14 @@
}
@mixin glyphBg($glyphUrl) {
background-image: $glyphUrl;
background-position: center;
background-size: contain;
background-repeat: no-repeat;
&:before {
content: '';
display: block;
background-image: $glyphUrl;
background-position: center;
background-size: contain;
background-repeat: no-repeat;
}
}
[class*="icon-"] {
@@ -97,6 +101,24 @@
}
}
@mixin isUnknown() {
// Common styles to be applied to tree items, object labels, grid and list item views
font-style: italic;
opacity: 0.7;
&[class*='icon']:before,
&[class*='icon']:after,
[class*='icon']:before,
[class*='icon']:after {
font-style: normal; // Prevent symbolsfont element from being italicized;
}
[class*='icon']:before {
// Target :before to avoid affecting alias indicator
filter: $filterItemUnknown;
}
}
@mixin bgDiagonalStripes($c: yellow, $a: 0.1, $d: 40px) {
background-image: linear-gradient(-45deg,
rgba($c, $a) 25%, transparent 25%,

View File

@@ -159,3 +159,16 @@ tr {
@include indicatorStatusColors($colorStatusError);
}
}
.s-status {
&--partial {
// Partially completed things, such as a file downloading or process that's running
background-color: $colorStatusPartialBg;
}
&--complete {
// Completed things, such as a file downloaded or process that's finished
background-color: $colorStatusCompleteBg;
}
}

View File

@@ -1,8 +1,8 @@
{
"metadata": {
"name": "Open MCT Symbols 16px",
"name": "Open MCT Symbols",
"lastOpened": 0,
"created": 1561482854927
"created": 1541830438012
},
"iconSets": [
{
@@ -317,29 +317,13 @@
"code": 59685,
"tempChar": ""
},
{
"order": 161,
"id": 142,
"name": "icon-filter",
"prevSize": 32,
"code": 59686,
"tempChar": ""
},
{
"order": 162,
"id": 141,
"name": "icon-filter-outline",
"prevSize": 32,
"code": 59687,
"tempChar": ""
},
{
"order": 27,
"id": 105,
"name": "icon-arrows-right-left",
"prevSize": 32,
"code": 59904,
"tempChar": ""
"tempChar": ""
},
{
"order": 26,
@@ -347,7 +331,7 @@
"name": "icon-arrows-up-down",
"prevSize": 32,
"code": 59905,
"tempChar": ""
"tempChar": ""
},
{
"order": 68,
@@ -355,7 +339,7 @@
"name": "icon-bullet",
"prevSize": 32,
"code": 59906,
"tempChar": ""
"tempChar": ""
},
{
"order": 150,
@@ -363,7 +347,7 @@
"prevSize": 32,
"code": 59907,
"name": "icon-calendar",
"tempChar": ""
"tempChar": ""
},
{
"order": 45,
@@ -371,7 +355,7 @@
"name": "icon-chain-links",
"prevSize": 32,
"code": 59908,
"tempChar": ""
"tempChar": ""
},
{
"order": 73,
@@ -379,7 +363,7 @@
"name": "icon-download",
"prevSize": 32,
"code": 59909,
"tempChar": ""
"tempChar": ""
},
{
"order": 39,
@@ -387,7 +371,7 @@
"name": "icon-duplicate",
"prevSize": 32,
"code": 59910,
"tempChar": ""
"tempChar": ""
},
{
"order": 50,
@@ -395,7 +379,7 @@
"name": "icon-folder-new",
"prevSize": 32,
"code": 59911,
"tempChar": ""
"tempChar": ""
},
{
"order": 138,
@@ -403,7 +387,7 @@
"name": "icon-fullscreen-collapse",
"prevSize": 32,
"code": 59912,
"tempChar": ""
"tempChar": ""
},
{
"order": 139,
@@ -411,7 +395,7 @@
"name": "icon-fullscreen-expand",
"prevSize": 32,
"code": 59913,
"tempChar": ""
"tempChar": ""
},
{
"order": 122,
@@ -419,7 +403,7 @@
"name": "icon-layers",
"prevSize": 32,
"code": 59914,
"tempChar": ""
"tempChar": ""
},
{
"order": 151,
@@ -427,7 +411,7 @@
"name": "icon-line-horz",
"prevSize": 32,
"code": 59915,
"tempChar": ""
"tempChar": ""
},
{
"order": 100,
@@ -435,7 +419,7 @@
"name": "icon-magnify",
"prevSize": 32,
"code": 59916,
"tempChar": ""
"tempChar": ""
},
{
"order": 99,
@@ -443,7 +427,7 @@
"name": "icon-magnify-in",
"prevSize": 32,
"code": 59917,
"tempChar": ""
"tempChar": ""
},
{
"order": 101,
@@ -451,7 +435,7 @@
"name": "icon-magnify-out-v2",
"prevSize": 32,
"code": 59918,
"tempChar": ""
"tempChar": ""
},
{
"order": 103,
@@ -459,7 +443,7 @@
"name": "icon-menu",
"prevSize": 32,
"code": 59919,
"tempChar": ""
"tempChar": ""
},
{
"order": 124,
@@ -467,7 +451,7 @@
"name": "icon-move",
"prevSize": 32,
"code": 59920,
"tempChar": ""
"tempChar": ""
},
{
"order": 7,
@@ -475,7 +459,7 @@
"name": "icon-new-window",
"prevSize": 32,
"code": 59921,
"tempChar": ""
"tempChar": ""
},
{
"order": 63,
@@ -483,7 +467,7 @@
"name": "icon-paint-bucket-v2",
"prevSize": 32,
"code": 59922,
"tempChar": ""
"tempChar": ""
},
{
"order": 15,
@@ -491,7 +475,7 @@
"name": "icon-pencil",
"prevSize": 32,
"code": 59923,
"tempChar": ""
"tempChar": ""
},
{
"order": 54,
@@ -499,7 +483,7 @@
"name": "icon-pencil-edit-in-place",
"prevSize": 32,
"code": 59924,
"tempChar": ""
"tempChar": ""
},
{
"order": 40,
@@ -507,7 +491,7 @@
"name": "icon-play",
"prevSize": 32,
"code": 59925,
"tempChar": ""
"tempChar": ""
},
{
"order": 125,
@@ -515,7 +499,7 @@
"name": "icon-pause",
"prevSize": 32,
"code": 59926,
"tempChar": ""
"tempChar": ""
},
{
"order": 119,
@@ -523,7 +507,7 @@
"name": "icon-plot-resource",
"prevSize": 32,
"code": 59927,
"tempChar": ""
"tempChar": ""
},
{
"order": 48,
@@ -531,7 +515,7 @@
"name": "icon-pointer-left",
"prevSize": 32,
"code": 59928,
"tempChar": ""
"tempChar": ""
},
{
"order": 47,
@@ -539,7 +523,7 @@
"name": "icon-pointer-right",
"prevSize": 32,
"code": 59929,
"tempChar": ""
"tempChar": ""
},
{
"order": 85,
@@ -547,7 +531,7 @@
"name": "icon-refresh",
"prevSize": 32,
"code": 59930,
"tempChar": ""
"tempChar": ""
},
{
"order": 55,
@@ -555,7 +539,7 @@
"name": "icon-save",
"prevSize": 32,
"code": 59931,
"tempChar": ""
"tempChar": ""
},
{
"order": 56,
@@ -563,7 +547,7 @@
"name": "icon-save-as",
"prevSize": 32,
"code": 59932,
"tempChar": ""
"tempChar": ""
},
{
"order": 58,
@@ -571,7 +555,7 @@
"name": "icon-sine",
"prevSize": 32,
"code": 59933,
"tempChar": ""
"tempChar": ""
},
{
"order": 113,
@@ -579,7 +563,7 @@
"name": "icon-font",
"prevSize": 32,
"code": 59934,
"tempChar": ""
"tempChar": ""
},
{
"order": 41,
@@ -587,7 +571,7 @@
"name": "icon-thumbs-strip",
"prevSize": 32,
"code": 59935,
"tempChar": ""
"tempChar": ""
},
{
"order": 146,
@@ -595,7 +579,7 @@
"name": "icon-two-parts-both",
"prevSize": 32,
"code": 59936,
"tempChar": ""
"tempChar": ""
},
{
"order": 145,
@@ -603,7 +587,7 @@
"name": "icon-two-parts-one-only",
"prevSize": 32,
"code": 59937,
"tempChar": ""
"tempChar": ""
},
{
"order": 82,
@@ -611,7 +595,7 @@
"name": "icon-resync",
"prevSize": 32,
"code": 59938,
"tempChar": ""
"tempChar": ""
},
{
"order": 86,
@@ -619,7 +603,7 @@
"name": "icon-reset",
"prevSize": 32,
"code": 59939,
"tempChar": ""
"tempChar": ""
},
{
"order": 61,
@@ -627,7 +611,7 @@
"name": "icon-x-in-circle",
"prevSize": 32,
"code": 59940,
"tempChar": ""
"tempChar": ""
},
{
"order": 84,
@@ -635,7 +619,7 @@
"name": "icon-brightness",
"prevSize": 32,
"code": 59941,
"tempChar": ""
"tempChar": ""
},
{
"order": 83,
@@ -643,7 +627,7 @@
"name": "icon-contrast",
"prevSize": 32,
"code": 59942,
"tempChar": ""
"tempChar": ""
},
{
"order": 87,
@@ -651,7 +635,7 @@
"name": "icon-expand",
"prevSize": 32,
"code": 59943,
"tempChar": ""
"tempChar": ""
},
{
"order": 89,
@@ -659,7 +643,7 @@
"name": "icon-list-view",
"prevSize": 32,
"code": 59944,
"tempChar": ""
"tempChar": ""
},
{
"order": 133,
@@ -667,7 +651,7 @@
"name": "icon-grid-snap-to",
"prevSize": 32,
"code": 59945,
"tempChar": ""
"tempChar": ""
},
{
"order": 132,
@@ -675,7 +659,7 @@
"name": "icon-grid-snap-no",
"prevSize": 32,
"code": 59946,
"tempChar": ""
"tempChar": ""
},
{
"order": 94,
@@ -683,7 +667,7 @@
"name": "icon-frame-show",
"prevSize": 32,
"code": 59947,
"tempChar": ""
"tempChar": ""
},
{
"order": 95,
@@ -691,7 +675,7 @@
"name": "icon-frame-hide",
"prevSize": 32,
"code": 59948,
"tempChar": ""
"tempChar": ""
},
{
"order": 97,
@@ -699,7 +683,7 @@
"name": "icon-import",
"prevSize": 32,
"code": 59949,
"tempChar": ""
"tempChar": ""
},
{
"order": 96,
@@ -707,7 +691,7 @@
"name": "icon-export",
"prevSize": 32,
"code": 59950,
"tempChar": ""
"tempChar": ""
},
{
"order": 114,
@@ -715,7 +699,7 @@
"name": "icon-font-size",
"prevSize": 32,
"code": 59951,
"tempChar": ""
"tempChar": ""
},
{
"order": 144,
@@ -723,7 +707,7 @@
"name": "icon-activity",
"prevSize": 32,
"code": 60160,
"tempChar": ""
"tempChar": ""
},
{
"order": 104,
@@ -731,7 +715,7 @@
"name": "icon-activity-mode",
"prevSize": 32,
"code": 60161,
"tempChar": ""
"tempChar": ""
},
{
"order": 137,
@@ -739,7 +723,7 @@
"name": "icon-autoflow-tabular",
"prevSize": 32,
"code": 60162,
"tempChar": ""
"tempChar": ""
},
{
"order": 115,
@@ -747,7 +731,7 @@
"name": "icon-clock",
"prevSize": 32,
"code": 60163,
"tempChar": ""
"tempChar": ""
},
{
"order": 2,
@@ -755,7 +739,7 @@
"name": "icon-database",
"prevSize": 32,
"code": 60164,
"tempChar": ""
"tempChar": ""
},
{
"order": 3,
@@ -763,7 +747,7 @@
"name": "icon-database-query",
"prevSize": 32,
"code": 60165,
"tempChar": ""
"tempChar": ""
},
{
"order": 67,
@@ -771,7 +755,7 @@
"name": "icon-dataset",
"prevSize": 32,
"code": 60166,
"tempChar": ""
"tempChar": ""
},
{
"order": 59,
@@ -779,7 +763,7 @@
"name": "icon-datatable",
"prevSize": 32,
"code": 60167,
"tempChar": ""
"tempChar": ""
},
{
"order": 136,
@@ -787,7 +771,7 @@
"name": "icon-dictionary",
"prevSize": 32,
"code": 60168,
"tempChar": ""
"tempChar": ""
},
{
"order": 51,
@@ -795,7 +779,7 @@
"name": "icon-folder",
"prevSize": 32,
"code": 60169,
"tempChar": ""
"tempChar": ""
},
{
"order": 147,
@@ -803,7 +787,7 @@
"name": "icon-image",
"prevSize": 32,
"code": 60170,
"tempChar": ""
"tempChar": ""
},
{
"order": 4,
@@ -811,7 +795,7 @@
"name": "icon-layout",
"prevSize": 32,
"code": 60171,
"tempChar": ""
"tempChar": ""
},
{
"order": 24,
@@ -819,7 +803,7 @@
"name": "icon-object",
"prevSize": 32,
"code": 60172,
"tempChar": ""
"tempChar": ""
},
{
"order": 52,
@@ -827,7 +811,7 @@
"name": "icon-object-unknown",
"prevSize": 32,
"code": 60173,
"tempChar": ""
"tempChar": ""
},
{
"order": 105,
@@ -835,7 +819,7 @@
"name": "icon-packet",
"prevSize": 32,
"code": 60174,
"tempChar": ""
"tempChar": ""
},
{
"order": 126,
@@ -843,7 +827,7 @@
"name": "icon-page",
"prevSize": 32,
"code": 60175,
"tempChar": ""
"tempChar": ""
},
{
"order": 130,
@@ -851,7 +835,7 @@
"name": "icon-plot-overlay",
"prevSize": 32,
"code": 60176,
"tempChar": ""
"tempChar": ""
},
{
"order": 80,
@@ -859,7 +843,7 @@
"name": "icon-plot-stacked",
"prevSize": 32,
"code": 60177,
"tempChar": ""
"tempChar": ""
},
{
"order": 134,
@@ -867,7 +851,7 @@
"name": "icon-session",
"prevSize": 32,
"code": 60178,
"tempChar": ""
"tempChar": ""
},
{
"order": 109,
@@ -875,7 +859,7 @@
"name": "icon-tabular",
"prevSize": 32,
"code": 60179,
"tempChar": ""
"tempChar": ""
},
{
"order": 107,
@@ -883,7 +867,7 @@
"name": "icon-tabular-lad",
"prevSize": 32,
"code": 60180,
"tempChar": ""
"tempChar": ""
},
{
"order": 106,
@@ -891,7 +875,7 @@
"name": "icon-tabular-lad-set",
"prevSize": 32,
"code": 60181,
"tempChar": ""
"tempChar": ""
},
{
"order": 70,
@@ -899,7 +883,7 @@
"name": "icon-tabular-realtime",
"prevSize": 32,
"code": 60182,
"tempChar": ""
"tempChar": ""
},
{
"order": 60,
@@ -907,7 +891,7 @@
"name": "icon-tabular-scrolling",
"prevSize": 32,
"code": 60183,
"tempChar": ""
"tempChar": ""
},
{
"order": 131,
@@ -915,7 +899,7 @@
"name": "icon-telemetry",
"prevSize": 32,
"code": 60184,
"tempChar": ""
"tempChar": ""
},
{
"order": 108,
@@ -923,7 +907,7 @@
"name": "icon-timeline",
"prevSize": 32,
"code": 60185,
"tempChar": ""
"tempChar": ""
},
{
"order": 81,
@@ -931,7 +915,7 @@
"name": "icon-timer",
"prevSize": 32,
"code": 60186,
"tempChar": ""
"tempChar": ""
},
{
"order": 69,
@@ -939,7 +923,7 @@
"name": "icon-topic",
"prevSize": 32,
"code": 60187,
"tempChar": ""
"tempChar": ""
},
{
"order": 79,
@@ -947,7 +931,7 @@
"name": "icon-box-with-dashed-lines-v2",
"prevSize": 32,
"code": 60188,
"tempChar": ""
"tempChar": ""
},
{
"order": 90,
@@ -955,7 +939,7 @@
"name": "icon-summary-widget",
"prevSize": 32,
"code": 60189,
"tempChar": ""
"tempChar": ""
},
{
"order": 92,
@@ -963,7 +947,7 @@
"name": "icon-notebook",
"prevSize": 32,
"code": 60190,
"tempChar": ""
"tempChar": ""
},
{
"order": 118,
@@ -971,7 +955,7 @@
"name": "icon-tabs-view",
"prevSize": 32,
"code": 60191,
"tempChar": ""
"tempChar": ""
},
{
"order": 117,
@@ -979,7 +963,7 @@
"name": "icon-flexible-layout",
"prevSize": 32,
"code": 60192,
"tempChar": ""
"tempChar": ""
},
{
"order": 152,
@@ -987,7 +971,7 @@
"name": "icon-generator-sine",
"prevSize": 32,
"code": 60193,
"tempChar": ""
"tempChar": ""
},
{
"order": 153,
@@ -995,7 +979,7 @@
"name": "icon-generator-event",
"prevSize": 32,
"code": 60194,
"tempChar": ""
"tempChar": ""
},
{
"order": 160,
@@ -1003,7 +987,7 @@
"name": "icon-gauge",
"prevSize": 32,
"code": 60195,
"tempChar": ""
"tempChar": ""
}
],
"id": 0,
@@ -1618,46 +1602,6 @@
]
}
},
{
"id": 142,
"paths": [
"M896 0h-768c-70.601 0.227-127.773 57.399-128 127.978l-0 0.022v768c0.227 70.601 57.399 127.773 127.978 128l0.022 0h256v-512l-192-192h640l-192 192v512h256c70.601-0.227 127.773-57.399 128-127.978l0-0.022v-768c-0.227-70.601-57.399-127.773-127.978-128l-0.022-0z"
],
"attrs": [
{}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 1,
"tags": [
"icon-filter"
],
"colorPermutations": {
"11841841841": [
{}
]
}
},
{
"id": 141,
"paths": [
"M896 0h-768c-70.601 0.227-127.773 57.399-128 127.978l-0 0.022v768c0.227 70.601 57.399 127.773 127.978 128l0.022 0h768c70.601-0.227 127.773-57.399 128-127.978l0-0.022v-768c-0.227-70.601-57.399-127.773-127.978-128l-0.022-0zM896 895.8h-256v-383.8l192-192h-640l192 192v384h-256v-767.8h768z"
],
"attrs": [
{}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 1,
"tags": [
"icon-filter-outline"
],
"colorPermutations": {
"11841841841": [
{}
]
}
},
{
"id": 105,
"paths": [

BIN
src/styles-new/fonts/Open-MCT-Symbols-16px.ttf Normal file → Executable file

Binary file not shown.

BIN
src/styles-new/fonts/Open-MCT-Symbols-16px.woff Normal file → Executable file

Binary file not shown.

View File

@@ -1,35 +1,19 @@
{
"metadata": {
"name": "Open MCT Symbols 12px",
"name": "openmct-symbols-12px",
"lastOpened": 0,
"created": 1561483556329
"created": 1527031065005
},
"iconSets": [
{
"selection": [
{
"order": 12,
"id": 10,
"name": "icon12-filter",
"prevSize": 12,
"code": 59686,
"tempChar": ""
},
{
"order": 14,
"id": 11,
"name": "icon12-filter-outline",
"prevSize": 12,
"code": 59687,
"tempChar": ""
},
{
"order": 9,
"id": 6,
"name": "icon12-crosshair",
"prevSize": 12,
"code": 59696,
"tempChar": ""
"tempChar": ""
},
{
"order": 11,
@@ -37,7 +21,7 @@
"name": "icon12-grippy",
"prevSize": 12,
"code": 59697,
"tempChar": ""
"tempChar": ""
},
{
"order": 10,
@@ -45,7 +29,7 @@
"name": "icon12-list-view",
"prevSize": 12,
"code": 921666,
"tempChar": ""
"tempChar": ""
},
{
"order": 6,
@@ -53,14 +37,14 @@
"prevSize": 12,
"code": 921865,
"name": "icon12-folder",
"tempChar": ""
"tempChar": ""
}
],
"id": 0,
"metadata": {
"name": "Open MCT Symbols 12px",
"name": "openmct-symbols-12px",
"importSize": {
"width": 384,
"width": 279,
"height": 384
},
"designer": "Charles Hacskaylo"
@@ -68,28 +52,6 @@
"height": 1024,
"prevSize": 12,
"icons": [
{
"id": 10,
"paths": [
"M853.333 0h-682.667c-94.135 0.302-170.364 76.532-170.667 170.638l-0 0.029v682.667c0.302 94.135 76.532 170.364 170.638 170.667l0.029 0h256v-341.333l-341.333-341.333h853.333l-341.333 341.333 1.067 341.333h254.933c94.135-0.302 170.364-76.532 170.667-170.638l0-0.029v-682.667c-0.302-94.135-76.532-170.364-170.638-170.667l-0.029-0z"
],
"attrs": [],
"grid": 0,
"tags": [
"icon12-filter"
]
},
{
"id": 11,
"paths": [
"M853.333 0h-682.667c-94.135 0.302-170.364 76.532-170.667 170.638l-0 0.029v682.667c0.302 94.135 76.532 170.364 170.638 170.667l0.029 0h682.667c94.135-0.302 170.364-76.532 170.667-170.638l0-0.029v-682.667c-0.302-94.135-76.532-170.364-170.638-170.667l-0.029-0zM170.933 853.333h-0.267v-512l256 256v256zM853.067 853.333h-255.2l-0.533-256 256-256v511.733zM853.333 341.333h-682.667v-170.4h682.667z"
],
"attrs": [],
"grid": 0,
"tags": [
"icon12-filter-outline"
]
},
{
"id": 6,
"paths": [
@@ -98,11 +60,26 @@
"M597.333 768h-170.667v256h170.667v-256z",
"M256 426.667h-256v170.667h256v-170.667z"
],
"attrs": [],
"attrs": [
{},
{},
{},
{}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 0,
"tags": [
"icon12-crosshair"
]
],
"colorPermutations": {
"1161751": [
{},
{},
{},
{}
]
}
},
{
"id": 8,
@@ -118,12 +95,39 @@
"M744.773 511.867c0 51.458-41.715 93.173-93.173 93.173s-93.173-41.715-93.173-93.173c0-51.458 41.715-93.173 93.173-93.173s93.173 41.715 93.173 93.173z",
"M744.773 791.36c0 51.458-41.715 93.173-93.173 93.173s-93.173-41.715-93.173-93.173c0-51.458 41.715-93.173 93.173-93.173s93.173 41.715 93.173 93.173z"
],
"attrs": [],
"attrs": [
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
],
"width": 745,
"isMulticolor": false,
"isMulticolor2": false,
"grid": 0,
"tags": [
"icon12-grippy"
]
],
"colorPermutations": {
"1161751": [
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}
},
{
"id": 7,
@@ -132,11 +136,24 @@
"M0 426.667h1024v170.667h-1024v-170.667z",
"M0 853.333h1024v170.667h-1024v-170.667z"
],
"attrs": [],
"attrs": [
{},
{},
{}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 0,
"tags": [
"icon12-list-view"
]
],
"colorPermutations": {
"1161751": [
{},
{},
{}
]
}
},
{
"id": 3,
@@ -145,14 +162,40 @@
"M85.333 426.667h853.333c47.128 0 85.333 38.205 85.333 85.333v426.667c0 47.128-38.205 85.333-85.333 85.333h-853.333c-47.128 0-85.333-38.205-85.333-85.333v-426.667c0-47.128 38.205-85.333 85.333-85.333z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon12-folder"
]
],
"colorPermutations": {
"1161751": [
{
"f": 0
},
{
"f": 0
}
]
}
}
],
"invisible": false,
"colorThemes": [],
"colorThemes": [
[
[
0,
0,
0,
1
],
[
0,
161,
75,
1
]
]
],
"colorThemeIdx": 0
}
],
@@ -163,9 +206,9 @@
"showQuickUse2": true,
"showSVGs": true,
"fontPref": {
"prefix": "openmct-symbols-",
"prefix": "icon-",
"metadata": {
"fontFamily": "Open-MCT-Symbols-12px",
"fontFamily": "openmct-symbols-12px",
"majorVersion": 1,
"minorVersion": 0
},
@@ -174,12 +217,7 @@
"baseline": 6.25,
"whitespace": 50
},
"embed": false,
"noie8": true,
"ie7": false,
"showMetadata": false,
"includeMetadata": false,
"showMetrics": true
"embed": false
},
"imagePref": {
"prefix": "icon-",

Binary file not shown.

Binary file not shown.

View File

@@ -25,8 +25,8 @@
// Do not include anything that renders to CSS!
@import "constants";
@import "constants-mobile.scss";
@import "constants-espresso"; // TEMP
//@import "constants-snow"; // TEMP
//@import "constants-espresso"; // TEMP
@import "constants-snow"; // TEMP
//@import "constants-maelstrom";
@import "mixins";
@import "animations";

View File

@@ -22,11 +22,13 @@
<template>
<div class="c-so-view has-local-controls"
:class="{
'c-so-view--no-frame': !hasFrame,
'c-so-view--no-frame': !hasFrame && cssClass.indexOf('unknown') === -1,
'has-complex-content': complexContent
}">
<div class="c-so-view__header">
<div class="c-so-view__header__icon" :class="cssClass"></div>
<div class="c-so-view__header"
:class="{'c-so-view__header--unknown': cssClass.indexOf('unknown') !== -1}">
<div class="c-so-view__header__icon"
:class="cssClass"></div>
<div class="c-so-view__header__name">
{{ domainObject && domainObject.name }}
</div>
@@ -74,6 +76,10 @@
@include ellipsize();
flex: 0 1 auto;
}
&--unknown {
@include isUnknown();
}
}
&:not(.c-so-view--no-frame) {

View File

@@ -1,5 +1,6 @@
<template>
<a class="c-tree__item__label c-object-label"
:class="{'c-object-label--unknown': typeClass.indexOf('icon-object-unknown') !== -1}"
draggable="true"
@dragstart="dragStart"
@click="navigateOrPreview"
@@ -39,6 +40,10 @@
color: $colorItemTreeIcon;
width: $treeTypeIconW;
}
&--unknown {
@include isUnknown();
}
}
</style>

View File

@@ -5,7 +5,12 @@
class="l-browse-bar__nav-to-parent-button c-icon-button c-icon-button--major icon-pointer-left"
@click="goToParent"></button>
<div class="l-browse-bar__object-name--w"
:class="type.cssClass">
:class="[
{
'l-browse-bar--unknown': type.cssClass.indexOf('unknown') !== -1
},
type.cssClass
]">
<span
class="l-browse-bar__object-name c-input-inline"
@blur="updateName"
@@ -316,5 +321,9 @@ const PLACEHOLDER_OBJECT = {};
&__object-name {
flex: 0 1 auto;
}
&--unknown {
@include isUnknown();
}
}
</style>

View File

@@ -83,13 +83,7 @@
&:hover {
background: $colorItemTreeHoverBg;
.c-tree__item__type-icon:before {
color: $colorItemTreeIconHover;
}
.c-tree__item__name {
color: $colorItemTreeHoverFg;
}
> * { filter: $filterItemHoverFg; }
}
&.is-navigated-object,

View File

@@ -24,6 +24,7 @@ const webpackConfig = {
output: {
filename: '[name].js',
library: '[name]',
libraryTarget: 'umd',
path: path.resolve(__dirname, 'dist')
},
resolve: {