Skip to content

Commit

Permalink
Fix reloading magda items
Browse files Browse the repository at this point in the history
  • Loading branch information
tephenavies committed Feb 28, 2024
1 parent ea20daa commit 84fb691
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 58 deletions.
136 changes: 79 additions & 57 deletions lib/Models/Catalog/CatalogReferences/MagdaReference.ts
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,12 @@ export default class MagdaReference extends AccessControlMixin(
}

if (isJsonObject(aspects.group) && Array.isArray(aspects.group.members)) {
// Create models for members. There are at least the following different cases:
// 1. The JSON can be used to create the full model, and it is a new model,
// or the same type as the previous model with the same id.
// 2. JSON used to create full model, but there is an existing model with a different type
// 3. No details to create full model, instead create MagdaReference
// 4. No details to create full model and a MagdaReference with its id exists, so update existing
const members = aspects.group.members;
const ids = members.map((member) => {
if (!isJsonObject(member) || !isJsonString(member.id)) {
Expand All @@ -423,7 +429,7 @@ export default class MagdaReference extends AccessControlMixin(
) as JsonObject | undefined;
}

let model = MagdaReference.createMemberFromRecord(
const model = MagdaReference.createMemberFromRecord(
terria,
undefined,
distributionFormats,
Expand All @@ -442,63 +448,74 @@ export default class MagdaReference extends AccessControlMixin(
shareKeys = member.aspects.terria.shareKeys.filter(isJsonString);
}

model = terria.getModelById(BaseModel, member.id)

if (!model) {
// Can't create an item or group yet, so create a reference.
model = new MagdaReference(member.id, terria, undefined);
terria.addModel(model, shareKeys);
}
if (
model instanceof MagdaReference &&
!(isDefined(model.url) && isDefined(model.recordId)) &&
!isDefined(model.magdaRecord)
) {
// MagdaReference has just been created, or comes from share data with
// not enough information to load itself
if (magdaUri) {
model.setTrait(CommonStrata.definition, "url", magdaUri.toString());
// Can't create an item or group yet, so create or update a reference.
let ref = terria.getModelById(MagdaReference, member.id);
if (!ref) {
ref = new MagdaReference(member.id, terria, undefined);
terria.addModel(ref, shareKeys);
}
model.setTrait(CommonStrata.definition, "recordId", memberId);

if (
isJsonObject(member.aspects, false) &&
isJsonObject(member.aspects.group, false)
!(isDefined(ref.url) && isDefined(ref.recordId)) &&
!isDefined(ref.magdaRecord)
) {
// This is most likely a group.
model.setTrait(CommonStrata.definition, "isGroup", true);
} else {
// This is most likely a mappable or chartable item.
model.setTrait(CommonStrata.definition, "isMappable", true);
model.setTrait(CommonStrata.definition, "isChartable", true);
// MagdaReference has just been created, or comes from share data with
// not enough information to load itself
if (magdaUri) {
ref.setTrait(CommonStrata.definition, "url", magdaUri.toString());
}
ref.setTrait(CommonStrata.definition, "recordId", memberId);

if (
isJsonObject(member.aspects, false) &&
isJsonObject(member.aspects.group, false)
) {
// This is most likely a group.
ref.setTrait(CommonStrata.definition, "isGroup", true);
} else {
// This is most likely a mappable or chartable item.
ref.setTrait(CommonStrata.definition, "isMappable", true);
ref.setTrait(CommonStrata.definition, "isChartable", true);
}

// Use the name from the terria aspect if there is one.
if (
isJsonObject(member.aspects, false) &&
isJsonObject(member.aspects.terria, false) &&
isJsonObject(member.aspects.terria.definition, false) &&
isJsonString(member.aspects.terria.definition.name)
) {
ref.setTrait(
CommonStrata.definition,
"name",
member.aspects.terria.definition.name
);
} else if (isJsonString(member.name)) {
ref.setTrait(CommonStrata.definition, "name", member.name);
}
}

// Use the name from the terria aspect if there is one.
if (
isJsonObject(member.aspects, false) &&
isJsonObject(member.aspects.terria, false) &&
isJsonObject(member.aspects.terria.definition, false) &&
isJsonString(member.aspects.terria.definition.name)
) {
model.setTrait(
CommonStrata.definition,
"name",
member.aspects.terria.definition.name
);
} else if (isJsonString(member.name)) {
model.setTrait(CommonStrata.definition, "name", member.name);
if (overriddenMember) {
ref.setTrait(CommonStrata.definition, "override", overriddenMember);
}
if (AccessControlMixin.isMixedInto(ref)) {
ref.setAccessType(getAccessTypeFromMagdaRecord(member));
}
}

if (overriddenMember) {
model.setTrait(CommonStrata.definition, "override", overriddenMember);
}

if (AccessControlMixin.isMixedInto(model)) {
model.setAccessType(getAccessTypeFromMagdaRecord(member));
return ref.uniqueId;
} else {
const prevModel = terria.getModelById(BaseModel, member.id);
if (prevModel === undefined || prevModel.type !== model.type) {
if (prevModel !== undefined) {
terria.removeModelReferences(prevModel);
prevModel.dispose();
}
terria.addModel(model, shareKeys);
}
if (AccessControlMixin.isMixedInto(model)) {
model.setAccessType(getAccessTypeFromMagdaRecord(member));
}
return model.uniqueId;
}

return model.uniqueId;
});

if (isJsonString(record.name)) {
Expand Down Expand Up @@ -579,17 +596,16 @@ export default class MagdaReference extends AccessControlMixin(
result.setTrait(magdaRecordStratum, "name", record.name);
}

Object.keys(terriaAspect).forEach((key) => {
const terriaStratum = terriaAspect[key];
Object.entries(terriaAspect).forEach(([stratumName, stratum]) => {
if (
key === "id" ||
key === "type" ||
key === "shareKeys" ||
!isJsonObject(terriaStratum, false)
stratumName === "id" ||
stratumName === "type" ||
stratumName === "shareKeys" ||
!isJsonObject(stratum, false)
) {
return;
}
updateModelFromJson(result, key, terriaStratum, true).catchError(
updateModelFromJson(result, stratumName, stratum, true).catchError(
(error) => {
error.log();
result.setTrait(CommonStrata.underride, "isExperiencingIssues", true);
Expand All @@ -606,6 +622,12 @@ export default class MagdaReference extends AccessControlMixin(
).logError();
}

if (terria.workbench.contains(result)) {
// Reload after updating traits
// Adding an item already in the workbench does all relevant loading, but doesn't change the workbench
terria.workbench.add(result).then(res => res.raiseError(terria));
}

return result;
}

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "terriajs",
"version": "8.5.1-magda-reload",
"version": "8.5.1-magda-reload-2",
"description": "Geospatial data visualization platform.",
"license": "Apache-2.0",
"engines": {
Expand Down

0 comments on commit 84fb691

Please sign in to comment.