@digabi/exam-engine-core 19.10.4-alpha.0 → 19.12.1-19.12.2-alpha.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. package/dist/__tests__/examServerApi.d.ts.map +1 -1
  2. package/dist/__tests__/examServerApi.js +1 -2
  3. package/dist/__tests__/examServerApi.js.map +1 -1
  4. package/dist/__tests__/testExamRendering.js +1 -9
  5. package/dist/__tests__/testExamRendering.js.map +1 -1
  6. package/dist/__tests__/tsconfig.tsbuildinfo +1 -1
  7. package/dist/components/context/CommonExamContext.d.ts +1 -0
  8. package/dist/components/context/CommonExamContext.d.ts.map +1 -1
  9. package/dist/components/context/CommonExamContext.js +3 -2
  10. package/dist/components/context/CommonExamContext.js.map +1 -1
  11. package/dist/components/exam/Exam.d.ts +1 -10
  12. package/dist/components/exam/Exam.d.ts.map +1 -1
  13. package/dist/components/exam/Exam.js +2 -7
  14. package/dist/components/exam/Exam.js.map +1 -1
  15. package/dist/components/exam/ExamFooter.d.ts.map +1 -1
  16. package/dist/components/exam/ExamFooter.js +2 -11
  17. package/dist/components/exam/ExamFooter.js.map +1 -1
  18. package/dist/components/exam/RichTextAnswer.d.ts +1 -0
  19. package/dist/components/exam/RichTextAnswer.d.ts.map +1 -1
  20. package/dist/components/exam/RichTextAnswer.js +10 -7
  21. package/dist/components/exam/RichTextAnswer.js.map +1 -1
  22. package/dist/components/exam/internal/TextAnswerInput.d.ts.map +1 -1
  23. package/dist/components/exam/internal/TextAnswerInput.js +2 -2
  24. package/dist/components/exam/internal/TextAnswerInput.js.map +1 -1
  25. package/dist/i18n/fi-FI.d.ts +0 -17
  26. package/dist/i18n/fi-FI.d.ts.map +1 -1
  27. package/dist/i18n/fi-FI.js +0 -17
  28. package/dist/i18n/fi-FI.js.map +1 -1
  29. package/dist/i18n/sv-FI.d.ts.map +1 -1
  30. package/dist/i18n/sv-FI.js +0 -17
  31. package/dist/i18n/sv-FI.js.map +1 -1
  32. package/dist/main-bundle.js +1 -1
  33. package/dist/main-bundle.js.LICENSE.txt +0 -14
  34. package/dist/main.css +1 -1
  35. package/dist/types/ExamServerAPI.d.ts +0 -1
  36. package/dist/types/ExamServerAPI.d.ts.map +1 -1
  37. package/package.json +3 -3
  38. package/dist/assets/logo.png +0 -0
  39. package/dist/components/exam/StudentNameHeader.d.ts +0 -8
  40. package/dist/components/exam/StudentNameHeader.d.ts.map +0 -1
  41. package/dist/components/exam/StudentNameHeader.js +0 -3
  42. package/dist/components/exam/StudentNameHeader.js.map +0 -1
  43. package/dist/components/exam/UndoHistoryEntry.d.ts +0 -20
  44. package/dist/components/exam/UndoHistoryEntry.d.ts.map +0 -1
  45. package/dist/components/exam/UndoHistoryEntry.js +0 -42
  46. package/dist/components/exam/UndoHistoryEntry.js.map +0 -1
  47. package/dist/components/exam/UndoView.d.ts +0 -36
  48. package/dist/components/exam/UndoView.d.ts.map +0 -1
  49. package/dist/components/exam/UndoView.js +0 -162
  50. package/dist/components/exam/UndoView.js.map +0 -1
  51. package/dist/components/exam/undo-view.d.ts +0 -36
  52. package/dist/components/exam/undo-view.d.ts.map +0 -1
  53. package/dist/components/exam/undo-view.js +0 -162
  54. package/dist/components/exam/undo-view.js.map +0 -1
