scale.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. var Util = require('../../util/common');
  2. var Global = require('../../global');
  3. var Scale = require('../../scale/');
  4. var SCALE_TYPES_MAP = {
  5. linear: 'Linear',
  6. cat: 'Cat',
  7. timeCat: 'TimeCat',
  8. identity: 'Identity'
  9. };
  10. var ScaleController =
  11. /*#__PURE__*/
  12. function () {
  13. function ScaleController(cfg) {
  14. // defs 列定义
  15. this.defs = {};
  16. Util.mix(this, cfg);
  17. }
  18. var _proto = ScaleController.prototype;
  19. _proto._getDef = function _getDef(field) {
  20. var defs = this.defs;
  21. var def = null;
  22. if (Global.scales[field] || defs[field]) {
  23. def = Util.mix({}, Global.scales[field]);
  24. Util.each(defs[field], function (v, k) {
  25. if (Util.isNil(v)) {
  26. delete def[k];
  27. } else {
  28. def[k] = v;
  29. }
  30. });
  31. }
  32. return def;
  33. };
  34. _proto._getDefaultType = function _getDefaultType(field, data, def) {
  35. if (def && def.type) {
  36. return def.type;
  37. }
  38. var type = 'linear';
  39. var value = Util.Array.firstValue(data, field);
  40. if (Util.isArray(value)) {
  41. value = value[0];
  42. }
  43. if (Util.isString(value)) {
  44. type = 'cat';
  45. }
  46. return type;
  47. };
  48. _proto._getScaleCfg = function _getScaleCfg(type, field, data, def) {
  49. var values;
  50. if (def && def.values) {
  51. values = def.values;
  52. } else {
  53. values = Util.Array.values(data, field);
  54. }
  55. var cfg = {
  56. field: field,
  57. values: values
  58. };
  59. if (type !== 'cat' && type !== 'timeCat') {
  60. if (!def || !(def.min && def.max)) {
  61. var _Util$Array$getRange = Util.Array.getRange(values),
  62. min = _Util$Array$getRange.min,
  63. max = _Util$Array$getRange.max;
  64. cfg.min = min;
  65. cfg.max = max;
  66. cfg.nice = true;
  67. }
  68. }
  69. if (type === 'cat' || type === 'timeCat') {
  70. cfg.isRounding = false; // used for tickCount calculation
  71. }
  72. return cfg;
  73. };
  74. _proto.createScale = function createScale(field, data) {
  75. var self = this;
  76. var def = self._getDef(field);
  77. var scale;
  78. if (!data || !data.length) {
  79. if (def && def.type) {
  80. def.field = field;
  81. scale = new Scale[SCALE_TYPES_MAP[def.type]](def);
  82. } else {
  83. scale = new Scale.Identity({
  84. value: field,
  85. field: field.toString(),
  86. values: [field]
  87. });
  88. }
  89. return scale;
  90. }
  91. var firstObj = data[0];
  92. var firstValue = firstObj[field];
  93. if (firstValue === null) {
  94. firstValue = Util.Array.firstValue(data, field);
  95. }
  96. if (Util.isNumber(field) || Util.isNil(firstValue) && !def) {
  97. scale = new Scale.Identity({
  98. value: field,
  99. field: field.toString(),
  100. values: [field]
  101. });
  102. } else {
  103. var type = self._getDefaultType(field, data, def);
  104. var cfg = self._getScaleCfg(type, field, data, def);
  105. def && Util.mix(cfg, def);
  106. scale = new Scale[SCALE_TYPES_MAP[type]](cfg);
  107. }
  108. return scale;
  109. };
  110. return ScaleController;
  111. }();
  112. module.exports = ScaleController;