@pie-lib/charting 4.5.6 → 4.5.11-next.256

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.
Files changed (43) hide show
  1. package/CHANGELOG.json +105 -0
  2. package/CHANGELOG.md +16 -20
  3. package/lib/axes.js +84 -36
  4. package/lib/axes.js.map +1 -1
  5. package/lib/bars/bar.js +17 -13
  6. package/lib/bars/bar.js.map +1 -1
  7. package/lib/bars/common/bars.js +27 -21
  8. package/lib/bars/common/bars.js.map +1 -1
  9. package/lib/bars/histogram.js +17 -13
  10. package/lib/bars/histogram.js.map +1 -1
  11. package/lib/chart.js +55 -37
  12. package/lib/chart.js.map +1 -1
  13. package/lib/common/drag-handle.js +24 -18
  14. package/lib/common/drag-handle.js.map +1 -1
  15. package/lib/common/styles.js +1 -1
  16. package/lib/grid.js +17 -13
  17. package/lib/grid.js.map +1 -1
  18. package/lib/line/common/drag-handle.js +20 -14
  19. package/lib/line/common/drag-handle.js.map +1 -1
  20. package/lib/line/common/line.js +38 -30
  21. package/lib/line/common/line.js.map +1 -1
  22. package/lib/line/line-cross.js +23 -17
  23. package/lib/line/line-cross.js.map +1 -1
  24. package/lib/line/line-dot.js +21 -15
  25. package/lib/line/line-dot.js.map +1 -1
  26. package/lib/mark-label.js +37 -11
  27. package/lib/mark-label.js.map +1 -1
  28. package/lib/plot/common/plot.js +27 -21
  29. package/lib/plot/common/plot.js.map +1 -1
  30. package/lib/plot/dot.js +18 -14
  31. package/lib/plot/dot.js.map +1 -1
  32. package/lib/plot/line.js +19 -15
  33. package/lib/plot/line.js.map +1 -1
  34. package/lib/tool-menu.js +19 -15
  35. package/lib/tool-menu.js.map +1 -1
  36. package/lib/utils.js +79 -26
  37. package/lib/utils.js.map +1 -1
  38. package/package.json +3 -3
  39. package/src/axes.jsx +72 -29
  40. package/src/chart.jsx +31 -6
  41. package/src/line/common/line.jsx +1 -1
  42. package/src/mark-label.jsx +15 -4
  43. package/src/utils.js +75 -19
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["tickCount","utils","bounds","point","bandKey","d","index","label","dataToXBand","scaleX","data","width","type","rangeRound","domain","map","padding","range","getTickValues","prop","tickValues","tickVal","min","max","push","Math","round","step","getDomainAndRangeByChartType","chartType","labelStep","numberMax","parseFloat","intMin","intMax","getGridLinesAndAxisByChartType","verticalLines","undefined","horizontalLines","leftAxis","getRotateAngle","barWidth","getTopPadding"],"mappings":"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","sourcesContent":["import { scaleBand, scalePoint } from '@vx/scale';\nimport { utils } from '@pie-lib/plot';\n\nexport const tickCount = utils.tickCount;\nexport const bounds = utils.bounds;\nexport const point = utils.point;\n\nexport const bandKey = (d, index) => `${index}-${d.label || '-'}`;\n\nexport const dataToXBand = (scaleX, data, width, type) => {\n switch (type) {\n case 'bar':\n case 'dotPlot':\n case 'linePlot':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0.2\n });\n case 'histogram':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n case 'lineCross':\n case 'lineDot':\n return scalePoint({\n domain: data && data.map(bandKey),\n rangeRound: [0, width]\n });\n default:\n return scaleBand({\n range: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n }\n};\n\nexport const getTickValues = (prop = {}) => {\n const tickValues = [];\n let tickVal = prop.min;\n\n while (tickVal <= prop.max) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 100) / 100;\n }\n\n return tickValues;\n};\n\nexport const getDomainAndRangeByChartType = (domain, range, chartType) => {\n let { step, labelStep, min, max } = range || {};\n\n if (!min) {\n min = 0;\n }\n\n if (!max || max < 0) {\n max = range.min + 1;\n }\n\n const numberMax = parseFloat(max);\n\n if (!step) {\n if (numberMax < 20) {\n step = 1;\n } else if (numberMax >= 20 && numberMax < 100) {\n step = 5;\n } else {\n step = 10;\n }\n }\n\n if (!labelStep) {\n labelStep = numberMax;\n }\n\n switch (chartType) {\n // if chart is dot plot or line plot, we should ignore step and make sure that min & max are integer values\n case 'dotPlot':\n case 'linePlot': {\n const intMin = Math.round(min);\n const intMax = Math.round(max);\n\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n min: intMin,\n max: intMin === intMax ? intMin + 1 : intMax,\n labelStep,\n step: 1\n }\n };\n }\n default:\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n labelStep,\n step\n }\n };\n }\n};\n\nexport const getGridLinesAndAxisByChartType = (range, chartType) => {\n switch (chartType) {\n case 'lineDot':\n case 'lineCross':\n return {\n verticalLines: undefined,\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n case 'dotPlot':\n case 'linePlot':\n return {\n verticalLines: [],\n horizontalLines: [],\n leftAxis: false\n };\n default:\n return {\n verticalLines: [],\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n }\n};\n\nexport const getRotateAngle = barWidth => {\n if (barWidth < 30) {\n return 75;\n }\n\n if (barWidth < 40) {\n return 45;\n }\n\n if (barWidth < 60) {\n return 25;\n }\n\n return 0;\n};\n\nexport const getTopPadding = barWidth => {\n if (barWidth < 30) {\n return 50;\n }\n\n if (barWidth < 40) {\n return 30;\n }\n\n if (barWidth < 60) {\n return 15;\n }\n\n return 0;\n};\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../src/utils.js"],"names":["tickCount","utils","bounds","point","bandKey","d","index","label","dataToXBand","scaleX","data","width","type","rangeRound","domain","map","padding","range","getTickValues","prop","tickValues","tickVal","min","max","push","Math","round","step","customLabelStep","rangeMax","size","labelFontSize","ceilMax","ceil","segmentLength","height","ticksToFitInOneSegment","tickWidthPerSegment","rawLabelStep","roundedStep","labelStep","crowdedTicks","numberOfSegments","modulo","a","b","Number","isInteger","decimals","toString","split","pop","length","aux","pow","getDomainAndRangeByChartType","chartType","isNaN","crowded","intMin","intMax","getGridLinesAndAxisByChartType","verticalLines","undefined","horizontalLines","leftAxis","getRotateAngle","fontSize","getTopPadding","barWidth"],"mappings":";;;;;;;AAAA;;AACA;;;;;;;;AAEO,IAAMA,SAAS,GAAGC,YAAMD,SAAxB;;AACA,IAAME,MAAM,GAAGD,YAAMC,MAArB;;AACA,IAAMC,KAAK,GAAGF,YAAME,KAApB;;;AAEA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAACC,CAAD,EAAIC,KAAJ;AAAA,mBAAiBA,KAAjB,cAA0BD,CAAC,CAACE,KAAF,IAAW,GAArC;AAAA,CAAhB;;;;AAEA,IAAMC,WAAW,GAAG,SAAdA,WAAc,CAACC,MAAD,EAASC,IAAT,EAAeC,KAAf,EAAsBC,IAAtB,EAA+B;AACxD,UAAQA,IAAR;AACE,SAAK,KAAL;AACA,SAAK,SAAL;AACA,SAAK,UAAL;AACE,aAAO,sBAAU;AACfC,QAAAA,UAAU,EAAE,CAAC,CAAD,EAAIF,KAAJ,CADG;AAEfG,QAAAA,MAAM,EAAEJ,IAAI,IAAIA,IAAI,CAACK,GAAL,CAASX,OAAT,CAFD;AAGfY,QAAAA,OAAO,EAAE;AAHM,OAAV,CAAP;;AAKF,SAAK,WAAL;AACE,aAAO,sBAAU;AACfH,QAAAA,UAAU,EAAE,CAAC,CAAD,EAAIF,KAAJ,CADG;AAEfG,QAAAA,MAAM,EAAEJ,IAAI,IAAIA,IAAI,CAACK,GAAL,CAASX,OAAT,CAFD;AAGfY,QAAAA,OAAO,EAAE;AAHM,OAAV,CAAP;;AAKF,SAAK,WAAL;AACA,SAAK,SAAL;AACE,aAAO,uBAAW;AAChBF,QAAAA,MAAM,EAAEJ,IAAI,IAAIA,IAAI,CAACK,GAAL,CAASX,OAAT,CADA;AAEhBS,QAAAA,UAAU,EAAE,CAAC,CAAD,EAAIF,KAAJ;AAFI,OAAX,CAAP;;AAIF;AACE,aAAO,sBAAU;AACfM,QAAAA,KAAK,EAAE,CAAC,CAAD,EAAIN,KAAJ,CADQ;AAEfG,QAAAA,MAAM,EAAEJ,IAAI,IAAIA,IAAI,CAACK,GAAL,CAASX,OAAT,CAFD;AAGfY,QAAAA,OAAO,EAAE;AAHM,OAAV,CAAP;AAtBJ;AA4BD,CA7BM;;;;AA+BA,IAAME,aAAa,GAAG,SAAhBA,aAAgB,GAAe;AAAA,MAAdC,IAAc,uEAAP,EAAO;AAC1C,MAAMC,UAAU,GAAG,EAAnB;AACA,MAAIC,OAAO,GAAGF,IAAI,CAACG,GAAnB;;AAEA,SAAOD,OAAO,IAAIF,IAAI,CAACI,GAAvB,EAA4B;AAC1BH,IAAAA,UAAU,CAACI,IAAX,CAAgBH,OAAhB;AACAA,IAAAA,OAAO,GAAGI,IAAI,CAACC,KAAL,CAAW,CAACL,OAAO,GAAGF,IAAI,CAACQ,IAAhB,IAAwB,GAAnC,IAA0C,GAApD;AACD;;AAED,SAAOP,UAAP;AACD,CAVM;;;;AAYA,IAAMQ,eAAe,GAAG,SAAlBA,eAAkB,CAACC,QAAD,EAAWC,IAAX,EAAiBC,aAAjB,EAAmC;AAChE,MAAMC,OAAO,GAAGP,IAAI,CAACQ,IAAL,CAAUJ,QAAV,CAAhB;AACA,MAAMK,aAAa,GAAGJ,IAAI,CAACK,MAAL,GAAcH,OAApC;AACA,MAAMI,sBAAsB,GAAG,CAA/B,CAHgE,CAKhE;;AACA,MAAMC,mBAAmB,GAAGH,aAAa,GAAGH,aAA5C;AACA,MAAMO,YAAY,GAAGF,sBAAsB,GAAGC,mBAA9C;AACA,MAAME,WAAW,GAAGd,IAAI,CAACQ,IAAL,CAAWK,YAAY,GAAG,EAAhB,GAAsB,EAAhC,CAApB;AAEA,MAAIE,SAAJ;;AAEA,MAAIF,YAAY,GAAG,IAAnB,EAAyB;AACvBE,IAAAA,SAAS,GAAGD,WAAZ;AACD,GAFD,MAEO,IAAID,YAAY,GAAG,IAAnB,EAAyB;AAC9BE,IAAAA,SAAS,GAAG,GAAZ;AACD,GAFM,MAEA;AACLA,IAAAA,SAAS,GAAG,GAAZ;AACD;;AAED,SAAOA,SAAP;AACD,CArBM;;;;AAuBA,IAAMC,YAAY,GAAG,SAAfA,YAAe,CAACZ,QAAD,EAAWD,eAAX,EAA4BE,IAA5B,EAAkCC,aAAlC,EAAoD;AAC9E,MAAMC,OAAO,GAAGP,IAAI,CAACQ,IAAL,CAAUJ,QAAV,CAAhB;AAEA,MAAMa,gBAAgB,GAAGV,OAAO,GAAGJ,eAAnC;AAEA,SAAOE,IAAI,CAACK,MAAL,GAAcO,gBAAd,GAAiCX,aAAjC,IAAkDD,IAAI,CAACK,MAAL,GAAcO,gBAAd,GAAiC,GAA1F;AACD,CANM,C,CAQP;;;;;AACA,IAAMC,MAAM,GAAG,SAATA,MAAS,CAACC,CAAD,EAAIC,CAAJ,EAAU;AACvB,MAAIC,MAAM,CAACC,SAAP,CAAiBF,CAAjB,CAAJ,EAAyB;AACvB,WAAOD,CAAC,GAAGC,CAAX;AACD;;AAED,MAAMG,QAAQ,GAAGH,CAAC,CACfI,QADc,GAEdC,KAFc,CAER,GAFQ,EAGdC,GAHc,GAGRC,MAHT;AAIA,MAAMC,GAAG,GAAG5B,IAAI,CAAC6B,GAAL,CAAS,EAAT,EAAaN,QAAb,CAAZ;AAEA,SAAQJ,CAAC,GAAGS,GAAL,IAAaR,CAAC,GAAGQ,GAAjB,CAAP;AACD,CAZD;;AAcO,IAAME,4BAA4B,GAAG,SAA/BA,4BAA+B,CAACzC,MAAD,EAASG,KAAT,EAAgBa,IAAhB,EAAsB0B,SAAtB,EAAiCzB,aAAjC,EAAmD;AAC7F,aAAoCd,KAAK,IAAI,EAA7C;AAAA,MAAMU,IAAN,QAAMA,IAAN;AAAA,MAAYa,SAAZ,QAAYA,SAAZ;AAAA,MAAuBlB,GAAvB,QAAuBA,GAAvB;AAAA,MAA4BC,GAA5B,QAA4BA,GAA5B;;AAEA,MAAI,CAACD,GAAL,EAAU;AACRA,IAAAA,GAAG,GAAG,CAAN;AACD;;AAED,MAAI,CAACC,GAAD,IAAQA,GAAG,GAAG,CAAlB,EAAqB;AACnBA,IAAAA,GAAG,GAAGN,KAAK,CAACK,GAAN,GAAY,CAAlB;AACD;;AAED,MAAIkB,SAAS,IAAI,CAACb,IAAlB,EAAwB;AACtBA,IAAAA,IAAI,GAAGa,SAAP;AACD;;AACD,MAAI,CAACA,SAAD,IAAeiB,KAAK,CAACjB,SAAD,CAAL,IAAoBb,IAAvC,EAA8C;AAC5C,QAAIC,gBAAe,GAAGD,IAAtB;AACA,QAAI+B,OAAO,GAAGjB,YAAY,CAAClB,GAAD,EAAMK,gBAAN,EAAuBE,IAAvB,EAA6BC,aAA7B,CAA1B;;AAEA,QAAI2B,OAAJ,EAAa;AACX9B,MAAAA,gBAAe,GAAGA,gBAAe,GAAG,CAApC;AACD;;AAEDY,IAAAA,SAAS,GAAGZ,gBAAZ;AACD;;AAED,MAAI,CAACD,IAAD,IAAU8B,KAAK,CAAC9B,IAAD,CAAL,IAAe,CAACa,SAA1B,IAAwCiB,KAAK,CAACjB,SAAD,CAAjD,EAA8D;AAC5DA,IAAAA,SAAS,GAAGZ,eAAe,CAACL,GAAD,EAAMO,IAAN,EAAYC,aAAZ,CAA3B;;AAEA,QAAIS,SAAS,IAAI,CAAjB,EAAoB;AAClBb,MAAAA,IAAI,GAAGa,SAAP;AACD,KAFD,MAEO,IAAIA,SAAS,IAAI,CAAjB,EAAoB;AACzBb,MAAAA,IAAI,GAAG,CAAP;AACD,KAFM,MAEA,IAAIa,SAAS,GAAG,CAAZ,IAAiBA,SAAS,GAAG,EAAjC,EAAqC;AAC1Cb,MAAAA,IAAI,GAAGa,SAAS,GAAG,CAAnB;AACD,KAFM,MAEA;AACLb,MAAAA,IAAI,GAAGa,SAAS,GAAG,CAAnB;AACD;AACF;;AAED,MAAIG,MAAM,CAACpB,GAAD,EAAMI,IAAN,CAAN,KAAsB,CAA1B,EAA6B;AAC3BJ,IAAAA,GAAG,GAAGA,GAAG,GAAGI,IAAZ;AACD;;AAEDV,EAAAA,KAAK,CAACM,GAAN,GAAYA,GAAZ;;AAEA,UAAQiC,SAAR;AACE;AACA,SAAK,SAAL;AACA,SAAK,UAAL;AAAiB;AACf,YAAMG,MAAM,GAAGlC,IAAI,CAACC,KAAL,CAAWJ,GAAX,CAAf;AACA,YAAMsC,MAAM,GAAGnC,IAAI,CAACC,KAAL,CAAWH,GAAX,CAAf;AAEA,eAAO;AACLT,UAAAA,MAAM,kCACDA,MADC;AAEJa,YAAAA,IAAI,EAAE,CAFF;AAGJa,YAAAA,SAAS,EAAE,CAHP;AAIJlB,YAAAA,GAAG,EAAE,CAJD;AAKJC,YAAAA,GAAG,EAAE;AALD,YADD;AAQLN,UAAAA,KAAK,kCACAA,KADA;AAEHK,YAAAA,GAAG,EAAEqC,MAFF;AAGHpC,YAAAA,GAAG,EAAEoC,MAAM,KAAKC,MAAX,GAAoBD,MAAM,GAAG,CAA7B,GAAiCC,MAHnC;AAIHpB,YAAAA,SAAS,EAATA,SAJG;AAKHb,YAAAA,IAAI,EAAE;AALH;AARA,SAAP;AAgBD;;AACD;AACE,aAAO;AACLb,QAAAA,MAAM,kCACDA,MADC;AAEJa,UAAAA,IAAI,EAAE,CAFF;AAGJa,UAAAA,SAAS,EAAE,CAHP;AAIJlB,UAAAA,GAAG,EAAE,CAJD;AAKJC,UAAAA,GAAG,EAAE;AALD,UADD;AAQLN,QAAAA,KAAK,kCACAA,KADA;AAEHuB,UAAAA,SAAS,EAATA,SAFG;AAGHb,UAAAA,IAAI,EAAJA;AAHG;AARA,OAAP;AAzBJ;AAwCD,CArFM;;;;AAuFA,IAAMkC,8BAA8B,GAAG,SAAjCA,8BAAiC,CAAC5C,KAAD,EAAQuC,SAAR,EAAsB;AAClE,UAAQA,SAAR;AACE,SAAK,SAAL;AACA,SAAK,WAAL;AACE,aAAO;AACLM,QAAAA,aAAa,EAAEC,SADV;AAELC,QAAAA,eAAe,EAAE9C,aAAa,CAACD,KAAD,CAFzB;AAGLgD,QAAAA,QAAQ,EAAE;AAHL,OAAP;;AAKF,SAAK,SAAL;AACA,SAAK,UAAL;AACE,aAAO;AACLH,QAAAA,aAAa,EAAE,EADV;AAELE,QAAAA,eAAe,EAAE,EAFZ;AAGLC,QAAAA,QAAQ,EAAE;AAHL,OAAP;;AAKF;AACE,aAAO;AACLH,QAAAA,aAAa,EAAE,EADV;AAELE,QAAAA,eAAe,EAAE9C,aAAa,CAACD,KAAD,CAFzB;AAGLgD,QAAAA,QAAQ,EAAE;AAHL,OAAP;AAhBJ;AAsBD,CAvBM;;;;AAyBA,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,CAACC,QAAD,EAAWhC,MAAX,EAAsB;AAClD,MAAIA,MAAM,IAAIgC,QAAQ,GAAG,CAAzB,EAA4B;AAC1B,WAAO,EAAP;AACD;;AAED,SAAO,CAAP;AACD,CANM;;;;AAQA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAAAC,QAAQ,EAAI;AACvC,MAAIA,QAAQ,GAAG,EAAf,EAAmB;AACjB,WAAO,EAAP;AACD;;AAED,MAAIA,QAAQ,GAAG,EAAf,EAAmB;AACjB,WAAO,EAAP;AACD;;AAED,MAAIA,QAAQ,GAAG,EAAf,EAAmB;AACjB,WAAO,EAAP;AACD;;AAED,SAAO,CAAP;AACD,CAdM","sourcesContent":["import { scaleBand, scalePoint } from '@vx/scale';\nimport { utils } from '@pie-lib/plot';\n\nexport const tickCount = utils.tickCount;\nexport const bounds = utils.bounds;\nexport const point = utils.point;\n\nexport const bandKey = (d, index) => `${index}-${d.label || '-'}`;\n\nexport const dataToXBand = (scaleX, data, width, type) => {\n switch (type) {\n case 'bar':\n case 'dotPlot':\n case 'linePlot':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0.2\n });\n case 'histogram':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n case 'lineCross':\n case 'lineDot':\n return scalePoint({\n domain: data && data.map(bandKey),\n rangeRound: [0, width]\n });\n default:\n return scaleBand({\n range: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n }\n};\n\nexport const getTickValues = (prop = {}) => {\n const tickValues = [];\n let tickVal = prop.min;\n\n while (tickVal <= prop.max) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 100) / 100;\n }\n\n return tickValues;\n};\n\nexport const customLabelStep = (rangeMax, size, labelFontSize) => {\n const ceilMax = Math.ceil(rangeMax);\n const segmentLength = size.height / ceilMax;\n const ticksToFitInOneSegment = 2;\n\n // how many ticksWidth fit in a segment\n const tickWidthPerSegment = segmentLength / labelFontSize;\n const rawLabelStep = ticksToFitInOneSegment / tickWidthPerSegment;\n const roundedStep = Math.ceil((rawLabelStep * 10) / 10);\n\n let labelStep;\n\n if (rawLabelStep > 0.15) {\n labelStep = roundedStep;\n } else if (rawLabelStep < 0.05) {\n labelStep = 0.1;\n } else {\n labelStep = 0.5;\n }\n\n return labelStep;\n};\n\nexport const crowdedTicks = (rangeMax, customLabelStep, size, labelFontSize) => {\n const ceilMax = Math.ceil(rangeMax);\n\n const numberOfSegments = ceilMax * customLabelStep;\n\n return size.height / numberOfSegments < labelFontSize && size.height / numberOfSegments > 0.5;\n};\n\n// multiply values with 10^number_of_decimals if needed because modulo function(%) is only defined for integers\nconst modulo = (a, b) => {\n if (Number.isInteger(b)) {\n return a % b;\n }\n\n const decimals = b\n .toString()\n .split('.')\n .pop().length;\n const aux = Math.pow(10, decimals);\n\n return (a * aux) % (b * aux);\n};\n\nexport const getDomainAndRangeByChartType = (domain, range, size, chartType, labelFontSize) => {\n let { step, labelStep, min, max } = range || {};\n\n if (!min) {\n min = 0;\n }\n\n if (!max || max < 0) {\n max = range.min + 1;\n }\n\n if (labelStep && !step) {\n step = labelStep;\n }\n if (!labelStep || (isNaN(labelStep) && step)) {\n let customLabelStep = step;\n let crowded = crowdedTicks(max, customLabelStep, size, labelFontSize);\n\n if (crowded) {\n customLabelStep = customLabelStep * 2;\n }\n\n labelStep = customLabelStep;\n }\n\n if (!step || (isNaN(step) && !labelStep) || isNaN(labelStep)) {\n labelStep = customLabelStep(max, size, labelFontSize);\n\n if (labelStep <= 1) {\n step = labelStep;\n } else if (labelStep <= 4) {\n step = 1;\n } else if (labelStep > 4 && labelStep < 10) {\n step = labelStep / 2;\n } else {\n step = labelStep / 3;\n }\n }\n\n if (modulo(max, step) !== 0) {\n max = max + step;\n }\n\n range.max = max;\n\n switch (chartType) {\n // if chart is dot plot or line plot, we should ignore step and make sure that min & max are integer values\n case 'dotPlot':\n case 'linePlot': {\n const intMin = Math.round(min);\n const intMax = Math.round(max);\n\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n min: intMin,\n max: intMin === intMax ? intMin + 1 : intMax,\n labelStep,\n step: 1\n }\n };\n }\n default:\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n labelStep,\n step\n }\n };\n }\n};\n\nexport const getGridLinesAndAxisByChartType = (range, chartType) => {\n switch (chartType) {\n case 'lineDot':\n case 'lineCross':\n return {\n verticalLines: undefined,\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n case 'dotPlot':\n case 'linePlot':\n return {\n verticalLines: [],\n horizontalLines: [],\n leftAxis: false\n };\n default:\n return {\n verticalLines: [],\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n }\n};\n\nexport const getRotateAngle = (fontSize, height) => {\n if (height >= fontSize * 2) {\n return 25;\n }\n\n return 0;\n};\n\nexport const getTopPadding = barWidth => {\n if (barWidth < 30) {\n return 50;\n }\n\n if (barWidth < 40) {\n return 30;\n }\n\n if (barWidth < 60) {\n return 15;\n }\n\n return 0;\n};\n"],"file":"utils.js"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "4.5.6",
6
+ "version": "4.5.11-next.256+a82f29f3",
7
7
  "description": "charting",
