{
- this.objectUrls = [res[0]];
- });
-
this.token = this.$store.state.token.token;
}
+ selectChanged(property: string) {
+ if (property === "materials") {
+ this.gradientColorProperty = null;
+ this.colors = [];
+ this.colors = this.materialColors;
+ } else if (property === "none") {
+ this.colors = [];
+ } else {
+ this.colors = [];
+ this.gradientColorProperty = {
+ property,
+ };
+ }
+ }
+
+ rendererLoaded() {
+ // this.gradientColorProperty = {
+ // property: "parameters.Total Carbon.value",
+ // };
+ this.colors = this.materialColors;
+ }
+
back() {
this.$router.push(`/${this.streamId}`);
}
@@ -91,13 +120,33 @@ export default class ViewAssessment extends Vue {
this.error = false;
try {
const { streamId, branchName } = this.$route.params;
- const input: LoadActReportDataInput = { streamId, branchName };
+ const input: LoadActReportDataInput = {
+ streamId,
+ branchName,
+ loadChildren: true,
+ };
const assessmentViewData: LoadStreamOut = await this.$store.dispatch(
"loadActReportData",
input
);
+ if (assessmentViewData.version === "v1") {
+ this.isV1 = true;
+ this.$store
+ .dispatch("getObjectUrls", this.streamId)
+ .then((res: string[]) => {
+ this.objectUrls = [res[0]];
+ this.colors = assessmentViewData.colors;
+ });
+ } else {
+ this.objectUrls = [
+ `${this.$store.state.selectedServer.url}/streams/${streamId}/objects/${assessmentViewData.data.modelId}`,
+ ];
+ this.materialColors = assessmentViewData.colors.map((c) => ({
+ ...c,
+ id: assessmentViewData.data.idMapper[c.id],
+ }));
+ }
this.assessment = assessmentViewData.data;
- this.colors = assessmentViewData.colors;
this.chartDataReady = assessmentViewData.ready;
this.loading = false;
} catch (err) {
diff --git a/src/views/utils/add-params/addParams.ts b/src/views/utils/add-params/addParams.ts
new file mode 100644
index 00000000..88fc3222
--- /dev/null
+++ b/src/views/utils/add-params/addParams.ts
@@ -0,0 +1,265 @@
+import { getChildren } from "../process-report-object/utils";
+
+interface IReferences {
+ [reference: string]: {
+ referencedId: string;
+ speckle_type: "reference";
+ }[];
+}
+
+export interface IParamsParent {
+ id: string;
+ __closure: {
+ [keys: string]: number;
+ };
+ [key: string]:
+ | ReferenceObject[]
+ | string
+ | {
+ [keys: string]: number;
+ };
+}
+
+interface ReferenceObject {
+ referencedId: string;
+ speckle_type: "reference";
+}
+
+interface Topology {
+ restraint: ReferenceObject;
+ constraintAxis: ReferenceObject;
+}
+
+export interface IChildObject {
+ id: string;
+ speckle_type: string;
+ __closure: {
+ [key: string]: number;
+ };
+ parameters: {
+ [key: string]: Param;
+ };
+ displayValue?: ReferenceObject[] | ReferenceObject;
+ materialQuantities?: {
+ material: {
+ id: string;
+ };
+ }[];
+ faces?: ReferenceObject[];
+ vertices?: ReferenceObject[];
+ elements?: ReferenceObject[];
+ topology?: Topology[];
+}
+
+function instanceOfReferenceObject(object: any): object is ReferenceObject {
+ return (
+ "referencedId" in object &&
+ "speckle_type" in object &&
+ object.speckle_type === "reference"
+ );
+}
+
+export interface IdMapper {
+ [oldId: string]: string;
+}
+
+export interface ParamAdd {
+ parentid: string;
+ name: string;
+ param: Param;
+}
+
+interface Param {
+ id: string;
+ name: string;
+ units: string | null;
+ value: any;
+ isShared: boolean;
+ isReadOnly: boolean;
+ speckle_type: "Objects.BuiltElements.Revit.Parameter";
+ applicationId: string | null;
+ applicationUnit: string | null;
+ isTypeParameter: boolean;
+ totalChildrenCount: number;
+ applicationUnitType: string;
+ applicationInternalName: string;
+}
+
+export interface AddParamsModel {
+ parent: IParamsParent;
+ children: IChildObject[];
+ idMapper: IdMapper;
+}
+
+export async function testRun(url: string, token: string, params: ParamAdd[]) {
+ const streamid = "465e7157fe";
+ const parentObjId = "6607c6f15e6057fee92585125a9d015a";
+ const parent: IParamsParent = await fetch(
+ `${url}/objects/${streamid}/${parentObjId}/single`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ },
+ }
+ ).then((d) => d.json());
+
+ const res = await addParams(parent, params, url, token, streamid);
+
+ const formData = new FormData();
+ formData.append(
+ "batch1",
+ new Blob([JSON.stringify([res.parent, ...res.children])])
+ );
+ await fetch(`${url}/objects/${streamid}`, {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ body: formData,
+ });
+}
+
+export async function addParams(
+ parent: IParamsParent,
+ params: ParamAdd[],
+ url: string,
+ token: string,
+ streamId: string,
+ childObjects?: IChildObject[]
+): Promise
{
+ // inputs:
+ // parent. parent object
+ // params. array of id's and the params to add to those id's
+
+ // 1. loop through all child id's and generate new id and dictionary to convert
+ const idMapper: IdMapper = {}; // key = oldId, value = new id
+ const childIds = Object.keys(parent.__closure);
+ childIds.forEach((id) => {
+ idMapper[id] = `${id}-${new Date().getTime().toString()}-act`;
+ });
+ const newParentId = `${parent.id}-${new Date().getTime().toString()}-act`;
+
+ // 2. get all the child objects (full objects, not just reference id's)
+ if (!childObjects) {
+ childObjects = await getChildren(
+ url,
+ token,
+ streamId,
+ parent
+ );
+ }
+
+ // 3. go through each child object, updating id's and adding new params where they should be added
+ const newChildObjects: IChildObject[] = childObjects.map((child) => {
+ const initialChildId = child.id;
+ let returnObj: IChildObject;
+ // if an object has no values in __closure (or the property doesn't exist) then don't need to convert object as there will be no chlidren
+ if (
+ child.__closure !== undefined &&
+ Object.keys(child.__closure).length > 0
+ ) {
+ returnObj = convertObj(child, idMapper);
+ } else {
+ returnObj = child;
+ }
+ returnObj.id = idMapper[initialChildId];
+
+ // add new parameters if needed
+ params.forEach((p) => {
+ if (p.parentid === initialChildId) {
+ returnObj.parameters = {
+ ...returnObj.parameters,
+ [p.name]: p.param,
+ };
+ }
+ });
+
+ // update closure to new id's
+ const newClosure: { [key: string]: number } = {};
+ if (returnObj.__closure) {
+ Object.entries(returnObj.__closure).forEach(([key, value]) => {
+ if (idMapper[key]) {
+ newClosure[idMapper[key]] = value;
+ } else {
+ newClosure[key] = value;
+ }
+ });
+ }
+ returnObj.__closure = newClosure;
+
+ return returnObj;
+ });
+
+ // 4. create and update new parent object
+ // add new id
+ const newParentObj: IParamsParent = {
+ ...parent,
+ id: newParentId,
+ };
+
+ // update __closure to new child id's
+ const newClosure: { [key: string]: number } = {};
+ Object.entries(newParentObj.__closure).forEach(([key, value]) => {
+ if (idMapper[key]) {
+ newClosure[idMapper[key]] = value;
+ } else {
+ newClosure[key] = value;
+ }
+ });
+ newParentObj.__closure = newClosure;
+
+ // update all reference fields (fields that start with an @)
+ Object.keys(newParentObj).forEach((key) => {
+ if (key.startsWith("@")) {
+ const records = newParentObj[key] as ReferenceObject[];
+ const newRecords = records.map((r) => ({
+ ...r,
+ referencedId: idMapper[r.referencedId],
+ }));
+ newParentObj[key] = newRecords;
+ }
+ });
+
+ return {
+ parent: newParentObj,
+ children: newChildObjects,
+ idMapper: idMapper,
+ };
+}
+
+function convertObj(obj: any, idMapper: IdMapper) {
+ if (instanceOfReferenceObject(obj))
+ return {
+ ...obj,
+ referencedId: idMapper[obj.referencedId],
+ };
+ else if (Array.isArray(obj)) {
+ // do some stuff
+ return handleArray(obj, idMapper);
+ } else if (typeof obj === "object") {
+ // do some different stuff
+ Object.keys(obj).forEach((k) => {
+ if (Array.isArray(obj[k])) {
+ // do same stuff as above
+ obj[k] = handleArray(obj[k], idMapper);
+ } else if (typeof obj[k] === "object" && obj[k] !== null) {
+ obj[k] = convertObj(obj[k], idMapper);
+ }
+ });
+ return obj;
+ } else {
+ return obj;
+ }
+}
+
+function handleArray(arr: any[], idMapper: IdMapper) {
+ return arr.map((a) => {
+ if (Array.isArray(a)) a = handleArray(a, idMapper);
+ else if (typeof a === "object") {
+ a = convertObj(a, idMapper);
+ }
+ return a;
+ });
+}
diff --git a/src/views/utils/process-report-object/index.ts b/src/views/utils/process-report-object/index.ts
new file mode 100644
index 00000000..27158757
--- /dev/null
+++ b/src/views/utils/process-report-object/index.ts
@@ -0,0 +1,4 @@
+export * from "./loadReportObjectV1";
+export * from "./loadReportObjectV2";
+export * from "./models";
+export * from "./utils";
diff --git a/src/views/utils/process-report-object/loadReportObjectV1.ts b/src/views/utils/process-report-object/loadReportObjectV1.ts
new file mode 100644
index 00000000..f97787e8
--- /dev/null
+++ b/src/views/utils/process-report-object/loadReportObjectV1.ts
@@ -0,0 +1,170 @@
+import { ActReportData, HTTPStreamDataParent } from "@/models/graphql/";
+import {
+ ChildSpeckleObjectData,
+ HTTPStreamDataParentV1,
+} from "@/models/graphql/StreamData.interface";
+import { Color } from "@/models/renderer";
+import {
+ IABreakdown,
+ IMaterialBreakdown,
+ IProjectInfo,
+ LoadStreamOut,
+} from "./models";
+import { getChildren } from "./utils";
+import * as speckleUtil from "../../../store/speckle/speckleUtil";
+import { IdMapper } from "../add-params/addParams";
+
+export async function calcV1(
+ branchData: HTTPStreamDataParentV1,
+ actReportBranchInfo: ActReportData,
+ context: any,
+ streamId: string
+): Promise {
+ const projectInfoUpdated: IProjectInfo = {
+ name: branchData.projectData.name,
+ components: branchData.projectData.components,
+ reportDate: new Date(
+ actReportBranchInfo.data.stream.branch.commits.items[0].createdAt
+ ),
+ author: actReportBranchInfo.data.stream.branch.commits.items[0].authorName,
+ jobNumber: branchData.projectData.jobNumber,
+ cost: branchData.projectData.cost,
+ floorArea: branchData.projectData.floorArea,
+ notes: branchData.projectData.notes,
+ totalCO2e: Math.round((branchData.totalCO2 / 1000) * 100) / 100,
+ totalkgCO2e: Math.floor(branchData.totalCO2),
+ region: branchData.projectData.region,
+ volume: branchData.volume,
+ };
+
+ const childrenData = await getChildren(
+ context.state.selectedServer.url,
+ context.state.token.token,
+ streamId,
+ branchData
+ );
+
+ const co2Data = extractCo2Data(branchData, childrenData);
+
+ const levelsUpdated: IABreakdown = co2Data.levels;
+
+ const materialBreakdownUpdated: IMaterialBreakdown = {
+ materials: co2Data.materials,
+ };
+
+ levelsUpdated.levels[0].kgCO2eperm2 = Math.ceil(
+ levelsUpdated.levels[0].kgCO2eperm2
+ );
+ levelsUpdated.levels[0].tCO2e =
+ Math.ceil(levelsUpdated.levels[0].tCO2e * 100) / 100;
+ levelsUpdated.levels[1].kgCO2eperm2 = Math.ceil(
+ levelsUpdated.levels[1].kgCO2eperm2
+ );
+ levelsUpdated.levels[1].tCO2e =
+ Math.ceil(levelsUpdated.levels[1].tCO2e * 100) / 100;
+ levelsUpdated.levels[2].kgCO2eperm2 = Math.ceil(
+ levelsUpdated.levels[2].kgCO2eperm2
+ );
+ levelsUpdated.levels[2].tCO2e =
+ Math.ceil(levelsUpdated.levels[2].tCO2e * 100) / 100;
+
+ const objectIds = await speckleUtil.getStreamObjects(context, streamId);
+ const modelId = objectIds.data.stream.branch.commits.items[0].referencedObject;
+
+ return {
+ ready: true,
+ colors: co2Data.colors,
+ version: "v1",
+ parentId: branchData.id,
+ data: {
+ streamId: streamId,
+ modelId,
+ projectInfo: projectInfoUpdated,
+ materialBreakdown: materialBreakdownUpdated,
+ aBreakdown: levelsUpdated,
+ children: childrenData,
+ idMapper: {} as IdMapper,
+ selectedObjectGroup: branchData.selectedObjectGroup
+ },
+ };
+}
+
+export function extractCo2Data(
+ branchData: HTTPStreamDataParent,
+ children: ChildSpeckleObjectData[]
+) {
+ const levels = {
+ levels: [
+ {
+ name: "A1-A3",
+ tCO2e: 0,
+ kgCO2eperm2: 0,
+ },
+ {
+ name: "A4",
+ tCO2e: 0,
+ kgCO2eperm2: 0,
+ },
+ {
+ name: "A5",
+ tCO2e: 0,
+ kgCO2eperm2: 0,
+ },
+ ],
+ };
+
+ const floorArea = branchData.projectData.floorArea;
+
+ const co2Obj: {
+ [key: string]: { value: number; color: string; id: string };
+ } = {};
+ const colorsArr: Color[] = [];
+ children.forEach((object) => {
+ levels.levels[0].kgCO2eperm2 +=
+ object.act.reportData.productStageCarbonA1A3 / floorArea;
+ levels.levels[0].tCO2e +=
+ object.act.reportData.productStageCarbonA1A3 / 1000;
+ levels.levels[1].kgCO2eperm2 +=
+ object.act.reportData.transportCarbonA4 / floorArea;
+ levels.levels[1].tCO2e += object.act.reportData.transportCarbonA4 / 1000;
+ levels.levels[2].kgCO2eperm2 +=
+ object.act.reportData.constructionCarbonA5.value / floorArea;
+ levels.levels[2].tCO2e +=
+ object.act.reportData.constructionCarbonA5.value / 1000;
+
+ const totalObjectCarbon =
+ object.act.reportData.productStageCarbonA1A3 +
+ object.act.reportData.transportCarbonA4 +
+ object.act.reportData.constructionCarbonA5.value;
+
+ const materialKey = object.act.formData.material.name;
+ const materialColor = object.act.formData.material.color;
+ if (Object.prototype.hasOwnProperty.call(co2Obj, materialKey)) {
+ co2Obj[materialKey] = {
+ value: co2Obj[materialKey].value + totalObjectCarbon,
+ color: materialColor,
+ id: object.act.speckle_type,
+ };
+ } else {
+ co2Obj[materialKey] = {
+ value: totalObjectCarbon,
+ color: materialColor,
+ id: object.act.speckle_type,
+ };
+ }
+ colorsArr.push({
+ id: object.act.id,
+ color: object.act.formData.material.color,
+ });
+ });
+ const co2Arr = Object.entries(co2Obj);
+ const materials = co2Arr.map((obj) => {
+ return {
+ label: obj[0],
+ value: obj[1].value,
+ color: obj[1].color,
+ };
+ });
+ const colors = colorsArr;
+ return { levels, materials, colors };
+}
diff --git a/src/views/utils/process-report-object/loadReportObjectV2.ts b/src/views/utils/process-report-object/loadReportObjectV2.ts
new file mode 100644
index 00000000..4375f328
--- /dev/null
+++ b/src/views/utils/process-report-object/loadReportObjectV2.ts
@@ -0,0 +1,90 @@
+import { ActReportData } from "@/models/graphql/";
+import {
+ ChildSpeckleObjectData,
+ HTTPStreamDataParentV2,
+} from "@/models/graphql/StreamData.interface";
+import { IProjectInfo, LoadStreamOut } from "./models";
+import { getChildren } from "./utils";
+
+export async function calcV2(
+ branchData: HTTPStreamDataParentV2,
+ actReportBranchInfo: ActReportData,
+ streamId: string,
+ context: any,
+ includeChildren?: boolean
+): Promise {
+ const projectInfoUpdated: IProjectInfo = {
+ name: branchData.projectData.name,
+ components: branchData.projectData.components,
+ reportDate: new Date(
+ actReportBranchInfo.data.stream.branch.commits.items[0].createdAt
+ ),
+ author: actReportBranchInfo.data.stream.branch.commits.items[0].authorName,
+ jobNumber: branchData.projectData.jobNumber,
+ cost: branchData.projectData.cost,
+ floorArea: branchData.projectData.floorArea,
+ notes: branchData.projectData.notes,
+ totalCO2e: Math.round((branchData.totalCO2 / 1000) * 100) / 100,
+ totalkgCO2e: Math.floor(branchData.totalCO2),
+ region: branchData.projectData.region,
+ volume: branchData.volume,
+ };
+
+ const floorArea = branchData.projectData.floorArea;
+ let children: ChildSpeckleObjectData[] = [];
+ const modelId = branchData["@model"][0].referencedId;
+
+ if (includeChildren) {
+ children = await getChildren(
+ context.state.selectedServer.url,
+ context.state.token.token,
+ streamId,
+ branchData
+ );
+ children = children.filter((c) => c.id != modelId);
+ }
+
+ return {
+ ready: true,
+ colors: branchData.materialsColors,
+ version: "v2",
+ parentId: branchData.id,
+ data: {
+ streamId: streamId,
+ modelId,
+ projectInfo: projectInfoUpdated,
+ materialBreakdown: {
+ materials: branchData.materials,
+ },
+ aBreakdown: {
+ levels: [
+ {
+ name: "A1-A3",
+ tCO2e:
+ Math.ceil((branchData.productStageCarbonA1A3 / 1000) * 100) / 100,
+ kgCO2eperm2: Math.ceil(
+ branchData.productStageCarbonA1A3 / floorArea
+ ),
+ },
+ {
+ name: "A4",
+ tCO2e: Math.ceil((branchData.transportCarbonA4 / 1000) * 100) / 100,
+ kgCO2eperm2: Math.ceil(branchData.transportCarbonA4 / floorArea),
+ },
+ {
+ name: "A5",
+ tCO2e:
+ Math.ceil((branchData.constructionCarbonA5.value / 1000) * 100) /
+ 100,
+ kgCO2eperm2: Math.ceil(
+ branchData.constructionCarbonA5.value / floorArea
+ ),
+ },
+ ],
+ },
+ children,
+ idMapper: branchData.idMapper,
+ selectedObjectGroup: branchData.selectedObjectGroup
+ },
+ };
+}
diff --git a/src/views/utils/process-report-object/models.ts b/src/views/utils/process-report-object/models.ts
new file mode 100644
index 00000000..d621a5ce
--- /dev/null
+++ b/src/views/utils/process-report-object/models.ts
@@ -0,0 +1,47 @@
+import { Level } from "@/models/assessment";
+import { ChartData } from "@/models/chart";
+import {
+ ChildSpeckleObjectData,
+} from "@/models/graphql/StreamData.interface";
+import { ProjectComponent } from "@/models/newAssessment/projectData.interface";
+import { Color } from "@/models/renderer";
+import { IdMapper } from "../add-params/addParams";
+
+export interface IProjectInfo {
+ name: string;
+ components: ProjectComponent[];
+ reportDate: Date;
+ author: string;
+ jobNumber: string;
+ cost: number;
+ floorArea: number;
+ notes: string;
+ totalCO2e: number;
+ totalkgCO2e: number;
+ region: string;
+ volume: number;
+}
+export interface IMaterialBreakdown {
+ materials: ChartData[];
+}
+export interface IABreakdown {
+ levels: Level[];
+}
+export interface ILoadStreamData {
+ streamId: string;
+ projectInfo: IProjectInfo;
+ materialBreakdown: IMaterialBreakdown;
+ aBreakdown: IABreakdown;
+ children: ChildSpeckleObjectData[];
+ modelId: string;
+ idMapper: IdMapper;
+ selectedObjectGroup: string;
+}
+
+export interface LoadStreamOut {
+ version: "v1" | "v2";
+ parentId: string;
+ ready: boolean;
+ colors: Color[];
+ data: ILoadStreamData;
+}
diff --git a/src/views/utils/process-report-object/utils.ts b/src/views/utils/process-report-object/utils.ts
new file mode 100644
index 00000000..2b753707
--- /dev/null
+++ b/src/views/utils/process-report-object/utils.ts
@@ -0,0 +1,43 @@
+import { HTTPStreamDataParent } from "@/models/graphql/";
+
+interface ParentObj {
+ __closure: {
+ [keys: string]: number;
+ };
+}
+
+export async function getChildren(
+ url: string,
+ token: string,
+ streamId: string,
+ parent: ParentObj
+): Promise {
+ // get the id's of the children objects
+ const children: string[] = Object.keys(parent.__closure);
+
+ // split down the children array into multiple arrays of max length 1000
+ const childrenSplit: string[][] = [];
+ for (let i = 0; i < children.length; i += 1000) {
+ childrenSplit.push(children.slice(i, Math.min(i + 1000, children.length)));
+ }
+
+ // get the data from the children objects, running one request per 1000 objects
+ return await Promise.all(
+ childrenSplit.map(async (cs) => {
+ return fetch(`${url}/api/getobjects/${streamId}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({ objects: JSON.stringify(cs) }),
+ }).then((res) => res.json());
+ })
+ ).then((data) => {
+ const arr: T[] = [];
+ data.forEach((d) => {
+ arr.push(...d);
+ });
+ return arr;
+ });
+}
diff --git a/src/views/utils/viewAssessmentUtils.ts b/src/views/utils/viewAssessmentUtils.ts
index f9b6f3b6..778c3104 100644
--- a/src/views/utils/viewAssessmentUtils.ts
+++ b/src/views/utils/viewAssessmentUtils.ts
@@ -1,87 +1,10 @@
-import { Level } from "@/models/assessment";
-import { ChartData } from "@/models/chart";
import { HTTPStreamDataParent } from "@/models/graphql/";
-import { ChildSpeckleObjectData } from "@/models/graphql/StreamData.interface";
-import { ProjectComponent } from "@/models/newAssessment/projectData.interface";
-import { Color } from "@/models/renderer";
+import {
+ instanceOfHttpStreamDataParentV1,
+ instanceOfHttpStreamDataParentV2,
+} from "@/models/graphql/StreamData.interface";
import { getActReportBranchInfo } from "@/store/speckle/speckleUtil";
-
-export function extractCo2Data(
- branchData: HTTPStreamDataParent,
- children: ChildSpeckleObjectData[]
-) {
- const levels = {
- levels: [
- {
- name: "A1-A3",
- tCO2e: 0,
- kgCO2eperm2: 0,
- },
- {
- name: "A4",
- tCO2e: 0,
- kgCO2eperm2: 0,
- },
- {
- name: "A5",
- tCO2e: 0,
- kgCO2eperm2: 0,
- },
- ],
- };
-
- const floorArea = branchData.projectData.floorArea;
-
- const co2Obj: {
- [key: string]: { value: number; color: string; id: string };
- } = {};
- const colorsArr: Color[] = [];
- children.forEach((object) => {
- levels.levels[0].kgCO2eperm2 +=
- object.act.reportData.productStageCarbonA1A3 / floorArea;
- levels.levels[0].tCO2e +=
- object.act.reportData.productStageCarbonA1A3 / 1000;
- levels.levels[1].kgCO2eperm2 +=
- object.act.reportData.transportCarbonA4 / floorArea;
- levels.levels[1].tCO2e += object.act.reportData.transportCarbonA4 / 1000;
- levels.levels[2].kgCO2eperm2 +=
- object.act.reportData.constructionCarbonA5.value / floorArea;
- levels.levels[2].tCO2e +=
- object.act.reportData.constructionCarbonA5.value / 1000;
-
- const totalObjectCarbon =
- object.act.reportData.productStageCarbonA1A3 +
- object.act.reportData.transportCarbonA4 +
- object.act.reportData.constructionCarbonA5.value;
-
- const materialKey = object.act.formData.material.name;
- const materialColor = object.act.formData.material.color;
- if (Object.prototype.hasOwnProperty.call(co2Obj, materialKey)) {
- co2Obj[materialKey] = {
- value: co2Obj[materialKey].value + totalObjectCarbon,
- color: materialColor,
- id: object.act.speckle_type,
- };
- } else {
- co2Obj[materialKey] = {
- value: totalObjectCarbon,
- color: materialColor,
- id: object.act.speckle_type,
- };
- }
- colorsArr.push({ id: object.act.id, color: object.act.formData.material.color });
- });
- const co2Arr = Object.entries(co2Obj);
- const materials = co2Arr.map((obj) => {
- return {
- label: obj[0],
- value: obj[1].value,
- color: obj[1].color,
- };
- });
- const colors = colorsArr;
- return { levels, materials, colors };
-}
+import { calcV1, calcV2, LoadStreamOut } from "./process-report-object";
export async function loadParent(
url: string,
@@ -98,45 +21,11 @@ export async function loadParent(
}).then((d) => d.json());
}
-export interface IProjectInfo {
- name: string;
- components: ProjectComponent[];
- reportDate: Date;
- author: string;
- jobNumber: string;
- cost: number;
- floorArea: number;
- notes: string;
- totalCO2e: number;
- totalkgCO2e: number;
- region: string;
- volume: number;
-}
-export interface IMaterialBreakdown {
- materials: ChartData[];
-}
-export interface IABreakdown {
- levels: Level[];
-}
-export interface ILoadStreamData {
- streamId: string;
- projectInfo: IProjectInfo;
- materialBreakdown: IMaterialBreakdown;
- aBreakdown: IABreakdown;
- children: ChildSpeckleObjectData[];
- selectedObjectGroup: string;
-}
-
-export interface LoadStreamOut {
- ready: boolean;
- colors: Color[];
- data: ILoadStreamData;
-}
-
export async function loadStream(
context: any,
streamId: string,
- branchName: string
+ branchName: string,
+ includeChildren?: boolean
): Promise {
const actReportBranchInfo = await getActReportBranchInfo(
context,
@@ -153,104 +42,17 @@ export async function loadStream(
context.state.token.token
);
- const projectInfoUpdated: IProjectInfo = {
- name: branchData.projectData.name,
- components: branchData.projectData.components,
- reportDate: new Date(
- actReportBranchInfo.data.stream.branch.commits.items[0].createdAt
- ),
- author: actReportBranchInfo.data.stream.branch.commits.items[0].authorName,
- jobNumber: branchData.projectData.jobNumber,
- cost: branchData.projectData.cost,
- floorArea: branchData.projectData.floorArea,
- notes: branchData.projectData.notes,
- totalCO2e: Math.round((branchData.totalCO2 / 1000) * 100) / 100,
- totalkgCO2e: Math.floor(branchData.totalCO2),
- region: branchData.projectData.region,
- volume: branchData.volume,
- };
-
- const childrenData = await getChildren(
- context.state.selectedServer.url,
- context.state.token.token,
- streamId,
- branchData
- );
-
- const co2Data = extractCo2Data(branchData, childrenData);
-
- const levelsUpdated: IABreakdown = co2Data.levels;
-
- const materialBreakdownUpdated: IMaterialBreakdown = {
- materials: co2Data.materials,
- };
-
- levelsUpdated.levels[0].kgCO2eperm2 = Math.ceil(
- levelsUpdated.levels[0].kgCO2eperm2
- );
- levelsUpdated.levels[0].tCO2e =
- Math.ceil(levelsUpdated.levels[0].tCO2e * 100) / 100;
- levelsUpdated.levels[1].kgCO2eperm2 = Math.ceil(
- levelsUpdated.levels[1].kgCO2eperm2
- );
- levelsUpdated.levels[1].tCO2e =
- Math.ceil(levelsUpdated.levels[1].tCO2e * 100) / 100;
- levelsUpdated.levels[2].kgCO2eperm2 = Math.ceil(
- levelsUpdated.levels[2].kgCO2eperm2
- );
- levelsUpdated.levels[2].tCO2e =
- Math.ceil(levelsUpdated.levels[2].tCO2e * 100) / 100;
-
- return {
- ready: true,
- colors: co2Data.colors,
- data: {
- streamId: streamId,
- projectInfo: projectInfoUpdated,
- materialBreakdown: materialBreakdownUpdated,
- aBreakdown: levelsUpdated,
- children: childrenData,
- selectedObjectGroup: branchData.selectedObjectGroup
- },
- };
-}
-
-export interface ParentProp {
- __closure: { [childId: string]: 1 }
-}
-
-export async function getChildren(
- url: string,
- token: string,
- streamId: string,
- parent: ParentProp
-): Promise {
- // get the id's of the children objects
- const children: string[] = Object.keys(parent.__closure);
-
- // split down the children array into multiple arrays of max length 1000
- const childrenSplit: string[][] = [];
- for (let i = 0; i < children.length; i += 1000) {
- childrenSplit.push(children.slice(i, Math.min(i + 1000, children.length)));
+ if (instanceOfHttpStreamDataParentV1(branchData)) {
+ return calcV1(branchData, actReportBranchInfo, context, streamId);
+ } else if (instanceOfHttpStreamDataParentV2(branchData)) {
+ return calcV2(
+ branchData,
+ actReportBranchInfo,
+ streamId,
+ context,
+ includeChildren
+ );
+ } else {
+ throw new Error("report object corrupted");
}
-
- // get the data from the children objects, running one request per 1000 objects
- return await Promise.all(
- childrenSplit.map(async (cs) => {
- return fetch(`${url}/api/getobjects/${streamId}`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${token}`,
- },
- body: JSON.stringify({ objects: JSON.stringify(cs) }),
- }).then((res) => res.json());
- })
- ).then((data) => {
- const arr: T[] = [];
- data.forEach((d) => {
- arr.push(...d);
- });
- return arr;
- });
}