diff --git a/index.html b/index.html
index 6ebb739..b90b398 100755
--- a/index.html
+++ b/index.html
@@ -27,7 +27,7 @@ var N =
let check = N.Step(inNodeMajor, inKey, true);
if(check)
{
- if(check.indexOf(inNodeMinor) < 0)
+ if(check.indexOf(inNodeMinor) !== -1)
{
return;
}
@@ -172,14 +172,19 @@ var N =
var Pivot =
{
Leaves:{},
- Root:N.Create({}),
-
- Init(inRows)
- {
+ Root:N.Create({Label:"All Pivots"}),
+ Schema:N.Create({Label:"Column Details"}),
+ Proto:N.Create({Label:"User Form"}),
+ Init(inColumnNames, inColumnTypes, inRows)
+ {
+ for(let i=0; i N.Create({Row:r}));
Pivot.Init = ()=>{};
},
- Pivot(inParent, inPivotIndicies, inSumIndicies, inDepth)
+ Pivot(inRoot, inParent, inPivotIndicies, inSumIndicies, inDepth)
{
//arguments:
// - a Node with leaf Nodes temporarily stored in its Meta.Leaves
@@ -226,6 +231,7 @@ var Pivot =
{
iterator = inLastBranch =>
{
+ N.Connect(inRoot, inLastBranch, "Terminal");
inLastBranch.Meta.Leaves.forEach( inLeaf =>
{
// collect modifiers effecting leaves
@@ -245,12 +251,12 @@ var Pivot =
{
// apply them to the branch
inLastBranch.ID.Walk = N.ID.Walk;
- modifiers.forEach( inModifier => N.Connect(inModifier, inLastBranch, "ModifyUp") )
+ modifiers.forEach( inModifier => N.Connect(inModifier, inLastBranch, "ModifyOut") )
- // also walk them up, but with a unique check connection
+ // also walk them up and connect, but with "check unique" enabled
N.Walk( inNode=>
{
- modifiers.forEach( inModifier => N.Connect(inModifier, inNode, "ModifyUp", true) )
+ modifiers.forEach( inModifier => N.Connect(inModifier, inNode, "ModifyOut", true) )
}
, inLastBranch, "Hierarchy", false);
}
@@ -263,7 +269,7 @@ var Pivot =
}
else
{
- iterator = child => Pivot.Pivot(child, inPivotIndicies, inSumIndicies, depth+1);
+ iterator = child => Pivot.Pivot(inRoot, child, inPivotIndicies, inSumIndicies, depth+1);
}
N.Step(inParent, "Hierarchy").forEach(iterator);
return inParent;
@@ -272,12 +278,19 @@ var Pivot =
{
N.ID.Walk++;
- let pivotRoot = N.Create({Label:"Pivot Root", Leaves:Pivot.Leaves});
+ let names = N.Step(Pivot.Schema, "label");
+ let label = inPivotIndicies.map( inPivotIndex =>
+ {
+ return names[inPivotIndex].Meta.Label;
+ });
+
+ let pivotRoot = N.Create({Label:label.join("|"), Leaves:Pivot.Leaves});
N.Connect(Pivot.Root, pivotRoot, "Pivot");
- return Pivot.Pivot(pivotRoot, inPivotIndicies, inSumIndicies);
+ return Pivot.Pivot(pivotRoot, pivotRoot, inPivotIndicies, inSumIndicies);
},
Delete(inRoot)
{
+ // disconnect modifiers
let check = N.Step(inRoot, "Modifier");
if(check)
{
@@ -286,10 +299,20 @@ var Pivot =
Pivot.Unmodify(check[0]);
}
}
+
+ // disconnect terminal branches
+ N.Walk(()=>{}, inRoot, "Terminal", inNode=>{
+ N.Disconnect(inNode, null, "Hierarchy");
+ });
+
+ // disconnect from app
+ N.Disconnect(null, inRoot, "Pivot")
},
Modify(inNode)
{
let modified = N.Create({Label:"Modifier"});
+
+ // add the modifier to the appropriate root
N.ID.Walk++;
if(N.Step(inNode, "Hierarchy").length)
{
@@ -303,6 +326,7 @@ var Pivot =
N.Connect(Pivot.Root, modified, "Modifier");
}
+ // traverse
let leaves = [];
let gatherUp = n => N.Connect(modified, n, "ModifyUp");
let gatherDown = n =>
@@ -310,7 +334,11 @@ var Pivot =
N.Connect(modified, n, "ModifyDown");
N.Step(n, "Hierarchy").length == 0 ? leaves.push(n) : null;
};
- let gatherOut = n => N.Connect(modified, n, "ModifyOut");
+ let gatherOut = n => {
+
+ N.Connect(modified, n, "ModifyOut");
+
+ };
N.ID.Walk++;
inNode.ID.Walk = N.ID.Walk;
@@ -339,23 +367,77 @@ import { h, render, createContext, Fragment } from 'https://cdn.skypack.dev/prea
import { useReducer } from 'https://cdn.skypack.dev/preact/hooks';
import { css, cx } from 'https://cdn.skypack.dev/@emotion/css';
-Pivot.Init([
- ["#1", "a", "long", 1],
- ["#2", "b", "long", 2],
- ["#3", "b", "short", 2],
- ["#4", "a", "long", 3],
- ["#5", "b", "short", 1],
- ["#6", "a", "short", 0],
- ["#7", "b", "short", 7],
-]);
-Pivot.Create([1, 2], [3]);
+Pivot.Init(
+ ["number", "type-a", "type-b", "count"],
+ ["label", "label", "label", "sum"],
+ [
+ ["#1", "a", "long", 1, 4],
+ ["#2", "b", "long", 2, 4],
+ ["#3", "b", "short", 2, 4],
+ ["#4", "a", "long", 3, 4],
+ ["#5", "b", "short", 1, 4],
+ ["#6", "a", "short", 0, 4],
+ ["#7", "b", "short", 7, 4]
+ ]
+);
-let AddNewPivot = () =>
+let ElForm = props =>
{
- Pivot.Create([2], [3]);
- Render();
-};
+ let labelColumns = N.Step(Pivot.Schema, "label")||[];
+ let used = N.Step(Pivot.Proto, "used")||[];
+ let unused = N.Step(Pivot.Schema, "label").filter( columnLabel => !N.Step(columnLabel, "used", false) );
+ let indicies = used.map(node=>node.Meta.Index);
+
+ var action;
+ if(indicies.length)
+ {
+ action = h("div", null, [
+ h("span", null, "Build"),
+ h("button", {onClick:e=>
+ {
+ N.Disconnect(Pivot.Proto, null, "used");
+ Pivot.Create(indicies, [3, 4]);
+ Render();
+ }
+ }, indicies)
+ ]);
+ }
+ else
+ {
+ action = h("div", null, "(select columns)")
+ }
+
+ return h("div", {}, [
+ h("div", null, [
+ h("span", null, "available"),
+ ...unused.map( node=>
+ {
+ return h("button", {onClick:e=>
+ {
+ N.Connect(Pivot.Proto, node, "used");
+ Render();
+ }
+ }, node.Meta.Label);
+ }
+ )
+ ]),
+ h("div", null, [
+ h("span", null, "taken"),
+ ...used.map( node=>
+ {
+ return h("button", {onClick:e=>
+ {
+ N.Disconnect(Pivot.Proto, node, "used");
+ Render();
+ }
+ }, node.Meta.Label);
+ }
+ )
+ ]),
+ action
+ ])
+};
let ElNode = ({node, depth}) =>
{
let nodeBase = css`
@@ -439,7 +521,8 @@ let ElNode = ({node, depth}) =>
};
let ElPivot = ({pivot}) =>
{
- return h("div", {style:{display:"inline-block", width:"500px"}}, [
+ return h("div", {className:css`display:inline-block;`}, [
+ h("h3", null, pivot.Meta.Label),
h("button", {onClick:e=>{Pivot.Delete(pivot);Render();}}, "delete?"),
h(ElModifiers, {node:pivot}),
h(ElNode, {node:pivot, depth:0})
@@ -461,15 +544,12 @@ let ElModifiers = ({node}) =>
};
let ElRoot = props =>
{
+ let pivots = N.Step(Pivot.Root, "Pivot")||[];
return h("div", null, [
h("h3", null, "tree view"),
+ h(ElForm),
h(ElModifiers, {node:Pivot.Root}),
- h("button", { onClick:e=>
- {
- AddNewPivot();
- }
- }, "add new pivot"),
- ...N.Step(Pivot.Root, "Pivot").map(pivot=>h(ElPivot, {pivot}))
+ pivots.map(pivot=>h(ElPivot, {pivot}))
])
};
let Render = () => render(h(ElRoot), document.querySelector("#app"));
diff --git a/save.json b/save.json
new file mode 100644
index 0000000..0ecad77
--- /dev/null
+++ b/save.json
@@ -0,0 +1,20 @@
+[
+ {
+ "name":"",
+ "csv":["data/output/1.csv", "data/output/2.csv"],
+ "pivots":
+ [
+ {
+ "pivot":[0, 1],
+ "sum":[3],
+ "modifications":
+ [
+ {
+ "path":[0, 0],
+ "modification":[0.2]
+ }
+ ]
+ }
+ ]
+ }
+]
\ No newline at end of file