@magmamath/students-features 1.2.1-rc.30 → 1.2.1-rc.32
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/commonjs/features/pmProgress/components/header/PmProgressHeader.js +3 -2
- package/dist/commonjs/features/pmProgress/components/header/PmProgressHeader.js.map +1 -1
- package/dist/commonjs/features/pmProgress/context/PmProgressContext.js.map +1 -1
- package/dist/commonjs/features/pmProgress/model/PmTreeModel.js +4 -2
- package/dist/commonjs/features/pmProgress/model/PmTreeModel.js.map +1 -1
- package/dist/commonjs/features/pmProgress/shared/TreeNormalizer.js +52 -0
- package/dist/commonjs/features/pmProgress/shared/TreeNormalizer.js.map +1 -0
- package/dist/module/features/pmProgress/components/header/PmProgressHeader.js +3 -2
- package/dist/module/features/pmProgress/components/header/PmProgressHeader.js.map +1 -1
- package/dist/module/features/pmProgress/context/PmProgressContext.js.map +1 -1
- package/dist/module/features/pmProgress/model/PmTreeModel.js +4 -2
- package/dist/module/features/pmProgress/model/PmTreeModel.js.map +1 -1
- package/dist/module/features/pmProgress/shared/TreeNormalizer.js +47 -0
- package/dist/module/features/pmProgress/shared/TreeNormalizer.js.map +1 -0
- package/dist/typescript/commonjs/features/pmProgress/components/header/PmProgressHeader.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/pmProgress/context/PmProgressContext.d.ts +1 -0
- package/dist/typescript/commonjs/features/pmProgress/context/PmProgressContext.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/pmProgress/model/PmTreeModel.d.ts +1 -1
- package/dist/typescript/commonjs/features/pmProgress/model/PmTreeModel.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/pmProgress/shared/TreeNormalizer.d.ts +17 -0
- package/dist/typescript/commonjs/features/pmProgress/shared/TreeNormalizer.d.ts.map +1 -0
- package/dist/typescript/module/features/pmProgress/components/header/PmProgressHeader.d.ts.map +1 -1
- package/dist/typescript/module/features/pmProgress/context/PmProgressContext.d.ts +1 -0
- package/dist/typescript/module/features/pmProgress/context/PmProgressContext.d.ts.map +1 -1
- package/dist/typescript/module/features/pmProgress/model/PmTreeModel.d.ts +1 -1
- package/dist/typescript/module/features/pmProgress/model/PmTreeModel.d.ts.map +1 -1
- package/dist/typescript/module/features/pmProgress/shared/TreeNormalizer.d.ts +17 -0
- package/dist/typescript/module/features/pmProgress/shared/TreeNormalizer.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/features/pmProgress/components/header/PmProgressHeader.tsx +37 -35
- package/src/features/pmProgress/context/PmProgressContext.tsx +1 -0
- package/src/features/pmProgress/model/PmTreeModel.ts +4 -2
- package/src/features/pmProgress/shared/TreeNormalizer.ts +64 -0
|
@@ -30,7 +30,8 @@ const PmProgressHeader = () => {
|
|
|
30
30
|
const {
|
|
31
31
|
model,
|
|
32
32
|
onStartPress,
|
|
33
|
-
customGradeLabels
|
|
33
|
+
customGradeLabels,
|
|
34
|
+
readOnly
|
|
34
35
|
} = (0, _PmProgressContext.usePmProgress)();
|
|
35
36
|
const [isDropdownOpen, setIsDropdownOpen] = (0, _react.useState)(false);
|
|
36
37
|
const grade = (0, _effectorReact.useUnit)(model.tree.$grade);
|
|
@@ -86,7 +87,7 @@ const PmProgressHeader = () => {
|
|
|
86
87
|
}
|
|
87
88
|
})
|
|
88
89
|
})]
|
|
89
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
90
|
+
}), !readOnly && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
90
91
|
style: styles.nextUp,
|
|
91
92
|
children: [nextUp && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
92
93
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeUi","_SketchArrowRight","_SliceDiamondIcon","_index","_effectorReact","_PmProgressContext","_pmProgressHelpers","_pmProgressConstants","_StartButton","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","menuItemProps","style","text","whiteSpace","PmProgressHeader","useText","model","onStartPress","customGradeLabels","usePmProgress","isDropdownOpen","setIsDropdownOpen","useState","grade","useUnit","tree","$grade","grades","useStoreMap","store","$grades","keys","fn","map","key","value","title","formatGradeLabel","disabled","isLocked","loaderOpeningId","solving","$loaderOpeningId","nextUp","$domains","domains","find","domain","isFluency","isFluencyDomain","isDomainCompleted","standards","every","standard","isCompleted","jsxs","View","styles","container","children","jsx","Typography","variant","HeadingVariants","H2","dark","Dropdown","isOpen","onDismiss","anchor","Button","ButtonVariant","TERTIARY","onPress","prev","H8","caret","CaretUpIcon","color","COLORS","NEUTRAL_9","CaretDownIcon","Menu","menu","items","onItemPress","item","setGrade","Fragment","content","subtitle","row","tilted","H7","muted","diamond","SliceDiamondIcon","arrow","SketchArrowRight","StartButton","setLoaderOpeningId","OpeningLoaderId","START_BUTTON","skill","start","type","SolvingFlow","MAGMA","isLoading","isActive","withPulsation","exports","SMALL_SCREEN_THRESHOLD","SMALL_SCREEN_MENU_MAX_HEIGHT","WINDOW_HEIGHT","Dimensions","height","MENU_MAX_HEIGHT","StyleSheet","create","flexDirection","justifyContent","alignItems","marginBottom","SPACING","zIndex","gap","marginLeft","top","minWidth","overflow","maxHeight","Platform","select","web","scrollbarWidth","transform","rotate","marginRight","NEUTRAL_8","bottom"],"sourceRoot":"../../../../../../src","sources":["features/pmProgress/components/header/PmProgressHeader.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAaA,IAAAG,iBAAA,GAAAH,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AACA,IAAAO,kBAAA,GAAAP,OAAA;AACA,IAAAQ,kBAAA,GAAAR,OAAA;AACA,IAAAS,oBAAA,GAAAT,OAAA;AACA,IAAAU,YAAA,GAAAV,OAAA;AAA2C,IAAAW,WAAA,GAAAX,OAAA;AAAA,SAAAY,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAd,wBAAAc,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAE3C,MAAMW,aAA4B,GAAG;EACnCC,KAAK,EAAE;IACLC,IAAI,EAAE;MAAEC,UAAU,EAAE;IAAS;EAC/B;AACF,CAAC;AAEM,MAAMC,gBAAgB,GAAGA,CAAA,KAAM;EACpC,MAAMpB,CAAC,GAAG,IAAAqB,cAAO,EAAC,CAAC;EACnB,MAAM;IAAEC,KAAK;IAAEC,YAAY;IAAEC;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeUi","_SketchArrowRight","_SliceDiamondIcon","_index","_effectorReact","_PmProgressContext","_pmProgressHelpers","_pmProgressConstants","_StartButton","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","menuItemProps","style","text","whiteSpace","PmProgressHeader","useText","model","onStartPress","customGradeLabels","readOnly","usePmProgress","isDropdownOpen","setIsDropdownOpen","useState","grade","useUnit","tree","$grade","grades","useStoreMap","store","$grades","keys","fn","map","key","value","title","formatGradeLabel","disabled","isLocked","loaderOpeningId","solving","$loaderOpeningId","nextUp","$domains","domains","find","domain","isFluency","isFluencyDomain","isDomainCompleted","standards","every","standard","isCompleted","jsxs","View","styles","container","children","jsx","Typography","variant","HeadingVariants","H2","dark","Dropdown","isOpen","onDismiss","anchor","Button","ButtonVariant","TERTIARY","onPress","prev","H8","caret","CaretUpIcon","color","COLORS","NEUTRAL_9","CaretDownIcon","Menu","menu","items","onItemPress","item","setGrade","Fragment","content","subtitle","row","tilted","H7","muted","diamond","SliceDiamondIcon","arrow","SketchArrowRight","StartButton","setLoaderOpeningId","OpeningLoaderId","START_BUTTON","skill","start","type","SolvingFlow","MAGMA","isLoading","isActive","withPulsation","exports","SMALL_SCREEN_THRESHOLD","SMALL_SCREEN_MENU_MAX_HEIGHT","WINDOW_HEIGHT","Dimensions","height","MENU_MAX_HEIGHT","StyleSheet","create","flexDirection","justifyContent","alignItems","marginBottom","SPACING","zIndex","gap","marginLeft","top","minWidth","overflow","maxHeight","Platform","select","web","scrollbarWidth","transform","rotate","marginRight","NEUTRAL_8","bottom"],"sourceRoot":"../../../../../../src","sources":["features/pmProgress/components/header/PmProgressHeader.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","PmProgressContext","createContext","usePmProgress","value","useContext","Error","PmProgressProvider","exports","Provider"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/context/PmProgressContext.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_react","require","PmProgressContext","createContext","usePmProgress","value","useContext","Error","PmProgressProvider","exports","Provider"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/context/PmProgressContext.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAcA,MAAMC,iBAAiB,gBAAG,IAAAC,oBAAa,EAAgC,IAAI,CAAC;AAErE,SAASC,aAAaA,CAAA,EAA2B;EACtD,MAAMC,KAAK,GAAG,IAAAC,iBAAU,EAACJ,iBAAiB,CAAC;EAC3C,IAAI,CAACG,KAAK,EAAE;IACV,MAAM,IAAIE,KAAK,CAAC,sDAAsD,CAAC;EACzE;EACA,OAAOF,KAAK;AACd;AAEO,MAAMG,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAGN,iBAAiB,CAACQ,QAAQ","ignoreList":[]}
|
|
@@ -8,6 +8,7 @@ var _effector = require("effector");
|
|
|
8
8
|
var _effectorAction = require("effector-action");
|
|
9
9
|
var _skillsUtils = require("@matteappen/skills-utils");
|
|
10
10
|
var _pmProgressHelpers = require("../shared/pmProgress.helpers.js");
|
|
11
|
+
var _TreeNormalizer = require("../shared/TreeNormalizer.js");
|
|
11
12
|
var _session = require("effector-storage/session");
|
|
12
13
|
var _pmProgressConstants = require("../shared/pmProgress.constants.js");
|
|
13
14
|
class PmTreeModel {
|
|
@@ -98,12 +99,13 @@ class PmTreeModel {
|
|
|
98
99
|
target: this.setDomains
|
|
99
100
|
});
|
|
100
101
|
}
|
|
101
|
-
initTreeFx = (0, _effector.createEffect)(({
|
|
102
|
+
initTreeFx = (0, _effector.createEffect)(async ({
|
|
102
103
|
user
|
|
103
104
|
}) => {
|
|
104
|
-
|
|
105
|
+
const [tree, stats] = await Promise.all([this.api.getTreeFx(user.setting.practiceModeTreeId), this.api.getStatisticsFx({
|
|
105
106
|
entityIds: [user._id]
|
|
106
107
|
})]);
|
|
108
|
+
return [_TreeNormalizer.TreeNormalizer.normalize(tree), stats];
|
|
107
109
|
});
|
|
108
110
|
getTreeContextFx = (0, _effector.attach)({
|
|
109
111
|
source: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","_effectorAction","_skillsUtils","_pmProgressHelpers","_session","_pmProgressConstants","PmTreeModel","$tree","createStore","$stats","$user","setupInitialGrade","createEvent","setDomains","setGrade","$isInitialized","$grade","restore","$domains","$grades","constructor","api","persist","key","SessionStorageKeys","GRADE","store","DOMAINS","createAction","initTreeFx","done","target","fn","params","user","result","tree","stats","getTreeGrades","sample","clock","filter","sessionStorage","getItem","treeGrades","Object","values","treeMapping","node","type","map","attributes","grade","getInitialPmGrade","userGrade","lockedGrades","setting","practiceModeLockedGrades","enrolledGrades","doneData","source","isTreeDataReady","treeWithUserStats","enhanceProgressMatrixData","entityId","_id","name","fullName","getDomainStructure","createEffect","Promise","all","getTreeFx","practiceModeTreeId","getStatisticsFx","entityIds","getTreeContextFx","attach","mapParams","_","Error","effect","treeWithStats","exports"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/model/PmTreeModel.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAaA,IAAAE,YAAA,GAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAH,OAAA;AAMA,IAAAI,
|
|
1
|
+
{"version":3,"names":["_effector","require","_effectorAction","_skillsUtils","_pmProgressHelpers","_TreeNormalizer","_session","_pmProgressConstants","PmTreeModel","$tree","createStore","$stats","$user","setupInitialGrade","createEvent","setDomains","setGrade","$isInitialized","$grade","restore","$domains","$grades","constructor","api","persist","key","SessionStorageKeys","GRADE","store","DOMAINS","createAction","initTreeFx","done","target","fn","params","user","result","tree","stats","getTreeGrades","sample","clock","filter","sessionStorage","getItem","treeGrades","Object","values","treeMapping","node","type","map","attributes","grade","getInitialPmGrade","userGrade","lockedGrades","setting","practiceModeLockedGrades","enrolledGrades","doneData","source","isTreeDataReady","treeWithUserStats","enhanceProgressMatrixData","entityId","_id","name","fullName","getDomainStructure","createEffect","Promise","all","getTreeFx","practiceModeTreeId","getStatisticsFx","entityIds","TreeNormalizer","normalize","getTreeContextFx","attach","mapParams","_","Error","effect","treeWithStats","exports"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/model/PmTreeModel.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.TreeNormalizer = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Some skills from the API lack a valid ability (missing sectionId and functionName),
|
|
9
|
+
* making them impossible to open in the solving flow. This normalizer strips those skills
|
|
10
|
+
* and cascades the cleanup - removing standards, domains, etc. that end up empty.
|
|
11
|
+
*
|
|
12
|
+
* Acts as a single place to sanitize the tree API response before it enters the app.
|
|
13
|
+
* Can be extended with additional normalizations as new edge cases arise.
|
|
14
|
+
*/
|
|
15
|
+
class TreeNormalizer {
|
|
16
|
+
static normalize(response) {
|
|
17
|
+
const skillsMapping = this.getOnlyValidSkills(response.skillsMapping);
|
|
18
|
+
const validIds = new Set(Object.keys(skillsMapping));
|
|
19
|
+
const treeMapping = this.removeEmptyNodes(response.treeMapping, validIds);
|
|
20
|
+
return {
|
|
21
|
+
...response,
|
|
22
|
+
skillsMapping,
|
|
23
|
+
treeMapping
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
static isSkillValid(skill) {
|
|
27
|
+
return Boolean(skill?.ability && (skill.ability.sectionId || skill.ability.functionName));
|
|
28
|
+
}
|
|
29
|
+
static getOnlyValidSkills(mapping) {
|
|
30
|
+
return Object.fromEntries(Object.entries(mapping).filter(([, skill]) => this.isSkillValid(skill)));
|
|
31
|
+
}
|
|
32
|
+
static removeEmptyNodes(treeMapping, validIds) {
|
|
33
|
+
const emptyIds = this.getEmptyNodeIds(treeMapping, validIds);
|
|
34
|
+
return Object.fromEntries(Object.entries(treeMapping).filter(([id]) => !emptyIds.has(id)).map(([id, node]) => [id, {
|
|
35
|
+
...node,
|
|
36
|
+
skills: node.skills.filter(sid => validIds.has(sid)),
|
|
37
|
+
children: node.children.filter(cid => !emptyIds.has(cid))
|
|
38
|
+
}]));
|
|
39
|
+
}
|
|
40
|
+
static getEmptyNodeIds(treeMapping, validIds) {
|
|
41
|
+
const empty = new Set();
|
|
42
|
+
const leafToRoot = Object.entries(treeMapping).sort(([, a], [, b]) => b.parents.length - a.parents.length);
|
|
43
|
+
for (const [id, node] of leafToRoot) {
|
|
44
|
+
const isEmptyLeaf = node.skills.length > 0 && node.skills.every(s => !validIds.has(s));
|
|
45
|
+
const isEmptyParent = node.children.length > 0 && node.children.every(c => empty.has(c));
|
|
46
|
+
if (isEmptyLeaf || isEmptyParent) empty.add(id);
|
|
47
|
+
}
|
|
48
|
+
return empty;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.TreeNormalizer = TreeNormalizer;
|
|
52
|
+
//# sourceMappingURL=TreeNormalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TreeNormalizer","normalize","response","skillsMapping","getOnlyValidSkills","validIds","Set","Object","keys","treeMapping","removeEmptyNodes","isSkillValid","skill","Boolean","ability","sectionId","functionName","mapping","fromEntries","entries","filter","emptyIds","getEmptyNodeIds","id","has","map","node","skills","sid","children","cid","empty","leafToRoot","sort","a","b","parents","length","isEmptyLeaf","every","s","isEmptyParent","c","add","exports"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/shared/TreeNormalizer.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,7 +24,8 @@ export const PmProgressHeader = () => {
|
|
|
24
24
|
const {
|
|
25
25
|
model,
|
|
26
26
|
onStartPress,
|
|
27
|
-
customGradeLabels
|
|
27
|
+
customGradeLabels,
|
|
28
|
+
readOnly
|
|
28
29
|
} = usePmProgress();
|
|
29
30
|
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
|
30
31
|
const grade = useUnit(model.tree.$grade);
|
|
@@ -80,7 +81,7 @@ export const PmProgressHeader = () => {
|
|
|
80
81
|
}
|
|
81
82
|
})
|
|
82
83
|
})]
|
|
83
|
-
}), /*#__PURE__*/_jsxs(View, {
|
|
84
|
+
}), !readOnly && /*#__PURE__*/_jsxs(View, {
|
|
84
85
|
style: styles.nextUp,
|
|
85
86
|
children: [nextUp && /*#__PURE__*/_jsxs(_Fragment, {
|
|
86
87
|
children: [/*#__PURE__*/_jsxs(View, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","Dimensions","Platform","StyleSheet","View","Button","ButtonVariant","CaretDownIcon","CaretUpIcon","COLORS","Dropdown","HeadingVariants","Menu","SPACING","Typography","SketchArrowRight","SliceDiamondIcon","useText","useUnit","useStoreMap","usePmProgress","formatGradeLabel","isFluencyDomain","OpeningLoaderId","SolvingFlow","StartButton","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","menuItemProps","style","text","whiteSpace","PmProgressHeader","t","model","onStartPress","customGradeLabels","isDropdownOpen","setIsDropdownOpen","grade","tree","$grade","grades","store","$grades","keys","fn","map","key","value","title","disabled","isLocked","loaderOpeningId","solving","$loaderOpeningId","nextUp","$domains","domains","find","domain","isFluency","isDomainCompleted","standards","every","standard","isCompleted","styles","container","children","variant","H2","dark","isOpen","onDismiss","anchor","TERTIARY","onPress","prev","H8","caret","color","NEUTRAL_9","menu","items","onItemPress","item","setGrade","content","subtitle","row","tilted","H7","muted","diamond","arrow","setLoaderOpeningId","START_BUTTON","skill","start","type","MAGMA","isLoading","isActive","withPulsation","SMALL_SCREEN_THRESHOLD","SMALL_SCREEN_MENU_MAX_HEIGHT","WINDOW_HEIGHT","get","height","MENU_MAX_HEIGHT","create","flexDirection","justifyContent","alignItems","marginBottom","zIndex","gap","marginLeft","top","minWidth","overflow","maxHeight","select","web","scrollbarWidth","transform","rotate","marginRight","NEUTRAL_8","bottom"],"sourceRoot":"../../../../../../src","sources":["features/pmProgress/components/header/PmProgressHeader.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAASC,UAAU,EAAEC,QAAQ,EAAEC,UAAU,EAAaC,IAAI,QAAQ,cAAc;AAChF,SACEC,MAAM,EACNC,aAAa,EACbC,aAAa,EACbC,WAAW,EACXC,MAAM,EACNC,QAAQ,EACRC,eAAe,EACfC,IAAI,EAEJC,OAAO,EACPC,UAAU,QACL,4BAA4B;AACnC,SAASC,gBAAgB,QAAQ,8CAA2C;AAC5E,SAASC,gBAAgB,QAAQ,8CAA2C;AAC5E,SAASC,OAAO,QAAQ,yCAAgC;AACxD,SAASC,OAAO,EAAEC,WAAW,QAAQ,gBAAgB;AACrD,SAASC,aAAa,QAAQ,oCAAiC;AAC/D,SAASC,gBAAgB,EAAEC,eAAe,QAAQ,oCAAiC;AACnF,SAASC,eAAe,EAAEC,WAAW,QAAQ,sCAAmC;AAChF,SAASC,WAAW,QAAQ,kBAAe;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AAE3C,MAAMC,aAA4B,GAAG;EACnCC,KAAK,EAAE;IACLC,IAAI,EAAE;MAAEC,UAAU,EAAE;IAAS;EAC/B;AACF,CAAC;AAED,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAAM;EACpC,MAAMC,CAAC,GAAGpB,OAAO,CAAC,CAAC;EACnB,MAAM;IAAEqB,KAAK;IAAEC,YAAY;IAAEC;
|
|
1
|
+
{"version":3,"names":["React","useState","Dimensions","Platform","StyleSheet","View","Button","ButtonVariant","CaretDownIcon","CaretUpIcon","COLORS","Dropdown","HeadingVariants","Menu","SPACING","Typography","SketchArrowRight","SliceDiamondIcon","useText","useUnit","useStoreMap","usePmProgress","formatGradeLabel","isFluencyDomain","OpeningLoaderId","SolvingFlow","StartButton","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","menuItemProps","style","text","whiteSpace","PmProgressHeader","t","model","onStartPress","customGradeLabels","readOnly","isDropdownOpen","setIsDropdownOpen","grade","tree","$grade","grades","store","$grades","keys","fn","map","key","value","title","disabled","isLocked","loaderOpeningId","solving","$loaderOpeningId","nextUp","$domains","domains","find","domain","isFluency","isDomainCompleted","standards","every","standard","isCompleted","styles","container","children","variant","H2","dark","isOpen","onDismiss","anchor","TERTIARY","onPress","prev","H8","caret","color","NEUTRAL_9","menu","items","onItemPress","item","setGrade","content","subtitle","row","tilted","H7","muted","diamond","arrow","setLoaderOpeningId","START_BUTTON","skill","start","type","MAGMA","isLoading","isActive","withPulsation","SMALL_SCREEN_THRESHOLD","SMALL_SCREEN_MENU_MAX_HEIGHT","WINDOW_HEIGHT","get","height","MENU_MAX_HEIGHT","create","flexDirection","justifyContent","alignItems","marginBottom","zIndex","gap","marginLeft","top","minWidth","overflow","maxHeight","select","web","scrollbarWidth","transform","rotate","marginRight","NEUTRAL_8","bottom"],"sourceRoot":"../../../../../../src","sources":["features/pmProgress/components/header/PmProgressHeader.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createContext","useContext","PmProgressContext","usePmProgress","value","Error","PmProgressProvider","Provider"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/context/PmProgressContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;
|
|
1
|
+
{"version":3,"names":["createContext","useContext","PmProgressContext","usePmProgress","value","Error","PmProgressProvider","Provider"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/context/PmProgressContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAcjD,MAAMC,iBAAiB,gBAAGF,aAAa,CAAgC,IAAI,CAAC;AAE5E,OAAO,SAASG,aAAaA,CAAA,EAA2B;EACtD,MAAMC,KAAK,GAAGH,UAAU,CAACC,iBAAiB,CAAC;EAC3C,IAAI,CAACE,KAAK,EAAE;IACV,MAAM,IAAIC,KAAK,CAAC,sDAAsD,CAAC;EACzE;EACA,OAAOD,KAAK;AACd;AAEA,OAAO,MAAME,kBAAkB,GAAGJ,iBAAiB,CAACK,QAAQ","ignoreList":[]}
|
|
@@ -4,6 +4,7 @@ import { attach, createEffect, createEvent, createStore, restore, sample } from
|
|
|
4
4
|
import { createAction } from 'effector-action';
|
|
5
5
|
import { enhanceProgressMatrixData } from '@matteappen/skills-utils';
|
|
6
6
|
import { getDomainStructure, getInitialPmGrade, getTreeGrades, isTreeDataReady } from "../shared/pmProgress.helpers.js";
|
|
7
|
+
import { TreeNormalizer } from "../shared/TreeNormalizer.js";
|
|
7
8
|
import { persist } from 'effector-storage/session';
|
|
8
9
|
import { SessionStorageKeys } from "../shared/pmProgress.constants.js";
|
|
9
10
|
export class PmTreeModel {
|
|
@@ -94,12 +95,13 @@ export class PmTreeModel {
|
|
|
94
95
|
target: this.setDomains
|
|
95
96
|
});
|
|
96
97
|
}
|
|
97
|
-
initTreeFx = createEffect(({
|
|
98
|
+
initTreeFx = createEffect(async ({
|
|
98
99
|
user
|
|
99
100
|
}) => {
|
|
100
|
-
|
|
101
|
+
const [tree, stats] = await Promise.all([this.api.getTreeFx(user.setting.practiceModeTreeId), this.api.getStatisticsFx({
|
|
101
102
|
entityIds: [user._id]
|
|
102
103
|
})]);
|
|
104
|
+
return [TreeNormalizer.normalize(tree), stats];
|
|
103
105
|
});
|
|
104
106
|
getTreeContextFx = attach({
|
|
105
107
|
source: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["attach","createEffect","createEvent","createStore","restore","sample","createAction","enhanceProgressMatrixData","getDomainStructure","getInitialPmGrade","getTreeGrades","isTreeDataReady","persist","SessionStorageKeys","PmTreeModel","$tree","$stats","$user","setupInitialGrade","setDomains","setGrade","$isInitialized","$grade","$domains","$grades","constructor","api","key","GRADE","store","DOMAINS","initTreeFx","done","target","fn","params","user","result","tree","stats","clock","filter","sessionStorage","getItem","treeGrades","Object","values","treeMapping","node","type","map","attributes","grade","userGrade","lockedGrades","setting","practiceModeLockedGrades","enrolledGrades","doneData","source","treeWithUserStats","entityId","_id","name","fullName","Promise","all","getTreeFx","practiceModeTreeId","getStatisticsFx","entityIds","getTreeContextFx","mapParams","_","Error","effect","treeWithStats"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/model/PmTreeModel.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,YAAY,EAAEC,WAAW,EAAEC,WAAW,EAAEC,OAAO,EAAEC,MAAM,QAAQ,UAAU;AAC1F,SAASC,YAAY,QAAQ,iBAAiB;AAa9C,SAASC,yBAAyB,QAAQ,0BAA0B;AACpE,SACEC,kBAAkB,EAClBC,iBAAiB,EACjBC,aAAa,EACbC,eAAe,QACV,iCAA8B;AACrC,SAASC,OAAO,QAAQ,0BAA0B;AAClD,SAASC,kBAAkB,QAAQ,mCAAgC;AAEnE,OAAO,MAAMC,WAAW,CAAC;EACNC,KAAK,
|
|
1
|
+
{"version":3,"names":["attach","createEffect","createEvent","createStore","restore","sample","createAction","enhanceProgressMatrixData","getDomainStructure","getInitialPmGrade","getTreeGrades","isTreeDataReady","TreeNormalizer","persist","SessionStorageKeys","PmTreeModel","$tree","$stats","$user","setupInitialGrade","setDomains","setGrade","$isInitialized","$grade","$domains","$grades","constructor","api","key","GRADE","store","DOMAINS","initTreeFx","done","target","fn","params","user","result","tree","stats","clock","filter","sessionStorage","getItem","treeGrades","Object","values","treeMapping","node","type","map","attributes","grade","userGrade","lockedGrades","setting","practiceModeLockedGrades","enrolledGrades","doneData","source","treeWithUserStats","entityId","_id","name","fullName","Promise","all","getTreeFx","practiceModeTreeId","getStatisticsFx","entityIds","normalize","getTreeContextFx","mapParams","_","Error","effect","treeWithStats"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/model/PmTreeModel.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Some skills from the API lack a valid ability (missing sectionId and functionName),
|
|
5
|
+
* making them impossible to open in the solving flow. This normalizer strips those skills
|
|
6
|
+
* and cascades the cleanup - removing standards, domains, etc. that end up empty.
|
|
7
|
+
*
|
|
8
|
+
* Acts as a single place to sanitize the tree API response before it enters the app.
|
|
9
|
+
* Can be extended with additional normalizations as new edge cases arise.
|
|
10
|
+
*/
|
|
11
|
+
export class TreeNormalizer {
|
|
12
|
+
static normalize(response) {
|
|
13
|
+
const skillsMapping = this.getOnlyValidSkills(response.skillsMapping);
|
|
14
|
+
const validIds = new Set(Object.keys(skillsMapping));
|
|
15
|
+
const treeMapping = this.removeEmptyNodes(response.treeMapping, validIds);
|
|
16
|
+
return {
|
|
17
|
+
...response,
|
|
18
|
+
skillsMapping,
|
|
19
|
+
treeMapping
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
static isSkillValid(skill) {
|
|
23
|
+
return Boolean(skill?.ability && (skill.ability.sectionId || skill.ability.functionName));
|
|
24
|
+
}
|
|
25
|
+
static getOnlyValidSkills(mapping) {
|
|
26
|
+
return Object.fromEntries(Object.entries(mapping).filter(([, skill]) => this.isSkillValid(skill)));
|
|
27
|
+
}
|
|
28
|
+
static removeEmptyNodes(treeMapping, validIds) {
|
|
29
|
+
const emptyIds = this.getEmptyNodeIds(treeMapping, validIds);
|
|
30
|
+
return Object.fromEntries(Object.entries(treeMapping).filter(([id]) => !emptyIds.has(id)).map(([id, node]) => [id, {
|
|
31
|
+
...node,
|
|
32
|
+
skills: node.skills.filter(sid => validIds.has(sid)),
|
|
33
|
+
children: node.children.filter(cid => !emptyIds.has(cid))
|
|
34
|
+
}]));
|
|
35
|
+
}
|
|
36
|
+
static getEmptyNodeIds(treeMapping, validIds) {
|
|
37
|
+
const empty = new Set();
|
|
38
|
+
const leafToRoot = Object.entries(treeMapping).sort(([, a], [, b]) => b.parents.length - a.parents.length);
|
|
39
|
+
for (const [id, node] of leafToRoot) {
|
|
40
|
+
const isEmptyLeaf = node.skills.length > 0 && node.skills.every(s => !validIds.has(s));
|
|
41
|
+
const isEmptyParent = node.children.length > 0 && node.children.every(c => empty.has(c));
|
|
42
|
+
if (isEmptyLeaf || isEmptyParent) empty.add(id);
|
|
43
|
+
}
|
|
44
|
+
return empty;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=TreeNormalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TreeNormalizer","normalize","response","skillsMapping","getOnlyValidSkills","validIds","Set","Object","keys","treeMapping","removeEmptyNodes","isSkillValid","skill","Boolean","ability","sectionId","functionName","mapping","fromEntries","entries","filter","emptyIds","getEmptyNodeIds","id","has","map","node","skills","sid","children","cid","empty","leafToRoot","sort","a","b","parents","length","isEmptyLeaf","every","s","isEmptyParent","c","add"],"sourceRoot":"../../../../../src","sources":["features/pmProgress/shared/TreeNormalizer.ts"],"mappings":"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","ignoreList":[]}
|
package/dist/typescript/commonjs/features/pmProgress/components/header/PmProgressHeader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmProgressHeader.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/pmProgress/components/header/PmProgressHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AA8BvC,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"PmProgressHeader.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/pmProgress/components/header/PmProgressHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AA8BvC,eAAO,MAAM,gBAAgB,yBA6G5B,CAAA"}
|
|
@@ -3,6 +3,7 @@ import { Skill, GradeLabelsMap } from '@magmamath/students-features';
|
|
|
3
3
|
export type PmProgressContextValue = {
|
|
4
4
|
model: PmProgressModel;
|
|
5
5
|
customGradeLabels?: GradeLabelsMap;
|
|
6
|
+
readOnly?: boolean;
|
|
6
7
|
onStartPress?: (skill: Skill) => Promise<void>;
|
|
7
8
|
onPracticePress?: (skill: Skill) => Promise<void>;
|
|
8
9
|
onStandardPress?: (skill: Skill) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmProgressContext.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/context/PmProgressContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,eAAe,CAAA;IACtB,iBAAiB,CAAC,EAAE,cAAc,CAAA;IAClC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D,CAAA;AAID,wBAAgB,aAAa,IAAI,sBAAsB,CAMtD;AAED,eAAO,MAAM,kBAAkB,yDAA6B,CAAA"}
|
|
1
|
+
{"version":3,"file":"PmProgressContext.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/context/PmProgressContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,eAAe,CAAA;IACtB,iBAAiB,CAAC,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D,CAAA;AAID,wBAAgB,aAAa,IAAI,sBAAsB,CAMtD;AAED,eAAO,MAAM,kBAAkB,yDAA6B,CAAA"}
|
|
@@ -13,7 +13,7 @@ export declare class PmTreeModel {
|
|
|
13
13
|
readonly $domains: import("effector").StoreWritable<Domain[]>;
|
|
14
14
|
readonly $grades: import("effector").StoreWritable<Grade[]>;
|
|
15
15
|
constructor(api: PmProgressApi);
|
|
16
|
-
initTreeFx: import("effector").Effect<PmProgressGateProps, [TreeMappingResponse, StatsResponse], Error>;
|
|
16
|
+
initTreeFx: import("effector").Effect<PmProgressGateProps, readonly [TreeMappingResponse, StatsResponse], Error>;
|
|
17
17
|
readonly getTreeContextFx: import("effector").Effect<void, TreeContext, Error>;
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=PmTreeModel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmTreeModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/model/PmTreeModel.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EACN,KAAK,EACL,mBAAmB,EAEnB,aAAa,EAEb,WAAW,EACX,mBAAmB,EAEpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"PmTreeModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/model/PmTreeModel.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EACN,KAAK,EACL,mBAAmB,EAEnB,aAAa,EAEb,WAAW,EACX,mBAAmB,EAEpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAY/C,qBAAa,WAAW;IAcV,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgD;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IAEvD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,SAAgB,QAAQ,kDAA+B;IAEvD,SAAgB,cAAc,4CAAqB;IACnD,SAAgB,MAAM,kDAA+B;IACrD,SAAgB,QAAQ,6CAA+B;IACvD,SAAgB,OAAO,4CAA2B;gBAErB,GAAG,EAAE,aAAa;IA2DxC,UAAU,uGAMf;IAEF,SAAgB,gBAAgB,sDAwB9B;CACH"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Skill, TreeMappingResponse } from './pmProgress.types';
|
|
2
|
+
/**
|
|
3
|
+
* Some skills from the API lack a valid ability (missing sectionId and functionName),
|
|
4
|
+
* making them impossible to open in the solving flow. This normalizer strips those skills
|
|
5
|
+
* and cascades the cleanup - removing standards, domains, etc. that end up empty.
|
|
6
|
+
*
|
|
7
|
+
* Acts as a single place to sanitize the tree API response before it enters the app.
|
|
8
|
+
* Can be extended with additional normalizations as new edge cases arise.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TreeNormalizer {
|
|
11
|
+
static normalize(response: TreeMappingResponse): TreeMappingResponse;
|
|
12
|
+
static isSkillValid(skill: Skill): boolean;
|
|
13
|
+
private static getOnlyValidSkills;
|
|
14
|
+
private static removeEmptyNodes;
|
|
15
|
+
private static getEmptyNodeIds;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=TreeNormalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNormalizer.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/shared/TreeNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAiB,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAInF;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB;IAOpE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK;IAIhC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAMjC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAiB/B,OAAO,CAAC,MAAM,CAAC,eAAe;CAgB/B"}
|
package/dist/typescript/module/features/pmProgress/components/header/PmProgressHeader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmProgressHeader.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/pmProgress/components/header/PmProgressHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AA8BvC,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"PmProgressHeader.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/pmProgress/components/header/PmProgressHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AA8BvC,eAAO,MAAM,gBAAgB,yBA6G5B,CAAA"}
|
|
@@ -3,6 +3,7 @@ import { Skill, GradeLabelsMap } from '@magmamath/students-features';
|
|
|
3
3
|
export type PmProgressContextValue = {
|
|
4
4
|
model: PmProgressModel;
|
|
5
5
|
customGradeLabels?: GradeLabelsMap;
|
|
6
|
+
readOnly?: boolean;
|
|
6
7
|
onStartPress?: (skill: Skill) => Promise<void>;
|
|
7
8
|
onPracticePress?: (skill: Skill) => Promise<void>;
|
|
8
9
|
onStandardPress?: (skill: Skill) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmProgressContext.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/context/PmProgressContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,eAAe,CAAA;IACtB,iBAAiB,CAAC,EAAE,cAAc,CAAA;IAClC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D,CAAA;AAID,wBAAgB,aAAa,IAAI,sBAAsB,CAMtD;AAED,eAAO,MAAM,kBAAkB,yDAA6B,CAAA"}
|
|
1
|
+
{"version":3,"file":"PmProgressContext.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/context/PmProgressContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,eAAe,CAAA;IACtB,iBAAiB,CAAC,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D,CAAA;AAID,wBAAgB,aAAa,IAAI,sBAAsB,CAMtD;AAED,eAAO,MAAM,kBAAkB,yDAA6B,CAAA"}
|
|
@@ -13,7 +13,7 @@ export declare class PmTreeModel {
|
|
|
13
13
|
readonly $domains: import("effector").StoreWritable<Domain[]>;
|
|
14
14
|
readonly $grades: import("effector").StoreWritable<Grade[]>;
|
|
15
15
|
constructor(api: PmProgressApi);
|
|
16
|
-
initTreeFx: import("effector").Effect<PmProgressGateProps, [TreeMappingResponse, StatsResponse], Error>;
|
|
16
|
+
initTreeFx: import("effector").Effect<PmProgressGateProps, readonly [TreeMappingResponse, StatsResponse], Error>;
|
|
17
17
|
readonly getTreeContextFx: import("effector").Effect<void, TreeContext, Error>;
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=PmTreeModel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmTreeModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/model/PmTreeModel.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EACN,KAAK,EACL,mBAAmB,EAEnB,aAAa,EAEb,WAAW,EACX,mBAAmB,EAEpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"PmTreeModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/model/PmTreeModel.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EACN,KAAK,EACL,mBAAmB,EAEnB,aAAa,EAEb,WAAW,EACX,mBAAmB,EAEpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAY/C,qBAAa,WAAW;IAcV,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgD;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IAEvD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,SAAgB,QAAQ,kDAA+B;IAEvD,SAAgB,cAAc,4CAAqB;IACnD,SAAgB,MAAM,kDAA+B;IACrD,SAAgB,QAAQ,6CAA+B;IACvD,SAAgB,OAAO,4CAA2B;gBAErB,GAAG,EAAE,aAAa;IA2DxC,UAAU,uGAMf;IAEF,SAAgB,gBAAgB,sDAwB9B;CACH"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Skill, TreeMappingResponse } from './pmProgress.types';
|
|
2
|
+
/**
|
|
3
|
+
* Some skills from the API lack a valid ability (missing sectionId and functionName),
|
|
4
|
+
* making them impossible to open in the solving flow. This normalizer strips those skills
|
|
5
|
+
* and cascades the cleanup - removing standards, domains, etc. that end up empty.
|
|
6
|
+
*
|
|
7
|
+
* Acts as a single place to sanitize the tree API response before it enters the app.
|
|
8
|
+
* Can be extended with additional normalizations as new edge cases arise.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TreeNormalizer {
|
|
11
|
+
static normalize(response: TreeMappingResponse): TreeMappingResponse;
|
|
12
|
+
static isSkillValid(skill: Skill): boolean;
|
|
13
|
+
private static getOnlyValidSkills;
|
|
14
|
+
private static removeEmptyNodes;
|
|
15
|
+
private static getEmptyNodeIds;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=TreeNormalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNormalizer.d.ts","sourceRoot":"","sources":["../../../../../../src/features/pmProgress/shared/TreeNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAiB,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAInF;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB;IAOpE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK;IAIhC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAMjC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAiB/B,OAAO,CAAC,MAAM,CAAC,eAAe;CAgB/B"}
|
package/package.json
CHANGED
|
@@ -30,7 +30,7 @@ const menuItemProps: MenuItemProps = {
|
|
|
30
30
|
|
|
31
31
|
export const PmProgressHeader = () => {
|
|
32
32
|
const t = useText()
|
|
33
|
-
const { model, onStartPress, customGradeLabels } = usePmProgress()
|
|
33
|
+
const { model, onStartPress, customGradeLabels, readOnly } = usePmProgress()
|
|
34
34
|
const [isDropdownOpen, setIsDropdownOpen] = useState(false)
|
|
35
35
|
|
|
36
36
|
const grade = useUnit(model.tree.$grade)
|
|
@@ -96,43 +96,45 @@ export const PmProgressHeader = () => {
|
|
|
96
96
|
</Dropdown>
|
|
97
97
|
</View>
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
{nextUp
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
<View style={styles.
|
|
104
|
-
<
|
|
105
|
-
{
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<
|
|
110
|
-
{
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
<
|
|
99
|
+
{!readOnly && (
|
|
100
|
+
<View style={styles.nextUp}>
|
|
101
|
+
{nextUp && (
|
|
102
|
+
<>
|
|
103
|
+
<View style={styles.content}>
|
|
104
|
+
<View style={styles.subtitle}>
|
|
105
|
+
<Typography variant={HeadingVariants.H2} style={styles.dark}>
|
|
106
|
+
{t('pmProgress.nextUp')}
|
|
107
|
+
</Typography>
|
|
108
|
+
</View>
|
|
109
|
+
<View style={[styles.row, styles.tilted]}>
|
|
110
|
+
<Typography variant={HeadingVariants.H7} style={styles.muted}>
|
|
111
|
+
{nextUp?.title}
|
|
112
|
+
</Typography>
|
|
113
|
+
<View style={styles.diamond}>
|
|
114
|
+
<SliceDiamondIcon color={nextUp?.color} />
|
|
115
|
+
</View>
|
|
114
116
|
</View>
|
|
115
117
|
</View>
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
)}
|
|
118
|
+
<View style={styles.arrow}>
|
|
119
|
+
<SketchArrowRight />
|
|
120
|
+
</View>
|
|
121
|
+
</>
|
|
122
|
+
)}
|
|
122
123
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
124
|
+
<StartButton
|
|
125
|
+
onPress={async () => {
|
|
126
|
+
model.solving.setLoaderOpeningId(OpeningLoaderId.START_BUTTON)
|
|
127
|
+
const skill = await model.solving.start({ type: SolvingFlow.MAGMA })
|
|
128
|
+
await onStartPress?.(skill)
|
|
129
|
+
model.solving.setLoaderOpeningId(null)
|
|
130
|
+
}}
|
|
131
|
+
disabled={loaderOpeningId !== null}
|
|
132
|
+
isLoading={loaderOpeningId === OpeningLoaderId.START_BUTTON}
|
|
133
|
+
isActive={loaderOpeningId === OpeningLoaderId.START_BUTTON}
|
|
134
|
+
withPulsation={!!nextUp}
|
|
135
|
+
/>
|
|
136
|
+
</View>
|
|
137
|
+
)}
|
|
136
138
|
</View>
|
|
137
139
|
)
|
|
138
140
|
}
|
|
@@ -5,6 +5,7 @@ import { Skill, GradeLabelsMap } from '@magmamath/students-features'
|
|
|
5
5
|
export type PmProgressContextValue = {
|
|
6
6
|
model: PmProgressModel
|
|
7
7
|
customGradeLabels?: GradeLabelsMap
|
|
8
|
+
readOnly?: boolean
|
|
8
9
|
onStartPress?: (skill: Skill) => Promise<void>
|
|
9
10
|
onPracticePress?: (skill: Skill) => Promise<void>
|
|
10
11
|
onStandardPress?: (skill: Skill) => Promise<void>
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
getTreeGrades,
|
|
20
20
|
isTreeDataReady,
|
|
21
21
|
} from '../shared/pmProgress.helpers'
|
|
22
|
+
import { TreeNormalizer } from '../shared/TreeNormalizer'
|
|
22
23
|
import { persist } from 'effector-storage/session'
|
|
23
24
|
import { SessionStorageKeys } from '../shared/pmProgress.constants'
|
|
24
25
|
|
|
@@ -95,11 +96,12 @@ export class PmTreeModel {
|
|
|
95
96
|
})
|
|
96
97
|
}
|
|
97
98
|
|
|
98
|
-
public initTreeFx = createEffect(({ user }: PmProgressGateProps) => {
|
|
99
|
-
|
|
99
|
+
public initTreeFx = createEffect(async ({ user }: PmProgressGateProps) => {
|
|
100
|
+
const [tree, stats] = await Promise.all([
|
|
100
101
|
this.api.getTreeFx(user.setting.practiceModeTreeId),
|
|
101
102
|
this.api.getStatisticsFx({ entityIds: [user._id] }),
|
|
102
103
|
])
|
|
104
|
+
return [TreeNormalizer.normalize(tree), stats] as const
|
|
103
105
|
})
|
|
104
106
|
|
|
105
107
|
public readonly getTreeContextFx = attach({
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Skill, SkillsMapping, TreeMappingResponse } from './pmProgress.types'
|
|
2
|
+
|
|
3
|
+
type TreeMapping = TreeMappingResponse['treeMapping']
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Some skills from the API lack a valid ability (missing sectionId and functionName),
|
|
7
|
+
* making them impossible to open in the solving flow. This normalizer strips those skills
|
|
8
|
+
* and cascades the cleanup - removing standards, domains, etc. that end up empty.
|
|
9
|
+
*
|
|
10
|
+
* Acts as a single place to sanitize the tree API response before it enters the app.
|
|
11
|
+
* Can be extended with additional normalizations as new edge cases arise.
|
|
12
|
+
*/
|
|
13
|
+
export class TreeNormalizer {
|
|
14
|
+
static normalize(response: TreeMappingResponse): TreeMappingResponse {
|
|
15
|
+
const skillsMapping = this.getOnlyValidSkills(response.skillsMapping)
|
|
16
|
+
const validIds = new Set(Object.keys(skillsMapping))
|
|
17
|
+
const treeMapping = this.removeEmptyNodes(response.treeMapping, validIds)
|
|
18
|
+
return { ...response, skillsMapping, treeMapping }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static isSkillValid(skill: Skill) {
|
|
22
|
+
return Boolean(skill?.ability && (skill.ability.sectionId || skill.ability.functionName))
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private static getOnlyValidSkills(mapping: SkillsMapping): SkillsMapping {
|
|
26
|
+
return Object.fromEntries(
|
|
27
|
+
Object.entries(mapping).filter(([, skill]) => this.isSkillValid(skill)),
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private static removeEmptyNodes(treeMapping: TreeMapping, validIds: Set<string>): TreeMapping {
|
|
32
|
+
const emptyIds = this.getEmptyNodeIds(treeMapping, validIds)
|
|
33
|
+
|
|
34
|
+
return Object.fromEntries(
|
|
35
|
+
Object.entries(treeMapping)
|
|
36
|
+
.filter(([id]) => !emptyIds.has(id))
|
|
37
|
+
.map(([id, node]) => [
|
|
38
|
+
id,
|
|
39
|
+
{
|
|
40
|
+
...node,
|
|
41
|
+
skills: node.skills.filter((sid) => validIds.has(sid)),
|
|
42
|
+
children: node.children.filter((cid) => !emptyIds.has(cid)),
|
|
43
|
+
},
|
|
44
|
+
]),
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private static getEmptyNodeIds(treeMapping: TreeMapping, validIds: Set<string>) {
|
|
49
|
+
const empty = new Set<string>()
|
|
50
|
+
|
|
51
|
+
const leafToRoot = Object.entries(treeMapping).sort(
|
|
52
|
+
([, a], [, b]) => b.parents.length - a.parents.length,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
for (const [id, node] of leafToRoot) {
|
|
56
|
+
const isEmptyLeaf = node.skills.length > 0 && node.skills.every((s) => !validIds.has(s))
|
|
57
|
+
const isEmptyParent = node.children.length > 0 && node.children.every((c) => empty.has(c))
|
|
58
|
+
|
|
59
|
+
if (isEmptyLeaf || isEmptyParent) empty.add(id)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return empty
|
|
63
|
+
}
|
|
64
|
+
}
|