@@ -1,162 +0,0 @@
1
- import axios from 'axios';
2
- import React from 'react';
3
- //import { Spinner } from '../components/spinner'
4
- import moment from 'moment';
5
- import { UndoHistoryEntry } from './UndoHistoryEntry';
6
- import FocusTrap from 'focus-trap-react';
7
- import { useExamTranslation } from '../../i18n';
8
- const CancelToken = axios.CancelToken;
9
- function toAnswerHistoryEntry(answer) {
10
- return {
11
- type: answer.type,
12
- value: answer.value,
13
- answerTime: moment(answer.answer_time),
14
- characterCount: answer.character_count
15
- };
16
- }
17
- function AnswerDisplay(props) {
18
- const { selectedAnswer } = props;
19
- return selectedAnswer ? (selectedAnswer.type === 'richText' ? (React.createElement("div", { className: "k-undo-view-answer-content js-undo-answer-detail", dangerouslySetInnerHTML: { __html: selectedAnswer.value } })) : (React.createElement("div", { className: "k-undo-view-answer-content js-undo-answer-detail plainText" }, selectedAnswer.value))) : null;
20
- }
21
- function BottomBar(props) {
22
- const { selectedAnswer, selectedAnswerIndex, restoreAnswer, questionId } = props;
23
- const disableRestoreButton = !selectedAnswer || selectedAnswerIndex === 0;
24
- return (React.createElement("div", { className: "k-undo-view-bottom-bar" },
25
- React.createElement("button", { className: "k-button-default k-button js-restore-answer-button", disabled: disableRestoreButton, onClick: () => selectedAnswer && restoreAnswer({ ...selectedAnswer, questionId }) },
26
- React.createElement(RestoreButtonLabel, null))));
27
- }
28
- function escapedHtml(html) {
29
- const container = document.createElement('div');
30
- container.innerHTML = html;
31
- return container.innerText;
32
- }
33
- function getAnswerText(answer) {
34
- const fullText = answer.type === 'text' ? answer.value : escapedHtml(answer.value);
35
- return fullText.replace(/\s+/g, ' ').trim();
36
- }
37
- function truncateAnswer(answer, length = 50) {
38
- const answerText = getAnswerText(answer);
39
- if (answerText.length <= length) {
40
- return answerText;
41
- }
42
- const separator = '…';
43
- const charsToShow = length - separator.length;
44
- const startChars = Math.ceil(charsToShow / 2);
45
- const endChars = charsToShow - startChars;
46
- return answerText.substr(0, startChars) + separator + answerText.substr(answerText.length - endChars);
47
- }
48
- function countWords(answer) {
49
- const text = getAnswerText(answer);
50
- return text.length === 0 ? 0 : text.split(/\s+/gi).filter(s => s.length > 0).length;
51
- }
52
- function countCharacters(answer) {
53
- const text = getAnswerText(answer);
54
- return text.replace(/\s/g, '').length;
55
- }
56
- function countScreenshots(answer) {
57
- const answerElement = document.createElement('div');
58
- answerElement.innerHTML = answer.value;
59
- const equationImageSelector = 'img[src^="/math.svg"], img[src^="data:image/svg+xml"]';
60
- const imageCount = answerElement.querySelectorAll('img').length;
61
- const emptyImageCount = answerElement.querySelectorAll('img[src=""]').length;
62
- const equationCount = answerElement.querySelectorAll(equationImageSelector).length;
63
- return imageCount - equationCount - emptyImageCount;
64
- }
65
- export class UndoView extends React.PureComponent {
66
- constructor(props) {
67
- super(props);
68
- this.source = CancelToken.source();
69
- this.toggleBodyScroll = (scrollEnabled) => document.documentElement.classList.toggle('k-exam-body-no-scroll', !scrollEnabled);
70
- this.keydownListener = (event) => {
71
- if (event.keyCode === 13) {
72
- const selectedAnswer = this.state.answers[this.state.selectedAnswerIndex];
73
- this.props.restoreAnswer({ ...selectedAnswer, questionId: this.props.questionId });
74
- this.close();
75
- }
76
- else if (event.keyCode === 27) {
77
- this.close();
78
- }
79
- };
80
- this.state = {
81
- answers: [],
82
- selectedAnswerIndex: 0,
83
- loading: true,
84
- loadRetryTimeout: null
85
- };
86
- }
87
- componentDidMount() {
88
- this.toggleBodyScroll(false);
89
- document.addEventListener('keydown', this.keydownListener, false);
90
- void this.fetchAnswerHistory(this.props.questionId);
91
- }
92
- componentWillUnmount() {
93
- this.source.cancel();
94
- document.removeEventListener('keydown', this.keydownListener, false);
95
- this.toggleBodyScroll(true);
96
- }
97
- componentDidUpdate(prevProps) {
98
- if (this.props.questionId !== prevProps.questionId) {
99
- void this.fetchAnswerHistory(this.props.questionId);
100
- }
101
- }
102
- overlayClicked(event) {
103
- const targetClass = event.target.className;
104
- if (targetClass.includes('js-undo-overlay')) {
105
- this.close();
106
- }
107
- }
108
- async fetchAnswerHistory(questionId) {
109
- try {
110
- const answerHistoryResult = await axios.get(`/rest/answer-history/${questionId}`, {
111
- cancelToken: this.source.token
112
- });
113
- const answerHistory = answerHistoryResult.data;
114
- const answers = answerHistory.map(toAnswerHistoryEntry);
115
- this.setState({ answers, selectedAnswerIndex: 0, loading: false, loadRetryTimeout: null });
116
- }
117
- catch (error) {
118
- if (!axios.isCancel(error)) {
119
- this.setState({
120
- loadRetryTimeout: window.setTimeout(() => {
121
- void this.fetchAnswerHistory(questionId);
122
- }, 4000)
123
- });
124
- }
125
- }
126
- }
127
- close() {
128
- const timeout = this.state.loadRetryTimeout;
129
- if (timeout) {
130
- clearTimeout(timeout);
131
- }
132
- this.source.cancel();
133
- this.props.close();
134
- }
135
- render() {
136
- const selectedAnswer = this.state.answers[this.state.selectedAnswerIndex];
137
- const now = moment();
138
- return (React.createElement(FocusTrap, null,
139
- React.createElement("div", { onClick: this.overlayClicked.bind(this), className: "k-overlay js-undo-overlay", "aria-modal": "true" },
140
- React.createElement("div", { id: "undo", className: "k-undo-view" },
141
- React.createElement("div", { className: "k-undo-view-header js-undo-view-header" },
142
- React.createElement("h3", { className: "k-undo-view-title js-undo-view-title" }, this.props.title),
143
- React.createElement(CloseButton, { close: this.close.bind(this) })),
144
- this.state.loading ? ('Loading...') : (
145
- //<Spinner />
146
- React.createElement("div", { className: "k-undo-view-content" },
147
- React.createElement("div", { className: "k-undo-view-answer-index js-undo-answer-index" }, this.state.answers.map((answer, index) => (React.createElement(UndoHistoryEntry, { key: answer.answerTime.unix(), answerIndex: index, selected: index === this.state.selectedAnswerIndex, onChange: index => this.setState({ selectedAnswerIndex: index }), croppedAnswer: truncateAnswer(answer), minutesSinceAnswer: now.diff(answer.answerTime, 'minutes'), wordCount: countWords(answer), characterCount: countCharacters(answer), screenshotCount: countScreenshots(answer) })))),
148
- React.createElement("div", { className: "k-undo-view-right-panel" },
149
- React.createElement(AnswerDisplay, { selectedAnswer: selectedAnswer }),
150
- React.createElement(BottomBar, { selectedAnswer: selectedAnswer, selectedAnswerIndex: this.state.selectedAnswerIndex, restoreAnswer: this.props.restoreAnswer, questionId: this.props.questionId }))))))));
151
- }
152
- }
153
- const CloseButton = ({ close }) => {
154
- const { t } = useExamTranslation();
155
- return (React.createElement("div", null,
156
- React.createElement("img", { src: "img/closeButton.svg", id: "closeUndoDialogButton", className: "k-undo-view-close-overlay-button js-close-undo-dialog-button", onClick: close, tabIndex: 0, role: "button", "aria-label": t('undo.close') })));
157
- };
158
- const RestoreButtonLabel = () => {
159
- const { t } = useExamTranslation();
160
- return React.createElement("div", null, t('undo.restoreAnswer'));
161
- };
162
- //# sourceMappingURL=UndoView.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UndoView.js","sourceRoot":"","sources":["../../../src/components/exam/UndoView.tsx"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- import React from 'react';
2
- import moment from 'moment';
3
- import { RichTextAnswer, TextAnswer } from '../../types/ExamAnswer';
4
- export interface AnswerHistoryEntry {
5
- type: 'text' | 'richText';
6
- value: string;
7
- characterCount: number;
8
- answerTime: moment.Moment;
9
- }
10
- export interface UndoViewProps {
11
- close: () => void;
12
- restoreAnswer: (examAnswer: TextAnswer | RichTextAnswer) => void;
13
- questionId: number;
14
- title: string;
15
- }
16
- interface UndoViewState {
17
- answers: AnswerHistoryEntry[];
18
- selectedAnswerIndex: number;
19
- loading: boolean;
20
- loadRetryTimeout: number | null;
21
- }
22
- export declare class UndoView extends React.PureComponent<UndoViewProps, UndoViewState> {
23
- private source;
24
- constructor(props: UndoViewProps);
25
- toggleBodyScroll: (scrollEnabled: boolean) => boolean;
26
- componentDidMount(): void;
27
- componentWillUnmount(): void;
28
- componentDidUpdate(prevProps: UndoViewProps): void;
29
- private overlayClicked;
30
- private keydownListener;
31
- private fetchAnswerHistory;
32
- private close;
33
- render(): React.JSX.Element;
34
- }
35
- export {};
36
- //# sourceMappingURL=undo-view.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"undo-view.d.ts","sourceRoot":"","sources":["../../../src/components/exam/undo-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,MAAM,MAAM,QAAQ,CAAA;AAI3B,OAAO,EAAc,cAAc,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAI/E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,KAAK,IAAI,CAAA;IAChE,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAChC;AA+FD,qBAAa,QAAS,SAAQ,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC;IAC7E,OAAO,CAAC,MAAM,CAAuB;gBAEzB,KAAK,EAAE,aAAa;IAUhC,gBAAgB,kBAAmB,OAAO,aAC0C;IAE7E,iBAAiB;IAMjB,oBAAoB;IAMpB,kBAAkB,CAAC,SAAS,EAAE,aAAa;IAMlD,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,eAAe,CAQtB;YAEa,kBAAkB;IAmBhC,OAAO,CAAC,KAAK;IASN,MAAM;CAgDd"}
@@ -1,162 +0,0 @@
1
- import axios from 'axios';
2
- import React from 'react';
3
- //import { Spinner } from '../components/spinner'
4
- import moment from 'moment';
5
- import { UndoHistoryEntry } from './UndoHistoryEntry';
6
- import FocusTrap from 'focus-trap-react';
7
- import { useExamTranslation } from '../../i18n';
8
- const CancelToken = axios.CancelToken;
9
- function toAnswerHistoryEntry(answer) {
10
- return {
11
- type: answer.type,
12
- value: answer.value,
13
- answerTime: moment(answer.answer_time),
14
- characterCount: answer.character_count
15
- };
16
- }
17
- function AnswerDisplay(props) {
18
- const { selectedAnswer } = props;
19
- return selectedAnswer ? (selectedAnswer.type === 'richText' ? (React.createElement("div", { className: "k-undo-view-answer-content js-undo-answer-detail", dangerouslySetInnerHTML: { __html: selectedAnswer.value } })) : (React.createElement("div", { className: "k-undo-view-answer-content js-undo-answer-detail plainText" }, selectedAnswer.value))) : null;
20
- }
21
- function BottomBar(props) {
22
- const { selectedAnswer, selectedAnswerIndex, restoreAnswer, questionId } = props;
23
- const disableRestoreButton = !selectedAnswer || selectedAnswerIndex === 0;
24
- return (React.createElement("div", { className: "k-undo-view-bottom-bar" },
25
- React.createElement("button", { className: "k-button-default k-button js-restore-answer-button", disabled: disableRestoreButton, onClick: () => selectedAnswer && restoreAnswer({ ...selectedAnswer, questionId }) },
26
- React.createElement(RestoreButtonLabel, null))));
27
- }
28
- function escapedHtml(html) {
29
- const container = document.createElement('div');
30
- container.innerHTML = html;
31
- return container.innerText;
32
- }
33
- function getAnswerText(answer) {
34
- const fullText = answer.type === 'text' ? answer.value : escapedHtml(answer.value);
35
- return fullText.replace(/\s+/g, ' ').trim();
36
- }
37
- function truncateAnswer(answer, length = 50) {
38
- const answerText = getAnswerText(answer);
39
- if (answerText.length <= length) {
40
- return answerText;
41
- }
42
- const separator = '…';
43
- const charsToShow = length - separator.length;
44
- const startChars = Math.ceil(charsToShow / 2);
45
- const endChars = charsToShow - startChars;
46
- return answerText.substr(0, startChars) + separator + answerText.substr(answerText.length - endChars);
47
- }
48
- function countWords(answer) {
49
- const text = getAnswerText(answer);
50
- return text.length === 0 ? 0 : text.split(/\s+/gi).filter(s => s.length > 0).length;
51
- }
52
- function countCharacters(answer) {
53
- const text = getAnswerText(answer);
54
- return text.replace(/\s/g, '').length;
55
- }
56
- function countScreenshots(answer) {
57
- const answerElement = document.createElement('div');
58
- answerElement.innerHTML = answer.value;
59
- const equationImageSelector = 'img[src^="/math.svg"], img[src^="data:image/svg+xml"]';
60
- const imageCount = answerElement.querySelectorAll('img').length;
61
- const emptyImageCount = answerElement.querySelectorAll('img[src=""]').length;
62
- const equationCount = answerElement.querySelectorAll(equationImageSelector).length;
63
- return imageCount - equationCount - emptyImageCount;
64
- }
65
- export class UndoView extends React.PureComponent {
66
- constructor(props) {
67
- super(props);
68
- this.source = CancelToken.source();
69
- this.toggleBodyScroll = (scrollEnabled) => document.documentElement.classList.toggle('k-exam-body-no-scroll', !scrollEnabled);
70
- this.keydownListener = (event) => {
71
- if (event.keyCode === 13) {
72
- const selectedAnswer = this.state.answers[this.state.selectedAnswerIndex];
73
- this.props.restoreAnswer({ ...selectedAnswer, questionId: this.props.questionId });
74
- this.close();
75
- }
76
- else if (event.keyCode === 27) {
77
- this.close();
78
- }
79
- };
80
- this.state = {
81
- answers: [],
82
- selectedAnswerIndex: 0,
83
- loading: true,
84
- loadRetryTimeout: null
85
- };
86
- }
87
- componentDidMount() {
88
- this.toggleBodyScroll(false);
89
- document.addEventListener('keydown', this.keydownListener, false);
90
- void this.fetchAnswerHistory(this.props.questionId);
91
- }
92
- componentWillUnmount() {
93
- this.source.cancel();
94
- document.removeEventListener('keydown', this.keydownListener, false);
95
- this.toggleBodyScroll(true);
96
- }
97
- componentDidUpdate(prevProps) {
98
- if (this.props.questionId !== prevProps.questionId) {
99
- void this.fetchAnswerHistory(this.props.questionId);
100
- }
101
- }
102
- overlayClicked(event) {
103
- const targetClass = event.target.className;
104
- if (targetClass.includes('js-undo-overlay')) {
105
- this.close();
106
- }
107
- }
108
- async fetchAnswerHistory(questionId) {
109
- try {
110
- const answerHistoryResult = await axios.get(`/rest/answer-history/${questionId}`, {
111
- cancelToken: this.source.token
112
- });
113
- const answerHistory = answerHistoryResult.data;
114
- const answers = answerHistory.map(toAnswerHistoryEntry);
115
- this.setState({ answers, selectedAnswerIndex: 0, loading: false, loadRetryTimeout: null });
116
- }
117
- catch (error) {
118
- if (!axios.isCancel(error)) {
119
- this.setState({
120
- loadRetryTimeout: window.setTimeout(() => {
121
- void this.fetchAnswerHistory(questionId);
122
- }, 4000)
123
- });
124
- }
125
- }
126
- }
127
- close() {
128
- const timeout = this.state.loadRetryTimeout;
129
- if (timeout) {
130
- clearTimeout(timeout);
131
- }
132
- this.source.cancel();
133
- this.props.close();
134
- }
135
- render() {
136
- const selectedAnswer = this.state.answers[this.state.selectedAnswerIndex];
137
- const now = moment();
138
- return (React.createElement(FocusTrap, null,
139
- React.createElement("div", { onClick: this.overlayClicked.bind(this), className: "k-overlay js-undo-overlay", "aria-modal": "true" },
140
- React.createElement("div", { id: "undo", className: "k-undo-view" },
141
- React.createElement("div", { className: "k-undo-view-header js-undo-view-header" },
142
- React.createElement("h3", { className: "k-undo-view-title js-undo-view-title" }, this.props.title),
143
- React.createElement(CloseButton, { close: this.close.bind(this) })),
144
- this.state.loading ? ('Loading...') : (
145
- //<Spinner />
146
- React.createElement("div", { className: "k-undo-view-content" },
147
- React.createElement("div", { className: "k-undo-view-answer-index js-undo-answer-index" }, this.state.answers.map((answer, index) => (React.createElement(UndoHistoryEntry, { key: answer.answerTime.unix(), answerIndex: index, selected: index === this.state.selectedAnswerIndex, onChange: index => this.setState({ selectedAnswerIndex: index }), croppedAnswer: truncateAnswer(answer), minutesSinceAnswer: now.diff(answer.answerTime, 'minutes'), wordCount: countWords(answer), characterCount: countCharacters(answer), screenshotCount: countScreenshots(answer) })))),
148
- React.createElement("div", { className: "k-undo-view-right-panel" },
149
- React.createElement(AnswerDisplay, { selectedAnswer: selectedAnswer }),
150
- React.createElement(BottomBar, { selectedAnswer: selectedAnswer, selectedAnswerIndex: this.state.selectedAnswerIndex, restoreAnswer: this.props.restoreAnswer, questionId: this.props.questionId }))))))));
151
- }
152
- }
153
- const CloseButton = ({ close }) => {
154
- const { t } = useExamTranslation();
155
- return (React.createElement("div", null,
156
- React.createElement("img", { src: "img/closeButton.svg", id: "closeUndoDialogButton", className: "k-undo-view-close-overlay-button js-close-undo-dialog-button", onClick: close, tabIndex: 0, role: "button", "aria-label": t('undo.close') })));
157
- };
158
- const RestoreButtonLabel = () => {
159
- const { t } = useExamTranslation();
160
- return React.createElement("div", null, t('undo.restoreAnswer'));
161
- };
162
- //# sourceMappingURL=undo-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"undo-view.js","sourceRoot":"","sources":["../../../src/components/exam/undo-view.tsx"],"names":[],"mappings":"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"}