Skip to content

Commit

Permalink
Adding invert method to ordinal scale (uber#1046)
Browse files Browse the repository at this point in the history
* Adding workaround-implementation of 'invert' method for d3-scale ordinal scale.

* Adding temp dist for my fork.

* Fixing linting errors.

* Adding forgotten file.

* Adding tests for invert functionality of ordinal scale.

* Revert "Adding temp dist for my fork."

This reverts commit 2077f18.

* Revert "Revert "Adding temp dist for my fork.""

This reverts commit aa5c740.

* Removing redundant temp dist.

* Improving addInvertFunctionToOrdinalScaleObject function.

* Updating style in addInvertFunctionToOrdinalScaleObject function
  • Loading branch information
bognikol authored and mcnuttandrew committed Nov 27, 2018
1 parent 398d99e commit 322ff24
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/utils/scales-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,37 @@ export function _getSmallestDistanceIndex(values, scaleObject) {
return result;
}

/**
* This is a workaround for issue that ordinal scale
* does not have invert method implemented in d3-scale.
* @param {Object} Ordinal d3-scale object.
* @returns {void}
* @private
*/

function addInvertFunctionToOrdinalScaleObject(scale) {
if (scale.invert) {
return;
}

scale.invert = function invert(value) {
const [lower, upper] = scale.range();
const start = Math.min(lower, upper);
const stop = Math.max(lower, upper);

if (value < start + scale.padding() * scale.step()) {
return scale.domain()[0];
}

if (value > stop - scale.padding() * scale.step()) {
return scale.domain()[scale.domain().length - 1];
}

const index = Math.floor((value - start - scale.padding() * scale.step()) / scale.step());
return scale.domain()[index];
}
}

/**
* Crate a scale function from the scale object.
* @param {Object} scaleObject Scale object.
Expand Down Expand Up @@ -179,6 +210,7 @@ export function getScaleFnFromScaleObject(scaleObject) {
.range(range);
if (type === ORDINAL_SCALE_TYPE) {
scale.padding(0.5);
addInvertFunctionToOrdinalScaleObject(scale);
}
return scale;
}
Expand Down
16 changes: 16 additions & 0 deletions tests/utils/scales-utils-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,22 @@ test('scales-utils #getScaleFnFromScaleObject', t => {
[-1, 1],
'should build a generic domain that reflects about zero'
);

const ordinalScale = getScaleFnFromScaleObject({
type: 'ordinal',
domain: ["a", "b", "c", "d", "e"],
range: [20, 120]
});

t.equal(ordinalScale.invert(-10), "a");
t.equal(ordinalScale.invert(25), "a");
t.equal(ordinalScale.invert(40), "a");
t.equal(ordinalScale.invert(60), "b");
t.equal(ordinalScale.invert(80), "c");
t.equal(ordinalScale.invert(100), "d");
t.equal(ordinalScale.invert(115), "e");
t.equal(ordinalScale.invert(130), "e");

t.end();
});

Expand Down

0 comments on commit 322ff24

Please sign in to comment.