1
0

IPO charts, updates, and other small things

This commit is contained in:
Ahmed Al-Taiar
2023-12-08 14:26:18 -05:00
parent ea8a214d19
commit a514fdaecf
16 changed files with 2401 additions and 1839 deletions

6
.gitignore vendored
View File

@ -20,3 +20,9 @@ api/src/lib/generateGraphiQLHeader.*
!.yarn/releases
!.yarn/sdks
!.yarn/versions
*.aux
*.fdb_latexmk
*.fls
*.log
*.synctex.gz

View File

@ -5,3 +5,4 @@ enum
DaisyUI
Filestack
Filestack
destructured

View File

@ -1 +1,4 @@
ENGLISH_WORD_REPEAT_BEGINNING_RULE
MORFOLOGIK_RULE_EN_US
WHITESPACE_RULE
PHRASE_REPETITION

View File

@ -2,3 +2,7 @@
{"rule":"MORFOLOGIK_RULE_EN_US","sentence":"^\\QTransactionType is an enum of values “in” or “out”.\\E$"}
{"rule":"MORFOLOGIK_RULE_EN_US","sentence":"^\\QField Required Type Default Value ID Yes Int Automatically increment Transaction Date Yes Date Now User ID relation Yes Int Type Yes TransactionType Parts Yes Json[]\\E$"}
{"rule":"ENGLISH_WORD_REPEAT_BEGINNING_RULE","sentence":"^\\QField Required Type Default Value ID Yes Int Automatically increment Transaction Date Yes Date Now User ID relation Yes Int Type Yes TransactionType Parts Yes Json[]\\E$"}
{"rule":"ENGLISH_WORD_REPEAT_RULE","sentence":"^\\QAny one of: Redirect Enter (\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q) “Parts Inventory” button (\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q) Render navigation bar (\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q) Render static components Render catalog Catalog page\\E$"}
{"rule":"WHITESPACE_RULE","sentence":"^\\Q“Sign up” link Go to sign up page (\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q)\\E$"}
{"rule":"ENGLISH_WORD_REPEAT_RULE","sentence":"^\\Q“Basket” button Render navigation bar (\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q) Render basket Basket page\\E$"}
{"rule":"ENGLISH_WORD_REPEAT_RULE","sentence":"^\\Q“Transactions” button Render navigation bar (\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q) Render transactions Transactions page\\E$"}

View File

@ -7,5 +7,8 @@
},
"[prisma]": {
"editor.formatOnSave": true
}
},
"cSpell.words": [
"Filestack"
]
}

View File

@ -3,9 +3,9 @@
"version": "0.0.0",
"private": true,
"dependencies": {
"@redwoodjs/api": "6.3.3",
"@redwoodjs/auth-dbauth-api": "6.3.3",
"@redwoodjs/graphql-server": "6.3.3",
"@redwoodjs/api": "6.4.2",
"@redwoodjs/auth-dbauth-api": "6.4.2",
"@redwoodjs/graphql-server": "6.4.2",
"filestack-js": "^3.27.0",
"nodemailer": "^6.9.7"
},

Binary file not shown.

View File

