Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Merge pull request #57 from endeavourhealth-discovery/dynamic-editor
Browse files Browse the repository at this point in the history
Dynamic editor
  • Loading branch information
matt-voror authored Aug 24, 2022
2 parents 2b7fc1c + 813d65a commit 587f158
Show file tree
Hide file tree
Showing 21 changed files with 473 additions and 258 deletions.
3 changes: 2 additions & 1 deletion src/config/Config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import DefaultPredicateNames from "./modules/DefaultPredicateNames";
import EntityTypes from "./modules/EntityTypes";
import FilterDefaults from "./modules/FilterDefaults";
import GraphExcludePredicates from "./modules/GraphExcludePredicates";
import TextDefinitionExcludePredicates from "./modules/TextDefinitionExcludePredicates";
import XmlSchemaDatatypes from "./modules/XmlSchemaDatatypes";

export { DefaultPredicateNames, FilterDefaults, GraphExcludePredicates, TextDefinitionExcludePredicates, XmlSchemaDatatypes };
export { DefaultPredicateNames, EntityTypes, FilterDefaults, GraphExcludePredicates, TextDefinitionExcludePredicates, XmlSchemaDatatypes };
8 changes: 8 additions & 0 deletions src/config/modules/EntityTypes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { IM } from "../../vocabulary/IM";
import { SHACL } from "../../vocabulary/SHACL";
import { RDFS } from "../../vocabulary/RDFS";
import { RDF } from "../../vocabulary/RDF";

const ENTITY_TYPES = [IM.CONCEPT, IM.VALUE_SET, IM.CONCEPT_SET, SHACL.NODESHAPE, IM.DATAMODEL_PROPERTY, IM.QUERY, RDFS.CLASS, RDF.PROPERTY, IM.FOLDER];

export default [...ENTITY_TYPES];
3 changes: 2 additions & 1 deletion src/enums/Enums.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { BuilderType } from "./modules/BuilderType";
import { ComponentType } from "./modules/ComponentType";
import { ECLComponent } from "./modules/ECLComponent";
import { EditorMode } from "./modules/EditorMode";
import { PasswordStrength } from "./modules/PasswordStrength";
import { QueryComponentType } from "./modules/QueryComponentType";
import { SortBy } from "./modules/SortBy";
import { SortDirection } from "./modules/SortDirection";

