@cuemath/leap 3.1.7 → 3.1.8-aa1
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/dist/assets/illustrations/illustrations.js +1 -1
- package/dist/assets/illustrations/illustrations.js.map +1 -1
- package/dist/constants/country.js +994 -2
- package/dist/constants/country.js.map +1 -1
- package/dist/features/auth/account-selector/account-selector-styled.js +9 -0
- package/dist/features/auth/account-selector/account-selector-styled.js.map +1 -0
- package/dist/features/auth/account-selector/account-selector.js +60 -36
- package/dist/features/auth/account-selector/account-selector.js.map +1 -1
- package/dist/features/auth/comps/auth-page-layout/{auth-page-layout-styles.js → auth-page-layout-styled.js} +1 -1
- package/dist/features/auth/comps/auth-page-layout/{auth-page-layout-styles.js.map → auth-page-layout-styled.js.map} +1 -1
- package/dist/features/auth/comps/auth-page-layout/auth-page-layout.js +20 -9
- package/dist/features/auth/comps/auth-page-layout/auth-page-layout.js.map +1 -1
- package/dist/features/auth/comps/auth-static-panel/auth-static-panel.js +1 -1
- package/dist/features/auth/comps/auth-static-panel/auth-static-panel.js.map +1 -1
- package/dist/features/auth/forgot-password/forgot-password-styled.js +30 -4
- package/dist/features/auth/forgot-password/forgot-password-styled.js.map +1 -1
- package/dist/features/auth/forgot-password/otp-form/otp-form.js +27 -29
- package/dist/features/auth/forgot-password/otp-form/otp-form.js.map +1 -1
- package/dist/features/auth/forgot-password/reset-password-form/reset-password-form.js +22 -27
- package/dist/features/auth/forgot-password/reset-password-form/reset-password-form.js.map +1 -1
- package/dist/features/auth/forgot-password/user-identifier-form/user-identifier-form.js +25 -28
- package/dist/features/auth/forgot-password/user-identifier-form/user-identifier-form.js.map +1 -1
- package/dist/features/auth/login/identifier-otp-form/identifier-otp-form-styled.js +17 -4
- package/dist/features/auth/login/identifier-otp-form/identifier-otp-form-styled.js.map +1 -1
- package/dist/features/auth/login/identifier-otp-form/identifier-otp-form.js +88 -79
- package/dist/features/auth/login/identifier-otp-form/identifier-otp-form.js.map +1 -1
- package/dist/features/auth/login/login-styled.js +26 -0
- package/dist/features/auth/login/login-styled.js.map +1 -0
- package/dist/features/auth/login/social-account-not-found/social-account-not-found.js +27 -21
- package/dist/features/auth/login/social-account-not-found/social-account-not-found.js.map +1 -1
- package/dist/features/auth/login/social-login-methods/social-login-methods-styled.js +9 -0
- package/dist/features/auth/login/social-login-methods/social-login-methods-styled.js.map +1 -0
- package/dist/features/auth/login/social-login-methods/social-login-methods.js +43 -34
- package/dist/features/auth/login/social-login-methods/social-login-methods.js.map +1 -1
- package/dist/features/auth/login/username-password-form/username-password-form.js +68 -71
- package/dist/features/auth/login/username-password-form/username-password-form.js.map +1 -1
- package/dist/features/auth/signup/custom-input-field/country-selector/country-list-menu.js +1 -1
- package/dist/features/auth/signup/custom-input-field/country-selector/country-list-menu.js.map +1 -1
- package/dist/features/auth/signup/signup-constants.js +6 -998
- package/dist/features/auth/signup/signup-constants.js.map +1 -1
- package/dist/features/auth/user-list/user-item/user-item.js +33 -32
- package/dist/features/auth/user-list/user-item/user-item.js.map +1 -1
- package/dist/features/auth/user-list/user-list.js +60 -51
- package/dist/features/auth/user-list/user-list.js.map +1 -1
- package/dist/features/cue-canvas/cue-canvas-provider.js +17 -18
- package/dist/features/cue-canvas/cue-canvas-provider.js.map +1 -1
- package/dist/features/cue-canvas/toolbar/toolbar.js +16 -16
- package/dist/features/cue-canvas/toolbar/toolbar.js.map +1 -1
- package/dist/features/hooks/use-viewport/use-viewport.js +21 -0
- package/dist/features/hooks/use-viewport/use-viewport.js.map +1 -0
- package/dist/features/ui/buttons/button/button-styled.js +29 -29
- package/dist/features/ui/buttons/button/button-styled.js.map +1 -1
- package/dist/features/utils/media.js +16 -0
- package/dist/features/utils/media.js.map +1 -0
- package/dist/features/worksheet/worksheet/worksheet-container.js +32 -32
- package/dist/features/worksheet/worksheet/worksheet-container.js.map +1 -1
- package/dist/features/worksheet/worksheet/worksheet-question/subjective-feedback.js +60 -60
- package/dist/features/worksheet/worksheet/worksheet-question/subjective-feedback.js.map +1 -1
- package/dist/index.d.ts +23 -19
- package/dist/index.js +56 -52
- package/dist/index.js.map +1 -1
- package/dist/static/cuemath-app-qr-code.7205ee79.svg +1 -0
- package/package.json +1 -1
@@ -1,16 +1,16 @@
|
|
1
1
|
import u from "styled-components";
|
2
2
|
import x from "../../text/text.js";
|
3
|
-
const
|
4
|
-
({ theme: c, $width:
|
5
|
-
const { button: b, colors: r, layout: p } = c, { backgroundColorName:
|
3
|
+
const s = u.button(
|
4
|
+
({ theme: c, $width: t, $widthX: i, $alignSelf: o, $justifyContent: e, $renderAs: a, $size: n, $shape: $ }) => {
|
5
|
+
const { button: b, colors: r, layout: p } = c, { backgroundColorName: d, borderColorName: l } = b.variants[a], { height: v, paddingHorizontal: g, borderWidth: h } = b.sizes[n];
|
6
6
|
return `
|
7
7
|
position: relative;
|
8
8
|
display: flex;
|
9
|
-
justify-content: ${
|
9
|
+
justify-content: ${e};
|
10
10
|
align-items: center;
|
11
11
|
${o ? `align-self: ${o};` : ""}
|
12
12
|
|
13
|
-
width: ${
|
13
|
+
width: ${t ? `${t}` : "auto"}${typeof t == "number" ? "px" : ""};
|
14
14
|
${i ? `width: ${i * p.gutter}px;` : ""}
|
15
15
|
height: ${v}px;
|
16
16
|
padding: 0 ${g}px;
|
@@ -19,56 +19,56 @@ const d = u.button(
|
|
19
19
|
border-radius: ${$ === "curved" ? v / 2 : 0}px;
|
20
20
|
outline: none;
|
21
21
|
|
22
|
-
background-color: ${r[
|
22
|
+
background-color: ${r[d.inactive]};
|
23
23
|
border-color: ${r[l.inactive]};
|
24
24
|
|
25
25
|
transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out;
|
26
26
|
cursor: pointer;
|
27
27
|
|
28
28
|
&:hover {
|
29
|
-
background-color: ${r[
|
29
|
+
background-color: ${r[d.active]};
|
30
30
|
border-color: ${r[l.active]};
|
31
31
|
}
|
32
32
|
|
33
33
|
&:active {
|
34
|
-
background: ${r[
|
34
|
+
background: ${r[d.inactive]};
|
35
35
|
border-color: ${r[l.inactive]};
|
36
36
|
}
|
37
37
|
|
38
38
|
&[data-busy="true"] {
|
39
39
|
cursor: wait;
|
40
|
-
background-color: ${r[
|
40
|
+
background-color: ${r[d.active]};
|
41
41
|
border-color: ${r[l.active]};
|
42
42
|
}
|
43
43
|
|
44
44
|
&:disabled {
|
45
|
-
background-color: ${r[
|
45
|
+
background-color: ${r[d.disabled]};
|
46
46
|
border-color: ${r[l.disabled]};
|
47
47
|
cursor: not-allowed;
|
48
48
|
}
|
49
49
|
`;
|
50
50
|
}
|
51
|
-
),
|
52
|
-
const { button: i, colors: o } = c, { colorName:
|
51
|
+
), f = u(x)(({ theme: c, $buttonRenderAs: t }) => {
|
52
|
+
const { button: i, colors: o } = c, { colorName: e } = i.variants[t];
|
53
53
|
return `
|
54
|
-
color: ${o[
|
54
|
+
color: ${o[e.inactive]};
|
55
55
|
transition: color 0.2s ease-in-out;
|
56
56
|
|
57
|
-
${
|
58
|
-
color: ${o[
|
57
|
+
${s}:hover & {
|
58
|
+
color: ${o[e.active]};
|
59
59
|
}
|
60
60
|
|
61
|
-
${
|
62
|
-
color: ${o[
|
61
|
+
${s}:active & {
|
62
|
+
color: ${o[e.inactive]};
|
63
63
|
}
|
64
64
|
|
65
|
-
${
|
66
|
-
color: ${o[
|
65
|
+
${s}:disabled & {
|
66
|
+
color: ${o[e.disabled]};
|
67
67
|
opacity: 0.5;
|
68
68
|
}
|
69
69
|
`;
|
70
|
-
}),
|
71
|
-
const { button:
|
70
|
+
}), k = u.div(({ theme: c, $buttonRenderAs: t, $size: i, $iconPosition: o }) => {
|
71
|
+
const { button: e, colors: a } = c, { colorName: n } = e.variants[t], { iconSize: $, iconPadding: b } = e.sizes[i];
|
72
72
|
return `
|
73
73
|
${o === "left" ? "padding-right" : "padding-left"}: ${b}px;
|
74
74
|
order: ${o === "left" ? -1 : 1};
|
@@ -80,31 +80,31 @@ const d = u.button(
|
|
80
80
|
color: ${a[n.inactive]};
|
81
81
|
transition: color 0.2s ease-in-out;
|
82
82
|
|
83
|
-
${
|
83
|
+
${s}:hover & {
|
84
84
|
color: ${a[n.active]};
|
85
85
|
}
|
86
86
|
|
87
|
-
${
|
87
|
+
${s}:active & {
|
88
88
|
color: ${a[n.inactive]};
|
89
89
|
}
|
90
90
|
|
91
|
-
${
|
91
|
+
${s}:disabled & {
|
92
92
|
color: ${a[n.disabled]};
|
93
93
|
opacity: 0.5;
|
94
94
|
}
|
95
95
|
}
|
96
96
|
`;
|
97
|
-
}), z = u.img(({ theme: c, $size:
|
98
|
-
const { button: i } = c, { loaderSize: o } = i.sizes[
|
97
|
+
}), z = u.img(({ theme: c, $size: t }) => {
|
98
|
+
const { button: i } = c, { loaderSize: o } = i.sizes[t];
|
99
99
|
return `
|
100
100
|
width: ${o}px;
|
101
101
|
height: ${o}px;
|
102
102
|
`;
|
103
103
|
});
|
104
104
|
export {
|
105
|
-
|
106
|
-
|
107
|
-
|
105
|
+
s as Button,
|
106
|
+
k as Icon,
|
107
|
+
f as Label,
|
108
108
|
z as Loader
|
109
109
|
};
|
110
110
|
//# sourceMappingURL=button-styled.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"button-styled.js","sources":["../../../../../src/features/ui/buttons/button/button-styled.tsx"],"sourcesContent":["import type { IButtonProps } from './button-types';\n\nimport styled from 'styled-components';\n\nimport Text from '../../text/text';\n\ninterface IStyledButtonProps {\n $width: IButtonProps['width'];\n $widthX: IButtonProps['widthX'];\n $alignSelf: IButtonProps['alignSelf'];\n $renderAs: IButtonProps['renderAs'];\n $size: Required<IButtonProps>['size'];\n $shape: Required<IButtonProps>['shape'];\n $justifyContent: IButtonProps['justifyContent'];\n}\n\nconst Button = styled.button<IStyledButtonProps>(\n ({ theme, $width, $widthX, $alignSelf, $justifyContent, $renderAs, $size, $shape }) => {\n const { button, colors, layout } = theme;\n const { backgroundColorName, borderColorName } = button.variants[$renderAs];\n const { height, paddingHorizontal, borderWidth } = button.sizes[$size];\n\n return `\n position: relative;\n display: flex;\n justify-content: ${$justifyContent};\n align-items: center;\n ${$alignSelf ? `align-self: ${$alignSelf};` : ''}\n \n width: ${$width ? `${$width}
|
1
|
+
{"version":3,"file":"button-styled.js","sources":["../../../../../src/features/ui/buttons/button/button-styled.tsx"],"sourcesContent":["import type { IButtonProps } from './button-types';\n\nimport styled from 'styled-components';\n\nimport Text from '../../text/text';\n\ninterface IStyledButtonProps {\n $width: IButtonProps['width'];\n $widthX: IButtonProps['widthX'];\n $alignSelf: IButtonProps['alignSelf'];\n $renderAs: IButtonProps['renderAs'];\n $size: Required<IButtonProps>['size'];\n $shape: Required<IButtonProps>['shape'];\n $justifyContent: IButtonProps['justifyContent'];\n}\n\nconst Button = styled.button<IStyledButtonProps>(\n ({ theme, $width, $widthX, $alignSelf, $justifyContent, $renderAs, $size, $shape }) => {\n const { button, colors, layout } = theme;\n const { backgroundColorName, borderColorName } = button.variants[$renderAs];\n const { height, paddingHorizontal, borderWidth } = button.sizes[$size];\n\n return `\n position: relative;\n display: flex;\n justify-content: ${$justifyContent};\n align-items: center;\n ${$alignSelf ? `align-self: ${$alignSelf};` : ''}\n \n width: ${$width ? `${$width}` : 'auto'}${typeof $width === 'number' ? 'px' : ''};\n ${$widthX ? `width: ${$widthX * layout.gutter}px;` : ''}\n height: ${height}px;\n padding: 0 ${paddingHorizontal}px;\n border-width: ${borderWidth}px;\n border-style: solid;\n border-radius: ${$shape === 'curved' ? height / 2 : 0}px;\n outline: none;\n\n background-color: ${colors[backgroundColorName.inactive]};\n border-color: ${colors[borderColorName.inactive]};\n \n transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out;\n cursor: pointer;\n\n &:hover {\n background-color: ${colors[backgroundColorName.active]};\n border-color: ${colors[borderColorName.active]};\n }\n\n &:active {\n background: ${colors[backgroundColorName.inactive]};\n border-color: ${colors[borderColorName.inactive]};\n }\n\n &[data-busy=\"true\"] {\n cursor: wait;\n background-color: ${colors[backgroundColorName.active]};\n border-color: ${colors[borderColorName.active]};\n }\n\n &:disabled {\n background-color: ${colors[backgroundColorName.disabled]};\n border-color: ${colors[borderColorName.disabled]};\n cursor: not-allowed;\n }\n `;\n },\n);\n\ninterface IStyledTextProps {\n $buttonRenderAs: IButtonProps['renderAs'];\n}\n\nconst Label = styled(Text)<IStyledTextProps>(({ theme, $buttonRenderAs }) => {\n const { button, colors } = theme;\n const { colorName } = button.variants[$buttonRenderAs];\n\n return `\n color: ${colors[colorName.inactive]};\n transition: color 0.2s ease-in-out;\n\n ${Button}:hover & {\n color: ${colors[colorName.active]};\n }\n \n ${Button}:active & {\n color: ${colors[colorName.inactive]};\n }\n\n ${Button}:disabled & {\n color: ${colors[colorName.disabled]};\n opacity: 0.5;\n }\n `;\n});\n\ninterface IStyledIconProps {\n $size: NonNullable<IButtonProps['size']>;\n $iconPosition: NonNullable<IButtonProps['iconPosition']>;\n $buttonRenderAs: IButtonProps['renderAs'];\n}\n\nconst Icon = styled.div<IStyledIconProps>(({ theme, $buttonRenderAs, $size, $iconPosition }) => {\n const { button, colors } = theme;\n const { colorName } = button.variants[$buttonRenderAs];\n const { iconSize, iconPadding } = button.sizes[$size];\n\n return `\n ${$iconPosition === 'left' ? 'padding-right' : 'padding-left'}: ${iconPadding}px;\n order: ${$iconPosition === 'left' ? -1 : 1};\n \n & svg {\n display: block;\n width: ${iconSize}px;\n height: ${iconSize}px;\n color: ${colors[colorName.inactive]};\n transition: color 0.2s ease-in-out;\n\n ${Button}:hover & {\n color: ${colors[colorName.active]};\n }\n\n ${Button}:active & {\n color: ${colors[colorName.inactive]};\n }\n\n ${Button}:disabled & {\n color: ${colors[colorName.disabled]};\n opacity: 0.5;\n }\n }\n `;\n});\n\ninterface IStyledLoaderProps {\n $size: Required<IButtonProps>['size'];\n}\n\nconst Loader = styled.img<IStyledLoaderProps>(({ theme, $size }) => {\n const { button } = theme;\n const { loaderSize } = button.sizes[$size];\n\n return `\n width: ${loaderSize}px;\n height: ${loaderSize}px;\n `;\n});\n\nexport { Button, Label, Icon, Loader };\n"],"names":["Button","styled","theme","$width","$widthX","$alignSelf","$justifyContent","$renderAs","$size","$shape","button","colors","layout","backgroundColorName","borderColorName","height","paddingHorizontal","borderWidth","Label","Text","$buttonRenderAs","colorName","Icon","$iconPosition","iconSize","iconPadding","Loader","loaderSize"],"mappings":"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"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
const e = {
|
2
|
+
mobile: 480,
|
3
|
+
tablet: 760,
|
4
|
+
desktop: 920,
|
5
|
+
large: 1200,
|
6
|
+
xl: 1424
|
7
|
+
}, l = (r) => r < e.mobile || r >= e.mobile && r < e.tablet ? "mobile" : r >= e.tablet && r < e.desktop ? "tablet" : r >= e.desktop && r < e.large ? "desktop" : r >= e.large && r < e.xl ? "large" : (r >= e.xl, "xl"), t = {
|
8
|
+
minDesktop: `@media (min-width: ${e.desktop}px)`,
|
9
|
+
minLarge: `@media (min-width: ${e.large}px)`
|
10
|
+
};
|
11
|
+
export {
|
12
|
+
e as BREAKPOINTS,
|
13
|
+
l as getDeviceType,
|
14
|
+
t as media
|
15
|
+
};
|
16
|
+
//# sourceMappingURL=media.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"media.js","sources":["../../../src/features/utils/media.ts"],"sourcesContent":["export const BREAKPOINTS = {\n mobile: 480,\n tablet: 760,\n desktop: 920,\n large: 1200,\n xl: 1424,\n};\nexport type TDeviceType = 'mobile' | 'tablet' | 'desktop' | 'large' | 'xl';\n\nexport const getDeviceType = (width: number): TDeviceType => {\n if (width < BREAKPOINTS.mobile) return 'mobile';\n\n if (width >= BREAKPOINTS.mobile && width < BREAKPOINTS.tablet) return 'mobile';\n\n if (width >= BREAKPOINTS.tablet && width < BREAKPOINTS.desktop) return 'tablet';\n\n if (width >= BREAKPOINTS.desktop && width < BREAKPOINTS.large) return 'desktop';\n\n if (width >= BREAKPOINTS.large && width < BREAKPOINTS.xl) return 'large';\n\n if (width >= BREAKPOINTS.xl) return 'xl';\n\n return 'xl';\n};\n\nexport const media = {\n minDesktop: `@media (min-width: ${BREAKPOINTS.desktop}px)`,\n minLarge: `@media (min-width: ${BREAKPOINTS.large}px)`,\n};\n"],"names":["BREAKPOINTS","getDeviceType","width","media"],"mappings":"AAAO,MAAMA,IAAc;AAAA,EACzB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,IAAI;AACN,GAGaC,IAAgB,CAACC,MACxBA,IAAQF,EAAY,UAEpBE,KAASF,EAAY,UAAUE,IAAQF,EAAY,SAAe,WAElEE,KAASF,EAAY,UAAUE,IAAQF,EAAY,UAAgB,WAEnEE,KAASF,EAAY,WAAWE,IAAQF,EAAY,QAAc,YAElEE,KAASF,EAAY,SAASE,IAAQF,EAAY,KAAW,WAE7DE,KAASF,EAAY,IAAW,OAKzBG,IAAQ;AAAA,EACnB,YAAY,sBAAsBH,EAAY,OAAO;AAAA,EACrD,UAAU,sBAAsBA,EAAY,KAAK;AACnD;"}
|
@@ -1,25 +1,25 @@
|
|
1
|
-
import { jsx as
|
1
|
+
import { jsx as d } from "react/jsx-runtime";
|
2
2
|
import { memo as W, forwardRef as S, useCallback as q, useEffect as m } from "react";
|
3
|
-
import
|
4
|
-
import
|
5
|
-
import
|
6
|
-
import
|
7
|
-
import
|
8
|
-
const
|
3
|
+
import L from "../../cue-canvas/cue-canvas-provider.js";
|
4
|
+
import v from "../constants/events.js";
|
5
|
+
import I from "./hooks/use-learnosity.js";
|
6
|
+
import T from "./hooks/use-worksheet-data-helper.js";
|
7
|
+
import w from "./worksheet.js";
|
8
|
+
const x = (f, u) => {
|
9
9
|
const {
|
10
|
-
attemptId:
|
11
|
-
itemsSignedRequest:
|
12
|
-
questionsSignedRequest:
|
10
|
+
attemptId: l,
|
11
|
+
itemsSignedRequest: R,
|
12
|
+
questionsSignedRequest: p,
|
13
13
|
onLoaded: r,
|
14
14
|
onErrored: t,
|
15
15
|
onResponsesLoaded: a,
|
16
|
-
loggerRef:
|
17
|
-
userType:
|
16
|
+
loggerRef: o,
|
17
|
+
userType: g,
|
18
18
|
...E
|
19
|
-
} =
|
20
|
-
attemptId:
|
21
|
-
signedRequest:
|
22
|
-
loggerRef:
|
19
|
+
} = f, { loadingState: s, learnosityActivityRef: h, data: e, error: c } = T({
|
20
|
+
attemptId: l,
|
21
|
+
signedRequest: R,
|
22
|
+
loggerRef: o
|
23
23
|
}), y = q(
|
24
24
|
(i) => {
|
25
25
|
t({
|
@@ -28,39 +28,39 @@ const w = (u, l) => {
|
|
28
28
|
});
|
29
29
|
},
|
30
30
|
[t]
|
31
|
-
), { learnosity: n, appendedQuestionIds: k } =
|
32
|
-
|
31
|
+
), { learnosity: n, appendedQuestionIds: k } = I(
|
32
|
+
p,
|
33
33
|
y,
|
34
|
-
|
34
|
+
o
|
35
35
|
);
|
36
36
|
if (m(() => {
|
37
|
-
|
38
|
-
message:
|
37
|
+
s === "error" && t({
|
38
|
+
message: c ?? "Error loading worksheet"
|
39
39
|
});
|
40
|
-
}, [
|
41
|
-
n &&
|
42
|
-
}, [n,
|
40
|
+
}, [s, c, r, t]), m(() => {
|
41
|
+
n && s === "success" && r && (o.current(v.WORKSHEET_V3_READY), r());
|
42
|
+
}, [n, s, o, r]), m(() => {
|
43
43
|
e != null && e.responses && a && a(e.responses ?? {});
|
44
|
-
}, [e == null ? void 0 : e.responses, a]),
|
44
|
+
}, [e == null ? void 0 : e.responses, a]), s === "success" && e && n) {
|
45
45
|
const { learnosityItems: i, responses: C } = e;
|
46
|
-
return /* @__PURE__ */
|
47
|
-
|
46
|
+
return /* @__PURE__ */ d(L, { children: /* @__PURE__ */ d(
|
47
|
+
w,
|
48
48
|
{
|
49
|
-
ref:
|
50
|
-
questionsSignedRequest:
|
49
|
+
ref: u,
|
50
|
+
questionsSignedRequest: p,
|
51
51
|
learnosity: n,
|
52
52
|
appendedQuestionIds: k,
|
53
53
|
learnosityActivityRef: h,
|
54
54
|
learnosityItems: i,
|
55
55
|
learnosityResponses: C,
|
56
|
-
loggerRef:
|
57
|
-
userType:
|
56
|
+
loggerRef: o,
|
57
|
+
userType: g,
|
58
58
|
...E
|
59
59
|
}
|
60
60
|
) });
|
61
61
|
}
|
62
62
|
return null;
|
63
|
-
},
|
63
|
+
}, A = W(S(x)), N = A;
|
64
64
|
export {
|
65
65
|
N as default
|
66
66
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"worksheet-container.js","sources":["../../../../src/features/worksheet/worksheet/worksheet-container.tsx"],"sourcesContent":["import type { IWorksheetRef } from './worksheet-types';\nimport type { ForwardRefRenderFunction } from 'react';\n\nimport { forwardRef, memo, useCallback, useEffect } from 'react';\n\nimport CueCanvasProvider from '../../cue-canvas/cue-canvas-provider';\nimport EVENTS from '../constants/events';\nimport useLearnosity from './hooks/use-learnosity';\nimport useWorksheetDataHelper from './hooks/use-worksheet-data-helper';\nimport Worksheet from './worksheet';\nimport { type ILearnosityError, type IWorksheetContainerProps } from './worksheet-types';\n\nconst WorksheetContainerComp: ForwardRefRenderFunction<IWorksheetRef, IWorksheetContainerProps> = (\n props,\n ref,\n) => {\n const {\n attemptId,\n itemsSignedRequest,\n questionsSignedRequest,\n onLoaded,\n onErrored,\n onResponsesLoaded,\n loggerRef,\n userType,\n ...other\n } = props;\n\n const { loadingState, learnosityActivityRef, data, error } = useWorksheetDataHelper({\n attemptId,\n signedRequest: itemsSignedRequest,\n loggerRef,\n });\n\n const onLearnosityErrored = useCallback(\n (err: ILearnosityError) => {\n onErrored({\n code: err.code,\n message: err.detail,\n });\n },\n [onErrored],\n );\n\n const { learnosity, appendedQuestionIds } = useLearnosity(\n questionsSignedRequest,\n onLearnosityErrored,\n loggerRef,\n );\n\n useEffect(() => {\n if (loadingState === 'error') {\n onErrored({\n message: error ?? 'Error loading worksheet',\n });\n }\n }, [loadingState, error, onLoaded, onErrored]);\n\n useEffect(() => {\n if (learnosity && loadingState === 'success' && onLoaded) {\n loggerRef.current(EVENTS.WORKSHEET_V3_READY);\n onLoaded();\n }\n }, [learnosity, loadingState, loggerRef, onLoaded]);\n\n useEffect(() => {\n if (data?.responses && onResponsesLoaded) {\n onResponsesLoaded(data.responses ?? {});\n }\n }, [data?.responses, onResponsesLoaded]);\n\n if (loadingState === 'success' && data && learnosity) {\n const { learnosityItems, responses } = data;\n\n return (\n <CueCanvasProvider
|
1
|
+
{"version":3,"file":"worksheet-container.js","sources":["../../../../src/features/worksheet/worksheet/worksheet-container.tsx"],"sourcesContent":["import type { IWorksheetRef } from './worksheet-types';\nimport type { ForwardRefRenderFunction } from 'react';\n\nimport { forwardRef, memo, useCallback, useEffect } from 'react';\n\nimport CueCanvasProvider from '../../cue-canvas/cue-canvas-provider';\nimport EVENTS from '../constants/events';\nimport useLearnosity from './hooks/use-learnosity';\nimport useWorksheetDataHelper from './hooks/use-worksheet-data-helper';\nimport Worksheet from './worksheet';\nimport { type ILearnosityError, type IWorksheetContainerProps } from './worksheet-types';\n\nconst WorksheetContainerComp: ForwardRefRenderFunction<IWorksheetRef, IWorksheetContainerProps> = (\n props,\n ref,\n) => {\n const {\n attemptId,\n itemsSignedRequest,\n questionsSignedRequest,\n onLoaded,\n onErrored,\n onResponsesLoaded,\n loggerRef,\n userType,\n ...other\n } = props;\n\n const { loadingState, learnosityActivityRef, data, error } = useWorksheetDataHelper({\n attemptId,\n signedRequest: itemsSignedRequest,\n loggerRef,\n });\n\n const onLearnosityErrored = useCallback(\n (err: ILearnosityError) => {\n onErrored({\n code: err.code,\n message: err.detail,\n });\n },\n [onErrored],\n );\n\n const { learnosity, appendedQuestionIds } = useLearnosity(\n questionsSignedRequest,\n onLearnosityErrored,\n loggerRef,\n );\n\n useEffect(() => {\n if (loadingState === 'error') {\n onErrored({\n message: error ?? 'Error loading worksheet',\n });\n }\n }, [loadingState, error, onLoaded, onErrored]);\n\n useEffect(() => {\n if (learnosity && loadingState === 'success' && onLoaded) {\n loggerRef.current(EVENTS.WORKSHEET_V3_READY);\n onLoaded();\n }\n }, [learnosity, loadingState, loggerRef, onLoaded]);\n\n useEffect(() => {\n if (data?.responses && onResponsesLoaded) {\n onResponsesLoaded(data.responses ?? {});\n }\n }, [data?.responses, onResponsesLoaded]);\n\n if (loadingState === 'success' && data && learnosity) {\n const { learnosityItems, responses } = data;\n\n return (\n <CueCanvasProvider>\n <Worksheet\n ref={ref}\n questionsSignedRequest={questionsSignedRequest}\n learnosity={learnosity}\n appendedQuestionIds={appendedQuestionIds}\n learnosityActivityRef={learnosityActivityRef}\n learnosityItems={learnosityItems}\n learnosityResponses={responses}\n loggerRef={loggerRef}\n userType={userType}\n {...other}\n />\n </CueCanvasProvider>\n );\n }\n\n return null;\n};\n\nconst WorksheetContainer = memo(forwardRef(WorksheetContainerComp));\n\nexport default WorksheetContainer;\n"],"names":["WorksheetContainerComp","props","ref","attemptId","itemsSignedRequest","questionsSignedRequest","onLoaded","onErrored","onResponsesLoaded","loggerRef","userType","other","loadingState","learnosityActivityRef","data","error","useWorksheetDataHelper","onLearnosityErrored","useCallback","err","learnosity","appendedQuestionIds","useLearnosity","useEffect","EVENTS","learnosityItems","responses","CueCanvasProvider","jsx","Worksheet","WorksheetContainer","memo","forwardRef","WorksheetContainer$1"],"mappings":";;;;;;;AAYA,MAAMA,IAA4F,CAChGC,GACAC,MACG;AACG,QAAA;AAAA,IACJ,WAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EACD,IAAAV,GAEE,EAAE,cAAAW,GAAc,uBAAAC,GAAuB,MAAAC,GAAM,OAAAC,EAAA,IAAUC,EAAuB;AAAA,IAClF,WAAAb;AAAA,IACA,eAAeC;AAAA,IACf,WAAAK;AAAA,EAAA,CACD,GAEKQ,IAAsBC;AAAA,IAC1B,CAACC,MAA0B;AACf,MAAAZ,EAAA;AAAA,QACR,MAAMY,EAAI;AAAA,QACV,SAASA,EAAI;AAAA,MAAA,CACd;AAAA,IACH;AAAA,IACA,CAACZ,CAAS;AAAA,EAAA,GAGN,EAAE,YAAAa,GAAY,qBAAAC,EAAA,IAAwBC;AAAA,IAC1CjB;AAAA,IACAY;AAAA,IACAR;AAAA,EAAA;AAwBE,MArBJc,EAAU,MAAM;AACd,IAAIX,MAAiB,WACTL,EAAA;AAAA,MACR,SAASQ,KAAS;AAAA,IAAA,CACnB;AAAA,KAEF,CAACH,GAAcG,GAAOT,GAAUC,CAAS,CAAC,GAE7CgB,EAAU,MAAM;AACV,IAAAH,KAAcR,MAAiB,aAAaN,MACpCG,EAAA,QAAQe,EAAO,kBAAkB,GAClClB;KAEV,CAACc,GAAYR,GAAcH,GAAWH,CAAQ,CAAC,GAElDiB,EAAU,MAAM;AACV,IAAAT,KAAA,QAAAA,EAAM,aAAaN,KACHA,EAAAM,EAAK,aAAa,CAAA,CAAE;AAAA,EAEvC,GAAA,CAACA,KAAA,gBAAAA,EAAM,WAAWN,CAAiB,CAAC,GAEnCI,MAAiB,aAAaE,KAAQM,GAAY;AAC9C,UAAA,EAAE,iBAAAK,GAAiB,WAAAC,EAAc,IAAAZ;AAEvC,6BACGa,GACC,EAAA,UAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAA3B;AAAA,QACA,wBAAAG;AAAA,QACA,YAAAe;AAAA,QACA,qBAAAC;AAAA,QACA,uBAAAR;AAAA,QACA,iBAAAY;AAAA,QACA,qBAAqBC;AAAA,QACrB,WAAAjB;AAAA,QACA,UAAAC;AAAA,QACC,GAAGC;AAAA,MAAA;AAAA,IAER,EAAA,CAAA;AAAA,EAEJ;AAEO,SAAA;AACT,GAEMmB,IAAqBC,EAAKC,EAAWhC,CAAsB,CAAC,GAElEiC,IAAeH;"}
|
@@ -1,109 +1,109 @@
|
|
1
1
|
import { jsx as e, jsxs as l, Fragment as M } from "react/jsx-runtime";
|
2
2
|
import { h as ee } from "../../../../node_modules/humanize-plus/dist/humanize.js";
|
3
|
-
import { memo as te, useState as
|
3
|
+
import { memo as te, useState as y, useMemo as A, useCallback as s } from "react";
|
4
4
|
import re from "../../../../assets/line-icons/icons/down.js";
|
5
5
|
import ie from "../../../../assets/line-icons/icons/up.js";
|
6
|
-
import
|
7
|
-
import
|
6
|
+
import R from "../../../ui/buttons/button/button.js";
|
7
|
+
import D from "../../../ui/buttons/clickable/clickable.js";
|
8
8
|
import ce from "../../../ui/buttons/text-button/text-button.js";
|
9
9
|
import m from "../../../ui/layout/flex-view.js";
|
10
10
|
import u from "../../../ui/separator/separator.js";
|
11
11
|
import f from "../../../ui/text/text.js";
|
12
|
-
import
|
13
|
-
import { TextArea as
|
14
|
-
const se = { type: "subjective_response" },
|
12
|
+
import oe from "../hooks/use-s3-helper.js";
|
13
|
+
import { TextArea as ne, FileInputLabel as le, FileInput as ae } from "./subjective-styled.js";
|
14
|
+
const se = { type: "subjective_response" }, Ie = te(
|
15
15
|
({
|
16
|
-
responses:
|
17
|
-
response:
|
18
|
-
nextQuestionId:
|
16
|
+
responses: S,
|
17
|
+
response: r,
|
18
|
+
nextQuestionId: x,
|
19
19
|
responseId: h,
|
20
|
-
studentId:
|
20
|
+
studentId: E,
|
21
21
|
onAddReviewComment: g,
|
22
22
|
openImagesReviewModal: b,
|
23
|
-
handleReviewSubmit:
|
24
|
-
isSubmittingReview:
|
23
|
+
handleReviewSubmit: L,
|
24
|
+
isSubmittingReview: z
|
25
25
|
}) => {
|
26
|
-
var
|
27
|
-
const { score:
|
28
|
-
((
|
29
|
-
),
|
30
|
-
var t,
|
31
|
-
return ((t =
|
32
|
-
}, [d,
|
33
|
-
var
|
34
|
-
if (!
|
26
|
+
var F, T;
|
27
|
+
const { score: B } = r ?? {}, { max_score: $, score: H } = B ?? {}, O = (r == null ? void 0 : r.response) !== void 0, [d, _] = y(((F = r == null ? void 0 : r.teacherReview) == null ? void 0 : F.reviewComment) ?? ""), [q, j] = y(!1), [c, U] = y(H ?? 0), [o, C] = y(
|
28
|
+
((T = r == null ? void 0 : r.teacherReview) == null ? void 0 : T.images) ?? []
|
29
|
+
), v = o.length, K = A(() => {
|
30
|
+
var t, i, n;
|
31
|
+
return ((t = r == null ? void 0 : r.teacherReview) == null ? void 0 : t.reviewComment) === d && ((i = r.teacherReview.images) == null ? void 0 : i.length) === o.length && ((n = r.score) == null ? void 0 : n.score) === c;
|
32
|
+
}, [d, r, c, o.length]), W = A(() => {
|
33
|
+
var i, n, a, p;
|
34
|
+
if (!S) return !1;
|
35
35
|
let t = !0;
|
36
|
-
for (const
|
37
|
-
const P = !!
|
36
|
+
for (const w of Object.values(S)) {
|
37
|
+
const P = !!w.response, Z = ((i = w.teacherReview) == null ? void 0 : i.images) && ((a = (n = w.teacherReview) == null ? void 0 : n.images) == null ? void 0 : a.length) > 0 || !!((p = w.teacherReview) != null && p.reviewComment);
|
38
38
|
if (P && !Z) {
|
39
39
|
t = !1;
|
40
40
|
break;
|
41
41
|
}
|
42
42
|
}
|
43
43
|
return t;
|
44
|
-
}, [
|
45
|
-
studentId:
|
44
|
+
}, [S]), k = oe({
|
45
|
+
studentId: E,
|
46
46
|
query: se
|
47
47
|
}), N = s((t) => {
|
48
|
-
|
48
|
+
_(t.target.value);
|
49
49
|
}, []), Q = s(() => {
|
50
|
-
|
50
|
+
U(c + 0.5);
|
51
51
|
}, [c]), V = s(() => {
|
52
|
-
|
52
|
+
U(c - 0.5);
|
53
53
|
}, [c]), I = s(
|
54
54
|
(t) => {
|
55
|
-
|
56
|
-
const
|
57
|
-
t &&
|
55
|
+
j(!1);
|
56
|
+
const i = o.filter((a) => typeof a == "string"), n = t ? [...i, ...t] : i;
|
57
|
+
t && C(n), g == null || g(h, {
|
58
58
|
score: {
|
59
59
|
score: c,
|
60
|
-
max_score:
|
60
|
+
max_score: $
|
61
61
|
},
|
62
62
|
teacherReview: {
|
63
63
|
reviewComment: d,
|
64
|
-
images:
|
64
|
+
images: n
|
65
65
|
}
|
66
66
|
});
|
67
67
|
},
|
68
|
-
[d,
|
68
|
+
[d, $, g, h, c, o]
|
69
69
|
), Y = s(() => {
|
70
|
-
const t =
|
71
|
-
t.length > 0 ? (
|
70
|
+
const t = o.filter((i) => typeof i != "string");
|
71
|
+
t.length > 0 ? (j(!0), k({
|
72
72
|
fileKey: `subjective-responses/${h}/`,
|
73
73
|
onSuccess: I,
|
74
74
|
onError: () => {
|
75
75
|
},
|
76
76
|
images: t
|
77
77
|
})) : I();
|
78
|
-
}, [I, h,
|
78
|
+
}, [I, h, o, k]), X = s(
|
79
79
|
({ filteredImages: t }) => {
|
80
|
-
|
80
|
+
C(t);
|
81
81
|
},
|
82
82
|
[]
|
83
83
|
), G = s(() => {
|
84
|
-
const t =
|
84
|
+
const t = o.map((i) => typeof i == "string" ? i : i.url);
|
85
85
|
t && (b == null || b({
|
86
86
|
isReviewed: !1,
|
87
87
|
disableScoreForm: !1,
|
88
88
|
imageUrls: t,
|
89
|
-
filteredImageUrls:
|
90
|
-
uploadedImages:
|
89
|
+
filteredImageUrls: X,
|
90
|
+
uploadedImages: o
|
91
91
|
}));
|
92
|
-
}, [b,
|
93
|
-
const { files:
|
94
|
-
if (!
|
95
|
-
const
|
96
|
-
const
|
97
|
-
return { file: a, url:
|
92
|
+
}, [b, X, o]), J = s((t) => {
|
93
|
+
const { files: i } = t.currentTarget;
|
94
|
+
if (!i) return;
|
95
|
+
const n = Array.from(i).map((a) => {
|
96
|
+
const p = URL.createObjectURL(a);
|
97
|
+
return { file: a, url: p };
|
98
98
|
});
|
99
|
-
|
99
|
+
C((a) => [...a, ...n]);
|
100
100
|
}, []);
|
101
|
-
return
|
101
|
+
return r ? !O && x ? /* @__PURE__ */ e(f, { $renderAs: "body1", children: " The student did not attempt this questions." }) : /* @__PURE__ */ l(M, { children: [
|
102
102
|
/* @__PURE__ */ l(m, { $flexDirection: "row", $justifyContent: "space-between", children: [
|
103
103
|
/* @__PURE__ */ l(m, { children: [
|
104
104
|
/* @__PURE__ */ l(f, { $renderAs: "body3", children: [
|
105
105
|
"Score (out of ",
|
106
|
-
|
106
|
+
$,
|
107
107
|
")"
|
108
108
|
] }),
|
109
109
|
/* @__PURE__ */ e(u, { heightX: 1 }),
|
@@ -122,16 +122,16 @@ const se = { type: "subjective_response" }, xe = te(
|
|
122
122
|
),
|
123
123
|
/* @__PURE__ */ e(u, { width: 16 }),
|
124
124
|
/* @__PURE__ */ l(m, { $background: "WHITE", $gutterX: 0.5, $gapX: 0.5, children: [
|
125
|
-
/* @__PURE__ */ e(
|
125
|
+
/* @__PURE__ */ e(D, { label: "up", onClick: Q, disabled: c === $, children: /* @__PURE__ */ e(ie, {}) }),
|
126
126
|
/* @__PURE__ */ e(u, { height: 16 }),
|
127
|
-
/* @__PURE__ */ e(
|
127
|
+
/* @__PURE__ */ e(D, { label: "down", onClick: V, disabled: c === 0, children: /* @__PURE__ */ e(re, {}) })
|
128
128
|
] })
|
129
129
|
] })
|
130
130
|
] }),
|
131
131
|
/* @__PURE__ */ l(m, { children: [
|
132
132
|
/* @__PURE__ */ e(f, { $renderAs: "body1", children: "Comments" }),
|
133
133
|
/* @__PURE__ */ e(u, { heightX: 1 }),
|
134
|
-
/* @__PURE__ */ e(
|
134
|
+
/* @__PURE__ */ e(ne, { value: d, onChange: N })
|
135
135
|
] }),
|
136
136
|
/* @__PURE__ */ l(m, { $alignItems: "center", children: [
|
137
137
|
/* @__PURE__ */ l(f, { $renderAs: "body1", children: [
|
@@ -155,7 +155,7 @@ const se = { type: "subjective_response" }, xe = te(
|
|
155
155
|
ce,
|
156
156
|
{
|
157
157
|
onClick: G,
|
158
|
-
label:
|
158
|
+
label: v ? `${v} ${ee.pluralize(v, "file")}` : "No files"
|
159
159
|
}
|
160
160
|
)
|
161
161
|
] })
|
@@ -170,7 +170,7 @@ const se = { type: "subjective_response" }, xe = te(
|
|
170
170
|
$gapX: 1,
|
171
171
|
children: [
|
172
172
|
/* @__PURE__ */ e(
|
173
|
-
|
173
|
+
R,
|
174
174
|
{
|
175
175
|
widthX: 6,
|
176
176
|
renderAs: "secondary",
|
@@ -182,15 +182,15 @@ const se = { type: "subjective_response" }, xe = te(
|
|
182
182
|
}
|
183
183
|
),
|
184
184
|
/* @__PURE__ */ e(u, { width: 20 }),
|
185
|
-
!
|
186
|
-
|
185
|
+
!x && /* @__PURE__ */ e(
|
186
|
+
R,
|
187
187
|
{
|
188
188
|
widthX: 6,
|
189
189
|
renderAs: "secondary",
|
190
190
|
size: "small",
|
191
191
|
label: "Submit Review",
|
192
|
-
onClick:
|
193
|
-
busy:
|
192
|
+
onClick: L,
|
193
|
+
busy: z,
|
194
194
|
disabled: !W
|
195
195
|
}
|
196
196
|
)
|
@@ -201,6 +201,6 @@ const se = { type: "subjective_response" }, xe = te(
|
|
201
201
|
}
|
202
202
|
);
|
203
203
|
export {
|
204
|
-
|
204
|
+
Ie as default
|
205
205
|
};
|
206
206
|
//# sourceMappingURL=subjective-feedback.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"subjective-feedback.js","sources":["../../../../../src/features/worksheet/worksheet/worksheet-question/subjective-feedback.tsx"],"sourcesContent":["import type { ISubjectiveQuestionReviewProps, IFile } from './subjective-review';\nimport type { FC } from 'react';\n\nimport { pluralize } from 'humanize-plus';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport DownIcon from '../../../../assets/line-icons/icons/down';\nimport UpIcon from '../../../../assets/line-icons/icons/up';\nimport Button from '../../../ui/buttons/button/button';\nimport Clickable from '../../../ui/buttons/clickable/clickable';\nimport TextButton from '../../../ui/buttons/text-button/text-button';\nimport FlexView from '../../../ui/layout/flex-view';\nimport Separator from '../../../ui/separator/separator';\nimport Text from '../../../ui/text/text';\nimport useS3ImageUploadHelper from '../hooks/use-s3-helper';\nimport { TextArea, FileInput, FileInputLabel } from './subjective-styled';\n\nconst QUERY = { type: 'subjective_response' };\n\nconst SubjectiveQuestionFeedback: FC<ISubjectiveQuestionReviewProps> = memo(\n ({\n responses,\n response,\n nextQuestionId,\n responseId,\n studentId,\n onAddReviewComment,\n openImagesReviewModal,\n handleReviewSubmit,\n isSubmittingReview,\n }) => {\n const { score: responseScore } = response ?? {};\n const { max_score: maxScore, score } = responseScore ?? {};\n const isAttempted = responseScore && 'score' in responseScore && 'max_score' in responseScore;\n const [comment, setComment] = useState(response?.teacherReview?.reviewComment ?? '');\n const [isUploading, setIsUploading] = useState<boolean>(false);\n const [scored, setScored] = useState(score ?? 0.0);\n const [selectedImages, setSelectedImage] = useState<(string | IFile)[]>(\n response?.teacherReview?.images ?? [],\n );\n const noOfImages = selectedImages.length;\n const isSaveDisabled = useMemo(() => {\n if (\n response?.teacherReview?.reviewComment === comment &&\n response.teacherReview.images?.length === selectedImages.length &&\n response.score?.score === scored\n ) {\n return true;\n }\n\n return false;\n }, [comment, response, scored, selectedImages.length]);\n\n const canSubmitReview = useMemo(() => {\n if (!responses) return false;\n\n let canSubmit = true;\n\n for (const item of Object.values(responses)) {\n const currResponse = item.response;\n\n const isCurrItemAttempted = !!currResponse;\n const currentItemReviewed =\n (item.teacherReview?.images && item.teacherReview?.images?.length > 0) ||\n !!item.teacherReview?.reviewComment;\n\n if (isCurrItemAttempted && !currentItemReviewed) {\n canSubmit = false;\n break;\n }\n }\n\n return canSubmit;\n }, [responses]);\n\n const uploadImages = useS3ImageUploadHelper({\n studentId,\n query: QUERY,\n });\n\n const onCommentChange = useCallback((e: { target: { value: string } }) => {\n setComment(e.target.value);\n }, []);\n\n const onScoreUp = useCallback(() => {\n setScored(scored + 0.5);\n }, [scored]);\n\n const onScoreDown = useCallback(() => {\n setScored(scored - 0.5);\n }, [scored]);\n\n const onSuccess = useCallback(\n (images?: string[]) => {\n setIsUploading(false);\n const reponseImages = selectedImages.filter(item => typeof item === 'string');\n const allImages = images ? [...reponseImages, ...images] : reponseImages;\n\n if (images) {\n setSelectedImage(allImages);\n }\n onAddReviewComment?.(responseId, {\n score: {\n score: scored,\n max_score: maxScore as number,\n },\n teacherReview: {\n reviewComment: comment,\n images: allImages,\n },\n });\n },\n [comment, maxScore, onAddReviewComment, responseId, scored, selectedImages],\n );\n\n const handleSave = useCallback(() => {\n const imagesToUpload = selectedImages.filter(images => typeof images !== 'string');\n\n if (imagesToUpload.length > 0) {\n setIsUploading(true);\n uploadImages({\n fileKey: `subjective-responses/${responseId}/`,\n onSuccess: onSuccess,\n onError: () => {},\n images: imagesToUpload,\n });\n } else {\n onSuccess();\n }\n }, [onSuccess, responseId, selectedImages, uploadImages]);\n\n const updateImages = useCallback(\n ({ filteredImages }: { filteredImages: string[]; newImages: IFile[] }) => {\n setSelectedImage(filteredImages);\n },\n [],\n );\n\n const openImagesModal = useCallback(() => {\n const previewImages = selectedImages.map(item => {\n if (typeof item === 'string') return item;\n\n return item.url;\n });\n\n if (!previewImages) return;\n\n openImagesReviewModal?.({\n isReviewed: false,\n disableScoreForm: false,\n imageUrls: previewImages,\n filteredImageUrls: updateImages,\n uploadedImages: selectedImages,\n });\n }, [openImagesReviewModal, updateImages, selectedImages]);\n\n const onSelectImages = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.currentTarget;\n\n if (!files) return;\n\n const newFilesList = Array.from(files).map(file => {\n const url = URL.createObjectURL(file);\n\n return { file, url };\n });\n\n setSelectedImage(prevImages => [...prevImages, ...newFilesList]);\n }, []);\n\n if (!response) {\n return null;\n }\n\n if (!isAttempted && nextQuestionId) {\n return <Text $renderAs=\"body1\"> The student did not attempt this questions.</Text>;\n }\n\n return (\n <>\n <FlexView $flexDirection=\"row\" $justifyContent=\"space-between\">\n <FlexView>\n <Text $renderAs=\"body3\">Score (out of {maxScore})</Text>\n <Separator heightX={1} />\n <FlexView $flexDirection=\"row\" $gapX={0.5}>\n <FlexView\n $justifyContent=\"center\"\n $alignItems=\"center\"\n $borderColor=\"BLACK\"\n $width={50}\n $height={50}\n $background=\"WHITE\"\n >\n <Text $renderAs=\"body1\">{scored}</Text>\n </FlexView>\n <Separator width={16} />\n <FlexView $background=\"WHITE\" $gutterX={0.5} $gapX={0.5}>\n <Clickable label=\"up\" onClick={onScoreUp} disabled={scored === maxScore}>\n <UpIcon />\n </Clickable>\n <Separator height={16} />\n <Clickable label=\"down\" onClick={onScoreDown} disabled={scored === 0}>\n <DownIcon />\n </Clickable>\n </FlexView>\n </FlexView>\n </FlexView>\n <FlexView>\n <Text $renderAs=\"body1\">Comments</Text>\n <Separator heightX={1} />\n <TextArea value={comment} onChange={onCommentChange} />\n </FlexView>\n <FlexView $alignItems=\"center\">\n <Text $renderAs=\"body1\">\n Upload Images <small>(max 12)</small>\n </Text>\n <Separator heightX={1} />\n <FileInputLabel htmlFor={`files${responseId}`}>Browse</FileInputLabel>\n <Separator heightX={1} />\n <FileInput\n type=\"file\"\n accept=\".jpeg, .jpg, .png\"\n id={`files${responseId}`}\n multiple\n onChange={onSelectImages}\n />\n <TextButton\n onClick={openImagesModal}\n label={noOfImages ? `${noOfImages} ${pluralize(noOfImages, 'file')}` : 'No files'}\n />\n </FlexView>\n </FlexView>\n <FlexView\n $flexDirection=\"row\"\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $gutterX={1}\n $gapX={1}\n >\n <Button\n widthX={6}\n renderAs=\"secondary\"\n size=\"small\"\n label=\"Save\"\n onClick={handleSave}\n busy={isUploading}\n disabled={isSaveDisabled}\n />\n <Separator width={20} />\n {!nextQuestionId && (\n <Button\n widthX={6}\n renderAs=\"secondary\"\n size=\"small\"\n label=\"Submit Review\"\n onClick={handleReviewSubmit}\n busy={isSubmittingReview}\n disabled={!canSubmitReview}\n />\n )}\n </FlexView>\n </>\n );\n },\n);\n\nexport default SubjectiveQuestionFeedback;\n"],"names":["QUERY","SubjectiveQuestionFeedback","memo","responses","response","nextQuestionId","responseId","studentId","onAddReviewComment","openImagesReviewModal","handleReviewSubmit","isSubmittingReview","responseScore","maxScore","score","isAttempted","comment","setComment","useState","_a","isUploading","setIsUploading","scored","setScored","selectedImages","setSelectedImage","_b","noOfImages","isSaveDisabled","useMemo","_c","canSubmitReview","canSubmit","item","isCurrItemAttempted","currentItemReviewed","_d","uploadImages","useS3ImageUploadHelper","onCommentChange","useCallback","e","onScoreUp","onScoreDown","onSuccess","images","reponseImages","allImages","handleSave","imagesToUpload","updateImages","filteredImages","openImagesModal","previewImages","onSelectImages","files","newFilesList","file","url","prevImages","jsx","Text","jsxs","Fragment","FlexView","Separator","Clickable","UpIcon","DownIcon","TextArea","FileInputLabel","FileInput","TextButton","pluralize","Button"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"subjective-feedback.js","sources":["../../../../../src/features/worksheet/worksheet/worksheet-question/subjective-feedback.tsx"],"sourcesContent":["import type { ISubjectiveQuestionReviewProps, IFile } from './subjective-review';\nimport type { FC } from 'react';\n\nimport { pluralize } from 'humanize-plus';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport DownIcon from '../../../../assets/line-icons/icons/down';\nimport UpIcon from '../../../../assets/line-icons/icons/up';\nimport Button from '../../../ui/buttons/button/button';\nimport Clickable from '../../../ui/buttons/clickable/clickable';\nimport TextButton from '../../../ui/buttons/text-button/text-button';\nimport FlexView from '../../../ui/layout/flex-view';\nimport Separator from '../../../ui/separator/separator';\nimport Text from '../../../ui/text/text';\nimport useS3ImageUploadHelper from '../hooks/use-s3-helper';\nimport { TextArea, FileInput, FileInputLabel } from './subjective-styled';\n\nconst QUERY = { type: 'subjective_response' };\n\nconst SubjectiveQuestionFeedback: FC<ISubjectiveQuestionReviewProps> = memo(\n ({\n responses,\n response,\n nextQuestionId,\n responseId,\n studentId,\n onAddReviewComment,\n openImagesReviewModal,\n handleReviewSubmit,\n isSubmittingReview,\n }) => {\n const { score: responseScore } = response ?? {};\n const { max_score: maxScore, score } = responseScore ?? {};\n const isAttempted = response?.response !== undefined;\n const [comment, setComment] = useState(response?.teacherReview?.reviewComment ?? '');\n const [isUploading, setIsUploading] = useState<boolean>(false);\n const [scored, setScored] = useState(score ?? 0.0);\n const [selectedImages, setSelectedImage] = useState<(string | IFile)[]>(\n response?.teacherReview?.images ?? [],\n );\n const noOfImages = selectedImages.length;\n const isSaveDisabled = useMemo(() => {\n if (\n response?.teacherReview?.reviewComment === comment &&\n response.teacherReview.images?.length === selectedImages.length &&\n response.score?.score === scored\n ) {\n return true;\n }\n\n return false;\n }, [comment, response, scored, selectedImages.length]);\n\n const canSubmitReview = useMemo(() => {\n if (!responses) return false;\n\n let canSubmit = true;\n\n for (const item of Object.values(responses)) {\n const currResponse = item.response;\n\n const isCurrItemAttempted = !!currResponse;\n const currentItemReviewed =\n (item.teacherReview?.images && item.teacherReview?.images?.length > 0) ||\n !!item.teacherReview?.reviewComment;\n\n if (isCurrItemAttempted && !currentItemReviewed) {\n canSubmit = false;\n break;\n }\n }\n\n return canSubmit;\n }, [responses]);\n\n const uploadImages = useS3ImageUploadHelper({\n studentId,\n query: QUERY,\n });\n\n const onCommentChange = useCallback((e: { target: { value: string } }) => {\n setComment(e.target.value);\n }, []);\n\n const onScoreUp = useCallback(() => {\n setScored(scored + 0.5);\n }, [scored]);\n\n const onScoreDown = useCallback(() => {\n setScored(scored - 0.5);\n }, [scored]);\n\n const onSuccess = useCallback(\n (images?: string[]) => {\n setIsUploading(false);\n const reponseImages = selectedImages.filter(item => typeof item === 'string');\n const allImages = images ? [...reponseImages, ...images] : reponseImages;\n\n if (images) {\n setSelectedImage(allImages);\n }\n onAddReviewComment?.(responseId, {\n score: {\n score: scored,\n max_score: maxScore as number,\n },\n teacherReview: {\n reviewComment: comment,\n images: allImages,\n },\n });\n },\n [comment, maxScore, onAddReviewComment, responseId, scored, selectedImages],\n );\n\n const handleSave = useCallback(() => {\n const imagesToUpload = selectedImages.filter(images => typeof images !== 'string');\n\n if (imagesToUpload.length > 0) {\n setIsUploading(true);\n uploadImages({\n fileKey: `subjective-responses/${responseId}/`,\n onSuccess: onSuccess,\n onError: () => {},\n images: imagesToUpload,\n });\n } else {\n onSuccess();\n }\n }, [onSuccess, responseId, selectedImages, uploadImages]);\n\n const updateImages = useCallback(\n ({ filteredImages }: { filteredImages: string[]; newImages: IFile[] }) => {\n setSelectedImage(filteredImages);\n },\n [],\n );\n\n const openImagesModal = useCallback(() => {\n const previewImages = selectedImages.map(item => {\n if (typeof item === 'string') return item;\n\n return item.url;\n });\n\n if (!previewImages) return;\n\n openImagesReviewModal?.({\n isReviewed: false,\n disableScoreForm: false,\n imageUrls: previewImages,\n filteredImageUrls: updateImages,\n uploadedImages: selectedImages,\n });\n }, [openImagesReviewModal, updateImages, selectedImages]);\n\n const onSelectImages = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.currentTarget;\n\n if (!files) return;\n\n const newFilesList = Array.from(files).map(file => {\n const url = URL.createObjectURL(file);\n\n return { file, url };\n });\n\n setSelectedImage(prevImages => [...prevImages, ...newFilesList]);\n }, []);\n\n if (!response) {\n return null;\n }\n\n if (!isAttempted && nextQuestionId) {\n return <Text $renderAs=\"body1\"> The student did not attempt this questions.</Text>;\n }\n\n return (\n <>\n <FlexView $flexDirection=\"row\" $justifyContent=\"space-between\">\n <FlexView>\n <Text $renderAs=\"body3\">Score (out of {maxScore})</Text>\n <Separator heightX={1} />\n <FlexView $flexDirection=\"row\" $gapX={0.5}>\n <FlexView\n $justifyContent=\"center\"\n $alignItems=\"center\"\n $borderColor=\"BLACK\"\n $width={50}\n $height={50}\n $background=\"WHITE\"\n >\n <Text $renderAs=\"body1\">{scored}</Text>\n </FlexView>\n <Separator width={16} />\n <FlexView $background=\"WHITE\" $gutterX={0.5} $gapX={0.5}>\n <Clickable label=\"up\" onClick={onScoreUp} disabled={scored === maxScore}>\n <UpIcon />\n </Clickable>\n <Separator height={16} />\n <Clickable label=\"down\" onClick={onScoreDown} disabled={scored === 0}>\n <DownIcon />\n </Clickable>\n </FlexView>\n </FlexView>\n </FlexView>\n <FlexView>\n <Text $renderAs=\"body1\">Comments</Text>\n <Separator heightX={1} />\n <TextArea value={comment} onChange={onCommentChange} />\n </FlexView>\n <FlexView $alignItems=\"center\">\n <Text $renderAs=\"body1\">\n Upload Images <small>(max 12)</small>\n </Text>\n <Separator heightX={1} />\n <FileInputLabel htmlFor={`files${responseId}`}>Browse</FileInputLabel>\n <Separator heightX={1} />\n <FileInput\n type=\"file\"\n accept=\".jpeg, .jpg, .png\"\n id={`files${responseId}`}\n multiple\n onChange={onSelectImages}\n />\n <TextButton\n onClick={openImagesModal}\n label={noOfImages ? `${noOfImages} ${pluralize(noOfImages, 'file')}` : 'No files'}\n />\n </FlexView>\n </FlexView>\n <FlexView\n $flexDirection=\"row\"\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $gutterX={1}\n $gapX={1}\n >\n <Button\n widthX={6}\n renderAs=\"secondary\"\n size=\"small\"\n label=\"Save\"\n onClick={handleSave}\n busy={isUploading}\n disabled={isSaveDisabled}\n />\n <Separator width={20} />\n {!nextQuestionId && (\n <Button\n widthX={6}\n renderAs=\"secondary\"\n size=\"small\"\n label=\"Submit Review\"\n onClick={handleReviewSubmit}\n busy={isSubmittingReview}\n disabled={!canSubmitReview}\n />\n )}\n </FlexView>\n </>\n );\n },\n);\n\nexport default SubjectiveQuestionFeedback;\n"],"names":["QUERY","SubjectiveQuestionFeedback","memo","responses","response","nextQuestionId","responseId","studentId","onAddReviewComment","openImagesReviewModal","handleReviewSubmit","isSubmittingReview","responseScore","maxScore","score","isAttempted","comment","setComment","useState","_a","isUploading","setIsUploading","scored","setScored","selectedImages","setSelectedImage","_b","noOfImages","isSaveDisabled","useMemo","_c","canSubmitReview","canSubmit","item","isCurrItemAttempted","currentItemReviewed","_d","uploadImages","useS3ImageUploadHelper","onCommentChange","useCallback","e","onScoreUp","onScoreDown","onSuccess","images","reponseImages","allImages","handleSave","imagesToUpload","updateImages","filteredImages","openImagesModal","previewImages","onSelectImages","files","newFilesList","file","url","prevImages","jsx","Text","jsxs","Fragment","FlexView","Separator","Clickable","UpIcon","DownIcon","TextArea","FileInputLabel","FileInput","TextButton","pluralize","Button"],"mappings":"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"}
|