@pie-lib/text-select 1.12.8-next.1 → 1.14.0-beta.0
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 +16 -0
- package/NEXT.CHANGELOG.json +1 -0
- package/lib/__tests__/text-select.test.js +56 -0
- package/lib/__tests__/utils.test.js +23 -0
- package/lib/index.js +9 -1
- package/lib/legend.js +1 -1
- package/lib/text-select.js +1 -1
- package/lib/token-select/__tests__/index.test.js +268 -0
- package/lib/token-select/__tests__/token.test.js +35 -0
- package/lib/token-select/index.js +4 -3
- package/lib/token-select/token.js +13 -20
- package/lib/tokenizer/__tests__/builder.test.js +399 -0
- package/lib/tokenizer/__tests__/controls.test.js +34 -0
- package/lib/tokenizer/__tests__/index.test.js +210 -0
- package/lib/tokenizer/__tests__/selection-utils.test.js +27 -0
- package/lib/tokenizer/__tests__/token-text.test.js +154 -0
- package/lib/tokenizer/builder.js +1 -1
- package/lib/tokenizer/controls.js +15 -1
- package/lib/tokenizer/index.js +1 -1
- package/lib/tokenizer/selection-utils.js +1 -1
- package/lib/tokenizer/token-text.js +12 -3
- package/lib/utils.js +1 -1
- package/package.json +7 -6
- package/src/__tests__/__snapshots__/text-select.test.jsx.snap +21 -0
- package/src/__tests__/text-select.test.jsx +34 -0
- package/src/__tests__/utils.test.jsx +27 -0
- package/src/index.js +2 -1
- package/src/token-select/__tests__/__snapshots__/index.test.jsx.snap +49 -0
- package/src/token-select/__tests__/__snapshots__/token.test.jsx.snap +31 -0
- package/src/token-select/__tests__/index.test.jsx +257 -0
- package/src/token-select/__tests__/token.test.jsx +33 -0
- package/src/token-select/index.jsx +3 -1
- package/src/token-select/token.jsx +11 -20
- package/src/tokenizer/__tests__/__snapshots__/controls.test.jsx.snap +59 -0
- package/src/tokenizer/__tests__/__snapshots__/index.test.jsx.snap +31 -0
- package/src/tokenizer/__tests__/__snapshots__/token-text.test.jsx.snap +17 -0
- package/src/tokenizer/__tests__/builder.test.js +256 -0
- package/src/tokenizer/__tests__/controls.test.jsx +25 -0
- package/src/tokenizer/__tests__/index.test.jsx +140 -0
- package/src/tokenizer/__tests__/selection-utils.test.js +26 -0
- package/src/tokenizer/__tests__/token-text.test.jsx +136 -0
- package/src/tokenizer/controls.jsx +20 -1
- package/src/tokenizer/token-text.jsx +9 -0
- package/README.md +0 -3
- package/lib/index.js.map +0 -1
- package/lib/legend.js.map +0 -1
- package/lib/text-select.js.map +0 -1
- package/lib/token-select/index.js.map +0 -1
- package/lib/token-select/token.js.map +0 -1
- package/lib/tokenizer/builder.js.map +0 -1
- package/lib/tokenizer/controls.js.map +0 -1
- package/lib/tokenizer/index.js.map +0 -1
- package/lib/tokenizer/selection-utils.js.map +0 -1
- package/lib/tokenizer/token-text.js.map +0 -1
- package/lib/utils.js.map +0 -1
|
@@ -51,10 +51,19 @@ var Text = (0, _styles.withStyles)(function () {
|
|
|
51
51
|
predefined: {
|
|
52
52
|
cursor: 'pointer',
|
|
53
53
|
backgroundColor: _yellow["default"][100],
|
|
54
|
-
border: "dashed 0px ".concat(_yellow["default"][700])
|
|
54
|
+
border: "dashed 0px ".concat(_yellow["default"][700]),
|
|
55
|
+
// we need this for nested tokenized elements like paragraphs, where p is inside span
|
|
56
|
+
'& *': {
|
|
57
|
+
cursor: 'pointer',
|
|
58
|
+
backgroundColor: _yellow["default"][100],
|
|
59
|
+
border: "dashed 0px ".concat(_yellow["default"][700])
|
|
60
|
+
}
|
|
55
61
|
},
|
|
56
62
|
correct: {
|
|
57
|
-
backgroundColor: _green["default"][500]
|
|
63
|
+
backgroundColor: _green["default"][500],
|
|
64
|
+
'& *': {
|
|
65
|
+
backgroundColor: _green["default"][500]
|
|
66
|
+
}
|
|
58
67
|
}
|
|
59
68
|
};
|
|
60
69
|
})(function (_ref) {
|
|
@@ -197,4 +206,4 @@ exports["default"] = TokenText;
|
|
|
197
206
|
onSelectToken: _propTypes["default"].func.isRequired,
|
|
198
207
|
className: _propTypes["default"].string
|
|
199
208
|
});
|
|
200
|
-
//# sourceMappingURL=token-text.js.map
|
|
209
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbml6ZXIvdG9rZW4tdGV4dC5qc3giXSwibmFtZXMiOlsibG9nIiwiVGV4dCIsInByZWRlZmluZWQiLCJjdXJzb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ5ZWxsb3ciLCJib3JkZXIiLCJjb3JyZWN0IiwiZ3JlZW4iLCJ0ZXh0IiwiY2xhc3NlcyIsIm9uQ2xpY2siLCJmb3JtYXR0ZWRUZXh0IiwicmVwbGFjZSIsImNsYXNzTmFtZSIsIl9faHRtbCIsIm5vdEFsbG93ZWRDaGFyYWN0ZXJzIiwiVG9rZW5UZXh0IiwiZXZlbnQiLCJwcm9wcyIsIm9uU2VsZWN0VG9rZW4iLCJ0b2tlbnMiLCJwcmV2ZW50RGVmYXVsdCIsIndpbmRvdyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInRleHRTZWxlY3RlZCIsInRvU3RyaW5nIiwibGVuZ3RoIiwiaW5kZXhPZiIsInJvb3QiLCJvZmZzZXQiLCJuZXdMaW5lT2Zmc2V0Iiwic2xpY2UiLCJ1bmRlZmluZWQiLCJlbmRJbmRleCIsImkiLCJzdGFydCIsImVuZCIsImhhc092ZXJsYXAiLCJ0b2tlbnNUb1JlbW92ZSIsInN1cnJvdW5kZWRUb2tlbnMiLCJ0b2tlbiIsIm9uVG9rZW5DbGljayIsIm5vcm1hbGl6ZWQiLCJyIiwibWFwIiwidCIsImluZGV4IiwiUmVhY3QiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJpc1JlcXVpcmVkIiwiYXJyYXkiLCJmdW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztBQUVBLElBQU1BLEdBQUcsR0FBRyx1QkFBTSxpQ0FBTixDQUFaO0FBRU8sSUFBTUMsSUFBSSxHQUFHLHdCQUFXO0FBQUEsU0FBTztBQUNwQ0MsSUFBQUEsVUFBVSxFQUFFO0FBQ1ZDLE1BQUFBLE1BQU0sRUFBRSxTQURFO0FBRVZDLE1BQUFBLGVB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RUE7QUFBWCxXQUFzQkQsQ0FBdEI7QUFBeUIsVUFBQSxPQUFPLEVBQUU7QUFBQSxtQkFBTUosWUFBWSxDQUFDSSxDQUFELENBQWxCO0FBQUE7QUFBbEMsV0FBUDtBQUNELE9BRkEsQ0FESCxDQURGO0FBT0Q7OztFQXRGb0NFLGtCQUFNQyxTOzs7aUNBQXhCakMsUyxlQUNBO0FBQ2pCUixFQUFBQSxJQUFJLEVBQUUwQyxzQkFBVUMsTUFBVixDQUFpQkMsVUFETjtBQUVqQmhDLEVBQUFBLE1BQU0sRUFBRThCLHNCQUFVRyxLQUFWLENBQWdCRCxVQUZQO0FBR2pCVixFQUFBQSxZQUFZLEVBQUVRLHNCQUFVSSxJQUFWLENBQWVGLFVBSFo7QUFJakJqQyxFQUFBQSxhQUFhLEVBQUUrQixzQkFBVUksSUFBVixDQUFlRixVQUpiO0FBS2pCdkMsRUFBQUEsU0FBUyxFQUFFcUMsc0JBQVVDO0FBTEosQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgeyBub3JtYWxpemUsIGludGVyc2VjdGlvbiB9IGZyb20gJy4vYnVpbGRlcic7XG5pbXBvcnQgeWVsbG93IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL2NvbG9ycy95ZWxsb3cnO1xuaW1wb3J0IGdyZWVuIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL2NvbG9ycy9ncmVlbic7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCB7IGNsZWFyU2VsZWN0aW9uLCBnZXRDYXJldENoYXJhY3Rlck9mZnNldFdpdGhpbiB9IGZyb20gJy4vc2VsZWN0aW9uLXV0aWxzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOnRleHQtc2VsZWN0OnRva2VuLXRleHQnKTtcblxuZXhwb3J0IGNvbnN0IFRleHQgPSB3aXRoU3R5bGVzKCgpID0+ICh7XG4gIHByZWRlZmluZWQ6IHtcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHllbGxvd1sxMDBdLFxuICAgIGJvcmRlcjogYGRhc2hlZCAwcHggJHt5ZWxsb3dbNzAwXX1gLFxuICAgIC8vIHdlIG5lZWQgdGhpcyBmb3IgbmVzdGVkIHRva2VuaXplZCBlbGVtZW50cyBsaWtlIHBhcmFncmFwaHMsIHdoZXJlIHAgaXMgaW5zaWRlIHNwYW5cbiAgICAnJiAqJzoge1xuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHllbGxvd1sxMDBdLFxuICAgICAgYm9yZGVyOiBgZGFzaGVkIDBweCAke3llbGxvd1s3MDBdfWAsXG4gICAgfSxcbiAgfSxcbiAgY29ycmVjdDoge1xuICAgIGJhY2tncm91bmRDb2xvcjogZ3JlZW5bNTAwXSxcbiAgICAnJiAqJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBncmVlbls1MDBdLFxuICAgIH0sXG4gIH0sXG59KSkoKHsgdGV4dCwgcHJlZGVmaW5lZCwgY2xhc3Nlcywgb25DbGljaywgY29ycmVjdCB9KSA9PiB7XG4gIGNvbnN0IGZvcm1hdHRlZFRleHQgPSAodGV4dCB8fCAnJykucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgaWYgKHByZWRlZmluZWQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVzKGNsYXNzZXMucHJlZGVmaW5lZCwgY29ycmVjdCAmJiBjbGFzc2VzLmNvcnJlY3QpO1xuXG4gICAgcmV0dXJuIDxzcGFuIG9uQ2xpY2s9e29uQ2xpY2t9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGZvcm1hdHRlZFRleHQgfX0gLz47XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDxzcGFuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogZm9ybWF0dGVkVGV4dCB9fSAvPjtcbiAgfVxufSk7XG5cbmNvbnN0IG5vdEFsbG93ZWRDaGFyYWN0ZXJzID0gWydcXG4nLCAnICcsICdcXHQnXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5UZXh0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICB0ZXh0OiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgdG9rZW5zOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBvblRva2VuQ2xpY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25TZWxlY3RUb2tlbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIH07XG5cbiAgLypcbiAgIENoYW5nZSB0aGlzIHRvIG9uQ2xpY2sgaW5zdGVhZCBvZiBtb3VzZVVwIGJlY2F1c2UgcHJldmlvdXNseSwgaW4gc29tZSBjYXNlc1xuICAgdGhlIG9uQ2xpY2sgZXZlbnQgZnJvbSB0aGUgPFRleHQgLz4gY29tcG9uZW50IHdhcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlIHVzZXJcbiAgIHNlbGVjdGVkIHRva2VuIGFuZCB0aGF0IHRva2VuIHdhcyB0aGVuIHJlbW92ZWQgYmVjYXVzZSB0aGUgc2V0Q29ycmVjdE1vZGUgd2FzIG5vdCB0cnVlLlxuXG4gICBjb25zdCB7IHNldENvcnJlY3RNb2RlIH0gPSB0aGlzLnN0YXRlO1xuXG4gICBpZiAoc2V0Q29ycmVjdE1vZGUpIHtcbiAgIHRoaXMuc2V0Q29ycmVjdCh0b2tlbik7XG4gICB9IGVsc2Uge1xuICAgdGhpcy5yZW1vdmVUb2tlbih0b2tlbik7XG4gICB9XG4gICAqL1xuICBvbkNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBvblNlbGVjdFRva2VuLCB0ZXh0LCB0b2tlbnMgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuXG4gICAgaWYgKHRleHRTZWxlY3RlZC5sZW5ndGggPiAwICYmIG5vdEFsbG93ZWRDaGFyYWN0ZXJzLmluZGV4T2YodGV4dFNlbGVjdGVkKSA8IDApIHtcbiAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgbGV0IG9mZnNldCA9IGdldENhcmV0Q2hhcmFjdGVyT2Zmc2V0V2l0aGluKHRoaXMucm9vdCk7XG4gICAgICAgIC8qXG4gICAgICAgICBTaW5jZSB3ZSBpbXBsZW1lbnRlZCBuZXcgbGluZSBmdW5jdGlvbmFsaXR5IChcXG4pIHVzaW5nIDxiciAvPiBkb20gZWxlbWVudHNcbiAgICAgICAgIGFuZCB3aW5kb3cuZ2V0U2VsZWN0aW9uIGlzIG5vdCB0YWtpbmcgdGhhdCBpbnRvIGNvbnNpZGVyYXRpb24sIHRoZSBvZmZzZXQgbWlnaHRcbiAgICAgICAgIGJlIG9mZiBieSBhIGZldyBjaGFyYWN0ZXJzLlxuXG4gICAgICAgICBUbyBjb21iYXQgdGhhdCwgd2UgY2hlY2sgaWYgdGhlIHNlbGVjdGVkIHRleHQgaXMgcmlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2Zmc2V0LlxuXG4gICAgICAgICBJZiBpdCdzIG5vdCwgd2UgYWRkIHRoZSBhZGRpdGlvbmFsIG9mZnNldCBpbiBvcmRlciBmb3IgdGhhdCB0byBiZSBhY2N1cmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgbmV3TGluZU9mZnNldCA9IHRleHQuc2xpY2Uob2Zmc2V0KS5pbmRleE9mKHRleHRTZWxlY3RlZCk7XG5cbiAgICAgICAgb2Zmc2V0ICs9IG5ld0xpbmVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBvZmZzZXQgKyB0ZXh0U2VsZWN0ZWQubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKGVuZEluZGV4IDw9IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gaW50ZXJzZWN0aW9uKHsgc3RhcnQ6IG9mZnNldCwgZW5kOiBlbmRJbmRleCB9LCB0b2tlbnMpO1xuICAgICAgICAgICAgaWYgKGkuaGFzT3ZlcmxhcCkge1xuICAgICAgICAgICAgICBsb2coJ2hhc092ZXJsYXAgIC0gZG8gbm90aGluZycpO1xuICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9rZW5zVG9SZW1vdmUgPSBpLnN1cnJvdW5kZWRUb2tlbnM7XG4gICAgICAgICAgICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHRleHRTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICBzdGFydDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgIGVuZDogZW5kSW5kZXgsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgb25TZWxlY3RUb2tlbih0b2tlbiwgdG9rZW5zVG9SZW1vdmUpO1xuICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyB0ZXh0LCB0b2tlbnMsIGNsYXNzTmFtZSwgb25Ub2tlbkNsaWNrIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemUodGV4dCwgdG9rZW5zKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSByZWY9eyhyKSA9PiAodGhpcy5yb290ID0gcil9IG9uQ2xpY2s9e3RoaXMub25DbGlja30+XG4gICAgICAgIHtub3JtYWxpemVkLm1hcCgodCwgaW5kZXgpID0+IHtcbiAgICAgICAgICByZXR1cm4gPFRleHQga2V5PXtpbmRleH0gey4uLnR9IG9uQ2xpY2s9eygpID0+IG9uVG9rZW5DbGljayh0KX0gLz47XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuIl19
|
package/lib/utils.js
CHANGED
|
@@ -64,4 +64,4 @@ var prepareText = function prepareText(text) {
|
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
exports.prepareText = prepareText;
|
|
67
|
-
//# sourceMappingURL=
|
|
67
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJjcmVhdGVFbGVtZW50RnJvbUhUTUwiLCJodG1sU3RyaW5nIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidHJpbSIsInBhcnNlQnJzIiwiZG9tIiwiYnJzIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJiciIsInJlcGxhY2VXaXRoIiwicmVwbGFjZSIsInBhcnNlUGFyYWdyYXBoIiwicGFyYWdyYXBoIiwiZW5kIiwicGFyc2VQYXJhZ3JhcGhzIiwicGFyYWdyYXBocyIsInN0ciIsInBhciIsImluZGV4IiwibGVuZ3RoIiwicHJlcGFyZVRleHQiLCJ0ZXh0IiwidHh0RG9tIiwiYWxsRG9tRWxlbWVudHMiLCJBcnJheSIsImZyb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFNQSxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLEdBQXFCO0FBQUEsTUFBcEJDLFVBQW9CLHVFQUFQLEVBQU87QUFDakQsTUFBTUMsR0FBRyxHQUFHQyxRQUFRLENBQUNDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBWjtBQUVBRixFQUFBQSxHQUFHLENBQUNHLFNBQUosR0FBZ0JKLFVBQVUsQ0FBQ0ssSUFBWCxFQUFoQjtBQUVBLFNBQU9KLEdBQVA7QUFDRCxDQU5EOztBQVFPLElBQU1LLFFBQVEsR0FBRyxTQUFYQSxRQUFXLENBQUNDLEdBQUQsRUFBUztBQUMvQixNQUFNQyxHQUFHLEdBQUdELEdBQUcsQ0FBQ0UsZ0JBQUosQ0FBcUIsSUFBckIsQ0FBWjtBQUVBRCxFQUFBQSxHQUFHLENBQUNFLE9BQUosQ0FBWSxVQUFDQyxFQUFEO0FBQUEsV0FBUUEsRUFBRSxDQUFDQyxXQUFILENBQWUsSUFBZixDQUFSO0FBQUEsR0FBWjtBQUVBTCxFQUFBQSxHQUFHLENBQUNILFNBQUosR0FBZ0JHLEdBQUcsQ0FBQ0gsU0FBSixDQUFjUyxPQUFkLENBQXNCLE9BQXRCLEVBQStCLElBQS9CLENBQWhCO0FBQ0QsQ0FOTTs7OztBQVFBLElBQU1DLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQ0MsU0FBRCxFQUFZQyxHQUFaLEVBQW9CO0FBQ2hELE1BQUlBLEdBQUosRUFBUztBQUNQLFdBQU9ELFNBQVMsQ0FBQ1gsU0FBakI7QUFDRDs7QUFFRCxtQkFBVVcsU0FBUyxDQUFDWCxTQUFwQjtBQUNELENBTk07Ozs7QUFRQSxJQUFNYSxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUNWLEdBQUQsRUFBUztBQUN0QyxNQUFNVyxVQUFVLEdBQUdYLEdBQUcsQ0FBQ0UsZ0JBQUosQ0FBcUIsR0FBckIsQ0FBbkIsQ0FEc0MsQ0FFdEM7O0FBQ0EsTUFBSVUsR0FBRyxHQUFHLEVBQVY7QUFFQUQsRUFBQUEsVUFBVSxDQUFDUixPQUFYLENBQW1CLFVBQUNVLEdBQUQsRUFBTUMsS0FBTixFQUFnQjtBQUNqQ0YsSUFBQUEsR0FBRyxJQUFJTCxjQUFjLENBQUNNLEdBQUQsRUFBTUMsS0FBSyxLQUFLSCxVQUFVLENBQUNJLE1BQVgsR0FBb0IsQ0FBcEMsQ0FBckI7QUFDRCxHQUZEO0FBSUEsU0FBT0gsR0FBRyxJQUFJLElBQWQ7QUFDRCxDQVZNOzs7O0FBWUEsSUFBTUksV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ0MsSUFBRCxFQUFVO0FBQ25DLE1BQUlDLE1BQU0sR0FBRzFCLHFCQUFxQixDQUFDeUIsSUFBRCxDQUFsQztBQUNBLE1BQU1FLGNBQWMsR0FBR0MsS0FBSyxDQUFDQyxJQUFOLENBQVdILE1BQU0sQ0FBQ2hCLGdCQUFQLENBQXdCLEdBQXhCLENBQVgsQ0FBdkI7O0FBRUEsTUFBSWdCLE1BQU0sQ0FBQ2hCLGdCQUFQLENBQXdCLEdBQXhCLEVBQTZCYSxNQUE3QixLQUF3QyxDQUE1QyxFQUErQztBQUM3QyxRQUFNckIsR0FBRyxHQUFHQyxRQUFRLENBQUNDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBWjtBQUVBRixJQUFBQSxHQUFHLENBQUNHLFNBQUosZ0JBQXNCcUIsTUFBTSxDQUFDckIsU0FBN0I7QUFDQXFCLElBQUFBLE1BQU0sR0FBR3hCLEdBQVQ7QUFDRCxHQVRrQyxDQVduQzs7O0FBQ0EsTUFBSXlCLGNBQWMsQ0FBQ0osTUFBZixLQUEwQixDQUE5QixFQUFpQztBQUMvQixXQUFPRSxJQUFQO0FBQ0Q7O0FBRURsQixFQUFBQSxRQUFRLENBQUNtQixNQUFELENBQVI7QUFFQSxTQUFPUixlQUFlLENBQUNRLE1BQUQsQ0FBdEI7QUFDRCxDQW5CTSIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNyZWF0ZUVsZW1lbnRGcm9tSFRNTCA9IChodG1sU3RyaW5nID0gJycpID0+IHtcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gIHJldHVybiBkaXY7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VCcnMgPSAoZG9tKSA9PiB7XG4gIGNvbnN0IGJycyA9IGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdicicpO1xuXG4gIGJycy5mb3JFYWNoKChicikgPT4gYnIucmVwbGFjZVdpdGgoJ1xcbicpKTtcblxuICBkb20uaW5uZXJIVE1MID0gZG9tLmlubmVySFRNTC5yZXBsYWNlKC9cXG5cXG4vZywgJ1xcbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlUGFyYWdyYXBoID0gKHBhcmFncmFwaCwgZW5kKSA9PiB7XG4gIGlmIChlbmQpIHtcbiAgICByZXR1cm4gcGFyYWdyYXBoLmlubmVySFRNTDtcbiAgfVxuXG4gIHJldHVybiBgJHtwYXJhZ3JhcGguaW5uZXJIVE1MfVxcblxcbmA7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VQYXJhZ3JhcGhzID0gKGRvbSkgPT4ge1xuICBjb25zdCBwYXJhZ3JhcGhzID0gZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ3AnKTtcbiAgLy8gc2VwYXJhdGUgdmFyaWFibGUgZm9yIGVhc2lseSBkZWJ1Z2dpbmcsIGlmIG5lZWRlZFxuICBsZXQgc3RyID0gJyc7XG5cbiAgcGFyYWdyYXBocy5mb3JFYWNoKChwYXIsIGluZGV4KSA9PiB7XG4gICAgc3RyICs9IHBhcnNlUGFyYWdyYXBoKHBhciwgaW5kZXggPT09IHBhcmFncmFwaHMubGVuZ3RoIC0gMSk7XG4gIH0pO1xuXG4gIHJldHVybiBzdHIgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlVGV4dCA9ICh0ZXh0KSA9PiB7XG4gIGxldCB0eHREb20gPSBjcmVhdGVFbGVtZW50RnJvbUhUTUwodGV4dCk7XG4gIGNvbnN0IGFsbERvbUVsZW1lbnRzID0gQXJyYXkuZnJvbSh0eHREb20ucXVlcnlTZWxlY3RvckFsbCgnKicpKTtcblxuICBpZiAodHh0RG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ3AnKS5sZW5ndGggPT09IDApIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgPHA+JHt0eHREb20uaW5uZXJIVE1MfTwvcD5gO1xuICAgIHR4dERvbSA9IGRpdjtcbiAgfVxuXG4gIC8vIGlmIG5vIGRvbSBlbGVtZW50cywgd2UganVzdCByZXR1cm4gdGhlIHRleHRcbiAgaWYgKGFsbERvbUVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcGFyc2VCcnModHh0RG9tKTtcblxuICByZXR1cm4gcGFyc2VQYXJhZ3JhcGhzKHR4dERvbSk7XG59O1xuIl19
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.14.0-beta.0",
|
|
7
7
|
"description": "Some react components for text selection",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"react",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"license": "ISC",
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@pie-framework/parse-english": "^1.0.0",
|
|
21
|
-
"@pie-lib/render-ui": "^4.
|
|
22
|
-
"@pie-lib/style-utils": "^0.
|
|
23
|
-
"@pie-lib/translator": "^2.
|
|
21
|
+
"@pie-lib/render-ui": "^4.17.0-beta.0",
|
|
22
|
+
"@pie-lib/style-utils": "^0.3.0-beta.0",
|
|
23
|
+
"@pie-lib/translator": "^2.5.0-beta.0",
|
|
24
24
|
"classnames": "^2.2.6",
|
|
25
25
|
"debug": "^4.1.1",
|
|
26
26
|
"invariant": "^2.2.4",
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@material-ui/core": "^3.8.3",
|
|
33
|
-
"@pie-
|
|
33
|
+
"@pie-framework/parse-english": "^1.0.0",
|
|
34
|
+
"@pie-lib/test-utils": "^0.4.0-beta.0",
|
|
34
35
|
"natural": "^0.6.3",
|
|
35
36
|
"react": "^16.8.1",
|
|
36
37
|
"react-dom": "^16.9.0"
|
|
@@ -39,6 +40,6 @@
|
|
|
39
40
|
"@material-ui/core": "^3.8.3",
|
|
40
41
|
"react": "^16.8.1"
|
|
41
42
|
},
|
|
42
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "3818c24530f62b5bb9be7a2c6aa5428f13a17e0a",
|
|
43
44
|
"scripts": {}
|
|
44
45
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`text-select snapshot renders 1`] = `
|
|
4
|
+
<WithStyles(TokenSelect)
|
|
5
|
+
maxNoOfSelections={4}
|
|
6
|
+
onChange={[Function]}
|
|
7
|
+
tokens={
|
|
8
|
+
Array [
|
|
9
|
+
Object {
|
|
10
|
+
"correct": undefined,
|
|
11
|
+
"end": 3,
|
|
12
|
+
"isMissing": undefined,
|
|
13
|
+
"selectable": undefined,
|
|
14
|
+
"selected": false,
|
|
15
|
+
"start": 0,
|
|
16
|
+
"text": "foo",
|
|
17
|
+
},
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
/>
|
|
21
|
+
`;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import TextSelect from '../text-select';
|
|
2
|
+
import { shallow } from 'enzyme';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import toJson from 'enzyme-to-json';
|
|
5
|
+
describe('text-select', () => {
|
|
6
|
+
describe('snapshot', () => {
|
|
7
|
+
it('renders', () => {
|
|
8
|
+
const w = shallow(
|
|
9
|
+
<TextSelect text="foo" tokens={[]} selectedTokens={[]} onChange={jest.fn()} maxNoOfSelections={4} />,
|
|
10
|
+
);
|
|
11
|
+
expect(w).toMatchSnapshot();
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('logic', () => {
|
|
16
|
+
let w, onChange;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
onChange = jest.fn();
|
|
19
|
+
w = shallow(<TextSelect text="foo" tokens={[]} selectedTokens={[]} onChange={onChange} />);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('change', () => {
|
|
23
|
+
it('calls onChange', () => {
|
|
24
|
+
const changeArgs = [
|
|
25
|
+
{ start: 0, end: 1, selected: true },
|
|
26
|
+
{ start: 1, end: 2 },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
w.instance().change(changeArgs);
|
|
30
|
+
expect(onChange).toBeCalledWith([{ start: 0, end: 1 }]);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { prepareText } from '../utils';
|
|
2
|
+
|
|
3
|
+
describe('logic', () => {
|
|
4
|
+
it('returns text if no html elements', () => {
|
|
5
|
+
const formattedText = prepareText(`foo bar`);
|
|
6
|
+
|
|
7
|
+
expect(formattedText).toEqual('foo bar');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('replaces br with new lines', () => {
|
|
11
|
+
const formattedText = prepareText(`<p>foo<br>bar</p>`);
|
|
12
|
+
|
|
13
|
+
expect(formattedText).toEqual('foo\nbar');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('replaces p with 2 new lines', () => {
|
|
17
|
+
const formattedText = prepareText(`<p>foo<br>bar</p><p>bar<br>foo</p>`);
|
|
18
|
+
|
|
19
|
+
expect(formattedText).toEqual('foo\nbar\n\nbar\nfoo');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('adds p if there are no paragraphs', () => {
|
|
23
|
+
const formattedText = prepareText(`foo<br>bar<br>foo`);
|
|
24
|
+
|
|
25
|
+
expect(formattedText).toEqual('foo\nbar\nfoo');
|
|
26
|
+
});
|
|
27
|
+
});
|
package/src/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Controls from './tokenizer/controls';
|
|
1
2
|
import Tokenizer from './tokenizer';
|
|
2
3
|
import TokenSelect, { TokenTypes } from './token-select';
|
|
3
4
|
import TextSelect from './text-select';
|
|
@@ -5,4 +6,4 @@ import { Legend } from './legend';
|
|
|
5
6
|
import Token from './token-select/token';
|
|
6
7
|
import { prepareText } from './utils';
|
|
7
8
|
|
|
8
|
-
export { TextSelect, TokenTypes, Tokenizer, TokenSelect, Token, prepareText, Legend };
|
|
9
|
+
export { Controls, TextSelect, TokenTypes, Tokenizer, TokenSelect, Token, prepareText, Legend };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`token-select snapshot renders 1`] = `
|
|
4
|
+
<div
|
|
5
|
+
className=""
|
|
6
|
+
dangerouslySetInnerHTML={
|
|
7
|
+
Object {
|
|
8
|
+
"__html": "<p><span class=\\"tokenRootClass Token-token-1 Token-selectable-5\\" data-indexkey=\\"0\\" data-reactroot=\\"\\">foo bar</span></p>",
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
onClick={[Function]}
|
|
12
|
+
/>
|
|
13
|
+
`;
|
|
14
|
+
|
|
15
|
+
exports[`token-select snapshot renders in view mode with selected tokens 1`] = `
|
|
16
|
+
<div
|
|
17
|
+
className=""
|
|
18
|
+
dangerouslySetInnerHTML={
|
|
19
|
+
Object {
|
|
20
|
+
"__html": "<p><span class=\\"Token-token-1 Token-selected-6 Token-disabledBlack-3\\" data-indexkey=\\"0\\" data-reactroot=\\"\\">foo,</span><br><span class=\\"Token-token-1 Token-selected-6 Token-disabledBlack-3\\" data-indexkey=\\"2\\" data-reactroot=\\"\\">bar</span></p>",
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
onClick={[Function]}
|
|
24
|
+
/>
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
exports[`token-select snapshot renders paragraphs properly 1`] = `
|
|
28
|
+
<div
|
|
29
|
+
className=""
|
|
30
|
+
dangerouslySetInnerHTML={
|
|
31
|
+
Object {
|
|
32
|
+
"__html": "<p><span class=\\"tokenRootClass Token-token-1 Token-selectable-5\\" data-indexkey=\\"0\\" data-reactroot=\\"\\">foo,</span></p><p><span class=\\"tokenRootClass Token-token-1 Token-selectable-5\\" data-indexkey=\\"2\\" data-reactroot=\\"\\">bar</span></p>",
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
onClick={[Function]}
|
|
36
|
+
/>
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
exports[`token-select snapshot renders sentences properly 1`] = `
|
|
40
|
+
<div
|
|
41
|
+
className=""
|
|
42
|
+
dangerouslySetInnerHTML={
|
|
43
|
+
Object {
|
|
44
|
+
"__html": "<p><span class=\\"tokenRootClass Token-token-1 Token-selectable-5\\" data-indexkey=\\"0\\" data-reactroot=\\"\\">foo,</span><br><span class=\\"tokenRootClass Token-token-1 Token-selectable-5\\" data-indexkey=\\"2\\" data-reactroot=\\"\\">bar</span></p>",
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
onClick={[Function]}
|
|
48
|
+
/>
|
|
49
|
+
`;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`token snapshot renders 1`] = `
|
|
4
|
+
<Wrapper
|
|
5
|
+
useWrapper={false}
|
|
6
|
+
>
|
|
7
|
+
<span
|
|
8
|
+
className="tokenRootClass token"
|
|
9
|
+
dangerouslySetInnerHTML={
|
|
10
|
+
Object {
|
|
11
|
+
"__html": "foo bar",
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/>
|
|
15
|
+
</Wrapper>
|
|
16
|
+
`;
|
|
17
|
+
|
|
18
|
+
exports[`token snapshot renders with brs 1`] = `
|
|
19
|
+
<Wrapper
|
|
20
|
+
useWrapper={false}
|
|
21
|
+
>
|
|
22
|
+
<span
|
|
23
|
+
className="tokenRootClass token"
|
|
24
|
+
dangerouslySetInnerHTML={
|
|
25
|
+
Object {
|
|
26
|
+
"__html": "foo <br>bar",
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/>
|
|
30
|
+
</Wrapper>
|
|
31
|
+
`;
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { TokenSelect } from '../index';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { shallow } from 'enzyme';
|
|
4
|
+
|
|
5
|
+
describe('token-select', () => {
|
|
6
|
+
describe('snapshot', () => {
|
|
7
|
+
it('renders', () => {
|
|
8
|
+
const w = shallow(
|
|
9
|
+
<TokenSelect
|
|
10
|
+
tokens={[
|
|
11
|
+
{
|
|
12
|
+
text: 'foo bar',
|
|
13
|
+
start: 0,
|
|
14
|
+
end: 7,
|
|
15
|
+
predefined: true,
|
|
16
|
+
selectable: true,
|
|
17
|
+
selected: false,
|
|
18
|
+
},
|
|
19
|
+
]}
|
|
20
|
+
classes={{}}
|
|
21
|
+
onChange={jest.fn()}
|
|
22
|
+
/>,
|
|
23
|
+
);
|
|
24
|
+
expect(w).toMatchSnapshot();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('renders sentences properly', () => {
|
|
28
|
+
const w = shallow(
|
|
29
|
+
<TokenSelect
|
|
30
|
+
tokens={[
|
|
31
|
+
{
|
|
32
|
+
text: 'foo,',
|
|
33
|
+
start: 0,
|
|
34
|
+
end: 4,
|
|
35
|
+
predefined: true,
|
|
36
|
+
selectable: true,
|
|
37
|
+
selected: false,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
text: '\n',
|
|
41
|
+
start: 4,
|
|
42
|
+
end: 5,
|
|
43
|
+
selected: false,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
text: 'bar',
|
|
47
|
+
start: 5,
|
|
48
|
+
end: 8,
|
|
49
|
+
predefined: true,
|
|
50
|
+
selectable: true,
|
|
51
|
+
selected: false,
|
|
52
|
+
},
|
|
53
|
+
]}
|
|
54
|
+
classes={{}}
|
|
55
|
+
onChange={jest.fn()}
|
|
56
|
+
/>,
|
|
57
|
+
);
|
|
58
|
+
expect(w).toMatchSnapshot();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('renders paragraphs properly', () => {
|
|
62
|
+
const w = shallow(
|
|
63
|
+
<TokenSelect
|
|
64
|
+
tokens={[
|
|
65
|
+
{
|
|
66
|
+
text: 'foo,',
|
|
67
|
+
start: 0,
|
|
68
|
+
end: 4,
|
|
69
|
+
predefined: true,
|
|
70
|
+
selectable: true,
|
|
71
|
+
selected: false,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
text: '\n\n',
|
|
75
|
+
start: 4,
|
|
76
|
+
end: 5,
|
|
77
|
+
selected: false,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
text: 'bar',
|
|
81
|
+
start: 5,
|
|
82
|
+
end: 8,
|
|
83
|
+
predefined: true,
|
|
84
|
+
selectable: true,
|
|
85
|
+
selected: false,
|
|
86
|
+
},
|
|
87
|
+
]}
|
|
88
|
+
classes={{}}
|
|
89
|
+
onChange={jest.fn()}
|
|
90
|
+
/>,
|
|
91
|
+
);
|
|
92
|
+
expect(w).toMatchSnapshot();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('renders in view mode with selected tokens', () => {
|
|
96
|
+
const w = shallow(
|
|
97
|
+
<TokenSelect
|
|
98
|
+
disabled
|
|
99
|
+
tokens={[
|
|
100
|
+
{
|
|
101
|
+
text: 'foo,',
|
|
102
|
+
start: 0,
|
|
103
|
+
end: 4,
|
|
104
|
+
predefined: true,
|
|
105
|
+
selectable: true,
|
|
106
|
+
selected: true,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
text: '\n',
|
|
110
|
+
start: 4,
|
|
111
|
+
end: 5,
|
|
112
|
+
selected: false,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
text: 'bar',
|
|
116
|
+
start: 5,
|
|
117
|
+
end: 8,
|
|
118
|
+
predefined: true,
|
|
119
|
+
selectable: true,
|
|
120
|
+
selected: true,
|
|
121
|
+
},
|
|
122
|
+
]}
|
|
123
|
+
classes={{}}
|
|
124
|
+
onChange={jest.fn()}
|
|
125
|
+
/>,
|
|
126
|
+
);
|
|
127
|
+
expect(w).toMatchSnapshot();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('logic', () => {
|
|
132
|
+
let w, onChange;
|
|
133
|
+
beforeEach(() => {
|
|
134
|
+
onChange = jest.fn();
|
|
135
|
+
w = shallow(
|
|
136
|
+
<TokenSelect
|
|
137
|
+
tokens={[
|
|
138
|
+
{
|
|
139
|
+
text: 'foo',
|
|
140
|
+
start: 0,
|
|
141
|
+
end: 3,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
text: 'bar',
|
|
145
|
+
start: 4,
|
|
146
|
+
end: 7,
|
|
147
|
+
},
|
|
148
|
+
]}
|
|
149
|
+
classes={{}}
|
|
150
|
+
onChange={onChange}
|
|
151
|
+
/>,
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
describe('selectedCount', () => {
|
|
155
|
+
it('returns the correct count', () => {
|
|
156
|
+
expect(w.instance().selectedCount()).toEqual(0);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('returns the correct count for 1 selected', () => {
|
|
160
|
+
w.setProps({ tokens: [{ selected: true }] });
|
|
161
|
+
expect(w.instance().selectedCount()).toEqual(1);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('canSelectMore', () => {
|
|
166
|
+
it('returns true for undefined max selections', () => {
|
|
167
|
+
w.setProps({ maxNoOfSelections: undefined });
|
|
168
|
+
expect(w.instance().canSelectMore(10)).toEqual(true);
|
|
169
|
+
});
|
|
170
|
+
it('returns true for 0 max selections', () => {
|
|
171
|
+
w.setProps({ maxNoOfSelections: 0 });
|
|
172
|
+
expect(w.instance().canSelectMore(10)).toEqual(true);
|
|
173
|
+
});
|
|
174
|
+
it('returns true for -1 max selections', () => {
|
|
175
|
+
w.setProps({ maxNoOfSelections: -1 });
|
|
176
|
+
expect(w.instance().canSelectMore(10)).toEqual(true);
|
|
177
|
+
});
|
|
178
|
+
it('returns true for 5 max selections and count 4', () => {
|
|
179
|
+
w.setProps({ maxNoOfSelections: 5 });
|
|
180
|
+
expect(w.instance().canSelectMore(4)).toEqual(true);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('returns true for 5 max selections and count 5', () => {
|
|
184
|
+
w.setProps({ maxNoOfSelections: 5 });
|
|
185
|
+
expect(w.instance().canSelectMore(5)).toEqual(false);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('returns false for 5 max selections and count 6', () => {
|
|
189
|
+
w.setProps({ maxNoOfSelections: 5 });
|
|
190
|
+
expect(w.instance().canSelectMore(6)).toEqual(false);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('returns true for 1 max selections and count 1', () => {
|
|
194
|
+
w.setProps({ maxNoOfSelections: 1 });
|
|
195
|
+
expect(w.instance().canSelectMore(1)).toEqual(true);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
describe('toggleToken', () => {
|
|
200
|
+
it('return if clicked target is not selectable', () => {
|
|
201
|
+
w.setProps({ maxNoOfSelections: 1, tokens: [{ selected: true }] });
|
|
202
|
+
|
|
203
|
+
const closest = jest.fn().mockReturnValue(null);
|
|
204
|
+
const mockedEvent = { target: { closest } };
|
|
205
|
+
|
|
206
|
+
w.instance().toggleToken(mockedEvent);
|
|
207
|
+
|
|
208
|
+
expect(onChange).not.toBeCalled();
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('calls onChange', () => {
|
|
212
|
+
w.setProps({ maxNoOfSelections: 0, tokens: [{ selected: true }] });
|
|
213
|
+
|
|
214
|
+
const closest = jest.fn().mockReturnValue({
|
|
215
|
+
dataset: {
|
|
216
|
+
indexkey: '0',
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
const mockedEvent = { target: { closest } };
|
|
220
|
+
|
|
221
|
+
w.instance().toggleToken(mockedEvent);
|
|
222
|
+
|
|
223
|
+
expect(onChange).toBeCalled();
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('returns if max tokens have been selected', () => {
|
|
227
|
+
w.setProps({ maxNoOfSelections: 0, tokens: [{ selected: true }] });
|
|
228
|
+
|
|
229
|
+
const closest = jest.fn().mockReturnValue({
|
|
230
|
+
dataset: {
|
|
231
|
+
indexkey: '0',
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
const mockedEvent = { target: { closest } };
|
|
235
|
+
|
|
236
|
+
w.instance().toggleToken(mockedEvent);
|
|
237
|
+
|
|
238
|
+
expect(onChange).not.toBeCalledWith([{ selected: true }]);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('calls onChange if maxNoOfSelections is 1 and selectedCount is 1', () => {
|
|
242
|
+
w.setProps({ maxNoOfSelections: 1, tokens: [{ selected: true }] });
|
|
243
|
+
|
|
244
|
+
const closest = jest.fn().mockReturnValue({
|
|
245
|
+
dataset: {
|
|
246
|
+
indexkey: '0',
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
const mockedEvent = { target: { closest } };
|
|
250
|
+
|
|
251
|
+
w.instance().toggleToken(mockedEvent);
|
|
252
|
+
|
|
253
|
+
expect(onChange).toBeCalled();
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Token } from '../token';
|
|
2
|
+
import { shallow } from 'enzyme';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
describe('token', () => {
|
|
6
|
+
describe('snapshot', () => {
|
|
7
|
+
it('renders', () => {
|
|
8
|
+
const w = shallow(
|
|
9
|
+
<Token
|
|
10
|
+
classes={{
|
|
11
|
+
token: 'token',
|
|
12
|
+
selectable: 'selectable',
|
|
13
|
+
}}
|
|
14
|
+
text={'foo bar'}
|
|
15
|
+
/>,
|
|
16
|
+
);
|
|
17
|
+
expect(w).toMatchSnapshot();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders with brs', () => {
|
|
21
|
+
const w = shallow(
|
|
22
|
+
<Token
|
|
23
|
+
classes={{
|
|
24
|
+
token: 'token',
|
|
25
|
+
selectable: 'selectable',
|
|
26
|
+
}}
|
|
27
|
+
text={'foo \nbar'}
|
|
28
|
+
/>,
|
|
29
|
+
);
|
|
30
|
+
expect(w).toMatchSnapshot();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -58,7 +58,9 @@ export class TokenSelect extends React.Component {
|
|
|
58
58
|
const targetedTokenIndex = targetSpanWrapper && targetSpanWrapper.dataset && targetSpanWrapper.dataset.indexkey;
|
|
59
59
|
const t = targetedTokenIndex && tokensCloned[targetedTokenIndex];
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
// don't toggle if we are in print mode, token correctness is defined or if it's missing
|
|
62
|
+
// (missing means that it was evaluated as correct and not selected)
|
|
63
|
+
if (t && t.correct === undefined && !animationsDisabled && !t.isMissing) {
|
|
62
64
|
const { onChange, maxNoOfSelections } = this.props;
|
|
63
65
|
const selected = !t.selected;
|
|
64
66
|
|
|
@@ -115,10 +115,6 @@ export default withStyles((theme) => {
|
|
|
115
115
|
token: {
|
|
116
116
|
cursor: 'pointer',
|
|
117
117
|
textIndent: 0,
|
|
118
|
-
padding: theme.spacing.unit / 2,
|
|
119
|
-
paddingRight: 0,
|
|
120
|
-
paddingLeft: 0,
|
|
121
|
-
transition: 'background-color 100ms ease-in',
|
|
122
118
|
},
|
|
123
119
|
disabled: {
|
|
124
120
|
cursor: 'inherit',
|
|
@@ -134,6 +130,7 @@ export default withStyles((theme) => {
|
|
|
134
130
|
[theme.breakpoints.up(769)]: {
|
|
135
131
|
'&:hover': {
|
|
136
132
|
backgroundColor: color.primaryLight(),
|
|
133
|
+
color: theme.palette.common.black,
|
|
137
134
|
'& > *': {
|
|
138
135
|
backgroundColor: color.primaryLight(),
|
|
139
136
|
},
|
|
@@ -141,47 +138,42 @@ export default withStyles((theme) => {
|
|
|
141
138
|
},
|
|
142
139
|
},
|
|
143
140
|
selected: {
|
|
144
|
-
lineHeight: 2,
|
|
145
|
-
marginTop: theme.spacing.unit / 2,
|
|
146
141
|
backgroundColor: color.primaryLight(),
|
|
142
|
+
color: theme.palette.common.black,
|
|
143
|
+
lineHeight: `${theme.spacing.unit * 3}px`,
|
|
147
144
|
'& > *': {
|
|
148
145
|
backgroundColor: color.primaryLight(),
|
|
149
146
|
},
|
|
150
147
|
},
|
|
151
148
|
highlight: {
|
|
152
149
|
border: `dashed 2px ${color.disabled()}`,
|
|
153
|
-
lineHeight:
|
|
154
|
-
boxSizing: 'border-box',
|
|
155
|
-
marginTop: theme.spacing.unit / 2,
|
|
156
|
-
display: 'inline-block',
|
|
157
|
-
padding: theme.spacing.unit,
|
|
150
|
+
lineHeight: `${theme.spacing.unit * 3}px`,
|
|
158
151
|
},
|
|
159
152
|
print: {
|
|
160
153
|
border: `dashed 2px ${color.disabled()}`,
|
|
161
|
-
lineHeight:
|
|
162
|
-
boxSizing: 'border-box',
|
|
163
|
-
marginTop: theme.spacing.unit / 2,
|
|
164
|
-
display: 'inline-block',
|
|
165
|
-
padding: theme.spacing.unit,
|
|
154
|
+
lineHeight: `${theme.spacing.unit * 3}px`,
|
|
166
155
|
color: color.text(),
|
|
167
156
|
},
|
|
168
|
-
|
|
169
157
|
custom: {
|
|
170
158
|
display: 'initial',
|
|
171
159
|
},
|
|
172
160
|
correct: {
|
|
173
161
|
backgroundColor: color.correctSecondary(),
|
|
174
162
|
border: `${color.correct()} solid 2px`,
|
|
175
|
-
|
|
163
|
+
color: theme.palette.common.black,
|
|
164
|
+
lineHeight: `${theme.spacing.unit * 3}px`,
|
|
176
165
|
},
|
|
177
166
|
incorrect: {
|
|
178
167
|
backgroundColor: color.incorrectSecondary(),
|
|
179
168
|
border: `${color.missing()} solid 2px`,
|
|
180
|
-
|
|
169
|
+
color: theme.palette.common.black,
|
|
170
|
+
lineHeight: `${theme.spacing.unit * 3}px`,
|
|
181
171
|
},
|
|
182
172
|
missing: {
|
|
183
173
|
backgroundColor: color.incorrectSecondary(),
|
|
184
174
|
border: `${color.missing()} dashed 2px`,
|
|
175
|
+
color: theme.palette.common.black,
|
|
176
|
+
lineHeight: `${theme.spacing.unit * 3}px`,
|
|
185
177
|
textDecoration: `line-through ${color.missing()}`,
|
|
186
178
|
},
|
|
187
179
|
incorrectIcon: {
|
|
@@ -189,7 +181,6 @@ export default withStyles((theme) => {
|
|
|
189
181
|
fontSize: 'larger',
|
|
190
182
|
color: color.missing(),
|
|
191
183
|
},
|
|
192
|
-
|
|
193
184
|
correctIcon: {
|
|
194
185
|
verticalAlign: 'middle',
|
|
195
186
|
fontSize: 'larger',
|