8
8
  "keywords": [
9
9
  "react",
@@ -19,7 +19,7 @@
19
19
  "dependencies": {
20
20
  "@mapbox/point-geometry": "^0.1.0",
21
21
  "@material-ui/core": "^3.8.3",
22
- "@pie-lib/plot": "^2.1.5",
22
+ "@pie-lib/plot": "^2.1.9",
23
23
  "@vx/axis": "^0.0.183",
24
24
  "@vx/event": "^0.0.182",
25
25
  "@vx/grid": "^0.0.183",
@@ -43,5 +43,5 @@
43
43
  "peerDependencies": {
44
44
  "react": "^16.8.1"
45
45
  },
46
- "gitHead": "28d864a7a5b82946b6c32c9e5ca77dd3fb842e89"
46
+ "gitHead": "a82f29f3ebb98147471c1f0f727052e792cd2957"
47
47
  }
package/src/axes.jsx CHANGED
@@ -46,6 +46,14 @@ export class TickComponent extends React.Component {
46
46
  const category = categories[index];
47
47
  const { deletable, editable, interactive, label, correctness } = category || {};
48
48
  const barX = xBand(bandKey({ label }, index));
49
+ const longestCategory = (categories || []).reduce((a, b) => {
50
+ const lengthA = a && a.label ? a.label.length : 0;
51
+ const lengthB = b && b.label ? b.label.length : 0;
52
+
53
+ return lengthA > lengthB ? a : b;
54
+ });
55
+
56
+ const longestLabel = (longestCategory && longestCategory.label) || '';
49
57
 
50
58
  return (
51
59
  <g>
@@ -56,6 +64,21 @@ export class TickComponent extends React.Component {
56
64
  height={24}
57
65
  style={{ pointerEvents: 'none', overflow: 'visible' }}
58
66
  >
67
+ {index === 0 && (
68
+ <div
69
+ id="hiddenLabel"
70
+ style={{
71
+ position: 'absolute',
72
+ visibility: 'hidden',
73
+ wordBreak: 'break-word',
74
+ overflow: 'visible',
75
+ maxWidth: barWidth,
76
+ display: 'block'
77
+ }}
78
+ >
79
+ {longestLabel}
80
+ </div>
81
+ )}
59
82
  <MarkLabel
60
83
  inputRef={r => (this.input = r)}
61
84
  disabled={!(editable && interactive)}
@@ -121,9 +144,20 @@ export class RawChartAxes extends React.Component {
121
144
  leftAxis: PropTypes.bool,
122
145
  onChange: PropTypes.func,
123
146
  onChangeCategory: PropTypes.func,
124
- top: PropTypes.number
147
+ top: PropTypes.number,
148
+ theme: PropTypes.object
125
149
  };
126
150
 
151
+ state = { height: 0 };
152
+
153
+ componentDidMount() {
154
+ const height = document.getElementById('hiddenLabel')
155
+ ? document.getElementById('hiddenLabel').offsetHeight
156
+ : 0;
157
+
158
+ this.setState({ height });
159
+ }
160
+
127
161
  render() {
128
162
  const {
129
163
  classes,
@@ -133,17 +167,23 @@ export class RawChartAxes extends React.Component {
133
167
  onChange,
134
168
  onChangeCategory,
135
169
  categories = [],
136
- top
170
+ top,
171
+ theme
137
172
  } = this.props;
173
+
138
174
  const { axis, axisLine, tick, axisLabel } = classes;
139
175
  const { scale = {}, range = {}, domain = {}, size = {} } = graphProps || {};
176
+ const { height } = this.state;
177
+
140
178
  const bottomScale =
141
179
  xBand && typeof xBand.rangeRound === 'function' && xBand.rangeRound([0, size.width]);
142
180
  const bandWidth = xBand && typeof xBand.bandwidth === 'function' && xBand.bandwidth();
143
181
  // for chartType "line", bandWidth will be 0, so we have to calculate it
144
182
  const barWidth = bandWidth || (scale.x && scale.x(domain.max) / categories.length);
183
+
145
184
  const rowTickValues = getTickValues({ ...range, step: range.labelStep });
146
- const rotate = getRotateAngle(barWidth);
185
+ const fontSize = theme && theme.typography ? theme.typography.fontSize : 14;
186
+ const rotate = getRotateAngle(fontSize, height);
147
187
 
148
188
  const getTickLabelProps = value => ({
149
189
  dy: 4,
@@ -203,34 +243,37 @@ export class RawChartAxes extends React.Component {
203
243
  }
204
244
  }
205
245
 
206
- const ChartAxes = withStyles(theme => ({
207
- axisLabel: {
208
- fontFamily: theme.typography.body1.fontFamily,
209
- fontSize: theme.typography.fontSize,
210
- fill: color.secondary()
211
- },
212
- axis: {
213
- stroke: color.primaryDark(),
214
- strokeWidth: 2
215
- },
216
- axisLine: {
217
- stroke: color.primaryDark(),
218
- strokeWidth: 2
219
- },
220
- tick: {
221
- '& > line': {
246
+ const ChartAxes = withStyles(
247
+ theme => ({
248
+ axisLabel: {
249
+ fontFamily: theme.typography.body1.fontFamily,
250
+ fontSize: theme.typography.fontSize,
251
+ fill: color.secondary()
252
+ },
253
+ axis: {
222
254
  stroke: color.primaryDark(),
223
255
  strokeWidth: 2
224
256
  },
225
- fill: color.primaryDark(),
226
- fontFamily: theme.typography.body1.fontFamily,
227
- fontSize: theme.typography.fontSize,
228
- textAnchor: 'middle'
229
- },
230
- dottedLine: {
231
- stroke: color.primaryLight(),
232
- opacity: 0.2
233
- }
234
- }))(RawChartAxes);
257
+ axisLine: {
258
+ stroke: color.primaryDark(),
259
+ strokeWidth: 2
260
+ },
261
+ tick: {
262
+ '& > line': {
263
+ stroke: color.primaryDark(),
264
+ strokeWidth: 2
265
+ },
266
+ fill: color.primaryDark(),
267
+ fontFamily: theme.typography.body1.fontFamily,
268
+ fontSize: theme.typography.fontSize,
269
+ textAnchor: 'middle'
270
+ },
271
+ dottedLine: {
272
+ stroke: color.primaryLight(),
273
+ opacity: 0.2
274
+ }
275
+ }),
276
+ { withTheme: true }
277
+ )(RawChartAxes);
235
278
 
236
279
  export default ChartAxes;
package/src/chart.jsx CHANGED
@@ -48,7 +48,8 @@ export class Chart extends React.Component {
48
48
  onDataChange: PropTypes.func,
49
49
  addCategoryEnabled: PropTypes.bool,
50
50
  editCategoryEnabled: PropTypes.bool,
51
- categoryDefaultLabel: PropTypes.string
51
+ categoryDefaultLabel: PropTypes.string,
52
+ theme: PropTypes.object
52
53
  };
53
54
 
54
55
  static defaultProps = {
@@ -126,25 +127,43 @@ export class Chart extends React.Component {
126
127
  };
127
128
 
128
129
  getFilteredCategories = () => {
129
- const { data, editCategoryEnabled } = this.props;
130
+ const { data, editCategoryEnabled, addCategoryEnabled } = this.props;
130
131
 
131
132
  return data
132
133
  ? data.map(d => ({
133
134
  ...d,
134
135
  editable: !d.initial || (d.initial && editCategoryEnabled),
135
- deletable: !d.initial
136
+ deletable: !d.initial || (d.initial && addCategoryEnabled)
136
137
  }))
137
138
  : [];
138
139
  };
139
140
 
140
141
  render() {
141
- const { classes, className, domain, range, size, title, addCategoryEnabled } = this.props;
142
+ const {
143
+ classes,
144
+ className,
145
+ domain,
146
+ range,
147
+ size,
148
+ title,
149
+ addCategoryEnabled,
150
+ theme
151
+ } = this.props;
142
152
  let { chartType } = this.props;
143
153
  const { width, height } = size || {};
144
154
 
145
155
  const { ChartComponent } = this.getChart();
146
156
  const categories = this.getFilteredCategories();
147
- const correctValues = getDomainAndRangeByChartType(domain, range, chartType);
157
+
158
+ const labelFontSize = (theme && theme.typography && theme.typography.fontSize) || 14;
159
+ const correctValues = getDomainAndRangeByChartType(
160
+ domain,
161
+ range,
162
+ size,
163
+ chartType,
164
+ labelFontSize
165
+ );
166
+
148
167
  const { verticalLines, horizontalLines, leftAxis } = getGridLinesAndAxisByChartType(
149
168
  correctValues.range,
150
169
  chartType
@@ -234,9 +253,15 @@ const styles = theme => ({
234
253
  borderLeft: `solid 1px ${color.primaryDark()}`,
235
254
  borderRight: `solid 1px ${color.primaryDark()}`
236
255
  },
256
+ root: {
257
+ overflow: 'hidden'
258
+ },
259
+ svg: {
260
+ overflow: 'visible'
261
+ },
237
262
  toolMenu: {
238
263
  minHeight: '36px'
239
264
  }
240
265
  });
241
266
 
242
- export default withStyles(styles)(Chart);
267
+ export default withStyles(styles, { withTheme: true })(Chart);
@@ -18,7 +18,7 @@ const getData = (data, domain) => {
18
18
 
19
19
  return data.map((el, i) => ({
20
20
  ...el,
21
- x: i * (max / (length - 1)),
21
+ x: length > 1 ? i * (max / (length - 1)) : 0.5,
22
22
  y: el.value
23
23
  }));
24
24
  };
@@ -16,7 +16,8 @@ const styles = theme => ({
16
16
  color: color.primaryDark(),
17
17
  '&.correct': correct('color'),
18
18
  '&.incorrect': incorrect('color'),
19
- '&.disabled': disabled('color')
19
+ '&.disabled': disabled('color'),
20
+ backgroundColor: 'transparent !important'
20
21
  }
21
22
  });
22
23
 
@@ -37,8 +38,14 @@ export const MarkLabel = props => {
37
38
  const [label, setLabel] = useState(mark.label);
38
39
  const onChange = e => setLabel(e.target.value);
39
40
  const onChangeProp = e => props.onChange(e.target.value);
41
+ let extraStyle = {};
40
42
 
41
- const left = rotate === 75 ? '9px' : 0;
43
+ if (rotate) {
44
+ extraStyle = {
45
+ width: 'unset',
46
+ textAlign: 'left'
47
+ };
48
+ }
42
49
 
43
50
  // useState only sets the value once, to synch props to state need useEffect
44
51
  useEffect(() => {
@@ -56,14 +63,18 @@ export const MarkLabel = props => {
56
63
  inputStyle={{
57
64
  minWidth: barWidth,
58
65
  textAlign: 'center',
59
- background: 'transparent'
66
+ background: 'transparent',
67
+ boxSizing: 'border-box',
68
+ paddingLeft: 0,
69
+ paddingRight: 0,
70
+ ...extraStyle
60
71
  }}
61
72
  value={label}
62
73
  style={{
63
74
  position: 'absolute',
64
75
  pointerEvents: 'auto',
65
76
  top: 0,
66
- left,
77
+ left: 0,
67
78
  minWidth: barWidth,
68
79
  transformOrigin: 'left',
69
80
  transform: `rotate(${rotate}deg)`
package/src/utils.js CHANGED
@@ -50,7 +50,53 @@ export const getTickValues = (prop = {}) => {
50
50
  return tickValues;
51
51
  };
52
52
 
53
- export const getDomainAndRangeByChartType = (domain, range, chartType) => {
53
+ export const customLabelStep = (rangeMax, size, labelFontSize) => {
54
+ const ceilMax = Math.ceil(rangeMax);
55
+ const segmentLength = size.height / ceilMax;
56
+ const ticksToFitInOneSegment = 2;
57
+
58
+ // how many ticksWidth fit in a segment
59
+ const tickWidthPerSegment = segmentLength / labelFontSize;
60
+ const rawLabelStep = ticksToFitInOneSegment / tickWidthPerSegment;
61
+ const roundedStep = Math.ceil((rawLabelStep * 10) / 10);
62
+
63
+ let labelStep;
64
+
65
+ if (rawLabelStep > 0.15) {
66
+ labelStep = roundedStep;
67
+ } else if (rawLabelStep < 0.05) {
68
+ labelStep = 0.1;
69
+ } else {
70
+ labelStep = 0.5;
71
+ }
72
+
73
+ return labelStep;
74
+ };
75
+
76
+ export const crowdedTicks = (rangeMax, customLabelStep, size, labelFontSize) => {
77
+ const ceilMax = Math.ceil(rangeMax);
78
+
79
+ const numberOfSegments = ceilMax * customLabelStep;
80
+
81
+ return size.height / numberOfSegments < labelFontSize && size.height / numberOfSegments > 0.5;
82
+ };
83
+
84
+ // multiply values with 10^number_of_decimals if needed because modulo function(%) is only defined for integers
85
+ const modulo = (a, b) => {
86
+ if (Number.isInteger(b)) {
87
+ return a % b;
88
+ }
89
+
90
+ const decimals = b
91
+ .toString()
92
+ .split('.')
93
+ .pop().length;
94
+ const aux = Math.pow(10, decimals);
95
+
96
+ return (a * aux) % (b * aux);
97
+ };
98
+
99
+ export const getDomainAndRangeByChartType = (domain, range, size, chartType, labelFontSize) => {
54
100
  let { step, labelStep, min, max } = range || {};
55
101
 
56
102
  if (!min) {
@@ -61,22 +107,40 @@ export const getDomainAndRangeByChartType = (domain, range, chartType) => {
61
107
  max = range.min + 1;
62
108
  }
63
109
 
64
- const numberMax = parseFloat(max);
110
+ if (labelStep && !step) {
111
+ step = labelStep;
112
+ }
113
+ if (!labelStep || (isNaN(labelStep) && step)) {
114
+ let customLabelStep = step;
115
+ let crowded = crowdedTicks(max, customLabelStep, size, labelFontSize);
65
116
 
66
- if (!step) {
67
- if (numberMax < 20) {
117
+ if (crowded) {
118
+ customLabelStep = customLabelStep * 2;
119
+ }
120
+
121
+ labelStep = customLabelStep;
122
+ }
123
+
124
+ if (!step || (isNaN(step) && !labelStep) || isNaN(labelStep)) {
125
+ labelStep = customLabelStep(max, size, labelFontSize);
126
+
127
+ if (labelStep <= 1) {
128
+ step = labelStep;
129
+ } else if (labelStep <= 4) {
68
130
  step = 1;
69
- } else if (numberMax >= 20 && numberMax < 100) {
70
- step = 5;
131
+ } else if (labelStep > 4 && labelStep < 10) {
132
+ step = labelStep / 2;
71
133
  } else {
72
- step = 10;
134
+ step = labelStep / 3;
73
135
  }
74
136
  }
75
137
 
76
- if (!labelStep) {
77
- labelStep = numberMax;
138
+ if (modulo(max, step) !== 0) {
139
+ max = max + step;
78
140
  }
79
141
 
142
+ range.max = max;
143
+
80
144
  switch (chartType) {
81
145
  // if chart is dot plot or line plot, we should ignore step and make sure that min & max are integer values
82
146
  case 'dotPlot':
@@ -144,16 +208,8 @@ export const getGridLinesAndAxisByChartType = (range, chartType) => {
144
208
  }
145
209
  };
146
210
 
147
- export const getRotateAngle = barWidth => {
148
- if (barWidth < 30) {
149
- return 75;
150
- }
151
-
152
- if (barWidth < 40) {
153
- return 45;
154
- }
155
-
156
- if (barWidth < 60) {
211
+ export const getRotateAngle = (fontSize, height) => {
212
+ if (height >= fontSize * 2) {
157
213
  return 25;
158
214
  }
159
215