@pie-lib/text-select 1.13.0-beta.2 → 1.13.0-beta.3

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 CHANGED
@@ -3,6 +3,30 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.13.0-beta.3](https://github.com/pie-framework/pie-lib/compare/@pie-lib/text-select@1.12.7...@pie-lib/text-select@1.13.0-beta.3) (2025-07-20)
7
+
8
+ **Note:** Version bump only for package @pie-lib/text-select
9
+
10
+
11
+
12
+
13
+
14
+ # [1.13.0-beta.2](https://github.com/pie-framework/pie-lib/compare/@pie-lib/text-select@1.12.7...@pie-lib/text-select@1.13.0-beta.2) (2025-07-20)
15
+
16
+ **Note:** Version bump only for package @pie-lib/text-select
17
+
18
+
19
+
20
+
21
+
22
+ # [1.13.0-beta.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/text-select@1.12.7...@pie-lib/text-select@1.13.0-beta.1) (2025-07-20)
23
+
24
+ **Note:** Version bump only for package @pie-lib/text-select
25
+
26
+
27
+
28
+
29
+
6
30
  # [1.13.0-beta.2](https://github.com/pie-framework/pie-lib/compare/@pie-lib/text-select@1.12.7...@pie-lib/text-select@1.13.0-beta.2) (2025-07-20)
7
31
 
8
32
  **Note:** Version bump only for package @pie-lib/text-select
package/lib/index.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ Object.defineProperty(exports, "Controls", {
11
+ enumerable: true,
12
+ get: function get() {
13
+ return _controls["default"];
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "Legend", {
17
+ enumerable: true,
18
+ get: function get() {
19
+ return _legend.Legend;
20
+ }
21
+ });
22
+ Object.defineProperty(exports, "TextSelect", {
23
+ enumerable: true,
24
+ get: function get() {
25
+ return _textSelect["default"];
26
+ }
27
+ });
28
+ Object.defineProperty(exports, "Token", {
29
+ enumerable: true,
30
+ get: function get() {
31
+ return _token["default"];
32
+ }
33
+ });
34
+ Object.defineProperty(exports, "TokenSelect", {
35
+ enumerable: true,
36
+ get: function get() {
37
+ return _tokenSelect["default"];
38
+ }
39
+ });
40
+ Object.defineProperty(exports, "TokenTypes", {
41
+ enumerable: true,
42
+ get: function get() {
43
+ return _tokenSelect.TokenTypes;
44
+ }
45
+ });
46
+ Object.defineProperty(exports, "Tokenizer", {
47
+ enumerable: true,
48
+ get: function get() {
49
+ return _tokenizer["default"];
50
+ }
51
+ });
52
+ Object.defineProperty(exports, "prepareText", {
53
+ enumerable: true,
54
+ get: function get() {
55
+ return _utils.prepareText;
56
+ }
57
+ });
58
+
59
+ var _controls = _interopRequireDefault(require("./tokenizer/controls"));
60
+
61
+ var _tokenizer = _interopRequireDefault(require("./tokenizer"));
62
+
63
+ var _tokenSelect = _interopRequireWildcard(require("./token-select"));
64
+
65
+ var _textSelect = _interopRequireDefault(require("./text-select"));
66
+
67
+ var _legend = require("./legend");
68
+
69
+ var _token = _interopRequireDefault(require("./token-select/token"));
70
+
71
+ var _utils = require("./utils");
72
+
73
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
74
+
75
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA","sourcesContent":["import Controls from './tokenizer/controls';\nimport Tokenizer from './tokenizer';\nimport TokenSelect, { TokenTypes } from './token-select';\nimport TextSelect from './text-select';\nimport { Legend } from './legend';\nimport Token from './token-select/token';\nimport { prepareText } from './utils';\n\nexport { Controls, TextSelect, TokenTypes, Tokenizer, TokenSelect, Token, prepareText, Legend };\n"],"file":"index.js"}
package/lib/legend.js ADDED
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.Legend = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _styles = require("@material-ui/core/styles");
13
+
14
+ var _Check = _interopRequireDefault(require("@material-ui/icons/Check"));
15
+
16
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
17
+
18
+ var _Remove = _interopRequireDefault(require("@material-ui/icons/Remove"));
19
+
20
+ var _renderUi = require("@pie-lib/render-ui");
21
+
22
+ var _translator = _interopRequireDefault(require("@pie-lib/translator"));
23
+
24
+ var translator = _translator["default"].translator;
25
+ var Legend = (0, _styles.withStyles)(function (theme) {
26
+ return {
27
+ flexContainer: {
28
+ display: 'flex',
29
+ flexDirection: 'row',
30
+ gap: "".concat(2 * theme.spacing.unit, "px"),
31
+ borderBottom: '1px solid lightgrey',
32
+ borderTop: '1px solid lightgrey',
33
+ paddingBottom: theme.spacing.unit,
34
+ paddingTop: theme.spacing.unit,
35
+ marginBottom: theme.spacing.unit
36
+ },
37
+ container: {
38
+ display: 'flex',
39
+ flexDirection: 'row',
40
+ gap: "".concat(theme.spacing.unit / 2, "px"),
41
+ alignItems: 'center'
42
+ },
43
+ correct: {
44
+ fontSize: 'larger',
45
+ color: _renderUi.color.correct(),
46
+ backgroundColor: _renderUi.color.correctSecondary(),
47
+ border: "2px solid ".concat(_renderUi.color.correct())
48
+ },
49
+ incorrect: {
50
+ fontSize: 'larger',
51
+ color: _renderUi.color.missing(),
52
+ backgroundColor: _renderUi.color.incorrectSecondary(),
53
+ border: "2px solid ".concat(_renderUi.color.missing())
54
+ },
55
+ missing: {
56
+ fontSize: 'larger',
57
+ color: _renderUi.color.missing(),
58
+ backgroundColor: _renderUi.color.incorrectSecondary(),
59
+ border: "2px dashed ".concat(_renderUi.color.missing())
60
+ }
61
+ };
62
+ })(function (_ref) {
63
+ var classes = _ref.classes,
64
+ language = _ref.language;
65
+ var icons = [{
66
+ iconName: _Check["default"],
67
+ label: translator.t('selectText.correctAnswerSelected', {
68
+ lng: language
69
+ }),
70
+ className: classes.correct
71
+ }, {
72
+ iconName: _Remove["default"],
73
+ label: translator.t('selectText.correctAnswerNotSelected', {
74
+ lng: language
75
+ }),
76
+ className: classes.missing
77
+ }, {
78
+ iconName: _Close["default"],
79
+ label: translator.t('selectText.incorrectSelection', {
80
+ lng: language
81
+ }),
82
+ className: classes.incorrect
83
+ }];
84
+ return /*#__PURE__*/_react["default"].createElement("div", {
85
+ className: classes.flexContainer
86
+ }, icons.map(function (icon, index) {
87
+ var Icon = icon.iconName;
88
+ return /*#__PURE__*/_react["default"].createElement("div", {
89
+ key: index,
90
+ className: classes.container
91
+ }, /*#__PURE__*/_react["default"].createElement(Icon, {
92
+ className: icon.className,
93
+ width: '19px',
94
+ height: '19px'
95
+ }), /*#__PURE__*/_react["default"].createElement("span", null, icon.label));
96
+ }));
97
+ });
98
+ exports.Legend = Legend;
99
+ //# sourceMappingURL=legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/legend.js"],"names":["translator","Translator","Legend","theme","flexContainer","display","flexDirection","gap","spacing","unit","borderBottom","borderTop","paddingBottom","paddingTop","marginBottom","container","alignItems","correct","fontSize","color","backgroundColor","correctSecondary","border","incorrect","missing","incorrectSecondary","classes","language","icons","iconName","Check","label","t","lng","className","Remove","Close","map","icon","index","Icon"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA,IAAQA,UAAR,GAAuBC,sBAAvB,CAAQD,UAAR;AAEO,IAAME,MAAM,GAAG,wBAAW,UAACC,KAAD;AAAA,SAAY;AAC3CC,IAAAA,aAAa,EAAE;AACbC,MAAAA,OAAO,EAAE,MADI;AAEbC,MAAAA,aAAa,EAAE,KAFF;AAGbC,MAAAA,GAAG,YAAK,IAAIJ,KAAK,CAACK,OAAN,CAAcC,IAAvB,OAHU;AAIbC,MAAAA,YAAY,EAAE,qBAJD;AAKbC,MAAAA,SAAS,EAAE,qBALE;AAMbC,MAAAA,aAAa,EAAET,KAAK,CAACK,OAAN,CAAcC,IANhB;AAObI,MAAAA,UAAU,EAAEV,KAAK,CAACK,OAAN,CAAcC,IAPb;AAQbK,MAAAA,YAAY,EAAEX,KAAK,CAACK,OAAN,CAAcC;AARf,KAD4B;AAW3CM,IAAAA,SAAS,EAAE;AACTV,MAAAA,OAAO,EAAE,MADA;AAETC,MAAAA,aAAa,EAAE,KAFN;AAGTC,MAAAA,GAAG,YAAKJ,KAAK,CAACK,OAAN,CAAcC,IAAd,GAAqB,CAA1B,OAHM;AAITO,MAAAA,UAAU,EAAE;AAJH,KAXgC;AAiB3CC,IAAAA,OAAO,EAAE;AACPC,MAAAA,QAAQ,EAAE,QADH;AAEPC,MAAAA,KAAK,EAAEA,gBAAMF,OAAN,EAFA;AAGPG,MAAAA,eAAe,EAAED,gBAAME,gBAAN,EAHV;AAIPC,MAAAA,MAAM,sBAAeH,gBAAMF,OAAN,EAAf;AAJC,KAjBkC;AAuB3CM,IAAAA,SAAS,EAAE;AACTL,MAAAA,QAAQ,EAAE,QADD;AAETC,MAAAA,KAAK,EAAEA,gBAAMK,OAAN,EAFE;AAGTJ,MAAAA,eAAe,EAAED,gBAAMM,kBAAN,EAHR;AAITH,MAAAA,MAAM,sBAAeH,gBAAMK,OAAN,EAAf;AAJG,KAvBgC;AA6B3CA,IAAAA,OAAO,EAAE;AACPN,MAAAA,QAAQ,EAAE,QADH;AAEPC,MAAAA,KAAK,EAAEA,gBAAMK,OAAN,EAFA;AAGPJ,MAAAA,eAAe,EAAED,gBAAMM,kBAAN,EAHV;AAIPH,MAAAA,MAAM,uBAAgBH,gBAAMK,OAAN,EAAhB;AAJC;AA7BkC,GAAZ;AAAA,CAAX,EAmClB,gBAA2B;AAAA,MAAxBE,OAAwB,QAAxBA,OAAwB;AAAA,MAAfC,QAAe,QAAfA,QAAe;AAC7B,MAAMC,KAAK,GAAG,CACZ;AACEC,IAAAA,QAAQ,EAAEC,iBADZ;AAEEC,IAAAA,KAAK,EAAE/B,UAAU,CAACgC,CAAX,CAAa,kCAAb,EAAiD;AAAEC,MAAAA,GAAG,EAAEN;AAAP,KAAjD,CAFT;AAGEO,IAAAA,SAAS,EAAER,OAAO,CAACT;AAHrB,GADY,EAMZ;AACEY,IAAAA,QAAQ,EAAEM,kBADZ;AAEEJ,IAAAA,KAAK,EAAE/B,UAAU,CAACgC,CAAX,CAAa,qCAAb,EAAoD;AAAEC,MAAAA,GAAG,EAAEN;AAAP,KAApD,CAFT;AAGEO,IAAAA,SAAS,EAAER,OAAO,CAACF;AAHrB,GANY,EAWZ;AACEK,IAAAA,QAAQ,EAAEO,iBADZ;AAEEL,IAAAA,KAAK,EAAE/B,UAAU,CAACgC,CAAX,CAAa,+BAAb,EAA8C;AAAEC,MAAAA,GAAG,EAAEN;AAAP,KAA9C,CAFT;AAGEO,IAAAA,SAAS,EAAER,OAAO,CAACH;AAHrB,GAXY,CAAd;AAkBA,sBACE;AAAK,IAAA,SAAS,EAAEG,OAAO,CAACtB;AAAxB,KACGwB,KAAK,CAACS,GAAN,CAAU,UAACC,IAAD,EAAOC,KAAP,EAAiB;AAC1B,QAAMC,IAAI,GAAGF,IAAI,CAACT,QAAlB;AACA,wBACE;AAAK,MAAA,GAAG,EAAEU,KAAV;AAAiB,MAAA,SAAS,EAAEb,OAAO,CAACX;AAApC,oBACE,gCAAC,IAAD;AAAM,MAAA,SAAS,EAAEuB,IAAI,CAACJ,SAAtB;AAAiC,MAAA,KAAK,EAAE,MAAxC;AAAgD,MAAA,MAAM,EAAE;AAAxD,MADF,eAEE,8CAAOI,IAAI,CAACP,KAAZ,CAFF,CADF;AAMD,GARA,CADH,CADF;AAaD,CAnEqB,CAAf","sourcesContent":["import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport Check from '@material-ui/icons/Check';\nimport Close from '@material-ui/icons/Close';\nimport Remove from '@material-ui/icons/Remove';\nimport { color } from '@pie-lib/render-ui';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nexport const Legend = withStyles((theme) => ({\n flexContainer: {\n display: 'flex',\n flexDirection: 'row',\n gap: `${2 * theme.spacing.unit}px`,\n borderBottom: '1px solid lightgrey',\n borderTop: '1px solid lightgrey',\n paddingBottom: theme.spacing.unit,\n paddingTop: theme.spacing.unit,\n marginBottom: theme.spacing.unit,\n },\n container: {\n display: 'flex',\n flexDirection: 'row',\n gap: `${theme.spacing.unit / 2}px`,\n alignItems: 'center',\n },\n correct: {\n fontSize: 'larger',\n color: color.correct(),\n backgroundColor: color.correctSecondary(),\n border: `2px solid ${color.correct()}`,\n },\n incorrect: {\n fontSize: 'larger',\n color: color.missing(),\n backgroundColor: color.incorrectSecondary(),\n border: `2px solid ${color.missing()}`,\n },\n missing: {\n fontSize: 'larger',\n color: color.missing(),\n backgroundColor: color.incorrectSecondary(),\n border: `2px dashed ${color.missing()}`,\n },\n}))(({ classes, language }) => {\n const icons = [\n {\n iconName: Check,\n label: translator.t('selectText.correctAnswerSelected', { lng: language }),\n className: classes.correct,\n },\n {\n iconName: Remove,\n label: translator.t('selectText.correctAnswerNotSelected', { lng: language }),\n className: classes.missing,\n },\n {\n iconName: Close,\n label: translator.t('selectText.incorrectSelection', { lng: language }),\n className: classes.incorrect,\n },\n ];\n\n return (\n <div className={classes.flexContainer}>\n {icons.map((icon, index) => {\n const Icon = icon.iconName;\n return (\n <div key={index} className={classes.container}>\n <Icon className={icon.className} width={'19px'} height={'19px'}></Icon>\n <span>{icon.label}</span>\n </div>\n );\n })}\n </div>\n );\n});\n"],"file":"legend.js"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+
14
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
+
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
+
18
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
+
20
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
+
22
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
+
24
+ var _react = _interopRequireDefault(require("react"));
25
+
26
+ var _propTypes = _interopRequireDefault(require("prop-types"));
27
+
28
+ var _tokenSelect = _interopRequireDefault(require("./token-select"));
29
+
30
+ var _builder = require("./tokenizer/builder");
31
+
32
+ var _token = require("./token-select/token");
33
+
34
+ var _debug = _interopRequireDefault(require("debug"));
35
+
36
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
+
38
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
39
+
40
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
41
+
42
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
43
+
44
+ var log = (0, _debug["default"])('@pie-lib:text-select');
45
+ /**
46
+ * Built on TokenSelect uses build.normalize to build the token set.
47
+ */
48
+
49
+ var TextSelect = /*#__PURE__*/function (_React$Component) {
50
+ (0, _inherits2["default"])(TextSelect, _React$Component);
51
+
52
+ var _super = _createSuper(TextSelect);
53
+
54
+ function TextSelect() {
55
+ var _this;
56
+
57
+ (0, _classCallCheck2["default"])(this, TextSelect);
58
+
59
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
60
+ args[_key] = arguments[_key];
61
+ }
62
+
63
+ _this = _super.call.apply(_super, [this].concat(args));
64
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "change", function (tokens) {
65
+ var onChange = _this.props.onChange;
66
+
67
+ if (!onChange) {
68
+ return;
69
+ }
70
+
71
+ var out = tokens.filter(function (t) {
72
+ return t.selected;
73
+ }).map(function (t) {
74
+ return {
75
+ start: t.start,
76
+ end: t.end
77
+ };
78
+ });
79
+ onChange(out);
80
+ });
81
+ return _this;
82
+ }
83
+
84
+ (0, _createClass2["default"])(TextSelect, [{
85
+ key: "render",
86
+ value: function render() {
87
+ var _this$props = this.props,
88
+ text = _this$props.text,
89
+ disabled = _this$props.disabled,
90
+ tokens = _this$props.tokens,
91
+ selectedTokens = _this$props.selectedTokens,
92
+ className = _this$props.className,
93
+ highlightChoices = _this$props.highlightChoices,
94
+ maxNoOfSelections = _this$props.maxNoOfSelections,
95
+ animationsDisabled = _this$props.animationsDisabled;
96
+ var normalized = (0, _builder.normalize)(text, tokens);
97
+ log('normalized: ', normalized);
98
+ var prepped = normalized.map(function (t) {
99
+ var selectedIndex = selectedTokens.findIndex(function (s) {
100
+ return s.start === t.start && s.end === t.end;
101
+ });
102
+ var selected = selectedIndex !== -1;
103
+ var correct = selected ? t.correct : undefined;
104
+ var isMissing = t.isMissing;
105
+ return _objectSpread(_objectSpread({}, t), {}, {
106
+ selectable: !disabled && t.predefined,
107
+ selected: selected,
108
+ correct: correct,
109
+ isMissing: isMissing
110
+ });
111
+ });
112
+ return /*#__PURE__*/_react["default"].createElement(_tokenSelect["default"], {
113
+ highlightChoices: !disabled && highlightChoices,
114
+ className: className,
115
+ tokens: prepped,
116
+ disabled: disabled,
117
+ onChange: this.change,
118
+ maxNoOfSelections: maxNoOfSelections,
119
+ animationsDisabled: animationsDisabled
120
+ });
121
+ }
122
+ }]);
123
+ return TextSelect;
124
+ }(_react["default"].Component);
125
+
126
+ exports["default"] = TextSelect;
127
+ (0, _defineProperty2["default"])(TextSelect, "propTypes", {
128
+ onChange: _propTypes["default"].func,
129
+ disabled: _propTypes["default"].bool,
130
+ tokens: _propTypes["default"].arrayOf(_propTypes["default"].shape(_token.TokenTypes)).isRequired,
131
+ selectedTokens: _propTypes["default"].arrayOf(_propTypes["default"].shape(_token.TokenTypes)).isRequired,
132
+ text: _propTypes["default"].string.isRequired,
133
+ className: _propTypes["default"].string,
134
+ highlightChoices: _propTypes["default"].bool,
135
+ animationsDisabled: _propTypes["default"].bool,
136
+ maxNoOfSelections: _propTypes["default"].number
137
+ });
138
+ //# sourceMappingURL=text-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/text-select.jsx"],"names":["log","TextSelect","tokens","onChange","props","out","filter","t","selected","map","start","end","text","disabled","selectedTokens","className","highlightChoices","maxNoOfSelections","animationsDisabled","normalized","prepped","selectedIndex","findIndex","s","correct","undefined","isMissing","selectable","predefined","change","React","Component","PropTypes","func","bool","arrayOf","shape","TokenTypes","isRequired","string","number"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport TokenSelect from './token-select';\nimport { normalize } from './tokenizer/builder';\nimport { TokenTypes } from './token-select/token';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:text-select');\n/**\n * Built on TokenSelect uses build.normalize to build the token set.\n */\nexport default class TextSelect extends React.Component {\n static propTypes = {\n onChange: PropTypes.func,\n disabled: PropTypes.bool,\n tokens: PropTypes.arrayOf(PropTypes.shape(TokenTypes)).isRequired,\n selectedTokens: PropTypes.arrayOf(PropTypes.shape(TokenTypes)).isRequired,\n text: PropTypes.string.isRequired,\n className: PropTypes.string,\n highlightChoices: PropTypes.bool,\n animationsDisabled: PropTypes.bool,\n maxNoOfSelections: PropTypes.number,\n };\n\n change = (tokens) => {\n const { onChange } = this.props;\n\n if (!onChange) {\n return;\n }\n const out = tokens.filter((t) => t.selected).map((t) => ({ start: t.start, end: t.end }));\n\n onChange(out);\n };\n\n render() {\n const {\n text,\n disabled,\n tokens,\n selectedTokens,\n className,\n highlightChoices,\n maxNoOfSelections,\n animationsDisabled,\n } = this.props;\n\n const normalized = normalize(text, tokens);\n log('normalized: ', normalized);\n const prepped = normalized.map((t) => {\n const selectedIndex = selectedTokens.findIndex((s) => {\n return s.start === t.start && s.end === t.end;\n });\n const selected = selectedIndex !== -1;\n const correct = selected ? t.correct : undefined;\n const isMissing = t.isMissing;\n return {\n ...t,\n selectable: !disabled && t.predefined,\n selected,\n correct,\n isMissing,\n };\n });\n\n return (\n <TokenSelect\n highlightChoices={!disabled && highlightChoices}\n className={className}\n tokens={prepped}\n disabled={disabled}\n onChange={this.change}\n maxNoOfSelections={maxNoOfSelections}\n animationsDisabled={animationsDisabled}\n />\n );\n }\n}\n"],"file":"text-select.js"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = exports.TokenSelect = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
+
20
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
+
22
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
+
24
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
+
26
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
27
+
28
+ var _react = _interopRequireDefault(require("react"));
29
+
30
+ var _propTypes = _interopRequireDefault(require("prop-types"));
31
+
32
+ var _token = _interopRequireWildcard(require("./token"));
33
+
34
+ var _styles = require("@material-ui/core/styles");
35
+
36
+ var _classnames = _interopRequireDefault(require("classnames"));
37
+
38
+ var _clone = _interopRequireDefault(require("lodash/clone"));
39
+
40
+ var _debug = _interopRequireDefault(require("debug"));
41
+
42
+ var _styleUtils = require("@pie-lib/style-utils");
43
+
44
+ var _server = require("react-dom/server");
45
+
46
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
47
+
48
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
49
+
50
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
51
+
52
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
53
+
54
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
55
+
56
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
57
+
58
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
59
+
60
+ var log = (0, _debug["default"])('@pie-lib:text-select:token-select');
61
+
62
+ var TokenSelect = /*#__PURE__*/function (_React$Component) {
63
+ (0, _inherits2["default"])(TokenSelect, _React$Component);
64
+
65
+ var _super = _createSuper(TokenSelect);
66
+
67
+ function TokenSelect() {
68
+ var _this;
69
+
70
+ (0, _classCallCheck2["default"])(this, TokenSelect);
71
+
72
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
73
+ args[_key] = arguments[_key];
74
+ }
75
+
76
+ _this = _super.call.apply(_super, [this].concat(args));
77
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedCount", function () {
78
+ return _this.props.tokens.filter(function (t) {
79
+ return t.selected;
80
+ }).length;
81
+ });
82
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "canSelectMore", function (selectedCount) {
83
+ var maxNoOfSelections = _this.props.maxNoOfSelections;
84
+
85
+ if (maxNoOfSelections === 1) {
86
+ return true;
87
+ }
88
+
89
+ log('[canSelectMore] maxNoOfSelections: ', maxNoOfSelections, 'selectedCount: ', selectedCount);
90
+ return maxNoOfSelections <= 0 || isFinite(maxNoOfSelections) && selectedCount < maxNoOfSelections;
91
+ });
92
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleToken", function (event) {
93
+ var target = event.target;
94
+ var _this$props = _this.props,
95
+ tokens = _this$props.tokens,
96
+ animationsDisabled = _this$props.animationsDisabled;
97
+ var tokensCloned = (0, _clone["default"])(tokens);
98
+ var targetSpanWrapper = target.closest(".".concat(_token["default"].rootClassName));
99
+ var targetedTokenIndex = targetSpanWrapper && targetSpanWrapper.dataset && targetSpanWrapper.dataset.indexkey;
100
+ var t = targetedTokenIndex && tokensCloned[targetedTokenIndex]; // don't toggle if we are in print mode, token correctness is defined or if it's missing
101
+ // (missing means that it was evaluated as correct and not selected)
102
+
103
+ if (t && t.correct === undefined && !animationsDisabled && !t.isMissing) {
104
+ var _this$props2 = _this.props,
105
+ onChange = _this$props2.onChange,
106
+ maxNoOfSelections = _this$props2.maxNoOfSelections;
107
+ var selected = !t.selected;
108
+
109
+ if (maxNoOfSelections === 1 && _this.selectedCount() === 1) {
110
+ var selectedToken = (tokens || []).filter(function (t) {
111
+ return t.selected;
112
+ });
113
+ var updatedTokens = tokensCloned.map(function (token) {
114
+ if ((0, _isEqual["default"])(token, selectedToken[0])) {
115
+ return _objectSpread(_objectSpread({}, token), {}, {
116
+ selected: false
117
+ });
118
+ }
119
+
120
+ return _objectSpread(_objectSpread({}, token), {}, {
121
+ selectable: true
122
+ });
123
+ });
124
+
125
+ var update = _objectSpread(_objectSpread({}, t), {}, {
126
+ selected: !t.selected
127
+ });
128
+
129
+ updatedTokens.splice(targetedTokenIndex, 1, update);
130
+ onChange(updatedTokens);
131
+ } else {
132
+ if (selected && maxNoOfSelections > 0 && _this.selectedCount() >= maxNoOfSelections) {
133
+ log('skip toggle max reached');
134
+ return;
135
+ }
136
+
137
+ var _update = _objectSpread(_objectSpread({}, t), {}, {
138
+ selected: !t.selected
139
+ });
140
+
141
+ tokensCloned.splice(targetedTokenIndex, 1, _update);
142
+ onChange(tokensCloned);
143
+ }
144
+ }
145
+ });
146
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateTokensInHtml", function () {
147
+ var _this$props3 = _this.props,
148
+ tokens = _this$props3.tokens,
149
+ disabled = _this$props3.disabled,
150
+ highlightChoices = _this$props3.highlightChoices,
151
+ animationsDisabled = _this$props3.animationsDisabled;
152
+
153
+ var selectedCount = _this.selectedCount();
154
+
155
+ var isLineBreak = function isLineBreak(text) {
156
+ return text === '\n';
157
+ };
158
+
159
+ var isNewParagraph = function isNewParagraph(text) {
160
+ return text === '\n\n';
161
+ };
162
+
163
+ var reducer = function reducer(accumulator, t, index) {
164
+ var selectable = t.selected || t.selectable && _this.canSelectMore(selectedCount);
165
+
166
+ var showCorrectAnswer = t.correct !== undefined && (t.selectable || t.selected);
167
+ var finalAcc = accumulator;
168
+
169
+ if (isNewParagraph(t.text)) {
170
+ return finalAcc + '</p><p>';
171
+ }
172
+
173
+ if (isLineBreak(t.text)) {
174
+ return finalAcc + '<br>';
175
+ }
176
+
177
+ if (selectable && !disabled || showCorrectAnswer || t.selected || t.isMissing || animationsDisabled && t.predefined // if we are in print mode
178
+ ) {
179
+ return finalAcc + (0, _server.renderToString)( /*#__PURE__*/_react["default"].createElement(_token["default"], (0, _extends2["default"])({
180
+ key: index,
181
+ disabled: disabled,
182
+ index: index
183
+ }, t, {
184
+ selectable: selectable,
185
+ highlight: highlightChoices,
186
+ animationsDisabled: animationsDisabled
187
+ })));
188
+ } else {
189
+ return accumulator + t.text;
190
+ }
191
+ };
192
+
193
+ var reduceResult = (tokens || []).reduce(reducer, '<p>');
194
+ return reduceResult + '</p>';
195
+ });
196
+ return _this;
197
+ }
198
+
199
+ (0, _createClass2["default"])(TokenSelect, [{
200
+ key: "render",
201
+ value: function render() {
202
+ var _this$props4 = this.props,
203
+ classes = _this$props4.classes,
204
+ classNameProp = _this$props4.className;
205
+ var className = (0, _classnames["default"])(classes.tokenSelect, classNameProp);
206
+ var html = this.generateTokensInHtml();
207
+ return /*#__PURE__*/_react["default"].createElement("div", {
208
+ className: className,
209
+ dangerouslySetInnerHTML: {
210
+ __html: html
211
+ },
212
+ onClick: this.toggleToken
213
+ });
214
+ }
215
+ }]);
216
+ return TokenSelect;
217
+ }(_react["default"].Component);
218
+
219
+ exports.TokenSelect = TokenSelect;
220
+ (0, _defineProperty2["default"])(TokenSelect, "propTypes", {
221
+ tokens: _propTypes["default"].arrayOf(_propTypes["default"].shape(_token.TokenTypes)).isRequired,
222
+ className: _propTypes["default"].string,
223
+ classes: _propTypes["default"].object.isRequired,
224
+ onChange: _propTypes["default"].func.isRequired,
225
+ disabled: _propTypes["default"].bool,
226
+ highlightChoices: _propTypes["default"].bool,
227
+ animationsDisabled: _propTypes["default"].bool,
228
+ maxNoOfSelections: _propTypes["default"].number
229
+ });
230
+ (0, _defineProperty2["default"])(TokenSelect, "defaultProps", {
231
+ highlightChoices: false,
232
+ maxNoOfSelections: 0,
233
+ tokens: []
234
+ });
235
+
236
+ var _default = (0, _styles.withStyles)(function () {
237
+ return {
238
+ tokenSelect: _objectSpread(_objectSpread({
239
+ backgroundColor: 'none',
240
+ whiteSpace: 'pre'
241
+ }, (0, _styleUtils.noSelect)()), {}, {
242
+ '& p': {
243
+ whiteSpace: 'break-spaces'
244
+ }
245
+ })
246
+ };
247
+ })(TokenSelect);
248
+
249
+ exports["default"] = _default;
250
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/token-select/index.jsx"],"names":["log","TokenSelect","props","tokens","filter","t","selected","length","selectedCount","maxNoOfSelections","isFinite","event","target","animationsDisabled","tokensCloned","targetSpanWrapper","closest","Token","rootClassName","targetedTokenIndex","dataset","indexkey","correct","undefined","isMissing","onChange","selectedToken","updatedTokens","map","token","selectable","update","splice","disabled","highlightChoices","isLineBreak","text","isNewParagraph","reducer","accumulator","index","canSelectMore","showCorrectAnswer","finalAcc","predefined","reduceResult","reduce","classes","classNameProp","className","tokenSelect","html","generateTokensInHtml","__html","toggleToken","React","Component","PropTypes","arrayOf","shape","TokenTypes","isRequired","string","object","func","bool","number","backgroundColor","whiteSpace"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Token, { TokenTypes } from './token';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport clone from 'lodash/clone';\nimport debug from 'debug';\nimport { noSelect } from '@pie-lib/style-utils';\nimport { renderToString } from 'react-dom/server';\nimport isEqual from 'lodash/isEqual';\n\nconst log = debug('@pie-lib:text-select:token-select');\n\nexport class TokenSelect extends React.Component {\n static propTypes = {\n tokens: PropTypes.arrayOf(PropTypes.shape(TokenTypes)).isRequired,\n className: PropTypes.string,\n classes: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n disabled: PropTypes.bool,\n highlightChoices: PropTypes.bool,\n animationsDisabled: PropTypes.bool,\n maxNoOfSelections: PropTypes.number,\n };\n\n static defaultProps = {\n highlightChoices: false,\n maxNoOfSelections: 0,\n tokens: [],\n };\n\n selectedCount = () => this.props.tokens.filter((t) => t.selected).length;\n\n canSelectMore = (selectedCount) => {\n const { maxNoOfSelections } = this.props;\n\n if (maxNoOfSelections === 1) {\n return true;\n }\n\n log('[canSelectMore] maxNoOfSelections: ', maxNoOfSelections, 'selectedCount: ', selectedCount);\n return maxNoOfSelections <= 0 || (isFinite(maxNoOfSelections) && selectedCount < maxNoOfSelections);\n };\n\n /**\n @function\n @param { object } event\n\n @description\n each token is wrapped into a span that has Token.rootClassName class and indexkey attribute (represents the index of the token)\n tokens are updated with the targeted token having the correct value set for 'selected' property\n */\n toggleToken = (event) => {\n const { target } = event;\n const { tokens, animationsDisabled } = this.props;\n const tokensCloned = clone(tokens);\n const targetSpanWrapper = target.closest(`.${Token.rootClassName}`);\n const targetedTokenIndex = targetSpanWrapper && targetSpanWrapper.dataset && targetSpanWrapper.dataset.indexkey;\n const t = targetedTokenIndex && tokensCloned[targetedTokenIndex];\n\n // don't toggle if we are in print mode, token correctness is defined or if it's missing\n // (missing means that it was evaluated as correct and not selected)\n if (t && t.correct === undefined && !animationsDisabled && !t.isMissing) {\n const { onChange, maxNoOfSelections } = this.props;\n const selected = !t.selected;\n\n if (maxNoOfSelections === 1 && this.selectedCount() === 1) {\n const selectedToken = (tokens || []).filter((t) => t.selected);\n\n const updatedTokens = tokensCloned.map((token) => {\n if (isEqual(token, selectedToken[0])) {\n return { ...token, selected: false };\n }\n\n return { ...token, selectable: true };\n });\n\n const update = { ...t, selected: !t.selected };\n\n updatedTokens.splice(targetedTokenIndex, 1, update);\n onChange(updatedTokens);\n } else {\n if (selected && maxNoOfSelections > 0 && this.selectedCount() >= maxNoOfSelections) {\n log('skip toggle max reached');\n return;\n }\n\n const update = { ...t, selected: !t.selected };\n\n tokensCloned.splice(targetedTokenIndex, 1, update);\n onChange(tokensCloned);\n }\n }\n };\n\n generateTokensInHtml = () => {\n const { tokens, disabled, highlightChoices, animationsDisabled } = this.props;\n const selectedCount = this.selectedCount();\n const isLineBreak = (text) => text === '\\n';\n const isNewParagraph = (text) => text === '\\n\\n';\n\n const reducer = (accumulator, t, index) => {\n const selectable = t.selected || (t.selectable && this.canSelectMore(selectedCount));\n const showCorrectAnswer = t.correct !== undefined && (t.selectable || t.selected);\n let finalAcc = accumulator;\n\n if (isNewParagraph(t.text)) {\n return finalAcc + '</p><p>';\n }\n\n if (isLineBreak(t.text)) {\n return finalAcc + '<br>';\n }\n\n if (\n (selectable && !disabled) ||\n showCorrectAnswer ||\n t.selected ||\n t.isMissing ||\n (animationsDisabled && t.predefined) // if we are in print mode\n ) {\n return (\n finalAcc +\n renderToString(\n <Token\n key={index}\n disabled={disabled}\n index={index}\n {...t}\n selectable={selectable}\n highlight={highlightChoices}\n animationsDisabled={animationsDisabled}\n />,\n )\n );\n } else {\n return accumulator + t.text;\n }\n };\n\n const reduceResult = (tokens || []).reduce(reducer, '<p>');\n\n return reduceResult + '</p>';\n };\n\n render() {\n const { classes, className: classNameProp } = this.props;\n const className = classNames(classes.tokenSelect, classNameProp);\n const html = this.generateTokensInHtml();\n\n return <div className={className} dangerouslySetInnerHTML={{ __html: html }} onClick={this.toggleToken} />;\n }\n}\n\nexport default withStyles(() => ({\n tokenSelect: {\n backgroundColor: 'none',\n whiteSpace: 'pre',\n ...noSelect(),\n '& p': {\n whiteSpace: 'break-spaces',\n },\n },\n}))(TokenSelect);\n"],"file":"index.js"}