Skip to content

Commit 1cc022d

Browse files
committed
Start lock down stratum work
1 parent 2d88f31 commit 1cc022d

File tree

76 files changed

+1415
-984
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+1415
-984
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package-lock.json
1919
dist
2020
.history/
2121
ts-out/
22+
project.inlang/
2223

2324
# Catalog index generation files
2425
catalog-index*.json

lib/Core/createDiscreteTimes.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import moment from "moment";
2-
import StratumFromTraits from "../Models/Definition/StratumFromTraits";
3-
import DiscreteTimeTraits from "../Traits/TraitsClasses/DiscreteTimeTraits";
42

53
export default function createDiscreteTimesFromIsoSegments(
6-
result: StratumFromTraits<DiscreteTimeTraits>[],
4+
result: { times: string[]; tags: string[] },
75
startDate: string,
86
stopDate: string,
97
isoDuration: string | undefined,
@@ -80,10 +78,9 @@ export default function createDiscreteTimesFromIsoSegments(
8078
current.isSameOrBefore(stop) &&
8179
count < maxRefreshIntervals
8280
) {
83-
result.push({
84-
time: formatMomentForWms(current, duration),
85-
tag: undefined
86-
});
81+
result.times.push(formatMomentForWms(current, duration));
82+
result.tags.push("");
83+
8784
current.add(duration);
8885
++count;
8986
}
@@ -96,10 +93,8 @@ export default function createDiscreteTimesFromIsoSegments(
9693
);
9794
} else if (!current.isSame(stop)) {
9895
// Add stop date if it has not been added yet.
99-
result.push({
100-
time: formatMomentForWms(stop, duration),
101-
tag: undefined
102-
});
96+
result.times.push(formatMomentForWms(stop, duration));
97+
result.tags.push("");
10398
}
10499
}
105100

lib/ModelMixins/CatalogFunctionJobMixin.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import isDefined from "../Core/isDefined";
1111
import TerriaError from "../Core/TerriaError";
1212
import CommonStrata from "../Models/Definition/CommonStrata";
1313
import createStratumInstance from "../Models/Definition/createStratumInstance";
14-
import LoadableStratum from "../Models/Definition/LoadableStratum";
14+
import LoadableStratum, {
15+
LockedDownStratum
16+
} from "../Models/Definition/LoadableStratum";
1517
import Model, { BaseModel } from "../Models/Definition/Model";
1618
import StratumOrder from "../Models/Definition/StratumOrder";
1719
import CatalogFunctionJobTraits from "../Traits/TraitsClasses/CatalogFunctionJobTraits";
@@ -21,8 +23,13 @@ import CatalogMemberMixin from "./CatalogMemberMixin";
2123
import GroupMixin from "./GroupMixin";
2224
import MappableMixin, { MapItem } from "./MappableMixin";
2325