@ -1,6 +1,6 @@
<mxfile host="app.diagrams.net" modified="2023-11-30T22:48:47.583Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" etag="xdew7fTBLZGlzglp4JVp" version="22.1.5" type="device" pages="14">
<mxfile host="app.diagrams.net" modified="2023-12-07T15:23:09.719Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" etag="B0oCUVnlOo9PHF0FHsZC" version="22.1.7" type="device" pages="15">
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Enter">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="700" pageHeight="450" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="1738" dy="1004" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="700" pageHeight="450" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
@ -149,7 +149,7 @@
</mxGraphModel>
</diagram>
<diagram id="XIcEO9okOppEFiM4z20Y" name="Catalog">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1450" pageHeight="750" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="1287" dy="744" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1450" pageHeight="750" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
@ -811,6 +811,372 @@
</root>
</mxGraphModel>
</diagram>
<diagram id="2goifX3txrPkYg0WOyfT" name="Part Details">
<mxGraphModel dx="2317" dy="1339" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1300" pageHeight="650" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="349N7fltew5-p0U0mZ2r-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-1" target="349N7fltew5-p0U0mZ2r-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-1" value="Part Details page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.start_1;whiteSpace=wrap;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
<mxGeometry x="299" y="1" width="100" height="39" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-4" target="mxwkOfCih8cfDGIbAfji-13">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="190" y="70" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-4" target="mxwkOfCih8cfDGIbAfji-29">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-4" value="Render navigation bar" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="90" y="40" width="140" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.495;entryY=-0.065;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-1" target="mxwkOfCih8cfDGIbAfji-4">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="265" y="21" />
<mxPoint x="159" y="20" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-6" value="Log in &lt;br&gt;pressed?" style="shape=parallelogram;html=1;strokeWidth=2;perimeter=parallelogramPerimeter;whiteSpace=wrap;rounded=1;arcSize=0;size=0.23;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="10" y="122" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-7" value="Log in page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.document2;whiteSpace=wrap;size=0.25;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="20" y="187" width="80" height="43" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-6" target="mxwkOfCih8cfDGIbAfji-7">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="60" y="172" />
<mxPoint x="60" y="172" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-13" target="mxwkOfCih8cfDGIbAfji-15">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="190" y="274" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=-0.016;entryY=0.509;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-13" target="mxwkOfCih8cfDGIbAfji-22">
<mxGeometry relative="1" as="geometry">
<mxPoint x="210" y="260" as="targetPoint" />
<Array as="points">
<mxPoint x="190" y="252" />
<mxPoint x="210" y="252" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-13" target="mxwkOfCih8cfDGIbAfji-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-13" target="mxwkOfCih8cfDGIbAfji-32">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="190" y="210" />
<mxPoint x="235" y="210" />
<mxPoint x="235" y="120" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-13" value="Logged in?" style="rhombus;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="150" y="122" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-15" target="mxwkOfCih8cfDGIbAfji-16">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-15" value="Basket pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="10" y="262" width="120" height="25" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-16" value="Basket page" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;strokeWidth=2;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="30" y="312" width="80" height="38" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-18" target="mxwkOfCih8cfDGIbAfji-20">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-18" value="Transactions pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="150" y="302" width="120" height="35" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.336;entryY=0.008;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-13" target="mxwkOfCih8cfDGIbAfji-18">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-20" value="Transactions page" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;strokeWidth=2;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="150" y="362" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0.842;exitY=0.676;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-22" target="mxwkOfCih8cfDGIbAfji-26">
<mxGeometry relative="1" as="geometry">
<mxPoint x="340" y="250" as="sourcePoint" />
<Array as="points">
<mxPoint x="290" y="265" />
<mxPoint x="290" y="437" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-22" value="Is admin?" style="rhombus;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="219" y="211" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-23" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="167" y="200" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-26" target="mxwkOfCih8cfDGIbAfji-35">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-26" target="mxwkOfCih8cfDGIbAfji-34">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-26" value="Render admin menu" style="rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="150" y="422" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-27" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="283" y="287.5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-28" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="128" y="118" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-29" value="Render static components" style="rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="10" y="90" width="150" height="20" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-30" value="Sign out" style="rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="250" y="148" width="60" height="22" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-32" target="mxwkOfCih8cfDGIbAfji-30">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="280" y="110" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-32" value="Sign out pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="200" y="82" width="139" height="28" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-30" target="mxwkOfCih8cfDGIbAfji-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-34" value="Parts pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="10" y="422" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-35" value="Transactions pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="128" y="470" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-36" value="Part management page" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="10" y="520" width="140" height="40" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.43;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-34" target="mxwkOfCih8cfDGIbAfji-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-38" value="All transactions page" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="160" y="520" width="123" height="40" as="geometry" />
</mxCell>
<mxCell id="mxwkOfCih8cfDGIbAfji-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.397;entryY=-0.025;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="mxwkOfCih8cfDGIbAfji-35" target="mxwkOfCih8cfDGIbAfji-38">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-1" value="Specified &lt;br&gt;Part ID &lt;br&gt;is valid?" style="rhombus;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="370" y="50" width="105" height="103.5" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-2" value="404 Page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.document2;whiteSpace=wrap;size=0.25;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="514" y="81.75" width="70" height="40" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-1" target="349N7fltew5-p0U0mZ2r-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-4" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="477.5" y="76.25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.145;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-12" target="349N7fltew5-p0U0mZ2r-16">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.145;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-12" target="349N7fltew5-p0U0mZ2r-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.145;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-12" target="349N7fltew5-p0U0mZ2r-18">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.145;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-12" target="349N7fltew5-p0U0mZ2r-19">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XSuFRT8LnL-JQUWmPcDF-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.145;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-12" target="XSuFRT8LnL-JQUWmPcDF-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ls8t2gLRIs8C-7DRfSN2-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.145;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-12" target="Ls8t2gLRIs8C-7DRfSN2-1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="401" y="603" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-12" value="Query Part from DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#ffe6cc;strokeColor=#d79b00;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="392.5" y="184.25" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="349N7fltew5-p0U0mZ2r-1" target="349N7fltew5-p0U0mZ2r-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-14" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="417.5" y="152.25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-16" value="Render Name" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="421" y="280" width="83" height="30" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-17" value="Render Description" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="421" y="320" width="113" height="30" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-18" value="Render Stock" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="421" y="360" width="93" height="30" as="geometry" />
</mxCell>
<mxCell id="349N7fltew5-p0U0mZ2r-19" value="Render Image" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="421" y="400" width="91.5" height="30" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-7" target="v4ng8frYwaqqzRXWiEpR-8">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-7" target="v4ng8frYwaqqzRXWiEpR-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-7" target="v4ng8frYwaqqzRXWiEpR-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-7" target="v4ng8frYwaqqzRXWiEpR-14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-7" target="v4ng8frYwaqqzRXWiEpR-17">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="743" y="456" />
<mxPoint x="743" y="443" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-7" target="v4ng8frYwaqqzRXWiEpR-19">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="743" y="456" />
<mxPoint x="743" y="469" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-7" value="Check quantity" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="593" y="416" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-8" value="Disable &quot;+&quot; button" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="713" y="369" width="110" height="22" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-10" target="v4ng8frYwaqqzRXWiEpR-24">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="903" y="406" />
<mxPoint x="903" y="504" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-10" value="Enable &quot;-&quot; button" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="713" y="395" width="110" height="22" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-11" value="&lt;font style=&quot;font-size: 5px;&quot;&gt;= Available stock&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;" vertex="1" parent="1">
<mxGeometry x="642" y="412" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-12" value="Disable &quot;-&quot; button" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="713" y="527" width="110" height="22" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-14" target="v4ng8frYwaqqzRXWiEpR-22">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="913" y="511" />
<mxPoint x="913" y="409" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-14" value="Enable &quot;+&quot; button" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="713" y="500" width="110" height="22" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-15" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;= 1&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;" vertex="1" parent="1">
<mxGeometry x="668" y="466" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-17" target="v4ng8frYwaqqzRXWiEpR-22">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="913" y="443" />
<mxPoint x="913" y="409" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-17" value="Enable &quot;+&quot; button" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="763" y="432" width="110" height="22" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-19" target="v4ng8frYwaqqzRXWiEpR-24">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="903" y="469" />
<mxPoint x="903" y="504" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-19" value="Enable &quot;-&quot; button" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="763" y="458" width="110" height="22" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-20" value="&lt;font style=&quot;font-size: 6px;&quot;&gt;&amp;gt; 1 &amp;amp; &amp;lt; Available stock&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="663" y="432" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-22" target="v4ng8frYwaqqzRXWiEpR-25">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-22" value="&quot;+&quot; pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="933" y="395" width="120" height="28" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-24" target="v4ng8frYwaqqzRXWiEpR-26">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-24" value="&quot;-&quot; pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="933" y="490" width="120" height="28" as="geometry" />
</mxCell>
<mxCell id="XSuFRT8LnL-JQUWmPcDF-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-25" target="XSuFRT8LnL-JQUWmPcDF-1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1283" y="409" />
<mxPoint x="1283" y="360" />
<mxPoint x="590" y="360" />
<mxPoint x="590" y="449" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-25" value="Increase quantity for part by 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="1083" y="397.5" width="180" height="23" as="geometry" />
</mxCell>
<mxCell id="XSuFRT8LnL-JQUWmPcDF-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="1" source="v4ng8frYwaqqzRXWiEpR-26" target="XSuFRT8LnL-JQUWmPcDF-1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1283" y="504" />
<mxPoint x="1283" y="560" />
<mxPoint x="590" y="560" />
<mxPoint x="590" y="463" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v4ng8frYwaqqzRXWiEpR-26" value="Decrease quantity for part by 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="1083" y="492.5" width="180" height="23" as="geometry" />
</mxCell>
<mxCell id="XSuFRT8LnL-JQUWmPcDF-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="XSuFRT8LnL-JQUWmPcDF-1" target="v4ng8frYwaqqzRXWiEpR-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XSuFRT8LnL-JQUWmPcDF-1" value="Render quantity selection" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="421" y="442" width="150" height="28" as="geometry" />
</mxCell>
<mxCell id="21D_sj-4eRPsZ1sw6B3Z-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Ls8t2gLRIs8C-7DRfSN2-1" target="21D_sj-4eRPsZ1sw6B3Z-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ls8t2gLRIs8C-7DRfSN2-1" value="Add to basket pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="421" y="590" width="159.5" height="26" as="geometry" />
</mxCell>
<mxCell id="21D_sj-4eRPsZ1sw6B3Z-1" value="Add specified quantity to basket &lt;br&gt;in browser storage" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="607" y="583.5" width="192" height="39" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="jELZ0jFYEslR7ZVtnbeC" name="Login">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="500" pageHeight="675" background="#ffffff" math="0" shadow="1">
<root>
@ -1423,7 +1789,7 @@
</mxGraphModel>
</diagram>
<diagram id="J_KcE5F55eETDjKcVvue" name="Part Management">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="700" pageHeight="800" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="1735" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="700" pageHeight="800" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
@ -1820,7 +2186,7 @@
</mxGraphModel>
</diagram>
<diagram id="oP7dLKb3Lz7sM-yx4Q82" name="Admin Part">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="700" pageHeight="675" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="1735" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="700" pageHeight="675" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
@ -1989,7 +2355,7 @@
</mxGraphModel>
</diagram>
<diagram id="p7u1KqNVmTtVwIM1ecKs" name="Edit Part">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="675" pageHeight="700" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="913" dy="526" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="675" pageHeight="700" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
@ -2013,6 +2379,14 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="bmnSZ5MrdMlP95h-2Br0-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="CDfqeolx9-eL_9pxnT8W-3" target="CDfqeolx9-eL_9pxnT8W-10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="330" y="30" />
<mxPoint x="330" y="128" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="CDfqeolx9-eL_9pxnT8W-3" value="Render Admin Navigation Bar" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="140" y="14.5" width="180" height="30" as="geometry" />
</mxCell>
@ -2217,11 +2591,14 @@
<mxCell id="TJ19vSh8f4SfxF0Jsgi2-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="TJ19vSh8f4SfxF0Jsgi2-76" target="TJ19vSh8f4SfxF0Jsgi2-78" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="bmnSZ5MrdMlP95h-2Br0-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="CDfqeolx9-eL_9pxnT8W-10" target="CDfqeolx9-eL_9pxnT8W-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram name="Basket" id="1d5QTdMQSO9RcPbX_TuU">
<mxGraphModel dx="1738" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1400" pageHeight="800" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="1735" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1400" pageHeight="800" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="xGGy7mN4ZeXc9xvenCPA-0" />
<mxCell id="xGGy7mN4ZeXc9xvenCPA-1" parent="xGGy7mN4ZeXc9xvenCPA-0" />
@ -3081,32 +3458,32 @@
</mxGraphModel>
</diagram>
<diagram name="Admin Transactions" id="-ex17uwzrR4pve5Gp7S5">
<mxGraphModel dx="1121" dy="558" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="650" pageHeight="585" background="#ffffff" math="0" shadow="1">
<mxGraphModel dx="1738" dy="1004" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="650" pageHeight="585" background="#ffffff" math="0" shadow="1">
<root>
<mxCell id="XppqF2aIs4nW_R_9aRKP-0" />
<mxCell id="XppqF2aIs4nW_R_9aRKP-1" parent="XppqF2aIs4nW_R_9aRKP-0" />
<mxCell id="XppqF2aIs4nW_R_9aRKP-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-4" target="XppqF2aIs4nW_R_9aRKP-5">
<mxCell id="XppqF2aIs4nW_R_9aRKP-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-4" target="XppqF2aIs4nW_R_9aRKP-5" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-4" target="lmG0cRaEEzyi-aALEAc_-0">
<mxCell id="lmG0cRaEEzyi-aALEAc_-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-4" target="lmG0cRaEEzyi-aALEAc_-0" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-4" value="Admin Transactions page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.start_1;whiteSpace=wrap;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-4" value="Admin Transactions page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.start_1;whiteSpace=wrap;fillColor=#f8cecc;strokeColor=#b85450;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="10" y="12" width="170" height="39" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-5" value="Logged in &amp;amp; admin?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-5" value="Logged in &amp;amp; admin?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="55" y="78" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-6" value="Catalog page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.document2;whiteSpace=wrap;size=0.25;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-6" value="Catalog page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.document2;whiteSpace=wrap;size=0.25;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="180" y="98" width="80" height="40" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-5" target="XppqF2aIs4nW_R_9aRKP-6">
<mxCell id="XppqF2aIs4nW_R_9aRKP-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-5" target="XppqF2aIs4nW_R_9aRKP-6" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-8" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-8" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="140" y="91" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="310" y="322" />
@ -3115,13 +3492,13 @@
<mxPoint x="310" y="312" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-40" target="XppqF2aIs4nW_R_9aRKP-43">
<mxCell id="XppqF2aIs4nW_R_9aRKP-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-40" target="XppqF2aIs4nW_R_9aRKP-43" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-40" value="Query&lt;br&gt;DB for all transactions" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-40" value="Query&lt;br&gt;DB for all transactions" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="57.5" y="221" width="75" height="85" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-43" target="XppqF2aIs4nW_R_9aRKP-49">
<mxCell id="XppqF2aIs4nW_R_9aRKP-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-43" target="XppqF2aIs4nW_R_9aRKP-49" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="132" y="344" />
@ -3129,13 +3506,13 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-43" target="XppqF2aIs4nW_R_9aRKP-47">
<mxCell id="XppqF2aIs4nW_R_9aRKP-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-43" target="XppqF2aIs4nW_R_9aRKP-47" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-47" target="XppqF2aIs4nW_R_9aRKP-60">
<mxCell id="XppqF2aIs4nW_R_9aRKP-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-47" target="XppqF2aIs4nW_R_9aRKP-60" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-47" target="XppqF2aIs4nW_R_9aRKP-58">
<mxCell id="XppqF2aIs4nW_R_9aRKP-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-47" target="XppqF2aIs4nW_R_9aRKP-58" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="152" y="474" />
@ -3143,7 +3520,7 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-47" target="XppqF2aIs4nW_R_9aRKP-66">
<mxCell id="XppqF2aIs4nW_R_9aRKP-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-47" target="XppqF2aIs4nW_R_9aRKP-66" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="152" y="474" />
@ -3151,22 +3528,22 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-47" value="Empty?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-47" value="Empty?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="54.5" y="434" width="85" height="80" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-48" value="Success" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=-90;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-48" value="Success" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=-90;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="42" y="405" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-49" value="Render error message" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-49" value="Render error message" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="157" y="292" width="140" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-50" value="Failure" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=90;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-50" value="Failure" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=90;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="110" y="313" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-51" value="Render loading" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-51" value="Render loading" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="177" y="375" width="100" height="25" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-43" target="XppqF2aIs4nW_R_9aRKP-51">
<mxCell id="XppqF2aIs4nW_R_9aRKP-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-43" target="XppqF2aIs4nW_R_9aRKP-51" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="112" y="384" />
@ -3175,10 +3552,10 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-53" value="Loading" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-53" value="Loading" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="106" y="380" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-55" target="XppqF2aIs4nW_R_9aRKP-43">
<mxCell id="XppqF2aIs4nW_R_9aRKP-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-55" target="XppqF2aIs4nW_R_9aRKP-43" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="-8" y="364" as="sourcePoint" />
<Array as="points">
@ -3187,28 +3564,28 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-55" value="Wait until complete" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.delay;whiteSpace=wrap;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-55" value="Wait until complete" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.delay;whiteSpace=wrap;fillColor=#fff2cc;strokeColor=#d6b656;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="187" y="333" width="110" height="28" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-57" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-57" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="90" y="170" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OEr6T512QCvOfFvXdMXi-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-58" target="OEr6T512QCvOfFvXdMXi-0">
<mxCell id="OEr6T512QCvOfFvXdMXi-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-58" target="OEr6T512QCvOfFvXdMXi-0" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-58" value="Render filter by" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-58" value="Render filter by" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="172" y="484" width="100" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-60" target="XppqF2aIs4nW_R_9aRKP-58">
<mxCell id="XppqF2aIs4nW_R_9aRKP-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-60" target="XppqF2aIs4nW_R_9aRKP-58" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-60" value="Render empty" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-60" value="Render empty" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="172" y="534" width="100" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-61" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-61" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="93" y="522" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="XppqF2aIs4nW_R_9aRKP-69">
<mxCell id="XppqF2aIs4nW_R_9aRKP-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="XppqF2aIs4nW_R_9aRKP-69" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="321" y="416.75" as="sourcePoint" />
<Array as="points">
@ -3219,7 +3596,7 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-63" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="XppqF2aIs4nW_R_9aRKP-70">
<mxCell id="XppqF2aIs4nW_R_9aRKP-63" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="XppqF2aIs4nW_R_9aRKP-70" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="321" y="416.75" as="sourcePoint" />
<Array as="points">
@ -3230,7 +3607,7 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="XppqF2aIs4nW_R_9aRKP-71">
<mxCell id="XppqF2aIs4nW_R_9aRKP-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="XppqF2aIs4nW_R_9aRKP-71" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="321" y="416.75" as="sourcePoint" />
<Array as="points">
@ -3241,7 +3618,7 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="lmG0cRaEEzyi-aALEAc_-10">
<mxCell id="lmG0cRaEEzyi-aALEAc_-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="lmG0cRaEEzyi-aALEAc_-10" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="321" y="416.75" as="sourcePoint" />
<Array as="points">
@ -3252,7 +3629,7 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="kWtUEUdSHg-75lalMuGy-0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="NebFMiPikYbiae3lLhpn-0">
<mxCell id="kWtUEUdSHg-75lalMuGy-0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-66" target="NebFMiPikYbiae3lLhpn-0" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="321" y="416.75" as="sourcePoint" />
<Array as="points">
@ -3261,13 +3638,13 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-66" value="Render transactions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-66" value="Render transactions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="172" y="431" width="125" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-67" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-67" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="128.5" y="450" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-51" target="XppqF2aIs4nW_R_9aRKP-55">
<mxCell id="XppqF2aIs4nW_R_9aRKP-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-51" target="XppqF2aIs4nW_R_9aRKP-55" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="242" y="362" />
@ -3275,36 +3652,36 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-69" value="Render item count" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-69" value="Render item count" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="373" y="251.5" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-70" value="Render type (in/out)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-70" value="Render type (in/out)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="373" y="286.5" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-71" value="Render relative time since transaction" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-71" value="Render relative time since transaction" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="373" y="323" width="210" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-76">
<mxCell id="XppqF2aIs4nW_R_9aRKP-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="545" y="529" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-76">
<mxCell id="XppqF2aIs4nW_R_9aRKP-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="492" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-79">
<mxCell id="XppqF2aIs4nW_R_9aRKP-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="690" y="560" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-81">
<mxCell id="XppqF2aIs4nW_R_9aRKP-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="790" y="575.5" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-86" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-83">
<mxCell id="XppqF2aIs4nW_R_9aRKP-86" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="770" y="647" as="targetPoint" />
<Array as="points">
@ -3313,7 +3690,7 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-83">
<mxCell id="XppqF2aIs4nW_R_9aRKP-87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="890" y="632" as="targetPoint" />
<Array as="points">
@ -3322,13 +3699,13 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="dDyru9gU19JfHWnPb1cS-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-5" target="XppqF2aIs4nW_R_9aRKP-40">
<mxCell id="dDyru9gU19JfHWnPb1cS-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="XppqF2aIs4nW_R_9aRKP-5" target="XppqF2aIs4nW_R_9aRKP-40" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-0" target="lmG0cRaEEzyi-aALEAc_-1">
<mxCell id="lmG0cRaEEzyi-aALEAc_-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-0" target="lmG0cRaEEzyi-aALEAc_-1" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-0" target="lmG0cRaEEzyi-aALEAc_-3">
<mxCell id="lmG0cRaEEzyi-aALEAc_-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-0" target="lmG0cRaEEzyi-aALEAc_-3" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="400" y="33" />
@ -3336,49 +3713,49 @@
</Array>
</mxGeometry>
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-0" value="Render Admin Navigation Bar" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="lmG0cRaEEzyi-aALEAc_-0" value="Render Admin Navigation Bar" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="207" y="17.5" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-1" value="Home pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="lmG0cRaEEzyi-aALEAc_-1" value="Home pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="407" y="15" width="120" height="35" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-2" value="Catalog page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.document2;whiteSpace=wrap;size=0.25;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="lmG0cRaEEzyi-aALEAc_-2" value="Catalog page" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.document2;whiteSpace=wrap;size=0.25;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="547" y="15" width="100" height="35" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-3" value="Transactions pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="lmG0cRaEEzyi-aALEAc_-3" value="Transactions pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="407" y="63" width="163" height="35" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-1" target="lmG0cRaEEzyi-aALEAc_-2">
<mxCell id="lmG0cRaEEzyi-aALEAc_-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-1" target="lmG0cRaEEzyi-aALEAc_-2" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=0.855;entryY=0.855;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-3" target="XppqF2aIs4nW_R_9aRKP-4">
<mxCell id="lmG0cRaEEzyi-aALEAc_-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=0.855;entryY=0.855;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="lmG0cRaEEzyi-aALEAc_-3" target="XppqF2aIs4nW_R_9aRKP-4" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="lmG0cRaEEzyi-aALEAc_-10" value="Render associated user&#39;s name" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="lmG0cRaEEzyi-aALEAc_-10" value="Render associated user&#39;s name" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="373" y="359" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="XppqF2aIs4nW_R_9aRKP-43" value="Status" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="XppqF2aIs4nW_R_9aRKP-43" value="Status" style="rhombus;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="54.5" y="324" width="85" height="80" as="geometry" />
</mxCell>
<mxCell id="NebFMiPikYbiae3lLhpn-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="NebFMiPikYbiae3lLhpn-0" target="NebFMiPikYbiae3lLhpn-1">
<mxCell id="NebFMiPikYbiae3lLhpn-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="NebFMiPikYbiae3lLhpn-0" target="NebFMiPikYbiae3lLhpn-1" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NebFMiPikYbiae3lLhpn-0" value="Transaction pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="NebFMiPikYbiae3lLhpn-0" value="Transaction pressed?" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="373" y="395" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="NebFMiPikYbiae3lLhpn-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1" source="NebFMiPikYbiae3lLhpn-1" target="NebFMiPikYbiae3lLhpn-2">
<mxCell id="NebFMiPikYbiae3lLhpn-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="XppqF2aIs4nW_R_9aRKP-1" source="NebFMiPikYbiae3lLhpn-1" target="NebFMiPikYbiae3lLhpn-2" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NebFMiPikYbiae3lLhpn-1" value="Reveal transaction details" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="NebFMiPikYbiae3lLhpn-1" value="Reveal transaction details" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="321" y="448" width="150" height="32" as="geometry" />
</mxCell>
<mxCell id="NebFMiPikYbiae3lLhpn-2" value="Render parts &amp;amp; quantities" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="NebFMiPikYbiae3lLhpn-2" value="Render parts &amp;amp; quantities" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="493" y="448" width="150" height="32" as="geometry" />
</mxCell>
<mxCell id="OEr6T512QCvOfFvXdMXi-0" value="Filter" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" vertex="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="OEr6T512QCvOfFvXdMXi-0" value="Filter" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;" parent="XppqF2aIs4nW_R_9aRKP-1" vertex="1">
<mxGeometry x="321" y="492" width="69" height="30" as="geometry" />
</mxCell>
<mxCell id="OEr6T512QCvOfFvXdMXi-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.145;entryY=0.855;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="XppqF2aIs4nW_R_9aRKP-1">
<mxCell id="OEr6T512QCvOfFvXdMXi-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.145;entryY=0.855;entryDx=0;entryDy=0;entryPerimeter=0;" parent="XppqF2aIs4nW_R_9aRKP-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="355.4999999999998" y="519" as="sourcePoint" />
<mxPoint x="34.649999999999864" y="42.34500000000003" as="targetPoint" />

