@instructure/quiz-core 20.0.0 → 20.0.1-rc.1
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/es/reporting/components/charts/CentileDistribution/presenter.js +19 -24
- package/es/reporting/components/charts/CentileDistribution/styles.js +30 -0
- package/es/reporting/components/charts/CentileDistribution/theme.js +4 -2
- package/es/reporting/components/charts/Distribution/presenter.js +23 -24
- package/es/reporting/components/charts/Distribution/styles.js +22 -0
- package/es/reporting/components/charts/Distribution/theme.js +4 -2
- package/es/reporting/components/charts/QuintileDistribution/presenter.js +17 -20
- package/es/reporting/components/charts/QuintileDistribution/styles.js +12 -0
- package/es/reporting/components/charts/QuintileDistribution/theme.js +4 -2
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +8 -5
- package/lib/reporting/components/charts/CentileDistribution/presenter.js +18 -26
- package/lib/reporting/components/charts/CentileDistribution/styles.js +40 -0
- package/lib/reporting/components/charts/CentileDistribution/theme.js +6 -3
- package/lib/reporting/components/charts/Distribution/presenter.js +22 -25
- package/lib/reporting/components/charts/Distribution/styles.js +30 -0
- package/lib/reporting/components/charts/Distribution/theme.js +6 -3
- package/lib/reporting/components/charts/QuintileDistribution/presenter.js +15 -21
- package/lib/reporting/components/charts/QuintileDistribution/styles.js +20 -0
- package/lib/reporting/components/charts/QuintileDistribution/theme.js +6 -3
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +8 -5
- package/package.json +10 -10
|
@@ -5,24 +5,17 @@ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
|
5
5
|
|
|
6
6
|
var _dec, _class, _class2, _temp;
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/** @jsx jsx */
|
|
9
|
+
import { Component } from 'react';
|
|
9
10
|
import { PropTypes } from 'prop-types';
|
|
10
11
|
import { range } from 'd3-array';
|
|
11
|
-
import {
|
|
12
|
+
import { withStyle, jsx } from '@instructure/emotion';
|
|
12
13
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
13
14
|
import { Table } from '@instructure/ui-table';
|
|
14
15
|
import Distribution from "../Distribution/index.js";
|
|
15
16
|
import t from '@instructure/quiz-i18n/es/format-message';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
template: function template(theme) {
|
|
19
|
-
return "\n\n.owVFv_eAvm{display:flex;flex-direction:row;justify-content:center;overflow:hidden}\n\n.owVFv_eAvm>div{flex:0 1 51rem}\n\n.owVFv_eAvm svg{overflow:visible}\n\n@media screen and (--phoneBreakPoint){.owVFv_eAvm .owVFv_cKHw{font-size:".concat(theme.phoneBarLabelFontSize || 'inherit', "}.owVFv_eAvm .owVFv_eIKC g:nth-child(odd){display:none}}");
|
|
20
|
-
},
|
|
21
|
-
'centileRoot': 'owVFv_eAvm',
|
|
22
|
-
'barLabel': 'owVFv_cKHw',
|
|
23
|
-
'xAxis': 'owVFv_eIKC'
|
|
24
|
-
};
|
|
25
|
-
import theme from "./theme.js";
|
|
17
|
+
import generateStyle from "./styles.js";
|
|
18
|
+
import generateComponentTheme from "./theme.js";
|
|
26
19
|
|
|
27
20
|
var starBin = function starBin(props) {
|
|
28
21
|
if (typeof props.starScore !== 'number') return;
|
|
@@ -31,7 +24,7 @@ var starBin = function starBin(props) {
|
|
|
31
24
|
return Math.min(Math.floor(starScore * props.visualDistribution.length), props.visualDistribution.length - 1);
|
|
32
25
|
};
|
|
33
26
|
|
|
34
|
-
export var CentileDistribution = (_dec =
|
|
27
|
+
export var CentileDistribution = (_dec = withStyle(generateStyle, generateComponentTheme), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
35
28
|
_inherits(CentileDistribution, _Component);
|
|
36
29
|
|
|
37
30
|
var _super = _createSuper(CentileDistribution);
|
|
@@ -80,13 +73,13 @@ export var CentileDistribution = (_dec = themeable(theme, styles), _dec(_class =
|
|
|
80
73
|
};
|
|
81
74
|
|
|
82
75
|
_this._renderTable = function () {
|
|
83
|
-
return
|
|
76
|
+
return jsx(ScreenReaderContent, null, jsx(Table, {
|
|
84
77
|
caption: t('Score percentiles chart data')
|
|
85
|
-
},
|
|
78
|
+
}, jsx(Table.Head, null, jsx(Table.Row, null, jsx(Table.ColHeader, {
|
|
86
79
|
id: "score-percentiles-chart-data-score-percentile"
|
|
87
|
-
}, t('Score Percentile')),
|
|
80
|
+
}, t('Score Percentile')), jsx(Table.ColHeader, {
|
|
88
81
|
id: "score-percentiles-chart-data-count"
|
|
89
|
-
}, t('Count')))),
|
|
82
|
+
}, t('Count')))), jsx(Table.Body, null, _this._renderTableRows())));
|
|
90
83
|
};
|
|
91
84
|
|
|
92
85
|
return _this;
|
|
@@ -97,13 +90,13 @@ export var CentileDistribution = (_dec = themeable(theme, styles), _dec(_class =
|
|
|
97
90
|
value: function _renderTableRows() {
|
|
98
91
|
var chartData = this.props.visualDistribution;
|
|
99
92
|
return chartData.map(function (count, index) {
|
|
100
|
-
return
|
|
93
|
+
return jsx(Table.Row, {
|
|
101
94
|
key: "".concat(index, ":").concat(count)
|
|
102
95
|
/* eslint-disable-line react/jsx-no-literals, react/no-array-index-key */
|
|
103
96
|
|
|
104
|
-
},
|
|
97
|
+
}, jsx(Table.Cell, null, t('{percent}%', {
|
|
105
98
|
percent: index
|
|
106
|
-
})),
|
|
99
|
+
})), jsx(Table.Cell, null, count));
|
|
107
100
|
});
|
|
108
101
|
}
|
|
109
102
|
}, {
|
|
@@ -116,10 +109,11 @@ export var CentileDistribution = (_dec = themeable(theme, styles), _dec(_class =
|
|
|
116
109
|
summarizeChart: this._summarizeChart,
|
|
117
110
|
starIndex: starBin(this.props)
|
|
118
111
|
});
|
|
119
|
-
return
|
|
120
|
-
className:
|
|
112
|
+
return jsx("div", {
|
|
113
|
+
className: "centileRoot",
|
|
114
|
+
css: this.props.styles.centileRoot,
|
|
121
115
|
"data-automation": "sdk-reporting-centile-root"
|
|
122
|
-
},
|
|
116
|
+
}, jsx(Distribution, props));
|
|
123
117
|
}
|
|
124
118
|
}]);
|
|
125
119
|
|
|
@@ -147,7 +141,8 @@ export var CentileDistribution = (_dec = themeable(theme, styles), _dec(_class =
|
|
|
147
141
|
* * A list of score values for each bucket. Size of this array determines the number of buckets
|
|
148
142
|
* */
|
|
149
143
|
visualDistribution: PropTypes.arrayOf(PropTypes.node).isRequired,
|
|
150
|
-
starScore: PropTypes.number
|
|
144
|
+
starScore: PropTypes.number,
|
|
145
|
+
styles: PropTypes.object
|
|
151
146
|
}, _class2.defaultProps = {
|
|
152
147
|
animateDelay: 200,
|
|
153
148
|
animateDuration: 900,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
|
|
3
|
+
var generateStyle = function generateStyle(componentTheme) {
|
|
4
|
+
var mq = "@media screen and ".concat(componentTheme.phoneBreakPoint);
|
|
5
|
+
return {
|
|
6
|
+
centileRoot: _defineProperty({
|
|
7
|
+
display: 'flex',
|
|
8
|
+
flexDirection: 'row',
|
|
9
|
+
justifyContent: 'center',
|
|
10
|
+
overflow: 'hidden',
|
|
11
|
+
'& > div': {
|
|
12
|
+
flex: '0 1 51rem'
|
|
13
|
+
},
|
|
14
|
+
svg: {
|
|
15
|
+
overflow: 'visible'
|
|
16
|
+
}
|
|
17
|
+
}, mq, {
|
|
18
|
+
barLabel: {
|
|
19
|
+
fontSize: componentTheme.phoneBarLabelFontSize
|
|
20
|
+
},
|
|
21
|
+
xAxis: {
|
|
22
|
+
'&g:nth-child(2n+1)': {
|
|
23
|
+
display: 'none'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default generateStyle;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
2
2
|
var colors = _ref.colors,
|
|
3
3
|
typography = _ref.typography,
|
|
4
4
|
breakpoints = _ref.breakpoints;
|
|
@@ -6,4 +6,6 @@ export default function generator(_ref) {
|
|
|
6
6
|
phoneBreakPoint: "max-width: ".concat(breakpoints.medium),
|
|
7
7
|
phoneBarLabelFontSize: typography.fontSizeLarge
|
|
8
8
|
};
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default generateComponentTheme;
|
|
@@ -5,25 +5,17 @@ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
|
5
5
|
|
|
6
6
|
var _dec, _class, _class2, _temp;
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/** @jsx jsx */
|
|
9
|
+
import { Component } from 'react';
|
|
9
10
|
import { PropTypes } from 'prop-types';
|
|
10
11
|
import { max, range, sum } from 'd3-array';
|
|
11
12
|
import { axisBottom } from 'd3-axis';
|
|
12
13
|
import { scaleBand, scaleLinear } from 'd3-scale';
|
|
13
14
|
import { select } from 'd3-selection';
|
|
14
|
-
import {
|
|
15
|
+
import { withStyle, jsx, css } from '@instructure/emotion';
|
|
15
16
|
import t from '@instructure/quiz-i18n/es/format-message';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
template: function template(theme) {
|
|
19
|
-
return "\n\n.bIUJn_fKwc{fill:".concat(theme.barFillColor || 'inherit', "}\n\n.bIUJn_erik{fill:").concat(theme.barStarFillColor || 'inherit', "}\n\n.bIUJn_eIKC{color:").concat(theme.xAxisColor || 'inherit', "}\n\n.bIUJn_cKHw{color:").concat(theme.barLabelColor || 'inherit', ";font-family:").concat(theme.barLabelFontFamily || 'inherit', ";font-size:").concat(theme.barLabelFontSize || 'inherit', ";text-anchor:middle}");
|
|
20
|
-
},
|
|
21
|
-
'bar': 'bIUJn_fKwc',
|
|
22
|
-
'barStar': 'bIUJn_erik',
|
|
23
|
-
'xAxis': 'bIUJn_eIKC',
|
|
24
|
-
'barLabel': 'bIUJn_cKHw'
|
|
25
|
-
};
|
|
26
|
-
import theme from "./theme.js";
|
|
17
|
+
import generateStyle from "./styles.js";
|
|
18
|
+
import generateComponentTheme from "./theme.js";
|
|
27
19
|
import { ScreenReaderContent, PresentationContent } from '@instructure/ui-a11y-content';
|
|
28
20
|
import { transition } from 'd3-transition';
|
|
29
21
|
import flow from 'lodash/flow'; // Star path copied from instructure-icons/svg/Solid/star.svg
|
|
@@ -32,7 +24,7 @@ import flow from 'lodash/flow'; // Star path copied from instructure-icons/svg/S
|
|
|
32
24
|
export var starPathData = 'M1915.918 737.475c-10.955-33.543-42.014-56.131-77.364-56.131h-612.029l-189.063-582.1v-.112C1026.394 65.588 995.335 43 959.984 43c-35.237 0-66.41 22.588-77.365 56.245L693.443 681.344H81.415c-35.35 0-66.41 22.588-77.365 56.131-10.955 33.544.79 70.137 29.478 91.03l495.247 359.831-189.177 582.212c-10.955 33.657 1.13 70.25 29.817 90.918 14.23 10.278 30.946 15.473 47.66 15.473 16.716 0 33.432-5.195 47.775-15.586l495.134-359.718 495.021 359.718c28.574 20.781 67.087 20.781 95.662.113 28.687-20.668 40.658-57.261 29.703-91.03l-189.176-582.1 495.36-359.83c28.574-20.894 40.433-57.487 29.364-91.03';
|
|
33
25
|
var MARGIN_T = 0;
|
|
34
26
|
var MARGIN_B = 28;
|
|
35
|
-
export var Distribution = (_dec =
|
|
27
|
+
export var Distribution = (_dec = withStyle(generateStyle, generateComponentTheme), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
36
28
|
_inherits(Distribution, _Component);
|
|
37
29
|
|
|
38
30
|
var _super = _createSuper(Distribution);
|
|
@@ -54,7 +46,7 @@ export var Distribution = (_dec = themeable(theme, styles), _dec(_class = (_temp
|
|
|
54
46
|
|
|
55
47
|
_this._renderStar = function (svg) {
|
|
56
48
|
if (typeof _this.props.starIndex !== 'number') return;
|
|
57
|
-
var star = svg.append('path').attr('d', starPathData).
|
|
49
|
+
var star = svg.append('path').attr('d', starPathData).attr('style', css(_this.props.styles.barStar).styles);
|
|
58
50
|
var starIndex = _this.props.starIndex;
|
|
59
51
|
var starX = _this.x(starIndex) + _this.x.bandwidth() / 2;
|
|
60
52
|
var starY = _this.y(_this.props.visualDistribution[starIndex]) - 30; // scale the star down and position it on the x axis - y axis will be applied by animation
|
|
@@ -187,11 +179,11 @@ export var Distribution = (_dec = themeable(theme, styles), _dec(_class = (_temp
|
|
|
187
179
|
this.calculateAxis(props);
|
|
188
180
|
var svg = select(node).attr('role', 'document').attr('aria-role', 'document').attr('width', '100%').attr('height', '100%').attr('viewBox', "0 0 ".concat(this.width, " ").concat(this.viewportHeight)).attr('preserveAspectRatio', 'xMidYMax').append('g');
|
|
189
181
|
this.title = Distribution.addTitle(svg, t('Score percentiles chart'));
|
|
190
|
-
svg.append('g').attr('class', styles.xAxis).attr('data-role', 'xAxis').attr('aria-hidden', true).attr('transform', "translate(0,".concat(this.height, ")")).call(this.xAxis).selectAll('text').attr('class', styles.barLabel).attr('y', 9);
|
|
182
|
+
svg.append('g').attr('class', 'xAxis').attr('style', css(this.props.styles.xAxis).styles).attr('data-role', 'xAxis').attr('aria-hidden', true).attr('transform', "translate(0,".concat(this.height, ")")).call(this.xAxis).selectAll('text').attr('class', 'barLabel').attr('style', css(this.props.styles.barLabel).styles).attr('y', 9);
|
|
191
183
|
var clipKey = "clipPath".concat(this.width, "x").concat(this.height);
|
|
192
184
|
var clipPath = svg.append('clipPath').attr('id', clipKey);
|
|
193
185
|
clipPath.append('rect').attr('x', 0).attr('y', 0).attr('width', this.width).attr('height', this.height);
|
|
194
|
-
this.barContainer = svg.append('g').attr('class',
|
|
186
|
+
this.barContainer = svg.append('g').attr('class', 'barContainer').attr('clip-path', "url(#".concat(clipKey, ")"));
|
|
195
187
|
this.props.createChart(svg, this.width);
|
|
196
188
|
return svg;
|
|
197
189
|
}
|
|
@@ -216,12 +208,18 @@ export var Distribution = (_dec = themeable(theme, styles), _dec(_class = (_temp
|
|
|
216
208
|
}, {
|
|
217
209
|
key: "renderBars",
|
|
218
210
|
value: function renderBars(node, props) {
|
|
211
|
+
var _this2 = this;
|
|
212
|
+
|
|
219
213
|
this.chartData = props.visualDistribution;
|
|
220
214
|
var height = this.height;
|
|
221
215
|
var x = this.x;
|
|
222
216
|
var y = this.y;
|
|
223
217
|
var bars = node.selectAll('rect').data(this.chartData);
|
|
224
|
-
var rects = bars.enter().append('rect').
|
|
218
|
+
var rects = bars.enter().append('rect').attr('style', function (d, i) {
|
|
219
|
+
return _this2._isStarred(d, i) ? css(_this2.props.styles.barStar).styles : css(_this2.props.styles.bar).styles;
|
|
220
|
+
}).attr('class', function (d, i) {
|
|
221
|
+
return _this2._isStarred(d, i) ? 'barStar' : 'bar';
|
|
222
|
+
}).attr('x', function (d, i) {
|
|
225
223
|
return x(i);
|
|
226
224
|
}).attr('width', x.bandwidth());
|
|
227
225
|
this.applyTransition(rects, function (rects) {
|
|
@@ -242,7 +240,7 @@ export var Distribution = (_dec = themeable(theme, styles), _dec(_class = (_temp
|
|
|
242
240
|
}, {
|
|
243
241
|
key: "renderSummary",
|
|
244
242
|
value: function renderSummary() {
|
|
245
|
-
return
|
|
243
|
+
return jsx(ScreenReaderContent, null, this.summarizeChart());
|
|
246
244
|
}
|
|
247
245
|
}, {
|
|
248
246
|
key: "render",
|
|
@@ -253,20 +251,20 @@ export var Distribution = (_dec = themeable(theme, styles), _dec(_class = (_temp
|
|
|
253
251
|
var viewportHeight = chartHeight + MARGIN_T + MARGIN_B; // IE11 sizes svg elements incorrectly, so we render a canvas element to
|
|
254
252
|
// layout space for the chart, then position the svg absolute on top of it.
|
|
255
253
|
|
|
256
|
-
return
|
|
254
|
+
return jsx("div", null, jsx(PresentationContent, {
|
|
257
255
|
as: "div"
|
|
258
|
-
},
|
|
256
|
+
}, jsx("div", {
|
|
259
257
|
style: {
|
|
260
258
|
position: 'relative'
|
|
261
259
|
}
|
|
262
|
-
},
|
|
260
|
+
}, jsx("canvas", {
|
|
263
261
|
width: chartWidth,
|
|
264
262
|
height: viewportHeight,
|
|
265
263
|
style: {
|
|
266
264
|
display: 'block',
|
|
267
265
|
visibility: 'hidden'
|
|
268
266
|
}
|
|
269
|
-
}),
|
|
267
|
+
}), jsx("svg", {
|
|
270
268
|
ref: this.setChartRef,
|
|
271
269
|
style: {
|
|
272
270
|
position: 'absolute',
|
|
@@ -316,7 +314,8 @@ export var Distribution = (_dec = themeable(theme, styles), _dec(_class = (_temp
|
|
|
316
314
|
renderTable: PropTypes.func,
|
|
317
315
|
summarizeChart: PropTypes.func,
|
|
318
316
|
updateChart: PropTypes.func,
|
|
319
|
-
starIndex: PropTypes.number
|
|
317
|
+
starIndex: PropTypes.number,
|
|
318
|
+
styles: PropTypes.object
|
|
320
319
|
}, _class2.defaultProps = {
|
|
321
320
|
animateDelay: 200,
|
|
322
321
|
animateDuration: 900,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
var generateStyle = function generateStyle(componentTheme) {
|
|
2
|
+
return {
|
|
3
|
+
bar: {
|
|
4
|
+
fill: componentTheme.barFillColor
|
|
5
|
+
},
|
|
6
|
+
barStar: {
|
|
7
|
+
fill: componentTheme.barStarFillColor
|
|
8
|
+
},
|
|
9
|
+
barContainer: {},
|
|
10
|
+
xAxis: {
|
|
11
|
+
color: componentTheme.xAxisColor
|
|
12
|
+
},
|
|
13
|
+
barLabel: {
|
|
14
|
+
color: componentTheme.barLabelColor,
|
|
15
|
+
fontFamily: componentTheme.barLabelFontFamily,
|
|
16
|
+
fontSize: componentTheme.barLabelFontSize,
|
|
17
|
+
textAnchor: 'middle'
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default generateStyle;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
2
2
|
var colors = _ref.colors,
|
|
3
3
|
typography = _ref.typography;
|
|
4
4
|
return {
|
|
@@ -9,4 +9,6 @@ export default function generator(_ref) {
|
|
|
9
9
|
barLabelFontSize: typography.fontSizeSmall,
|
|
10
10
|
xAxisColor: colors.textDarkest
|
|
11
11
|
};
|
|
12
|
-
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default generateComponentTheme;
|
|
@@ -5,23 +5,19 @@ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
|
5
5
|
|
|
6
6
|
var _dec, _class, _class2, _temp;
|
|
7
7
|
|
|
8
|
+
/** @jsx jsx */
|
|
9
|
+
|
|
8
10
|
/* eslint "no-mixed-operators": "warn" */
|
|
9
|
-
import
|
|
11
|
+
import { Component } from 'react';
|
|
10
12
|
import { PropTypes } from 'prop-types';
|
|
11
|
-
import {
|
|
13
|
+
import { withStyle, jsx, css } from '@instructure/emotion';
|
|
12
14
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
13
15
|
import { Table } from '@instructure/ui-table';
|
|
14
16
|
import t from '@instructure/quiz-i18n/es/format-message';
|
|
15
17
|
import Distribution from "../Distribution/index.js";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return "\n\n.chSyh_cKHw{color:".concat(theme.barLabelColor || 'inherit', ";font-family:").concat(theme.barLabelFontFamily || 'inherit', ";font-size:").concat(theme.barLabelFontSize || 'inherit', ";text-anchor:middle}");
|
|
20
|
-
},
|
|
21
|
-
'barLabel': 'chSyh_cKHw'
|
|
22
|
-
};
|
|
23
|
-
import theme from "./theme.js";
|
|
24
|
-
export var QuintileDistribution = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
18
|
+
import generateStyle from "./styles.js";
|
|
19
|
+
import generateComponentTheme from "./theme.js";
|
|
20
|
+
export var QuintileDistribution = (_dec = withStyle(generateStyle, generateComponentTheme), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
25
21
|
_inherits(QuintileDistribution, _Component);
|
|
26
22
|
|
|
27
23
|
var _super = _createSuper(QuintileDistribution);
|
|
@@ -59,7 +55,7 @@ export var QuintileDistribution = (_dec = themeable(theme, styles), _dec(_class
|
|
|
59
55
|
_this._renderNumbers = function (svg, x, y, applyTransition, barContainer, height) {
|
|
60
56
|
var chartData = _this.props.visualDistribution;
|
|
61
57
|
var numbers = barContainer.selectAll('text').data(chartData);
|
|
62
|
-
var texts = numbers.enter().insert('text', 'rect').
|
|
58
|
+
var texts = numbers.enter().insert('text', 'rect').attr('style', css(_this.props.styles.barLabel).styles).text(function (d) {
|
|
63
59
|
return d;
|
|
64
60
|
}).attr('x', function (d, i) {
|
|
65
61
|
return x(i) + x.bandwidth() / 2;
|
|
@@ -79,13 +75,13 @@ export var QuintileDistribution = (_dec = themeable(theme, styles), _dec(_class
|
|
|
79
75
|
};
|
|
80
76
|
|
|
81
77
|
_this._renderTable = function () {
|
|
82
|
-
return
|
|
78
|
+
return jsx(ScreenReaderContent, null, jsx(Table, {
|
|
83
79
|
caption: t('Score percentiles chart data')
|
|
84
|
-
},
|
|
80
|
+
}, jsx(Table.Head, null, jsx(Table.Row, null, jsx(Table.ColHeader, {
|
|
85
81
|
id: "score-percentiles-chart-data-score-percentile-range"
|
|
86
|
-
}, t('Score Percentile Range')),
|
|
82
|
+
}, t('Score Percentile Range')), jsx(Table.ColHeader, {
|
|
87
83
|
id: "score-percentiles-chart-data-count"
|
|
88
|
-
}, t('Count')))),
|
|
84
|
+
}, t('Count')))), jsx(Table.Body, null, _this.renderTableRows())));
|
|
89
85
|
};
|
|
90
86
|
|
|
91
87
|
return _this;
|
|
@@ -100,11 +96,11 @@ export var QuintileDistribution = (_dec = themeable(theme, styles), _dec(_class
|
|
|
100
96
|
return chartData.map(function (count, index) {
|
|
101
97
|
var label = _this2.calculateLabelForIndex(index);
|
|
102
98
|
|
|
103
|
-
return
|
|
99
|
+
return jsx(Table.Row, {
|
|
104
100
|
key: "".concat(label, ":").concat(count)
|
|
105
101
|
/* eslint-disable-line react/jsx-no-literals */
|
|
106
102
|
|
|
107
|
-
},
|
|
103
|
+
}, jsx(Table.RowHeader, null, label), jsx(Table.Cell, null, count));
|
|
108
104
|
});
|
|
109
105
|
}
|
|
110
106
|
}, {
|
|
@@ -115,7 +111,7 @@ export var QuintileDistribution = (_dec = themeable(theme, styles), _dec(_class
|
|
|
115
111
|
renderTable: this._renderTable,
|
|
116
112
|
updateChart: this._renderNumbers
|
|
117
113
|
});
|
|
118
|
-
return
|
|
114
|
+
return jsx(Distribution, props);
|
|
119
115
|
}
|
|
120
116
|
}]);
|
|
121
117
|
|
|
@@ -149,7 +145,8 @@ export var QuintileDistribution = (_dec = themeable(theme, styles), _dec(_class
|
|
|
149
145
|
* * Should return string which will be label for chart column.
|
|
150
146
|
* * If undefined uses default column label calculation
|
|
151
147
|
* */
|
|
152
|
-
calculateLabelForColumn: PropTypes.func
|
|
148
|
+
calculateLabelForColumn: PropTypes.func,
|
|
149
|
+
styles: PropTypes.object
|
|
153
150
|
}, _class2.defaultProps = {
|
|
154
151
|
animateDelay: 200,
|
|
155
152
|
animateDuration: 900,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var generateStyle = function generateStyle(componentTheme) {
|
|
2
|
+
return {
|
|
3
|
+
barLabel: {
|
|
4
|
+
color: componentTheme.barLabelColor,
|
|
5
|
+
fontFamily: componentTheme.barLabelFontFamily,
|
|
6
|
+
fontSize: componentTheme.barLabelFontSize,
|
|
7
|
+
textAnchor: 'middle'
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default generateStyle;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
2
2
|
var colors = _ref.colors,
|
|
3
3
|
typography = _ref.typography;
|
|
4
4
|
return {
|
|
@@ -6,4 +6,6 @@ export default function generator(_ref) {
|
|
|
6
6
|
barLabelFontFamily: typography.fontFamily,
|
|
7
7
|
barLabelFontSize: typography.fontSizeSmall
|
|
8
8
|
};
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default generateComponentTheme;
|
package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js
CHANGED
|
@@ -33,7 +33,8 @@ export var withAnalysisStatePresenter = function withAnalysisStatePresenter(Orig
|
|
|
33
33
|
statusPollingInProgress = _ref.statusPollingInProgress,
|
|
34
34
|
setStatusPollingInProgress = _ref.setStatusPollingInProgress,
|
|
35
35
|
pollingInterval = _ref.pollingInterval,
|
|
36
|
-
|
|
36
|
+
disableReportsCache = _ref.disableReportsCache,
|
|
37
|
+
passThroughProps = _objectWithoutProperties(_ref, ["quizAnalysis", "itemAnalyses", "fetchInProgress", "generationInProgress", "analysisError", "setQuizAnalysis", "addError", "setItemAnalyses", "setFetchInProgress", "setGenerationInProgress", "setAnalysisError", "activeQuizId", "generateAnalysis", "fetchQuizAnalysis", "fetchItemAnalyses", "getAnalysesExport", "fetchAnalysesStatus", "statusPollingInProgress", "setStatusPollingInProgress", "pollingInterval", "disableReportsCache"]);
|
|
37
38
|
|
|
38
39
|
WithAnalysisStatePresenter.displayName = "WithAnalysisStatePresenter(".concat(OriginalComponent.displayName || OriginalComponent.name, ")");
|
|
39
40
|
|
|
@@ -149,7 +150,7 @@ export var withAnalysisStatePresenter = function withAnalysisStatePresenter(Orig
|
|
|
149
150
|
case 0:
|
|
150
151
|
hasStoredAnalyses = quizAnalysis && itemAnalyses;
|
|
151
152
|
|
|
152
|
-
if (hasStoredAnalyses) {
|
|
153
|
+
if (!(!hasStoredAnalyses || disableReportsCache)) {
|
|
153
154
|
_context.next = 4;
|
|
154
155
|
break;
|
|
155
156
|
}
|
|
@@ -235,13 +236,15 @@ export var withAnalysisStatePresenter = function withAnalysisStatePresenter(Orig
|
|
|
235
236
|
getAnalysesExport: PropTypes.func.isRequired,
|
|
236
237
|
addError: PropTypes.func.isRequired,
|
|
237
238
|
pollingInterval: PropTypes.number.isRequired,
|
|
238
|
-
generateAnalysis: PropTypes.func.isRequired
|
|
239
|
-
|
|
239
|
+
generateAnalysis: PropTypes.func.isRequired,
|
|
240
|
+
// from LTI, f(filter: string, onError?: func(error))
|
|
241
|
+
disableReportsCache: PropTypes.bool
|
|
240
242
|
};
|
|
241
243
|
WithAnalysisStatePresenter.defaultProps = {
|
|
242
244
|
quizAnalysis: void 0,
|
|
243
245
|
itemAnalyses: void 0,
|
|
244
|
-
analysisError: ''
|
|
246
|
+
analysisError: '',
|
|
247
|
+
disableReportsCache: false
|
|
245
248
|
};
|
|
246
249
|
return WithAnalysisStatePresenter;
|
|
247
250
|
};
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
@@ -17,13 +15,13 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
|
|
|
17
15
|
|
|
18
16
|
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
|
|
19
17
|
|
|
20
|
-
var _react =
|
|
18
|
+
var _react = require("react");
|
|
21
19
|
|
|
22
20
|
var _propTypes = require("prop-types");
|
|
23
21
|
|
|
24
22
|
var _d3Array = require("d3-array");
|
|
25
23
|
|
|
26
|
-
var
|
|
24
|
+
var _emotion = require("@instructure/emotion");
|
|
27
25
|
|
|
28
26
|
var _uiA11yContent = require("@instructure/ui-a11y-content");
|
|
29
27
|
|
|
@@ -33,20 +31,12 @@ var _index = _interopRequireDefault(require("../Distribution/index.js"));
|
|
|
33
31
|
|
|
34
32
|
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
|
|
35
33
|
|
|
34
|
+
var _styles = _interopRequireDefault(require("./styles.js"));
|
|
35
|
+
|
|
36
36
|
var _theme = _interopRequireDefault(require("./theme.js"));
|
|
37
37
|
|
|
38
38
|
var _dec, _class, _class2, _temp;
|
|
39
39
|
|
|
40
|
-
var styles = {
|
|
41
|
-
componentId: 'owVFv',
|
|
42
|
-
template: function template(theme) {
|
|
43
|
-
return "\n\n.owVFv_eAvm{display:flex;flex-direction:row;justify-content:center;overflow:hidden}\n\n.owVFv_eAvm>div{flex:0 1 51rem}\n\n.owVFv_eAvm svg{overflow:visible}\n\n@media screen and (--phoneBreakPoint){.owVFv_eAvm .owVFv_cKHw{font-size:".concat(theme.phoneBarLabelFontSize || 'inherit', "}.owVFv_eAvm .owVFv_eIKC g:nth-child(odd){display:none}}");
|
|
44
|
-
},
|
|
45
|
-
'centileRoot': 'owVFv_eAvm',
|
|
46
|
-
'barLabel': 'owVFv_cKHw',
|
|
47
|
-
'xAxis': 'owVFv_eIKC'
|
|
48
|
-
};
|
|
49
|
-
|
|
50
40
|
var starBin = function starBin(props) {
|
|
51
41
|
if (typeof props.starScore !== 'number') return;
|
|
52
42
|
var starScore = Math.max(0, Math.min(props.starScore, 1)); // min+floor here matches quiz_etl HistogramHelper
|
|
@@ -54,7 +44,7 @@ var starBin = function starBin(props) {
|
|
|
54
44
|
return Math.min(Math.floor(starScore * props.visualDistribution.length), props.visualDistribution.length - 1);
|
|
55
45
|
};
|
|
56
46
|
|
|
57
|
-
var CentileDistribution = (_dec = (0,
|
|
47
|
+
var CentileDistribution = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
58
48
|
(0, _inherits2.default)(CentileDistribution, _Component);
|
|
59
49
|
|
|
60
50
|
var _super = (0, _createSuper2.default)(CentileDistribution);
|
|
@@ -103,13 +93,13 @@ var CentileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, st
|
|
|
103
93
|
};
|
|
104
94
|
|
|
105
95
|
_this._renderTable = function () {
|
|
106
|
-
return
|
|
96
|
+
return (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _emotion.jsx)(_uiTable.Table, {
|
|
107
97
|
caption: (0, _formatMessage.default)('Score percentiles chart data')
|
|
108
|
-
},
|
|
98
|
+
}, (0, _emotion.jsx)(_uiTable.Table.Head, null, (0, _emotion.jsx)(_uiTable.Table.Row, null, (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
|
|
109
99
|
id: "score-percentiles-chart-data-score-percentile"
|
|
110
|
-
}, (0, _formatMessage.default)('Score Percentile')),
|
|
100
|
+
}, (0, _formatMessage.default)('Score Percentile')), (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
|
|
111
101
|
id: "score-percentiles-chart-data-count"
|
|
112
|
-
}, (0, _formatMessage.default)('Count')))),
|
|
102
|
+
}, (0, _formatMessage.default)('Count')))), (0, _emotion.jsx)(_uiTable.Table.Body, null, _this._renderTableRows())));
|
|
113
103
|
};
|
|
114
104
|
|
|
115
105
|
return _this;
|
|
@@ -120,13 +110,13 @@ var CentileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, st
|
|
|
120
110
|
value: function _renderTableRows() {
|
|
121
111
|
var chartData = this.props.visualDistribution;
|
|
122
112
|
return chartData.map(function (count, index) {
|
|
123
|
-
return
|
|
113
|
+
return (0, _emotion.jsx)(_uiTable.Table.Row, {
|
|
124
114
|
key: "".concat(index, ":").concat(count)
|
|
125
115
|
/* eslint-disable-line react/jsx-no-literals, react/no-array-index-key */
|
|
126
116
|
|
|
127
|
-
},
|
|
117
|
+
}, (0, _emotion.jsx)(_uiTable.Table.Cell, null, (0, _formatMessage.default)('{percent}%', {
|
|
128
118
|
percent: index
|
|
129
|
-
})),
|
|
119
|
+
})), (0, _emotion.jsx)(_uiTable.Table.Cell, null, count));
|
|
130
120
|
});
|
|
131
121
|
}
|
|
132
122
|
}, {
|
|
@@ -139,10 +129,11 @@ var CentileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, st
|
|
|
139
129
|
summarizeChart: this._summarizeChart,
|
|
140
130
|
starIndex: starBin(this.props)
|
|
141
131
|
});
|
|
142
|
-
return
|
|
143
|
-
className:
|
|
132
|
+
return (0, _emotion.jsx)("div", {
|
|
133
|
+
className: "centileRoot",
|
|
134
|
+
css: this.props.styles.centileRoot,
|
|
144
135
|
"data-automation": "sdk-reporting-centile-root"
|
|
145
|
-
},
|
|
136
|
+
}, (0, _emotion.jsx)(_index.default, props));
|
|
146
137
|
}
|
|
147
138
|
}]);
|
|
148
139
|
CentileDistribution.displayName = "CentileDistribution";
|
|
@@ -169,7 +160,8 @@ var CentileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, st
|
|
|
169
160
|
* * A list of score values for each bucket. Size of this array determines the number of buckets
|
|
170
161
|
* */
|
|
171
162
|
visualDistribution: _propTypes.PropTypes.arrayOf(_propTypes.PropTypes.node).isRequired,
|
|
172
|
-
starScore: _propTypes.PropTypes.number
|
|
163
|
+
starScore: _propTypes.PropTypes.number,
|
|
164
|
+
styles: _propTypes.PropTypes.object
|
|
173
165
|
}, _class2.defaultProps = {
|
|
174
166
|
animateDelay: 200,
|
|
175
167
|
animateDuration: 900,
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var generateStyle = function generateStyle(componentTheme) {
|
|
13
|
+
var mq = "@media screen and ".concat(componentTheme.phoneBreakPoint);
|
|
14
|
+
return {
|
|
15
|
+
centileRoot: (0, _defineProperty2.default)({
|
|
16
|
+
display: 'flex',
|
|
17
|
+
flexDirection: 'row',
|
|
18
|
+
justifyContent: 'center',
|
|
19
|
+
overflow: 'hidden',
|
|
20
|
+
'& > div': {
|
|
21
|
+
flex: '0 1 51rem'
|
|
22
|
+
},
|
|
23
|
+
svg: {
|
|
24
|
+
overflow: 'visible'
|
|
25
|
+
}
|
|
26
|
+
}, mq, {
|
|
27
|
+
barLabel: {
|
|
28
|
+
fontSize: componentTheme.phoneBarLabelFontSize
|
|
29
|
+
},
|
|
30
|
+
xAxis: {
|
|
31
|
+
'&g:nth-child(2n+1)': {
|
|
32
|
+
display: 'none'
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
var _default = generateStyle;
|
|
40
|
+
exports.default = _default;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default =
|
|
6
|
+
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
function
|
|
8
|
+
var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
9
9
|
var colors = _ref.colors,
|
|
10
10
|
typography = _ref.typography,
|
|
11
11
|
breakpoints = _ref.breakpoints;
|
|
@@ -13,4 +13,7 @@ function generator(_ref) {
|
|
|
13
13
|
phoneBreakPoint: "max-width: ".concat(breakpoints.medium),
|
|
14
14
|
phoneBarLabelFontSize: typography.fontSizeLarge
|
|
15
15
|
};
|
|
16
|
-
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
var _default = generateComponentTheme;
|
|
19
|
+
exports.default = _default;
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
@@ -17,7 +15,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
|
|
|
17
15
|
|
|
18
16
|
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
|
|
19
17
|
|
|
20
|
-
var _react =
|
|
18
|
+
var _react = require("react");
|
|
21
19
|
|
|
22
20
|
var _propTypes = require("prop-types");
|
|
23
21
|
|
|
@@ -29,10 +27,12 @@ var _d3Scale = require("d3-scale");
|
|
|
29
27
|
|
|
30
28
|
var _d3Selection = require("d3-selection");
|
|
31
29
|
|
|
32
|
-
var
|
|
30
|
+
var _emotion = require("@instructure/emotion");
|
|
33
31
|
|
|
34
32
|
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
|
|
35
33
|
|
|
34
|
+
var _styles = _interopRequireDefault(require("./styles.js"));
|
|
35
|
+
|
|
36
36
|
var _theme = _interopRequireDefault(require("./theme.js"));
|
|
37
37
|
|
|
38
38
|
var _uiA11yContent = require("@instructure/ui-a11y-content");
|
|
@@ -43,23 +43,13 @@ var _flow = _interopRequireDefault(require("lodash/flow"));
|
|
|
43
43
|
|
|
44
44
|
var _dec, _class, _class2, _temp;
|
|
45
45
|
|
|
46
|
-
var styles = {
|
|
47
|
-
componentId: 'bIUJn',
|
|
48
|
-
template: function template(theme) {
|
|
49
|
-
return "\n\n.bIUJn_fKwc{fill:".concat(theme.barFillColor || 'inherit', "}\n\n.bIUJn_erik{fill:").concat(theme.barStarFillColor || 'inherit', "}\n\n.bIUJn_eIKC{color:").concat(theme.xAxisColor || 'inherit', "}\n\n.bIUJn_cKHw{color:").concat(theme.barLabelColor || 'inherit', ";font-family:").concat(theme.barLabelFontFamily || 'inherit', ";font-size:").concat(theme.barLabelFontSize || 'inherit', ";text-anchor:middle}");
|
|
50
|
-
},
|
|
51
|
-
'bar': 'bIUJn_fKwc',
|
|
52
|
-
'barStar': 'bIUJn_erik',
|
|
53
|
-
'xAxis': 'bIUJn_eIKC',
|
|
54
|
-
'barLabel': 'bIUJn_cKHw'
|
|
55
|
-
};
|
|
56
46
|
// Star path copied from instructure-icons/svg/Solid/star.svg
|
|
57
47
|
// eslint-disable-next-line max-len
|
|
58
48
|
var starPathData = 'M1915.918 737.475c-10.955-33.543-42.014-56.131-77.364-56.131h-612.029l-189.063-582.1v-.112C1026.394 65.588 995.335 43 959.984 43c-35.237 0-66.41 22.588-77.365 56.245L693.443 681.344H81.415c-35.35 0-66.41 22.588-77.365 56.131-10.955 33.544.79 70.137 29.478 91.03l495.247 359.831-189.177 582.212c-10.955 33.657 1.13 70.25 29.817 90.918 14.23 10.278 30.946 15.473 47.66 15.473 16.716 0 33.432-5.195 47.775-15.586l495.134-359.718 495.021 359.718c28.574 20.781 67.087 20.781 95.662.113 28.687-20.668 40.658-57.261 29.703-91.03l-189.176-582.1 495.36-359.83c28.574-20.894 40.433-57.487 29.364-91.03';
|
|
59
49
|
exports.starPathData = starPathData;
|
|
60
50
|
var MARGIN_T = 0;
|
|
61
51
|
var MARGIN_B = 28;
|
|
62
|
-
var Distribution = (_dec = (0,
|
|
52
|
+
var Distribution = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
63
53
|
(0, _inherits2.default)(Distribution, _Component);
|
|
64
54
|
|
|
65
55
|
var _super = (0, _createSuper2.default)(Distribution);
|
|
@@ -81,7 +71,7 @@ var Distribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
|
|
|
81
71
|
|
|
82
72
|
_this._renderStar = function (svg) {
|
|
83
73
|
if (typeof _this.props.starIndex !== 'number') return;
|
|
84
|
-
var star = svg.append('path').attr('d', starPathData).
|
|
74
|
+
var star = svg.append('path').attr('d', starPathData).attr('style', (0, _emotion.css)(_this.props.styles.barStar).styles);
|
|
85
75
|
var starIndex = _this.props.starIndex;
|
|
86
76
|
var starX = _this.x(starIndex) + _this.x.bandwidth() / 2;
|
|
87
77
|
var starY = _this.y(_this.props.visualDistribution[starIndex]) - 30; // scale the star down and position it on the x axis - y axis will be applied by animation
|
|
@@ -214,11 +204,11 @@ var Distribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
|
|
|
214
204
|
this.calculateAxis(props);
|
|
215
205
|
var svg = (0, _d3Selection.select)(node).attr('role', 'document').attr('aria-role', 'document').attr('width', '100%').attr('height', '100%').attr('viewBox', "0 0 ".concat(this.width, " ").concat(this.viewportHeight)).attr('preserveAspectRatio', 'xMidYMax').append('g');
|
|
216
206
|
this.title = Distribution.addTitle(svg, (0, _formatMessage.default)('Score percentiles chart'));
|
|
217
|
-
svg.append('g').attr('class', styles.xAxis).attr('data-role', 'xAxis').attr('aria-hidden', true).attr('transform', "translate(0,".concat(this.height, ")")).call(this.xAxis).selectAll('text').attr('class', styles.barLabel).attr('y', 9);
|
|
207
|
+
svg.append('g').attr('class', 'xAxis').attr('style', (0, _emotion.css)(this.props.styles.xAxis).styles).attr('data-role', 'xAxis').attr('aria-hidden', true).attr('transform', "translate(0,".concat(this.height, ")")).call(this.xAxis).selectAll('text').attr('class', 'barLabel').attr('style', (0, _emotion.css)(this.props.styles.barLabel).styles).attr('y', 9);
|
|
218
208
|
var clipKey = "clipPath".concat(this.width, "x").concat(this.height);
|
|
219
209
|
var clipPath = svg.append('clipPath').attr('id', clipKey);
|
|
220
210
|
clipPath.append('rect').attr('x', 0).attr('y', 0).attr('width', this.width).attr('height', this.height);
|
|
221
|
-
this.barContainer = svg.append('g').attr('class',
|
|
211
|
+
this.barContainer = svg.append('g').attr('class', 'barContainer').attr('clip-path', "url(#".concat(clipKey, ")"));
|
|
222
212
|
this.props.createChart(svg, this.width);
|
|
223
213
|
return svg;
|
|
224
214
|
}
|
|
@@ -243,12 +233,18 @@ var Distribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
|
|
|
243
233
|
}, {
|
|
244
234
|
key: "renderBars",
|
|
245
235
|
value: function renderBars(node, props) {
|
|
236
|
+
var _this2 = this;
|
|
237
|
+
|
|
246
238
|
this.chartData = props.visualDistribution;
|
|
247
239
|
var height = this.height;
|
|
248
240
|
var x = this.x;
|
|
249
241
|
var y = this.y;
|
|
250
242
|
var bars = node.selectAll('rect').data(this.chartData);
|
|
251
|
-
var rects = bars.enter().append('rect').
|
|
243
|
+
var rects = bars.enter().append('rect').attr('style', function (d, i) {
|
|
244
|
+
return _this2._isStarred(d, i) ? (0, _emotion.css)(_this2.props.styles.barStar).styles : (0, _emotion.css)(_this2.props.styles.bar).styles;
|
|
245
|
+
}).attr('class', function (d, i) {
|
|
246
|
+
return _this2._isStarred(d, i) ? 'barStar' : 'bar';
|
|
247
|
+
}).attr('x', function (d, i) {
|
|
252
248
|
return x(i);
|
|
253
249
|
}).attr('width', x.bandwidth());
|
|
254
250
|
this.applyTransition(rects, function (rects) {
|
|
@@ -269,7 +265,7 @@ var Distribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
|
|
|
269
265
|
}, {
|
|
270
266
|
key: "renderSummary",
|
|
271
267
|
value: function renderSummary() {
|
|
272
|
-
return
|
|
268
|
+
return (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, this.summarizeChart());
|
|
273
269
|
}
|
|
274
270
|
}, {
|
|
275
271
|
key: "render",
|
|
@@ -280,20 +276,20 @@ var Distribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
|
|
|
280
276
|
var viewportHeight = chartHeight + MARGIN_T + MARGIN_B; // IE11 sizes svg elements incorrectly, so we render a canvas element to
|
|
281
277
|
// layout space for the chart, then position the svg absolute on top of it.
|
|
282
278
|
|
|
283
|
-
return
|
|
279
|
+
return (0, _emotion.jsx)("div", null, (0, _emotion.jsx)(_uiA11yContent.PresentationContent, {
|
|
284
280
|
as: "div"
|
|
285
|
-
},
|
|
281
|
+
}, (0, _emotion.jsx)("div", {
|
|
286
282
|
style: {
|
|
287
283
|
position: 'relative'
|
|
288
284
|
}
|
|
289
|
-
},
|
|
285
|
+
}, (0, _emotion.jsx)("canvas", {
|
|
290
286
|
width: chartWidth,
|
|
291
287
|
height: viewportHeight,
|
|
292
288
|
style: {
|
|
293
289
|
display: 'block',
|
|
294
290
|
visibility: 'hidden'
|
|
295
291
|
}
|
|
296
|
-
}),
|
|
292
|
+
}), (0, _emotion.jsx)("svg", {
|
|
297
293
|
ref: this.setChartRef,
|
|
298
294
|
style: {
|
|
299
295
|
position: 'absolute',
|
|
@@ -342,7 +338,8 @@ var Distribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles),
|
|
|
342
338
|
renderTable: _propTypes.PropTypes.func,
|
|
343
339
|
summarizeChart: _propTypes.PropTypes.func,
|
|
344
340
|
updateChart: _propTypes.PropTypes.func,
|
|
345
|
-
starIndex: _propTypes.PropTypes.number
|
|
341
|
+
starIndex: _propTypes.PropTypes.number,
|
|
342
|
+
styles: _propTypes.PropTypes.object
|
|
346
343
|
}, _class2.defaultProps = {
|
|
347
344
|
animateDelay: 200,
|
|
348
345
|
animateDuration: 900,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var generateStyle = function generateStyle(componentTheme) {
|
|
9
|
+
return {
|
|
10
|
+
bar: {
|
|
11
|
+
fill: componentTheme.barFillColor
|
|
12
|
+
},
|
|
13
|
+
barStar: {
|
|
14
|
+
fill: componentTheme.barStarFillColor
|
|
15
|
+
},
|
|
16
|
+
barContainer: {},
|
|
17
|
+
xAxis: {
|
|
18
|
+
color: componentTheme.xAxisColor
|
|
19
|
+
},
|
|
20
|
+
barLabel: {
|
|
21
|
+
color: componentTheme.barLabelColor,
|
|
22
|
+
fontFamily: componentTheme.barLabelFontFamily,
|
|
23
|
+
fontSize: componentTheme.barLabelFontSize,
|
|
24
|
+
textAnchor: 'middle'
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
var _default = generateStyle;
|
|
30
|
+
exports.default = _default;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default =
|
|
6
|
+
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
function
|
|
8
|
+
var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
9
9
|
var colors = _ref.colors,
|
|
10
10
|
typography = _ref.typography;
|
|
11
11
|
return {
|
|
@@ -16,4 +16,7 @@ function generator(_ref) {
|
|
|
16
16
|
barLabelFontSize: typography.fontSizeSmall,
|
|
17
17
|
xAxisColor: colors.textDarkest
|
|
18
18
|
};
|
|
19
|
-
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
var _default = generateComponentTheme;
|
|
22
|
+
exports.default = _default;
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
@@ -17,11 +15,11 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
|
|
|
17
15
|
|
|
18
16
|
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
|
|
19
17
|
|
|
20
|
-
var _react =
|
|
18
|
+
var _react = require("react");
|
|
21
19
|
|
|
22
20
|
var _propTypes = require("prop-types");
|
|
23
21
|
|
|
24
|
-
var
|
|
22
|
+
var _emotion = require("@instructure/emotion");
|
|
25
23
|
|
|
26
24
|
var _uiA11yContent = require("@instructure/ui-a11y-content");
|
|
27
25
|
|
|
@@ -31,18 +29,13 @@ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/f
|
|
|
31
29
|
|
|
32
30
|
var _index = _interopRequireDefault(require("../Distribution/index.js"));
|
|
33
31
|
|
|
32
|
+
var _styles = _interopRequireDefault(require("./styles.js"));
|
|
33
|
+
|
|
34
34
|
var _theme = _interopRequireDefault(require("./theme.js"));
|
|
35
35
|
|
|
36
36
|
var _dec, _class, _class2, _temp;
|
|
37
37
|
|
|
38
|
-
var
|
|
39
|
-
componentId: 'chSyh',
|
|
40
|
-
template: function template(theme) {
|
|
41
|
-
return "\n\n.chSyh_cKHw{color:".concat(theme.barLabelColor || 'inherit', ";font-family:").concat(theme.barLabelFontFamily || 'inherit', ";font-size:").concat(theme.barLabelFontSize || 'inherit', ";text-anchor:middle}");
|
|
42
|
-
},
|
|
43
|
-
'barLabel': 'chSyh_cKHw'
|
|
44
|
-
};
|
|
45
|
-
var QuintileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
38
|
+
var QuintileDistribution = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
46
39
|
(0, _inherits2.default)(QuintileDistribution, _Component);
|
|
47
40
|
|
|
48
41
|
var _super = (0, _createSuper2.default)(QuintileDistribution);
|
|
@@ -80,7 +73,7 @@ var QuintileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, s
|
|
|
80
73
|
_this._renderNumbers = function (svg, x, y, applyTransition, barContainer, height) {
|
|
81
74
|
var chartData = _this.props.visualDistribution;
|
|
82
75
|
var numbers = barContainer.selectAll('text').data(chartData);
|
|
83
|
-
var texts = numbers.enter().insert('text', 'rect').
|
|
76
|
+
var texts = numbers.enter().insert('text', 'rect').attr('style', (0, _emotion.css)(_this.props.styles.barLabel).styles).text(function (d) {
|
|
84
77
|
return d;
|
|
85
78
|
}).attr('x', function (d, i) {
|
|
86
79
|
return x(i) + x.bandwidth() / 2;
|
|
@@ -100,13 +93,13 @@ var QuintileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, s
|
|
|
100
93
|
};
|
|
101
94
|
|
|
102
95
|
_this._renderTable = function () {
|
|
103
|
-
return
|
|
96
|
+
return (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _emotion.jsx)(_uiTable.Table, {
|
|
104
97
|
caption: (0, _formatMessage.default)('Score percentiles chart data')
|
|
105
|
-
},
|
|
98
|
+
}, (0, _emotion.jsx)(_uiTable.Table.Head, null, (0, _emotion.jsx)(_uiTable.Table.Row, null, (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
|
|
106
99
|
id: "score-percentiles-chart-data-score-percentile-range"
|
|
107
|
-
}, (0, _formatMessage.default)('Score Percentile Range')),
|
|
100
|
+
}, (0, _formatMessage.default)('Score Percentile Range')), (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
|
|
108
101
|
id: "score-percentiles-chart-data-count"
|
|
109
|
-
}, (0, _formatMessage.default)('Count')))),
|
|
102
|
+
}, (0, _formatMessage.default)('Count')))), (0, _emotion.jsx)(_uiTable.Table.Body, null, _this.renderTableRows())));
|
|
110
103
|
};
|
|
111
104
|
|
|
112
105
|
return _this;
|
|
@@ -121,11 +114,11 @@ var QuintileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, s
|
|
|
121
114
|
return chartData.map(function (count, index) {
|
|
122
115
|
var label = _this2.calculateLabelForIndex(index);
|
|
123
116
|
|
|
124
|
-
return
|
|
117
|
+
return (0, _emotion.jsx)(_uiTable.Table.Row, {
|
|
125
118
|
key: "".concat(label, ":").concat(count)
|
|
126
119
|
/* eslint-disable-line react/jsx-no-literals */
|
|
127
120
|
|
|
128
|
-
},
|
|
121
|
+
}, (0, _emotion.jsx)(_uiTable.Table.RowHeader, null, label), (0, _emotion.jsx)(_uiTable.Table.Cell, null, count));
|
|
129
122
|
});
|
|
130
123
|
}
|
|
131
124
|
}, {
|
|
@@ -136,7 +129,7 @@ var QuintileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, s
|
|
|
136
129
|
renderTable: this._renderTable,
|
|
137
130
|
updateChart: this._renderNumbers
|
|
138
131
|
});
|
|
139
|
-
return
|
|
132
|
+
return (0, _emotion.jsx)(_index.default, props);
|
|
140
133
|
}
|
|
141
134
|
}]);
|
|
142
135
|
QuintileDistribution.displayName = "QuintileDistribution";
|
|
@@ -169,7 +162,8 @@ var QuintileDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, s
|
|
|
169
162
|
* * Should return string which will be label for chart column.
|
|
170
163
|
* * If undefined uses default column label calculation
|
|
171
164
|
* */
|
|
172
|
-
calculateLabelForColumn: _propTypes.PropTypes.func
|
|
165
|
+
calculateLabelForColumn: _propTypes.PropTypes.func,
|
|
166
|
+
styles: _propTypes.PropTypes.object
|
|
173
167
|
}, _class2.defaultProps = {
|
|
174
168
|
animateDelay: 200,
|
|
175
169
|
animateDuration: 900,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var generateStyle = function generateStyle(componentTheme) {
|
|
9
|
+
return {
|
|
10
|
+
barLabel: {
|
|
11
|
+
color: componentTheme.barLabelColor,
|
|
12
|
+
fontFamily: componentTheme.barLabelFontFamily,
|
|
13
|
+
fontSize: componentTheme.barLabelFontSize,
|
|
14
|
+
textAnchor: 'middle'
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
var _default = generateStyle;
|
|
20
|
+
exports.default = _default;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default =
|
|
6
|
+
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
function
|
|
8
|
+
var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
9
9
|
var colors = _ref.colors,
|
|
10
10
|
typography = _ref.typography;
|
|
11
11
|
return {
|
|
@@ -13,4 +13,7 @@ function generator(_ref) {
|
|
|
13
13
|
barLabelFontFamily: typography.fontFamily,
|
|
14
14
|
barLabelFontSize: typography.fontSizeSmall
|
|
15
15
|
};
|
|
16
|
-
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
var _default = generateComponentTheme;
|
|
19
|
+
exports.default = _default;
|
package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js
CHANGED
|
@@ -57,7 +57,8 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
|
|
|
57
57
|
statusPollingInProgress = _ref.statusPollingInProgress,
|
|
58
58
|
setStatusPollingInProgress = _ref.setStatusPollingInProgress,
|
|
59
59
|
pollingInterval = _ref.pollingInterval,
|
|
60
|
-
|
|
60
|
+
disableReportsCache = _ref.disableReportsCache,
|
|
61
|
+
passThroughProps = (0, _objectWithoutProperties2.default)(_ref, ["quizAnalysis", "itemAnalyses", "fetchInProgress", "generationInProgress", "analysisError", "setQuizAnalysis", "addError", "setItemAnalyses", "setFetchInProgress", "setGenerationInProgress", "setAnalysisError", "activeQuizId", "generateAnalysis", "fetchQuizAnalysis", "fetchItemAnalyses", "getAnalysesExport", "fetchAnalysesStatus", "statusPollingInProgress", "setStatusPollingInProgress", "pollingInterval", "disableReportsCache"]);
|
|
61
62
|
WithAnalysisStatePresenter.displayName = "WithAnalysisStatePresenter(".concat(OriginalComponent.displayName || OriginalComponent.name, ")");
|
|
62
63
|
|
|
63
64
|
var _useState = (0, _react.useState)(false),
|
|
@@ -172,7 +173,7 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
|
|
|
172
173
|
case 0:
|
|
173
174
|
hasStoredAnalyses = quizAnalysis && itemAnalyses;
|
|
174
175
|
|
|
175
|
-
if (hasStoredAnalyses) {
|
|
176
|
+
if (!(!hasStoredAnalyses || disableReportsCache)) {
|
|
176
177
|
_context.next = 4;
|
|
177
178
|
break;
|
|
178
179
|
}
|
|
@@ -258,13 +259,15 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
|
|
|
258
259
|
getAnalysesExport: _propTypes.default.func.isRequired,
|
|
259
260
|
addError: _propTypes.default.func.isRequired,
|
|
260
261
|
pollingInterval: _propTypes.default.number.isRequired,
|
|
261
|
-
generateAnalysis: _propTypes.default.func.isRequired
|
|
262
|
-
|
|
262
|
+
generateAnalysis: _propTypes.default.func.isRequired,
|
|
263
|
+
// from LTI, f(filter: string, onError?: func(error))
|
|
264
|
+
disableReportsCache: _propTypes.default.bool
|
|
263
265
|
};
|
|
264
266
|
WithAnalysisStatePresenter.defaultProps = {
|
|
265
267
|
quizAnalysis: void 0,
|
|
266
268
|
itemAnalyses: void 0,
|
|
267
|
-
analysisError: ''
|
|
269
|
+
analysisError: '',
|
|
270
|
+
disableReportsCache: false
|
|
268
271
|
};
|
|
269
272
|
return WithAnalysisStatePresenter;
|
|
270
273
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instructure/quiz-core",
|
|
3
|
-
"version": "20.0.
|
|
3
|
+
"version": "20.0.1-rc.1+6dc3a36c0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "The Quiz React SDK by Instructure Inc.",
|
|
6
6
|
"author": "Instructure, Inc. Engineering and Product Design",
|
|
@@ -44,11 +44,11 @@
|
|
|
44
44
|
"@instructure/emotion": "^8.48.3",
|
|
45
45
|
"@instructure/grading-utils": "^1.0.0",
|
|
46
46
|
"@instructure/outcomes-ui": "^2.1.9",
|
|
47
|
-
"@instructure/quiz-common": "
|
|
48
|
-
"@instructure/quiz-i18n": "
|
|
49
|
-
"@instructure/quiz-interactions": "
|
|
50
|
-
"@instructure/quiz-number-input": "
|
|
51
|
-
"@instructure/quiz-rce": "
|
|
47
|
+
"@instructure/quiz-common": "20.0.1-rc.1+6dc3a36c0",
|
|
48
|
+
"@instructure/quiz-i18n": "20.0.1-rc.1+6dc3a36c0",
|
|
49
|
+
"@instructure/quiz-interactions": "20.0.1-rc.1+6dc3a36c0",
|
|
50
|
+
"@instructure/quiz-number-input": "20.0.1-rc.1+6dc3a36c0",
|
|
51
|
+
"@instructure/quiz-rce": "20.0.1-rc.1+6dc3a36c0",
|
|
52
52
|
"@instructure/ui-a11y-content": "^8.48.3",
|
|
53
53
|
"@instructure/ui-alerts": "^8.48.3",
|
|
54
54
|
"@instructure/ui-avatar": "^8.48.3",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"file-saver": "~2.0.5",
|
|
111
111
|
"humps": "^2.0.0",
|
|
112
112
|
"immutable": "^3.8.1",
|
|
113
|
-
"instructure-validations": "
|
|
113
|
+
"instructure-validations": "20.0.1-rc.1+6dc3a36c0",
|
|
114
114
|
"ipaddr.js": "^1.5.4",
|
|
115
115
|
"isomorphic-fetch": "^2.2.0",
|
|
116
116
|
"isuuid": "^0.1.0",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"uuid": "^3.2.1"
|
|
143
143
|
},
|
|
144
144
|
"devDependencies": {
|
|
145
|
-
"@instructure/quiz-scripts": "
|
|
145
|
+
"@instructure/quiz-scripts": "20.0.0",
|
|
146
146
|
"@instructure/ui-axe-check": "^8.48.3",
|
|
147
147
|
"@instructure/ui-babel-preset": "^7.22.1",
|
|
148
148
|
"@instructure/ui-karma-config": "^7.22.1",
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
"intl": "^1.2.4",
|
|
163
163
|
"jquery": "^2.2.3",
|
|
164
164
|
"most-subject": "^5.3.0",
|
|
165
|
-
"quiz-presets": "
|
|
165
|
+
"quiz-presets": "20.0.1-rc.1+6dc3a36c0",
|
|
166
166
|
"react": "^16.8.6",
|
|
167
167
|
"react-addons-test-utils": "^15.6.2",
|
|
168
168
|
"react-dom": "^16.8.6",
|
|
@@ -178,5 +178,5 @@
|
|
|
178
178
|
"publishConfig": {
|
|
179
179
|
"access": "public"
|
|
180
180
|
},
|
|
181
|
-
"gitHead": "
|
|
181
|
+
"gitHead": "6dc3a36c05b0baee19cdf60b63b31ae75c9698b0"
|
|
182
182
|
}
|