@teachinglab/omd
Version:
omd
392 lines (313 loc) • 12.6 kB
JavaScript
import { omdColor } from "./omdColor.js";
import { omdNumber } from "./omdNumber.js";
import { omdVariable } from "./omdVariable.js";
import { omdTerm } from "./omdTerm.js";
import { omdOperator } from "./omdOperator.js";
import { omdExpression } from "./omdExpression.js";
import { omdPowerExpression } from "./omdPowerExpression.js";
import { omdRationalExpression } from "./omdRationalExpression.js";
import { omdEquation } from "./omdEquation.js";
import { omdFunction } from "./omdFunction.js";
import { omdNumberLine } from "./omdNumberLine.js";
import { omdTapeDiagram } from "./omdTapeDiagram.js";
import { omdBalanceHanger } from "./omdBalanceHanger.js";
import { omdNumberTile } from "./omdNumberTile.js";
import { omdRatioChart } from "./omdRatioChart.js";
import { omdCoordinatePlane } from "./omdCoordinatePlane.js";
import { omdSpinner } from "./omdSpinner.js";
import { omdRightTriangle } from "./omdShapes.js";
import { omdIsoscelesTriangle } from "./omdShapes.js";
import { omdRectangle } from "./omdShapes.js";
import { omdEllipse } from "./omdShapes.js";
import { omdCircle } from "./omdShapes.js";
import { omdRegularPolygon } from "./omdShapes.js";
import { jsvgGroup } from "@teachinglab/jsvg";
export class omdApp extends jsvgGroup
{
constructor()
{
// initialization
super();
window.addEventListener("resize", this.onResize.bind(this) );
window.addEventListener("keydown", this.onKeydown.bind(this) );
// upward shift
this.setPosition( 0, -50 );
var N = new omdNumber( 100 );
N.setPosition( 100,100 );
this.addChild( N );
var V = new omdVariable('x');
V.setPosition( 100, 150 );
this.addChild( V );
var T = new omdTerm( 3, 'x', 2 );
T.setPosition( 100, 200 );
this.addChild( T );
var P = new omdOperator('*');
P.setPosition( 100, 250 );
this.addChild( P );
var E = new omdExpression();
// E.addTerm( 5 );
// E.addOperator( '+' );
// E.addTerm( 4 );
// E.addOperator( '-');
// E.addTerm( 3,'x', 2 );
E.loadFromJSON( expressionSample );
E.setPosition( 100, 300 );
this.addChild( E )
var PE = new omdPowerExpression();
var E2 = new omdExpression();
E2.addTerm( 7 );
E2.addOperator( '-' );
E2.addTerm( 5, 'x' );
PE.setExpressionAndPower( E2, new omdTerm(3,'x',2) );
PE.setPosition( 100, 370 );
this.addChild( PE );
var RE = new omdRationalExpression();
var EN = new omdExpression();
EN.addTerm( 7 );
EN.addOperator( '-' );
EN.addTerm( 5, 'x' );
var ED = new omdExpression();
ED.addTerm( 3, 'x' );
ED.addOperator( '+' );
ED.addTerm( 2 );
ED.addOperator( '-' );
ED.addTerm( 3 );
var pow = new omdPowerExpression();
var E3 = new omdExpression();
E3.addTerm("4", "x", "3");
E3.addOperator("x");
E3.addTerm("5", "y", "2");
pow.setExpressionAndPower(ED, E3);
RE.setNumeratorAndDenominator( ED, EN );
RE.setPosition( 100, 440 );
this.addChild( RE );
var F = new omdFunction();
var ER = new omdExpression();
ER.addTerm( 3, 'x' );
ER.addOperator( '+' );
ER.addTerm( 2 );
F.setNameVariableAndExpression( "f", "x", ER );
F.setPosition( 100, 540 );
this.addChild( F );
var EQ = new omdEquation();
var EL = new omdExpression();
EL.addTerm( 7 );
EL.addOperator( '-' );
EL.addTerm( 5, 'x' );
var ER = new omdExpression();
ER.addTerm( 3, 'x' );
ER.addOperator( '+' );
ER.addTerm( 2 );
EQ.setLeftAndRightExpressions( EL, ER );
EQ.setPosition( 100, 610 );
this.addChild( EQ );
var L = new omdNumberLine();
L.loadFromJSON( numberLineSample );
L.setPosition( 400, 100 );
L.updateLayout();
this.addChild( L );
var T = new omdTapeDiagram();
T.loadFromJSON( tapeDiagramSample );
T.setPosition( 400, 200 );
this.addChild( T );
T = new omdTapeDiagram();
T.loadFromJSON( tapeDiagramSample2 );
T.setPosition( 400, 300 );
this.addChild( T );
// var B = new omdBalanceHanger();
// B.loadFromJSON( balanceHangerSample );
// B.setPosition( 450, 400 );
// this.addChild( B );
var B = new omdBalanceHanger();
B.loadFromJSON( balanceHangerSample2 );
B.setPosition( 300, 100 );
this.addChild( B );
var T = new omdNumberTile();
T.setValue( 8 );
T.setSize( 'medium' );
T.setPosition( 380, 620 );
this.addChild( T );
var P = new omdRatioChart();
P.setValues( 3,5 );
P.setSize( 'large' );
P.setPosition( 550-60, 670-60 );
P.setRenderType('pie');
this.addChild( P );
var P = new omdRatioChart();
P.setValues( 3,5 );
P.setSize( 'medium' );
P.setPosition( 620, 620 );
P.setRenderType('dots');
this.addChild( P );
var P = new omdRatioChart();
P.setValues( 3,5 );
P.setSize( 'large' );
P.setPosition( 520, 740 );
P.setRenderType('bar');
this.addChild( P );
var G = new omdCoordinatePlane();
G.setPosition( 350,380 );
G.setGraphFunction( "1/2/(x)" );
G.setDotValues( [ [1,1], [3,2], [-3,2] ] );
G.setSize( "medium" );
this.addChild( G );
G = new omdCoordinatePlane();
G.setPosition( 570,380 );
G.loadFromJSON( planeWithShapes );
this.addChild( G );
var S = new omdSpinner();
S.setPosition( 870-60,670-60 );
S.setDivisions( 8 );
S.setArrowPosition( 3 );
S.setSize( "large" );
this.addChild( S );
S = new omdRightTriangle();
S.setPosition( 340,860 );
S.loadFromJSON( rightTriangleSample );
this.addChild( S );
S = new omdIsoscelesTriangle();
S.setPosition( 420,860 );
S.loadFromJSON( isoscelesTriangleSample );
this.addChild( S );
S = new omdRectangle();
S.setPosition( 470,860 );
S.loadFromJSON( rectangleSample );
this.addChild( S );
S = new omdEllipse();
S.setPosition( 650,830 );
S.loadFromJSON( ellipseSample );
this.addChild( S );
S = new omdCircle();
S.setPosition( 750,830 );
S.loadFromJSON( circleSample );
this.addChild( S );
S = new omdRegularPolygon();
S.setPosition( 830,830 );
S.loadFromJSON( regularPolygonSample );
this.addChild( S );
// AI stuff
this.inputField = new jsvgTextArea();
this.inputField.setPlaceholderText( "please enter your request here" );
this.inputField.setWidthAndHeight( 400, 100 );
this.inputField.setPosition( 800, 100 );
this.inputField.setFontFamily( "Albert Sans" );
this.inputField.setFontColor( "black" );
this.inputField.setFontSize( 14 );
this.inputField.div.style.backgroundColor = omdColor.lightGray;
this.inputField.div.style.border = "0px";
this.inputField.div.style.padding = "10px";
this.addChild( this.inputField );
this.inputButton = new jsvgButton();
this.inputButton.setText( "submit" );
this.inputButton.setFillColor( omdColor.lightGray );
this.inputButton.setPosition( 800, 220 );
this.inputButton.setClickCallback( this.handleSubmitClick.bind(this) );
this.addChild( this.inputButton );
this.responseText = new jsvgTextBox();
this.responseText.setText("");
this.responseText.setWidthAndHeight( 400, 30 );
this.responseText.setPosition( 920, 225 );
this.responseText.setFontFamily( "Albert Sans" );
this.responseText.setFontColor( omdColor.darkGray );
this.responseText.setFontSize( 14 );
this.addChild( this.responseText );
this.AIholder = new jsvgGroup();
this.AIholder.setPosition( 800, 350 );
this.addChild( this.AIholder );
// resize
this.onResize();
}
onKeydown( event )
{
}
update()
{
super.update();
window.equatorScale = 1.5;
}
onResize()
{
}
handleSubmitClick( B )
{
this.responseText.setText( "working..." );
var text = this.inputField.getText();
console.log( text );
this.fetchAI( text );
}
handleAIResponse( jsonData )
{
this.AIholder.removeAllChildren();
var N = null;
if ( jsonData.omdType == "number" ) { var N = new omdNumber(); }
if ( jsonData.omdType == "variable" ) { var N = new omdVariable(); }
if ( jsonData.omdType == "operator" ) { var N = new omdOperator(); }
if ( jsonData.omdType == "term" ) { var N = new omdTerm(); }
if ( jsonData.omdType == "expression" ) { var N = new omdExpression(); }
if ( jsonData.omdType == "powerExpression" ) { var N = new omdPowerExpression(); }
if ( jsonData.omdType == "rationalExpression" ) { var N = new omdRationalExpression(); }
if ( jsonData.omdType == "function" ) { var N = new omdFunction(); }
if ( jsonData.omdType == "equation" ) { var N = new omdEquation(); }
if ( jsonData.omdType == "numberLine" ) { var N = new omdNumberLine(); }
if ( jsonData.omdType == "balanceHanger" )
{
var N = new omdBalanceHanger();
N.setPosition( 150, 0 );
}
if ( jsonData.omdType == "tapeDiagram" ) { var N = new omdTapeDiagram(); }
if ( jsonData.omdType == "numberTile" ) { var N = new omdNumberTile(); }
if ( jsonData.omdType == "ratioChart" ) { var N = new omdRatioChart(); }
if ( jsonData.omdType == "coordinatePlane" ) { var N = new omdCoordinatePlane(); }
if ( jsonData.omdType == "spinner" ) { var N = new omdSpinner(); }
if ( jsonData.omdType == "rightTriangle" ) { var N = new omdRightTriangle(); }
if ( jsonData.omdType == "isoscelesTriangle" ) { var N = new omdIsoscelesTriangle(); }
if ( jsonData.omdType == "rectangle" ) { var N = new omdRectangle(); }
if ( jsonData.omdType == "ellipse" ) { var N = new omdEllipse(); }
if ( jsonData.omdType == "circle" ) { var N = new omdCircle(); }
if ( jsonData.omdType == "regularPolygon" ) { var N = new omdRegularPolygon(); }
// load from json
N.loadFromJSON( jsonData );
// add to the AI holder
this.AIholder.addChild( N );
}
fetchAI( topic )
{
// console.log( "=== fetchAI ===" );
// console.log( topic );
// consturct url based on topic
var urlToFetch = "";
if ( window.location.hostname.includes("localhost") )
urlToFetch = "http://localhost:8888/.netlify/functions/ai-omd-lookup/";
else
urlToFetch = "https://teaching-lab-omd.netlify.app/.netlify/functions/ai-omd-lookup/";
// add topic
urlToFetch += "?topic='" + topic + "'";
// console.log( "URL: " + urlToFetch );
// fetch the data
fetch( urlToFetch )
.then((response) => response.text())
.then((body) => {
// console.log("==== raw data ======");
// console.log( body );
// console.log("==== preParseData ======");
var preParseData = body;
preParseData = preParseData.replaceAll( "`", "" );
preParseData = preParseData.replaceAll( "json", "" );
// console.log( "=== pre-parse ===" );
// console.log( preParseData );
try
{
var data = JSON.parse( preParseData );
this.responseText.setText( "" );
this.handleAIResponse( data );
}
catch
{
// if parsing failed, try again
console.log( preParseData );
console.log(">>> data not parse-able");
this.responseText.setText( "An error occured. Please try again." );
}
});
}
}