export { BuilderType, ComponentType, ECLComponent, PasswordStrength, QueryComponentType, SortBy, SortDirection };
export { BuilderType, ComponentType, ECLComponent, EditorMode, PasswordStrength, QueryComponentType, SortBy, SortDirection };
14 changes: 13 additions & 1 deletion src/enums/modules/ComponentType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,17 @@ export enum ComponentType {
HAS_MEMBER = "HasMember",
REFINEMENT = "Refinement",
QUANTIFIER = "Quantifier",
PROPERTY = "Property"
PROPERTY = "Property",
STEPS_GROUP = "StepsGroup",
ARRAY_BUILDER = "ArrayBuilder",
ENTITY_COMBOBOX = "EntityComboBox",
ENTITY_MULTI_SEARCH = "EntityMultiSearch",
ENTITY_DROPDOWN = "EntityDropdown",
HTML_INPUT = "HtmlInput",
TEXT_DISPLAY = "TextDisplay",
TEXT_INPUT = "TextInput",
ENTITY_SEARCH = "EntitySearch",
BUILDER_CHILD_WRAPPER = "BuilderChildWrapper",
ENTITY_AUTO_COMPLETE = "EntityAutoComplete",
MEMBERS_BUILDER = "MembersBuilder"
}
6 changes: 6 additions & 0 deletions src/enums/modules/EditorMode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export enum EditorMode {
EDIT = "edit",
CREATE = "create",
MAP = "map",
QUERY = "query"
}
2 changes: 2 additions & 0 deletions src/helpers/Helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Sorters from "./modules/Sorters";
import Transforms from "./modules/Transforms";
import UserMethods from "./modules/UserMethods";
import EditorBuilderJsonMethods from "./modules/EditorBuilderJsonMethods";
import EditorMethods from "./modules/EditorMethods";
import TypeGuards from "./modules/TypeGuards";
import EntityValidator from "./modules/EntityValidator";
import EclSearchBuilderMethods from "./modules/EclSearchBuilderMethods.ts";
Expand All @@ -21,6 +22,7 @@ export default {
CopyConceptToClipboard,
DataTypeCheckers,
ContainerDimensionGetters,
EditorMethods,
GraphTranslator,
Sorters,
Transforms,
Expand Down
130 changes: 37 additions & 93 deletions src/helpers/modules/EditorBuilderJsonMethods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,100 +2,36 @@ import { BuilderType } from "../../enums/modules/BuilderType";
import { ComponentDetails } from "../../interfaces/modules/ComponentDetails";
import { ComponentType } from "../../enums/modules/ComponentType";
import { NextComponentSummary } from "../../interfaces/modules/NextComponentSummary";
import { PropertyGroup, PropertyShape } from "../../interfaces/Interfaces";
import { EditorMode } from "../../enums/Enums";

export function generateNewComponent(
type: ComponentType,
position: number,
data: any,
builderType: BuilderType,
showButtons: { minus: boolean; plus: boolean }
) {
let result;
switch (type) {
case ComponentType.LOGIC:
result = {
id: ComponentType.LOGIC + "_" + position,
value: data,
position: position,
type: ComponentType.LOGIC,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
case ComponentType.ENTITY:
result = {
id: ComponentType.ENTITY + "_" + position,
value: data,
position: position,
type: ComponentType.ENTITY,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
case ComponentType.QUANTIFIER:
result = {
id: ComponentType.QUANTIFIER + "_" + position,
value: data,
position: position,
type: ComponentType.QUANTIFIER,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
case ComponentType.REFINEMENT:
result = {
id: ComponentType.REFINEMENT + "_" + position,
value: data,
position: position,
type: ComponentType.REFINEMENT,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
case ComponentType.PROPERTY:
result = {
id: ComponentType.PROPERTY + "_" + position,
value: data,
position: position,
type: ComponentType.PROPERTY,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
case ComponentType.DEFINITION:
result = {
id: ComponentType.DEFINITION + "_" + position,
value: data,
position: position,
type: ComponentType.DEFINITION,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
case ComponentType.HAS_MEMBER:
result = {
id: ComponentType.HAS_MEMBER + "_" + position,
value: data,
position: position,
type: ComponentType.HAS_MEMBER,
json: {},
builderType: builderType,
showButtons: showButtons
};
break;
default:
throw new Error(`helper function generateNewComponent encountered an unexpected component type: ${type}`);
}
return result;
shape: PropertyShape | PropertyGroup,
showButtons: { minus: boolean; plus: boolean },
mode: EditorMode
): ComponentDetails {
return {
id: type + "_" + position,
value: data,
position: position,
type: type,
json: {},
showButtons: showButtons,
shape: shape,
mode: mode
};
}

export function genNextOptions(position: number, previous: ComponentType, builderType: BuilderType, group?: ComponentType): ComponentDetails {
export function genNextOptions(
position: number,
previous: ComponentType,
shape: PropertyGroup | PropertyShape,
mode: EditorMode,
group?: ComponentType
): ComponentDetails {
return {
id: "addNext_" + (position + 1),
value: {
Expand All @@ -106,7 +42,8 @@ export function genNextOptions(position: number, previous: ComponentType, builde
position: position + 1,
type: ComponentType.ADD_NEXT,
json: {},
builderType: builderType
shape: shape,
mode: mode
};
}

Expand All @@ -121,11 +58,17 @@ export function updateItem(itemToUpdate: ComponentDetails, build: ComponentDetai
build[index] = itemToUpdate;
}

export function addNextOptions(previousComponent: NextComponentSummary, build: ComponentDetails[], builderType: BuilderType): ComponentDetails {
export function addNextOptions(
previousComponent: NextComponentSummary,
build: ComponentDetails[],
shape: PropertyGroup | PropertyShape,
mode: EditorMode
): ComponentDetails {
const nextOptionsComponent = genNextOptions(
previousComponent.previousPosition,
previousComponent.previousComponentType,
builderType,
shape,
mode,
previousComponent.parentGroup
);
if (previousComponent.previousPosition !== build.length - 1 && build[previousComponent.previousPosition + 1].type === ComponentType.ADD_NEXT) {
Expand All @@ -145,10 +88,11 @@ export function scrollIntoView(component: ComponentDetails) {
export function addItem(
itemToAdd: { selectedType: ComponentType; position: number; value: any },
build: ComponentDetails[],
builderType: BuilderType,
showButtons: { minus: boolean; plus: boolean }
showButtons: { minus: boolean; plus: boolean },
shape: PropertyGroup | PropertyShape,
mode: EditorMode
) {
const newComponent = generateNewComponent(itemToAdd.selectedType, itemToAdd.position, itemToAdd.value, builderType, showButtons);
const newComponent = generateNewComponent(itemToAdd.selectedType, itemToAdd.position, itemToAdd.value, shape, showButtons, mode);
if (!newComponent) return;
build.splice(itemToAdd.position, 0, newComponent);
updatePositions(build);
Expand Down
49 changes: 49 additions & 0 deletions src/helpers/modules/EditorMethods.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { ComponentType } from "../../enums/Enums";
import { PropertyShape, TTIriRef } from "../../interfaces/Interfaces";
import { IM } from "../../vocabulary/IM";

export function processArguments(property: PropertyShape, valueVariableMap?: Map<string, any>) {
const result = new Map<string, any>();
property.argument.forEach(arg => {
let key = "";
let value: any;
if (arg.parameter === "this" && !arg.valueIri) key = property.path["@id"];
else key = arg.parameter;
if (arg.valueIri) value = arg.valueIri["@id"];
else if (arg.valueVariable) {
if (!valueVariableMap) throw new Error("missing valueVariableMap while processing arguments with a valueProperty");
if (property.builderChild && valueVariableMap && valueVariableMap.has(arg.valueVariable + property.order)) {
value = valueVariableMap.get(arg.valueVariable + property.order);
} else {
value = valueVariableMap.get(arg.valueVariable);
}
} else if (arg.valueText) value = arg.valueText;
result.set(key, value);
});
return result;
}

function processComponentType(type: TTIriRef): any {
switch (type["@id"]) {
case IM.TEXT_DISPLAY_COMPONENT:
return ComponentType.TEXT_DISPLAY;
case IM.TEXT_INPUT_COMPONENT:
return ComponentType.TEXT_INPUT;
case IM.HTML_INPUT_COMPONENT:
return ComponentType.HTML_INPUT;
case IM.ARRAY_BUILDER_COMPONENT:
return ComponentType.ARRAY_BUILDER;
case IM.ENTITY_SEARCH_COMPONENT:
return ComponentType.ENTITY_SEARCH;
case IM.ENTITY_COMBOBOX_COMPONENT:
return ComponentType.ENTITY_COMBOBOX;
case IM.ENTITY_DROPDOWN_COMPONENT:
return ComponentType.ENTITY_DROPDOWN;
case IM.ENTITY_AUTO_COMPLETE_COMPONENT:
return ComponentType.ENTITY_AUTO_COMPLETE;
default:
throw new Error("Invalid component type encountered in shape group" + type["@id"]);
}
}

export default { processArguments, processComponentType };
11 changes: 10 additions & 1 deletion src/helpers/modules/Transforms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,20 @@ function removeGroupNumber(arr: any[]) {
}
}

export function mapToObject(args: Map<any, any>) {
const argsAsObject = {} as any;
args.forEach((value, key) => {
argsAsObject[key] = value;
});
return argsAsObject;
}

export default {
bundleToText,
ttArrayToString,
ttIriToString,
ttNodeToString,
ttValueToString,
termToString
termToString,
mapToObject
};
16 changes: 14 additions & 2 deletions src/helpers/modules/TypeGuards.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TTBundle, TTIriRef } from "../../interfaces/Interfaces";
import { PropertyGroup, PropertyShape, TTBundle, TTIriRef } from "../../interfaces/Interfaces";

export function isTTIriRef(data: any): data is TTIriRef {
if (data && (data as TTIriRef)["@id"]) return true;
Expand All @@ -10,7 +10,19 @@ export function isTTBundle(data: any): data is TTBundle {
return false;
}

export function isPropertyGroup(data: any): data is PropertyGroup {
if (data && ((data as PropertyGroup).subGroup || (data as PropertyGroup).property)) return true;
return false;
}

export function isPropertyShape(data: any): data is PropertyShape {
if (data && (data as PropertyShape).path) return true;
return false;
}

export default {
isTTIriRef,
isTTBundle
isTTBundle,
isPropertyGroup,
isPropertyShape
};
8 changes: 8 additions & 0 deletions src/interfaces/Interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { EntityReferenceNode } from "./modules/EntityReferenceNode";
import { ExportValueSet } from "./modules/ExportValueSet";
import { FilterDefaultsConfig } from "./modules/FilterDefaultsConfig";
import { FiltersAsIris } from "./modules/FiltersAsIris";
import { FormGenerator } from "./modules/FormGenerator";
import GraphData from "./modules/GraphData";
import { HistoryItem } from "./modules/HistoryItem";
import { InstanceHistoryItem } from "./modules/InstanceHistoryItem";
Expand All @@ -29,8 +30,11 @@ import { ModuleItem } from "./modules/ModuleItem";
import { Namespace } from "./modules/Namespace";
import { NextComponentSummary } from "./modules/NextComponentSummary";
import { ProcessedDataModelProperty } from "./modules/ProcessedDataModelProperty";
import { PropertyGroup } from "./modules/PropertyGroup";
import { PropertyShape } from "./modules/PropertyShape";
import { QueryComponentDetails } from "./modules/QueryComponentDetails";
import { QueryNextComponentSummary } from "./modules/QueryNextComponentSummary";
import { QueryRequest } from "./modules/QueryRequest";
import { RecentActivityItem } from "./modules/RecentActivityItem";
import { SearchRequest } from "./modules/SearchRequest";
import { SearchResponse } from "./modules/SearchResponse";
Expand Down Expand Up @@ -66,6 +70,7 @@ export {
type ExportValueSet,
type FilterDefaultsConfig,
type FiltersAsIris,
type FormGenerator,
type GraphData,
type HistoryItem,
type InstanceHistoryItem,
Expand All @@ -80,8 +85,11 @@ export {
type Namespace,
type NextComponentSummary,
type ProcessedDataModelProperty,
type PropertyGroup,
type PropertyShape,
type QueryComponentDetails,
type QueryNextComponentSummary,
type QueryRequest,
type RecentActivityItem,
type SearchRequest,
type SearchResponse,
Expand Down
6 changes: 5 additions & 1 deletion src/interfaces/modules/ComponentDetails.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { EditorMode } from "../../enums/Enums";
import { BuilderType } from "../../enums/modules/BuilderType";
import { ComponentType } from "../../enums/modules/ComponentType";
import { PropertyGroup } from "./PropertyGroup";
import { PropertyShape } from "./PropertyShape";

export interface ComponentDetails {
id: string;
value: any;
position: number;
type: ComponentType;
json: any;
builderType: BuilderType;
showButtons?: { minus: boolean; plus: boolean };
shape: PropertyShape | PropertyGroup;
mode: EditorMode;
}
Loading

0 comments on commit 587f158

Please sign in to comment.