@@ -27,6 +32,7 @@ import {isDefined} from '../../core/utils/Utils';
import {assertDefined, throttle, debounce} from "../../core/utils/Utils";
import {EventType} from "../../core/event/EventType";
import {Mode} from "../../core/datasource/Mode";
+import RangeSliderRealtime from "./RangeSlider.realtime.vue";
/**
* @module osh-vue/TimeController
@@ -40,7 +46,7 @@ import {Mode} from "../../core/datasource/Mode";
*/
export default {
name: "TimeControllerRealtime",
- components: {},
+ components: {RangeSliderRealtime},
props: {
dataSource: {
type: Object
@@ -74,8 +80,7 @@ export default {
id: randomUUID(),
event: null,
dataSourceObject: null,
- rangeSlider: undefined,
- bcTime: null,
+ rangeSliderInit: false,
init: false,
lastSynchronizedTimestamp: -1,
outOfSync: {},
@@ -101,84 +106,55 @@ export default {
},
methods: {
async initComp() {
- if (!this.init) {
- let stCurrentRefresh = this.getDataSourceObject().getMode() !== Mode.REAL_TIME;
- if (stCurrentRefresh) {
- await this.dataSourceObject.setTimeRange(
- 'now',
- new Date("2055-01-01T00:00:00Z").toISOString(),
- 1.0,
- true,
- Mode.REAL_TIME
- );
- }
-
+ if(!this.init) {
assertDefined(this.getDataSourceObject(), 'either dataSource properties or dataSynchronizer must be defined');
- this.createTimeBc();
+ this.subscribeEvents();
this.displayConsoleWarningIncompatibleVersionThrottle = throttle(this.displayConsoleWarningIncompatibleVersion.bind(this), this.debounce);
this.init = true;
}
},
- destroyBc() {
- if (isDefined(this.bcTime)) {
- this.bcTime.close();
- }
- },
- destroyTimeBc() {
- this.bcTime.close();
- },
displayConsoleWarningIncompatibleVersionThrottle() {
},
displayConsoleWarningIncompatibleVersion() {
console.warn('Incompatible data version');
},
- createTimeBc() {
+ subscribeEvents() {
// listen for BC
+ const isDataSynchronizer = isDefined(this.dataSynchronizer);
this.dataSourceObject.subscribe(message => {
- if(message.type === EventType.MASTER_TIME) {
- if(!isDefined(this.rangeSlider)) {
- this.createRangeSlider(message.timestamp);
- }
- // consider here datasynchronizer sends data in time order
- if (isDefined(this.dataSynchronizer)) {
+ if(isDataSynchronizer) {
+ if(message.type === EventType.MASTER_TIME) {
+ // consider here dataSynchronizer sends data in time order
const contains = message.dataSourceId in this.outOfSync;
if (message.timestamp < this.lastSynchronizedTimestamp) {
if (!contains) {
- if (isDefined(this.dataSynchronizer)) {
- this.dataSynchronizer.dataSources.forEach(datasource => {
- if (datasource.id === message.dataSourceId) {
- this.outOfSync[datasource.id] = datasource;
- }
- });
- } else {
- this.outOfSync[message.dataSourceId] = this.dataSourceObject;
- }
+ this.dataSynchronizer.dataSources.forEach(datasource => {
+ if (datasource.id === message.dataSourceId) {
+ this.outOfSync[datasource.id] = datasource;
+ }
+ });
}
return;
} else if (contains) {
// check that the datasource is not out of sync anymore
delete this.outOfSync[message.dataSourceId];
}
+ this.lastSynchronizedTimestamp = message.timestamp;
+ this.masterTime = message.timestamp;
+ if(!this.rangeSliderInit) {
+ this.rangeSliderInit = true;
+ }
}
- this.lastSynchronizedTimestamp = message.timestamp;
+ } else if(message.type === EventType.LAST_TIME) {
+ // single dataSource
this.masterTime = message.timestamp;
+ if(!this.rangeSliderInit) {
+ this.rangeSliderInit = true;
+ }
}
- }, [EventType.TIME_CHANGED, EventType.MASTER_TIME]);
+ }, [EventType.TIME_CHANGED, EventType.MASTER_TIME, EventType.LAST_TIME, EventType.DATA]);
},
-
- createRangeSlider(startTimestamp) {
- if (!this.rangeSlider) {
- this.rangeSlider = new RangeSliderViewRealtime({
- container: this.id,
- debounce: 200,
- dataSynchronizer: this.dataSynchronizer,
- startTimestamp: startTimestamp,
- options: {}
- });
- }
- }
- ,
resetMasterTime() {
// reset master time
this.lastSynchronizedTimestamp = -1;
@@ -210,6 +186,20 @@ export default {
}
return content;
}
+ },
+ // vuejs 3.x
+ beforeUnmount() {
+ const ref = this.$refs.rangeSliderRef;
+ if(ref) {
+ ref.destroy();
+ }
+ },
+ // vuejs 2.x
+ beforeDestroy() {
+ const ref = this.$refs.rangeSliderRef;
+ if(ref) {
+ ref.destroy();
+ }
}
}
diff --git a/source/vue/components/TimeController.replay.vue b/source/vue/components/TimeController.replay.vue
index e9bc77c860..c667a399ab 100644
--- a/source/vue/components/TimeController.replay.vue
+++ b/source/vue/components/TimeController.replay.vue
@@ -1,6 +1,16 @@
@@ -42,15 +51,13 @@
@@ -503,10 +547,6 @@ export default {
display: flex;
}
-.control .control-time {
- display: flex;
-}
-
.control a[disabled] {
color: gray;
pointer-events: none;
@@ -654,10 +694,6 @@ export default {
height: 0px;
}
-.control .control-time {
- width: 150px;
-}
-
.control .datasource-actions.live {
justify-content: unset;
align-items: unset;
diff --git a/source/vue/components/TimeController.vue b/source/vue/components/TimeController.vue
index 9ff13bf74e..5a2068fdd6 100644
--- a/source/vue/components/TimeController.vue
+++ b/source/vue/components/TimeController.vue
@@ -19,6 +19,7 @@
:skipTimeStep="skipTimeStep"
:replaySpeedStep="replaySpeedStep"
@event='onControlEvent'
+ :startTime="replayProps.startTime"
>
@@ -27,6 +28,7 @@
:debounce="debounce"
:parseTime="parseTime"
@event='onControlEvent'
+ :startTime="replayProps.startTime"
>
@@ -44,7 +46,6 @@ import TimeControllerBatch from "./TimeController.batch.vue";
* @desc TimeController component to control timeline of the datasources
* @vue-prop {DataSource} [dataSource] - DataSource object
* @vue-prop {DataSynchronizer} [dataSynchronizer] - DataSynchronizer object
- * @vue-prop {String} [skipTimeStep='5s'] Time to skip backward/forward. In seconds or percent of the total time
* @vue-prop {Number} [replaySpeedStep=0.1] Time to decrease/increase replay speed value
* @vue-prop {Number} [debounce=800] Debounce time before executing refresh while clicking on backward/forward/replaySpeed action. In millis
* @vue-prop {Function} [parseTime] - Function used to parse the time and display next to the actions buttons. Return value can be text or HTML.