@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.
Files changed (55) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/NEXT.CHANGELOG.json +1 -0
  3. package/lib/__tests__/text-select.test.js +56 -0
  4. package/lib/__tests__/utils.test.js +23 -0
  5. package/lib/index.js +9 -1
  6. package/lib/legend.js +1 -1
  7. package/lib/text-select.js +1 -1
  8. package/lib/token-select/__tests__/index.test.js +268 -0
  9. package/lib/token-select/__tests__/token.test.js +35 -0
  10. package/lib/token-select/index.js +4 -3
  11. package/lib/token-select/token.js +13 -20
  12. package/lib/tokenizer/__tests__/builder.test.js +399 -0
  13. package/lib/tokenizer/__tests__/controls.test.js +34 -0
  14. package/lib/tokenizer/__tests__/index.test.js +210 -0
  15. package/lib/tokenizer/__tests__/selection-utils.test.js +27 -0
  16. package/lib/tokenizer/__tests__/token-text.test.js +154 -0
  17. package/lib/tokenizer/builder.js +1 -1
  18. package/lib/tokenizer/controls.js +15 -1
  19. package/lib/tokenizer/index.js +1 -1
  20. package/lib/tokenizer/selection-utils.js +1 -1
  21. package/lib/tokenizer/token-text.js +12 -3
  22. package/lib/utils.js +1 -1
  23. package/package.json +7 -6
  24. package/src/__tests__/__snapshots__/text-select.test.jsx.snap +21 -0
  25. package/src/__tests__/text-select.test.jsx +34 -0
  26. package/src/__tests__/utils.test.jsx +27 -0
  27. package/src/index.js +2 -1
  28. package/src/token-select/__tests__/__snapshots__/index.test.jsx.snap +49 -0
  29. package/src/token-select/__tests__/__snapshots__/token.test.jsx.snap +31 -0
  30. package/src/token-select/__tests__/index.test.jsx +257 -0
  31. package/src/token-select/__tests__/token.test.jsx +33 -0
  32. package/src/token-select/index.jsx +3 -1
  33. package/src/token-select/token.jsx +11 -20
  34. package/src/tokenizer/__tests__/__snapshots__/controls.test.jsx.snap +59 -0
  35. package/src/tokenizer/__tests__/__snapshots__/index.test.jsx.snap +31 -0
  36. package/src/tokenizer/__tests__/__snapshots__/token-text.test.jsx.snap +17 -0
  37. package/src/tokenizer/__tests__/builder.test.js +256 -0
  38. package/src/tokenizer/__tests__/controls.test.jsx +25 -0
  39. package/src/tokenizer/__tests__/index.test.jsx +140 -0
  40. package/src/tokenizer/__tests__/selection-utils.test.js +26 -0
  41. package/src/tokenizer/__tests__/token-text.test.jsx +136 -0
  42. package/src/tokenizer/controls.jsx +20 -1
  43. package/src/tokenizer/token-text.jsx +9 -0
  44. package/README.md +0 -3
  45. package/lib/index.js.map +0 -1
  46. package/lib/legend.js.map +0 -1
  47. package/lib/text-select.js.map +0 -1
  48. package/lib/token-select/index.js.map +0 -1
  49. package/lib/token-select/token.js.map +0 -1
  50. package/lib/tokenizer/builder.js.map +0 -1
  51. package/lib/tokenizer/controls.js.map +0 -1
  52. package/lib/tokenizer/index.js.map +0 -1
  53. package/lib/tokenizer/selection-utils.js.map +0 -1
  54. package/lib/tokenizer/token-text.js.map +0 -1
  55. 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=utils.js.map
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.12.8-next.1+23991a09",
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.15.10-next.1+23991a09",
22
- "@pie-lib/style-utils": "^0.1.43",
23
- "@pie-lib/translator": "^2.3.0",
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-lib/test-utils": "^0.2.33",
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": "23991a09b77492c24dcb5235049667cdcc211d80",
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
- if (t && t.correct === undefined && !animationsDisabled) {
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: 2,
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: 2,
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
- lineHeight: `${theme.spacing.unit * 4}px`,
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
- lineHeight: `${theme.spacing.unit * 4}px`,
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',