@pie-lib/text-select 1.12.8 → 1.13.1-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 +18 -70
- package/NEXT.CHANGELOG.json +1 -0
- package/package.json +8 -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 +0 -68
- package/lib/index.js.map +0 -1
- package/lib/legend.js +0 -99
- package/lib/legend.js.map +0 -1
- package/lib/text-select.js +0 -138
- package/lib/text-select.js.map +0 -1
- package/lib/token-select/index.js +0 -249
- package/lib/token-select/index.js.map +0 -1
- package/lib/token-select/token.js +0 -237
- package/lib/token-select/token.js.map +0 -1
- package/lib/tokenizer/builder.js +0 -311
- package/lib/tokenizer/builder.js.map +0 -1
- package/lib/tokenizer/controls.js +0 -123
- package/lib/tokenizer/controls.js.map +0 -1
- package/lib/tokenizer/index.js +0 -205
- package/lib/tokenizer/index.js.map +0 -1
- package/lib/tokenizer/selection-utils.js +0 -65
- package/lib/tokenizer/selection-utils.js.map +0 -1
- package/lib/tokenizer/token-text.js +0 -200
- package/lib/tokenizer/token-text.js.map +0 -1
- package/lib/utils.js +0 -67
- package/lib/utils.js.map +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { shallow } from 'enzyme';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import TokenText from '../token-text';
|
|
4
|
+
import { intersection } from '../builder';
|
|
5
|
+
import { clearSelection, getCaretCharacterOffsetWithin } from '../selection-utils';
|
|
6
|
+
|
|
7
|
+
jest.mock('../selection-utils', () => ({
|
|
8
|
+
clearSelection: jest.fn(),
|
|
9
|
+
getCaretCharacterOffsetWithin: jest.fn().mockReturnValue(10),
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
jest.mock('../builder', () => ({
|
|
13
|
+
intersection: jest.fn().mockReturnValue({
|
|
14
|
+
hasOverlap: jest.fn().mockReturnValue(false),
|
|
15
|
+
surroundedTokens: jest.fn().mockReturnValue([]),
|
|
16
|
+
}),
|
|
17
|
+
normalize: jest.fn().mockReturnValue([
|
|
18
|
+
{
|
|
19
|
+
text: `lorem\nfoo bar`,
|
|
20
|
+
start: 0,
|
|
21
|
+
end: 13,
|
|
22
|
+
predefined: true,
|
|
23
|
+
},
|
|
24
|
+
]),
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
const tokens = () => [
|
|
28
|
+
{
|
|
29
|
+
start: 0,
|
|
30
|
+
end: 7,
|
|
31
|
+
text: `lorem\nfoo bar`,
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const mkEvent = () => ({
|
|
36
|
+
preventDefault: jest.fn(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('token-text', () => {
|
|
40
|
+
describe('snapshot', () => {
|
|
41
|
+
it('renders', () => {
|
|
42
|
+
const w = shallow(
|
|
43
|
+
<TokenText onTokenClick={jest.fn()} onSelectToken={jest.fn()} text={`lorem\nfoo bar`} tokens={tokens()} />,
|
|
44
|
+
);
|
|
45
|
+
expect(w).toMatchSnapshot();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe('logic', () => {
|
|
50
|
+
let w;
|
|
51
|
+
let onSelectToken;
|
|
52
|
+
let onTokenClick;
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
global.window.getSelection = jest.fn().mockReturnValue({
|
|
55
|
+
toString: () => 'bar',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
onSelectToken = jest.fn();
|
|
59
|
+
onTokenClick = jest.fn();
|
|
60
|
+
|
|
61
|
+
w = shallow(
|
|
62
|
+
<TokenText
|
|
63
|
+
onTokenClick={onTokenClick}
|
|
64
|
+
onSelectToken={onSelectToken}
|
|
65
|
+
text={`lorem\nfoo bar`}
|
|
66
|
+
tokens={tokens()}
|
|
67
|
+
/>,
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('mouseup', () => {
|
|
72
|
+
it('calls event.preventDefault', () => {
|
|
73
|
+
const event = mkEvent();
|
|
74
|
+
w.instance().onClick(event);
|
|
75
|
+
expect(event.preventDefault).toBeCalled();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('calls getCaretCharacterOffsetWithin', () => {
|
|
79
|
+
const event = mkEvent();
|
|
80
|
+
w.instance().root = {};
|
|
81
|
+
w.instance().onClick(event);
|
|
82
|
+
expect(getCaretCharacterOffsetWithin).toBeCalledWith({});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('calls clear selection if there is an overlap', () => {
|
|
86
|
+
intersection.mockReturnValue({
|
|
87
|
+
hasOverlap: true,
|
|
88
|
+
});
|
|
89
|
+
const event = mkEvent();
|
|
90
|
+
w.instance().root = {};
|
|
91
|
+
w.instance().onClick(event);
|
|
92
|
+
expect(clearSelection).toBeCalled();
|
|
93
|
+
expect(onSelectToken).not.toBeCalled();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('calls onSelectToken', () => {
|
|
97
|
+
const event = mkEvent();
|
|
98
|
+
intersection.mockReturnValue({
|
|
99
|
+
hasOverlap: false,
|
|
100
|
+
surroundedTokens: [],
|
|
101
|
+
});
|
|
102
|
+
w.instance().root = {};
|
|
103
|
+
w.instance().onClick(event);
|
|
104
|
+
expect(onSelectToken).toBeCalledWith({ text: 'bar', start: 10, end: 13 }, []);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('does not call onSelectToken for ["\n", " ", "\t"]', () => {
|
|
108
|
+
const event = mkEvent();
|
|
109
|
+
|
|
110
|
+
intersection.mockReturnValue({
|
|
111
|
+
hasOverlap: false,
|
|
112
|
+
surroundedTokens: [],
|
|
113
|
+
});
|
|
114
|
+
w.instance().root = {};
|
|
115
|
+
|
|
116
|
+
global.window.getSelection = jest.fn().mockReturnValue({
|
|
117
|
+
toString: () => '\n',
|
|
118
|
+
});
|
|
119
|
+
w.instance().onClick(event);
|
|
120
|
+
expect(onSelectToken).not.toBeCalled();
|
|
121
|
+
|
|
122
|
+
global.window.getSelection = jest.fn().mockReturnValue({
|
|
123
|
+
toString: () => ' ',
|
|
124
|
+
});
|
|
125
|
+
w.instance().onClick(event);
|
|
126
|
+
expect(onSelectToken).not.toBeCalled();
|
|
127
|
+
|
|
128
|
+
global.window.getSelection = jest.fn().mockReturnValue({
|
|
129
|
+
toString: () => '\t',
|
|
130
|
+
});
|
|
131
|
+
w.instance().onClick(event);
|
|
132
|
+
expect(onSelectToken).not.toBeCalled();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
@@ -4,6 +4,8 @@ import Button from '@material-ui/core/Button';
|
|
|
4
4
|
import { withStyles } from '@material-ui/core/styles';
|
|
5
5
|
import Switch from '@material-ui/core/Switch';
|
|
6
6
|
import FormControlLabel from '@material-ui/core/FormControlLabel';
|
|
7
|
+
import { color } from '@pie-lib/render-ui';
|
|
8
|
+
import classNames from 'classnames';
|
|
7
9
|
|
|
8
10
|
export class Controls extends React.Component {
|
|
9
11
|
static propTypes = {
|
|
@@ -50,7 +52,18 @@ export class Controls extends React.Component {
|
|
|
50
52
|
</Button>
|
|
51
53
|
</div>
|
|
52
54
|
<FormControlLabel
|
|
53
|
-
control={
|
|
55
|
+
control={
|
|
56
|
+
<Switch
|
|
57
|
+
classes={{
|
|
58
|
+
checked: classes.checkedThumb,
|
|
59
|
+
bar: classNames({
|
|
60
|
+
[classes.checkedBar]: setCorrectMode,
|
|
61
|
+
}),
|
|
62
|
+
}}
|
|
63
|
+
checked={setCorrectMode}
|
|
64
|
+
onChange={onToggleCorrectMode}
|
|
65
|
+
/>
|
|
66
|
+
}
|
|
54
67
|
label="Set correct answers"
|
|
55
68
|
/>
|
|
56
69
|
</div>
|
|
@@ -66,4 +79,10 @@ export default withStyles((theme) => ({
|
|
|
66
79
|
alignItems: 'center',
|
|
67
80
|
justifyContent: 'space-between',
|
|
68
81
|
},
|
|
82
|
+
checkedThumb: {
|
|
83
|
+
color: `${color.tertiary()} !important`,
|
|
84
|
+
},
|
|
85
|
+
checkedBar: {
|
|
86
|
+
backgroundColor: `${color.tertiaryLight()} !important`,
|
|
87
|
+
},
|
|
69
88
|
}))(Controls);
|
|
@@ -16,9 +16,18 @@ export const Text = withStyles(() => ({
|
|
|
16
16
|
cursor: 'pointer',
|
|
17
17
|
backgroundColor: yellow[100],
|
|
18
18
|
border: `dashed 0px ${yellow[700]}`,
|
|
19
|
+
// we need this for nested tokenized elements like paragraphs, where p is inside span
|
|
20
|
+
'& *': {
|
|
21
|
+
cursor: 'pointer',
|
|
22
|
+
backgroundColor: yellow[100],
|
|
23
|
+
border: `dashed 0px ${yellow[700]}`,
|
|
24
|
+
},
|
|
19
25
|
},
|
|
20
26
|
correct: {
|
|
21
27
|
backgroundColor: green[500],
|
|
28
|
+
'& *': {
|
|
29
|
+
backgroundColor: green[500],
|
|
30
|
+
},
|
|
22
31
|
},
|
|
23
32
|
}))(({ text, predefined, classes, onClick, correct }) => {
|
|
24
33
|
const formattedText = (text || '').replace(/\n/g, '<br>');
|
package/README.md
DELETED
package/lib/index.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
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, "Legend", {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: function get() {
|
|
13
|
-
return _legend.Legend;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
Object.defineProperty(exports, "TextSelect", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: function get() {
|
|
19
|
-
return _textSelect["default"];
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(exports, "Token", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
get: function get() {
|
|
25
|
-
return _token["default"];
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
Object.defineProperty(exports, "TokenSelect", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
get: function get() {
|
|
31
|
-
return _tokenSelect["default"];
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
Object.defineProperty(exports, "TokenTypes", {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
get: function get() {
|
|
37
|
-
return _tokenSelect.TokenTypes;
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
Object.defineProperty(exports, "Tokenizer", {
|
|
41
|
-
enumerable: true,
|
|
42
|
-
get: function get() {
|
|
43
|
-
return _tokenizer["default"];
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
Object.defineProperty(exports, "prepareText", {
|
|
47
|
-
enumerable: true,
|
|
48
|
-
get: function get() {
|
|
49
|
-
return _utils.prepareText;
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
var _tokenizer = _interopRequireDefault(require("./tokenizer"));
|
|
54
|
-
|
|
55
|
-
var _tokenSelect = _interopRequireWildcard(require("./token-select"));
|
|
56
|
-
|
|
57
|
-
var _textSelect = _interopRequireDefault(require("./text-select"));
|
|
58
|
-
|
|
59
|
-
var _legend = require("./legend");
|
|
60
|
-
|
|
61
|
-
var _token = _interopRequireDefault(require("./token-select/token"));
|
|
62
|
-
|
|
63
|
-
var _utils = require("./utils");
|
|
64
|
-
|
|
65
|
-
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); }
|
|
66
|
-
|
|
67
|
-
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; }
|
|
68
|
-
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA","sourcesContent":["import 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 { TextSelect, TokenTypes, Tokenizer, TokenSelect, Token, prepareText, Legend };\n"],"file":"index.js"}
|
package/lib/legend.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
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
|
package/lib/legend.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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":"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","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"}
|
package/lib/text-select.js
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
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
|
package/lib/text-select.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|