24-
class FunctionJobStratum extends LoadableStratum(CatalogFunctionJobTraits) {
25-
constructor(readonly catalogFunctionJob: CatalogFunctionJobMixin.Instance) {
26+
class FunctionJobStratum
27+
extends LoadableStratum(CatalogFunctionJobTraits)
28+
implements LockedDownStratum<CatalogFunctionJobTraits, FunctionJobStratum>
29+
{
30+
constructor(
31+
private readonly catalogFunctionJob: CatalogFunctionJobMixin.Instance
32+
) {
2633
super();
2734
makeObservable(this);
2835
}

lib/ModelMixins/Cesium3dTilesStyleMixin.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
import { computed, makeObservable, override, runInAction, toJS } from "mobx";
2+
import clone from "terriajs-cesium/Source/Core/clone";
3+
import Color from "terriajs-cesium/Source/Core/Color";
14
import Cesium3DTileStyle from "terriajs-cesium/Source/Scene/Cesium3DTileStyle";
25
import AbstractConstructor from "../Core/AbstractConstructor";
36
import isDefined from "../Core/isDefined";
7+
import LoadableStratum, {
8+
LockedDownStratum
9+
} from "../Models/Definition/LoadableStratum";
410
import Model, { BaseModel } from "../Models/Definition/Model";
5-
import Cesium3dTilesTraits from "../Traits/TraitsClasses/Cesium3dTilesTraits";
6-
import clone from "terriajs-cesium/Source/Core/clone";
7-
import { computed, makeObservable, override, runInAction, toJS } from "mobx";
8-
import Color from "terriajs-cesium/Source/Core/Color";
9-
import LoadableStratum from "../Models/Definition/LoadableStratum";
1011
import StratumOrder from "../Models/Definition/StratumOrder";
12+
import Cesium3dTilesTraits from "../Traits/TraitsClasses/Cesium3dTilesTraits";
1113

12-
class Cesium3dTilesStyleStratum extends LoadableStratum(Cesium3dTilesTraits) {
14+
class Cesium3dTilesStyleStratum
15+
extends LoadableStratum(Cesium3dTilesTraits)
16+
implements LockedDownStratum<Cesium3dTilesTraits, Cesium3dTilesStyleStratum>
17+
{
1318
constructor(...args: any[]) {
1419
super(...args);
1520
makeObservable(this);

lib/ModelMixins/DiffableMixin.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { computed, makeObservable, override } from "mobx";
22
import JulianDate from "terriajs-cesium/Source/Core/JulianDate";
33
import AbstractConstructor from "../Core/AbstractConstructor";
4-
import LoadableStratum from "../Models/Definition/LoadableStratum";
4+
import LoadableStratum, {
5+
LockedDownStratum
6+
} from "../Models/Definition/LoadableStratum";
57
import Model, { BaseModel } from "../Models/Definition/Model";
68
import createStratumInstance from "../Models/Definition/createStratumInstance";
79
import { SelectableDimensionEnum } from "../Models/SelectableDimensions/SelectableDimensions";
@@ -10,9 +12,12 @@ import LegendTraits from "../Traits/TraitsClasses/LegendTraits";
1012
import MappableMixin from "./MappableMixin";
1113
import TimeFilterMixin from "./TimeFilterMixin";
1214

13-
export class DiffStratum extends LoadableStratum(DiffableTraits) {
15+
export class DiffStratum
16+
extends LoadableStratum(DiffableTraits)
17+
implements LockedDownStratum<DiffableTraits, DiffStratum>
18+
{
1419
static stratumName = "diffStratum";
15-
constructor(readonly catalogItem: DiffableMixin.Instance) {
20+
constructor(private readonly catalogItem: DiffableMixin.Instance) {
1621
super();
1722
makeObservable(this);
1823
}
@@ -37,7 +42,7 @@ export class DiffStratum extends LoadableStratum(DiffableTraits) {
3742
}
3843

3944
@computed
40-
get diffLegendUrl() {
45+
private get diffLegendUrl() {
4146
const diffStyleId = this.catalogItem.diffStyleId;
4247
const firstDate = this.catalogItem.firstDiffDate;
4348
const secondDate = this.catalogItem.secondDiffDate;

lib/ModelMixins/DiscretelyTimeVaryingMixin.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@ export interface AsJulian {
2121
tag: string;
2222
}
2323

24-
export interface DiscreteTimeAsJS {
25-
time: string;
26-
tag: string | undefined;
27-
}
28-
2924
function DiscretelyTimeVaryingMixin<
3025
T extends AbstractConstructor<Model<DiscretelyTimeVaryingTraits>>
3126
>(Base: T) {
@@ -41,7 +36,6 @@ function DiscretelyTimeVaryingMixin<
4136
get hasDiscreteTimes() {
4237
return true;
4338
}
44-
abstract get discreteTimes(): DiscreteTimeAsJS[] | undefined;
4539

4640
@override
4741
get currentTime(): string | undefined {
@@ -100,19 +94,20 @@ function DiscretelyTimeVaryingMixin<
10094
@computed
10195
get discreteTimesAsSortedJulianDates(): AsJulian[] | undefined {
10296
const discreteTimes = this.discreteTimes;
103-
if (discreteTimes === undefined) {
97+
if (discreteTimes === undefined || discreteTimes.times === undefined) {
10498
return undefined;
10599
}
106100

107101
const asJulian: AsJulian[] = [];
108-
for (let i = 0; i < discreteTimes.length; i++) {
109-
const dt = discreteTimes[i];
102+
for (let i = 0; i < discreteTimes.times.length; i++) {
103+
const timeString = this.discreteTimes.times[i];
104+
const tag = this.discreteTimes.tags?.[i];
110105
try {
111-
if (dt.time !== undefined) {
112-
const time = JulianDate.fromIso8601(dt.time);
106+
if (timeString !== undefined) {
107+
const time = JulianDate.fromIso8601(timeString);
113108
asJulian.push({
114109
time,
115-
tag: dt.tag !== undefined ? dt.tag : dt.time
110+
tag: tag ?? timeString
116111
});
117112
}
118113
} catch {}

lib/ModelMixins/ExportWebCoverageServiceMixin.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import proxyCatalogItemUrl from "../Models/Catalog/proxyCatalogItemUrl";
1515
import ResultPendingCatalogItem from "../Models/Catalog/ResultPendingCatalogItem";
1616
import CommonStrata from "../Models/Definition/CommonStrata";
1717
import createStratumInstance from "../Models/Definition/createStratumInstance";
18-
import LoadableStratum from "../Models/Definition/LoadableStratum";
18+
import LoadableStratum, {
19+
LockedDownStratum
20+
} from "../Models/Definition/LoadableStratum";
1921
import Model, { BaseModel } from "../Models/Definition/Model";
2022
import StratumOrder from "../Models/Definition/StratumOrder";
2123
import UserDrawing from "../Models/UserDrawing";
@@ -46,9 +48,14 @@ type Coverage = {
4648
*
4749
* Note: not currently used
4850
*/
49-
class WebCoverageServiceCapabilitiesStratum extends LoadableStratum(
50-
ExportWebCoverageServiceTraits
51-
) {
51+
class WebCoverageServiceCapabilitiesStratum
52+
extends LoadableStratum(ExportWebCoverageServiceTraits)
53+
implements
54+
LockedDownStratum<
55+
ExportWebCoverageServiceTraits,
56+
WebCoverageServiceCapabilitiesStratum
57+
>
58+
{
5259
static stratumName = "wcsCapabilitiesStratum";
5360

5461
static async load(catalogItem: ExportWebCoverageServiceMixin.Instance) {
@@ -87,8 +94,8 @@ class WebCoverageServiceCapabilitiesStratum extends LoadableStratum(
8794
}
8895

8996
constructor(
90-
readonly catalogItem: ExportWebCoverageServiceMixin.Instance,
91-
readonly capabilities: {
97+
private readonly catalogItem: ExportWebCoverageServiceMixin.Instance,
98+
private readonly capabilities: {
9299
coverages: Coverage[];
93100
formats: string[];
94101
crs: string[];

lib/ModelMixins/GeojsonMixin.ts

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ import CatalogMemberMixin from "../ModelMixins/CatalogMemberMixin";
7575
import UrlMixin from "../ModelMixins/UrlMixin";
7676
import proxyCatalogItemUrl from "../Models/Catalog/proxyCatalogItemUrl";
7777
import createStratumInstance from "../Models/Definition/createStratumInstance";
78-
import LoadableStratum from "../Models/Definition/LoadableStratum";
78+
import LoadableStratum, {
79+
LockedDownStratum
80+
} from "../Models/Definition/LoadableStratum";
7981
import Model, { BaseModel } from "../Models/Definition/Model";
8082
import StratumOrder from "../Models/Definition/StratumOrder";
8183
import TerriaFeature from "../Models/Feature/Feature";
@@ -85,10 +87,10 @@ import TableStylingWorkflow from "../Models/Workflows/TableStylingWorkflow";
8587
import createLongitudeLatitudeFeaturePerRow from "../Table/createLongitudeLatitudeFeaturePerRow";
8688
import TableAutomaticStylesStratum from "../Table/TableAutomaticStylesStratum";
8789
import TableStyle, { createRowGroupId } from "../Table/TableStyle";
90+
import { DiscreteTimesTraits } from "../Traits/TraitsClasses/DiscretelyTimeVaryingTraits";
8891
import { GeoJsonTraits } from "../Traits/TraitsClasses/GeoJsonTraits";
8992
import { RectangleTraits } from "../Traits/TraitsClasses/MappableTraits";
9093
import StyleTraits from "../Traits/TraitsClasses/StyleTraits";
91-
import { DiscreteTimeAsJS } from "./DiscretelyTimeVaryingMixin";
9294
import { ExportData } from "./ExportableMixin";
9395
import FeatureInfoUrlTemplateMixin from "./FeatureInfoUrlTemplateMixin";
9496
import { isDataSource } from "./MappableMixin";
@@ -112,7 +114,10 @@ const SIMPLE_STYLE_KEYS = [
112114
"fill-opacity"
113115
];
114116

115-
class GeoJsonStratum extends LoadableStratum(GeoJsonTraits) {
117+
class GeoJsonStratum
118+
extends LoadableStratum(GeoJsonTraits)
119+
implements LockedDownStratum<GeoJsonTraits, GeoJsonStratum>
120+
{
116121
static stratumName = "geojson";
117122
constructor(private readonly _item: GeoJsonMixin.Instance) {
118123
super();
@@ -176,6 +181,39 @@ class GeoJsonStratum extends LoadableStratum(GeoJsonTraits) {
176181
return true;
177182
}
178183
}
184+
185+
@computed get discreteTimes() {
186+
if (this._item.readyData === undefined) {
187+
return undefined;
188+
}
189+
190+
// If we are using mvt (mapbox vector tiles / protomaps imagery provider) we use TableMixin.discreteTimes instead
191+
if (this._item.useTableStylingAndProtomaps) return undefined;
192+
193+
// If using timeProperty - get discrete times from that
194+
if (this._item.timeProperty) {
195+
const times: string[] = [];
196+
const tags: string[] = [];
197+
198+
for (let i = 0; i < this._item.readyData.features.length; i++) {
199+
const feature = this._item.readyData.features[i];
200+
if (
201+
feature.properties !== null &&
202+
feature.properties !== undefined &&
203+
feature.properties[this._item.timeProperty!] !== undefined
204+
) {
205+
times.push(
206+
new Date(
207+
`${feature.properties[this._item.timeProperty!]}`
208+
).toISOString()
209+
);
210+
tags.push(feature.properties[this._item.timeProperty!]);
211+
}
212+
}
213+
214+
return createStratumInstance(DiscreteTimesTraits, { tags, times });
215+
}
216+
}
179217
}
180218

181219
StratumOrder.addLoadStratum(GeoJsonStratum.stratumName);
@@ -1142,40 +1180,6 @@ function GeoJsonMixin<T extends AbstractConstructor<BaseType>>(Base: T) {
11421180
return dataSource;
11431181
}
11441182

1145-
@override
1146-
get discreteTimes(): DiscreteTimeAsJS[] | undefined {
1147-
if (this.readyData === undefined) {
1148-
return undefined;
1149-
}
1150-
1151-
// If we are using mvt (mapbox vector tiles / protomaps imagery provider) return TableMixin.discreteTimes
1152-
if (this.useTableStylingAndProtomaps) return super.discreteTimes;
1153-
1154-
// If using timeProperty - get discrete times from that
1155-
if (this.timeProperty) {
1156-
const discreteTimesMap: Map<string, DiscreteTimeAsJS> = new Map();
1157-
1158-
for (let i = 0; i < this.readyData.features.length; i++) {
1159-
const feature = this.readyData.features[i];
1160-
if (
1161-
feature.properties !== null &&
1162-
feature.properties !== undefined &&
1163-
feature.properties[this.timeProperty!] !== undefined
1164-
) {
1165-
const dt = {
1166-
time: new Date(
1167-
`${feature.properties[this.timeProperty!]}`
1168-
).toISOString(),
1169-
tag: feature.properties[this.timeProperty!]
1170-
};
1171-
discreteTimesMap.set(dt.tag, dt);
1172-
}
1173-
}
1174-
1175-
return Array.from(discreteTimesMap.values());
1176-
}
1177-
}
1178-
11791183
/**
11801184
* Transform feature properties into column-major format.
11811185
* This enables all TableMixin functionality - which is used for styling vector tiles.

lib/ModelMixins/TableMixin.ts

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ function TableMixin<T extends AbstractConstructor<BaseType>>(Base: T) {
445445

446446
return filterOutUndefined([
447447
// If time-series region mapping - show time points chart
448-
this.activeTableStyle.isRegions() && this.discreteTimes?.length
448+
this.activeTableStyle.isRegions() && this.discreteTimes?.times?.length
449449
? this.momentChart
450450
: undefined,
451451
...this.tableChartItems
@@ -693,33 +693,6 @@ function TableMixin<T extends AbstractConstructor<BaseType>>(Base: T) {
693693
return this.activeTableStyle.isSampled;
694694
}
695695

696-
@computed
697-
get discreteTimes():
698-
| { time: string; tag: string | undefined }[]
699-
| undefined {
700-
if (!this.activeTableStyle.moreThanOneTimeInterval) return;
701-
const dates = this.activeTableStyle.timeColumn?.valuesAsDates.values;
702-
if (dates === undefined) {
703-
return;
704-
}
705-
706-
// is it correct for discrete times to remove duplicates?
707-
// see discussion on https://github.com/TerriaJS/terriajs/pull/4577
708-
// duplicates will mess up the indexing problem as our `<DateTimePicker />`
709-
// will eliminate duplicates on the UI front, so given the datepicker
710-
// expects uniques, return uniques here
711-
const times = new Set<string>();
712-
713-
for (let i = 0; i < dates.length; i++) {
714-
const d = dates[i];
715-
if (d) {
716-
times.add(d.toISOString());
717-
}
718-
}
719-
720-
return Array.from(times).map((time) => ({ time, tag: undefined }));
721-
}
722-
723696
/** This is a temporary button which shows in the Legend in the Workbench, if custom styling has been applied. */
724697
@computed get legendButton() {
725698
return this.activeTableStyle.isCustom

0 commit comments

Comments
 (0)