Created
December 17, 2017 15:27
-
-
Save evgeny-boger/96426aa9f11c32ceef02b2465ad396eb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/app/examples/svg/Thermometer.svg b/app/examples/svg/Thermometer.svg | |
| new file mode 100644 | |
| index 0000000..df1b1ae | |
| --- /dev/null | |
| +++ b/app/examples/svg/Thermometer.svg | |
| @@ -0,0 +1,750 @@ | |
| +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
| +<svg | |
| + xmlns:dc="http://purl.org/dc/elements/1.1/" | |
| + xmlns:cc="http://creativecommons.org/ns#" | |
| + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
| + xmlns:svg="http://www.w3.org/2000/svg" | |
| + xmlns="http://www.w3.org/2000/svg" | |
| + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |
| + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |
| + version="1.0" | |
| + width="427.48624" | |
| + height="727.86469" | |
| + viewBox="0 0 592.06842 322.08013" | |
| + preserveAspectRatio="xMidYMid meet" | |
| + id="svg2635" | |
| + sodipodi:version="0.32" | |
| + inkscape:version="0.91 r13725" | |
| + sodipodi:docname="Thermometer.svg" | |
| + inkscape:output_extension="org.inkscape.output.svg.inkscape"> | |
| + <defs | |
| + id="defs3072" /> | |
| + <sodipodi:namedview | |
| + inkscape:window-height="1056" | |
| + inkscape:window-width="2560" | |
| + inkscape:pageshadow="2" | |
| + inkscape:pageopacity="0.0" | |
| + guidetolerance="10.0" | |
| + gridtolerance="10.0" | |
| + objecttolerance="10.0" | |
| + borderopacity="1.0" | |
| + bordercolor="#666666" | |
| + pagecolor="#ffffff" | |
| + id="base" | |
| + inkscape:zoom="2.4281066" | |
| + inkscape:cx="224.75397" | |
| + inkscape:cy="278.36015" | |
| + inkscape:window-x="0" | |
| + inkscape:window-y="24" | |
| + inkscape:current-layer="layer2" | |
| + width="200px" | |
| + height="1200px" | |
| + borderlayer="true" | |
| + showguides="true" | |
| + inkscape:guide-bbox="true" | |
| + showgrid="false" | |
| + fit-margin-top="50" | |
| + fit-margin-left="50" | |
| + fit-margin-right="50" | |
| + fit-margin-bottom="50" | |
| + inkscape:showpageshadow="false" | |
| + inkscape:window-maximized="1" /> | |
| + <metadata | |
| + id="metadata2637"> | |
| +Created by potrace 1.8, written by Peter Selinger 2001-2007 | |
| +<rdf:RDF> | |
| + <cc:Work | |
| + rdf:about=""> | |
| + <dc:format>image/svg+xml</dc:format> | |
| + <dc:type | |
| + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |
| + <dc:title /> | |
| + </cc:Work> | |
| +</rdf:RDF> | |
| +</metadata> | |
| + <g | |
| + inkscape:groupmode="layer" | |
| + id="layer1" | |
| + inkscape:label="1" | |
| + style="display:inline" | |
| + transform="translate(0.61878033,196.12002)" /> | |
| + <g | |
| + inkscape:groupmode="layer" | |
| + id="layer2" | |
| + inkscape:label="2" | |
| + style="display:inline" | |
| + transform="translate(0.61878033,196.12002)"> | |
| + <path | |
| + id="use3854" | |
| + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.79501063;stroke-opacity:1" | |
| + d="m 131.58415,377.0585 0,-91.62481 c 0,-20.98341 -8.76087,-22.16246 -6.36008,-33.32846 2.97285,-13.8267 24.34719,-19.52316 24.34719,-33.57678 l 0,-647.75977 c 0,-22.29796 -17.94946,-40.24741 -40.24741,-40.24741 -22.297951,0 -40.24741,17.94945 -40.24741,40.24741 l 0,647.75977 c 0,14.05362 21.374336,19.75008 24.347194,33.57678 2.400783,11.166 -6.360085,12.34505 -6.360085,33.32846 l 0,91.62481 c 0,12.3295 9.930837,22.2603 22.260301,22.2603 12.32946,0 22.2603,-9.9308 22.2603,-22.2603 z" | |
| + inkscape:connector-curvature="0" | |
| + sodipodi:nodetypes="ssssscssssscs" /> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="26.99489" | |
| + id="text3349" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3351" | |
| + x="119.66073" | |
| + y="26.99489">10</tspan></text> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-336.01945 24.881832,0" | |
| + id="path3365" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-291.54014 24.881832,0" | |
| + id="path3367" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-247.06077 24.881832,0" | |
| + id="path3369" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-202.58148 24.881832,0" | |
| + id="path3371" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-158.10214 24.881832,0" | |
| + id="path3373" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-113.62283 24.881832,0" | |
| + id="path3375" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-69.143516 24.881832,0" | |
| + id="path3377" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,-24.664203 24.881832,0" | |
| + id="path3379" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,19.815128 24.881832,0" | |
| + id="path3381" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,64.294424 24.881832,0" | |
| + id="path3383" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,108.77375 24.881832,0" | |
| + id="path3385" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,153.25307 24.881832,0" | |
| + id="path3387" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.5740149px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.965942,197.7324 24.881832,0" | |
| + id="path3389" | |
| + inkscape:connector-curvature="0" /> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-17.825396" | |
| + id="text3393" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3395" | |
| + x="119.66073" | |
| + y="-17.825396">20</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-62.645725" | |
| + id="text3397" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3399" | |
| + x="119.66073" | |
| + y="-62.645725">30</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-107.46603" | |
| + id="text3401" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403" | |
| + x="119.66073" | |
| + y="-107.46603">40</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-152.28632" | |
| + id="text3405" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3407" | |
| + x="119.66073" | |
| + y="-152.28632">50</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-197.10661" | |
| + id="text3409" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3411" | |
| + x="119.66073" | |
| + y="-197.10661">60</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-241.92694" | |
| + id="text3413" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3415" | |
| + x="119.66073" | |
| + y="-241.92694">70</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-286.77151" | |
| + id="text3417" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3419" | |
| + x="119.66073" | |
| + y="-286.77151">80</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="119.66073" | |
| + y="-331.56763" | |
| + id="text3421" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3423" | |
| + x="119.66073" | |
| + y="-331.56763">90</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="117.30882" | |
| + y="116.63543" | |
| + id="text3429" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3431" | |
| + x="117.30882" | |
| + y="116.63543">-10</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="117.30882" | |
| + y="161.45564" | |
| + id="text3433" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3435" | |
| + x="117.30882" | |
| + y="161.45564">-20</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="117.30882" | |
| + y="206.27582" | |
| + id="text3437" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3439" | |
| + x="117.30882" | |
| + y="206.27582">-30</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="124.10103" | |
| + y="71.815208" | |
| + id="text3441" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3443" | |
| + x="124.10103" | |
| + y="71.815208">0</tspan></text> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-32.999485 15.383003,0" | |
| + id="path3445" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-41.854635 15.383003,0" | |
| + id="path3447" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-50.709808 15.383003,0" | |
| + id="path3449" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-59.564993 15.383003,0" | |
| + id="path3455" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,27.498552 15.383003,0" | |
| + id="path3467" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,9.4471037 15.383003,0" | |
| + id="path3469" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,0.59193072 15.383003,0" | |
| + id="path3471" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-17.11841 15.383003,0" | |
| + id="path3473" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,36.353743 15.383003,0" | |
| + id="path3475" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-8.2632538 15.383003,0" | |
| + id="path3477" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,81.865743 15.383003,0" | |
| + id="path3495" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,73.010587 15.383003,0" | |
| + id="path3497" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,46.44508 15.383003,0" | |
| + id="path3501" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,90.720922 15.383003,0" | |
| + id="path3503" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,55.30023 15.383003,0" | |
| + id="path3505" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,136.23296 15.383003,0" | |
| + id="path3509" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,127.3778 15.383003,0" | |
| + id="path3511" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,118.52259 15.383003,0" | |
| + id="path3513" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,100.81228 15.383003,0" | |
| + id="path3515" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,145.08811 15.383003,0" | |
| + id="path3517" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,189.06741 15.383003,0" | |
| + id="path3523" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,180.21226 15.383003,0" | |
| + id="path3525" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,171.3571 15.383003,0" | |
| + id="path3527" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,162.50189 15.383003,0" | |
| + id="path3533" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-87.366653 15.383003,0" | |
| + id="path3537" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-96.221809 15.383003,0" | |
| + id="path3539" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-105.07698 15.383003,0" | |
| + id="path3541" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-124.32003 15.383003,0" | |
| + id="path3543" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-78.511462 15.383003,0" | |
| + id="path3545" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-140.20118 15.383003,0" | |
| + id="path3551" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-149.05633 15.383003,0" | |
| + id="path3553" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-175.62184 15.383003,0" | |
| + id="path3557" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-131.34599 15.383003,0" | |
| + id="path3559" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-166.76669 15.383003,0" | |
| + id="path3561" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-194.56831 15.383003,0" | |
| + id="path3565" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-212.27865 15.383003,0" | |
| + id="path3569" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-229.98897 15.383003,0" | |
| + id="path3571" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-185.71313 15.383003,0" | |
| + id="path3573" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-221.13382 15.383003,0" | |
| + id="path3575" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-257.79067 15.383003,0" | |
| + id="path3581" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-266.64584 15.383003,0" | |
| + id="path3583" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-284.35618 15.383003,0" | |
| + id="path3585" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-238.54761 15.383003,0" | |
| + id="path3587" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-275.50103 15.383003,0" | |
| + id="path3589" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-300.23729 15.383003,0" | |
| + id="path3593" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-309.09244 15.383003,0" | |
| + id="path3595" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-317.94762 15.383003,0" | |
| + id="path3597" | |
| + inkscape:connector-curvature="0" /> | |
| + <path | |
| + style="display:inline;fill:none;stroke:#000000;stroke-width:0.57401484px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + d="m 68.631216,-326.8028 15.383003,0" | |
| + id="path3603" | |
| + inkscape:connector-curvature="0" /> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:31.38855171px;line-height:125%;font-family:'Nimbus Roman No9 L';-inkscape-font-specification:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="92.052765" | |
| + y="-442.61591" | |
| + id="text3774" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.9937671)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3776" | |
| + x="92.052765" | |
| + y="-442.61591">°C</tspan></text> | |
| + <path | |
| + sodipodi:nodetypes="cssssssscc" | |
| + inkscape:connector-curvature="0" | |
| + id="path3866" | |
| + d="m 100.97465,197.97305 -0.33342,73.10428 c -0.0163,3.57015 -4.351178,13.89982 -4.351178,17.76777 l 0,87.18253 c 0,7.28706 5.814958,10.84348 13.160668,10.84348 7.34571,0 13.25592,-5.88824 13.25592,-13.17528 l 0,-87.18251 c 0,-3.87124 -4.339,-14.19448 -4.35118,-17.76777 l -0.24108,-70.7525 z" | |
| + style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none" /> | |
| + <path | |
| + style="fill:none;stroke:#000000;stroke-width:0.79501063;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" | |
| + d="m 109.3332,-433.33948 c -4.85309,0 -8.76996,3.91688 -8.76996,8.76996 l 0,694.91384 c 0,3.53438 -4.273188,13.76045 -4.273188,17.58961 l 0,86.30834 c 0,7.21399 5.829108,13.04317 13.043148,13.04317 7.21403,0 13.0183,-5.82918 13.0183,-13.04317 l 0,-86.30834 c 0,-3.83242 -4.27319,-14.05213 -4.27319,-17.58961 l 0,-694.91384 c 0,-4.85308 -3.89202,-8.76996 -8.74511,-8.76996 z" | |
| + id="rect3859" | |
| + inkscape:connector-curvature="0" | |
| + sodipodi:nodetypes="sssssssssss" /> | |
| + <rect | |
| + style="opacity:1;fill:#0019ff;fill-opacity:1;stroke:none;stroke-width:3.79500008;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |
| + id="rect4251" | |
| + width="16.743309" | |
| + height="140.7113" | |
| + x="100.95068" | |
| + y="57.359249" /> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="188.808" | |
| + y="74.418556" | |
| + id="text3401-6" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><desc | |
| + id="desc4277">channel="wb-ms-thls_2/Temperature"</desc><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7" | |
| + x="188.808" | |
| + y="74.418556" | |
| + style="font-size:55.65074921px">{{val}} °C</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-weight:normal;font-size:21.86279297px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + x="183.13388" | |
| + y="-116.59325" | |
| + id="text4273" | |
| + sodipodi:linespacing="125%"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan4275" | |
| + x="183.13388" | |
| + y="-116.59325" /></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="186.66908" | |
| + y="207.35339" | |
| + id="text3401-6-6-1" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><desc | |
| + id="desc4277-2-3">channel="wb-ms-thls_2/Temperature" | |
| +value="{{val * 1.8 + 32|number:2}}"</desc><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-0-3" | |
| + x="186.66908" | |
| + y="207.35339" | |
| + style="font-size:55.65074921px">24.00</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="189.58334" | |
| + y="143.88379" | |
| + id="text3401-6-6-9" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><desc | |
| + id="desc4277-2-4">channel="wb-ms-thls_2/Temperature" | |
| +value="{{val|number:1}}"</desc><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-0-0" | |
| + x="189.58334" | |
| + y="143.88379" | |
| + style="font-size:55.65074921px">24.0</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:41.54999924px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#ff0000;fill-opacity:1;stroke:none" | |
| + x="264.27759" | |
| + y="362.24765" | |
| + id="text3401-6-6-9-3" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><desc | |
| + id="desc4277-2-4-7">channel="wb-ms-thls_2/Temperature" | |
| +ng-show="val > 26"</desc><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-0-0-6" | |
| + x="264.27759" | |
| + y="362.24765" | |
| + style="font-size:41.54999924px;fill:#ff0000">Перегрев!</tspan></text> | |
| + <rect | |
| + style="opacity:1;fill:#a500ff;fill-opacity:1;stroke:none;stroke-width:3.79500008;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |
| + id="rect4394" | |
| + width="29.544361" | |
| + height="2.0166802" | |
| + x="90.827309" | |
| + y="63.514423"> | |
| + <desc | |
| + id="desc4396">channel="wb-ms-thls_2/Temperature" | |
| +y="{{ 64.29 + (-336.02-64.29)/90*val}}"</desc> | |
| + </rect> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-weight:normal;font-size:24.23749924px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |
| + x="203.60585" | |
| + y="287.21753" | |
| + id="text4416" | |
| + sodipodi:linespacing="125%"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan4418" | |
| + x="203.60585" | |
| + y="287.21753">Показать ошибку, </tspan><tspan | |
| + sodipodi:role="line" | |
| + x="203.60585" | |
| + y="317.5144" | |
| + id="tspan4420">если больше 26°C:</tspan></text> | |
| + <rect | |
| + style="opacity:1;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:3.79500008;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |
| + id="rect4422" | |
| + width="316.21542" | |
| + height="137.94092" | |
| + x="193.78918" | |
| + y="257.61819" /> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="360.50098" | |
| + y="205.75998" | |
| + id="text3401-6-6-1-0" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-0-3-1" | |
| + x="360.50098" | |
| + y="205.75998" | |
| + style="font-size:55.65074921px">°F</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="360.37878" | |
| + y="143.20096" | |
| + id="text3401-6-6-9-2" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-0-0-8" | |
| + x="360.37878" | |
| + y="143.20096" | |
| + style="font-size:55.65074921px">°C</tspan></text> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none" | |
| + x="176.13321" | |
| + y="-419.16727" | |
| + id="text3401-6-0" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-8" | |
| + x="176.13321" | |
| + y="-419.16727" | |
| + style="font-size:38.08749798px">A1_OUT:</tspan></text> | |
| + <rect | |
| + style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:3.79500031;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |
| + id="rect4422-8" | |
| + width="316.21542" | |
| + height="137.94092" | |
| + x="168.685" | |
| + y="-460.1723" /> | |
| + <text | |
| + xml:space="preserve" | |
| + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.52757454px;line-height:125%;font-family:Verdana;text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#ff0000;fill-opacity:1;stroke:none" | |
| + x="185.15521" | |
| + y="-367.38754" | |
| + id="text3401-6-0-8" | |
| + sodipodi:linespacing="125%" | |
| + transform="scale(1.006272,0.99376709)"><desc | |
| + id="desc4277-4-1">channel="wb-gpio/A1_OUT" | |
| +value="{{ ((val+ 0) >0) ? 'включен' : 'выключен' }}"</desc><tspan | |
| + sodipodi:role="line" | |
| + id="tspan3403-7-8-4" | |
| + x="185.15521" | |
| + y="-367.38754" | |
| + style="font-size:38.08749771px;fill:#ff0000">|выключен|</tspan></text> | |
| + <circle | |
| + style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:5.25607491;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | |
| + id="path4523" | |
| + cx="444.28821" | |
| + cy="-428.03198" | |
| + r="17.112099"> | |
| + <desc | |
| + id="desc4525">channel="wb-gpio/A1_OUT" | |
| +append-style="{{ ((val+ 0) >0) ? ';fill:#00ff00' : ';fill:#ff0000' }}"</desc> | |
| + </circle> | |
| + </g> | |
| +</svg> | |
| diff --git a/app/scripts/app.js b/app/scripts/app.js | |
| index 16200da..d4ef499 100644 | |
| --- a/app/scripts/app.js | |
| +++ b/app/scripts/app.js | |
| @@ -70,6 +70,8 @@ import cellPickerDirective from './directives/cellpicker'; | |
| import explicitChangesDirective from './directives/explicitchanges'; | |
| import editableElasticTextareaDirective from './directives/editableelastictextarea'; | |
| import userRolesDirective from './directives/user-roles.directive'; | |
| +import {svgSchemeDirective, svgCompiledElementDirective} from './directives/svgScheme'; | |
| + | |
| import metaTypeFilterModule from './filters/metaTypeFilter'; | |
| @@ -224,7 +226,9 @@ module | |
| .directive('cellPicker', cellPickerDirective) | |
| .directive('explicitChanges', explicitChangesDirective) | |
| .directive('editableElasticTextarea', editableElasticTextareaDirective) | |
| + .directive('svgCompiledElement', svgCompiledElementDirective) | |
| + .directive('svgScheme', svgSchemeDirective); | |
| module | |
| .config((JSONEditorProvider, DumbTemplateProvider) => { | |
| diff --git a/app/scripts/controllers/dashboardController.js b/app/scripts/controllers/dashboardController.js | |
| index 842c4cf..e8ca0ec 100644 | |
| --- a/app/scripts/controllers/dashboardController.js | |
| +++ b/app/scripts/controllers/dashboardController.js | |
| @@ -1,31 +1,32 @@ | |
| class DashboardCtrl { | |
| - constructor($scope, uiConfig, $stateParams, rolesFactory) { | |
| - 'ngInject'; | |
| + constructor($scope, uiConfig, $stateParams, rolesFactory) { | |
| + 'ngInject'; | |
| + $scope.roles = rolesFactory; | |
| + var defaultDashboard = {}; | |
| - $scope.roles = rolesFactory; | |
| - var defaultDashboard = {}; | |
| - function getDashboard () { | |
| - return uiConfig.getDashboard($stateParams.id); | |
| - } | |
| + function getDashboard() { | |
| + return uiConfig.getDashboard($stateParams.id); | |
| + } | |
| + | |
| + uiConfig.whenReady().then(() => { | |
| + $scope.$watch(getDashboard, newDashboard => { | |
| + $scope.dashboard = newDashboard; | |
| + }); | |
| + }); | |
| - uiConfig.whenReady().then(() => { | |
| - $scope.$watch(getDashboard, newDashboard => { | |
| - $scope.dashboard = newDashboard; | |
| - }); | |
| + $scope.addWidget = () => { | |
| + $scope.dashboard.widgets.push(uiConfig.addWidget()); | |
| + }; | |
| - $scope.addWidget = () => { | |
| - $scope.dashboard.widgets.push(uiConfig.addWidget()); | |
| - }; | |
| + $scope.removeWidget = (widget) => { | |
| + $scope.dashboard.removeWidgetFromDashboard(widget); | |
| + }; | |
| - $scope.removeWidget = (widget) => { | |
| - $scope.dashboard.removeWidgetFromDashboard(widget); | |
| - }; | |
| + $scope.deleteWidget = (widget) => { | |
| + uiConfig.deleteWidget(widget); | |
| + }; | |
| - $scope.deleteWidget = (widget) => { | |
| - uiConfig.deleteWidget(widget); | |
| - }; | |
| - }); | |
| - } | |
| + } | |
| } | |
| //----------------------------------------------------------------------------- | |
| diff --git a/app/scripts/controllers/dashboardsController.js b/app/scripts/controllers/dashboardsController.js | |
| index 33b4860..2c8aac2 100644 | |
| --- a/app/scripts/controllers/dashboardsController.js | |
| +++ b/app/scripts/controllers/dashboardsController.js | |
| @@ -1,7 +1,7 @@ | |
| class DashboardsCtrl { | |
| constructor(uiConfig,rolesFactory) { | |
| 'ngInject'; | |
| this.roles = rolesFactory; | |
| this.uiConfig = uiConfig; | |
| this.data = uiConfig.data; | |
| @@ -14,10 +14,18 @@ class DashboardsCtrl { | |
| this.uiConfig.addDashboard(); | |
| } | |
| + addDashboardWithSvg() { | |
| + this.uiConfig.addDashboardWithSvg(); | |
| + } | |
| + | |
| + deleteDashboard(dashbrd) { | |
| + this.data.dashboards = this.data.dashboards | |
| + .filter(dashboard => !(dashboard.name === dashbrd.name && dashboard.id === dashbrd.id)); | |
| + }; | |
| + | |
| //............................................................................. | |
| checkNonEmpty(value, msg) { | |
| - if (!/\S/.test(value)) | |
| - return msg; | |
| + if (!/\S/.test(value)) return msg; | |
| return true; | |
| }; | |
| diff --git a/app/scripts/directives/svgScheme.js b/app/scripts/directives/svgScheme.js | |
| new file mode 100644 | |
| index 0000000..5d61dcc | |
| --- /dev/null | |
| +++ b/app/scripts/directives/svgScheme.js | |
| @@ -0,0 +1,119 @@ | |
| + | |
| +export function svgSchemeDirective($compile, DeviceData) { | |
| + 'ngInject'; | |
| + return { | |
| + restrict: 'E', | |
| + scope : { | |
| + svgFullWidth: "=" | |
| + }, | |
| + link: function (scope, element, attrs) { | |
| + function getElementAttributes (elem) { | |
| + var attr = {}; | |
| + if(elem && elem.length) { | |
| + $.each(elem.get(0).attributes, function(v,n) { | |
| + n = n.nodeName||n.name; | |
| + v = elem.attr(n); // relay on $.fn.attr, it makes some filtering and checks | |
| + if(v != undefined && v !== false) attr[n] = v | |
| + }) | |
| + } | |
| + | |
| + return attr; | |
| + } | |
| + function parseAttrs(attrStr) { | |
| + try { | |
| + var el = angular.element("<div " + attrStr + " />"); | |
| + } catch (err) { | |
| + return {}; | |
| + } | |
| + | |
| + return getElementAttributes(el); | |
| + | |
| + } | |
| + | |
| + scope.devicedata = DeviceData; | |
| + var elem = element[0]; | |
| + var svg = element[0].querySelector("svg"); | |
| + var w = angular.element(svg).width(), | |
| + h = angular.element(svg).height(), | |
| + _w = angular.element(elem).width(), | |
| + _h = angular.element(elem).height(), | |
| + r = _w / w; | |
| + | |
| + | |
| + if (scope.svgFullWidth) { | |
| + angular.element(svg).attr("width", w * r); | |
| + angular.element(elem).attr("height", h * r ); | |
| + angular.element(svg).attr("height", h * r); | |
| + } | |
| + | |
| + var regions = element[0].querySelectorAll("*"); | |
| + angular.forEach(regions, function (path, key) { | |
| + var element = angular.element(path); | |
| + element.attr("svg-compiled-element", ""); | |
| + | |
| + var desc = element[0].querySelector("desc"); | |
| + if (desc != null) { | |
| + | |
| + var attrs = parseAttrs(desc.innerHTML); | |
| + | |
| + if (element[0].nodeName == 'text') { | |
| + if (attrs.hasOwnProperty("value")) { | |
| + var tspan = element[0].querySelector("tspan"); | |
| + if (tspan != null) { | |
| + tspan.innerHTML = attrs.value; | |
| + } | |
| + } | |
| + } | |
| + | |
| + for (var descAttr in attrs) { | |
| + if ((descAttr != "channel") && (descAttr != "value")) { | |
| + if (descAttr.indexOf("append-") == 0) { | |
| + var replAttr = descAttr.slice(7); //7 == length of "append-" | |
| + //console.log("replace %s", replAttr); | |
| + element.attr(replAttr, | |
| + element.attr(replAttr) + attrs[descAttr]); | |
| + } else { | |
| + element.attr(descAttr, attrs[descAttr]); | |
| + } | |
| + } | |
| + } | |
| + | |
| + | |
| + if (attrs.hasOwnProperty("channel")) { | |
| + var channelStr = attrs.channel/*'wb-map12h_91/Ch 2 Pfund L3';*/; | |
| + var channelArr = channelStr.split("/"); | |
| + | |
| + if (channelArr.length == 2) { | |
| + var channelVar = `devicedata.proxy('${channelStr}')`; | |
| + element.attr("val", channelVar + '.value'); | |
| + element.attr("type", channelVar + '.metaType'); | |
| + element.attr("units", channelVar + '.metaUnits'); | |
| + element.attr("error", channelVar + '.metaError'); | |
| + element.attr("device", channelStr); | |
| + //console.log("_______", scope.devicedata.proxy(channelStr).value); | |
| + } | |
| + } | |
| + } | |
| + $compile(element)(scope); | |
| + }) | |
| + } | |
| + } | |
| +} | |
| + | |
| +export function svgCompiledElementDirective($compile) { | |
| + 'ngInject'; | |
| + return { | |
| + restrict: 'A', | |
| + scope: { | |
| + val: "=", | |
| + type: "=", | |
| + units: "=", | |
| + error: "=" | |
| + }, | |
| + link: function (scope, element, attrs) { | |
| + element.removeAttr("svg-compiled-element"); | |
| + $compile(element)(scope); | |
| + //console.log("device", attrs.device); | |
| + } | |
| + } | |
| +} | |
| \ No newline at end of file | |
| --- a/app/scripts/services/uiconfig.js | |
| +++ b/app/scripts/services/uiconfig.js | |
| @@ -70,8 +70,10 @@ function uiConfigService($rootScope, $q) { | |
| }).map(item => { | |
| var toCopy = angular.extend({}, item); | |
| delete toCopy._model; | |
| + // для дашбордов | |
| // FIXME: test this | |
| if (toCopy.hasOwnProperty("widgets")) { | |
| + item.isSvg = !!item.svg_url; | |
| var newWidgets = Object.create(null); | |
| data.widgets.forEach(widget => { | |
| if (widget.isNew) | |
| @@ -178,9 +180,23 @@ function uiConfigService($rootScope, $q) { | |
| addDashboard: () => { | |
| var item = add("dashboards", "dashboard", { | |
| name: "", | |
| + widgets: [], | |
| + isSvg: false | |
| + }); | |
| + item._model = new Dashboard(item); | |
| + return item._model; | |
| + }, | |
| + | |
| + addDashboardWithSvg: () => { | |
| + var item = add("dashboards", "dashboard", { | |
| + name: "", | |
| + isSvg: true, | |
| + svg_url: "", | |
| + svg_fullwidth: '', | |
| widgets: [] | |
| }); | |
| item._model = new Dashboard(item); | |
| + | |
| return item._model; | |
| }, | |
| diff --git a/app/styles/main.css b/app/styles/main.css | |
| index 78bcffb..4e98b27 100644 | |
| --- a/app/styles/main.css | |
| +++ b/app/styles/main.css | |
| @@ -741,3 +743,57 @@ button.show-console span { | |
| .history-time-col-r { | |
| padding-top: 34px; | |
| } | |
| + | |
| +.jarviswidget > div { | |
| + border-width: 1px; | |
| +} | |
| + | |
| +svg-scheme { | |
| + display: block; | |
| +} | |
| + | |
| +svg:not(:root) { | |
| + overflow: auto; | |
| +} | |
| \ No newline at end of file | |
| diff --git a/app/views/dashboard.html b/app/views/dashboard.html | |
| index babebdb..3902a4c 100644 | |
| --- a/app/views/dashboard.html | |
| +++ b/app/views/dashboard.html | |
| @@ -11,48 +11,26 @@ | |
| Add widget | |
| </button> | |
| </h1> | |
| -<div id="widgets-list" class="multicol-list"> | |
| - <ul class="list-unstyled" sv-root sv-part="dashboard.widgets"> | |
| - <li ng-repeat="widget in dashboard.widgets" sv-element> | |
| - <widget source="widget" | |
| - can-remove="true" | |
| - on-remove="removeWidget(widget)" | |
| - can-delete="true" | |
| - on-delete="deleteWidget(widget)"></widget> | |
| - </li> | |
| - </ul> | |
| -</div> | |
| - | |
| -<!-- | |
| -<h1 class="page-header"> | |
| - {{ dashboard.name }} | |
| - <a href='#/dashboards/{{dashboard.uid}}/edit' class='pull-right'><i class="glyphicon glyphicon-edit black medium"></i></a> | |
| -</h1> | |
| - | |
| -<div ng-switch="dashboard.type"> | |
| - <div ng-switch-when="graphic"> | |
| - <div svg-scheme devices="devices" svg-full-width="dashboard.svg_fullwidth" | |
| - ng-include="dashboard.svg_url"></div> | |
| +<div ng-switch="dashboard.content.isSvg"> | |
| + <div ng-switch-when="true"> | |
| + <svg-scheme | |
| + devices="dashboard.devices" | |
| + ng-include="dashboard.content.svg_url" | |
| + svg-full-width="dashboard.content.svg_fullwidth"></svg-scheme> | |
| </div> | |
| <div ng-switch-default> | |
| - <div id='widgets-list' class='multicol-list'> | |
| - <ul class="list-unstyled"> | |
| - <li ng-repeat="widget in dashboard.widgets"> | |
| - <div class="panel panel-primary"> | |
| - <div class="panel-heading" ng-mouseover="hoverIn(widget)" ng-mouseleave="hoverOut(widget)"> | |
| - {{ widget.name }} | |
| - <a href='#/widgets/{{widget.uid}}/edit' ng-show='widget.canEdit' class='pull-right'><i class="glyphicon glyphicon-edit white widget-caption-button"></i></a> | |
| - <a href="" ng-click="dashboardDeleteWidget(widget)" ng-show='widget.canEdit' class='pull-right'><i class="glyphicon glyphicon-remove white widget-caption-button"></i></a> | |
| - | |
| - </div> | |
| - <div class="panel-body"> | |
| - <dashboard-widget-template></dashboard-widget-template> | |
| - </div> | |
| - </div> | |
| + <div id="widgets-list" class="multicol-list"> | |
| + <ul class="list-unstyled" sv-root sv-part="dashboard.widgets"> | |
| + <li ng-repeat="widget in dashboard.widgets" sv-element> | |
| + <widget source="widget" | |
| + can-remove="true" | |
| + on-remove="removeWidget(widget)" | |
| + can-delete="true" | |
| + on-delete="deleteWidget(widget)"></widget> | |
| </li> | |
| </ul> | |
| </div> | |
| </div> | |
| -</div>--> | |
| +</div> | |
| diff --git a/app/views/dashboards.html b/app/views/dashboards.html | |
| index 7b4703e..1889a7e 100644 | |
| --- a/app/views/dashboards.html | |
| +++ b/app/views/dashboards.html | |
| @@ -1,6 +1,7 @@ | |
| <h1 class="page-header"> | |
| Dashboards | |
| </h1> | |
| + | |
| <div class="empty-list well" ng-if="!$ctrl.data.dashboards.length"> | |
| No dashboards currently defined. | |
| </div> | |
| @@ -14,12 +15,12 @@ | |
| </tr> | |
| </thead> | |
| <tbody sv-root sv-part="$ctrl.data.dashboards"> | |
| - <tr class="dashboard" ng-repeat="dashboard in $ctrl.data.dashboards" sv-element> | |
| - <th class="idx-col" scope="row" >{{ $index+1 }}</th> | |
| + <tr class="dashboard" ng-repeat="dashboard in $ctrl.data.dashboards | filter:{isSvg: false}" sv-element> | |
| + <td class="idx-col" scope="row" >{{ $index+1 }}</td> | |
| <td class="name-col"> | |
| <span editable-text="dashboard.name" | |
| e-form="rowform" | |
| - onbeforesave="checkNonEmpty($data, 'Empty dashboard name is not allowed')">{{ dashboard.name }}</span> | |
| + onbeforesave="$ctrl.checkNonEmpty($data, 'Empty dashboard name is not allowed')">{{ dashboard.name }}</span> | |
| </td> | |
| <td class="id-col"> | |
| <span editable-text="dashboard.id" | |
| @@ -44,7 +45,7 @@ | |
| ng-click="rowform.$show()">Edit</button> | |
| <button name="delete" type="button" class="btn btn-danger" | |
| user-role="mto" current-role="$ctrl.roles.current.role" | |
| - ng-click="$ctrl.model(dashboard).remove()">Delete</button> | |
| + ng-click="$ctrl.deleteDashboard(dashboard)">Delete</button> | |
| </div> | |
| <!-- | |
| <a href='/dashboards/{{dashboard.id}}'><i class="glyphicon glyphicon-play-circle black medium"></i></a> | |
| @@ -56,5 +57,77 @@ | |
| <div class="btn-form" user-role="mto" current-role="$ctrl.roles.current.role"> | |
| <button name="add" | |
| type="button" | |
| - ng-click="$ctrl.addDashboard()" class="btn btn-default pull-right">Add dashboard</button> | |
| + ng-click="$ctrl.addDashboard()" class="btn btn-default pull-right">Add</button> | |
| </div> | |
| +<br><br><br> | |
| +<h1 class="page-header"> | |
| + SVG Dashboards | |
| +</h1> | |
| + | |
| +<table class="table dashboards-table webui-table" ng-if="$ctrl.data.dashboards.length"> | |
| + <thead> | |
| + <tr> | |
| + <th class="idx-col">#</th> | |
| + <th class="name-col">Name</th> | |
| + <th class="id-col">SVG url</th> | |
| + <th class="id-col">Full width</th> | |
| + <th class="id-col">ID</th> | |
| + <th class="button-col"></th> | |
| + </tr> | |
| + </thead> | |
| + <tbody sv-root sv-part="$ctrl.data.dashboards"> | |
| + <tr class="dashboard" ng-repeat="dashboard in $ctrl.data.dashboards | filter:{isSvg: true}" sv-element> | |
| + <td class="idx-col" scope="row" >{{ $index+1 }}</td> | |
| + <td> | |
| + <span editable-text="dashboard.name" | |
| + e-form="rowform" | |
| + onbeforesave="$ctrl.checkNonEmpty($data, 'Empty name is not allowed')">{{ dashboard.name }}</span> | |
| + </td> | |
| + <td> | |
| + <!--<input ng-show="tblTwo[$index].editable" type="text" ng-model="dashboard.svg_url"> | |
| + <span ng-hide="tblTwo[$index].editable">{{ dashboard.svg_url }}</span>--> | |
| + <span editable-text="dashboard.svg_url" | |
| + e-form="rowform" | |
| + onbeforesave="$ctrl.checkNonEmpty($data, 'Empty svg url is not allowed')">{{ dashboard.svg_url }}</span> | |
| + </td> | |
| + <td> | |
| + <input id="svgSchemeWidth" type="checkbox" ng-model="dashboard.svg_fullwidth" | |
| + ng-true-value="'1'" ng-false-value="''"> | |
| + </td> | |
| + <td class="id-col"> | |
| + <span editable-text="dashboard.id" | |
| + e-form="rowform" | |
| + onbeforesave="$ctrl.checkId($data, dashboard)">{{ dashboard.id }}</span> | |
| + </td> | |
| + <td class="button-col"> | |
| + <form editable-form name="rowform" ng-show="rowform.$visible" class="form-buttons form-inline" | |
| + shown="dashboard.isNew" onaftersave="$ctrl.afterSave(dashboard)" oncancel="cancel(dashboard)"> | |
| + <button type="submit" ng-disabled="rowform.$waiting" class="btn btn-primary"> | |
| + Save | |
| + </button> | |
| + <button type="button" name="cancel" | |
| + ng-disabled="rowform.$waiting" ng-click="rowform.$cancel()" class="btn btn-default"> | |
| + Cancel | |
| + </button> | |
| + </form> | |
| + <div class="buttons" ng-show="!rowform.$visible"> | |
| + <a class="btn btn-primary" ui-sref="dashboard({ id: dashboard.id })">View</a> | |
| + <button name="edit" type="button" class="btn btn-primary" | |
| + ng-disable="!dashboard.svg_url.length" | |
| + user-role="mto" current-role="$ctrl.roles.current.role" | |
| + ng-click="rowform.$show()">Edit</button> | |
| + <button name="delete" type="button" class="btn btn-danger" | |
| + user-role="mto" current-role="$ctrl.roles.current.role" | |
| + ng-click="$ctrl.deleteDashboard(dashboard)">Delete</button> | |
| + </div> | |
| + </td> | |
| + </tr> | |
| + </tbody> | |
| +</table> | |
| +<div class="btn-form" user-role="mto" current-role="$ctrl.roles.current.role"> | |
| + <button name="add" | |
| + type="button" | |
| + ng-click="$ctrl.addDashboardWithSvg()" class="btn btn-default pull-right">Add</button> | |
| +</div> | |
| +<!-- | |
| +<pre>{{$ctrl.data.dashboards | json}}</pre>--> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment