@dhis2/analytics 28.0.4 → 28.0.5

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 (81) hide show
  1. package/build/cjs/__demo__/OpenFileDialog.stories.js +19 -1
  2. package/build/cjs/components/DimensionsPanel/List/DimensionList.js +3 -1
  3. package/build/cjs/components/DimensionsPanel/List/__tests__/DimensionItem.spec.js +48 -41
  4. package/build/cjs/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +110 -114
  5. package/build/cjs/components/DimensionsPanel/__tests__/DimensionsPanel.spec.js +36 -33
  6. package/build/cjs/components/FileMenu/__tests__/DeleteDialog.spec.js +24 -27
  7. package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +51 -31
  8. package/build/cjs/components/FileMenu/__tests__/GetLinkDialog.spec.js +28 -31
  9. package/build/cjs/components/FileMenu/__tests__/RenameDialog.spec.js +17 -11
  10. package/build/cjs/components/FileMenu/__tests__/SaveAsDialog.spec.js +44 -37
  11. package/build/cjs/components/Filter/__tests__/Filter.spec.js +29 -34
  12. package/build/cjs/components/OpenFileDialog/CreatedByFilter.js +9 -1
  13. package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +14 -34
  14. package/build/cjs/components/OpenFileDialog/VisTypeFilter.js +39 -1
  15. package/build/cjs/components/OpenFileDialog/__tests__/OpenFileDialog.spec.js +51 -0
  16. package/build/cjs/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +78 -44
  17. package/build/cjs/components/PeriodDimension/FixedPeriodFilter.js +1 -0
  18. package/build/cjs/components/PeriodDimension/RelativePeriodFilter.js +3 -2
  19. package/build/cjs/components/PeriodDimension/__tests__/FixedPeriodSingleSelect.spec.js +14 -21
  20. package/build/cjs/components/PeriodDimension/__tests__/PeriodDimension.spec.js +27 -23
  21. package/build/cjs/components/RichText/Editor/__tests__/Editor.spec.js +6 -7
  22. package/build/cjs/components/RichText/Parser/__tests__/MdParser.spec.js +1 -1
  23. package/build/cjs/components/RichText/Parser/__tests__/Parser.spec.js +22 -23
  24. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +52 -42
  25. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -8
  26. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +23 -18
  27. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +23 -17
  28. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/__snapshots__/HoverMenuList.spec.js.snap +63 -0
  29. package/build/cjs/components/Toolbar/InterpretationsAndDetailsToggler.js +3 -1
  30. package/build/cjs/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +19 -18
  31. package/build/cjs/components/Toolbar/__tests__/Toolbar.spec.js +8 -8
  32. package/build/cjs/components/Toolbar/__tests__/ToolbarSidebar.spec.js +14 -11
  33. package/build/cjs/components/Toolbar/__tests__/UpdateButton.spec.js +16 -14
  34. package/build/cjs/components/TranslationDialog/TranslationModal/TranslationModal.js +2 -1
  35. package/build/cjs/components/TranslationDialog/TranslationModal/__tests__/TranslationModal.spec.js +25 -16
  36. package/build/es/__demo__/OpenFileDialog.stories.js +17 -0
  37. package/build/es/components/DimensionsPanel/List/DimensionList.js +3 -1
  38. package/build/es/components/DimensionsPanel/List/__tests__/DimensionItem.spec.js +47 -40
  39. package/build/es/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +110 -114
  40. package/build/es/components/DimensionsPanel/__tests__/DimensionsPanel.spec.js +35 -32
  41. package/build/es/components/FileMenu/__tests__/DeleteDialog.spec.js +23 -26
  42. package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +52 -32
  43. package/build/es/components/FileMenu/__tests__/GetLinkDialog.spec.js +27 -30
  44. package/build/es/components/FileMenu/__tests__/RenameDialog.spec.js +18 -12
  45. package/build/es/components/FileMenu/__tests__/SaveAsDialog.spec.js +43 -36
  46. package/build/es/components/Filter/__tests__/Filter.spec.js +28 -33
  47. package/build/es/components/OpenFileDialog/CreatedByFilter.js +7 -0
  48. package/build/es/components/OpenFileDialog/OpenFileDialog.js +14 -35
  49. package/build/es/components/OpenFileDialog/VisTypeFilter.js +38 -1
  50. package/build/es/components/OpenFileDialog/__tests__/OpenFileDialog.spec.js +49 -0
  51. package/build/es/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +77 -43
  52. package/build/es/components/PeriodDimension/FixedPeriodFilter.js +1 -0
  53. package/build/es/components/PeriodDimension/RelativePeriodFilter.js +3 -2
  54. package/build/es/components/PeriodDimension/__tests__/FixedPeriodSingleSelect.spec.js +13 -20
  55. package/build/es/components/PeriodDimension/__tests__/PeriodDimension.spec.js +26 -22
  56. package/build/es/components/RichText/Editor/__tests__/Editor.spec.js +7 -8
  57. package/build/es/components/RichText/Parser/__tests__/MdParser.spec.js +1 -1
  58. package/build/es/components/RichText/Parser/__tests__/Parser.spec.js +21 -22
  59. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +53 -43
  60. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +7 -7
  61. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +23 -18
  62. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +21 -15
  63. package/build/es/components/Toolbar/HoverMenuBar/__tests__/__snapshots__/HoverMenuList.spec.js.snap +63 -0
  64. package/build/es/components/Toolbar/InterpretationsAndDetailsToggler.js +3 -1
  65. package/build/es/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +18 -17
  66. package/build/es/components/Toolbar/__tests__/Toolbar.spec.js +7 -7
  67. package/build/es/components/Toolbar/__tests__/ToolbarSidebar.spec.js +13 -10
  68. package/build/es/components/Toolbar/__tests__/UpdateButton.spec.js +15 -13
  69. package/build/es/components/TranslationDialog/TranslationModal/TranslationModal.js +2 -1
  70. package/build/es/components/TranslationDialog/TranslationModal/__tests__/TranslationModal.spec.js +24 -15
  71. package/package.json +2 -4
  72. package/build/cjs/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap +0 -89
  73. package/build/cjs/components/PeriodDimension/__tests__/PeriodSelector.spec.js +0 -29
  74. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/FixedPeriodSingleSelect.spec.js.snap +0 -92
  75. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +0 -16
  76. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +0 -89
  77. package/build/es/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap +0 -89
  78. package/build/es/components/PeriodDimension/__tests__/PeriodSelector.spec.js +0 -26
  79. package/build/es/components/PeriodDimension/__tests__/__snapshots__/FixedPeriodSingleSelect.spec.js.snap +0 -92
  80. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +0 -16
  81. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +0 -89
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.OpenFileDialog = void 0;
6
+ exports.formatFilters = exports.default = exports.OpenFileDialog = void 0;
7
7
  var _style = _interopRequireDefault(require("styled-jsx/style"));
8
8
  var _appRuntime = require("@dhis2/app-runtime");
9
9
  var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
@@ -11,7 +11,6 @@ var _ui = require("@dhis2/ui");
11
11
  var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
12
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
- var _visTypes = require("../../modules/visTypes.js");
15
14
  var _CreatedByFilter = require("./CreatedByFilter.js");
16
15
  var _FileList = require("./FileList.js");
17
16
  var _NameFilter = require("./NameFilter.js");
@@ -44,6 +43,16 @@ const getQuery = type => ({
44
43
  }
45
44
  }
46
45
  });
46
+ const formatFilters = (currentUser, filters, filterVisTypes) => {
47
+ const queryFilters = [];
48
+ filters.searchTerm && queryFilters.push(`identifiable:token:${filters.searchTerm}`);
49
+ const userFilter = (0, _CreatedByFilter.formatUserFilter)(filters.createdBy, currentUser.id);
50
+ userFilter && queryFilters.push(userFilter);
51
+ const typeFilter = (0, _VisTypeFilter.formatTypeFilter)(filterVisTypes, filters.visType);
52
+ typeFilter && queryFilters.push(typeFilter);
53
+ return queryFilters;
54
+ };
55
+ exports.formatFilters = formatFilters;
47
56
  const OpenFileDialog = ({
48
57
  type,
49
58
  open,
@@ -76,36 +85,7 @@ const OpenFileDialog = ({
76
85
  });
77
86
  const [nameFilterValue, setNameFilterValue] = (0, _react.useState)(defaultFilters.searchTerm);
78
87
  const [searchTimeout, setSearchTimeout] = (0, _react.useState)(null);
79
- const formatFilters = (0, _react.useCallback)(() => {
80
- const queryFilters = [];
81
- switch (filters.createdBy) {
82
- case _CreatedByFilter.CREATED_BY_ALL_BUT_CURRENT_USER:
83
- queryFilters.push(`user.id:!eq:${currentUser.id}`);
84
- break;
85
- case _CreatedByFilter.CREATED_BY_CURRENT_USER:
86
- queryFilters.push(`user.id:eq:${currentUser.id}`);
87
- break;
88
- case _CreatedByFilter.CREATED_BY_ALL:
89
- default:
90
- break;
91
- }
92
- if (filters.visType) {
93
- switch (filters.visType) {
94
- case _visTypes.VIS_TYPE_GROUP_ALL:
95
- break;
96
- case _visTypes.VIS_TYPE_GROUP_CHARTS:
97
- queryFilters.push('type:!eq:PIVOT_TABLE');
98
- break;
99
- default:
100
- queryFilters.push(`type:eq:${filters.visType}`);
101
- break;
102
- }
103
- }
104
- if (filters.searchTerm) {
105
- queryFilters.push(`identifiable:token:${filters.searchTerm}`);
106
- }
107
- return queryFilters;
108
- }, [currentUser, filters]);
88
+ const formatFiltersCb = (0, _react.useCallback)(() => formatFilters(currentUser, filters, filterVisTypes), [currentUser, filters, filterVisTypes]);
109
89
  const formatSortDirection = (0, _react.useCallback)(() => {
110
90
  if (sortField === 'displayName' && sortDirection !== 'default') {
111
91
  return `i${sortDirection}`;
@@ -150,10 +130,10 @@ const OpenFileDialog = ({
150
130
  page,
151
131
  sortField,
152
132
  sortDirection: formatSortDirection(),
153
- filters: formatFilters()
133
+ filters: formatFiltersCb()
154
134
  });
155
135
  }
156
- }, [open, page, sortField, filters, refetch, formatFilters, formatSortDirection]);
136
+ }, [open, page, sortField, filters, refetch, formatFiltersCb, formatSortDirection]);
157
137
  const headers = [{
158
138
  field: 'displayName',
159
139
  label: _d2I18n.default.t('Name'),
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.VisTypeFilter = void 0;
6
+ exports.formatTypeFilter = exports.default = exports.VisTypeFilter = void 0;
7
7
  var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
8
8
  var _ui = require("@dhis2/ui");
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -12,6 +12,44 @@ var _visTypes = require("../../modules/visTypes.js");
12
12
  var _VisTypeIcon = require("../VisTypeIcon.js");
13
13
  var _CustomSelectOption = require("./CustomSelectOption.js");
14
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const formatTypeFilter = (filterVisTypes, visType) => {
16
+ const defaultFilterTypes = [];
17
+ let defaultTypeFilter;
18
+ if (Array.isArray(filterVisTypes)) {
19
+ defaultFilterTypes.push(...filterVisTypes.filter(({
20
+ type,
21
+ disabled
22
+ }) => !(disabled || [_visTypes.VIS_TYPE_GROUP_ALL, _visTypes.VIS_TYPE_GROUP_CHARTS].includes(type))).map(({
23
+ type
24
+ }) => type));
25
+ if (defaultFilterTypes.length) {
26
+ defaultTypeFilter = `type:in:[${defaultFilterTypes.join(',')}]`;
27
+ }
28
+ }
29
+ switch (visType) {
30
+ case _visTypes.VIS_TYPE_GROUP_ALL:
31
+ {
32
+ return defaultTypeFilter;
33
+ }
34
+ case _visTypes.VIS_TYPE_GROUP_CHARTS:
35
+ {
36
+ if (defaultFilterTypes.length) {
37
+ return `type:in:[${defaultFilterTypes.filter(item => item !== _visTypes.VIS_TYPE_PIVOT_TABLE).join(',')}]`;
38
+ } else {
39
+ return `type:!eq:${_visTypes.VIS_TYPE_PIVOT_TABLE}`;
40
+ }
41
+ }
42
+ default:
43
+ {
44
+ if (visType) {
45
+ return `type:eq:${visType}`;
46
+ } else if (defaultTypeFilter) {
47
+ return defaultTypeFilter;
48
+ }
49
+ }
50
+ }
51
+ };
52
+ exports.formatTypeFilter = formatTypeFilter;
15
53
  const VisTypeFilter = ({
16
54
  visTypes,
17
55
  selected,
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _visTypes = require("../../../modules/visTypes.js");
4
+ var _CreatedByFilter = require("../CreatedByFilter.js");
5
+ var _OpenFileDialog = require("../OpenFileDialog.js");
6
+ describe('OpenFileDialog - formatFilters', () => {
7
+ const currentUser = {
8
+ id: 'test-user'
9
+ };
10
+ const createdByTestCases = [[_CreatedByFilter.CREATED_BY_ALL, []], [_CreatedByFilter.CREATED_BY_CURRENT_USER, [`user.id:eq:${currentUser.id}`]], [_CreatedByFilter.CREATED_BY_ALL_BUT_CURRENT_USER, [`user.id:!eq:${currentUser.id}`]]];
11
+ test.each(createdByTestCases)('formats the createdBy filter given %p', (createdBy, expected) => expect((0, _OpenFileDialog.formatFilters)(currentUser, {
12
+ createdBy
13
+ })).toEqual(expected));
14
+ test('formats the searchTerm filter', () => {
15
+ const testSearchTerm = 'test search term';
16
+ expect((0, _OpenFileDialog.formatFilters)(currentUser, {
17
+ searchTerm: testSearchTerm
18
+ })).toEqual([`identifiable:token:${testSearchTerm}`]);
19
+ });
20
+ const typeTestCases = [
21
+ // no type filter when no visType nor filterVisTypes
22
+ [undefined, undefined, []],
23
+ // no type filter because VIS_TYPE_GROUP_ALL is selected
24
+ [undefined, _visTypes.VIS_TYPE_GROUP_ALL, []],
25
+ // only VIS_TYPE_PIVOT_TABLE ignored because no filterVisTypes is passed and VIS_TYPE_GROUP_CHARTS is selected
26
+ [undefined, _visTypes.VIS_TYPE_GROUP_CHARTS, [`type:!eq:${_visTypes.VIS_TYPE_PIVOT_TABLE}`]],
27
+ // no filterVisTypes and VIS_TYPE_PIVOT_TABLE selected
28
+ [undefined, _visTypes.VIS_TYPE_PIVOT_TABLE, [`type:eq:${_visTypes.VIS_TYPE_PIVOT_TABLE}`]],
29
+ // group types are ignored
30
+ [[_visTypes.VIS_TYPE_PIVOT_TABLE, _visTypes.VIS_TYPE_GROUP_ALL, _visTypes.VIS_TYPE_GROUP_CHARTS], _visTypes.VIS_TYPE_GROUP_ALL, [`type:in:[${_visTypes.VIS_TYPE_PIVOT_TABLE}]`]],
31
+ // VIS_TYPE_PIVOT_TABLE is ignored because VIS_TYPE_GROUP_CHARTS is selected
32
+ [[_visTypes.VIS_TYPE_PIVOT_TABLE, _visTypes.VIS_TYPE_COLUMN, _visTypes.VIS_TYPE_GROUP_CHARTS], _visTypes.VIS_TYPE_GROUP_CHARTS, [`type:in:[${_visTypes.VIS_TYPE_COLUMN}]`]],
33
+ // when filterVisTypes is passed the default type filter only include those
34
+ [[_visTypes.VIS_TYPE_PIVOT_TABLE], '', [`type:in:[${_visTypes.VIS_TYPE_PIVOT_TABLE}]`]], [[_visTypes.VIS_TYPE_LINE_LIST, _visTypes.VIS_TYPE_PIVOT_TABLE], '', [`type:in:[${_visTypes.VIS_TYPE_LINE_LIST},${_visTypes.VIS_TYPE_PIVOT_TABLE}]`]]];
35
+ test.each(typeTestCases)('formats the type filter given %p and %p', (types, visType, expected) => expect((0, _OpenFileDialog.formatFilters)(currentUser, {
36
+ visType
37
+ }, types === null || types === void 0 ? void 0 : types.map(type => ({
38
+ type
39
+ })))).toEqual(expected));
40
+ test('combined filters', () => {
41
+ expect((0, _OpenFileDialog.formatFilters)(currentUser, {
42
+ createdBy: _CreatedByFilter.CREATED_BY_CURRENT_USER,
43
+ searchTerm: 'test',
44
+ visType: _visTypes.VIS_TYPE_GROUP_ALL
45
+ }, [{
46
+ type: _visTypes.VIS_TYPE_LINE_LIST
47
+ }, {
48
+ type: _visTypes.VIS_TYPE_PIVOT_TABLE
49
+ }])).toEqual([`identifiable:token:test`, `user.id:eq:${currentUser.id}`, `type:in:[${_visTypes.VIS_TYPE_LINE_LIST},${_visTypes.VIS_TYPE_PIVOT_TABLE}]`]);
50
+ });
51
+ });
@@ -1,58 +1,92 @@
1
1
  "use strict";
2
2
 
3
- var _enzyme = require("enzyme");
4
- var _react = _interopRequireDefault(require("react"));
3
+ var _appRuntime = require("@dhis2/app-runtime");
4
+ var _react = require("@testing-library/react");
5
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
6
+ var _react2 = _interopRequireDefault(require("react"));
5
7
  var _OrgUnitDimension = _interopRequireDefault(require("../OrgUnitDimension.js"));
6
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
- describe('The OrgUnitDimension component', () => {
8
- let props;
9
- let shallowOrgUnitDimension;
10
- const getWrapper = () => {
11
- if (!shallowOrgUnitDimension) {
12
- shallowOrgUnitDimension = (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_OrgUnitDimension.default, props));
13
- }
14
- return shallowOrgUnitDimension;
9
+ jest.mock('@dhis2-ui/organisation-unit-tree', () => {
10
+ const lib = jest.requireActual('@dhis2-ui/organisation-unit-tree');
11
+ return {
12
+ ...lib,
13
+ OrganisationUnitTree: () => /*#__PURE__*/_react2.default.createElement("div", null, "Org unit tree component mock")
15
14
  };
16
- beforeEach(() => {
17
- props = {
18
- roots: [],
19
- selected: [],
20
- onSelect: jest.fn(),
21
- hideGroupSelect: false,
22
- hideLevelSelect: false,
23
- hideUserOrgUnits: false,
24
- warning: ''
25
- };
26
- shallowOrgUnitDimension = undefined;
27
- });
28
- it('matches the snapshot', () => {
29
- const wrapper = getWrapper();
30
- expect(wrapper).toMatchSnapshot();
15
+ });
16
+ describe('OrgUnitDimension', () => {
17
+ const onSelect = jest.fn();
18
+ const props = {
19
+ roots: [],
20
+ selected: [],
21
+ onSelect: onSelect,
22
+ hideGroupSelect: false,
23
+ hideLevelSelect: false,
24
+ hideUserOrgUnits: false,
25
+ warning: ''
26
+ };
27
+ const renderOrgUnitDimension = props => (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_appRuntime.CustomDataProvider, {
28
+ data: {
29
+ organisationUnitLevels: {
30
+ organisationUnitLevels: []
31
+ },
32
+ organisationUnitGroups: {
33
+ organisationUnitGroups: []
34
+ }
35
+ }
36
+ }, /*#__PURE__*/_react2.default.createElement(_OrgUnitDimension.default, props)));
37
+ beforeEach(() => onSelect.mockClear());
38
+ test('OrgUnitDimension is rendered correctly', async () => {
39
+ renderOrgUnitDimension(props);
40
+
41
+ // wait for the component to be loaded, here done by testing that the OrganisationUnitTree component is loaded
42
+ // avoid the act warning due to the snapshot being taken before async code is run
43
+ await _react.screen.findByText('Org unit tree component mock');
44
+
45
+ // the top user org unit checkboxes are rendered
46
+ expect(_react.screen.getByLabelText('User organisation unit')).toBeInTheDocument();
47
+ expect(_react.screen.getByLabelText('User sub-units')).toBeInTheDocument();
48
+ expect(_react.screen.getByLabelText('User sub-x2-units')).toBeInTheDocument();
49
+
50
+ // the OrganisationUnitTree component is rendered
51
+ expect(_react.screen.getByText('Org unit tree component mock')).toBeInTheDocument();
52
+
53
+ // the level selector is rendered
54
+ expect(_react.screen.getByText('Select a level')).toBeInTheDocument();
55
+
56
+ // the group selector is rendered
57
+ expect(_react.screen.getByText('Select a group')).toBeInTheDocument();
58
+
59
+ // the Deselect all button is rendered
60
+ expect(_react.screen.getByRole('button', {
61
+ name: 'Deselect all'
62
+ })).toBeInTheDocument();
31
63
  });
32
- it('calls onSelect when an organisation unit is selected', () => {
33
- const wrapper = getWrapper();
34
- const orgUnitTree = wrapper.find('OrganisationUnitTree');
35
- const testOrgUnit = {
36
- id: 'testId',
37
- path: '/testPath',
38
- displayName: 'Test Org Unit',
39
- checked: true
40
- };
41
- orgUnitTree.props().onChange(testOrgUnit);
42
- expect(props.onSelect).toHaveBeenCalledWith({
64
+ test('OrgUnitDimension calls onSelect when an organisation unit is selected', async () => {
65
+ const user = _userEvent.default.setup();
66
+ renderOrgUnitDimension(props);
67
+ await user.click(_react.screen.getByText('User organisation unit'));
68
+ expect(onSelect).toHaveBeenCalledWith({
43
69
  dimensionId: 'ou',
44
70
  items: [{
45
- id: 'testId',
46
- path: '/testPath',
47
- name: 'Test Org Unit'
71
+ id: 'USER_ORGUNIT',
72
+ displayName: 'User organisation unit'
48
73
  }]
49
74
  });
50
75
  });
51
- it('calls onSelect with an empty array when selection is cleared', () => {
52
- const wrapper = getWrapper();
53
- const deselectButton = wrapper.find('Button[onClick]');
54
- deselectButton.simulate('click');
55
- expect(props.onSelect).toHaveBeenCalledWith({
76
+ test('OrgUnitDimension calls onSelect with an empty array when selection is cleared', async () => {
77
+ const user = _userEvent.default.setup();
78
+ renderOrgUnitDimension({
79
+ ...props,
80
+ // make some selection to enable the deselect all button
81
+ selected: [{
82
+ id: 'USER_ORGUNIT_CHILDREN',
83
+ name: 'User sub-units'
84
+ }]
85
+ });
86
+ await user.click(_react.screen.getByRole('button', {
87
+ name: 'Deselect all'
88
+ }));
89
+ expect(onSelect).toHaveBeenLastCalledWith({
56
90
  dimensionId: 'ou',
57
91
  items: []
58
92
  });
@@ -25,6 +25,7 @@ const FixedPeriodFilter = ({
25
25
  }) => {
26
26
  const onlyAllowedTypeIsSelected = Array.isArray(allowedPeriodTypes) && allowedPeriodTypes.length === 1 && allowedPeriodTypes[0] === currentPeriodType;
27
27
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
28
+ "data-test": dataTest,
28
29
  className: `jsx-${_PeriodFilterStyle.default.__hash}` + " " + "leftSection"
29
30
  }, /*#__PURE__*/_react.default.createElement(_ui.SingleSelectField, {
30
31
  label: _index.default.t('Period type'),
@@ -19,6 +19,7 @@ const RelativePeriodFilter = ({
19
19
  dataTest,
20
20
  excludedPeriodTypes
21
21
  }) => /*#__PURE__*/_react.default.createElement("div", {
22
+ "data-test": dataTest,
22
23
  className: `jsx-${_PeriodFilterStyle.default.__hash}` + " " + "leftSection"
23
24
  }, /*#__PURE__*/_react.default.createElement(_ui.SingleSelectField, {
24
25
  label: _index.default.t('Period type'),
@@ -28,12 +29,12 @@ const RelativePeriodFilter = ({
28
29
  dense: true,
29
30
  selected: currentFilter,
30
31
  className: "filterElement",
31
- dataTest: dataTest
32
+ dataTest: `${dataTest}-period-type`
32
33
  }, (0, _index2.filterPeriodTypesById)((0, _relativePeriods.getRelativePeriodsOptions)(), excludedPeriodTypes).map(option => /*#__PURE__*/_react.default.createElement(_ui.SingleSelectOption, {
33
34
  key: option.id,
34
35
  value: option.id,
35
36
  label: option.name,
36
- dataTest: `${dataTest}-option-${option.id}`
37
+ dataTest: `${dataTest}-period-type-option-${option.id}`
37
38
  }))), /*#__PURE__*/_react.default.createElement(_style.default, {
38
39
  id: _PeriodFilterStyle.default.__hash
39
40
  }, _PeriodFilterStyle.default));
@@ -1,27 +1,20 @@
1
1
  "use strict";
2
2
 
3
- var _enzyme = require("enzyme");
4
- var _react = _interopRequireDefault(require("react"));
3
+ var _react = require("@testing-library/react");
4
+ var _react2 = _interopRequireDefault(require("react"));
5
5
  var _FixedPeriodSelect = _interopRequireDefault(require("../FixedPeriodSelect.js"));
6
6
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
- describe('The Fixed Period Single Select component', () => {
8
- let props;
9
- let shallowFixedPeriodSelect;
10
- const getWrapper = () => {
11
- if (!shallowFixedPeriodSelect) {
12
- shallowFixedPeriodSelect = (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_FixedPeriodSelect.default, props));
13
- }
14
- return shallowFixedPeriodSelect;
7
+ test('FixedPeriodSelect renders correctly', () => {
8
+ const props = {
9
+ value: '201405',
10
+ onChange: () => {}
15
11
  };
16
- beforeEach(() => {
17
- props = {
18
- value: '201405',
19
- onChange: () => {}
20
- };
21
- shallowFixedPeriodSelect = undefined;
22
- });
23
- it('matches the snapshot', () => {
24
- const wrapper = getWrapper();
25
- expect(wrapper).toMatchSnapshot();
26
- });
12
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_FixedPeriodSelect.default, props));
13
+ expect(_react.screen.getByTestId('dhis2-analytics-fixedperiodselect')).toBeInTheDocument();
14
+ expect(_react.screen.getByText('Period type')).toBeInTheDocument();
15
+ expect(_react.screen.getByText('Monthly')).toBeInTheDocument();
16
+ expect(_react.screen.getByText('Year')).toBeInTheDocument();
17
+ const yearSelectEl = _react.screen.getByPlaceholderText('Select year');
18
+ expect(yearSelectEl).toBeInTheDocument();
19
+ expect(yearSelectEl.value).toEqual('2014');
27
20
  });
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
 
3
- var _enzyme = require("enzyme");
4
- var _react = _interopRequireDefault(require("react"));
3
+ var _react = require("@testing-library/react");
4
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
5
+ var _react2 = _interopRequireDefault(require("react"));
5
6
  var _PeriodDimension = _interopRequireDefault(require("../PeriodDimension.js"));
6
7
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
8
  jest.mock('@dhis2/app-runtime', () => ({
@@ -16,26 +17,29 @@ jest.mock('@dhis2/app-runtime', () => ({
16
17
  }
17
18
  })
18
19
  }));
20
+ global.ResizeObserver = jest.fn().mockImplementation(() => ({
21
+ observe: jest.fn(),
22
+ unobserve: jest.fn(),
23
+ disconnect: jest.fn()
24
+ }));
19
25
  afterEach(jest.clearAllMocks);
20
- describe('The Period Dimension component', () => {
21
- let props;
22
- let shallowPeriodDimension;
23
- const getWrapper = () => {
24
- if (!shallowPeriodDimension) {
25
- shallowPeriodDimension = (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_PeriodDimension.default, props));
26
- }
27
- return shallowPeriodDimension;
28
- };
29
- beforeEach(() => {
30
- props = {
31
- selectedPeriods: [],
32
- onSelect: jest.fn(),
33
- rightFooter: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null)
34
- };
35
- shallowPeriodDimension = undefined;
36
- });
37
- it('matches the snapshot', () => {
38
- const wrapper = getWrapper();
39
- expect(wrapper).toMatchSnapshot();
40
- });
26
+ const props = {
27
+ selectedPeriods: [],
28
+ onSelect: jest.fn(),
29
+ rightFooter: /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null)
30
+ };
31
+ test('PeriodDimension renders the tabs for relative/fixed with relative pre-selected', () => {
32
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_PeriodDimension.default, props));
33
+ expect(_react.screen.getByText('Relative periods')).toBeInTheDocument();
34
+ expect(_react.screen.getByTestId('period-dimension-relative-period-filter')).toBeInTheDocument();
35
+ expect(_react.screen.getByText('Fixed periods')).toBeInTheDocument();
36
+ });
37
+ test('PeriodDimension can toggle between relative and fixed period tab', async () => {
38
+ const user = _userEvent.default.setup();
39
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_PeriodDimension.default, props));
40
+ expect(_react.screen.getByText('Relative periods')).toBeInTheDocument();
41
+ const fixedPeriodButton = _react.screen.getByText('Fixed periods');
42
+ expect(fixedPeriodButton).toBeInTheDocument();
43
+ await user.click(fixedPeriodButton);
44
+ expect(_react.screen.getByTestId('period-dimension-fixed-period-filter')).toBeInTheDocument();
41
45
  });
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- require("@testing-library/jest-dom");
4
3
  var _react = require("@testing-library/react");
4
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
5
5
  var _react2 = _interopRequireDefault(require("react"));
6
6
  var _Editor = require("../Editor.js");
7
7
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -23,16 +23,15 @@ describe('RichText: Editor component', () => {
23
23
  const renderComponent = props => {
24
24
  return (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_Editor.Editor, props));
25
25
  };
26
- it('renders a result', () => {
26
+ test('renders a result', () => {
27
27
  renderComponent(componentProps);
28
28
  expect(_react.screen.getByTestId('@dhis2-analytics-richtexteditor')).toBeVisible();
29
29
  });
30
- it('calls convertCtrlKey on keydown', () => {
30
+ test('calls convertCtrlKey on keydown', async () => {
31
+ const user = _userEvent.default.setup();
31
32
  renderComponent(componentProps);
32
- _react.fireEvent.keyDown(_react.screen.getByRole('textbox'), {
33
- key: 'A',
34
- code: 'keyA'
35
- });
33
+ await user.click(_react.screen.getByRole('textbox'));
34
+ await user.keyboard('A');
36
35
  expect(mockConvertCtrlKey).toHaveBeenCalled();
37
36
  });
38
37
  });
@@ -3,7 +3,7 @@
3
3
  var _MdParser = require("../MdParser.js");
4
4
  const Parser = new _MdParser.MdParser();
5
5
  describe('MdParser class', () => {
6
- it('converts text into HTML', () => {
6
+ test('converts text into HTML', () => {
7
7
  const inlineTests = [['_italic_', '<em>italic</em>'], ['*bold*', '<strong>bold</strong>'], ['_ 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>'],
8
8
  // italic marker followed by : should work
9
9
  ['_italic_:', '<em>italic</em>:'], ['_italic_: some text, *bold*: some other text', '<em>italic</em>: some text, <strong>bold</strong>: some other text'],
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- var _enzyme = require("enzyme");
4
- var _react = _interopRequireDefault(require("react"));
3
+ var _react = require("@testing-library/react");
4
+ var _react2 = _interopRequireDefault(require("react"));
5
5
  var _Parser = require("../Parser.js");
6
6
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
7
  jest.mock('../MdParser.js', () => ({
@@ -12,30 +12,29 @@ jest.mock('../MdParser.js', () => ({
12
12
  })
13
13
  }));
14
14
  describe('RichText: Parser component', () => {
15
- let richTextParser;
16
- const defaultProps = {
17
- style: {
15
+ test('should have rendered a result with the style prop', () => {
16
+ const style = {
18
17
  color: 'blue',
19
18
  whiteSpace: 'pre-line'
20
- }
21
- };
22
- const renderComponent = (props, text) => {
23
- return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_Parser.Parser, props, text));
24
- };
25
- it('should have rendered a result', () => {
26
- richTextParser = renderComponent({}, 'test');
27
- expect(richTextParser).toHaveLength(1);
28
- });
29
- it('should have rendered a result with the style prop', () => {
30
- richTextParser = renderComponent(defaultProps, 'test prop');
31
- expect(richTextParser.props().style).toEqual(defaultProps.style);
19
+ };
20
+ const {
21
+ container
22
+ } = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_Parser.Parser, {
23
+ style: style
24
+ }, 'test prop'));
25
+ const divEl = container.querySelector('div');
26
+ expect(divEl.style.color).toBe(style.color);
27
+ expect(divEl.style.whiteSpace).toBe(style.whiteSpace);
32
28
  });
33
- it('should have rendered content', () => {
34
- richTextParser = renderComponent({}, 'plain text');
35
- expect(richTextParser.html()).toEqual('<div>converted text</div>');
29
+ test('should have rendered content', () => {
30
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_Parser.Parser, null, 'plain text'));
31
+ expect(_react.screen.getByText('converted text')).toBeInTheDocument();
36
32
  });
37
- it('should return null if no children is passed', () => {
38
- richTextParser = renderComponent({}, undefined);
39
- expect(richTextParser.html()).toBe(null);
33
+ test('should return null if no children is passed', () => {
34
+ const {
35
+ container
36
+ } = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_Parser.Parser, null));
37
+ const divEl = container.querySelector('div');
38
+ expect(divEl).toBe(null);
40
39
  });
41
40
  });