BIN
documents/ipo/ipo.pdf Normal file

Binary file not shown.

236
documents/ipo/ipo.tex Normal file
View File

@ -0,0 +1,236 @@
\documentclass[12pt, letterpaper]{article}
\usepackage[margin=1in]{geometry}
\usepackage{booktabs}
\usepackage{amsmath}
\usepackage{makecell}
\usepackage{tabularx}
\usepackage{ragged2e}
\renewcommand\theadfont{\bfseries}
\renewcommand\theadgape{\Gape[4pt]}
\renewcommand\cellgape{\Gape[4pt]}
\title{Parts Inventory IPO Charts}
\author{Ahmed Al-Taiar}
\date{\today}
\newcommand{\IPO}[3]{
\begin{center}
\begin{tabularx}{\linewidth}{XXX}
\toprule
\thead{Input} & \thead{Process} & \thead{Output} \\
\midrule
\RaggedRight{#1} & \RaggedRight{#2} & \RaggedRight{#3} \\
\bottomrule
\end{tabularx}
\end{center}
}
\newcommand{\n}{\newline}
\begin{document}
\maketitle
\section{Enter}\label{enter}
\subsection{Check If User Is Logged In}\label{loggedin}
\IPO{}
{ Use the destructured \texttt{boolean isAuthenticated} variable within Redwood's \texttt{useAuth} React hook.}
{\textbf{IF} \texttt{isAuthenticated}, \texttt{true} \n \textbf{ELSE}, \texttt{false}}
\subsection{Check Theme \& Default To Light}
\IPO{}
{Check the stored \texttt{theme} value in the browser's local storage.\n~\n\textbf{IF} \texttt{theme} does not exist \n $\Rightarrow$ Set \texttt{theme} to ``light''}{\textbf{IF} \texttt{theme} is ``dark'', \texttt{true} \n \textbf{ELSE}, \texttt{false}}
\section{404}
\IPO{``Back to safety'' button}{}{Go to catalog page}
\section{Navigation Bar}
\subsection{Render Navigation Bar}\label{navbar}
\IPO{Child elements}{\textbf{IF} screen width is small\n$\Rightarrow$ Render menu with all buttons\n\textbf{ELSE}\n$\Rightarrow$ Render all buttons on navigation bar\n~\n Render child elements}{Page with navigation bar at the top}
\subsection{Render All Buttons}\label{buttons}
\IPO{\begin{enumerate}\item User is logged in (\texttt{boolean}) \item User is admin (\texttt{false} if user is not logged in)\end{enumerate}}{Render ``Parts Inventory'' button\n Render ``basket'' button\n~\n\textbf{IF} user is logged in\n$\Rightarrow$ Render ``sign out'' button\n$\Rightarrow$ Render ``transactions'' button\n~\n\textbf{IF} user is admin\n$\Rightarrow$ Render ``parts'' button\n$\Rightarrow$Render (admin) ``transactions'' button}{Buttons}
\subsection{Sign Out}
\IPO{``Sign out'' button}{Use the destructured \texttt{logOut} function within Redwood's \texttt{useAuth} React hook.}{Same page the user was on originally}
\section{Admin Navigation Bar}
\subsection{Render Admin Navigation Bar}\label{adminnavbar}
\IPO{Child elements}{Render all buttons on navigation bar\n~\n Render child elements}{Page with admin navigation bar at the top}
\subsection{Render All Buttons}
\IPO{\begin{enumerate}\item Button label (\texttt{string}) \item Button destination URL (\texttt{string}) \item Title label (\texttt{string}) \item Title destination URL (\texttt{string})\end{enumerate}}{Render home button that goes to the catalog page (\ref{catalog})\n~\n Render title button with specified title and title destination URL\n~\n Render button with specified button destination URL}{Buttons}
\section{Catalog Page}
\IPO{Any one of:\begin{itemize}\item Redirect \item Enter (\ref{enter}) \item ``Parts Inventory'' button (\ref{buttons})\end{itemize}}{Render navigation bar (\ref{navbar})\n Render static components\n Render catalog}{Catalog page}
\subsection{Static Components}
\IPO{}{Render ``Parts Inventory''\n Render ``Only take what you need''}{Static components}
\subsection{Catalog}\label{catalog}
\IPO{\begin{enumerate}\item Page (default: 1)\item Sort Method (default: ID)\item Sort Order (default: ascending)\item Search query (optional)\end{enumerate}}{Query database for parts with inputted search parameters\n~\n Render a ``loading'' placeholder while the database is being queried\n~\n\textbf{IF} no parts found\n$\Rightarrow$Render ``empty'' \n\textbf{ELSE IF} an error occurred\n$\Rightarrow$Render ``error'' \n\textbf{ELSE}\n$\Rightarrow$\textbf{FOR} each part\n$\Rightarrow\Rightarrow$Render details\n$\Rightarrow\Rightarrow$Render ``add to basket'' button (\ref{ATB}, quantity of 1)\n$\Rightarrow\Rightarrow$\textbf{IF} part's stock is 0\n$\Rightarrow\Rightarrow\Rightarrow$Disable button\n$\Rightarrow\Rightarrow$Redirect to the part's page if the part is pressed\n~\n Render dropdown menus to change the search parameters, if any change, repeat~\ref{catalog}}{Catalog}
\section{Forgot Password Page}\label{forgot}
\subsection{Render Form}\label{forgotForm}
\IPO{}{Render email address input\n Render submit button}{Form}
\subsection{Submit}
\IPO{\begin{enumerate}\item ``Submit'' button\item Email address (\texttt{string})\end{enumerate}}{Query database to find account associated with the inputted email address}{\textbf{IF} Account exists with email address\n$\Rightarrow$Send email to account's address with password reset link\n\textbf{ELSE}\n$\Rightarrow$Return to form, account doesn't exist (\ref{forgotForm})}
\section{Login Page}\label{login}
\subsection{Render Form}
\IPO{}{Render email address input\n Render password input\n Render ``forgot password'' link\n Render ``sign up'' link\n Render ``login'' button}{Form}
\subsection{Log In}
\IPO{\begin{enumerate}\item ``Login'' button\item Email address (\texttt{string})\item Password (\texttt{string})\end{enumerate}}{Use the destructured \texttt{logIn} function within Redwood's \texttt{useAuth} React hook\n~\n\textbf{IF} credentials match\n$\Rightarrow$ Save session in browser's cookies, so user is still logged in\n\textbf{ELSE}\n$\Rightarrow$Reject login}{\textbf{IF} login successful\n$\Rightarrow$ Go to the page the user was previously on}
\subsection{Forgot Password}
\IPO{``Forgot password'' link}{}{Go to forgot password page (\ref{forgot})}
\subsection{Sign Up}
\IPO{``Sign up'' link}{}{Go to sign up page (\ref{signup})}
\section{Sign Up Page}\label{signup}
\subsection{Render Form}
\IPO{}{Render first name input\n Render last name input\n Render email address input\n Render password input\n Render ``login'' link\n Render ``sign up'' button}{Form}
\subsection{Sign Up}
\IPO{\begin{enumerate}\item ``Sign up'' button\item First name (\texttt{string})\item Last name (\texttt{string})\item Email address (\texttt{string})\item Password (\texttt{string})\end{enumerate}}{Use the destructured \texttt{signUp} function within Redwood's \texttt{useAuth} React hook\n~\n Save session in browser's cookies, so user is immediately logged in}{Go to the page the user was previously on}
\subsection{Log In}
\IPO{``Log in'' link}{}{Go to login page (\ref{login})}
\section{Reset Password Page}
\subsection{Render Form}
\IPO{Reset token (\texttt{string})}{Render new password input\n Render ``submit'' button\n~\n Match reset token with associated account\n\textbf{IF} reset token is not valid\n$\Rightarrow$Disable ``submit'' button}{Form}
\subsection{Reset Password}
\IPO{\begin{enumerate}\item ``Submit'' button\item New password (\texttt{string})\end{enumerate}}{Use the destructured \texttt{resetPassword} function within Redwood's \texttt{useAuth} React hook}{Go to login page (\ref{login})}
\section{Part Management Page}
\IPO{Either:\begin{itemize}\item Redirect\item ``Parts'' button\end{itemize}}{Render admin navigation bar (\ref{adminnavbar})\n Render part management}{Part management page}
\subsection{Part Management}
\IPO{Database query for parts}{Render a ``loading'' placeholder while the database is being queried\n~\n\textbf{IF} no parts found\n$\Rightarrow$Render ``empty'' \n\textbf{ELSE IF} an error occurred\n$\Rightarrow$Render ``error'' \n\textbf{ELSE}\n$\Rightarrow$\textbf{FOR} each part\n$\Rightarrow\Rightarrow$Render part ID, name, description, stock, thumbnail, and creation date in a table row\n$\Rightarrow\Rightarrow$Render ``show'' button, that goes to its part details page (\ref{partdetails})\n$\Rightarrow\Rightarrow$Render ``edit'' button that goes to its edit page (\ref{editpart})\n$\Rightarrow\Rightarrow$Render ``delete'' button that deletes the part (\ref{deletepart})}{Parts list}
\subsubsection{Delete Part}\label{deletepart}
\IPO{\begin{itemize}\item Part (\texttt{object})\item ``Delete'' button\end{itemize}}{Confirm if the admin wants to delete the part\n~\n\textbf{IF} admin confirms yes\n$\Rightarrow$ Delete part}{Refresh parts list}
\section{Admin Part Page}\label{partdetails}
\IPO{Part ``show'' button}{Render admin navigation bar (\ref{adminnavbar})\n Render admin part}{Admin part page}
\subsection{Admin Part}
\IPO{Part (\texttt{object})}{Render complete part ID, name, description, stock, image, and creation date\n~\n Render ``edit'' button that goes to its edit page (\ref{editpart})\n~\n Render ``delete button'' that deletes the part (\ref{deletepart})}{Part details}
\section{Edit Part Page}\label{editpart}
\IPO{Part ``edit'' button}{Render admin navigation bar (\ref{adminnavbar})\n Render edit form}{Edit part page}
\subsection{Edit Part}
\IPO{Part (\texttt{object})}{Render part name input (initial value: part's name)\n Render part description input (initial value: part's description)\n Render stock number input (initial value: part's stock, must be $\geq0$)\n Render current image with ``replace image'' button\n Render ``save'' button}{Edit form}
\subsection{Replace Image}
\IPO{``Replace image'' button}{Render Filestack file upload}{\textbf{IF} new image file is uploaded\n$\Rightarrow$Filestack CDN URL of the new image\n\textbf{ELSE}\n$\Rightarrow$Current image URL}
\subsection{Save}
\IPO{\begin{itemize}\item Part (\texttt{object})\item New name (\texttt{string})\item New description (\texttt{string})\item New stock (\texttt{int})\item New image URL (\texttt{string})\end{itemize}}{Overwrite the part's fields with the new values\n~\n Update part in database}{Go to part management page}
\section{New Part Page}
\IPO{``New part'' button}{Render admin navigation bar (\ref{adminnavbar})\n Render new part form}{New part page}
\subsection{New Part Form}
\IPO{}{Render part name input\n Render part description input\n Render stock number input (initial value: 0, must be $\geq0$)\n Render Filestack file upload\n Render ``save'' button}{Form}
\subsection{Save}
\IPO{\begin{itemize}\item Name (\texttt{string})\item Description (\texttt{string})\item Stock (\texttt{int})\item Image URL (\texttt{string})\end{itemize}}{Create new part in database}{Go to part management page}
\section{Part Details Page} % TODO
\IPO{Catalog part click}{Render navigation bar (\ref{navbar})\n Render part details}{Part details page}
\subsection{Part Details}
\IPO{Part (\texttt{object})}{Render complete part name, description, stock, and image\n Render quantity selector (range from 1 to part's stock)\n Render ``add to basket'' button with specified quantity (\ref{ATB})}{Part details}
\section{Basket Page}
\IPO{``Basket'' button}{Render navigation bar (\ref{navbar})\n Render basket}{Basket page}
\subsection{Basket}
\IPO{Basket entry in browser's local storage (\texttt{string} or \texttt{null})}{\textbf{IF} basket is \texttt{null} \textbf{OR} empty\n$\Rightarrow$Render ``empty'' \n\textbf{ELSE}\n$\Rightarrow$Parse basket to \texttt{object[]}\n$\Rightarrow$\textbf{FOR} each part in basket\n$\Rightarrow\Rightarrow$Render thumbnail \& title\n$\Rightarrow\Rightarrow$Render quantity selector (range from 1 to part's stock)\n$\Rightarrow\Rightarrow$Render ``delete'' button\n$\Rightarrow$Render ``clear basket'' button\n$\Rightarrow$Render ``checkout'' button}{Basket}
\subsubsection{Delete From Basket}
\IPO{\begin{itemize}\item Basket entry in browser's local storage (\texttt{string} or \texttt{null})\item Basket part\item ``Delete' button'\end{itemize}}{Parse basket to an \texttt{object[]}, or create a new array if \texttt{null} or empty\n Remove part \& quantity from basket array\n Convert basket array back to string\n Overwrite basket in browser's local storage with new basket string}{New basket}
\subsubsection{Add To Basket}\label{ATB}
\IPO{\begin{itemize}\item Basket entry in browser's local storage (\texttt{string} or \texttt{null})\item Part (\texttt{object})\item Quantity (\texttt{int})\item ``Add to basket'' button\end{itemize}}{Parse basket to an \texttt{object[]}, or create a new array if \texttt{null} or empty\n Add part \& quantity to basket array\n Convert basket array back to string\n Overwrite basket in browser's local storage with new basket string}{New basket}
\subsubsection{Clear Basket}
\IPO{``Clear basket'' button}{Delete \texttt{basket} entry from browser's local storage}{}
\subsubsection{Checkout}
\IPO{\begin{itemize}\item User is logged in (\texttt{boolean})\item Parsed basket entry from browser's local storage (\texttt{object[]})\item ``Checkout'' button\end{itemize}}{\textbf{IF} user is not logged in\n$\Rightarrow$Reject transaction\n\textbf{ELSE}\n$\Rightarrow$Get user's ID\n$\Rightarrow$\textbf{FOR} each part in \texttt{basket}\n$\Rightarrow\Rightarrow$Get up-to-date part details from database\n$\Rightarrow\Rightarrow$\textbf{IF} specified quantity for part $>$ part's stock\n$\Rightarrow\Rightarrow\Rightarrow$Reject transaction\n$\Rightarrow\Rightarrow$\textbf{ELSE}\n$\Rightarrow\Rightarrow\Rightarrow$Decrement part's stock by quantity\n$\Rightarrow$Create new transaction in database, with basket, user's ID, and ``out'' as the transaction type\n$\Rightarrow$Delete \texttt{basket} entry from browser's local storage}{Rejection message or transaction}
\section{Transactions Page}
\IPO{``Transactions'' button}{Render navigation bar (\ref{navbar})\n Render transactions}{Transactions page}
\subsection{Transactions}
\IPO{\begin{itemize}\item User ID (\texttt{int})\item Filter by (\texttt{enum})\end{itemize}}{Query database for transactions linked to specified user ID and filter\n~\n Render ``filter by'' selection\n\textbf{IF} transactions is empty\n$\Rightarrow$Render ``empty'' \n\textbf{ELSE}\n$\Rightarrow$\textbf{FOR} each transaction\n$\Rightarrow\Rightarrow$Render item count, relative time, and type (``in''/``out'')\n$\Rightarrow\Rightarrow$On press, reveal quantity and title of each part}{Transactions}
\section{Admin Transactions Page}
\IPO{(Admin)``Transactions'' button}{Render admin navigation bar (\ref{adminnavbar})\n Render admin transactions}{Admin transactions page}
\subsection{Admin Transactions}
\IPO{Filter by (\texttt{enum})}{Query database for all transactions and filter by specified filter\n~\n Render ``filter by'' selection\n\textbf{IF} transactions is empty\n$\Rightarrow$Render ``empty'' \n\textbf{ELSE}\n$\Rightarrow$\textbf{FOR} each transaction\n$\Rightarrow\Rightarrow$Render item count, relative time, type (``in''/``out''), and user's full name\n$\Rightarrow\Rightarrow$On press, reveal quantity and title of each part}{Admin transactions}
\end{document}

View File

@ -7,7 +7,7 @@
]
},
"devDependencies": {
"@redwoodjs/core": "6.3.3",
"@redwoodjs/core": "6.4.2",
"prettier-plugin-tailwindcss": "0.4.1"
},
"eslintConfig": {

View File

@ -13,10 +13,10 @@
"dependencies": {
"@mdi/js": "^7.3.67",
"@mdi/react": "^1.6.1",
"@redwoodjs/auth-dbauth-web": "6.3.3",
"@redwoodjs/forms": "6.3.3",
"@redwoodjs/router": "6.3.3",
"@redwoodjs/web": "6.3.3",
"@redwoodjs/auth-d bauth-web": "6.4.2",
"@redwoodjs/forms": "6.4.2",
"@redwoodjs/router": "6.4.2",
"@redwoodjs/web": "6.4.2",
"dayjs": "^1.11.10",
"filestack-react": "^4.0.1",
"humanize-string": "2.1.0",
@ -26,7 +26,7 @@
"theme-change": "^2.5.0"
},
"devDependencies": {
"@redwoodjs/vite": "6.3.3",
"@redwoodjs/vite": "6.4.2",
"@types/filestack-react": "^4.0.3",
"@types/node": "^20.8.9",
"@types/react": "18.2.14",

View File

@ -1,4 +1,4 @@
import { Router, Route, Set, Private } from '@redwoodjs/router'
import { Router, Route, Set, PrivateSet } from '@redwoodjs/router'
import NavbarLayout from 'src/layouts/NavbarLayout'
import ScaffoldLayout from 'src/layouts/ScaffoldLayout'
@ -13,7 +13,7 @@ const Routes = () => {
<Route path="/forgot-password" page={ForgotPasswordPage} name="forgotPassword" />
<Route path="/reset-password" page={ResetPasswordPage} name="resetPassword" />
<Private unauthenticated="home" roles="admin">
<PrivateSet unauthenticated="home" roles="admin">
<Set wrap={ScaffoldLayout} title="Parts" titleTo="parts" buttonLabel="New Part" buttonTo="newPart">
<Route path="/admin/parts/new" page={PartNewPartPage} name="newPart" />
<Route path="/admin/parts/{id:Int}/edit" page={PartEditPartPage} name="editPart" />
@ -23,15 +23,15 @@ const Routes = () => {
<Set wrap={ScaffoldLayout} title="Transactions" titleTo="adminTransactions">
<Route path="/admin/transactions" page={AdminTransactionsPage} name="adminTransactions" />
</Set>
</Private>
</PrivateSet>
<Set wrap={NavbarLayout}>
<Route path="/" page={HomePage} name="home" />
<Route path="/part/{id:Int}" page={PartPage} name="partDetails" />
<Route path="/basket" page={BasketPage} name="basket" />
<Private unauthenticated="login">
<PrivateSet unauthenticated="login">
<Route path="/transactions" page={TransactionsPage} name="userTransactions" />
</Private>
</PrivateSet>
</Set>
<Route notfound page={NotFoundPage} />

View File

@ -56,7 +56,7 @@ const NavBarLayout = ({ children }: NavBarLayoutProps) => {
<ThemeToggle />
<Link
to={routes.basket()}
className="items-cente btn btn-ghost hidden hover:shadow-lg lg:flex"
className="items-center btn btn-ghost hidden hover:shadow-lg lg:flex"
>
<div className="indicator">
{basket.length > 0 ? (

View File

@ -1,19 +1,7 @@
.rw-scaffold {
@apply bg-white text-gray-600;
}
.rw-scaffold h1,
.rw-scaffold h2 {
@apply m-0;
}
.rw-scaffold input:-ms-input-placeholder {
@apply text-gray-500;
}
.rw-scaffold input::-ms-input-placeholder {
@apply text-gray-500;
}
.rw-scaffold input::placeholder {
@apply text-gray-500;
}
.rw-header {
@apply navbar items-center justify-between space-x-3 bg-base-100 shadow-lg;
}

3420
yarn.lock

File diff suppressed because it is too large Load Diff