use js import like a normal person....
This commit is contained in:
parent
235d5fd005
commit
ed6c5ca779
25
index.html
25
index.html
@ -2,15 +2,22 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<script src="./libraries/papaparse.min.js"></script>
|
|
||||||
<script src="./libraries/n.js"></script>
|
|
||||||
<script src="./libraries/pivot.js"></script>
|
|
||||||
<script src="./data/csv.js"></script>
|
<script src="./data/csv.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<!-- initialize table -->
|
<!-- initialize table -->
|
||||||
<script>
|
<script type="module">
|
||||||
|
|
||||||
|
import { h, render, createContext, Fragment } from 'https://cdn.skypack.dev/preact';
|
||||||
|
import { useReducer, useState } from 'https://cdn.skypack.dev/preact/hooks';
|
||||||
|
import { css, cx } from 'https://cdn.skypack.dev/@emotion/css';
|
||||||
|
import htm from 'https://unpkg.com/htm?module';
|
||||||
|
const html = htm.bind(h);
|
||||||
|
|
||||||
|
import N from "./src/n.js";
|
||||||
|
import Pivot from "./src/pivot.js";
|
||||||
|
|
||||||
let columnNames = CSV.shift();
|
let columnNames = CSV.shift();
|
||||||
let columnTypes = ([...columnNames]).fill("hidden");
|
let columnTypes = ([...columnNames]).fill("hidden");
|
||||||
columnTypes[29] = "sum";
|
columnTypes[29] = "sum";
|
||||||
@ -28,14 +35,7 @@
|
|||||||
columnNames,
|
columnNames,
|
||||||
CSV
|
CSV
|
||||||
);
|
);
|
||||||
</script>
|
|
||||||
<!-- rendering -->
|
|
||||||
<script type="module">
|
|
||||||
import { h, render, createContext, Fragment } from 'https://cdn.skypack.dev/preact';
|
|
||||||
import { useReducer, useState } from 'https://cdn.skypack.dev/preact/hooks';
|
|
||||||
import { css, cx } from 'https://cdn.skypack.dev/@emotion/css';
|
|
||||||
import htm from 'https://unpkg.com/htm?module';
|
|
||||||
const html = htm.bind(h);
|
|
||||||
|
|
||||||
let PivotForm = props =>
|
let PivotForm = props =>
|
||||||
{
|
{
|
||||||
@ -483,6 +483,7 @@
|
|||||||
pivots.map(pivot=>h(PivotRoot, {key:pivot.Meta.Label, pivot}))
|
pivots.map(pivot=>h(PivotRoot, {key:pivot.Meta.Label, pivot}))
|
||||||
])
|
])
|
||||||
};
|
};
|
||||||
|
|
||||||
const Render = () => render(h(ElRoot), document.querySelector("#app"));
|
const Render = () => render(h(ElRoot), document.querySelector("#app"));
|
||||||
Render();
|
Render();
|
||||||
|
|
||||||
|
172
libraries/n.js
172
libraries/n.js
@ -1,172 +0,0 @@
|
|||||||
var N =
|
|
||||||
{
|
|
||||||
ID:{
|
|
||||||
Walk:0,
|
|
||||||
Instance:0
|
|
||||||
},
|
|
||||||
Create(inMeta)
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
ID:{
|
|
||||||
Walk:0,
|
|
||||||
Instance:N.ID.Instance++
|
|
||||||
},
|
|
||||||
Meta:inMeta||{},
|
|
||||||
Link:{}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
Connect(inNodeMajor, inNodeMinor, inKey, inUnique)
|
|
||||||
{
|
|
||||||
if(inUnique) // bail if the nodes are already connected
|
|
||||||
{
|
|
||||||
let check = N.Step(inNodeMajor, inKey, true);
|
|
||||||
if(check)
|
|
||||||
{
|
|
||||||
if(check.indexOf(inNodeMinor) !== -1)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
N.Step(inNodeMajor, inKey, true, true).push(inNodeMinor);
|
|
||||||
N.Step(inNodeMinor, inKey, false, true).push(inNodeMajor);
|
|
||||||
},
|
|
||||||
Disconnect(inNodeMajor, inNodeMinor, inKey)
|
|
||||||
{
|
|
||||||
let remove = (inArray, inMatch) => inArray.findIndex( (inMember, inIndex, inArray) => (inMember === inMatch) ? inArray.splice(inIndex, 1) : false );
|
|
||||||
|
|
||||||
// if no specific child was passed
|
|
||||||
if(inNodeMinor === null)
|
|
||||||
{
|
|
||||||
// get all the children
|
|
||||||
let check = N.Step(inNodeMajor, inKey);
|
|
||||||
if(!check){ return; }
|
|
||||||
|
|
||||||
// go down to each child ...
|
|
||||||
check.forEach( inNodeMinor =>
|
|
||||||
{
|
|
||||||
let connections = inNodeMinor.Link[inKey];
|
|
||||||
remove( connections.Get, inNodeMajor); // ... and remove any reference to the parent
|
|
||||||
|
|
||||||
// if after the remove operation, this child has no connections on inKey, scrub the key
|
|
||||||
if(!connections.Set.length && !connections.Get.length)
|
|
||||||
{
|
|
||||||
delete inNodeMinor.Link[inKey];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// we just wiped out all outgoing connections to the parent, if incoming connections are empty too we can purge the key there as well
|
|
||||||
if(inNodeMajor.Link[inKey].Get.length == 0)
|
|
||||||
{
|
|
||||||
delete inNodeMajor.Link[inKey];
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no specific parent was passed
|
|
||||||
if(inNodeMajor === null)
|
|
||||||
{
|
|
||||||
// get all the parents
|
|
||||||
let check = N.Step(inNodeMinor, inKey, false);
|
|
||||||
if(!check){ return; }
|
|
||||||
|
|
||||||
// go up to each parent ...
|
|
||||||
check.forEach( inNodeMajor =>
|
|
||||||
{
|
|
||||||
let connections = inNodeMajor.Link[inKey];
|
|
||||||
remove( connections.Set, inNodeMinor); // ... and remove any reference to the child
|
|
||||||
|
|
||||||
// if after the remove operation, this parent has no connections on inKey, scrub the key
|
|
||||||
if( !connections.Set.length && !connections.Get.length )
|
|
||||||
{
|
|
||||||
delete inNodeMajor.Link[inKey];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// we just wiped out all incoming connections to the child, if outgoing connections are empty too we can purge the key there as well
|
|
||||||
if(inNodeMinor.Link[inKey].Set.length == 0)
|
|
||||||
{
|
|
||||||
delete inNodeMinor.Link[inKey];
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if a specific parent and child were passed
|
|
||||||
if(inNodeMajor.Link[inKey].Set.length == 1)
|
|
||||||
{
|
|
||||||
delete inNodeMajor.Link[inKey];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remove(inNodeMajor.Link[inKey].Set, inNodeMinor);
|
|
||||||
}
|
|
||||||
if(inNodeMinor.Link[inKey].Get.length == 1)
|
|
||||||
{
|
|
||||||
delete inNodeMinor.Link[inKey];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remove(inNodeMinor.Link[inKey].Get, inNodeMajor);
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
Step(inNode, inKey, inForward, inForceCreate)
|
|
||||||
{
|
|
||||||
let connectionGroup = inNode.Link[inKey];
|
|
||||||
if(!connectionGroup)
|
|
||||||
{
|
|
||||||
if(inForceCreate === true)
|
|
||||||
{
|
|
||||||
inNode.Link[inKey] = connectionGroup = {Get:[], Set:[]};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (inForward === undefined || inForward === true) ? connectionGroup.Set : connectionGroup.Get;
|
|
||||||
|
|
||||||
},
|
|
||||||
Walk(inIterator, inNode, inKey, inForward, inTerminal)
|
|
||||||
{
|
|
||||||
let array = N.Step(inNode, inKey, inForward);
|
|
||||||
|
|
||||||
if(!array.length && inTerminal)
|
|
||||||
{
|
|
||||||
return inTerminal(inNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(let i=0; i<array.length; i++)
|
|
||||||
{
|
|
||||||
let next = array[i];
|
|
||||||
if(next.ID.Walk !== N.ID.Walk)
|
|
||||||
{
|
|
||||||
next.ID.Walk = N.ID.Walk;
|
|
||||||
//console.log("processing", next.Meta)
|
|
||||||
let results = inIterator(next);
|
|
||||||
if(results !== false)
|
|
||||||
{
|
|
||||||
N.Walk(inIterator, next, inKey, inForward, inTerminal);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//console.log("routine exited");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//console.log("id collision");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Path(inArray, inNode, inKey, inForward)
|
|
||||||
{
|
|
||||||
var current = inNode;
|
|
||||||
var direction = inForward||true;
|
|
||||||
for(let i=0; i<inArray.length; i++)
|
|
||||||
{
|
|
||||||
current = N.Step(current, inKey, direction)[inArray[i]];
|
|
||||||
}
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
};
|
|
7
libraries/papaparse.min.js
vendored
7
libraries/papaparse.min.js
vendored
File diff suppressed because one or more lines are too long
0
src/app.js
Normal file
0
src/app.js
Normal file
174
src/n.js
Normal file
174
src/n.js
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
const N =
|
||||||
|
{
|
||||||
|
ID:{
|
||||||
|
Walk:0,
|
||||||
|
Instance:0
|
||||||
|
},
|
||||||
|
Create(inMeta)
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
ID:{
|
||||||
|
Walk:0,
|
||||||
|
Instance:N.ID.Instance++
|
||||||
|
},
|
||||||
|
Meta:inMeta||{},
|
||||||
|
Link:{}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
Connect(inNodeMajor, inNodeMinor, inKey, inUnique)
|
||||||
|
{
|
||||||
|
if(inUnique) // bail if the nodes are already connected
|
||||||
|
{
|
||||||
|
let check = N.Step(inNodeMajor, inKey, true);
|
||||||
|
if(check)
|
||||||
|
{
|
||||||
|
if(check.indexOf(inNodeMinor) !== -1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
N.Step(inNodeMajor, inKey, true, true).push(inNodeMinor);
|
||||||
|
N.Step(inNodeMinor, inKey, false, true).push(inNodeMajor);
|
||||||
|
},
|
||||||
|
Disconnect(inNodeMajor, inNodeMinor, inKey)
|
||||||
|
{
|
||||||
|
let remove = (inArray, inMatch) => inArray.findIndex( (inMember, inIndex, inArray) => (inMember === inMatch) ? inArray.splice(inIndex, 1) : false );
|
||||||
|
|
||||||
|
// if no specific child was passed
|
||||||
|
if(inNodeMinor === null)
|
||||||
|
{
|
||||||
|
// get all the children
|
||||||
|
let check = N.Step(inNodeMajor, inKey);
|
||||||
|
if(!check){ return; }
|
||||||
|
|
||||||
|
// go down to each child ...
|
||||||
|
check.forEach( inNodeMinor =>
|
||||||
|
{
|
||||||
|
let connections = inNodeMinor.Link[inKey];
|
||||||
|
remove( connections.Get, inNodeMajor); // ... and remove any reference to the parent
|
||||||
|
|
||||||
|
// if after the remove operation, this child has no connections on inKey, scrub the key
|
||||||
|
if(!connections.Set.length && !connections.Get.length)
|
||||||
|
{
|
||||||
|
delete inNodeMinor.Link[inKey];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// we just wiped out all outgoing connections to the parent, if incoming connections are empty too we can purge the key there as well
|
||||||
|
if(inNodeMajor.Link[inKey].Get.length == 0)
|
||||||
|
{
|
||||||
|
delete inNodeMajor.Link[inKey];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no specific parent was passed
|
||||||
|
if(inNodeMajor === null)
|
||||||
|
{
|
||||||
|
// get all the parents
|
||||||
|
let check = N.Step(inNodeMinor, inKey, false);
|
||||||
|
if(!check){ return; }
|
||||||
|
|
||||||
|
// go up to each parent ...
|
||||||
|
check.forEach( inNodeMajor =>
|
||||||
|
{
|
||||||
|
let connections = inNodeMajor.Link[inKey];
|
||||||
|
remove( connections.Set, inNodeMinor); // ... and remove any reference to the child
|
||||||
|
|
||||||
|
// if after the remove operation, this parent has no connections on inKey, scrub the key
|
||||||
|
if( !connections.Set.length && !connections.Get.length )
|
||||||
|
{
|
||||||
|
delete inNodeMajor.Link[inKey];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// we just wiped out all incoming connections to the child, if outgoing connections are empty too we can purge the key there as well
|
||||||
|
if(inNodeMinor.Link[inKey].Set.length == 0)
|
||||||
|
{
|
||||||
|
delete inNodeMinor.Link[inKey];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if a specific parent and child were passed
|
||||||
|
if(inNodeMajor.Link[inKey].Set.length == 1)
|
||||||
|
{
|
||||||
|
delete inNodeMajor.Link[inKey];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
remove(inNodeMajor.Link[inKey].Set, inNodeMinor);
|
||||||
|
}
|
||||||
|
if(inNodeMinor.Link[inKey].Get.length == 1)
|
||||||
|
{
|
||||||
|
delete inNodeMinor.Link[inKey];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
remove(inNodeMinor.Link[inKey].Get, inNodeMajor);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
Step(inNode, inKey, inForward, inForceCreate)
|
||||||
|
{
|
||||||
|
let connectionGroup = inNode.Link[inKey];
|
||||||
|
if(!connectionGroup)
|
||||||
|
{
|
||||||
|
if(inForceCreate === true)
|
||||||
|
{
|
||||||
|
inNode.Link[inKey] = connectionGroup = {Get:[], Set:[]};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (inForward === undefined || inForward === true) ? connectionGroup.Set : connectionGroup.Get;
|
||||||
|
|
||||||
|
},
|
||||||
|
Walk(inIterator, inNode, inKey, inForward, inTerminal)
|
||||||
|
{
|
||||||
|
let array = N.Step(inNode, inKey, inForward);
|
||||||
|
|
||||||
|
if(!array.length && inTerminal)
|
||||||
|
{
|
||||||
|
return inTerminal(inNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(let i=0; i<array.length; i++)
|
||||||
|
{
|
||||||
|
let next = array[i];
|
||||||
|
if(next.ID.Walk !== N.ID.Walk)
|
||||||
|
{
|
||||||
|
next.ID.Walk = N.ID.Walk;
|
||||||
|
//console.log("processing", next.Meta)
|
||||||
|
let results = inIterator(next);
|
||||||
|
if(results !== false)
|
||||||
|
{
|
||||||
|
N.Walk(inIterator, next, inKey, inForward, inTerminal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//console.log("routine exited");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//console.log("id collision");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Path(inArray, inNode, inKey, inForward)
|
||||||
|
{
|
||||||
|
var current = inNode;
|
||||||
|
var direction = inForward||true;
|
||||||
|
for(let i=0; i<inArray.length; i++)
|
||||||
|
{
|
||||||
|
current = N.Step(current, inKey, direction)[inArray[i]];
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default N;
|
@ -1,4 +1,6 @@
|
|||||||
var Pivot =
|
import N from "./n.js";
|
||||||
|
|
||||||
|
const Pivot =
|
||||||
{
|
{
|
||||||
Leaves:{},
|
Leaves:{},
|
||||||
Root:N.Create({Label:"All Pivots"}),
|
Root:N.Create({Label:"All Pivots"}),
|
||||||
@ -196,3 +198,5 @@ Unmodify(inModifier)
|
|||||||
N.Disconnect(null, inModifier, "Modifier");
|
N.Disconnect(null, inModifier, "Modifier");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Pivot;
|
Loading…
Reference in New Issue
Block a user