@dhis2/analytics 999.9.9-loadflash-alpha.1 → 999.9.9-outlier-table.alpha.2

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.
Files changed (93) hide show
  1. package/build/cjs/__fixtures__/fixtures.js +1 -0
  2. package/build/cjs/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
  3. package/build/cjs/api/analytics/AnalyticsAggregate.js +27 -1
  4. package/build/cjs/api/analytics/AnalyticsBase.js +8 -7
  5. package/build/cjs/api/analytics/AnalyticsRequestBase.js +9 -5
  6. package/build/cjs/api/analytics/AnalyticsResponse.js +42 -39
  7. package/build/cjs/api/analytics/__tests__/Analytics.spec.js +5 -0
  8. package/build/cjs/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
  9. package/build/cjs/api/analytics/__tests__/AnalyticsBase.spec.js +36 -2
  10. package/build/cjs/api/analytics/__tests__/AnalyticsTrackedEntities.spec.js +44 -0
  11. package/build/cjs/api/analytics/__tests__/__snapshots__/AnalyticsTrackedEntities.spec.js.snap +3 -0
  12. package/build/cjs/components/DataDimension/DataDimension.js +31 -7
  13. package/build/cjs/components/DataDimension/DataTypeSelector.js +17 -8
  14. package/build/cjs/components/DataDimension/GroupSelector.js +7 -7
  15. package/build/cjs/components/DataDimension/ItemSelector.js +74 -56
  16. package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationsUnit.js +6 -1
  17. package/build/cjs/components/Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js +2 -2
  18. package/build/cjs/components/PeriodDimension/PeriodDimension.js +5 -2
  19. package/build/cjs/components/PeriodDimension/PeriodTransfer.js +57 -28
  20. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
  21. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
  22. package/build/cjs/components/RichText/Editor.bk/Editor.js +40 -0
  23. package/build/cjs/components/RichText/Editor.bk/__tests__/Editor.spec.js +29 -0
  24. package/build/cjs/components/RichText/Editor.bk/__tests__/convertCtrlKey.spec.js +205 -0
  25. package/build/cjs/components/RichText/Editor.bk/convertCtrlKey.js +87 -0
  26. package/build/cjs/components/RichText/Parser.bk/MdParser.js +107 -0
  27. package/build/cjs/components/RichText/Parser.bk/Parser.js +34 -0
  28. package/build/cjs/components/RichText/Parser.bk/__tests__/MdParser.spec.js +34 -0
  29. package/build/cjs/components/RichText/Parser.bk/__tests__/Parser.spec.js +41 -0
  30. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuDropdown.js +3 -1
  31. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -0
  32. package/build/cjs/components/VisTypeIcon.js +6 -1
  33. package/build/cjs/index.js +43 -1
  34. package/build/cjs/locales/en/translations.json +5 -1
  35. package/build/cjs/locales/sv/translations.json +8 -2
  36. package/build/cjs/modules/__tests__/getAdaptedUiLayoutByType.spec.js +15 -0
  37. package/build/cjs/modules/axis.js +4 -0
  38. package/build/cjs/modules/getAdaptedUiLayoutByType.js +9 -0
  39. package/build/cjs/modules/layoutTypes.js +4 -2
  40. package/build/cjs/modules/layoutUiRules/__tests__/rules.spec.js +12 -1
  41. package/build/cjs/modules/layoutUiRules/index.js +12 -0
  42. package/build/cjs/modules/layoutUiRules/rules.js +22 -2
  43. package/build/cjs/modules/layoutUiRules/rulesHelper.js +4 -2
  44. package/build/cjs/modules/layoutUiRules/rulesUtils.js +6 -1
  45. package/build/cjs/modules/visTypeToLayoutType.js +2 -1
  46. package/build/cjs/modules/visTypes.js +9 -3
  47. package/build/es/__fixtures__/fixtures.js +1 -0
  48. package/build/es/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
  49. package/build/es/api/analytics/AnalyticsAggregate.js +27 -1
  50. package/build/es/api/analytics/AnalyticsBase.js +7 -7
  51. package/build/es/api/analytics/AnalyticsRequestBase.js +9 -5
  52. package/build/es/api/analytics/AnalyticsResponse.js +42 -39
  53. package/build/es/api/analytics/__tests__/Analytics.spec.js +5 -0
  54. package/build/es/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
  55. package/build/es/api/analytics/__tests__/AnalyticsBase.spec.js +34 -1
  56. package/build/es/api/analytics/__tests__/AnalyticsTrackedEntities.spec.js +41 -0
  57. package/build/es/api/analytics/__tests__/__snapshots__/AnalyticsTrackedEntities.spec.js.snap +3 -0
  58. package/build/es/components/DataDimension/DataDimension.js +27 -6
  59. package/build/es/components/DataDimension/DataTypeSelector.js +18 -9
  60. package/build/es/components/DataDimension/GroupSelector.js +7 -7
  61. package/build/es/components/DataDimension/ItemSelector.js +75 -57
  62. package/build/es/components/Interpretations/InterpretationsUnit/InterpretationsUnit.js +6 -1
  63. package/build/es/components/Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js +2 -2
  64. package/build/es/components/PeriodDimension/PeriodDimension.js +5 -2
  65. package/build/es/components/PeriodDimension/PeriodTransfer.js +58 -29
  66. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
  67. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
  68. package/build/es/components/RichText/Editor.bk/Editor.js +30 -0
  69. package/build/es/components/RichText/Editor.bk/__tests__/Editor.spec.js +26 -0
  70. package/build/es/components/RichText/Editor.bk/__tests__/convertCtrlKey.spec.js +202 -0
  71. package/build/es/components/RichText/Editor.bk/convertCtrlKey.js +80 -0
  72. package/build/es/components/RichText/Parser.bk/MdParser.js +99 -0
  73. package/build/es/components/RichText/Parser.bk/Parser.js +24 -0
  74. package/build/es/components/RichText/Parser.bk/__tests__/MdParser.spec.js +31 -0
  75. package/build/es/components/RichText/Parser.bk/__tests__/Parser.spec.js +38 -0
  76. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuDropdown.js +3 -1
  77. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -0
  78. package/build/es/components/VisTypeIcon.js +8 -3
  79. package/build/es/index.js +4 -4
  80. package/build/es/locales/en/translations.json +5 -1
  81. package/build/es/locales/sv/translations.json +8 -2
  82. package/build/es/modules/__tests__/getAdaptedUiLayoutByType.spec.js +16 -1
  83. package/build/es/modules/axis.js +5 -1
  84. package/build/es/modules/getAdaptedUiLayoutByType.js +10 -1
  85. package/build/es/modules/layoutTypes.js +2 -1
  86. package/build/es/modules/layoutUiRules/__tests__/rules.spec.js +13 -2
  87. package/build/es/modules/layoutUiRules/index.js +2 -2
  88. package/build/es/modules/layoutUiRules/rules.js +22 -3
  89. package/build/es/modules/layoutUiRules/rulesHelper.js +3 -2
  90. package/build/es/modules/layoutUiRules/rulesUtils.js +5 -1
  91. package/build/es/modules/visTypeToLayoutType.js +4 -3
  92. package/build/es/modules/visTypes.js +7 -3
  93. package/package.json +6 -3
