{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/scratch/individualsAsPoints/regl/npm-modules/individual-grouper.js"],"names":["IndividualsGrouper","constructor","individuals","groupingLayouter","rawIndividuals","flatTreeStructure","groupingKey","PARENT_ID_KEY","ID_KEY","GROUP_TYPE","INDIVIDUAL_TYPE","ROOT_PARENT_ID","setParentIdKey","setIdKey","initializeRootGrouping","push","id","parentId","forEach","individual","index","toString","setColorScaleForDomain","addGrouping","oldNodes","createLookUpTableForNodes","currentNodes","uniqueValuesForKey","Set","map","item","addParentNodes","addParentIdsToIndividuals","nodes","lookUpTable","node","data","groups","group","nodeType","groupValue","getGroupingStructure","createLayout","enrichNodesWithDrawingInformation","reverse","drawingInformation","x","y","r","getColorForNode","undefined","nodeIsNotANewNode","drawing","size","color","getColorForValue","opacity"],"mappings":";;;;;;;;AACO,YAAMA,kBAAN,CAAyB;;AAE9BC,oBAAYC,WAAZ,EAAyBC,gBAAzB,EAA0C;AACxC,eAAKC,cAAL,GAAsBF,WAAtB;AACA,eAAKG,iBAAL,GAAyB,EAAzB;AACA,eAAKC,WAAL,GAAmB,MAAnB;;AAEA;AACA,eAAKC,aAAL,GAAqB,UAArB;AACA,eAAKC,MAAL,GAAc,IAAd;AACA,eAAKC,UAAL,GAAkB,QAAlB;AACA,eAAKC,eAAL,GAAuB,YAAvB;AACA,eAAKC,cAAL,GAAsB,WAAtB;;AAEA;AACA,eAAKR,gBAAL,GAAwBA,gBAAxB;AACA,eAAKA,gBAAL,CAAsBS,cAAtB,CAAqC,KAAKL,aAA1C;AACA,eAAKJ,gBAAL,CAAsBU,QAAtB,CAA+B,KAAKL,MAApC;;AAEA;AACA,eAAKM,sBAAL;AAED;;AAEDA,iCAAwB;AACtB,eAAKT,iBAAL,GAAyB,EAAzB;AACA,eAAKA,iBAAL,CAAuBU,IAAvB,CAA4B,EAACC,IAAI,KAAKL,cAAV,EAA0BM,UAAU,EAApC,EAA5B;AACA,eAAKb,cAAL,CAAoBc,OAApB,CAA4B,CAACC,UAAD,EAAaC,KAAb,KAAuB;AAC/CD,uBAAW,KAAKZ,aAAhB,IAAiC,KAAKI,cAAtC;AACAQ,uBAAW,KAAKX,MAAhB,IAA0BY,MAAMC,QAAN,CAAe,EAAf,IAAqB,GAA/C,CAF+C,CAEK;AACpDF,uBAAW,UAAX,IAAyB,KAAKT,eAA9B;AACH,WAJD;;AAMA,eAAKL,iBAAL,CAAuBU,IAAvB,CAA4B,GAAG,KAAKX,cAApC;AACA,eAAKD,gBAAL,CAAsBmB,sBAAtB,CAA6C,KAAKhB,WAAlD;AACD;;AAEDiB,oBAAYjB,WAAZ,EAAwB;AACtB,eAAKkB,QAAL,GAAgB,KAAKC,yBAAL,CAA+B,KAAKC,YAApC,CAAhB;AACA,eAAKpB,WAAL,GAAmBA,WAAnB;;AAEA,cAAIqB,qBAAqB,CAAC,GAAG,IAAIC,GAAJ,CAAQ,KAAKxB,cAAL,CAAoByB,GAApB,CAAwBC,QAAQA,KAAKxB,WAAL,CAAhC,CAAR,CAAJ,CAAzB;AACA,eAAKH,gBAAL,CAAsBmB,sBAAtB,CAA6CK,kBAA7C;AACA,eAAKI,cAAL,CAAoBJ,kBAApB;;AAEA,eAAKK,yBAAL,CAA+B1B,WAA/B;AAED;;AAEDmB,kCAA0BQ,KAA1B,EAAgC;AAC9B,cAAIC,cAAc,EAAlB;AACAD,gBAAMf,OAAN,CAAeiB,IAAD,IAAU;AACtBD,wBAAYC,KAAKC,IAAL,CAAUpB,EAAtB,IAA4BmB,IAA5B;AACD,WAFD;;AAIA,iBAAOD,WAAP;AACD;;AAEDH,uBAAeM,MAAf,EAAsB;AACpBA,iBAAOnB,OAAP,CAAgBoB,KAAD,IAAW;AACxB,iBAAKjC,iBAAL,CAAuBU,IAAvB,CAA4B,EAACC,IAAIsB,KAAL,EAAYrB,UAAU,KAAKN,cAA3B,EAA2C4B,UAAU,KAAK9B,UAA1D,EAA5B;AACD,WAFD;AAGD;;AAEDuB,kCAA0B1B,WAA1B,EAAsC;AACpC,eAAKF,cAAL,CAAoBc,OAApB,CAA6BiB,IAAD,IAAU;AACpC,gBAAIK,aAAaL,KAAK7B,WAAL,CAAjB;AACA6B,iBAAK,KAAK5B,aAAV,IAA2BiC,UAA3B;AACD,WAHD;AAID;;AAEDC,+BAAsB;AACpB,eAAKf,YAAL,GAAoB,KAAKvB,gBAAL,CAAsBuC,YAAtB,CAAmC,KAAKrC,iBAAxC,CAApB;AACA,eAAKsC,iCAAL;AACA,eAAKjB,YAAL,CAAkBkB,OAAlB;AACA,iBAAO,KAAKlB,YAAZ;AACD;;AAEDiB,4CAAoC;AAClC,eAAKjB,YAAL,CAAkBR,OAAlB,CAA4BiB,IAAD,IAAU;AACnC,gBAAIU,qBAAqB,EAAzB;;AAEAA,+BAAmB,GAAnB,IAA0BV,KAAKW,CAA/B;AACAD,+BAAmB,GAAnB,IAA0BV,KAAKY,CAA/B;AACAF,+BAAmB,MAAnB,IAA6BV,KAAKa,CAAL,GAAS,CAAtC;AACAH,+BAAmB,OAAnB,IAA8B,KAAKI,eAAL,CAAqBd,IAArB,CAA9B;;AAEA,gBAAG,KAAKX,QAAL,KAAkB0B,SAArB,EAAgC;AAC9B,kBAAG,KAAKC,iBAAL,CAAuBhB,IAAvB,CAAH,EAAgC;AAC9BU,mCAAmB,IAAnB,IAA2BV,KAAKW,CAAhC;AACAD,mCAAmB,IAAnB,IAA2BV,KAAKY,CAAhC;AACAF,mCAAmB,IAAnB,IAA2B,KAAKrB,QAAL,CAAcW,KAAKC,IAAL,CAAUpB,EAAxB,EAA4BoC,OAA5B,CAAoCN,CAA/D;AACAD,mCAAmB,IAAnB,IAA2B,KAAKrB,QAAL,CAAcW,KAAKC,IAAL,CAAUpB,EAAxB,EAA4BoC,OAA5B,CAAoCL,CAA/D;AACAF,mCAAmB,OAAnB,IAA8BV,KAAKa,CAAL,GAAS,CAAvC;AACAH,mCAAmB,OAAnB,IAA8B,KAAKrB,QAAL,CAAcW,KAAKC,IAAL,CAAUpB,EAAxB,EAA4BoC,OAA5B,CAAoCC,IAAlE;AACAR,mCAAmB,QAAnB,IAA+B,KAAKI,eAAL,CAAqBd,IAArB,CAA/B;AACAU,mCAAmB,QAAnB,IAA+B,KAAKrB,QAAL,CAAcW,KAAKC,IAAL,CAAUpB,EAAxB,EAA4BoC,OAA5B,CAAoCE,KAAnE;AACD,eATD,MASM;AACJT,mCAAmB,IAAnB,IAA2BV,KAAKW,CAAhC;AACAD,mCAAmB,IAAnB,IAA2BV,KAAKY,CAAhC;AACAF,mCAAmB,IAAnB,IAA2BV,KAAKW,CAAhC;AACAD,mCAAmB,IAAnB,IAA2BV,KAAKY,CAAhC;AACAF,mCAAmB,OAAnB,IAA8BV,KAAKa,CAAL,GAAS,CAAvC;AACAH,mCAAmB,OAAnB,IAA8B,CAA9B;AACAA,mCAAmB,QAAnB,IAA+B,KAAKI,eAAL,CAAqBd,IAArB,CAA/B;AACAU,mCAAmB,QAAnB,IAA+B,KAAKI,eAAL,CAAqBd,IAArB,CAA/B;AACD;AAEF;;AAEDA,iBAAK,SAAL,IAAkBU,kBAAlB;AACD,WAhCD;AAkCD;;AAEDM,0BAAkBhB,IAAlB,EAAuB;AACnB,iBAAO,KAAKX,QAAL,CAAcW,KAAKC,IAAL,CAAUpB,EAAxB,MAAgCkC,SAAvC;AACH;;AAEDD,wBAAgBd,IAAhB,EAAsB;AACpB,cAAImB,KAAJ;AACA,cAAIf,WAAWJ,KAAKC,IAAL,CAAU,UAAV,CAAf;AACA,cAAGG,YAAY,KAAK9B,UAApB,EAAgC;AAC9B6C,oBAAQ,KAAKnD,gBAAL,CAAsBoD,gBAAtB,CAAuCpB,KAAK,IAAL,CAAvC,CAAR;AACAmB,kBAAME,OAAN,GAAgB,IAAhB;AACD,WAHD,MAGO;AACLF,oBAAQ,KAAKnD,gBAAL,CAAsBoD,gBAAtB,CAAuCpB,KAAKC,IAAL,CAAU,KAAK9B,WAAf,CAAvC,CAAR;AACD;AACD,iBAAOgD,KAAP;AACD;;AAjI6B","file":"individual-grouper.js","sourcesContent":["\nexport class IndividualsGrouper {\n  \n  constructor(individuals, groupingLayouter){\n    this.rawIndividuals = individuals;\n    this.flatTreeStructure = [];\n    this.groupingKey = \"root\";\n    \n    // Declare constants\n    this.PARENT_ID_KEY = \"parentId\";\n    this.ID_KEY = \"id\";\n    this.GROUP_TYPE = \"parent\";\n    this.INDIVIDUAL_TYPE = \"individual\";\n    this.ROOT_PARENT_ID = \"123456789\";\n    \n    // Set up groupingLayouter\n    this.groupingLayouter = groupingLayouter;\n    this.groupingLayouter.setParentIdKey(this.PARENT_ID_KEY);\n    this.groupingLayouter.setIdKey(this.ID_KEY);\n    \n    // Build initial Root Tree Structure\n    this.initializeRootGrouping();\n\n  }\n  \n  initializeRootGrouping(){\n    this.flatTreeStructure = [];\n    this.flatTreeStructure.push({id: this.ROOT_PARENT_ID, parentId: \"\"});\n    this.rawIndividuals.forEach((individual, index) => {\n        individual[this.PARENT_ID_KEY] = this.ROOT_PARENT_ID;\n        individual[this.ID_KEY] = index.toString(10) + 'a'; // we need to add a because the raw index conflicts with grouping by age\n        individual['nodeType'] = this.INDIVIDUAL_TYPE;\n    })\n    \n    this.flatTreeStructure.push(...this.rawIndividuals)\n    this.groupingLayouter.setColorScaleForDomain(this.groupingKey);\n  }\n  \n  addGrouping(groupingKey){\n    this.oldNodes = this.createLookUpTableForNodes(this.currentNodes);\n    this.groupingKey = groupingKey;\n    \n    var uniqueValuesForKey = [...new Set(this.rawIndividuals.map(item => item[groupingKey]))];\n    this.groupingLayouter.setColorScaleForDomain(uniqueValuesForKey);\n    this.addParentNodes(uniqueValuesForKey);\n    \n    this.addParentIdsToIndividuals(groupingKey);\n    \n  }\n  \n  createLookUpTableForNodes(nodes){\n    let lookUpTable = {}\n    nodes.forEach((node) => {\n      lookUpTable[node.data.id] = node;\n    });\n  \n    return lookUpTable;\n  }\n  \n  addParentNodes(groups){\n    groups.forEach((group) => {\n      this.flatTreeStructure.push({id: group, parentId: this.ROOT_PARENT_ID, nodeType: this.GROUP_TYPE});\n    })\n  }\n  \n  addParentIdsToIndividuals(groupingKey){\n    this.rawIndividuals.forEach((node) => {\n      let groupValue = node[groupingKey]\n      node[this.PARENT_ID_KEY] = groupValue;\n    })\n  }\n  \n  getGroupingStructure(){\n    this.currentNodes = this.groupingLayouter.createLayout(this.flatTreeStructure);\n    this.enrichNodesWithDrawingInformation();\n    this.currentNodes.reverse();\n    return this.currentNodes;\n  }\n  \n  enrichNodesWithDrawingInformation() {\n    this.currentNodes.forEach( (node) => {\n      let drawingInformation = {};\n    \n      drawingInformation[\"x\"] = node.x;\n      drawingInformation[\"y\"] = node.y;\n      drawingInformation[\"size\"] = node.r * 2;\n      drawingInformation[\"color\"] = this.getColorForNode(node);\n      \n      if(this.oldNodes !== undefined ){\n        if(this.nodeIsNotANewNode(node)){\n          drawingInformation[\"tx\"] = node.x;\n          drawingInformation[\"ty\"] = node.y;\n          drawingInformation[\"sx\"] = this.oldNodes[node.data.id].drawing.x;\n          drawingInformation[\"sy\"] = this.oldNodes[node.data.id].drawing.y;\n          drawingInformation[\"tsize\"] = node.r * 2;\n          drawingInformation[\"ssize\"] = this.oldNodes[node.data.id].drawing.size;\n          drawingInformation[\"tcolor\"] = this.getColorForNode(node);\n          drawingInformation[\"scolor\"] = this.oldNodes[node.data.id].drawing.color;\n        }else {\n          drawingInformation[\"tx\"] = node.x;\n          drawingInformation[\"ty\"] = node.y;\n          drawingInformation[\"sx\"] = node.x;\n          drawingInformation[\"sy\"] = node.y;\n          drawingInformation[\"tsize\"] = node.r * 2;\n          drawingInformation[\"ssize\"] = 0\n          drawingInformation[\"tcolor\"] = this.getColorForNode(node);\n          drawingInformation[\"scolor\"] = this.getColorForNode(node);\n        }\n        \n      }\n\n      node[\"drawing\"] = drawingInformation;\n    });\n    \n  }\n  \n  nodeIsNotANewNode(node){\n      return this.oldNodes[node.data.id] !== undefined\n  }\n  \n  getColorForNode(node) {\n    let color;\n    let nodeType = node.data['nodeType'];\n    if(nodeType == this.GROUP_TYPE) {\n      color = this.groupingLayouter.getColorForValue(node['id']);\n      color.opacity = 0.85;\n    } else {\n      color = this.groupingLayouter.getColorForValue(node.data[this.groupingKey]);\n    }\n    return color;\n  }\n  \n  \n}"]}