@pie-lib/graphing 2.4.7 → 2.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/lib/axis/arrow.js +22 -18
- package/lib/axis/arrow.js.map +1 -1
- package/lib/axis/axes.js +74 -78
- package/lib/axis/axes.js.map +1 -1
- package/lib/axis/index.js +5 -1
- package/lib/axis/index.js.map +1 -1
- package/lib/bg.js +16 -14
- package/lib/bg.js.map +1 -1
- package/lib/container/index.js +21 -15
- package/lib/container/index.js.map +1 -1
- package/lib/coordinates-label.js +4 -4
- package/lib/coordinates-label.js.map +1 -1
- package/lib/graph-with-controls.js +29 -25
- package/lib/graph-with-controls.js.map +1 -1
- package/lib/graph.js +58 -45
- package/lib/graph.js.map +1 -1
- package/lib/grid.js +20 -14
- package/lib/grid.js.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/labels.js +28 -24
- package/lib/labels.js.map +1 -1
- package/lib/mark-label.js +16 -8
- package/lib/mark-label.js.map +1 -1
- package/lib/toggle-bar.js +18 -16
- package/lib/toggle-bar.js.map +1 -1
- package/lib/tool-menu.js +22 -16
- package/lib/tool-menu.js.map +1 -1
- package/lib/tools/circle/bg-circle.js +26 -18
- package/lib/tools/circle/bg-circle.js.map +1 -1
- package/lib/tools/circle/component.js +30 -28
- package/lib/tools/circle/component.js.map +1 -1
- package/lib/tools/circle/index.js +4 -4
- package/lib/tools/circle/index.js.map +1 -1
- package/lib/tools/index.js +16 -15
- package/lib/tools/index.js.map +1 -1
- package/lib/tools/line/component.js +17 -7
- package/lib/tools/line/component.js.map +1 -1
- package/lib/tools/parabola/component.js.map +1 -1
- package/lib/tools/parabola/index.js +4 -4
- package/lib/tools/parabola/index.js.map +1 -1
- package/lib/tools/point/component.js +21 -17
- package/lib/tools/point/component.js.map +1 -1
- package/lib/tools/point/index.js +2 -2
- package/lib/tools/polygon/component.js +55 -47
- package/lib/tools/polygon/component.js.map +1 -1
- package/lib/tools/polygon/index.js +12 -8
- package/lib/tools/polygon/index.js.map +1 -1
- package/lib/tools/polygon/line.js +26 -18
- package/lib/tools/polygon/line.js.map +1 -1
- package/lib/tools/polygon/polygon.js +26 -18
- package/lib/tools/polygon/polygon.js.map +1 -1
- package/lib/tools/ray/component.js +17 -7
- package/lib/tools/ray/component.js.map +1 -1
- package/lib/tools/segment/component.js +4 -2
- package/lib/tools/segment/component.js.map +1 -1
- package/lib/tools/shared/arrow-head.js +4 -4
- package/lib/tools/shared/arrow-head.js.map +1 -1
- package/lib/tools/shared/line/index.js +46 -44
- package/lib/tools/shared/line/index.js.map +1 -1
- package/lib/tools/shared/line/line-path.js +28 -20
- package/lib/tools/shared/line/line-path.js.map +1 -1
- package/lib/tools/shared/line/with-root-edge.js +8 -6
- package/lib/tools/shared/line/with-root-edge.js.map +1 -1
- package/lib/tools/shared/point/arrow-point.js +21 -15
- package/lib/tools/shared/point/arrow-point.js.map +1 -1
- package/lib/tools/shared/point/arrow.js +21 -15
- package/lib/tools/shared/point/arrow.js.map +1 -1
- package/lib/tools/shared/point/base-point.js +22 -16
- package/lib/tools/shared/point/base-point.js.map +1 -1
- package/lib/tools/shared/point/index.js +8 -4
- package/lib/tools/shared/point/index.js.map +1 -1
- package/lib/tools/shared/styles.js +1 -1
- package/lib/tools/shared/types.js +1 -1
- package/lib/tools/sine/component.js.map +1 -1
- package/lib/tools/sine/index.js +4 -4
- package/lib/tools/sine/index.js.map +1 -1
- package/lib/tools/vector/component.js +4 -2
- package/lib/tools/vector/component.js.map +1 -1
- package/lib/undo-redo.js +20 -16
- package/lib/undo-redo.js.map +1 -1
- package/lib/use-debounce.js +7 -3
- package/lib/use-debounce.js.map +1 -1
- package/lib/utils.js +93 -5
- package/lib/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/axis/arrow.jsx +5 -5
- package/src/axis/axes.jsx +25 -36
- package/src/graph.jsx +16 -10
- package/src/tools/line/component.jsx +4 -2
- package/src/tools/ray/component.jsx +4 -2
- package/src/utils.js +87 -4
package/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.js"],"names":["tickCount","utils","bounds","point","getAngleDeg","arrowDimensions","getTickValues","prop","tickValues","tickVal","min","indexOf","push","Math","round","step","max","filter","tV","countWords","label","words","split","length","findLongestWord","longestWord","replace","sort","a","b","amountToIncreaseWidth","polygonToArea","points","h","area","left","x","top","y","bottom","right","reduce","p","lineToArea","from","to","pointsToArea","isDomainRangeEqual","graphProps","nextGraphProps","domain","range","getRightestPoints","sortedPoints","getMiddleOfTwoPoints","roundNumber","number","parseFloat","toFixed","sameAxes","p1","p2","equalPoints","getDistanceBetweenTicks","axis","size","nbOfTicks","thinnerShapesNeeded","width","height"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEO,IAAMA,SAAS,GAAGC,YAAMD,SAAxB;;AACA,IAAME,MAAM,GAAGD,YAAMC,MAArB;;AACA,IAAMC,KAAK,GAAGF,YAAME,KAApB,C,CAEP;;;;AACO,IAAMC,WAAW,GAAG,SAAdA,WAAc;AAAA,SAAM,CAAN;AAAA,CAApB,C,CACP;;;;;AACO,IAAMC,eAAe,GAAG,SAAlBA,eAAkB;AAAA,SAAM,CAAN;AAAA,CAAxB;;;;AAEA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAAAC,IAAI,EAAI;AACnC,MAAMC,UAAU,GAAG,EAAnB;AACA,MAAIC,OAAO,GAAG,CAAd;;AAEA,SAAOA,OAAO,IAAIF,IAAI,CAACG,GAAhB,IAAuBF,UAAU,CAACG,OAAX,CAAmBF,OAAnB,IAA8B,CAA5D,EAA+D;AAC7DD,IAAAA,UAAU,CAACI,IAAX,CAAgBH,OAAhB;AACAA,IAAAA,OAAO,GAAGI,IAAI,CAACC,KAAL,CAAW,CAACL,OAAO,GAAGF,IAAI,CAACQ,IAAhB,IAAwB,IAAnC,IAA2C,IAArD;AACD;;AAEDN,EAAAA,OAAO,GAAGI,IAAI,CAACC,KAAL,CAAWP,IAAI,CAACQ,IAAL,GAAY,IAAvB,IAA+B,IAAzC;;AAEA,SAAON,OAAO,IAAIF,IAAI,CAACS,GAAhB,IAAuBR,UAAU,CAACG,OAAX,CAAmBF,OAAnB,IAA8B,CAA5D,EAA+D;AAC7DD,IAAAA,UAAU,CAACI,IAAX,CAAgBH,OAAhB;AACAA,IAAAA,OAAO,GAAGI,IAAI,CAACC,KAAL,CAAW,CAACL,OAAO,GAAGF,IAAI,CAACQ,IAAhB,IAAwB,IAAnC,IAA2C,IAArD;AACD,GAdkC,CAgBnC;;;AACA,MAAIP,UAAJ,EAAgB;AACd,WAAOA,UAAU,CAACS,MAAX,CAAkB,UAAAC,EAAE;AAAA,aAAIA,EAAE,IAAIX,IAAI,CAACG,GAAX,IAAkBQ,EAAE,IAAIX,IAAI,CAACS,GAAjC;AAAA,KAApB,CAAP;AACD;;AAED,SAAO,EAAP;AACD,CAtBM;;;;AAwBA,IAAMG,UAAU,GAAG,SAAbA,UAAa,CAAAC,KAAK,EAAI;AACjC,MAAIA,KAAK,IAAI,IAAT,IAAiB,yBAAQA,KAAR,CAArB,EAAqC;AACnC,WAAO,CAAP;AACD;;AAED,MAAMC,KAAK,GAAGD,KAAK,CAACE,KAAN,CAAY,GAAZ,CAAd;AACA,SAAOD,KAAK,CAACE,MAAb;AACD,CAPM,C,CASP;;;;;AACO,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAAAJ,KAAK,EAAI;AACtC,MAAIK,WAAW,GAAG,CAACL,KAAK,IAAI,EAAV,EACfM,OADe,CACP,UADO,EACK,EADL,EAEfJ,KAFe,CAET,GAFS,EAGfK,IAHe,CAGV,UAACC,CAAD,EAAIC,CAAJ;AAAA,WAAUA,CAAC,CAACN,MAAF,GAAWK,CAAC,CAACL,MAAvB;AAAA,GAHU,CAAlB;AAKA,SAAOE,WAAW,CAAC,CAAD,CAAX,CAAeF,MAAtB;AACD,CAPM,C,CASP;;;;;AACO,IAAMO,qBAAqB,GAAG,SAAxBA,qBAAwB,CAAAL,WAAW,EAAI;AAClD,MAAI,CAACA,WAAL,EAAkB;AAChB,WAAO,CAAP;AACD;;AAED,SAAOA,WAAW,GAAG,EAArB;AACD,CANM;;;;AAQA,IAAMM,aAAa,GAAG,SAAhBA,aAAgB,CAAAC,MAAM,EAAI;AACrC,MAAMC,CAAC,GAAG,sBAAKD,MAAL,CAAV;AACA,MAAME,IAAI,GAAG;AACXC,IAAAA,IAAI,EAAEF,CAAC,CAACG,CADG;AAEXC,IAAAA,GAAG,EAAEJ,CAAC,CAACK,CAFI;AAGXC,IAAAA,MAAM,EAAEN,CAAC,CAACK,CAHC;AAIXE,IAAAA,KAAK,EAAEP,CAAC,CAACG;AAJE,GAAb;AAMA,SAAO,sBAAKJ,MAAL,EAAaS,MAAb,CAAoB,UAACb,CAAD,EAAIc,CAAJ,EAAU;AACnCd,IAAAA,CAAC,CAACO,IAAF,GAAStB,IAAI,CAACH,GAAL,CAASkB,CAAC,CAACO,IAAX,EAAiBO,CAAC,CAACN,CAAnB,CAAT;AACAR,IAAAA,CAAC,CAACS,GAAF,GAAQxB,IAAI,CAACG,GAAL,CAASY,CAAC,CAACS,GAAX,EAAgBK,CAAC,CAACJ,CAAlB,CAAR;AACAV,IAAAA,CAAC,CAACW,MAAF,GAAW1B,IAAI,CAACH,GAAL,CAASkB,CAAC,CAACW,MAAX,EAAmBG,CAAC,CAACJ,CAArB,CAAX;AACAV,IAAAA,CAAC,CAACY,KAAF,GAAU3B,IAAI,CAACG,GAAL,CAASY,CAAC,CAACY,KAAX,EAAkBE,CAAC,CAACN,CAApB,CAAV;AACA,WAAOR,CAAP;AACD,GANM,EAMJM,IANI,CAAP;AAOD,CAfM;;;;AAiBA,IAAMS,UAAU,GAAG,SAAbA,UAAa,CAACC,IAAD,EAAOC,EAAP;AAAA,SAAcC,YAAY,CAACF,IAAD,EAAOC,EAAP,CAA1B;AAAA,CAAnB;;;;AAEA,IAAMC,YAAY,GAAG,SAAfA,YAAe,CAAClB,CAAD,EAAIC,CAAJ,EAAU;AACpC,6BAAU,CAAC,CAACD,CAAF,IAAO,CAAC,CAACC,CAAnB,EAAsB,qBAAtB;AACA,MAAMM,IAAI,GAAGtB,IAAI,CAACH,GAAL,CAASkB,CAAC,CAACQ,CAAX,EAAcP,CAAC,CAACO,CAAhB,CAAb;AACA,MAAMC,GAAG,GAAGxB,IAAI,CAACG,GAAL,CAASY,CAAC,CAACU,CAAX,EAAcT,CAAC,CAACS,CAAhB,CAAZ;AACA,MAAMC,MAAM,GAAG1B,IAAI,CAACH,GAAL,CAASkB,CAAC,CAACU,CAAX,EAAcT,CAAC,CAACS,CAAhB,CAAf;AACA,MAAME,KAAK,GAAG3B,IAAI,CAACG,GAAL,CAASY,CAAC,CAACQ,CAAX,EAAcP,CAAC,CAACO,CAAhB,CAAd;AACA,SAAO;AAAED,IAAAA,IAAI,EAAJA,IAAF;AAAQE,IAAAA,GAAG,EAAHA,GAAR;AAAaE,IAAAA,MAAM,EAANA,MAAb;AAAqBC,IAAAA,KAAK,EAALA;AAArB,GAAP;AACD,CAPM;;;;AASA,IAAMO,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,UAAD,EAAaC,cAAb,EAAgC;AAChE,SACE,yBAAQD,UAAU,CAACE,MAAnB,EAA2BD,cAAc,CAACC,MAA1C,KACA,yBAAQF,UAAU,CAACG,KAAnB,EAA0BF,cAAc,CAACE,KAAzC,CAFF;AAID,CALM;;;;AAOA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAApB,MAAM,EAAI;AACzC,MAAMqB,YAAY,GAAG,2BAAUrB,MAAV,CAArB;AACAqB,EAAAA,YAAY,CAAC1B,IAAb,CAAkB,UAACC,CAAD,EAAIC,CAAJ;AAAA,WAAUA,CAAC,CAACO,CAAF,GAAMR,CAAC,CAACQ,CAAlB;AAAA,GAAlB;AAEA,SAAO;AAAER,IAAAA,CAAC,EAAEyB,YAAY,CAAC,CAAD,CAAjB;AAAsBxB,IAAAA,CAAC,EAAEwB,YAAY,CAAC,CAAD;AAArC,GAAP;AACD,CALM;;;;AAOA,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAC1B,CAAD,EAAIC,CAAJ;AAAA,SAAW;AAC7CO,IAAAA,CAAC,EAAE,CAACR,CAAC,CAACQ,CAAF,GAAMP,CAAC,CAACO,CAAT,IAAc,CAD4B;AAE7CE,IAAAA,CAAC,EAAE,CAACV,CAAC,CAACU,CAAF,GAAMT,CAAC,CAACS,CAAT,IAAc;AAF4B,GAAX;AAAA,CAA7B;;;;AAKA,IAAMiB,WAAW,GAAG,SAAdA,WAAc,CAAAC,MAAM;AAAA,SAAIC,UAAU,CAACD,MAAM,CAACE,OAAP,CAAe,CAAf,CAAD,CAAd;AAAA,CAA1B;;;;AAEA,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAACC,EAAD,EAAKC,EAAL;AAAA,SACtBD,EAAE,IAAIC,EAAN,KAAaN,WAAW,CAACK,EAAE,CAACxB,CAAJ,CAAX,KAAsBmB,WAAW,CAACM,EAAE,CAACzB,CAAJ,CAAjC,IAA2CmB,WAAW,CAACK,EAAE,CAACtB,CAAJ,CAAX,KAAsBiB,WAAW,CAACM,EAAE,CAACvB,CAAJ,CAAzF,CADsB;AAAA,CAAjB;;;;AAGA,IAAMwB,WAAW,GAAG,SAAdA,WAAc,CAACF,EAAD,EAAKC,EAAL;AAAA,SACzBD,EAAE,IACFC,EADA,IAEA,yBACE;AACEzB,IAAAA,CAAC,EAAEmB,WAAW,CAACK,EAAE,CAACxB,CAAJ,CADhB;AAEEE,IAAAA,CAAC,EAAEiB,WAAW,CAACK,EAAE,CAACtB,CAAJ;AAFhB,GADF,EAKE;AACEF,IAAAA,CAAC,EAAEmB,WAAW,CAACM,EAAE,CAACzB,CAAJ,CADhB;AAEEE,IAAAA,CAAC,EAAEiB,WAAW,CAACM,EAAE,CAACvB,CAAJ;AAFhB,GALF,CAHyB;AAAA,CAApB;;;;AAcP,IAAMyB,uBAAuB,GAAG,SAA1BA,uBAA0B,CAACC,IAAD,EAAOC,IAAP,EAAgB;AAAA,MACtCvD,GADsC,GACnBsD,IADmB,CACtCtD,GADsC;AAAA,MACjCM,GADiC,GACnBgD,IADmB,CACjChD,GADiC;AAAA,MAC5BD,IAD4B,GACnBiD,IADmB,CAC5BjD,IAD4B;AAE9C,MAAMmD,SAAS,GAAG,CAAClD,GAAG,GAAGN,GAAP,IAAcK,IAAhC;AAEA,SAAOkD,IAAI,GAAGC,SAAd;AACD,CALD;;AAOO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAAAnB,UAAU,EAAI;AAAA,MAE7CE,MAF6C,GAK3CF,UAL2C,CAE7CE,MAF6C;AAAA,MAG7CC,KAH6C,GAK3CH,UAL2C,CAG7CG,KAH6C;AAAA,yBAK3CH,UAL2C,CAI7CiB,IAJ6C;AAAA,MAIrCG,KAJqC,oBAIrCA,KAJqC;AAAA,MAI9BC,MAJ8B,oBAI9BA,MAJ8B,EAO/C;;AACA,SAAON,uBAAuB,CAACb,MAAD,EAASkB,KAAT,CAAvB,GAAyC,EAAzC,IAA+CL,uBAAuB,CAACZ,KAAD,EAAQkB,MAAR,CAAvB,GAAyC,EAA/F;AACD,CATM","sourcesContent":["import head from 'lodash/head';\nimport tail from 'lodash/tail';\nimport { utils } from '@pie-lib/plot';\nimport invariant from 'invariant';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\nimport cloneDeep from 'lodash/cloneDeep';\n\nexport const tickCount = utils.tickCount;\nexport const bounds = utils.bounds;\nexport const point = utils.point;\n\n//TODO: This can be removed?\nexport const getAngleDeg = () => 0;\n//TODO: This can be removed?\nexport const arrowDimensions = () => 0;\n\nexport const getTickValues = prop => {\n const tickValues = [];\n let tickVal = 0;\n\n while (tickVal >= prop.min && tickValues.indexOf(tickVal) < 0) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal - prop.step) * 1000) / 1000;\n }\n\n tickVal = Math.round(prop.step * 1000) / 1000;\n\n while (tickVal <= prop.max && tickValues.indexOf(tickVal) < 0) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 1000) / 1000;\n }\n\n // return only ticks that are inside the min-max interval\n if (tickValues) {\n return tickValues.filter(tV => tV >= prop.min && tV <= prop.max);\n }\n\n return [];\n};\n\nexport const countWords = label => {\n if (label == null || isEmpty(label)) {\n return 1;\n }\n\n const words = label.split(' ');\n return words.length;\n};\n\n// findLongestWord is also used in plot\nexport const findLongestWord = label => {\n let longestWord = (label || '')\n .replace(/<[^>]+>/g, '')\n .split(' ')\n .sort((a, b) => b.length - a.length);\n\n return longestWord[0].length;\n};\n\n// amountToIncreaseWidth is also used in plot\nexport const amountToIncreaseWidth = longestWord => {\n if (!longestWord) {\n return 0;\n }\n\n return longestWord * 10;\n};\n\nexport const polygonToArea = points => {\n const h = head(points);\n const area = {\n left: h.x,\n top: h.y,\n bottom: h.y,\n right: h.x\n };\n return tail(points).reduce((a, p) => {\n a.left = Math.min(a.left, p.x);\n a.top = Math.max(a.top, p.y);\n a.bottom = Math.min(a.bottom, p.y);\n a.right = Math.max(a.right, p.x);\n return a;\n }, area);\n};\n\nexport const lineToArea = (from, to) => pointsToArea(from, to);\n\nexport const pointsToArea = (a, b) => {\n invariant(!!a && !!b, 'a or b is undefined');\n const left = Math.min(a.x, b.x);\n const top = Math.max(a.y, b.y);\n const bottom = Math.min(a.y, b.y);\n const right = Math.max(a.x, b.x);\n return { left, top, bottom, right };\n};\n\nexport const isDomainRangeEqual = (graphProps, nextGraphProps) => {\n return (\n isEqual(graphProps.domain, nextGraphProps.domain) &&\n isEqual(graphProps.range, nextGraphProps.range)\n );\n};\n\nexport const getRightestPoints = points => {\n const sortedPoints = cloneDeep(points);\n sortedPoints.sort((a, b) => b.x - a.x);\n\n return { a: sortedPoints[0], b: sortedPoints[1] };\n};\n\nexport const getMiddleOfTwoPoints = (a, b) => ({\n x: (a.x + b.x) / 2,\n y: (a.y + b.y) / 2\n});\n\nexport const roundNumber = number => parseFloat(number.toFixed(3));\n\nexport const sameAxes = (p1, p2) =>\n p1 && p2 && (roundNumber(p1.x) === roundNumber(p2.x) || roundNumber(p1.y) === roundNumber(p2.y));\n\nexport const equalPoints = (p1, p2) =>\n p1 &&\n p2 &&\n isEqual(\n {\n x: roundNumber(p1.x),\n y: roundNumber(p1.y)\n },\n {\n x: roundNumber(p2.x),\n y: roundNumber(p2.y)\n }\n );\n\nconst getDistanceBetweenTicks = (axis, size) => {\n const { min, max, step } = axis;\n const nbOfTicks = (max - min) / step;\n\n return size / nbOfTicks;\n};\n\nexport const thinnerShapesNeeded = graphProps => {\n const {\n domain,\n range,\n size: { width, height }\n } = graphProps;\n\n // 14 is the default width of a point\n return getDistanceBetweenTicks(domain, width) < 14 || getDistanceBetweenTicks(range, height) < 14;\n};\n"],"file":"utils.js"}
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["tickCount","utils","bounds","point","getAngleDeg","arrowDimensions","getTickValues","prop","tickValues","tickVal","min","indexOf","push","Math","round","step","max","filter","tV","countWords","label","words","split","length","findLongestWord","longestWord","replace","sort","a","b","amountToIncreaseWidth","polygonToArea","points","h","area","left","x","top","y","bottom","right","reduce","p","lineToArea","from","to","pointsToArea","isDomainRangeEqual","graphProps","nextGraphProps","domain","range","getRightestPoints","sortedPoints","getMiddleOfTwoPoints","roundNumber","number","parseFloat","toFixed","sameAxes","p1","p2","equalPoints","getDistanceBetweenTicks","axis","size","nbOfTicks","thinnerShapesNeeded","width","height","getAdjustedGraphLimits","domainTicksDistance","rangeTicksDistance","domainPadding","rangePadding","getDistanceBetweenTwoPoints","sqrt","sortPoints","array","checkCollinearity","c","isSameLine","markA","markB","isSameCircle","root","edge","isDuplicatedMark","mark","marks","oldMark","type","building","filteredMarks","m","index","findIndex","splice","duplicated","find"],"mappings":"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","sourcesContent":["import head from 'lodash/head';\nimport tail from 'lodash/tail';\nimport { utils } from '@pie-lib/plot';\nimport invariant from 'invariant';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\nimport cloneDeep from 'lodash/cloneDeep';\n\nexport const tickCount = utils.tickCount;\nexport const bounds = utils.bounds;\nexport const point = utils.point;\n\n//TODO: This can be removed?\nexport const getAngleDeg = () => 0;\n//TODO: This can be removed?\nexport const arrowDimensions = () => 0;\n\nexport const getTickValues = prop => {\n const tickValues = [];\n let tickVal = 0;\n\n while (tickVal >= prop.min && tickValues.indexOf(tickVal) < 0) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal - prop.step) * 10000) / 10000;\n }\n\n tickVal = Math.round(prop.step * 10000) / 10000;\n\n while (tickVal <= prop.max && tickValues.indexOf(tickVal) < 0) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 10000) / 10000;\n }\n\n // return only ticks that are inside the min-max interval\n if (tickValues) {\n return tickValues.filter(tV => tV >= prop.min && tV <= prop.max);\n }\n\n return [];\n};\n\nexport const countWords = label => {\n if (label == null || isEmpty(label)) {\n return 1;\n }\n\n const words = label.split(' ');\n return words.length;\n};\n\n// findLongestWord is also used in plot\nexport const findLongestWord = label => {\n let longestWord = (label || '')\n .replace(/<[^>]+>/g, '')\n .split(' ')\n .sort((a, b) => b.length - a.length);\n\n return longestWord[0].length;\n};\n\n// amountToIncreaseWidth is also used in plot\nexport const amountToIncreaseWidth = longestWord => {\n if (!longestWord) {\n return 0;\n }\n\n return longestWord * 10;\n};\n\nexport const polygonToArea = points => {\n const h = head(points);\n const area = {\n left: h.x,\n top: h.y,\n bottom: h.y,\n right: h.x\n };\n return tail(points).reduce((a, p) => {\n a.left = Math.min(a.left, p.x);\n a.top = Math.max(a.top, p.y);\n a.bottom = Math.min(a.bottom, p.y);\n a.right = Math.max(a.right, p.x);\n return a;\n }, area);\n};\n\nexport const lineToArea = (from, to) => pointsToArea(from, to);\n\nexport const pointsToArea = (a, b) => {\n invariant(!!a && !!b, 'a or b is undefined');\n const left = Math.min(a.x, b.x);\n const top = Math.max(a.y, b.y);\n const bottom = Math.min(a.y, b.y);\n const right = Math.max(a.x, b.x);\n return { left, top, bottom, right };\n};\n\nexport const isDomainRangeEqual = (graphProps, nextGraphProps) => {\n return (\n isEqual(graphProps.domain, nextGraphProps.domain) &&\n isEqual(graphProps.range, nextGraphProps.range)\n );\n};\n\nexport const getRightestPoints = points => {\n const sortedPoints = cloneDeep(points);\n sortedPoints.sort((a, b) => b.x - a.x);\n\n return { a: sortedPoints[0], b: sortedPoints[1] };\n};\n\nexport const getMiddleOfTwoPoints = (a, b) => ({\n x: (a.x + b.x) / 2,\n y: (a.y + b.y) / 2\n});\n\nexport const roundNumber = number => parseFloat(number.toFixed(4));\n\nexport const sameAxes = (p1, p2) =>\n p1 && p2 && (roundNumber(p1.x) === roundNumber(p2.x) || roundNumber(p1.y) === roundNumber(p2.y));\n\nexport const equalPoints = (p1, p2) =>\n p1 &&\n p2 &&\n isEqual(\n {\n x: roundNumber(p1.x),\n y: roundNumber(p1.y)\n },\n {\n x: roundNumber(p2.x),\n y: roundNumber(p2.y)\n }\n );\n\nconst getDistanceBetweenTicks = (axis, size) => {\n const { min, max, step } = axis;\n const nbOfTicks = (max - min) / step;\n\n return size / nbOfTicks;\n};\n\nexport const thinnerShapesNeeded = graphProps => {\n const {\n domain,\n range,\n size: { width, height }\n } = graphProps;\n\n // 14 is the default width of a point\n return getDistanceBetweenTicks(domain, width) < 14 || getDistanceBetweenTicks(range, height) < 14;\n};\n\nexport const getAdjustedGraphLimits = graphProps => {\n const {\n domain,\n range,\n size: { width, height }\n } = graphProps;\n const domainTicksDistance = getDistanceBetweenTicks(domain, width);\n const rangeTicksDistance = getDistanceBetweenTicks(range, height);\n\n // 15 is the distance required for the arrow to extend the graph\n const domainPadding = domain.step / (domainTicksDistance / 15);\n const rangePadding = range.step / (rangeTicksDistance / 15);\n\n return {\n domain: {\n min: domain.min - domainPadding,\n max: domain.max + domainPadding\n },\n range: {\n min: range.min - rangePadding,\n max: range.max + rangePadding\n }\n };\n};\n\nconst getDistanceBetweenTwoPoints = (a, b) =>\n Math.sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));\n\nconst sortPoints = array => (array || []).sort((a, b) => a.x - b.x || a.y - b.y);\n\n// check colliniarity of 3 points (source: https://www.geeksforgeeks.org/program-check-three-points-collinear/)\nconst checkCollinearity = (a, b, c) => (a.x - b.x) * (c.y - b.y) === (c.x - b.x) * (a.y - b.y);\n\n// 2 lines are overlapping if all 4 points are collinear\nconst isSameLine = (markA, markB) =>\n checkCollinearity(markA.from, markB.from, markB.to) &&\n checkCollinearity(markA.to, markB.from, markB.to);\n\nconst isSameCircle = (markA, markB) =>\n equalPoints(markA.root, markB.root) &&\n getDistanceBetweenTwoPoints(markB.root, markB.edge) ===\n getDistanceBetweenTwoPoints(markA.root, markA.edge);\n\nexport const isDuplicatedMark = (mark, marks, oldMark) => {\n const { type, building } = mark;\n\n if (building) {\n return false;\n }\n\n const filteredMarks = (marks || []).filter(m => m.type === type && !m.building);\n const index = filteredMarks.findIndex(m => isEqual(m, oldMark));\n\n if (index !== -1) {\n filteredMarks.splice(index, 1);\n }\n\n const duplicated = filteredMarks.find(m => {\n if (type === 'circle' || type === 'parabola' || type === 'sine') {\n const { root, edge } = mark;\n\n return (\n (equalPoints(root, m.root) && equalPoints(edge, m.edge)) ||\n (type === 'circle' && isSameCircle(m, mark))\n );\n } else if (type === 'line' || type === 'ray' || type === 'segment' || type === 'vector') {\n const { from, to } = mark;\n\n return (\n (equalPoints(from, m.from) && equalPoints(to, m.to)) ||\n (equalPoints(from, m.to) && equalPoints(to, m.from)) ||\n (type === 'line' && isSameLine(m, mark))\n );\n } else if (type === 'polygon') {\n return isEqual(sortPoints(cloneDeep(mark.points)), sortPoints(cloneDeep(m.points)));\n } else if (type === 'point') {\n return equalPoints(m, mark);\n }\n });\n\n return !!duplicated;\n};\n"],"file":"utils.js"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "2.4.
|
|
6
|
+
"version": "2.4.10",
|
|
7
7
|
"description": "Graphing components",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"react",
|
|
@@ -43,6 +43,6 @@
|
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"react": "^16.8.1"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "94d3f4ebeac61ccfff87705594a1e80f664d4975",
|
|
47
47
|
"scripts": {}
|
|
48
48
|
}
|
package/src/axis/arrow.jsx
CHANGED
|
@@ -14,6 +14,7 @@ const style = {
|
|
|
14
14
|
export class Arrow extends React.Component {
|
|
15
15
|
render() {
|
|
16
16
|
const { x, y, classes, className, scale } = this.props;
|
|
17
|
+
const names = classNames(classes.root, className);
|
|
17
18
|
let direction = this.props.direction || 'left';
|
|
18
19
|
|
|
19
20
|
const xv = scale.x(x);
|
|
@@ -24,22 +25,21 @@ export class Arrow extends React.Component {
|
|
|
24
25
|
const getTransform = (x, y, rotate) => `translate(${x}, ${y}) rotate(${rotate})`;
|
|
25
26
|
|
|
26
27
|
if (direction === 'left') {
|
|
27
|
-
transform = getTransform(xv -
|
|
28
|
+
transform = getTransform(xv - 15, yv, 0);
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
if (direction === 'right') {
|
|
31
|
-
transform = getTransform(xv +
|
|
32
|
+
transform = getTransform(xv + 15, yv, 180);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
if (direction === 'up') {
|
|
35
|
-
transform = getTransform(xv, yv -
|
|
36
|
+
transform = getTransform(xv, yv - 15, 90);
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
if (direction === 'down') {
|
|
39
|
-
transform = getTransform(xv, yv +
|
|
40
|
+
transform = getTransform(xv, yv + 15, 270);
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
const names = classNames(classes.root, className);
|
|
43
43
|
return <path d="m 0,0 8,-5 0,10 -8,-5" transform={transform} className={names} />;
|
|
44
44
|
}
|
|
45
45
|
}
|
package/src/axis/axes.jsx
CHANGED
|
@@ -59,8 +59,8 @@ const tickLabelStyles = {
|
|
|
59
59
|
export const sharedValues = (
|
|
60
60
|
firstNegativeX,
|
|
61
61
|
firstNegativeY,
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
distanceFromOriginToFirstNegativeX,
|
|
63
|
+
distanceFromOriginToFirstNegativeY,
|
|
64
64
|
deltaAllowance,
|
|
65
65
|
dy
|
|
66
66
|
) => {
|
|
@@ -68,10 +68,10 @@ export const sharedValues = (
|
|
|
68
68
|
|
|
69
69
|
if (
|
|
70
70
|
firstNegativeX === firstNegativeY &&
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
dy <
|
|
71
|
+
distanceFromOriginToFirstNegativeX - deltaAllowance < distanceFromOriginToFirstNegativeY &&
|
|
72
|
+
distanceFromOriginToFirstNegativeY < distanceFromOriginToFirstNegativeX + deltaAllowance &&
|
|
73
|
+
distanceFromOriginToFirstNegativeX - deltaAllowance < dy &&
|
|
74
|
+
dy < distanceFromOriginToFirstNegativeX + deltaAllowance
|
|
75
75
|
) {
|
|
76
76
|
result.push(firstNegativeX);
|
|
77
77
|
}
|
|
@@ -96,7 +96,7 @@ export class RawXAxis extends React.Component {
|
|
|
96
96
|
graphProps,
|
|
97
97
|
columnTicksValues,
|
|
98
98
|
skipValues,
|
|
99
|
-
|
|
99
|
+
distanceFromOriginToFirstNegativeY,
|
|
100
100
|
dy
|
|
101
101
|
} = this.props;
|
|
102
102
|
const { scale, domain, size, range } = graphProps || {};
|
|
@@ -110,11 +110,7 @@ export class RawXAxis extends React.Component {
|
|
|
110
110
|
// However, the '0' has to be displayed only if other tick labels (y-axis or x-axis) are displayed
|
|
111
111
|
|
|
112
112
|
const labelProps = label => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (skipValues && skipValues[0] === label) {
|
|
116
|
-
y = distantceFromOriginToFirstNegativeY + 4;
|
|
117
|
-
}
|
|
113
|
+
const y = skipValues && skipValues[0] === label ? distanceFromOriginToFirstNegativeY + 4 : dy;
|
|
118
114
|
|
|
119
115
|
return {
|
|
120
116
|
...tickLabelStyles,
|
|
@@ -137,6 +133,7 @@ export class RawXAxis extends React.Component {
|
|
|
137
133
|
top={scale.y(0)}
|
|
138
134
|
left={0}
|
|
139
135
|
label={domain.label}
|
|
136
|
+
rangePadding={8}
|
|
140
137
|
tickClassName={classes.tick}
|
|
141
138
|
tickFormat={value => value}
|
|
142
139
|
tickLabelProps={labelProps}
|
|
@@ -150,7 +147,7 @@ export class RawXAxis extends React.Component {
|
|
|
150
147
|
)}
|
|
151
148
|
{domain.axisLabel && (
|
|
152
149
|
<foreignObject
|
|
153
|
-
x={size.width +
|
|
150
|
+
x={size.width + 15}
|
|
154
151
|
y={scale.y(0) - 10}
|
|
155
152
|
width={necessaryWidth}
|
|
156
153
|
height={20 * necessaryRows}
|
|
@@ -181,13 +178,7 @@ export class RawYAxis extends React.Component {
|
|
|
181
178
|
|
|
182
179
|
const necessaryWidth = range.axisLabel ? amountToIncreaseWidth(range.axisLabel.length) : 0;
|
|
183
180
|
|
|
184
|
-
const customTickFormat = value =>
|
|
185
|
-
if (skipValues && skipValues.indexOf(value) >= 0) {
|
|
186
|
-
return '';
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return value;
|
|
190
|
-
};
|
|
181
|
+
const customTickFormat = value => (skipValues && skipValues.indexOf(value) >= 0 ? '' : value);
|
|
191
182
|
|
|
192
183
|
return (
|
|
193
184
|
<React.Fragment>
|
|
@@ -200,6 +191,7 @@ export class RawYAxis extends React.Component {
|
|
|
200
191
|
left={scale.x(0)}
|
|
201
192
|
label={range.label}
|
|
202
193
|
labelProps={{ 'data-pie-readable': false }}
|
|
194
|
+
rangePadding={8}
|
|
203
195
|
tickLength={10}
|
|
204
196
|
tickClassName={classes.tick}
|
|
205
197
|
tickFormat={customTickFormat}
|
|
@@ -208,7 +200,7 @@ export class RawYAxis extends React.Component {
|
|
|
208
200
|
return {
|
|
209
201
|
...tickLabelStyles,
|
|
210
202
|
dy: 4,
|
|
211
|
-
dx: -
|
|
203
|
+
dx: -4 - digits * 8,
|
|
212
204
|
'data-pie-readable': false
|
|
213
205
|
};
|
|
214
206
|
}}
|
|
@@ -226,7 +218,7 @@ export class RawYAxis extends React.Component {
|
|
|
226
218
|
{range.axisLabel && (
|
|
227
219
|
<foreignObject
|
|
228
220
|
x={scale.x(0) - necessaryWidth / 2}
|
|
229
|
-
y={-
|
|
221
|
+
y={-30}
|
|
230
222
|
width={necessaryWidth}
|
|
231
223
|
height="20"
|
|
232
224
|
>
|
|
@@ -242,6 +234,7 @@ export class RawYAxis extends React.Component {
|
|
|
242
234
|
);
|
|
243
235
|
}
|
|
244
236
|
}
|
|
237
|
+
|
|
245
238
|
const YAxis = withStyles(axisStyles)(RawYAxis);
|
|
246
239
|
|
|
247
240
|
export default class Axes extends React.Component {
|
|
@@ -255,6 +248,7 @@ export default class Axes extends React.Component {
|
|
|
255
248
|
xValues = () => {
|
|
256
249
|
const { graphProps } = this.props;
|
|
257
250
|
const { scale, domain } = graphProps || {};
|
|
251
|
+
|
|
258
252
|
if (!domain || !scale) {
|
|
259
253
|
return;
|
|
260
254
|
}
|
|
@@ -265,13 +259,14 @@ export default class Axes extends React.Component {
|
|
|
265
259
|
return {
|
|
266
260
|
columnTicksValues: ticks,
|
|
267
261
|
firstNegativeX: negative,
|
|
268
|
-
|
|
262
|
+
distanceFromOriginToFirstNegativeX: Math.abs(scale.y(0) - scale.y(negative))
|
|
269
263
|
};
|
|
270
264
|
};
|
|
271
265
|
|
|
272
266
|
yValues = () => {
|
|
273
267
|
const { graphProps } = this.props;
|
|
274
268
|
const { scale, range } = graphProps || {};
|
|
269
|
+
|
|
275
270
|
if (!range || !scale) {
|
|
276
271
|
return;
|
|
277
272
|
}
|
|
@@ -282,33 +277,27 @@ export default class Axes extends React.Component {
|
|
|
282
277
|
return {
|
|
283
278
|
rowTickValues: ticks,
|
|
284
279
|
firstNegativeY: negative,
|
|
285
|
-
|
|
280
|
+
distanceFromOriginToFirstNegativeY: Math.abs(scale.x(0) - scale.x(negative))
|
|
286
281
|
};
|
|
287
282
|
};
|
|
288
283
|
|
|
289
284
|
render() {
|
|
290
285
|
const { graphProps } = this.props;
|
|
291
286
|
const { domain, range } = graphProps || {};
|
|
292
|
-
|
|
293
|
-
// x
|
|
294
287
|
const {
|
|
295
288
|
columnTicksValues,
|
|
296
289
|
firstNegativeX,
|
|
297
|
-
|
|
290
|
+
distanceFromOriginToFirstNegativeX
|
|
298
291
|
} = this.xValues();
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
// y
|
|
302
|
-
const { rowTickValues, firstNegativeY, distantceFromOriginToFirstNegativeY } = this.yValues();
|
|
303
|
-
|
|
292
|
+
const { rowTickValues, firstNegativeY, distanceFromOriginToFirstNegativeY } = this.yValues();
|
|
304
293
|
const deltaAllowance = 6;
|
|
305
294
|
const dy = 25;
|
|
306
295
|
|
|
307
296
|
const skipValues = sharedValues(
|
|
308
297
|
firstNegativeX,
|
|
309
298
|
firstNegativeY,
|
|
310
|
-
|
|
311
|
-
|
|
299
|
+
distanceFromOriginToFirstNegativeX,
|
|
300
|
+
distanceFromOriginToFirstNegativeY,
|
|
312
301
|
deltaAllowance,
|
|
313
302
|
dy
|
|
314
303
|
);
|
|
@@ -321,7 +310,7 @@ export default class Axes extends React.Component {
|
|
|
321
310
|
{...this.props}
|
|
322
311
|
skipValues={skipValues}
|
|
323
312
|
columnTicksValues={columnTicksValues}
|
|
324
|
-
|
|
313
|
+
distanceFromOriginToFirstNegativeY={distanceFromOriginToFirstNegativeY}
|
|
325
314
|
dy={dy}
|
|
326
315
|
/>
|
|
327
316
|
) : null}
|
|
@@ -330,7 +319,7 @@ export default class Axes extends React.Component {
|
|
|
330
319
|
{...this.props}
|
|
331
320
|
skipValues={skipValues}
|
|
332
321
|
rowTickValues={rowTickValues}
|
|
333
|
-
|
|
322
|
+
distanceFromOriginToFirstNegativeX={distanceFromOriginToFirstNegativeX}
|
|
334
323
|
/>
|
|
335
324
|
) : null}
|
|
336
325
|
</React.Fragment>
|
package/src/graph.jsx
CHANGED
|
@@ -10,6 +10,7 @@ import { Axes, AxisPropTypes } from './axis';
|
|
|
10
10
|
import Grid from './grid';
|
|
11
11
|
import { LabelType } from './labels';
|
|
12
12
|
import Bg from './bg';
|
|
13
|
+
import { isDuplicatedMark } from './utils';
|
|
13
14
|
|
|
14
15
|
const log = debug('pie-lib:graphing:graph');
|
|
15
16
|
|
|
@@ -33,10 +34,10 @@ export const graphPropTypes = {
|
|
|
33
34
|
};
|
|
34
35
|
|
|
35
36
|
const getMaskSize = size => ({
|
|
36
|
-
x: -
|
|
37
|
-
y: -
|
|
38
|
-
width: size.width +
|
|
39
|
-
height: size.height +
|
|
37
|
+
x: -23,
|
|
38
|
+
y: -23,
|
|
39
|
+
width: size.width + 46,
|
|
40
|
+
height: size.height + 46
|
|
40
41
|
});
|
|
41
42
|
|
|
42
43
|
export const removeBuildingToolIfCurrentToolDiffers = ({ marks, currentTool }) => {
|
|
@@ -74,7 +75,7 @@ export class Graph extends React.Component {
|
|
|
74
75
|
|
|
75
76
|
const index = newMarks.findIndex(m => isEqual(m, oldMark));
|
|
76
77
|
|
|
77
|
-
if (index >= 0) {
|
|
78
|
+
if (index >= 0 && !isDuplicatedMark(newMark, marks, oldMark)) {
|
|
78
79
|
newMarks.splice(index, 1, newMark);
|
|
79
80
|
|
|
80
81
|
onChangeMarks(newMarks);
|
|
@@ -96,6 +97,10 @@ export class Graph extends React.Component {
|
|
|
96
97
|
const { onChangeMarks, marks } = this.props;
|
|
97
98
|
let newMarks = cloneDeep(marks);
|
|
98
99
|
|
|
100
|
+
if (!update.building && isDuplicatedMark(update, marks)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
99
104
|
const index = newMarks.findIndex(m => isEqual(m, existing));
|
|
100
105
|
|
|
101
106
|
if (index >= 0) {
|
|
@@ -115,12 +120,13 @@ export class Graph extends React.Component {
|
|
|
115
120
|
return (tool && tool.Component) || null;
|
|
116
121
|
};
|
|
117
122
|
|
|
118
|
-
onBgClick =
|
|
119
|
-
|
|
120
|
-
|
|
123
|
+
onBgClick = point => {
|
|
124
|
+
const { x, y } = point;
|
|
121
125
|
const { labelModeEnabled, currentTool, marks } = this.props;
|
|
122
126
|
|
|
123
|
-
|
|
127
|
+
log('[onBgClick] x,y: ', x, y);
|
|
128
|
+
|
|
129
|
+
if (labelModeEnabled || !currentTool) {
|
|
124
130
|
return;
|
|
125
131
|
}
|
|
126
132
|
|
|
@@ -199,7 +205,7 @@ export class Graph extends React.Component {
|
|
|
199
205
|
coordinatesOnHover={coordinatesOnHover}
|
|
200
206
|
onChange={this.changeMark}
|
|
201
207
|
onComplete={this.completeMark}
|
|
202
|
-
onClick={
|
|
208
|
+
onClick={this.onBgClick}
|
|
203
209
|
onDragStart={this.startDrag}
|
|
204
210
|
onDragStop={this.stopDrag}
|
|
205
211
|
labelNode={this.state.labelNode}
|
|
@@ -5,7 +5,7 @@ import { trig, types } from '@pie-lib/plot';
|
|
|
5
5
|
import classNames from 'classnames';
|
|
6
6
|
import { withStyles } from '@material-ui/core/styles';
|
|
7
7
|
import { ArrowMarker, genUid } from '../shared/arrow-head';
|
|
8
|
-
import { thinnerShapesNeeded } from '../../utils';
|
|
8
|
+
import { thinnerShapesNeeded, getAdjustedGraphLimits } from '../../utils';
|
|
9
9
|
|
|
10
10
|
const markerId = genUid();
|
|
11
11
|
|
|
@@ -19,10 +19,12 @@ const lineStyles = theme => ({
|
|
|
19
19
|
incorrect: styles.incorrect(theme, 'stroke'),
|
|
20
20
|
incorrectArrow: styles.incorrect(theme)
|
|
21
21
|
});
|
|
22
|
+
|
|
22
23
|
export const ArrowedLine = props => {
|
|
23
24
|
const { className, classes, correctness, disabled, graphProps, from, to, ...rest } = props;
|
|
24
25
|
const { scale } = graphProps;
|
|
25
|
-
const
|
|
26
|
+
const { domain, range } = getAdjustedGraphLimits(graphProps);
|
|
27
|
+
const [eFrom, eTo] = trig.edges(domain, range)(from, to);
|
|
26
28
|
const suffix = correctness || (disabled && 'disabled') || 'enabled';
|
|
27
29
|
|
|
28
30
|
return (
|
|
@@ -5,7 +5,7 @@ import { ArrowMarker, genUid } from '../shared/arrow-head';
|
|
|
5
5
|
import { trig, types } from '@pie-lib/plot';
|
|
6
6
|
import { withStyles } from '@material-ui/core/styles';
|
|
7
7
|
import classNames from 'classnames';
|
|
8
|
-
import { thinnerShapesNeeded } from '../../utils';
|
|
8
|
+
import { thinnerShapesNeeded, getAdjustedGraphLimits } from '../../utils';
|
|
9
9
|
|
|
10
10
|
const markerId = genUid();
|
|
11
11
|
|
|
@@ -19,10 +19,12 @@ const rayStyles = theme => ({
|
|
|
19
19
|
incorrect: styles.incorrect(theme, 'stroke'),
|
|
20
20
|
incorrectArrow: styles.incorrect(theme)
|
|
21
21
|
});
|
|
22
|
+
|
|
22
23
|
export const RayLine = props => {
|
|
23
24
|
const { graphProps, from, to, classes, disabled, correctness, className, ...rest } = props;
|
|
24
25
|
const { scale } = graphProps;
|
|
25
|
-
const
|
|
26
|
+
const { domain, range } = getAdjustedGraphLimits(graphProps);
|
|
27
|
+
const [aToB] = trig.edges(domain, range)(from, to);
|
|
26
28
|
const suffix = correctness || (disabled && 'disabled') || 'enabled';
|
|
27
29
|
|
|
28
30
|
return (
|
package/src/utils.js
CHANGED
|
@@ -21,14 +21,14 @@ export const getTickValues = prop => {
|
|
|
21
21
|
|
|
22
22
|
while (tickVal >= prop.min && tickValues.indexOf(tickVal) < 0) {
|
|
23
23
|
tickValues.push(tickVal);
|
|
24
|
-
tickVal = Math.round((tickVal - prop.step) *
|
|
24
|
+
tickVal = Math.round((tickVal - prop.step) * 10000) / 10000;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
tickVal = Math.round(prop.step *
|
|
27
|
+
tickVal = Math.round(prop.step * 10000) / 10000;
|
|
28
28
|
|
|
29
29
|
while (tickVal <= prop.max && tickValues.indexOf(tickVal) < 0) {
|
|
30
30
|
tickValues.push(tickVal);
|
|
31
|
-
tickVal = Math.round((tickVal + prop.step) *
|
|
31
|
+
tickVal = Math.round((tickVal + prop.step) * 10000) / 10000;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// return only ticks that are inside the min-max interval
|
|
@@ -114,7 +114,7 @@ export const getMiddleOfTwoPoints = (a, b) => ({
|
|
|
114
114
|
y: (a.y + b.y) / 2
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
-
export const roundNumber = number => parseFloat(number.toFixed(
|
|
117
|
+
export const roundNumber = number => parseFloat(number.toFixed(4));
|
|
118
118
|
|
|
119
119
|
export const sameAxes = (p1, p2) =>
|
|
120
120
|
p1 && p2 && (roundNumber(p1.x) === roundNumber(p2.x) || roundNumber(p1.y) === roundNumber(p2.y));
|
|
@@ -150,3 +150,86 @@ export const thinnerShapesNeeded = graphProps => {
|
|
|
150
150
|
// 14 is the default width of a point
|
|
151
151
|
return getDistanceBetweenTicks(domain, width) < 14 || getDistanceBetweenTicks(range, height) < 14;
|
|
152
152
|
};
|
|
153
|
+
|
|
154
|
+
export const getAdjustedGraphLimits = graphProps => {
|
|
155
|
+
const {
|
|
156
|
+
domain,
|
|
157
|
+
range,
|
|
158
|
+
size: { width, height }
|
|
159
|
+
} = graphProps;
|
|
160
|
+
const domainTicksDistance = getDistanceBetweenTicks(domain, width);
|
|
161
|
+
const rangeTicksDistance = getDistanceBetweenTicks(range, height);
|
|
162
|
+
|
|
163
|
+
// 15 is the distance required for the arrow to extend the graph
|
|
164
|
+
const domainPadding = domain.step / (domainTicksDistance / 15);
|
|
165
|
+
const rangePadding = range.step / (rangeTicksDistance / 15);
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
domain: {
|
|
169
|
+
min: domain.min - domainPadding,
|
|
170
|
+
max: domain.max + domainPadding
|
|
171
|
+
},
|
|
172
|
+
range: {
|
|
173
|
+
min: range.min - rangePadding,
|
|
174
|
+
max: range.max + rangePadding
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const getDistanceBetweenTwoPoints = (a, b) =>
|
|
180
|
+
Math.sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));
|
|
181
|
+
|
|
182
|
+
const sortPoints = array => (array || []).sort((a, b) => a.x - b.x || a.y - b.y);
|
|
183
|
+
|
|
184
|
+
// check colliniarity of 3 points (source: https://www.geeksforgeeks.org/program-check-three-points-collinear/)
|
|
185
|
+
const checkCollinearity = (a, b, c) => (a.x - b.x) * (c.y - b.y) === (c.x - b.x) * (a.y - b.y);
|
|
186
|
+
|
|
187
|
+
// 2 lines are overlapping if all 4 points are collinear
|
|
188
|
+
const isSameLine = (markA, markB) =>
|
|
189
|
+
checkCollinearity(markA.from, markB.from, markB.to) &&
|
|
190
|
+
checkCollinearity(markA.to, markB.from, markB.to);
|
|
191
|
+
|
|
192
|
+
const isSameCircle = (markA, markB) =>
|
|
193
|
+
equalPoints(markA.root, markB.root) &&
|
|
194
|
+
getDistanceBetweenTwoPoints(markB.root, markB.edge) ===
|
|
195
|
+
getDistanceBetweenTwoPoints(markA.root, markA.edge);
|
|
196
|
+
|
|
197
|
+
export const isDuplicatedMark = (mark, marks, oldMark) => {
|
|
198
|
+
const { type, building } = mark;
|
|
199
|
+
|
|
200
|
+
if (building) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const filteredMarks = (marks || []).filter(m => m.type === type && !m.building);
|
|
205
|
+
const index = filteredMarks.findIndex(m => isEqual(m, oldMark));
|
|
206
|
+
|
|
207
|
+
if (index !== -1) {
|
|
208
|
+
filteredMarks.splice(index, 1);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const duplicated = filteredMarks.find(m => {
|
|
212
|
+
if (type === 'circle' || type === 'parabola' || type === 'sine') {
|
|
213
|
+
const { root, edge } = mark;
|
|
214
|
+
|
|
215
|
+
return (
|
|
216
|
+
(equalPoints(root, m.root) && equalPoints(edge, m.edge)) ||
|
|
217
|
+
(type === 'circle' && isSameCircle(m, mark))
|
|
218
|
+
);
|
|
219
|
+
} else if (type === 'line' || type === 'ray' || type === 'segment' || type === 'vector') {
|
|
220
|
+
const { from, to } = mark;
|
|
221
|
+
|
|
222
|
+
return (
|
|
223
|
+
(equalPoints(from, m.from) && equalPoints(to, m.to)) ||
|
|
224
|
+
(equalPoints(from, m.to) && equalPoints(to, m.from)) ||
|
|
225
|
+
(type === 'line' && isSameLine(m, mark))
|
|
226
|
+
);
|
|
227
|
+
} else if (type === 'polygon') {
|
|
228
|
+
return isEqual(sortPoints(cloneDeep(mark.points)), sortPoints(cloneDeep(m.points)));
|
|
229
|
+
} else if (type === 'point') {
|
|
230
|
+
return equalPoints(m, mark);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
return !!duplicated;
|
|
235
|
+
};
|