@@ -0,0 +1,31 @@
1
+ import MdParser from '../MdParser.js';
2
+ const Parser = new MdParser();
3
+ describe('MdParser class', () => {
4
+ it('converts text into HTML', () => {
5
+ const tests = [['_italic_', '<em>italic</em>'], ['*bold*', '<strong>bold</strong>'], ['* not bold because there is a space *', '* not bold because there is a space *'], ['_ not italic because there is a space _', '_ not italic because there is a space _'], [':-)', '<span>\u{1F642}</span>'], [':)', '<span>\u{1F642}</span>'], [':-(', '<span>\u{1F641}</span>'], [':(', '<span>\u{1F641}</span>'], [':+1', '<span>\u{1F44D}</span>'], [':-1', '<span>\u{1F44E}</span>'], ['mixed _italic_ *bold* and :+1', 'mixed <em>italic</em> <strong>bold</strong> and <span>\u{1F44D}</span>'], ['_italic with * inside_', '<em>italic with * inside</em>'], ['*bold with _ inside*', '<strong>bold with _ inside</strong>'],
6
+ // italic marker followed by : should work
7
+ ['_italic_:', '<em>italic</em>:'], ['_italic_: some text, *bold*: some other text', '<em>italic</em>: some text, <strong>bold</strong>: some other text'],
8
+ // bold marker followed by : should work
9
+ ['*bold*:', '<strong>bold</strong>:'], ['*bold*: some text, _italic_: some other text', '<strong>bold</strong>: some text, <em>italic</em>: some other text'],
10
+ // italic marker inside an italic string not allowed
11
+ ['_italic with _ inside_', '_italic with _ inside_'],
12
+ // bold marker inside a bold string not allowed
13
+ ['*bold with * inside*', '*bold with * inside*'], ['_multiple_ italic in the _same line_', '<em>multiple</em> italic in the <em>same line</em>'],
14
+ // nested italic/bold combinations not allowed
15
+ ['_italic with *bold* inside_', '<em>italic with *bold* inside</em>'], ['*bold with _italic_ inside*', '<strong>bold with _italic_ inside</strong>'], ['text with : and :)', 'text with : and <span>\u{1F642}</span>'], ['(parenthesis and :))', '(parenthesis and <span>\u{1F642}</span>)'], [':((parenthesis:))', '<span>\u{1F641}</span>(parenthesis<span>\u{1F642}</span>)'], [':+1+1', '<span>\u{1F44D}</span>+1'], ['-1:-1', '-1<span>\u{1F44E}</span>'],
16
+ // links
17
+ ['example.com/path', '<a href="http://example.com/path">example.com/path</a>'],
18
+ // not recognized links with italic marker inside not converted
19
+ ['example_with_underscore.com/path', 'example_with_underscore.com/path'], ['example_with_underscore.com/path_with_underscore', 'example_with_underscore.com/path_with_underscore'],
20
+ // markers around non-recognized links
21
+ ['link example_with_underscore.com/path should _not_ be converted', 'link example_with_underscore.com/path should <em>not</em> be converted'], ['link example_with_underscore.com/path should *not* be converted', 'link example_with_underscore.com/path should <strong>not</strong> be converted'],
22
+ // italic marker inside links not converted
23
+ ['example.com/path_with_underscore', '<a href="http://example.com/path_with_underscore">example.com/path_with_underscore</a>'], ['_italic_ and *bold* with a example.com/link_with_underscore', '<em>italic</em> and <strong>bold</strong> with a <a href="http://example.com/link_with_underscore">example.com/link_with_underscore</a>'], ['example.com/path with *bold* after :)', '<a href="http://example.com/path">example.com/path</a> with <strong>bold</strong> after <span>\u{1F642}</span>'], ['_before_ example.com/path_with_underscore *after* :)', '<em>before</em> <a href="http://example.com/path_with_underscore">example.com/path_with_underscore</a> <strong>after</strong> <span>\u{1F642}</span>'],
24
+ // italic/bold markers right after non-word characters
25
+ ['_If % of ART retention rate after 12 months >90(%)_: Sustain the efforts.', '<em>If % of ART retention rate after 12 months &gt;90(%)</em>: Sustain the efforts.'], ['*If % of ART retention rate after 12 months >90(%)*: Sustain the efforts.', '<strong>If % of ART retention rate after 12 months &gt;90(%)</strong>: Sustain the efforts.']];
26
+ tests.forEach(test => {
27
+ const renderedText = Parser.render(test[0]);
28
+ expect(renderedText).toEqual(test[1]);
29
+ });
30
+ });
31
+ });
@@ -0,0 +1,38 @@
1
+ import { shallow } from 'enzyme';
2
+ import React from 'react';
3
+ import Parser from '../Parser.js';
4
+ import '../MdParser.js';
5
+ jest.mock('../MdParser', () => {
6
+ return jest.fn().mockImplementation(() => {
7
+ return {
8
+ render: () => 'converted text'
9
+ };
10
+ });
11
+ });
12
+ describe('RichText: Parser component', () => {
13
+ let richTextParser;
14
+ const defaultProps = {
15
+ style: {
16
+ color: 'blue'
17
+ }
18
+ };
19
+ const renderComponent = (props, text) => {
20
+ return shallow( /*#__PURE__*/React.createElement(Parser, props, text));
21
+ };
22
+ it('should have rendered a result', () => {
23
+ richTextParser = renderComponent({}, 'test');
24
+ expect(richTextParser).toHaveLength(1);
25
+ });
26
+ it('should have rendered a result with the style prop', () => {
27
+ richTextParser = renderComponent(defaultProps, 'test prop');
28
+ expect(richTextParser.props().style).toEqual(defaultProps.style);
29
+ });
30
+ it('should have rendered content', () => {
31
+ richTextParser = renderComponent({}, 'plain text');
32
+ expect(richTextParser.html()).toEqual('<p>converted text</p>');
33
+ });
34
+ it('should return null if no children is passed', () => {
35
+ richTextParser = renderComponent({}, undefined);
36
+ expect(richTextParser.html()).toBe(null);
37
+ });
38
+ });
@@ -9,6 +9,7 @@ import { useHoverMenubarContext } from './HoverMenuBar.js';
9
9
  export const HoverMenuDropdown = _ref => {
10
10
  let {
11
11
  children,
12
+ className,
12
13
  label,
13
14
  dataTest,
14
15
  disabled
@@ -26,7 +27,7 @@ export const HoverMenuDropdown = _ref => {
26
27
  disabled: disabled,
27
28
  onMouseOver: disabled ? undefined : onDropDownButtonMouseOver,
28
29
  "data-test": dataTest,
29
- className: `jsx-${menuButtonStyles.__hash}` + " " + (cx({
30
+ className: `jsx-${menuButtonStyles.__hash}` + " " + (cx(className, {
30
31
  isOpen
31
32
  }) || "")
32
33
  }, label, /*#__PURE__*/React.createElement(_JSXStyle, {
@@ -42,6 +43,7 @@ HoverMenuDropdown.defaultProps = {
42
43
  HoverMenuDropdown.propTypes = {
43
44
  children: PropTypes.node.isRequired,
44
45
  label: PropTypes.node.isRequired,
46
+ className: PropTypes.string,
45
47
  dataTest: PropTypes.string,
46
48
  disabled: PropTypes.bool
47
49
  };
@@ -14,4 +14,12 @@ describe('<HoverMenuDropdown/>', () => {
14
14
  }, "children"));
15
15
  expect(wrapper.find('button').prop('data-test')).toBe(dataTest);
16
16
  });
17
+ it('accepts a `className` prop', () => {
18
+ const className = 'test';
19
+ const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuDropdown, {
20
+ label: "test dropdown",
21
+ className: className
22
+ }, "children"));
23
+ expect(wrapper.find('button')).toHaveClassName(className);
24
+ });
17
25
  });
@@ -1,7 +1,7 @@
1
- import { IconTable16, IconVisualizationArea16, IconVisualizationAreaStacked16, IconVisualizationBar16, IconVisualizationBarStacked16, IconVisualizationColumn16, IconVisualizationColumnMulti16, IconVisualizationColumnStacked16, IconVisualizationGauge16, IconVisualizationLine16, IconVisualizationLinelist16, IconVisualizationLineMulti16, IconVisualizationPie16, IconVisualizationRadar16, IconVisualizationScatter16, IconVisualizationSingleValue16, IconTable24, IconVisualizationArea24, IconVisualizationAreaStacked24, IconVisualizationBar24, IconVisualizationBarStacked24, IconVisualizationColumn24, IconVisualizationLinelist24, IconVisualizationColumnMulti24, IconVisualizationColumnStacked24, IconVisualizationGauge24, IconVisualizationLine24, IconVisualizationLineMulti24, IconVisualizationPie24, IconVisualizationRadar24, IconVisualizationScatter24, IconVisualizationSingleValue24 } from '@dhis2/ui';
1
+ import { IconVisualizationArea16, IconVisualizationAreaStacked16, IconVisualizationBar16, IconVisualizationBarStacked16, IconVisualizationColumn16, IconVisualizationColumnMulti16, IconVisualizationColumnStacked16, IconVisualizationGauge16, IconVisualizationLine16, IconVisualizationLinelist16, IconVisualizationLineMulti16, IconVisualizationOutlierTable16, IconVisualizationPie16, IconVisualizationPivotTable16, IconVisualizationRadar16, IconVisualizationScatter16, IconVisualizationSingleValue16, IconVisualizationArea24, IconVisualizationAreaStacked24, IconVisualizationBar24, IconVisualizationBarStacked24, IconVisualizationColumn24, IconVisualizationLinelist24, IconVisualizationColumnMulti24, IconVisualizationColumnStacked24, IconVisualizationGauge24, IconVisualizationLine24, IconVisualizationLineMulti24, IconVisualizationOutlierTable24, IconVisualizationPie24, IconVisualizationPivotTable24, IconVisualizationRadar24, IconVisualizationScatter24, IconVisualizationSingleValue24 } from '@dhis2/ui';
2
2
  import PropTypes from 'prop-types';
3
3
  import React from 'react';
4
- import { VIS_TYPE_LINE_LIST, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_SCATTER } from '../modules/visTypes.js';
4
+ import { VIS_TYPE_LINE_LIST, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_SCATTER, VIS_TYPE_OUTLIER_TABLE } from '../modules/visTypes.js';
5
5
  export const VisTypeIcon = _ref => {
6
6
  let {
7
7
  type,
@@ -17,7 +17,7 @@ export const VisTypeIcon = _ref => {
17
17
  }
18
18
  case VIS_TYPE_PIVOT_TABLE:
19
19
  {
20
- VisIcon = useSmall ? IconTable16 : IconTable24;
20
+ VisIcon = useSmall ? IconVisualizationPivotTable16 : IconVisualizationPivotTable24;
21
21
  break;
22
22
  }
23
23
  case VIS_TYPE_BAR:
@@ -85,6 +85,11 @@ export const VisTypeIcon = _ref => {
85
85
  VisIcon = useSmall ? IconVisualizationScatter16 : IconVisualizationScatter24;
86
86
  break;
87
87
  }
88
+ case VIS_TYPE_OUTLIER_TABLE:
89
+ {
90
+ VisIcon = useSmall ? IconVisualizationOutlierTable16 : IconVisualizationOutlierTable24;
91
+ break;
92
+ }
88
93
  case VIS_TYPE_COLUMN:
89
94
  default:
90
95
  {
package/build/es/index.js CHANGED
@@ -97,15 +97,15 @@ export { getLayoutTypeByVisType } from './modules/visTypeToLayoutType.js';
97
97
 
98
98
  // Modules: visTypes
99
99
 
100
- export { VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS, VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_BUBBLE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST, visTypeDisplayNames, visTypeIcons, getDisplayNameByVisType, defaultVisType, isStacked, isMultiType, isYearOverYear, isDualAxisType, isSingleValue, isTwoCategoryChartType, isLegendSetType, isColumnBasedType, isVerticalType } from './modules/visTypes.js';
100
+ export { VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS, VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_BUBBLE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST, VIS_TYPE_OUTLIER_TABLE, visTypeDisplayNames, visTypeIcons, getDisplayNameByVisType, defaultVisType, isStacked, isMultiType, isYearOverYear, isDualAxisType, isSingleValue, isOutlierTable, isTwoCategoryChartType, isLegendSetType, isColumnBasedType, isVerticalType } from './modules/visTypes.js';
101
101
 
102
102
  // Modules: layoutTypes
103
103
 
104
- export { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_SINGLE_VALUE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST } from './modules/layoutTypes.js';
104
+ export { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_SINGLE_VALUE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST, LAYOUT_TYPE_OUTLIER_TABLE } from './modules/layoutTypes.js';
105
105
 
106
106
  // Modules: layoutUiRules
107
107
 
108
- export { getAvailableAxes, getDisallowedDimensions, getAxisMaxNumberOfItems, getAxisMaxNumberOfDimensions, getAxisMinNumberOfDimensions, hasAxisTooManyItems, getAxisPerLockedDimension, getAllLockedDimensionIds, canDimensionBeAddedToAxis, isDimensionLocked, isAxisFull, getTransferableDimension } from './modules/layoutUiRules/index.js';
108
+ export { getAvailableAxes, getDisallowedDimensions, getDimensionMaxNumberOfItems, getAxisMaxNumberOfItems, getAxisMaxNumberOfDimensions, getAxisMinNumberOfDimensions, hasAxisTooManyItems, hasDimensionTooManyItems, getAxisPerLockedDimension, getAllLockedDimensionIds, canDimensionBeAddedToAxis, isDimensionLocked, isAxisFull, getTransferableDimension } from './modules/layoutUiRules/index.js';
109
109
 
110
110
  // Visualizations
111
111
 
@@ -131,4 +131,4 @@ export { DAILY, WEEKLY, WEEKLYWED, WEEKLYTHU, WEEKLYSAT, WEEKLYSUN, WEEKS_THIS_Y
131
131
  export { getRelativePeriodsOptionsById } from './components/PeriodDimension/utils/relativePeriods.js';
132
132
  export { getFixedPeriodsOptionsById } from './components/PeriodDimension/utils/fixedPeriods.js';
133
133
  export { default as VisualizationOptions } from './components/Options/VisualizationOptions.js';
134
- export { DIMENSION_TYPE_INDICATOR, DIMENSION_TYPE_DATA_ELEMENT, DIMENSION_TYPE_DATA_SET, DIMENSION_TYPE_EVENT_DATA_ITEM, DIMENSION_TYPE_PROGRAM_INDICATOR, DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, DIMENSION_TYPE_PROGRAM_ATTRIBUTE, DIMENSION_TYPE_DATA_ELEMENT_OPERAND, DIMENSION_TYPE_CATEGORY, DIMENSION_TYPE_CATEGORY_OPTION_GROUP_SET, DIMENSION_TYPE_ALL, DIMENSION_TYPE_DATA, DIMENSION_TYPE_DATA_ELEMENT_GROUP_SET, DIMENSION_TYPE_ORGANISATION_UNIT, DIMENSION_TYPE_PERIOD, DIMENSION_TYPE_ORGANISATION_UNIT_GROUP_SET, DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM } from './modules/dataTypes.js';
134
+ export { DIMENSION_TYPE_INDICATOR, DIMENSION_TYPE_DATA_ELEMENT, DIMENSION_TYPE_DATA_SET, DIMENSION_TYPE_EVENT_DATA_ITEM, DIMENSION_TYPE_PROGRAM_INDICATOR, DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, DIMENSION_TYPE_PROGRAM_ATTRIBUTE, DIMENSION_TYPE_DATA_ELEMENT_OPERAND, DIMENSION_TYPE_CATEGORY, DIMENSION_TYPE_CATEGORY_OPTION_GROUP_SET, DIMENSION_TYPE_ALL, DIMENSION_TYPE_DATA, DIMENSION_TYPE_DATA_ELEMENT_GROUP_SET, DIMENSION_TYPE_ORGANISATION_UNIT, DIMENSION_TYPE_PERIOD, DIMENSION_TYPE_ORGANISATION_UNIT_GROUP_SET, DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, dataTypeMap } from './modules/dataTypes.js';
@@ -44,6 +44,7 @@
44
44
  "Drag items here, or double click in the list, to start building a calculation formula": "Drag items here, or double click in the list, to start building a calculation formula",
45
45
  "Math operators": "Math operators",
46
46
  "Data Type": "Data Type",
47
+ "Only {{dataType}} can be used in {{visType}}": "Only {{dataType}} can be used in {{visType}}",
47
48
  "All types": "All types",
48
49
  "Disaggregation": "Disaggregation",
49
50
  "No data": "No data",
@@ -54,10 +55,12 @@
54
55
  "No data sets found": "No data sets found",
55
56
  "No event data items found": "No event data items found",
56
57
  "No program indicators found": "No program indicators found",
58
+ "No calculations found": "No calculations found",
57
59
  "No indicators found for \"{{- searchTerm}}\"": "No indicators found for \"{{- searchTerm}}\"",
58
60
  "No data sets found for \"{{- searchTerm}}\"": "No data sets found for \"{{- searchTerm}}\"",
59
61
  "No event data items found for \"{{- searchTerm}}\"": "No event data items found for \"{{- searchTerm}}\"",
60
62
  "No program indicators found for \"{{- searchTerm}}\"": "No program indicators found for \"{{- searchTerm}}\"",
63
+ "No calculations found for \"{{- searchTerm}}\"": "No calculations found for \"{{- searchTerm}}\"",
61
64
  "Nothing found for \"{{- searchTerm}}\"": "Nothing found for \"{{- searchTerm}}\"",
62
65
  "Calculation": "Calculation",
63
66
  "Metric type": "Metric type",
@@ -200,9 +203,9 @@
200
203
  "Year": "Year",
201
204
  "Select year": "Select year",
202
205
  "Period": "Period",
206
+ "Selected Periods": "Selected Periods",
203
207
  "Relative periods": "Relative periods",
204
208
  "Fixed periods": "Fixed periods",
205
- "Selected Periods": "Selected Periods",
206
209
  "No periods selected": "No periods selected",
207
210
  "Daily": "Daily",
208
211
  "Weekly": "Weekly",
@@ -370,6 +373,7 @@
370
373
  "Radar": "Radar",
371
374
  "Scatter": "Scatter",
372
375
  "Single value": "Single value",
376
+ "Outlier table": "Outlier table",
373
377
  "All charts": "All charts",
374
378
  "{{seriesName}} (trend)": "{{seriesName}} (trend)",
375
379
  "Trend": "Trend",
@@ -107,6 +107,7 @@
107
107
  "Edit": "Redigera",
108
108
  "Write a reply": "",
109
109
  "Post reply": "",
110
+ "Delete failed": "",
110
111
  "Could not update comment": "",
111
112
  "Enter comment text": "",
112
113
  "Update": "Uppdatera",
@@ -115,11 +116,15 @@
115
116
  "The interpretation couldn’t be displayed. Try again or contact your system administrator.": "",
116
117
  "Hide interpretation": "",
117
118
  "Write an interpretation": "",
119
+ "Other people viewing this interpretation in the future may see more data.": "",
118
120
  "Post interpretation": "",
119
121
  "Interpretations": "tolkningar",
122
+ "Reply": "Svar",
123
+ "{{count}} replies": "",
124
+ "{{count}} replies_plural": "",
125
+ "View replies": "",
120
126
  "Unlike": "",
121
127
  "Like": "",
122
- "Reply": "Svar",
123
128
  "Share": "Dela med sig",
124
129
  "See interpretation": "",
125
130
  "Manage sharing": "",
@@ -190,7 +195,7 @@
190
195
  "User sub-x2-units": "Användarunder x2-enheter",
191
196
  "Select a level": "",
192
197
  "Select a group": "",
193
- "Deselect all": "",
198
+ "Deselect all": "Avmarkera alla",
194
199
  "Period type": "Periodtyp",
195
200
  "Year": "År",
196
201
  "Select year": "Välj år",
@@ -267,6 +272,7 @@
267
272
  "Six-months": "",
268
273
  "Financial Years": "",
269
274
  "Years": "År",
275
+ "Interpretations and details": "",
270
276
  "Translating to": "",
271
277
  "Choose a locale": "",
272
278
  "Base locale reference": "",
@@ -1,9 +1,10 @@
1
1
  import { getAdaptedUiLayoutByType } from '../getAdaptedUiLayoutByType.js';
2
2
  import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from '../layout/axis.js';
3
3
  import { DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT } from '../predefinedDimensions.js';
4
- import { VIS_TYPE_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_BAR, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE } from '../visTypes.js';
4
+ import { VIS_TYPE_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_BAR, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_OUTLIER_TABLE } from '../visTypes.js';
5
5
  const someId = 'someId';
6
6
  const otherId = 'otherId';
7
+ const thirdId = 'thirdId';
7
8
  describe('getAdaptedUiLayoutByType', () => {
8
9
  it('column: moves all extra dimensions in columns and rows to filters', () => {
9
10
  const initialState = {
@@ -107,6 +108,20 @@ describe('getAdaptedUiLayoutByType', () => {
107
108
  };
108
109
  expect(actualState).toEqual(expectedState);
109
110
  });
111
+ it('outlier table: removes all dimensions but dx,pe,ou which are moved to columns', () => {
112
+ const initialState = {
113
+ [AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, someId],
114
+ [AXIS_ID_ROWS]: [DIMENSION_ID_PERIOD, otherId],
115
+ [AXIS_ID_FILTERS]: [DIMENSION_ID_ORGUNIT, thirdId]
116
+ };
117
+ const actualState = getAdaptedUiLayoutByType(initialState, VIS_TYPE_OUTLIER_TABLE);
118
+ const expectedState = {
119
+ [AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT],
120
+ [AXIS_ID_ROWS]: [],
121
+ [AXIS_ID_FILTERS]: []
122
+ };
123
+ expect(actualState).toEqual(expectedState);
124
+ });
110
125
  it('pivot -> sv with dimension strings', () => {
111
126
  const initialLayout = {
112
127
  [AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD],
@@ -1,6 +1,6 @@
1
1
  import i18n from '../locales/index.js';
2
2
  import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from './layout/axis.js';
3
- import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST } from './layoutTypes.js';
3
+ import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST, LAYOUT_TYPE_OUTLIER_TABLE } from './layoutTypes.js';
4
4
  const getAxisNamesByLayoutType = layoutType => {
5
5
  switch (layoutType) {
6
6
  case LAYOUT_TYPE_DEFAULT:
@@ -28,6 +28,10 @@ const getAxisNamesByLayoutType = layoutType => {
28
28
  [AXIS_ID_ROWS]: i18n.t('Points'),
29
29
  [AXIS_ID_FILTERS]: i18n.t('Filter')
30
30
  };
31
+ case LAYOUT_TYPE_OUTLIER_TABLE:
32
+ return {
33
+ [AXIS_ID_COLUMNS]: i18n.t('Columns')
34
+ };
31
35
  }
32
36
  };
33
37
  export const getAxisNameByLayoutType = (axisId, layoutType) => {
@@ -1,7 +1,7 @@
1
1
  import isObject from 'lodash/isObject';
2
2
  import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from './layout/axis.js';
3
3
  import { DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD } from './predefinedDimensions.js';
4
- import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIE, VIS_TYPE_GAUGE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, isTwoCategoryChartType } from './visTypes.js';
4
+ import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIE, VIS_TYPE_GAUGE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_OUTLIER_TABLE, isTwoCategoryChartType } from './visTypes.js';
5
5
  export const getAdaptedUiLayoutByType = (layout, type) => {
6
6
  var _layout$rows;
7
7
  if (isTwoCategoryChartType(type) && ((_layout$rows = layout.rows) === null || _layout$rows === void 0 ? void 0 : _layout$rows.length) > 1) {
@@ -26,6 +26,8 @@ export const getAdaptedUiLayoutByType = (layout, type) => {
26
26
  return layout;
27
27
  case VIS_TYPE_SCATTER:
28
28
  return getScatterLayout(layout);
29
+ case VIS_TYPE_OUTLIER_TABLE:
30
+ return getOutlierTableLayout(layout);
29
31
  default:
30
32
  return getDefaultLayout(layout);
31
33
  }
@@ -99,6 +101,13 @@ const getSingleValueLayout = layout => {
99
101
  };
100
102
  };
101
103
 
104
+ // Transform from ui.layout to outlier table layout format
105
+ const getOutlierTableLayout = () => ({
106
+ [AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT],
107
+ [AXIS_ID_ROWS]: [],
108
+ [AXIS_ID_FILTERS]: []
109
+ });
110
+
102
111
  /**
103
112
  *
104
113
  * @param {string|object} dimension
@@ -4,4 +4,5 @@ export const LAYOUT_TYPE_SINGLE_VALUE = 'LAYOUT_TYPE_SINGLE_VALUE';
4
4
  export const LAYOUT_TYPE_YEAR_OVER_YEAR = 'LAYOUT_TYPE_YEAR_OVER_YEAR';
5
5
  export const LAYOUT_TYPE_PIVOT_TABLE = 'LAYOUT_TYPE_PIVOT_TABLE';
6
6
  export const LAYOUT_TYPE_SCATTER = 'LAYOUT_TYPE_SCATTER';
7
- export const LAYOUT_TYPE_LINE_LIST = 'LAYOUT_TYPE_LINE_LIST';
7
+ export const LAYOUT_TYPE_LINE_LIST = 'LAYOUT_TYPE_LINE_LIST';
8
+ export const LAYOUT_TYPE_OUTLIER_TABLE = 'LAYOUT_TYPE_OUTLIER_TABLE';
@@ -1,14 +1,15 @@
1
1
  import { ALL_AXIS_IDS } from '../../layout/axis.js';
2
- import { DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD } from '../../predefinedDimensions.js';
2
+ import { DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD, DIMENSION_ID_ASSIGNED_CATEGORIES } from '../../predefinedDimensions.js';
3
3
  import { testResourceRules, testResourceRequiredProps, testResourceAllRuleProps } from '../rules.js';
4
4
 
5
5
  // Consts
6
6
  const lockableDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT];
7
- const disallowableDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD];
7
+ const disallowableDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ASSIGNED_CATEGORIES];
8
8
 
9
9
  // Helper fns
10
10
  const allArrayItemsAreValid = (allItems, validItems) => allItems.every(value => validItems.includes(value));
11
11
  const allArrayItemsAreValidAxisIds = array => allArrayItemsAreValid(array, ALL_AXIS_IDS);
12
+ const allArrayItemsAreValidDimensionIds = array => allArrayItemsAreValid(array, lockableDims);
12
13
  const onlyRulesWithProp = ruleProp => testResourceRules.filter(rule => rule[ruleProp]);
13
14
 
14
15
  // Partial tests
@@ -18,6 +19,9 @@ const testPropHasKeysAndValues = ruleProp => it('has keys and values', () => {
18
19
  const testPropIsArray = ruleProp => it('is an array', () => {
19
20
  expect(onlyRulesWithProp(ruleProp).every(rule => Array.isArray(rule[ruleProp]))).toBe(true);
20
21
  });
22
+ const testKeysAreValidDimensionIds = ruleProp => it('keys should be valid dimension ids', () => {
23
+ expect(onlyRulesWithProp(ruleProp).every(rule => allArrayItemsAreValidDimensionIds(Object.keys(rule[ruleProp])))).toBe(true);
24
+ });
21
25
  const testKeysAreValidAxisIds = ruleProp => it('keys should be valid axis ids', () => {
22
26
  expect(onlyRulesWithProp(ruleProp).every(rule => allArrayItemsAreValidAxisIds(Object.keys(rule[ruleProp])))).toBe(true);
23
27
  });
@@ -56,6 +60,13 @@ describe("verify each rule's ", () => {
56
60
  testNoValuesNegative(ruleProp);
57
61
  });
58
62
  });
63
+ describe('MAX_ITEMS_PER_DIMENSION', () => {
64
+ const ruleProp = testResourceAllRuleProps['MAX_ITEMS_PER_DIMENSION'];
65
+ testPropHasKeysAndValues(ruleProp);
66
+ testKeysAreValidDimensionIds(ruleProp);
67
+ testNoValuesZero(ruleProp);
68
+ testNoValuesNegative(ruleProp);
69
+ });
59
70
  describe('AVAILABLE_AXES', () => {
60
71
  const ruleProp = testResourceAllRuleProps['AVAILABLE_AXES'];
61
72
  testPropIsArray(ruleProp);
@@ -1,2 +1,2 @@
1
- export { getAvailableAxesByVisType as getAvailableAxes, getDisallowedDimsByVisType as getDisallowedDimensions, getAxisMaxNumberOfItemsByVisType as getAxisMaxNumberOfItems, getAxisMaxNumberOfDimsByVisType as getAxisMaxNumberOfDimensions, getAxisMinNumberOfDimsByVisType as getAxisMinNumberOfDimensions, getAxisPerLockedDimByVisType as getAxisPerLockedDimension, getAllLockedDimIdsByVisType as getAllLockedDimensionIds } from './rulesHelper.js';
2
- export { hasAxisTooManyItemsByVisType as hasAxisTooManyItems, isDimensionLockedByVisType as isDimensionLocked, isAxisFullByVisType as isAxisFull, canDimensionBeAddedToAxisByVisType as canDimensionBeAddedToAxis, getTransferableDimensionPerAxisByVisType as getTransferableDimension } from './rulesUtils.js';
1
+ export { getAvailableAxesByVisType as getAvailableAxes, getDisallowedDimsByVisType as getDisallowedDimensions, getAxisMaxNumberOfItemsByVisType as getAxisMaxNumberOfItems, getAxisMaxNumberOfDimsByVisType as getAxisMaxNumberOfDimensions, getAxisMinNumberOfDimsByVisType as getAxisMinNumberOfDimensions, getAxisPerLockedDimByVisType as getAxisPerLockedDimension, getAllLockedDimIdsByVisType as getAllLockedDimensionIds, getDimensionMaxNumberOfItemsByVisType as getDimensionMaxNumberOfItems } from './rulesHelper.js';
2
+ export { hasAxisTooManyItemsByVisType as hasAxisTooManyItems, hasDimensionTooManyItemsByVisType as hasDimensionTooManyItems, isDimensionLockedByVisType as isDimensionLocked, isAxisFullByVisType as isAxisFull, canDimensionBeAddedToAxisByVisType as canDimensionBeAddedToAxis, getTransferableDimensionPerAxisByVisType as getTransferableDimension } from './rulesUtils.js';
@@ -1,10 +1,11 @@
1
1
  import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from '../layout/axis.js';
2
- import { DIMENSION_ID_PERIOD, DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT } from '../predefinedDimensions.js';
3
- import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST } from '../visTypes.js';
2
+ import { DIMENSION_ID_PERIOD, DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_ASSIGNED_CATEGORIES } from '../predefinedDimensions.js';
3
+ import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST, VIS_TYPE_OUTLIER_TABLE } from '../visTypes.js';
4
4
  const RULE_PROP_AVAILABLE_AXES = 'availableAxes',
5
5
  RULE_PROP_MAX_DIMS_PER_AXIS = 'maxNumberOfDimsPerAxis',
6
6
  RULE_PROP_MIN_DIMS_PER_AXIS = 'minNumberOfDimsPerAxis',
7
7
  RULE_PROP_MAX_ITEMS_PER_AXIS = 'maxNumberOfItemsPerAxis',
8
+ RULE_PROP_MAX_ITEMS_PER_DIMENSION = 'maxNumberOfItemsPerDimension',
8
9
  RULE_PROP_DISALLOWED_DIMS = 'disallowedDims',
9
10
  RULE_PROP_LOCKED_DIMS = 'lockedDims';
10
11
  const defaultRules = {
@@ -82,6 +83,21 @@ const scatterRules = {
82
83
  const lineListRules = {
83
84
  [RULE_PROP_AVAILABLE_AXES]: [AXIS_ID_COLUMNS, AXIS_ID_FILTERS]
84
85
  };
86
+ const outlierTableRules = {
87
+ [RULE_PROP_AVAILABLE_AXES]: [AXIS_ID_COLUMNS],
88
+ [RULE_PROP_MIN_DIMS_PER_AXIS]: {
89
+ [AXIS_ID_COLUMNS]: 3
90
+ },
91
+ [RULE_PROP_MAX_ITEMS_PER_DIMENSION]: {
92
+ [DIMENSION_ID_PERIOD]: 1
93
+ },
94
+ [RULE_PROP_LOCKED_DIMS]: {
95
+ [DIMENSION_ID_DATA]: AXIS_ID_COLUMNS,
96
+ [DIMENSION_ID_PERIOD]: AXIS_ID_COLUMNS,
97
+ [DIMENSION_ID_ORGUNIT]: AXIS_ID_COLUMNS
98
+ },
99
+ [RULE_PROP_DISALLOWED_DIMS]: [DIMENSION_ID_ASSIGNED_CATEGORIES]
100
+ };
85
101
  const visTypeToRules = {
86
102
  [VIS_TYPE_COLUMN]: defaultRules,
87
103
  [VIS_TYPE_STACKED_COLUMN]: defaultRules,
@@ -98,7 +114,8 @@ const visTypeToRules = {
98
114
  [VIS_TYPE_YEAR_OVER_YEAR_COLUMN]: yearOverYearRules,
99
115
  [VIS_TYPE_PIVOT_TABLE]: pivotTableRules,
100
116
  [VIS_TYPE_SCATTER]: scatterRules,
101
- [VIS_TYPE_LINE_LIST]: lineListRules
117
+ [VIS_TYPE_LINE_LIST]: lineListRules,
118
+ [VIS_TYPE_OUTLIER_TABLE]: outlierTableRules
102
119
  };
103
120
  const getRulesByVisType = visType => {
104
121
  const rules = visTypeToRules[visType];
@@ -113,6 +130,7 @@ const getRulesByVisType = visType => {
113
130
  export const getAvailableAxesByVisType = visType => getRulesByVisType(visType)[RULE_PROP_AVAILABLE_AXES] || [];
114
131
  export const getMaxNumberOfDimsPerAxisByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MAX_DIMS_PER_AXIS] || {};
115
132
  export const getMinNumberOfDimsPerAxisByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MIN_DIMS_PER_AXIS] || {};
133
+ export const getMaxNumberOfItemsPerDimensionByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MAX_ITEMS_PER_DIMENSION] || {};
116
134
  export const getMaxNumberOfItemsPerAxisByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MAX_ITEMS_PER_AXIS] || {};
117
135
  export const getDisallowedDimsByVisType = visType => getRulesByVisType(visType)[RULE_PROP_DISALLOWED_DIMS] || [];
118
136
  export const getLockedDimsByVisType = visType => getRulesByVisType(visType)[RULE_PROP_LOCKED_DIMS] || {};
@@ -126,6 +144,7 @@ export const testResourceAllRuleProps = {
126
144
  MAX_DIMS_PER_AXIS: RULE_PROP_MAX_DIMS_PER_AXIS,
127
145
  MIN_DIMS_PER_AXIS: RULE_PROP_MIN_DIMS_PER_AXIS,
128
146
  MAX_ITEMS_PER_AXIS: RULE_PROP_MAX_ITEMS_PER_AXIS,
147
+ MAX_ITEMS_PER_DIMENSION: RULE_PROP_MAX_ITEMS_PER_DIMENSION,
129
148
  DISALLOWED_DIMS: RULE_PROP_DISALLOWED_DIMS,
130
149
  LOCKED_DIMS: RULE_PROP_LOCKED_DIMS
131
150
  };
@@ -1,4 +1,4 @@
1
- import { getMaxNumberOfItemsPerAxisByVisType, getMaxNumberOfDimsPerAxisByVisType, getMinNumberOfDimsPerAxisByVisType, getLockedDimsByVisType } from './rules.js';
1
+ import { getMaxNumberOfItemsPerDimensionByVisType, getMaxNumberOfItemsPerAxisByVisType, getMaxNumberOfDimsPerAxisByVisType, getMinNumberOfDimsPerAxisByVisType, getLockedDimsByVisType } from './rules.js';
2
2
 
3
3
  // Selectors
4
4
 
@@ -7,4 +7,5 @@ export const getAxisMaxNumberOfItemsByVisType = (visType, axisId) => getMaxNumbe
7
7
  export const getAxisMaxNumberOfDimsByVisType = (visType, axisId) => getMaxNumberOfDimsPerAxisByVisType(visType)[axisId];
8
8
  export const getAxisMinNumberOfDimsByVisType = (visType, axisId) => getMinNumberOfDimsPerAxisByVisType(visType)[axisId];
9
9
  export const getAxisPerLockedDimByVisType = (visType, dimensionId) => getLockedDimsByVisType(visType)[dimensionId];
10
- export const getAllLockedDimIdsByVisType = visType => Object.keys(getLockedDimsByVisType(visType));
10
+ export const getAllLockedDimIdsByVisType = visType => Object.keys(getLockedDimsByVisType(visType));
11
+ export const getDimensionMaxNumberOfItemsByVisType = (visType, dimensionId) => getMaxNumberOfItemsPerDimensionByVisType(visType)[dimensionId];
@@ -1,9 +1,13 @@
1
1
  import { getLockedDimsByVisType } from './rules.js';
2
- import { getAxisMaxNumberOfDimsByVisType, getAxisMaxNumberOfItemsByVisType, getAllLockedDimIdsByVisType } from './rulesHelper.js';
2
+ import { getAxisMaxNumberOfDimsByVisType, getAxisMaxNumberOfItemsByVisType, getDimensionMaxNumberOfItemsByVisType, getAllLockedDimIdsByVisType } from './rulesHelper.js';
3
3
  export const hasAxisTooManyItemsByVisType = (visType, axisId, numberOfItems) => {
4
4
  const maxNumberOfItemsPerAxis = getAxisMaxNumberOfItemsByVisType(visType, axisId);
5
5
  return maxNumberOfItemsPerAxis ? numberOfItems > maxNumberOfItemsPerAxis : false;
6
6
  };
7
+ export const hasDimensionTooManyItemsByVisType = (visType, dimensionId, numberOfItems) => {
8
+ const maxNumberOfItemsPerDimension = getDimensionMaxNumberOfItemsByVisType(visType, dimensionId);
9
+ return maxNumberOfItemsPerDimension ? numberOfItems > maxNumberOfItemsPerDimension : false;
10
+ };
7
11
  export const isDimensionLockedByVisType = (visType, dimensionId) => getAllLockedDimIdsByVisType(visType).includes(dimensionId);
8
12
  export const isAxisFullByVisType = (visType, axisId, axisDimensionsCount) => axisDimensionsCount >= getAxisMaxNumberOfDimsByVisType(visType, axisId);
9
13
  export const canDimensionBeAddedToAxisByVisType = (visType, axis, axisId) => {
@@ -1,5 +1,5 @@
1
- import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST } from './layoutTypes.js';
2
- import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST } from './visTypes.js';
1
+ import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST, LAYOUT_TYPE_OUTLIER_TABLE } from './layoutTypes.js';
2
+ import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST, VIS_TYPE_OUTLIER_TABLE } from './visTypes.js';
3
3
  const visTypeToLayoutType = {
4
4
  [VIS_TYPE_COLUMN]: LAYOUT_TYPE_DEFAULT,
5
5
  [VIS_TYPE_STACKED_COLUMN]: LAYOUT_TYPE_DEFAULT,
@@ -16,6 +16,7 @@ const visTypeToLayoutType = {
16
16
  [VIS_TYPE_SINGLE_VALUE]: LAYOUT_TYPE_PIE,
17
17
  [VIS_TYPE_PIVOT_TABLE]: LAYOUT_TYPE_PIVOT_TABLE,
18
18
  [VIS_TYPE_SCATTER]: LAYOUT_TYPE_SCATTER,
19
- [VIS_TYPE_LINE_LIST]: LAYOUT_TYPE_LINE_LIST
19
+ [VIS_TYPE_LINE_LIST]: LAYOUT_TYPE_LINE_LIST,
20
+ [VIS_TYPE_OUTLIER_TABLE]: LAYOUT_TYPE_OUTLIER_TABLE
20
21
  };
21
22
  export const getLayoutTypeByVisType = visType => visTypeToLayoutType[visType];
@@ -1,4 +1,4 @@
1
- import { IconTable24, IconVisualizationArea24, IconVisualizationAreaStacked24, IconVisualizationBar24, IconVisualizationBarStacked24, IconVisualizationColumn24, IconVisualizationColumnMulti24, IconVisualizationColumnStacked24, IconVisualizationGauge24, IconVisualizationLine24, IconVisualizationLinelist24, IconVisualizationLineMulti24, IconVisualizationPie24, IconVisualizationRadar24, IconVisualizationScatter24, IconVisualizationSingleValue24 } from '@dhis2/ui';
1
+ import { IconVisualizationArea24, IconVisualizationAreaStacked24, IconVisualizationBar24, IconVisualizationBarStacked24, IconVisualizationColumn24, IconVisualizationColumnMulti24, IconVisualizationColumnStacked24, IconVisualizationGauge24, IconVisualizationLine24, IconVisualizationLinelist24, IconVisualizationLineMulti24, IconVisualizationOutlierTable24, IconVisualizationPie24, IconVisualizationPivotTable24, IconVisualizationRadar24, IconVisualizationScatter24, IconVisualizationSingleValue24 } from '@dhis2/ui';
2
2
  import i18n from '../locales/index.js';
3
3
  export const VIS_TYPE_PIVOT_TABLE = 'PIVOT_TABLE';
4
4
  export const VIS_TYPE_AREA = 'AREA';
@@ -19,6 +19,7 @@ export const VIS_TYPE_SINGLE_VALUE = 'SINGLE_VALUE';
19
19
  export const VIS_TYPE_BUBBLE = 'BUBBLE';
20
20
  export const VIS_TYPE_GROUP_ALL = 'ALL';
21
21
  export const VIS_TYPE_GROUP_CHARTS = 'CHARTS';
22
+ export const VIS_TYPE_OUTLIER_TABLE = 'OUTLIER_TABLE';
22
23
  export const visTypeDisplayNames = {
23
24
  [VIS_TYPE_PIVOT_TABLE]: i18n.t('Pivot table'),
24
25
  [VIS_TYPE_AREA]: i18n.t('Area'),
@@ -36,11 +37,12 @@ export const visTypeDisplayNames = {
36
37
  [VIS_TYPE_RADAR]: i18n.t('Radar'),
37
38
  [VIS_TYPE_SCATTER]: i18n.t('Scatter'),
38
39
  [VIS_TYPE_SINGLE_VALUE]: i18n.t('Single value'),
40
+ [VIS_TYPE_OUTLIER_TABLE]: i18n.t('Outlier table'),
39
41
  [VIS_TYPE_GROUP_ALL]: i18n.t('All types'),
40
42
  [VIS_TYPE_GROUP_CHARTS]: i18n.t('All charts')
41
43
  };
42
44
  export const visTypeIcons = {
43
- [VIS_TYPE_PIVOT_TABLE]: IconTable24,
45
+ [VIS_TYPE_PIVOT_TABLE]: IconVisualizationPivotTable24,
44
46
  [VIS_TYPE_AREA]: IconVisualizationArea24,
45
47
  [VIS_TYPE_STACKED_AREA]: IconVisualizationAreaStacked24,
46
48
  [VIS_TYPE_BAR]: IconVisualizationBar24,
@@ -55,7 +57,8 @@ export const visTypeIcons = {
55
57
  [VIS_TYPE_PIE]: IconVisualizationPie24,
56
58
  [VIS_TYPE_RADAR]: IconVisualizationRadar24,
57
59
  [VIS_TYPE_SCATTER]: IconVisualizationScatter24,
58
- [VIS_TYPE_SINGLE_VALUE]: IconVisualizationSingleValue24
60
+ [VIS_TYPE_SINGLE_VALUE]: IconVisualizationSingleValue24,
61
+ [VIS_TYPE_OUTLIER_TABLE]: IconVisualizationOutlierTable24
59
62
  };
60
63
  export const getDisplayNameByVisType = visType => {
61
64
  const displayName = visTypeDisplayNames[visType];
@@ -78,6 +81,7 @@ export const isYearOverYear = type => yearOverYearTypes.includes(type);
78
81
  export const isDualAxisType = type => dualAxisTypes.includes(type);
79
82
  export const isMultiType = type => multiTypeTypes.includes(type);
80
83
  export const isSingleValue = type => type === VIS_TYPE_SINGLE_VALUE;
84
+ export const isOutlierTable = type => type === VIS_TYPE_OUTLIER_TABLE;
81
85
  export const isTwoCategoryChartType = type => twoCategoryChartTypes.includes(type);
82
86
  export const isVerticalType = type => verticalTypes.includes(type);
83
87
  export const isLegendSetType = type => legendSetTypes.includes(type);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhis2/analytics",
3
- "version": "999.9.9-loadflash-alpha.1",
3
+ "version": "999.9.9-outlier-table.alpha.2",
4
4
  "main": "./build/cjs/index.js",
5
5
  "module": "./build/es/index.js",
6
6
  "exports": {
@@ -35,7 +35,7 @@
35
35
  "@dhis2/cli-app-scripts": "^9.0.1",
36
36
  "@dhis2/cli-style": "^10.4.1",
37
37
  "@dhis2/d2-i18n": "^1.1.0",
38
- "@dhis2/ui": "^8.4.11",
38
+ "@dhis2/ui": "^9.2.0",
39
39
  "@sambego/storybook-state": "^2.0.1",
40
40
  "@storybook/addons": "^6.5.16",
41
41
  "@storybook/preset-create-react-app": "^3.1.7",
@@ -52,7 +52,7 @@
52
52
  "peerDependencies": {
53
53
  "@dhis2/app-runtime": "^3",
54
54
  "@dhis2/d2-i18n": "^1.1",
55
- "@dhis2/ui": "^8.2.5",
55
+ "@dhis2/ui": "^9.2.0",
56
56
  "prop-types": "^15",
57
57
  "react": "^16.3",
58
58
  "react-dom": "^16.3",
@@ -75,6 +75,9 @@
75
75
  "react-beautiful-dnd": "^10.1.1",
76
76
  "resize-observer-polyfill": "^1.5.1"
77
77
  },
78
+ "resolutions": {
79
+ "@dhis2/ui": "^9.2.0"
80
+ },
78
81
  "files": [
79
82
  "build"
80
83
  ]