@pie-element/graphing-solution-set 6.2.2-beta.8 → 6.2.2-beta.9

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","names":["_lodashEs","require","VALID_GRID_VALUES","PREFERRED_VALID_GRID_VALUES","VALID_LABEL_VALUES","exports","getGridValues","axis","size","prefferedValues","minValue","max","min","maxValue","values","filter","value","getLabelValues","applyConstraints","oldGridValues","oldLabelValues","gridValues","labelValues","step","isEqual","includes","preferredValues","lowestValue","labelStep","getPlotablePoints","prop","tickValues","tickVal","indexOf","push","Math","round","tV","filterPlotableMarks","domain","range","answers","domainValues","rangeValues","isPointPlotable","x","y","Object","entries","reduce","newAnswers","key","answer","marks","mark","type","points","find","point","from","root","to","edge","building","distance","a","b","Number","sqrt","toFixed","pointInPolygon","polygon","c","inside","clonePolygon","i","length","lineIntersect","x1","y1","x2","y2","x3","y3","x4","y4","ua","denominator","isPointInsideGraph","isPointOnOrInsideGraph","findIntersectionPointForMark","intersectionPoint","tempData","intersection","sortPointsClockWise","sort","cy","cx","center","startAng","forEach","ang","atan2","PI","angle","ccwPoints","reverse","unshift","pop","map","attr","dotProduct","v1","v2","magnitude","v","angleBetweenVectors","dot","magV1","magV2","acos","pointInAngle","commonPoint","point1","point2","testPoint","vector1","vector2","testVector","angle1","angle2","angleSum","tolerance","abs","removeDuplicatesFromArray","array","obj","index","findIndex","o","removeDuplicateAndFilterSections","sections","section","findSectionsInSolutionSetForOneLine","concat","findSectionsInSolutionSetForTwoLines","gssLineData","mark1","mark2","cornerPoints","intersectPoint","intersectionPoint1","intersectionPoint2","j","bucket","newCornerPoints","k","sections1","sections2","o1","some","o2","sections3","findSectionsInSolutionSet","numberOfLines","pointInsidePolygon","num_vertices","p1","p2","x_intersection","checkIfLinesAreAdded"],"sources":["../src/utils.js"],"sourcesContent":["import { isEqual } from 'lodash-es';\n\n/*Valid grid values*/\nconst VALID_GRID_VALUES = [\n 0.01, 0.02, 0.04, 0.05, 0.0625, 0.1, 0.125, 0.2, 0.25, 0.5, 1, 2, 3, 4, 5, 8, 10, 12, 15, 20, 40, 50, 64, 100, 500,\n 1000,\n];\n\n// same as VALID_GRID_VALUES but next values are excluded: 0.04, 0.0625, 0.125, 3, 4, 8, 12, 15, 40, 64\nconst PREFERRED_VALID_GRID_VALUES = [0.01, 0.02, 0.05, 0.1, 0.2, 0.25, 0.5, 1, 2, 5, 10, 20, 50, 100, 500, 1000];\n\n/*Valid label values*/\nexport const VALID_LABEL_VALUES = {\n 0.01: [0, 0.01, 0.02, 0.04, 0.05, 0.1],\n 0.02: [0, 0.02, 0.04, 0.1],\n 0.04: [0, 0.04, 0.08, 0.16, 0.2],\n 0.05: [0, 0.05, 0.1, 0.2, 0.25],\n 0.0625: [0, 0.0625, 0.125, 0.25, 0.5],\n 0.1: [0, 0.1, 0.2, 0.4, 0.5, 1],\n 0.125: [0, 0.125, 0.25, 0.5, 1],\n 0.2: [0, 0.2, 0.5, 0.1],\n 0.25: [0, 0.25, 0.5, 1, 2],\n 0.5: [0, 0.5, 1, 2],\n 1: [0, 1, 2, 4, 5, 10],\n 2: [0, 2, 4, 8, 10],\n 3: [0, 3, 6, 12, 15],\n 4: [0, 4, 8, 16, 20],\n 5: [0, 5, 10, 20, 25],\n 8: [0, 8, 16, 32, 40, 64],\n 10: [0, 10, 20, 40, 50, 100],\n 12: [0, 12, 24],\n 15: [0, 15, 30, 60],\n 20: [0, 20, 40, 80, 100],\n 40: [0, 40, 80, 160, 200],\n 50: [0, 50, 100, 200, 250],\n 64: [0, 64, 128],\n 100: [0, 100, 200, 400, 500],\n 500: [0, 500, 1000, 2500],\n 1000: [0, 1000, 2000, 4000, 5000],\n};\n\n/*\n * Function to get grid values\n * @param {Object} axis - axis object\n * @param {Number} size - size of the axis\n * @param {Boolean} prefferedValues - flag to get preffered values\n * */\nexport const getGridValues = (axis, size, prefferedValues = false) => {\n const minValue = (10 * (axis.max - axis.min)) / size;\n const maxValue = minValue * 10;\n const values = prefferedValues ? PREFERRED_VALID_GRID_VALUES : VALID_GRID_VALUES;\n return values.filter((value) => value >= minValue && value <= maxValue);\n};\n\n/*\n * Function to get label values\n * @param {Number} value - value of the axis step\n * */\nexport const getLabelValues = (value) => VALID_LABEL_VALUES[value] || [];\n\n/*\n * Function to apply constraints\n * @param {Object} axis - axis object\n * @param {Number} size - size of the axis\n * @param {Array} oldGridValues - old grid values\n * @param {Array} oldLabelValues - old label values\n * */\nexport const applyConstraints = (axis, size, oldGridValues, oldLabelValues) => {\n const gridValues = getGridValues(axis, size);\n let labelValues = getLabelValues(axis.step);\n if (!isEqual(oldGridValues, gridValues) && !gridValues.includes(axis.step)) {\n const preferredValues = getGridValues(axis, size, true);\n const lowestValue = preferredValues[0] || 1;\n axis.step = lowestValue;\n labelValues = getLabelValues(lowestValue);\n if (!labelValues.includes(axis.labelStep)) {\n axis.labelStep = lowestValue;\n }\n return { gridValues, labelValues };\n }\n if (!isEqual(oldLabelValues, labelValues) && !labelValues.includes(axis.labelStep)) {\n axis.labelStep = axis.step;\n }\n return { gridValues, labelValues };\n};\n\n// also used in pie-lib/graphing/utils as 'getTickValues'\n/*\n * Function to get plotable points\n * @param {Object} prop - axis object\n * */\nconst getPlotablePoints = (prop) => {\n const tickValues = [];\n let tickVal = 0;\n while (tickVal >= prop.min && tickValues.indexOf(tickVal) < 0) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal - prop.step) * 10000) / 10000;\n }\n tickVal = Math.round(prop.step * 10000) / 10000;\n while (tickVal <= prop.max && tickValues.indexOf(tickVal) < 0) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 10000) / 10000;\n }\n // return only ticks that are inside the min-max interval\n if (tickValues) {\n return tickValues.filter((tV) => tV >= prop.min && tV <= prop.max);\n }\n return [];\n};\n\n/*\n * Function to get plotable marks\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * @param {Object} answers - answers object\n * */\nexport const filterPlotableMarks = (domain, range, answers) => {\n const domainValues = getPlotablePoints(domain);\n const rangeValues = getPlotablePoints(range);\n const isPointPlotable = (x, y) => domainValues.includes(x) && rangeValues.includes(y);\n return Object.entries(answers || {}).reduce((newAnswers, [key, answer]) => {\n newAnswers[key] = {\n ...answer,\n marks: (answer.marks || []).filter((mark) => {\n if (mark.type === 'point') {\n return isPointPlotable(mark.x, mark.y);\n }\n if (mark.type === 'polygon') {\n return !mark.points.find((point) => !isPointPlotable(point.x, point.y));\n }\n const from = mark.from || mark.root;\n const to = mark.to || mark.edge;\n return mark.building\n ? isPointPlotable(from.x, from.y)\n : isPointPlotable(from.x, from.y) && isPointPlotable(to.x, to.y);\n }),\n };\n return newAnswers;\n }, {});\n};\n\n//////////////////////////////////////////////////////////////////////////////////\n// BELOW FUNCTIONS ARE USED IN src/utils as well\n//////////////////////////////////////////////////////////////////////////////////\n\n/*\n * Function to calculate the distance between two points\n * @param {Object} a - point a\n * @param {Object} b - point b\n * */\nconst distance = (a, b) => {\n return Number(Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2).toFixed(3));\n};\n\n/*\n * Function to check if a point lies on edges of a polygon\n * @param {Object} point - point object\n * @param {Array} polygon - polygon points array\n * */\nconst pointInPolygon = (point, polygon) => {\n let c = point;\n let inside = false;\n let clonePolygon = [...polygon];\n clonePolygon.push(polygon[0]);\n for (let i = 0; i < clonePolygon.length - 1; i++) {\n let a = clonePolygon[i];\n let b = clonePolygon[i + 1];\n // check if point is on the edge\n if (distance(a, c) + distance(c, b) === distance(a, b)) {\n inside = true;\n break;\n }\n }\n return inside;\n};\n\n/*\n * Function to get the intersection point of two lines\n * @param {Number} x1 - x coordinate of point 1 of line 1\n * @param {Number} y1 - y coordinate of point 1 of line 1\n * @param {Number} x2 - x coordinate of point 2 of line 1\n * @param {Number} y2 - y coordinate of point 2 of line 1\n * @param {Number} x3 - x coordinate of point 1 of line 2\n * @param {Number} y3 - y coordinate of point 1 of line 2\n * @param {Number} x4 - x coordinate of point 2 of line 2\n * @param {Number} y4 - y coordinate of point 2 of line 2\n * */\nconst lineIntersect = (x1, y1, x2, y2, x3, y3, x4, y4) => {\n let ua,\n denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);\n if (denominator === 0) {\n return null;\n }\n ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator;\n return {\n x: Number((x1 + ua * (x2 - x1)).toFixed(3)),\n y: Number((y1 + ua * (y2 - y1)).toFixed(3)),\n };\n};\n\n/*\n * Check if a point is inside the graph\n * @param {Object} point - point object\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * */\nconst isPointInsideGraph = (point, domain, range) => {\n return point.x > domain.min && point.x < domain.max && point.y > range.min && point.y < range.max;\n};\n\n/*\n * Check if a point is on or inside the graph\n * @param {Object} point - point object\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * */\nconst isPointOnOrInsideGraph = (point, domain, range) => {\n return point.x >= domain.min && point.x <= domain.max && point.y >= range.min && point.y <= range.max;\n};\n\n/*\n * Find the intersection point of a mark with the graph\n * @param {Object} mark - mark object\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * */\nconst findIntersectionPointForMark = (mark, domain, range) => {\n let intersectionPoint = [];\n let tempData = [\n [domain.max, range.max, domain.max, range.min],\n [domain.min, range.max, domain.min, range.min],\n [domain.min, range.max, domain.max, range.max],\n [domain.min, range.min, domain.max, range.min],\n ];\n for (let i = 0; i < tempData.length; i++) {\n let intersection = lineIntersect(\n mark.from.x,\n mark.from.y,\n mark.to.x,\n mark.to.y,\n tempData[i][0],\n tempData[i][1],\n tempData[i][2],\n tempData[i][3],\n );\n if (intersection && isPointOnOrInsideGraph(intersection, domain, range)) {\n intersectionPoint.push(intersection);\n }\n }\n return intersectionPoint;\n};\n\n/*\n * Sort points in clockwise direction for a polygon\n * @param {Array} points - points array\n * */\nconst sortPointsClockWise = (points) => {\n // Find min max to get center and Sort from top to bottom\n points.sort((a, b) => a.y - b.y);\n // Get center y\n const cy = (points[0].y + points[points.length - 1].y) / 2;\n // Sort from right to left\n points.sort((a, b) => b.x - a.x);\n // Get center x\n const cx = (points[0].x + points[points.length - 1].x) / 2;\n // Center point\n const center = { x: cx, y: cy };\n // As the points are sorted from right to left the first point is the rightmost Starting angle used to reference other angles\n let startAng;\n points.forEach((point) => {\n let ang = Math.atan2(point.y - center.y, point.x - center.x);\n if (!startAng) {\n startAng = ang;\n } else {\n if (ang < startAng) {\n // ensure that all points are clockwise of the start point\n ang += Math.PI * 2;\n }\n }\n point.angle = ang; // add the angle to the point\n });\n // first sort clockwise\n points.sort((a, b) => a.angle - b.angle);\n // then reverse the order\n const ccwPoints = points.reverse();\n // move the last point back to the start\n ccwPoints.unshift(ccwPoints.pop());\n return ccwPoints.map(({ angle, ...attr }) => attr);\n};\n\n/*\n * Function to calculate the dot product of two vectors\n * @param {Object} v1 - point 1\n * @param {Object} v2 - point 2\n * */\nconst dotProduct = (v1, v2) => {\n return v1.x * v2.x + v1.y * v2.y;\n};\n\n/*\n * Function to calculate the magnitude of a vector\n * @param {Object} v - point object\n * */\nconst magnitude = (v) => {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n};\n\n/*\n * Function to calculate the angle between two vectors in radians\n * @param {Object} v1 - point 1\n * @param {Object} v2 - point 2\n * */\nconst angleBetweenVectors = (v1, v2) => {\n const dot = dotProduct(v1, v2);\n const magV1 = magnitude(v1);\n const magV2 = magnitude(v2);\n // Ensure the dot product is within the domain of the acos function\n return Math.acos(dot / (magV1 * magV2));\n};\n\n/*\n * Function to check if a point lies between the angle formed by two lines\n * @param {Object} commonPoint - common point of the two lines\n * @param {Object} point1 - point 1 of cone\n * @param {Object} point2 - point 2 of cone\n * @param {Object} testPoint - point to be tested\n * */\nconst pointInAngle = (commonPoint, point1, point2, testPoint) => {\n const vector1 = { x: point1.x - commonPoint.x, y: point1.y - commonPoint.y };\n const vector2 = { x: point2.x - commonPoint.x, y: point2.y - commonPoint.y };\n const testVector = { x: testPoint.x - commonPoint.x, y: testPoint.y - commonPoint.y };\n const angle1 = angleBetweenVectors(vector1, testVector);\n const angle2 = angleBetweenVectors(vector2, testVector);\n const angleSum = angle1 + angle2;\n // Check if the sum of angles is approximately equal to the angle between the two lines\n // You may need to adjust the tolerance (e.g., 0.0001) based on your specific requirements\n const tolerance = 0.0001;\n return Math.abs(angleSum - angleBetweenVectors(vector1, vector2)) < tolerance;\n};\n\n/*\n * Function to remove duplicate points from an array\n * @param {Array} array - array of points\n * */\nconst removeDuplicatesFromArray = (array) => {\n return array.filter((obj, index) => {\n return index === array.findIndex((o) => obj.x === o.x && obj.y === o.y);\n });\n};\n\n/*\n * Function to remove duplicate points and filter sections\n * @param {Array} sections - array of sections\n * */\nconst removeDuplicateAndFilterSections = (sections) => {\n //removing duplicate points.\n for (let i = 0; i < sections.length; i++) {\n sections[i] = sections[i].filter((obj, index) => {\n return index === sections[i].findIndex((o) => obj.x === o.x && obj.y === o.y);\n });\n }\n //removing arrays with two points\n sections = sections.filter((section) => section.length > 2);\n //sorting the points in clockwise direction\n for (let i = 0; i < sections.length; i++) {\n sections[i] = sortPointsClockWise(sections[i]);\n }\n return sections;\n};\n\n/*\n * Function to find sections in solution set for one line\n * @param {Array} intersectionPoint - intersection point\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * */\nconst findSectionsInSolutionSetForOneLine = (intersectionPoint, domain, range) => {\n let sections = [];\n sections.push([].concat(intersectionPoint));\n sections.push([].concat(intersectionPoint));\n if (\n (intersectionPoint[0].x === domain.max && intersectionPoint[1].y === range.max) ||\n (intersectionPoint[1].x === domain.max && intersectionPoint[0].y === range.max)\n ) {\n sections[0].push({ x: domain.max, y: range.max });\n sections[1].push({ x: domain.min, y: range.max }, { x: domain.min, y: range.min }, { x: domain.max, y: range.min });\n } else if (\n (intersectionPoint[0].x === domain.min && intersectionPoint[1].y === range.max) ||\n (intersectionPoint[1].x === domain.min && intersectionPoint[0].y === range.max)\n ) {\n sections[0].push({ x: domain.min, y: range.max });\n sections[1].push({ x: domain.max, y: range.max }, { x: domain.max, y: range.min }, { x: domain.min, y: range.min });\n } else if (\n (intersectionPoint[0].x === domain.min && intersectionPoint[1].y === range.min) ||\n (intersectionPoint[1].x === domain.min && intersectionPoint[0].y === range.min)\n ) {\n sections[0].push({ x: domain.min, y: range.min });\n sections[1].push({ x: domain.max, y: range.min }, { x: domain.max, y: range.max }, { x: domain.min, y: range.max });\n } else if (\n (intersectionPoint[0].x === domain.max && intersectionPoint[1].y === range.min) ||\n (intersectionPoint[1].x === domain.max && intersectionPoint[0].y === range.min)\n ) {\n sections[0].push({ x: domain.max, y: range.min });\n sections[1].push({ x: domain.min, y: range.min }, { x: domain.min, y: range.max }, { x: domain.max, y: range.max });\n } else if (\n (intersectionPoint[0].x === domain.min && intersectionPoint[1].x === domain.max) ||\n (intersectionPoint[0].x === domain.max && intersectionPoint[1].x === domain.min)\n ) {\n sections[0].push({ x: domain.min, y: range.max }, { x: domain.max, y: range.max });\n sections[1].push({ x: domain.min, y: range.min }, { x: domain.max, y: range.min });\n } else if (\n (intersectionPoint[0].y === range.min && intersectionPoint[1].y === range.max) ||\n (intersectionPoint[0].y === range.max && intersectionPoint[1].y === range.min)\n ) {\n sections[0].push({ x: domain.min, y: range.min }, { x: domain.min, y: range.max });\n sections[1].push({ x: domain.max, y: range.min }, { x: domain.max, y: range.max });\n }\n return removeDuplicateAndFilterSections(sections);\n};\n\n/*\n * Function to find sections in solution set for two lines\n * @param {Object} gssLineData - graphing solution set line data\n * @param {Array} answers - answers array\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * */\nconst findSectionsInSolutionSetForTwoLines = (gssLineData, answers, domain, range) => {\n let mark1 = answers[0];\n let mark2 = answers[1];\n let cornerPoints = [\n { x: domain.min, y: range.min },\n { x: domain.min, y: range.max },\n { x: domain.max, y: range.min },\n { x: domain.max, y: range.max },\n ];\n let intersectPoint = lineIntersect(\n mark1.from.x,\n mark1.from.y,\n mark1.to.x,\n mark1.to.y,\n mark2.from.x,\n mark2.from.y,\n mark2.to.x,\n mark2.to.y,\n );\n let sections = [];\n let intersectionPoint1 = findIntersectionPointForMark(mark1, domain, range);\n intersectionPoint1 = removeDuplicatesFromArray(intersectionPoint1);\n let intersectionPoint2 = findIntersectionPointForMark(mark2, domain, range);\n intersectionPoint2 = removeDuplicatesFromArray(intersectionPoint2);\n if (intersectPoint && isPointInsideGraph(intersectPoint, domain, range)) {\n for (let i = 0; i < intersectionPoint1.length; i++) {\n for (let j = 0; j < intersectionPoint2.length; j++) {\n let bucket = [];\n let newCornerPoints = [];\n bucket.push(intersectPoint);\n bucket.push(intersectionPoint1[i]);\n bucket.push(intersectionPoint2[j]);\n for (let k = 0; k < cornerPoints.length; k++) {\n if (pointInAngle(intersectPoint, intersectionPoint1[i], intersectionPoint2[j], cornerPoints[k])) {\n bucket.push(cornerPoints[k]);\n } else {\n newCornerPoints.push(cornerPoints[k]);\n }\n }\n cornerPoints = newCornerPoints;\n sections.push(bucket);\n }\n }\n } else {\n let sections1 = findSectionsInSolutionSetForOneLine(intersectionPoint1, domain, range);\n let sections2 = findSectionsInSolutionSetForOneLine(intersectionPoint2, domain, range);\n for (let i = 0; i < sections1.length; i++) {\n if (\n !(pointInPolygon(intersectionPoint2[0], sections1[i]) && pointInPolygon(intersectionPoint2[1], sections1[i]))\n ) {\n sections.push(sections1[i]);\n }\n }\n for (let i = 0; i < sections2.length; i++) {\n if (\n !(pointInPolygon(intersectionPoint1[0], sections2[i]) && pointInPolygon(intersectionPoint1[1], sections2[i]))\n ) {\n sections.push(sections2[i]);\n }\n }\n for (let i = 0; i < sections.length; i++) {\n cornerPoints = cornerPoints.filter(function (o1) {\n return !sections[i].some(function (o2) {\n return o1.x === o2.x && o1.y === o2.y;\n });\n });\n }\n let sections3 = cornerPoints.concat(intersectionPoint1, intersectionPoint2);\n sections.push(sections3);\n }\n return removeDuplicateAndFilterSections(sections);\n};\n\n/*\n * Function to find sections in solution set\n * @param {Object} gssLineData - graphing solution set line data\n * @param {Array} answers - answers array\n * @param {Object} domain - domain object\n * @param {Object} range - range object\n * */\nexport const findSectionsInSolutionSet = (gssLineData, answers, domain, range) => {\n if (gssLineData.numberOfLines === 1) {\n const intersectionPoint = findIntersectionPointForMark(answers[0], domain, range);\n gssLineData.sections = findSectionsInSolutionSetForOneLine(intersectionPoint, domain, range);\n } else {\n gssLineData.sections = findSectionsInSolutionSetForTwoLines(gssLineData, answers, domain, range);\n }\n return gssLineData;\n};\n\n/*\n * Function to check if a point is inside a polygon\n * @param {Object} point - point to be checked\n * @param {Array} polygon - polygon points array\n * */\nexport const pointInsidePolygon = (point, polygon) => {\n const num_vertices = polygon.length;\n const x = point.x;\n const y = point.y;\n let inside = false;\n let p1 = polygon[0];\n let p2;\n for (let i = 1; i <= num_vertices; i++) {\n p2 = polygon[i % num_vertices];\n if (y > Math.min(p1.y, p2.y)) {\n if (y <= Math.max(p1.y, p2.y)) {\n if (x <= Math.max(p1.x, p2.x)) {\n const x_intersection = ((y - p1.y) * (p2.x - p1.x)) / (p2.y - p1.y) + p1.x;\n if (p1.x === p2.x || x <= x_intersection) {\n inside = !inside;\n }\n }\n }\n }\n p1 = p2;\n }\n return inside;\n};\n\n/*\n * Function to check if lines are added in the graph\n * @param {Object} gssLineData - graphing solution set line data\n * @param {Array} answer - answer array\n * */\nexport const checkIfLinesAreAdded = (gssLineData, answer) => {\n if (answer.length === 0) {\n return false;\n }\n if (gssLineData.numberOfLines === 1) {\n if (answer.length === 1) {\n return !answer[0].building;\n }\n } else {\n if (answer.length !== 2) {\n return false;\n } else {\n return !answer[1].building;\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,69 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- /*
8
- * This file contains the default configuration for the Graphing Solution Set Item Type.
9
- * Model is similar to the one used in graphing item type except for the gssLineData object which handles
10
- * the configuration for the lines and the solution set.
11
- *
12
- * Same model is used in configure/src default.js
13
- * */
14
- var _default = exports.default = {
15
- answers: {
16
- correctAnswer: {
17
- name: 'Correct Answer',
18
- marks: []
19
- }
20
- },
21
- arrows: {
22
- left: true,
23
- right: true,
24
- up: true,
25
- down: true
26
- },
27
- marks: [],
28
- defaultGridConfiguration: 0,
29
- domain: {
30
- min: -5,
31
- max: 5,
32
- step: 1,
33
- labelStep: 1,
34
- axisLabel: 'x'
35
- },
36
- graph: {
37
- width: 500,
38
- height: 500
39
- },
40
- gssLineData: {
41
- numberOfLines: 1,
42
- selectedTool: 'lineA',
43
- sections: [],
44
- lineA: {
45
- lineType: 'Solid'
46
- }
47
- },
48
- includeAxes: true,
49
- labels: {},
50
- labelsEnabled: true,
51
- padding: true,
52
- prompt: '',
53
- range: {
54
- min: -5,
55
- max: 5,
56
- step: 1,
57
- labelStep: 1,
58
- axisLabel: 'y'
59
- },
60
- rationale: '',
61
- standardGrid: false,
62
- title: '',
63
- coordinatesOnHover: false,
64
- promptEnabled: true,
65
- rationaleEnabled: true,
66
- teacherInstructionsEnabled: true,
67
- studentInstructionsEnabled: true
68
- };
69
- //# sourceMappingURL=defaults.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.js","names":["_default","exports","default","answers","correctAnswer","name","marks","arrows","left","right","up","down","defaultGridConfiguration","domain","min","max","step","labelStep","axisLabel","graph","width","height","gssLineData","numberOfLines","selectedTool","sections","lineA","lineType","includeAxes","labels","labelsEnabled","padding","prompt","range","rationale","standardGrid","title","coordinatesOnHover","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled"],"sources":["../src/defaults.js"],"sourcesContent":["/*\n * This file contains the default configuration for the Graphing Solution Set Item Type.\n * Model is similar to the one used in graphing item type except for the gssLineData object which handles\n * the configuration for the lines and the solution set.\n *\n * Same model is used in configure/src default.js\n * */\nexport default {\n answers: {\n correctAnswer: {\n name: 'Correct Answer',\n marks: [],\n },\n },\n arrows: {\n left: true,\n right: true,\n up: true,\n down: true,\n },\n marks: [],\n defaultGridConfiguration: 0,\n domain: {\n min: -5,\n max: 5,\n step: 1,\n labelStep: 1,\n axisLabel: 'x',\n },\n graph: {\n width: 500,\n height: 500,\n },\n gssLineData: {\n numberOfLines: 1,\n selectedTool: 'lineA',\n sections: [],\n lineA: {\n lineType: 'Solid',\n },\n },\n includeAxes: true,\n labels: {},\n labelsEnabled: true,\n padding: true,\n prompt: '',\n range: {\n min: -5,\n max: 5,\n step: 1,\n labelStep: 1,\n axisLabel: 'y',\n },\n rationale: '',\n standardGrid: false,\n title: '',\n coordinatesOnHover: false,\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAAAA,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAOe;EACbC,OAAO,EAAE;IACPC,aAAa,EAAE;MACbC,IAAI,EAAE,gBAAgB;MACtBC,KAAK,EAAE;IACT;EACF,CAAC;EACDC,MAAM,EAAE;IACNC,IAAI,EAAE,IAAI;IACVC,KAAK,EAAE,IAAI;IACXC,EAAE,EAAE,IAAI;IACRC,IAAI,EAAE;EACR,CAAC;EACDL,KAAK,EAAE,EAAE;EACTM,wBAAwB,EAAE,CAAC;EAC3BC,MAAM,EAAE;IACNC,GAAG,EAAE,CAAC,CAAC;IACPC,GAAG,EAAE,CAAC;IACNC,IAAI,EAAE,CAAC;IACPC,SAAS,EAAE,CAAC;IACZC,SAAS,EAAE;EACb,CAAC;EACDC,KAAK,EAAE;IACLC,KAAK,EAAE,GAAG;IACVC,MAAM,EAAE;EACV,CAAC;EACDC,WAAW,EAAE;IACXC,aAAa,EAAE,CAAC;IAChBC,YAAY,EAAE,OAAO;IACrBC,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE;MACLC,QAAQ,EAAE;IACZ;EACF,CAAC;EACDC,WAAW,EAAE,IAAI;EACjBC,MAAM,EAAE,CAAC,CAAC;EACVC,aAAa,EAAE,IAAI;EACnBC,OAAO,EAAE,IAAI;EACbC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;IACLnB,GAAG,EAAE,CAAC,CAAC;IACPC,GAAG,EAAE,CAAC;IACNC,IAAI,EAAE,CAAC;IACPC,SAAS,EAAE,CAAC;IACZC,SAAS,EAAE;EACb,CAAC;EACDgB,SAAS,EAAE,EAAE;EACbC,YAAY,EAAE,KAAK;EACnBC,KAAK,EAAE,EAAE;EACTC,kBAAkB,EAAE,KAAK;EACzBC,aAAa,EAAE,IAAI;EACnBC,gBAAgB,EAAE,IAAI;EACtBC,0BAA0B,EAAE,IAAI;EAChCC,0BAA0B,EAAE;AAC9B,CAAC","ignoreList":[]}
@@ -1,351 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.getBestAnswer = exports.getAnswerCorrected = exports.createCorrectResponseSession = exports.compareMarks = void 0;
8
- exports.model = model;
9
- exports.normalize = void 0;
10
- exports.outcome = outcome;
11
- exports.validate = void 0;
12
- var _debug = _interopRequireDefault(require("debug"));
13
- var _lodashEs = require("lodash-es");
14
- var _defaults = _interopRequireDefault(require("./defaults"));
15
- var _utils = require("./utils");
16
- const log = (0, _debug.default)('@pie-element:graphing-solution-set:controller');
17
- const initializeGraphMap = () => ({
18
- line: []
19
- });
20
-
21
- /*
22
- * Function to compare two marks
23
- * @param {Object} mark1 - first mark
24
- * @param {Object} mark2 - second mark
25
- * */
26
- const compareMarks = (mark1, mark2) => {
27
- // marks can be compared with equalMarks[type] function only if they have the same type;
28
- // if type is different, they are clearly not equal
29
- return !!(mark1 && mark2 && mark1.type === mark2.type && _utils.equalMarks[mark1.type] && _utils.equalMarks[mark1.type](mark1, mark2));
30
- };
31
-
32
- /*
33
- * Function to get the corrected answer
34
- * @param {Object} sessionAnswers - array of marks from session
35
- * @param {Object} marks - array of marks from correct answer
36
- * */
37
- exports.compareMarks = compareMarks;
38
- const getAnswerCorrected = ({
39
- sessionAnswers,
40
- marks: correctAnswers
41
- }) => {
42
- sessionAnswers = sessionAnswers || [];
43
- correctAnswers = correctAnswers || [];
44
- const rez = (0, _lodashEs.cloneDeep)(sessionAnswers).reduce((correctedAnswer, answer) => {
45
- const answerIsCorrect = correctAnswers.find(mark => compareMarks(answer, mark));
46
- answer.correctness = answerIsCorrect ? 'correct' : 'incorrect';
47
- return [...correctedAnswer, answer];
48
- }, []);
49
- // add missing objects from correct answer
50
- const missingAnswers = (0, _lodashEs.cloneDeep)(correctAnswers).reduce((correctedAnswer, answer) => {
51
- const answerIndex = sessionAnswers.find(mark => compareMarks(answer, mark));
52
- if (!answerIndex) {
53
- // means that corrected answer is missing from session, so we mark it as missing object
54
- return [...correctedAnswer, {
55
- ...answer,
56
- correctness: 'missing'
57
- }];
58
- }
59
- return correctedAnswer;
60
- }, []);
61
- return [...rez, ...missingAnswers];
62
- };
63
-
64
- /*
65
- * Function to get the best answer
66
- * @param {Object} question - question object
67
- * @param {Object} session - session object
68
- * @param {Object} env - env object
69
- * */
70
- exports.getAnswerCorrected = getAnswerCorrected;
71
- const getBestAnswer = (question, session, env = {}) => {
72
- // questionPossibleAnswers contains all possible answers (correct response and alternates);
73
- let {
74
- answers: questionPossibleAnswers = {},
75
- scoringType
76
- } = question || {};
77
- let {
78
- answer
79
- } = session || {};
80
- // filter the incomplete objects
81
- Object.entries(questionPossibleAnswers || {}).forEach(([key, value]) => questionPossibleAnswers[key] = {
82
- ...value,
83
- marks: value?.marks.filter(mark => !mark.building)
84
- });
85
- // initialize answer if no values
86
- answer = answer || [];
87
- // initialize one possible answer if no values
88
- if ((0, _lodashEs.isEmpty)(questionPossibleAnswers)) {
89
- questionPossibleAnswers = {
90
- correctAnswer: initializeGraphMap()
91
- };
92
- } else {
93
- questionPossibleAnswers = {
94
- correctAnswer: questionPossibleAnswers.correctAnswer,
95
- ...(0, _utils.sortedAnswers)(questionPossibleAnswers)
96
- };
97
- }
98
- // student's answers without DUPLICATES
99
- const sessionAnswers = (0, _lodashEs.uniqWith)(answer, compareMarks);
100
- // array of possible answers entries
101
- const possibleAnswers = Object.entries(questionPossibleAnswers);
102
- return possibleAnswers.reduce((acc, entry) => {
103
- // iterating each possible answer (main + alternates)
104
- const possibleAnswerKey = entry[0];
105
- const possibleAnswer = entry[1] || {};
106
- let {
107
- marks
108
- } = possibleAnswer;
109
- if (!marks || !marks.length) {
110
- return acc;
111
- }
112
- // returns array of marks, each having 'correctness' property
113
- const correctedAnswer = getAnswerCorrected({
114
- sessionAnswers,
115
- marks
116
- });
117
- const correctMarks = correctedAnswer.filter(answer => answer.correctness === 'correct');
118
- // filter out missing objects because they do not affect the calculation of the score
119
- // only correct and incorrect are needed
120
- const scoredCorrectedAnswer = correctedAnswer.filter(answer => answer.correctness !== 'missing');
121
- const maxScore = marks.length;
122
- let score = correctMarks.length;
123
- // if extra placements
124
- if (scoredCorrectedAnswer.length > maxScore) {
125
- score -= scoredCorrectedAnswer.length - maxScore;
126
- }
127
- if (score < 0) {
128
- score = 0;
129
- }
130
- if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {
131
- acc.bestScore = Math.floor(score / maxScore);
132
- acc.bestScoreAnswerKey = possibleAnswerKey;
133
- acc.answersCorrected = correctedAnswer;
134
- acc.foundOneSolution = true;
135
- }
136
- return acc;
137
- }, {
138
- bestScore: 0,
139
- bestScoreAnswerKey: null,
140
- // initially we just suppose all the answers are incorrect
141
- answersCorrected: (0, _lodashEs.cloneDeep)(sessionAnswers).map(answer => ({
142
- ...answer,
143
- correctness: 'incorrect'
144
- })),
145
- foundOneSolution: false
146
- });
147
- };
148
-
149
- /*
150
- * Constant normalize
151
- * @param {Object} question - question object
152
- * */
153
- exports.getBestAnswer = getBestAnswer;
154
- const normalize = question => ({
155
- ..._defaults.default,
156
- ...question
157
- });
158
-
159
- /*
160
- * Function to set model
161
- * @param {Object} question - question object
162
- * @param {Object} session - session object
163
- * @param {Object} env - env object
164
- * */
165
- exports.normalize = normalize;
166
- function model(question, session, env) {
167
- return new Promise(resolve => {
168
- const normalizedQuestion = normalize(question);
169
- // ensure removing of invalid answers
170
- // need this if undo redo was last operation
171
- session.answer = (0, _utils.removeInvalidAnswers)(session.answer);
172
- // console.log('normalizedQuestion', normalizedQuestion);
173
- const {
174
- defaultTool,
175
- extraCSSRules,
176
- prompt,
177
- promptEnabled,
178
- graph,
179
- answers,
180
- toolbarTools,
181
- ...questionProps
182
- } = normalizedQuestion || {};
183
- let {
184
- arrows
185
- } = normalizedQuestion;
186
- const {
187
- mode,
188
- role
189
- } = env || {};
190
-
191
- // This is used for offering support for old models which have the property arrows: boolean
192
- // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount
193
- if (typeof arrows === 'boolean') {
194
- if (arrows) {
195
- arrows = {
196
- left: true,
197
- right: true,
198
- up: true,
199
- down: true
200
- };
201
- } else {
202
- arrows = {
203
- left: false,
204
- right: false,
205
- up: false,
206
- down: false
207
- };
208
- }
209
- }
210
- const base = {
211
- ...questionProps,
212
- answers,
213
- arrows,
214
- defaultTool: 'line',
215
- disabled: env.mode !== 'gather',
216
- prompt: promptEnabled ? prompt : null,
217
- rationale: null,
218
- size: graph,
219
- showToggle: env.mode === 'evaluate' && !(0, _lodashEs.isEmpty)(answers) && answers.correctAnswer && answers.correctAnswer.marks && !(0, _lodashEs.isEmpty)(answers.correctAnswer.marks),
220
- teacherInstructions: null,
221
- toolbarTools,
222
- extraCSSRules
223
- };
224
- if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
225
- const {
226
- rationale,
227
- rationaleEnabled,
228
- teacherInstructions,
229
- teacherInstructionsEnabled
230
- } = normalizedQuestion || {};
231
- base.rationale = rationaleEnabled ? rationale : null;
232
- base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;
233
- }
234
- if (mode === 'evaluate') {
235
- if (!(0, _lodashEs.isEmpty)(answers) && answers.correctAnswer && answers.correctAnswer.marks && !(0, _lodashEs.isEmpty)(answers.correctAnswer.marks)) {
236
- const {
237
- answersCorrected,
238
- bestScoreAnswerKey,
239
- bestScore
240
- } = getBestAnswer(normalizedQuestion, session, env);
241
- // array of marks from session with 'correctness' property set
242
- base.answersCorrected = answersCorrected;
243
- base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];
244
- base.showToggle = base.showToggle && bestScore !== 1;
245
- } else {
246
- base.answersCorrected = session && session.answer || [];
247
- base.correctResponse = [];
248
- }
249
- }
250
- log('base: ', base);
251
- resolve(base);
252
- });
253
- }
254
-
255
- /*
256
- * Function to check the outcome
257
- * @param {Object} question - question object
258
- * @param {Object} session - session object
259
- * @param {Object} env - env object
260
- * */
261
- function outcome(question, session, env = {}) {
262
- return new Promise(resolve => {
263
- if (!session || (0, _lodashEs.isEmpty)(session)) {
264
- resolve({
265
- score: 0,
266
- empty: true
267
- });
268
- }
269
- if (env.mode !== 'evaluate' || (0, _lodashEs.isEmpty)(question.answers) || question.answers && question.answers.correctAnswer && (0, _lodashEs.isEmpty)(question.answers.correctAnswer.marks)) {
270
- resolve({
271
- score: 0
272
- });
273
- }
274
- const {
275
- bestScore
276
- } = getBestAnswer(question, session, env);
277
- resolve({
278
- score: bestScore
279
- });
280
- });
281
- }
282
-
283
- /*
284
- * Constant to create correct response session
285
- * @param {Object} question - question object
286
- * @param {Object} env - env object
287
- * */
288
- const createCorrectResponseSession = (question, env) => {
289
- return new Promise(resolve => {
290
- if (env.mode !== 'evaluate' && env.role === 'instructor') {
291
- const {
292
- answers
293
- } = question || {};
294
- let marks = [];
295
- if (answers && Object.values(answers)) {
296
- const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};
297
- marks = correctAnswer.marks || [];
298
- }
299
- resolve({
300
- answer: marks,
301
- id: '1'
302
- });
303
- } else {
304
- resolve(null);
305
- }
306
- });
307
- };
308
-
309
- /*
310
- * Constant to validate model before saving item
311
- * @param {Object} model - model object
312
- * */
313
- exports.createCorrectResponseSession = createCorrectResponseSession;
314
- const validate = (model = {}) => {
315
- const {
316
- answers,
317
- gssLineData
318
- } = model;
319
- const errors = {};
320
- const correctAnswerErrors = {};
321
- let found = false;
322
- if (gssLineData.numberOfLines === 1) {
323
- if (answers.correctAnswer.marks.length < 1) {
324
- found = true;
325
- correctAnswerErrors.correctAnswer = 'At least 1 line object should be defined.';
326
- } else if (answers.correctAnswer.marks.length === 1 && answers.correctAnswer.marks[0].building) {
327
- found = true;
328
- correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';
329
- }
330
- } else {
331
- if (answers.correctAnswer.marks.length < 2) {
332
- found = true;
333
- correctAnswerErrors.correctAnswer = 'At least 2 line object should be defined.';
334
- } else if (answers.correctAnswer.marks.length === 2) {
335
- if (answers.correctAnswer.marks[0].building || answers.correctAnswer.marks[1].building) {
336
- found = true;
337
- correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';
338
- }
339
- }
340
- }
341
- let polygon = answers.correctAnswer.marks.find(mark => mark.type === 'polygon');
342
- if (!found && (!gssLineData.selectedTool === 'solutionSet' || !polygon)) {
343
- correctAnswerErrors.correctAnswer = 'Please select a solution set for the graphing solution set item.';
344
- }
345
- if (!(0, _lodashEs.isEmpty)(correctAnswerErrors)) {
346
- errors.correctAnswerErrors = correctAnswerErrors;
347
- }
348
- return errors;
349
- };
350
- exports.validate = validate;
351
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_lodashEs","_defaults","_utils","log","debug","initializeGraphMap","line","compareMarks","mark1","mark2","type","equalMarks","exports","getAnswerCorrected","sessionAnswers","marks","correctAnswers","rez","cloneDeep","reduce","correctedAnswer","answer","answerIsCorrect","find","mark","correctness","missingAnswers","answerIndex","getBestAnswer","question","session","env","answers","questionPossibleAnswers","scoringType","Object","entries","forEach","key","value","filter","building","isEmpty","correctAnswer","sortedAnswers","uniqWith","possibleAnswers","acc","entry","possibleAnswerKey","possibleAnswer","length","correctMarks","scoredCorrectedAnswer","maxScore","score","bestScore","foundOneSolution","Math","floor","bestScoreAnswerKey","answersCorrected","map","normalize","defaults","model","Promise","resolve","normalizedQuestion","removeInvalidAnswers","defaultTool","extraCSSRules","prompt","promptEnabled","graph","toolbarTools","questionProps","arrows","mode","role","left","right","up","down","base","disabled","rationale","size","showToggle","teacherInstructions","rationaleEnabled","teacherInstructionsEnabled","correctResponse","outcome","empty","createCorrectResponseSession","values","id","validate","gssLineData","errors","correctAnswerErrors","found","numberOfLines","polygon","selectedTool"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport { cloneDeep, isEmpty, uniqWith } from 'lodash-es';\nimport defaults from './defaults';\nimport { equalMarks, sortedAnswers, removeInvalidAnswers } from './utils';\n\nconst log = debug('@pie-element:graphing-solution-set:controller');\n\nconst initializeGraphMap = () => ({\n line: [],\n});\n\n/*\n * Function to compare two marks\n * @param {Object} mark1 - first mark\n * @param {Object} mark2 - second mark\n * */\nexport const compareMarks = (mark1, mark2) => {\n // marks can be compared with equalMarks[type] function only if they have the same type;\n // if type is different, they are clearly not equal\n return !!(\n mark1 &&\n mark2 &&\n mark1.type === mark2.type &&\n equalMarks[mark1.type] &&\n equalMarks[mark1.type](mark1, mark2)\n );\n};\n\n/*\n * Function to get the corrected answer\n * @param {Object} sessionAnswers - array of marks from session\n * @param {Object} marks - array of marks from correct answer\n * */\nexport const getAnswerCorrected = ({ sessionAnswers, marks: correctAnswers }) => {\n sessionAnswers = sessionAnswers || [];\n correctAnswers = correctAnswers || [];\n const rez = cloneDeep(sessionAnswers).reduce((correctedAnswer, answer) => {\n const answerIsCorrect = correctAnswers.find((mark) => compareMarks(answer, mark));\n answer.correctness = answerIsCorrect ? 'correct' : 'incorrect';\n return [...correctedAnswer, answer];\n }, []);\n // add missing objects from correct answer\n const missingAnswers = cloneDeep(correctAnswers).reduce((correctedAnswer, answer) => {\n const answerIndex = sessionAnswers.find((mark) => compareMarks(answer, mark));\n if (!answerIndex) {\n // means that corrected answer is missing from session, so we mark it as missing object\n return [...correctedAnswer, { ...answer, correctness: 'missing' }];\n }\n return correctedAnswer;\n }, []);\n return [...rez, ...missingAnswers];\n};\n\n/*\n * Function to get the best answer\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport const getBestAnswer = (question, session, env = {}) => {\n // questionPossibleAnswers contains all possible answers (correct response and alternates);\n let { answers: questionPossibleAnswers = {}, scoringType } = question || {};\n let { answer } = session || {};\n // filter the incomplete objects\n Object.entries(questionPossibleAnswers || {}).forEach(\n ([key, value]) =>\n (questionPossibleAnswers[key] = { ...value, marks: value?.marks.filter((mark) => !mark.building) }),\n );\n // initialize answer if no values\n answer = answer || [];\n // initialize one possible answer if no values\n if (isEmpty(questionPossibleAnswers)) {\n questionPossibleAnswers = { correctAnswer: initializeGraphMap() };\n } else {\n questionPossibleAnswers = {\n correctAnswer: questionPossibleAnswers.correctAnswer,\n ...sortedAnswers(questionPossibleAnswers),\n };\n }\n // student's answers without DUPLICATES\n const sessionAnswers = uniqWith(answer, compareMarks);\n // array of possible answers entries\n const possibleAnswers = Object.entries(questionPossibleAnswers);\n return possibleAnswers.reduce(\n (acc, entry) => {\n // iterating each possible answer (main + alternates)\n const possibleAnswerKey = entry[0];\n const possibleAnswer = entry[1] || {};\n let { marks } = possibleAnswer;\n if (!marks || !marks.length) {\n return acc;\n }\n // returns array of marks, each having 'correctness' property\n const correctedAnswer = getAnswerCorrected({ sessionAnswers, marks });\n const correctMarks = correctedAnswer.filter((answer) => answer.correctness === 'correct');\n // filter out missing objects because they do not affect the calculation of the score\n // only correct and incorrect are needed\n const scoredCorrectedAnswer = correctedAnswer.filter((answer) => answer.correctness !== 'missing');\n const maxScore = marks.length;\n let score = correctMarks.length;\n // if extra placements\n if (scoredCorrectedAnswer.length > maxScore) {\n score -= scoredCorrectedAnswer.length - maxScore;\n }\n if (score < 0) {\n score = 0;\n }\n if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {\n acc.bestScore = Math.floor(score / maxScore);\n acc.bestScoreAnswerKey = possibleAnswerKey;\n acc.answersCorrected = correctedAnswer;\n acc.foundOneSolution = true;\n }\n return acc;\n },\n {\n bestScore: 0,\n bestScoreAnswerKey: null,\n // initially we just suppose all the answers are incorrect\n answersCorrected: cloneDeep(sessionAnswers).map((answer) => ({ ...answer, correctness: 'incorrect' })),\n foundOneSolution: false,\n },\n );\n};\n\n/*\n * Constant normalize\n * @param {Object} question - question object\n * */\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/*\n * Function to set model\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n // ensure removing of invalid answers\n // need this if undo redo was last operation\n session.answer = removeInvalidAnswers(session.answer);\n // console.log('normalizedQuestion', normalizedQuestion);\n const { defaultTool, extraCSSRules, prompt, promptEnabled, graph, answers, toolbarTools, ...questionProps } =\n normalizedQuestion || {};\n let { arrows } = normalizedQuestion;\n const { mode, role } = env || {};\n\n // This is used for offering support for old models which have the property arrows: boolean\n // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount\n if (typeof arrows === 'boolean') {\n if (arrows) {\n arrows = {\n left: true,\n right: true,\n up: true,\n down: true,\n };\n } else {\n arrows = {\n left: false,\n right: false,\n up: false,\n down: false,\n };\n }\n }\n\n const base = {\n ...questionProps,\n answers,\n arrows,\n defaultTool: 'line',\n disabled: env.mode !== 'gather',\n prompt: promptEnabled ? prompt : null,\n rationale: null,\n size: graph,\n showToggle:\n env.mode === 'evaluate' &&\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks),\n teacherInstructions: null,\n toolbarTools,\n extraCSSRules,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n const { rationale, rationaleEnabled, teacherInstructions, teacherInstructionsEnabled } = normalizedQuestion || {};\n\n base.rationale = rationaleEnabled ? rationale : null;\n base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n }\n\n if (mode === 'evaluate') {\n if (\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks)\n ) {\n const { answersCorrected, bestScoreAnswerKey, bestScore } = getBestAnswer(normalizedQuestion, session, env);\n // array of marks from session with 'correctness' property set\n base.answersCorrected = answersCorrected;\n base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];\n base.showToggle = base.showToggle && bestScore !== 1;\n } else {\n base.answersCorrected = (session && session.answer) || [];\n base.correctResponse = [];\n }\n }\n\n log('base: ', base);\n resolve(base);\n });\n}\n\n/*\n * Function to check the outcome\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport function outcome(question, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n if (\n env.mode !== 'evaluate' ||\n isEmpty(question.answers) ||\n (question.answers && question.answers.correctAnswer && isEmpty(question.answers.correctAnswer.marks))\n ) {\n resolve({ score: 0 });\n }\n const { bestScore } = getBestAnswer(question, session, env);\n resolve({ score: bestScore });\n });\n}\n\n/*\n * Constant to create correct response session\n * @param {Object} question - question object\n * @param {Object} env - env object\n * */\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { answers } = question || {};\n let marks = [];\n if (answers && Object.values(answers)) {\n const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};\n marks = correctAnswer.marks || [];\n }\n resolve({\n answer: marks,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n/*\n * Constant to validate model before saving item\n * @param {Object} model - model object\n * */\nexport const validate = (model = {}) => {\n const { answers, gssLineData } = model;\n const errors = {};\n const correctAnswerErrors = {};\n let found = false;\n if (gssLineData.numberOfLines === 1) {\n if (answers.correctAnswer.marks.length < 1) {\n found = true;\n correctAnswerErrors.correctAnswer = 'At least 1 line object should be defined.';\n } else if (answers.correctAnswer.marks.length === 1 && answers.correctAnswer.marks[0].building) {\n found = true;\n correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';\n }\n } else {\n if (answers.correctAnswer.marks.length < 2) {\n found = true;\n correctAnswerErrors.correctAnswer = 'At least 2 line object should be defined.';\n } else if (answers.correctAnswer.marks.length === 2) {\n if (answers.correctAnswer.marks[0].building || answers.correctAnswer.marks[1].building) {\n found = true;\n correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';\n }\n }\n }\n let polygon = answers.correctAnswer.marks.find((mark) => mark.type === 'polygon');\n if (!found && (!gssLineData.selectedTool === 'solutionSet' || !polygon)) {\n correctAnswerErrors.correctAnswer = 'Please select a solution set for the graphing solution set item.';\n }\n if (!isEmpty(correctAnswerErrors)) {\n errors.correctAnswerErrors = correctAnswerErrors;\n }\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}