-
+
+
+
+
+
+
@@ -37,27 +78,36 @@ import _ from 'lodash';
import { v4 as uuid } from 'uuid';
import { TIME_CONTEXT_EVENTS } from '../../api/time/constants.js';
-import ListView from '../../ui/components/List/ListView.vue';
+import ListHeader from '../../ui/components/List/ListHeader.vue';
+import ListItem from '../../ui/components/List/ListItem.vue';
import { getPreciseDuration } from '../../utils/duration.js';
import { getFilteredValues, getValidatedData, getValidatedGroups } from '../plan/util.js';
import { SORT_ORDER_OPTIONS } from './constants.js';
+import ExpandedViewItem from './ExpandedViewItem.vue';
const SCROLL_TIMEOUT = 10000;
const TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
+const SAME_DAY_PRECISION_SECONDS = 'HH:mm:ss';
+
const CURRENT_CSS_SUFFIX = '--is-current';
const PAST_CSS_SUFFIX = '--is-past';
const FUTURE_CSS_SUFFIX = '--is-future';
+
const headerItems = [
{
defaultDirection: true,
isSortable: true,
property: 'start',
name: 'Start Time',
- format: function (value, object, key, openmct) {
+ format: function (value, object, key, openmct, options = {}) {
const timeFormat = openmct.time.timeSystem().timeFormat;
const timeFormatter = openmct.telemetry.getValueFormatter({ format: timeFormat }).formatter;
- return timeFormatter.format(value, TIME_FORMAT);
+ if (options.skipDateForToday) {
+ return timeFormatter.format(value, SAME_DAY_PRECISION_SECONDS);
+ } else {
+ return timeFormatter.format(value, TIME_FORMAT);
+ }
}
},
{
@@ -65,25 +115,34 @@ const headerItems = [
isSortable: true,
property: 'end',
name: 'End Time',
- format: function (value, object, key, openmct) {
+ format: function (value, object, key, openmct, options = {}) {
const timeFormat = openmct.time.timeSystem().timeFormat;
const timeFormatter = openmct.telemetry.getValueFormatter({ format: timeFormat }).formatter;
- return timeFormatter.format(value, TIME_FORMAT);
+ if (options.skipDateForToday) {
+ return timeFormatter.format(value, SAME_DAY_PRECISION_SECONDS);
+ } else {
+ return timeFormatter.format(value, TIME_FORMAT);
+ }
}
},
{
defaultDirection: false,
- property: 'duration',
+ property: 'countdown',
name: 'Time To/From',
- format: function (value) {
+ format: function (value, object, key, openmct, options = {}) {
let result;
if (value < 0) {
- result = `+${getPreciseDuration(Math.abs(value), {
+ const prefix = options.skipPrefix ? '' : '+';
+ result = `${prefix}${getPreciseDuration(Math.abs(value), {
excludeMilliSeconds: true,
useDayFormat: true
})}`;
} else if (value > 0) {
- result = `-${getPreciseDuration(value, { excludeMilliSeconds: true, useDayFormat: true })}`;
+ const prefix = options.skipPrefix ? '' : '+';
+ result = `${prefix}${getPreciseDuration(value, {
+ excludeMilliSeconds: true,
+ useDayFormat: true
+ })}`;
} else {
result = 'Now';
}
@@ -91,6 +150,14 @@ const headerItems = [
return result;
}
},
+ {
+ defaultDirection: false,
+ property: 'duration',
+ name: 'Duration',
+ format: function (value, object, key, openmct) {
+ return `${getPreciseDuration(value, { excludeMilliSeconds: true, useDayFormat: true })}`;
+ }
+ },
{
defaultDirection: true,
property: 'name',
@@ -105,7 +172,9 @@ const defaultSort = {
export default {
components: {
- ListView
+ ExpandedViewItem,
+ ListHeader,
+ ListItem
},
inject: ['openmct', 'domainObject', 'path', 'composition'],
data() {
@@ -114,18 +183,42 @@ export default {
viewBounds: undefined,
height: 0,
planActivities: [],
+ groups: [],
headerItems: headerItems,
- defaultSort: defaultSort
+ defaultSort: defaultSort,
+ isExpanded: false,
+ persistedActivityStates: {},
+ sortedItems: []
};
},
- mounted() {
- this.isEditing = this.openmct.editor.isEditing();
+ computed: {
+ listTypeClass() {
+ if (this.isExpanded) {
+ return 'c-timelist c-timelist--large';
+ }
+ return 'c-timelist';
+ },
+ itemProperties() {
+ return this.headerItems.map((headerItem) => {
+ return {
+ key: headerItem.property,
+ format: headerItem.format
+ };
+ });
+ }
+ },
+ created() {
this.updateTimestamp = _.throttle(this.updateTimestamp, 1000);
+ this.deferAutoScroll = _.debounce(this.deferAutoScroll, 500);
this.setTimeContext();
this.timestamp = this.timeContext.now();
+ },
+ mounted() {
+ this.isEditing = this.openmct.editor.isEditing();
this.getPlanDataAndSetConfig(this.domainObject);
+ this.getActivityStates();
this.unlisten = this.openmct.objects.observe(
this.domainObject,
@@ -145,7 +238,6 @@ export default {
this.openmct.editor.on('isEditing', this.setEditState);
- this.deferAutoScroll = _.debounce(this.deferAutoScroll, 500);
this.$el.parentElement.addEventListener('scroll', this.deferAutoScroll, true);
if (this.composition) {
@@ -165,6 +257,14 @@ export default {
this.unlistenConfig();
}
+ if (this.stopObservingPlan) {
+ this.stopObservingPlan();
+ }
+
+ if (this.stopObservingActivityStatesObject) {
+ this.stopObservingActivityStatesObject();
+ }
+
if (this.removeStatusListener) {
this.removeStatusListener();
}
@@ -204,6 +304,18 @@ export default {
sourceMap: this.domainObject.sourceMap
});
},
+ async getActivityStates() {
+ const activityStatesObject = await this.openmct.objects.get('activity-states');
+ this.setActivityStates(activityStatesObject);
+ this.stopObservingActivityStatesObject = this.openmct.objects.observe(
+ activityStatesObject,
+ '*',
+ this.setActivityStates
+ );
+ },
+ setActivityStates(activityStatesObject) {
+ this.persistedActivityStates = activityStatesObject.activities;
+ },
getPlanDataAndSetConfig(mutatedObject) {
this.getPlanData(mutatedObject);
this.setViewFromConfig(mutatedObject.configuration);
@@ -215,6 +327,7 @@ export default {
this.hideAll = false;
} else {
this.setSort();
+ this.isExpanded = configuration.isExpanded;
}
this.listActivities();
},
@@ -232,7 +345,6 @@ export default {
},
addItem(domainObject) {
this.planObjects = [domainObject];
- this.resetPlanData();
if (domainObject.type === 'plan') {
this.getPlanDataAndSetConfig({
...this.domainObject,
@@ -240,15 +352,28 @@ export default {
sourceMap: domainObject.sourceMap
});
}
+ //listen for changes to the plan
+ if (this.stopObservingPlan) {
+ this.stopObservingPlan();
+ }
+ this.stopObservingPlan = this.openmct.objects.observe(
+ this.planObjects[0],
+ '*',
+ this.handlePlanChange
+ );
},
- addToComposition(telemetryObject) {
+ handlePlanChange(planObject) {
+ this.getPlanData(planObject);
+ this.listActivities();
+ },
+ addToComposition(planObject) {
if (this.planObjects.length > 0) {
- this.confirmReplacePlan(telemetryObject);
+ this.confirmReplacePlan(planObject);
} else {
- this.addItem(telemetryObject);
+ this.addItem(planObject);
}
},
- confirmReplacePlan(telemetryObject) {
+ confirmReplacePlan(planObject) {
const dialog = this.openmct.overlays.dialog({
iconClass: 'alert',
message: 'This action will replace the current plan. Do you want to continue?',
@@ -259,22 +384,22 @@ export default {
callback: () => {
const oldTelemetryObject = this.planObjects[0];
this.removeFromComposition(oldTelemetryObject);
- this.addItem(telemetryObject);
+ this.addItem(planObject);
dialog.dismiss();
}
},
{
label: 'Cancel',
callback: () => {
- this.removeFromComposition(telemetryObject);
+ this.removeFromComposition(planObject);
dialog.dismiss();
}
}
]
});
},
- removeFromComposition(telemetryObject) {
- this.composition.remove(telemetryObject);
+ removeFromComposition(planObject) {
+ this.composition.remove(planObject);
},
removeItem() {
this.planObjects = [];
@@ -282,25 +407,28 @@ export default {
},
resetPlanData() {
this.planData = {};
+ this.groups = [];
+ this.planActivities = [];
+ this.sortedItems = [];
},
getPlanData(domainObject) {
+ this.resetPlanData();
this.planData = getValidatedData(domainObject);
- },
- listActivities() {
- let groups = getValidatedGroups(this.domainObject, this.planData);
- let activities = [];
-
- groups.forEach((key) => {
+ this.groups = getValidatedGroups(this.domainObject, this.planData);
+ this.groups.forEach((key) => {
if (this.planData[key] === undefined) {
return;
}
// Create new objects so Vue 3 can detect any changes
- activities = activities.concat(JSON.parse(JSON.stringify(this.planData[key])));
+ this.planActivities.push(...this.planData[key]);
});
- // filter activities first, then sort by start time
- activities = activities.filter(this.filterActivities).sort(this.sortByStartTime);
- activities = this.applyStyles(activities);
- this.planActivities = [...activities];
+ },
+
+ listActivities() {
+ // filter activities first, then sort
+ const filteredItems = this.planActivities.filter(this.filterActivities);
+ const sortedItems = this.sortItems(filteredItems);
+ this.sortedItems = this.applyStyles(sortedItems);
//We need to wait for the next tick since we need the height of the row from the DOM
this.$nextTick(this.setScrollTop);
},
@@ -405,11 +533,13 @@ export default {
activity.key = uuid();
}
+ activity.duration = activity.end - activity.start;
+
if (activity.start < this.timestamp) {
//if the activity start time has passed, display the time to the end of the activity
- activity.duration = activity.end - this.timestamp;
+ activity.countdown = activity.end - this.timestamp;
} else {
- activity.duration = activity.start - this.timestamp;
+ activity.countdown = activity.start - this.timestamp;
}
return activity;
@@ -452,7 +582,7 @@ export default {
},
setScrollTop() {
//The view isn't ready yet
- if (!this.$el.parentElement) {
+ if (!this.$el.parentElement || this.isExpanded) {
return;
}
@@ -530,11 +660,12 @@ export default {
defaultDirection: direction
};
},
- sortByStartTime(a, b) {
- const numA = parseInt(a.start, 10);
- const numB = parseInt(b.start, 10);
-
- return numA - numB;
+ sortItems(activities) {
+ let sortedItems = _.sortBy(activities, this.defaultSort.property);
+ if (!this.defaultSort.defaultDirection) {
+ sortedItems = sortedItems.reverse();
+ }
+ return sortedItems;
},
setStatus(status) {
this.status = status;
@@ -543,6 +674,17 @@ export default {
this.isEditing = isEditing;
this.setViewFromConfig(this.domainObject.configuration);
},
+ sort(data) {
+ const property = data.property;
+ const direction = data.direction;
+
+ if (this.defaultSort.property === property) {
+ this.defaultSort.defaultDirection = !this.defaultSort.defaultDirection;
+ } else {
+ this.defaultSort.property = property;
+ this.defaultSort.defaultDirection = direction;
+ }
+ },
setSelectionForActivity(activity, element) {
const multiSelect = false;
diff --git a/src/plugins/timelist/constants.js b/src/plugins/timelist/constants.js
index 0849e34bcae..4146d130e76 100644
--- a/src/plugins/timelist/constants.js
+++ b/src/plugins/timelist/constants.js
@@ -22,3 +22,7 @@ export const SORT_ORDER_OPTIONS = [
];
export const TIMELIST_TYPE = 'timelist';
+
+export const CURRENT_CSS_SUFFIX = '--is-current';
+export const PAST_CSS_SUFFIX = '--is-past';
+export const FUTURE_CSS_SUFFIX = '--is-future';
diff --git a/src/plugins/timelist/inspector/EventProperties.vue b/src/plugins/timelist/inspector/EventProperties.vue
index 2a3d2d18e31..2865dcef777 100644
--- a/src/plugins/timelist/inspector/EventProperties.vue
+++ b/src/plugins/timelist/inspector/EventProperties.vue
@@ -22,8 +22,8 @@
{{ label }}
-
-
-
+
{{ filterValue }}
No filters applied
@@ -69,7 +69,7 @@
>
-
+
{{ filterMetadataValue }}
No filters applied
diff --git a/src/plugins/timelist/inspector/TimeListInspectorViewProvider.js b/src/plugins/timelist/inspector/TimeListInspectorViewProvider.js
index 327dd7d74e6..13eda8442a3 100644
--- a/src/plugins/timelist/inspector/TimeListInspectorViewProvider.js
+++ b/src/plugins/timelist/inspector/TimeListInspectorViewProvider.js
@@ -28,7 +28,7 @@ import TimelistPropertiesView from './TimelistPropertiesView.vue';
export default function TimeListInspectorViewProvider(openmct) {
return {
key: 'timelist-inspector',
- name: 'Config',
+ name: 'View Properties',
canView: function (selection) {
if (selection.length === 0 || selection[0].length === 0) {
return false;
diff --git a/src/plugins/timelist/inspector/TimelistPropertiesView.vue b/src/plugins/timelist/inspector/TimelistPropertiesView.vue
index e83ac1d4e43..057e0c65635 100644
--- a/src/plugins/timelist/inspector/TimelistPropertiesView.vue
+++ b/src/plugins/timelist/inspector/TimelistPropertiesView.vue
@@ -30,11 +30,26 @@
These settings don't affect the view while editing, but will be applied after editing is
finished.
+ Display Style
+
+
+
+
+
+ {{ isExpanded ? 'Expanded' : 'Compact' }}
+
+
+
Sort Order
-
-
+
+
-
-
- {{ sortOrderOptions[sortOrderIndex].label }}
+ {{ sortOrderOptions[sortOrderIndex].label }}
{
const headers = element.querySelectorAll(LIST_ITEM_BODY_CLASS);
- expect(headers.length).toEqual(4);
+ expect(headers.length).toEqual(5);
});
it('displays activity details', (done) => {
@@ -244,8 +244,8 @@ describe('the plugin', function () {
nextTick(() => {
const itemEls = element.querySelectorAll(LIST_ITEM_CLASS);
const itemValues = itemEls[0].querySelectorAll(LIST_ITEM_VALUE_CLASS);
- expect(itemValues.length).toEqual(4);
- expect(itemValues[3].innerHTML.trim()).toEqual('Sed ut perspiciatis');
+ expect(itemValues.length).toEqual(5);
+ expect(itemValues[4].innerHTML.trim()).toEqual('Sed ut perspiciatis');
expect(itemValues[0].innerHTML.trim()).toEqual(timeFormatter.format(now, TIME_FORMAT));
expect(itemValues[1].innerHTML.trim()).toEqual(
timeFormatter.format(twoHoursFuture, TIME_FORMAT)
@@ -380,7 +380,7 @@ describe('the plugin', function () {
expect(itemValues[1].innerHTML.trim()).toEqual(
timeFormatter.format(threeHoursFuture, TIME_FORMAT)
);
- expect(itemValues[3].innerHTML.trim()).toEqual('Sed ut perspiciatis two');
+ expect(itemValues[4].innerHTML.trim()).toEqual('Sed ut perspiciatis two');
});
});
});
@@ -446,7 +446,7 @@ describe('the plugin', function () {
expect(itemValues[1].innerHTML.trim()).toEqual(
timeFormatter.format(threeHoursFuture, TIME_FORMAT)
);
- expect(itemValues[3].innerHTML.trim()).toEqual('Sed ut perspiciatis two');
+ expect(itemValues[4].innerHTML.trim()).toEqual('Sed ut perspiciatis two');
});
});
});
diff --git a/src/plugins/timelist/timelist.scss b/src/plugins/timelist/timelist.scss
index ab42110526d..c0a4c80881f 100644
--- a/src/plugins/timelist/timelist.scss
+++ b/src/plugins/timelist/timelist.scss
@@ -19,41 +19,312 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
-
.c-timelist {
- & .nowMarker.hasCurrent {
- height: 2px;
- position: absolute;
- z-index: 10;
- background: cyan;
- width: 100%;
- }
+ & .nowMarker.hasCurrent {
+ height: 2px;
+ position: absolute;
+ z-index: 10;
+ background: cyan;
+ width: 100%;
+ }
+
+ .c-list-item {
+ /* Time Lists */
+
+ td {
+ $p: $interiorMarginSm;
+ padding-top: $p;
+ padding-bottom: $p;
+ }
+
+ &.--is-current {
+ background-color: $colorCurrentBg;
+ border-top: 1px solid $colorCurrentBorder !important;
+ color: $colorCurrentFgEm;
+ }
+
+ &.--is-future {
+ background-color: $colorFutureBg;
+ border-top-color: $colorFutureBorder !important;
+ color: $colorFutureFgEm;
+ }
+
+ &.--is-in-progress {
+ background-color: $colorInProgressBg;
+ }
+
+ &__value {
+ &.--duration {
+ width: 5%;
+ }
+ }
+ }
+}
+
+/**************************************************** LARGE TIME LIST */
+@mixin styleTliEm($colorEm) {
+ // Styles emphasized elements within c-tli.
+ .c-tli {
+ &__duration,
+ &__title,
+ &__time-hero-time {
+ color: $colorEm;
+ }
+ }
+}
+@mixin showTliGraphic($wGraphic) {
+ .c-tli__graphic {
+ &__#{$wGraphic} {
+ display: block;
+ }
+ }
+}
+
+.c-timelist--large {
+ $textSm: 0.8em;
+ $textLg: 1.3em;
+
+ margin-right: $interiorMargin; // fend off from scrollbar
+
+ > * + * {
+ margin-top: $interiorMarginSm;
+ }
+
+ .c-tli {
+ // TODO: add styles for various activity statuses
+ $baseBg: $colorPastBg;
+ $baseFg: $colorPastFg;
+ $baseFgEm: $colorPastFgEm;
+
+ background: $baseBg;
+ color: $baseFg;
+ border-radius: $basicCr;
+ display: grid;
+ padding: $interiorMargin;
+ grid-template-columns: min-content 3fr 40px 1fr;
+ grid-column-gap: $interiorMargin;
+
+ &[s-selected] {
+ background: $colorSelectedBg !important;
+ box-shadow: inset rgba($colorSelectedFg, 0.1) 0 0 0 1px;
+ color: $colorSelectedFg !important;
+ }
+
+ @include styleTliEm($baseFgEm);
+
+ &__activity-color {
+ align-items: start;
+ display: flex;
+ padding-top: 1px;
+ }
+
+ &__activity-color-swatch {
+ $d: 16px;
+ border-radius: 50%;
+ box-shadow: rgba(black, 0.3) 0 0 2px 1px;
+ width: $d;
+ height: $d;
+ }
+
+ &__title-and-bounds {
+ > * + * {
+ margin-top: $interiorMargin;
+ }
+ }
+
+ &__bounds {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+
+ > * {
+ margin-right: $interiorMargin;
+ white-space: nowrap;
+ }
+
+ &.--has-duration {
+ .c-tli__start-time {
+ display: flex;
+ align-items: start;
+
+ &:after {
+ content: $glyph-icon-play;
+ font-family: symbolsfont;
+ font-size: 0.7em;
+ display: block;
+ margin-left: $interiorMargin;
+ margin-top: 2px;
+ }
+ }
+ }
+ }
- .c-list-item {
- /* Time Lists */
+ &__title {
+ font-size: $textLg;
+ }
- td {
- $p: $interiorMarginSm;
- padding-top: $p;
- padding-bottom: $p;
+ &__time-hero {
+ display: flex;
+ align-items: center;
+ justify-content: end;
+ }
+
+ &__time-hero-context-and-time {
+ align-items: center;
+ flex-wrap: wrap;
+ display: flex;
+ justify-content: end;
+ text-align: right;
+
+ > * + * {
+ margin-left: $interiorMargin;
+ }
+ }
+
+ &__time-hero-context {
+ font-size: $textSm;
+ text-transform: uppercase;
+ }
+
+ &__time-hero-time {
+ display: flex;
+ align-items: center;
+ font-size: $textLg;
+ white-space: nowrap;
+
+ &:before {
+ display: block;
+ font-family: symbolsfont;
+ font-size: 0.7em;
+ margin-right: 3px;
+ }
+
+ &.--is-countdown {
+ &:before {
+ content: $glyph-icon-minus;
+ }
+ }
+
+ &.--is-countup {
+ &:before {
+ content: $glyph-icon-plus;
+ }
+ }
+ }
+
+ &__graphic {
+ display: flex;
+ fill: $baseFg;
+ align-items: center;
+
+ svg {
+ > * {
+ display: none;
+ }
+ }
+ }
+
+ &.--is-current {
+ background-color: $colorCurrentBg;
+ color: $colorCurrentFg;
+ @include styleTliEm($colorCurrentFgEm);
+ }
+
+ &.--is-future {
+ background-color: $colorFutureBg;
+ color: $colorFutureFg;
+ @include styleTliEm($colorFutureFgEm);
+ }
+
+ /************************************ ACTIVITY STATE STYLES */
+ /*
+ - 'In Progress' : itemState.inProgress
+ - 'Running Long' : itemState.inProgress && now > end datetime
+ - 'Overdue' : itemState.notStarted && now > start datetime
+ - 'Incomplete' : itemState.notStarted && now > end datetime
+ - 'Starts' : for Activities with now > start datetime
+ - 'Occurs' : for Events with now > start datetime
+ - 'Ends' : itemState.inProgress && now > start datetime && now < end datetime
+ - 'Completed', 'Aborted', 'Skipped' : itemState.
+ */
+ &.--is-not-started {
+
+ }
+
+ &.--is-in-progress {
+ @include showTliGraphic('pie');
+ background-color: $colorInProgressBg;
+ color: $colorInProgressFg;
+ }
+
+ &.--is-running-long {
+ @include showTliGraphic('alert-triangle');
+ background-color: $colorInProgressBg;
+ color: $colorInProgressFg;
+ }
+
+ &.--is-overdue,
+ &.--is-incomplete {
+ @include showTliGraphic('alert-triangle');
+
+ }
+
+ &.--is-completed {
+ @include showTliGraphic('check');
+ }
+
+ &.--is-aborted {
+ @include showTliGraphic('circle-slash');
+ }
+
+ &.--is-skipped {
+ @include showTliGraphic('skipped');
+ }
+
+ &__check {
+ // Overrides?
+ }
+
+ &__alert-triangle {
+ // Overrides?
+ }
+
+ &__circle-slash {
+ // Overrides?
+ }
+ }
+}
+
+.c-svg-progress {
+ &__bg {
+ fill: rgba(black, 0.2);
}
- &.--is-current {
- background-color: $colorCurrentBg;
- border-top: 1px solid $colorCurrentBorder !important;
- color: $colorCurrentFg;
+ &__ticks {
+ fill: none;
+ stroke: $colorInProgressFg;
+ stroke-width: 6;
}
- &.--is-future {
- background-color: $colorFutureBg;
- border-top-color: $colorFutureBorder !important;
- color: $colorFutureFg;
+ &__progress {
+ fill: $colorInProgressFgEm;
}
- &__value {
- &.--duration {
- width: 5%;
- }
+ &__sweep-hand {
+ animation-name: sweep-hand;
+ animation-duration: 10s;
+ animation-iteration-count: infinite;
+ animation-timing-function: steps(12);
+ fill: $colorInProgressFg;
+ transform-origin: center;
+ }
+}
+
+@keyframes sweep-hand {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
}
- }
}
diff --git a/src/plugins/utcTimeSystem/UTCTimeFormat.js b/src/plugins/utcTimeSystem/UTCTimeFormat.js
index 976fbefd126..331d833750e 100644
--- a/src/plugins/utcTimeSystem/UTCTimeFormat.js
+++ b/src/plugins/utcTimeSystem/UTCTimeFormat.js
@@ -39,7 +39,9 @@ export default class UTCTimeFormat {
PRECISION_DEFAULT_WITH_ZULU: this.DATE_FORMAT + 'Z',
PRECISION_SECONDS: 'YYYY-MM-DD HH:mm:ss',
PRECISION_MINUTES: 'YYYY-MM-DD HH:mm',
- PRECISION_DAYS: 'YYYY-MM-DD'
+ PRECISION_DAYS: 'YYYY-MM-DD',
+ PRECISION_SECONDS_TIME_ONLY: 'HH:mm:ss',
+ PRECISION_MINUTES_TIME_ONLY: 'HH:mm'
};
}
diff --git a/src/styles/_constants-espresso.scss b/src/styles/_constants-espresso.scss
index c59b0fb2a29..8be0353941a 100644
--- a/src/styles/_constants-espresso.scss
+++ b/src/styles/_constants-espresso.scss
@@ -437,13 +437,22 @@ $colorGaugeLimitHigh: rgba($colorLimitRedBg, 0.4);
$colorGaugeLimitLow: $colorGaugeLimitHigh;
$transitionTimeGauge: 150ms; // CSS transition time used to smooth needle gauge and meter value transitions
$marginGaugeMeterValue: 10%; // Margin between meter value bar and bounds edges
+
// Time Strip and Lists
-$colorCurrentBg: $colorTimeRealtimeBg;
-$colorCurrentFg: $colorTimeRealtimeFg;
+$colorPastBg: #444;
+$colorPastFg: pushBack($colorBodyFg, 10%);
+$colorPastFgEm: $colorBodyFg;
+$colorCurrentBg: #666;
+$colorCurrentFg: $colorBodyFg;
+$colorCurrentFgEm: $colorBodyFgEm;
$colorCurrentBorder: $colorBodyBg;
-$colorFutureBg: #1b5263;
+$colorFutureBg: $colorPastBg;
$colorFutureFg: $colorCurrentFg;
+$colorFutureFgEm: $colorCurrentFgEm;
$colorFutureBorder: $colorCurrentBorder;
+$colorInProgressBg: $colorTimeRealtimeBg;
+$colorInProgressFg: $colorTimeRealtimeFgSubtle;
+$colorInProgressFgEm: $colorTimeRealtimeFg;
$colorGanttSelectedBorder: rgba(#fff, 0.3);
// Tree
diff --git a/src/styles/_constants-maelstrom.scss b/src/styles/_constants-maelstrom.scss
index 84f607ba3f2..d0d4ae13a8d 100644
--- a/src/styles/_constants-maelstrom.scss
+++ b/src/styles/_constants-maelstrom.scss
@@ -454,14 +454,23 @@ $colorGaugeLimitHigh: rgba($colorLimitRedBg, 0.4);
$colorGaugeLimitLow: $colorGaugeLimitHigh;
$transitionTimeGauge: 150ms; // CSS transition time used to smooth needle gauge and meter value transitions
$marginGaugeMeterValue: 10%; // Margin between meter value bar and bounds edges
+
// Time Strip and Lists
-$colorCurrentBg: $colorTimeRealtimeBg;
-$colorCurrentFg: $colorTimeRealtimeFg;
+$colorPastBg: #444;
+$colorPastFg: pushBack($colorBodyFg, 10%);
+$colorPastFgEm: $colorBodyFg;
+$colorCurrentBg: #666;
+$colorCurrentFg: $colorBodyFgEm;
+$colorCurrentFgEm: $colorBodyFgEm;
$colorCurrentBorder: $colorBodyBg;
-$colorFutureBg: #1b5263;
+$colorFutureBg: $colorPastBg;
$colorFutureFg: $colorCurrentFg;
+$colorFutureFgEm: $colorCurrentFgEm;
$colorFutureBorder: $colorCurrentBorder;
-$colorGanttSelectedBorder: #fff;
+$colorInProgressBg: $colorTimeRealtimeBg;
+$colorInProgressFg: $colorTimeRealtimeFgSubtle;
+$colorInProgressFgEm: $colorTimeRealtimeFg;
+$colorGanttSelectedBorder: rgba(#fff, 0.3);
// Tree
$colorTreeBg: transparent;
diff --git a/src/styles/_constants-snow.scss b/src/styles/_constants-snow.scss
index 9533d936708..5b640c39b11 100644
--- a/src/styles/_constants-snow.scss
+++ b/src/styles/_constants-snow.scss
@@ -176,8 +176,8 @@ $colorTimeFixedBtnBgMajor: #a09375;
$colorTimeFixedBtnFgMajor: #fff;
$colorTimeRealtime: #445890;
$colorTimeRealtimeBg: $colorTimeRealtime;
-$colorTimeRealtimeFg: #eee;
-$colorTimeRealtimeFgSubtle: #88b0ff;
+$colorTimeRealtimeFg: #fff;
+$colorTimeRealtimeFgSubtle: #eee;
$colorTimeRealtimeHov: pullForward($colorTimeRealtime, 10%);
$colorTimeRealtimeSubtle: pushBack($colorTimeRealtime, 20%);
$colorTimeRealtimeBtnBg: pullForward($colorTimeRealtime, 5%);
@@ -437,13 +437,22 @@ $colorGaugeLimitHigh: rgba($colorLimitRedBg, 0.2);
$colorGaugeLimitLow: $colorGaugeLimitHigh;
$transitionTimeGauge: 150ms; // CSS transition time used to smooth needle gauge and meter value transitions
$marginGaugeMeterValue: 10%; // Margin between meter value bar and bounds edges
+
// Time Strip and Lists
-$colorCurrentBg: #5872bd;
-$colorCurrentFg: #eee;
-$colorCurrentBorder: #fff;
-$colorFutureBg: #c6f0ff;
-$colorFutureFg: $colorBodyFg;
+$colorPastBg: #f0f0f0;
+$colorPastFg: #999;
+$colorPastFgEm: #666;
+$colorCurrentBg: #ddd;
+$colorCurrentFg: #666;
+$colorCurrentFgEm: #000;
+$colorCurrentBorder: $colorBodyBg;
+$colorFutureBg: #eaeaea;
+$colorFutureFg: $colorCurrentFg;
+$colorFutureFgEm: $colorCurrentFgEm;
$colorFutureBorder: $colorCurrentBorder;
+$colorInProgressBg: #b1e8ff;
+$colorInProgressFg: $colorCurrentFg;
+$colorInProgressFgEm: $colorCurrentFgEm;
$colorGanttSelectedBorder: #fff;
// Tree