@dhis2/analytics 23.11.1 → 23.12.0

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 (74) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/build/cjs/components/Interpretations/InterpretationModal/Comment.js +64 -0
  3. package/build/cjs/components/Interpretations/InterpretationModal/CommentAddForm.js +93 -0
  4. package/build/cjs/components/Interpretations/InterpretationModal/CommentDeleteButton.js +62 -0
  5. package/build/cjs/components/Interpretations/InterpretationModal/CommentUpdateForm.js +95 -0
  6. package/build/cjs/components/Interpretations/InterpretationModal/InterpretationModal.js +187 -0
  7. package/build/cjs/components/Interpretations/InterpretationModal/InterpretationThread.js +100 -0
  8. package/build/cjs/components/Interpretations/InterpretationModal/index.js +13 -0
  9. package/build/cjs/components/Interpretations/InterpretationModal/useModalContentWidth.js +39 -0
  10. package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationForm.js +94 -0
  11. package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationList.js +94 -0
  12. package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationsUnit.js +135 -0
  13. package/build/cjs/components/Interpretations/InterpretationsUnit/index.js +13 -0
  14. package/build/cjs/components/Interpretations/common/Interpretation/Interpretation.js +110 -0
  15. package/build/cjs/components/Interpretations/common/Interpretation/InterpretationDeleteButton.js +58 -0
  16. package/build/cjs/components/Interpretations/common/Interpretation/InterpretationSharingLink.js +50 -0
  17. package/build/cjs/components/Interpretations/common/Interpretation/InterpretationUpdateForm.js +108 -0
  18. package/build/cjs/components/Interpretations/common/Interpretation/index.js +21 -0
  19. package/build/cjs/components/Interpretations/common/Interpretation/useLike.js +53 -0
  20. package/build/cjs/components/Interpretations/common/Message/Message.js +55 -0
  21. package/build/cjs/components/Interpretations/common/Message/MessageButtonStrip.js +33 -0
  22. package/build/cjs/components/Interpretations/common/Message/MessageEditorContainer.js +42 -0
  23. package/build/cjs/components/Interpretations/common/Message/MessageIconButton.js +67 -0
  24. package/build/cjs/components/Interpretations/common/Message/MessageInput.js +31 -0
  25. package/build/cjs/components/Interpretations/common/Message/MessageStatsBar.js +33 -0
  26. package/build/cjs/components/Interpretations/common/Message/index.js +53 -0
  27. package/build/cjs/components/Interpretations/common/RichTextEditor/RichTextEditor.js +262 -0
  28. package/build/cjs/components/Interpretations/common/RichTextEditor/index.js +13 -0
  29. package/build/cjs/components/Interpretations/common/RichTextEditor/markdownHandler.js +148 -0
  30. package/build/cjs/components/Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js +21 -0
  31. package/build/cjs/components/Interpretations/common/UserMention/UserList.js +48 -0
  32. package/build/cjs/components/Interpretations/common/UserMention/UserMentionWrapper.js +226 -0
  33. package/build/cjs/components/Interpretations/common/UserMention/styles/UserMentionWrapper.style.js +30 -0
  34. package/build/cjs/components/Interpretations/common/UserMention/useUserSearchResults.js +78 -0
  35. package/build/cjs/components/Interpretations/common/index.js +44 -0
  36. package/build/cjs/index.js +16 -0
  37. package/build/cjs/locales/en/translations.json +32 -1
  38. package/build/es/components/Interpretations/InterpretationModal/Comment.js +45 -0
  39. package/build/es/components/Interpretations/InterpretationModal/CommentAddForm.js +70 -0
  40. package/build/es/components/Interpretations/InterpretationModal/CommentDeleteButton.js +47 -0
  41. package/build/es/components/Interpretations/InterpretationModal/CommentUpdateForm.js +73 -0
  42. package/build/es/components/Interpretations/InterpretationModal/InterpretationModal.js +165 -0
  43. package/build/es/components/Interpretations/InterpretationModal/InterpretationThread.js +79 -0
  44. package/build/es/components/Interpretations/InterpretationModal/index.js +1 -0
  45. package/build/es/components/Interpretations/InterpretationModal/useModalContentWidth.js +28 -0
  46. package/build/es/components/Interpretations/InterpretationsUnit/InterpretationForm.js +71 -0
  47. package/build/es/components/Interpretations/InterpretationsUnit/InterpretationList.js +78 -0
  48. package/build/es/components/Interpretations/InterpretationsUnit/InterpretationsUnit.js +112 -0
  49. package/build/es/components/Interpretations/InterpretationsUnit/index.js +1 -0
  50. package/build/es/components/Interpretations/common/Interpretation/Interpretation.js +87 -0
  51. package/build/es/components/Interpretations/common/Interpretation/InterpretationDeleteButton.js +43 -0
  52. package/build/es/components/Interpretations/common/Interpretation/InterpretationSharingLink.js +33 -0
  53. package/build/es/components/Interpretations/common/Interpretation/InterpretationUpdateForm.js +85 -0
  54. package/build/es/components/Interpretations/common/Interpretation/index.js +2 -0
  55. package/build/es/components/Interpretations/common/Interpretation/useLike.js +45 -0
  56. package/build/es/components/Interpretations/common/Message/Message.js +41 -0
  57. package/build/es/components/Interpretations/common/Message/MessageButtonStrip.js +21 -0
  58. package/build/es/components/Interpretations/common/Message/MessageEditorContainer.js +30 -0
  59. package/build/es/components/Interpretations/common/Message/MessageIconButton.js +54 -0
  60. package/build/es/components/Interpretations/common/Message/MessageInput.js +16 -0
  61. package/build/es/components/Interpretations/common/Message/MessageStatsBar.js +21 -0
  62. package/build/es/components/Interpretations/common/Message/index.js +6 -0
  63. package/build/es/components/Interpretations/common/RichTextEditor/RichTextEditor.js +240 -0
  64. package/build/es/components/Interpretations/common/RichTextEditor/index.js +1 -0
  65. package/build/es/components/Interpretations/common/RichTextEditor/markdownHandler.js +128 -0
  66. package/build/es/components/Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js +9 -0
  67. package/build/es/components/Interpretations/common/UserMention/UserList.js +33 -0
  68. package/build/es/components/Interpretations/common/UserMention/UserMentionWrapper.js +202 -0
  69. package/build/es/components/Interpretations/common/UserMention/styles/UserMentionWrapper.style.js +17 -0
  70. package/build/es/components/Interpretations/common/UserMention/useUserSearchResults.js +63 -0
  71. package/build/es/components/Interpretations/common/index.js +3 -0
  72. package/build/es/index.js +2 -0
  73. package/build/es/locales/en/translations.json +32 -1
  74. package/package.json +2 -1
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "RichTextEditor", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _RichTextEditor.RichTextEditor;
10
+ }
11
+ });
12
+
13
+ var _RichTextEditor = require("./RichTextEditor.js");
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.insertMarkdown = exports.emojis = exports.convertCtrlKey = exports.MENTION = exports.LINK = exports.ITALIC = exports.EMOJI_THUMBS_UP = exports.EMOJI_THUMBS_DOWN = exports.EMOJI_SMILEY_FACE = exports.EMOJI_SAD_FACE = exports.BOLD = void 0;
7
+ const BOLD = 'bold';
8
+ exports.BOLD = BOLD;
9
+ const ITALIC = 'italic';
10
+ exports.ITALIC = ITALIC;
11
+ const LINK = 'link';
12
+ exports.LINK = LINK;
13
+ const MENTION = 'mention';
14
+ exports.MENTION = MENTION;
15
+ const EMOJI_SMILEY_FACE = 'smileyFace';
16
+ exports.EMOJI_SMILEY_FACE = EMOJI_SMILEY_FACE;
17
+ const EMOJI_SAD_FACE = 'sadFace';
18
+ exports.EMOJI_SAD_FACE = EMOJI_SAD_FACE;
19
+ const EMOJI_THUMBS_UP = 'thumbsUp';
20
+ exports.EMOJI_THUMBS_UP = EMOJI_THUMBS_UP;
21
+ const EMOJI_THUMBS_DOWN = 'thumsDown';
22
+ exports.EMOJI_THUMBS_DOWN = EMOJI_THUMBS_DOWN;
23
+ const emojis = {
24
+ [EMOJI_SMILEY_FACE]: ':-)',
25
+ [EMOJI_SAD_FACE]: ':-(',
26
+ [EMOJI_THUMBS_UP]: ':+1',
27
+ [EMOJI_THUMBS_DOWN]: ':-1'
28
+ };
29
+ exports.emojis = emojis;
30
+ const markdownMap = {
31
+ [ITALIC]: {
32
+ prefix: '_',
33
+ postfix: '_'
34
+ },
35
+ [BOLD]: {
36
+ prefix: '*',
37
+ postfix: '*'
38
+ },
39
+ [LINK]: {
40
+ prefix: '[',
41
+ postfix: '](https://link-url)'
42
+ },
43
+ [MENTION]: {
44
+ prefix: '@'
45
+ },
46
+ [EMOJI_SMILEY_FACE]: {
47
+ prefix: emojis[EMOJI_SMILEY_FACE]
48
+ },
49
+ [EMOJI_SAD_FACE]: {
50
+ prefix: emojis[EMOJI_SAD_FACE]
51
+ },
52
+ [EMOJI_THUMBS_UP]: {
53
+ prefix: emojis[EMOJI_THUMBS_UP]
54
+ },
55
+ [EMOJI_THUMBS_DOWN]: {
56
+ prefix: emojis[EMOJI_THUMBS_DOWN]
57
+ }
58
+ };
59
+
60
+ const trim = str => {
61
+ const leftSpaces = /^\s+/;
62
+ const rightSpaces = /\s+$/;
63
+ return str.replace(leftSpaces, '').replace(rightSpaces, '');
64
+ };
65
+
66
+ const insertMarkdown = (markdown, target, cb) => {
67
+ const {
68
+ selectionStart: start,
69
+ selectionEnd: end,
70
+ value
71
+ } = target;
72
+ const marker = markdownMap[markdown] || null;
73
+
74
+ if (!marker || !cb || start < 0) {
75
+ return;
76
+ }
77
+
78
+ let newValue;
79
+ let caretPos = end + 1;
80
+
81
+ const padMarkers = text => {
82
+ // is caret between two markers (i.e., "**" or "__")? Then do not add padding
83
+ if (start === end && value.length && start > 0) {
84
+ if (value[start - 1] === markdownMap[BOLD].prefix && value[start] === markdownMap[BOLD].prefix || value[start - 1] === markdownMap[ITALIC].prefix && value[start] === markdownMap[ITALIC].prefix) {
85
+ return text;
86
+ }
87
+ }
88
+
89
+ if (value.length && start > 0 && value[start - 1] !== ' ') {
90
+ text = " ".concat(text);
91
+ ++caretPos;
92
+ }
93
+
94
+ if (value.length && end !== value.length && value[end] !== ' ') {
95
+ text = "".concat(text, " ");
96
+ }
97
+
98
+ return text;
99
+ };
100
+
101
+ if (start === end) {
102
+ //no text
103
+ const valueArr = value.split('');
104
+ let markdown = marker.prefix;
105
+
106
+ if (marker.postfix) {
107
+ markdown += marker.postfix;
108
+ }
109
+
110
+ valueArr.splice(start, 0, padMarkers(markdown));
111
+ newValue = valueArr.join('');
112
+ } else {
113
+ const text = value.slice(start, end);
114
+ const trimmedText = trim(text); // TODO really needed?
115
+ // adjust caretPos based on trimmed text selection
116
+
117
+ caretPos = caretPos - (text.length - trimmedText.length) + 1;
118
+ let markdown = "".concat(marker.prefix).concat(trimmedText);
119
+
120
+ if (marker.postfix) {
121
+ markdown += marker.postfix;
122
+ }
123
+
124
+ newValue = [value.slice(0, start), padMarkers(markdown), value.slice(end)].join('');
125
+ }
126
+
127
+ cb(newValue, caretPos);
128
+ };
129
+
130
+ exports.insertMarkdown = insertMarkdown;
131
+
132
+ const convertCtrlKey = (event, cb) => {
133
+ const {
134
+ key,
135
+ ctrlKey,
136
+ metaKey
137
+ } = event;
138
+
139
+ if (key === 'b' && (ctrlKey || metaKey)) {
140
+ event.preventDefault();
141
+ insertMarkdown(BOLD, event.target, cb);
142
+ } else if (key === 'i' && (ctrlKey || metaKey)) {
143
+ event.preventDefault();
144
+ insertMarkdown(ITALIC, event.target, cb);
145
+ }
146
+ };
147
+
148
+ exports.convertCtrlKey = convertCtrlKey;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.tooltipAnchorClasses = exports.toolbarClasses = exports.mainClasses = exports.emojisPopoverClasses = void 0;
7
+
8
+ var _ui = require("@dhis2/ui");
9
+
10
+ const mainClasses = [".container.jsx-2278350860{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;}", ".preview.jsx-2278350860{font-size:14px;line-height:19px;color:".concat(_ui.colors.grey900, ";}"), ".textarea.jsx-2278350860{width:100%;box-sizing:border-box;padding:".concat(_ui.spacers.dp8, " ").concat(_ui.spacers.dp12, ";color:").concat(_ui.colors.grey900, ";background-color:").concat(_ui.colors.white, ";border:1px solid ").concat(_ui.colors.grey500, ";border-radius:3px;box-shadow:inset 0 0 0 1px rgba(102,113,123,0.15), inset 0 1px 2px 0 rgba(102,113,123,0.1);outline:0;font-size:14px;line-height:").concat(_ui.spacers.dp16, ";-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;}"), ".textarea.jsx-2278350860:focus{outline:none;box-shadow:0 0 0 3px ".concat(_ui.theme.focus, ";}"), ".textarea.jsx-2278350860:disabled{background-color:".concat(_ui.colors.grey100, ";border-color:").concat(_ui.colors.grey500, ";color:").concat(_ui.theme.disabled, ";cursor:not-allowed;}")];
11
+ exports.mainClasses = mainClasses;
12
+ mainClasses.__hash = "2278350860";
13
+ const toolbarClasses = [".toolbar.jsx-1189800463{background:".concat(_ui.colors.grey050, ";border-radius:3px;border:1px solid ").concat(_ui.colors.grey300, ";margin-bottom:").concat(_ui.spacers.dp4, ";}"), ".actionsWrapper.jsx-1189800463{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:".concat(_ui.spacers.dp4, ";-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:").concat(_ui.spacers.dp4, ";}"), ".mainActions.jsx-1189800463{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:".concat(_ui.spacers.dp4, ";margin-top:").concat(_ui.spacers.dp2, ";}"), ".sideActions.jsx-1189800463{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto;}", ".previewWrapper.jsx-1189800463{margin:".concat(_ui.spacers.dp4, ";text-align:right;}")];
14
+ exports.toolbarClasses = toolbarClasses;
15
+ toolbarClasses.__hash = "1189800463";
16
+ const tooltipAnchorClasses = [".tooltip.jsx-2182400256{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}"];
17
+ exports.tooltipAnchorClasses = tooltipAnchorClasses;
18
+ tooltipAnchorClasses.__hash = "2182400256";
19
+ const emojisPopoverClasses = [".emojisList.jsx-2802175370{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:".concat(_ui.spacers.dp8, ";list-style-type:none;margin:0 ").concat(_ui.spacers.dp4, " 0 ").concat(_ui.spacers.dp8, ";padding:0;}"), ".emojisList.jsx-2802175370 li.jsx-2802175370{cursor:pointer;}"];
20
+ exports.emojisPopoverClasses = emojisPopoverClasses;
21
+ emojisPopoverClasses.__hash = "2802175370";
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UserList = void 0;
7
+
8
+ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
9
+
10
+ var _ui = require("@dhis2/ui");
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ const UserList = _ref => {
19
+ let {
20
+ users,
21
+ selectedUserIndex,
22
+ onUserClick,
23
+ pager
24
+ } = _ref;
25
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, users.map(u => {
26
+ var _users$selectedUserIn;
27
+
28
+ return /*#__PURE__*/_react.default.createElement(_ui.MenuItem, {
29
+ dense: true,
30
+ key: u.id,
31
+ onClick: onUserClick(u),
32
+ label: "".concat(u.displayName, " (").concat(u.username, ")"),
33
+ active: ((_users$selectedUserIn = users[selectedUserIndex]) === null || _users$selectedUserIn === void 0 ? void 0 : _users$selectedUserIn.id) === u.id
34
+ });
35
+ }), pager.total > pager.pageSize && /*#__PURE__*/_react.default.createElement(_ui.MenuItem, {
36
+ dense: true,
37
+ disabled: true,
38
+ label: _d2I18n.default.t('Too many results. Try refining the search.')
39
+ }));
40
+ };
41
+
42
+ exports.UserList = UserList;
43
+ UserList.propTypes = {
44
+ pager: _propTypes.default.object.isRequired,
45
+ selectedUserIndex: _propTypes.default.number.isRequired,
46
+ users: _propTypes.default.array.isRequired,
47
+ onUserClick: _propTypes.default.func.isRequired
48
+ };
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.UserMentionWrapper = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
11
+
12
+ var _ui = require("@dhis2/ui");
13
+
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _UserMentionWrapperStyle = require("./styles/UserMentionWrapper.style.js");
19
+
20
+ var _UserList = require("./UserList.js");
21
+
22
+ var _useUserSearchResults = require("./useUserSearchResults.js");
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ const AT_SYMBOL_WIDTH = 14;
31
+
32
+ const getVirtualPopperReference = ref => {
33
+ const rects = ref.current.getClientRects();
34
+ const lastRect = rects[rects.length - 1];
35
+ const left = lastRect.left + lastRect.width - AT_SYMBOL_WIDTH;
36
+ return {
37
+ getBoundingClientRect: () => ({
38
+ top: lastRect.top,
39
+ right: lastRect.right,
40
+ bottom: lastRect.bottom,
41
+ left,
42
+ width: AT_SYMBOL_WIDTH,
43
+ height: lastRect.height,
44
+ x: left
45
+ })
46
+ };
47
+ };
48
+
49
+ const UserMentionWrapper = _ref => {
50
+ let {
51
+ children,
52
+ inputReference,
53
+ onUserSelect
54
+ } = _ref;
55
+ const [captureText, setCaptureText] = (0, _react.useState)(false);
56
+ const [capturedText, setCapturedText] = (0, _react.useState)('');
57
+ const [cloneText, setCloneText] = (0, _react.useState)('');
58
+ const cloneRef = (0, _react.useRef)(null);
59
+ const [captureStartPosition, setCaptureStartPosition] = (0, _react.useState)(null);
60
+ const [selectedUserIndex, setSelectedUserIndex] = (0, _react.useState)(0);
61
+ const {
62
+ users,
63
+ pager,
64
+ fetching,
65
+ clear
66
+ } = (0, _useUserSearchResults.useUserSearchResults)({
67
+ searchText: capturedText
68
+ });
69
+
70
+ const reset = () => {
71
+ setCaptureText(false);
72
+ setCapturedText('');
73
+ setCloneText('');
74
+ setCaptureStartPosition(null);
75
+ setSelectedUserIndex(0);
76
+ clear();
77
+ }; // event bubbles up from the input/textarea
78
+
79
+
80
+ const onInput = _ref2 => {
81
+ let {
82
+ target
83
+ } = _ref2;
84
+ const {
85
+ selectionEnd,
86
+ value
87
+ } = target;
88
+
89
+ if (captureText) {
90
+ clear();
91
+ const spacePosition = value.indexOf(' ', captureStartPosition - 1);
92
+ const filterValue = value.substring(captureStartPosition, spacePosition > 0 ? spacePosition : selectionEnd + 1);
93
+
94
+ if (filterValue !== capturedText) {
95
+ setCapturedText(filterValue);
96
+ } else if (filterValue.length === 0) {
97
+ setCapturedText('');
98
+ clear();
99
+ }
100
+ }
101
+ }; // event bubbles up from the wrapped input/textarea
102
+
103
+
104
+ const onKeyDown = _ref3 => {
105
+ let {
106
+ key,
107
+ target
108
+ } = _ref3;
109
+ const {
110
+ selectionStart
111
+ } = target;
112
+
113
+ if (!captureText && key === '@') {
114
+ setCaptureText(true);
115
+ setCaptureStartPosition(selectionStart + 1);
116
+ setCloneText(target.value.substring(0, selectionStart) + '@');
117
+ } else if (captureText) {
118
+ if (key === ' ' || key === 'Backspace' && selectionStart <= captureStartPosition) {
119
+ reset();
120
+ } else if (users.length) {
121
+ switch (key) {
122
+ case 'Enter':
123
+ event.preventDefault();
124
+
125
+ if (selectedUserIndex >= 0) {
126
+ onSelect(users[selectedUserIndex]);
127
+ }
128
+
129
+ break;
130
+
131
+ case 'ArrowDown':
132
+ event.preventDefault();
133
+
134
+ if (selectedUserIndex < users.length - 1) {
135
+ setSelectedUserIndex(selectedUserIndex + 1);
136
+ }
137
+
138
+ break;
139
+
140
+ case 'ArrowUp':
141
+ event.preventDefault();
142
+
143
+ if (selectedUserIndex > 0) {
144
+ setSelectedUserIndex(selectedUserIndex - 1);
145
+ }
146
+
147
+ break;
148
+
149
+ default: // other key strokes, typically the text typed
150
+ // the onInput event handler set on the input element is triggering the user lookup
151
+
152
+ }
153
+ }
154
+ }
155
+ };
156
+
157
+ const onSelect = user => {
158
+ const originalValue = inputReference.current.value;
159
+ const newValue = "".concat(originalValue.slice(0, captureStartPosition - 1)).concat(originalValue.slice(captureStartPosition - 1).replace(/^@\w*/, "@".concat(user.username, " ")));
160
+ reset(); // typically for connected components we want the state to be updated too
161
+ // but the logic belongs to the wrapped component, so we just invoke the supplied callback
162
+
163
+ if (onUserSelect) {
164
+ onUserSelect(newValue);
165
+ } // need to refocus on the input/textarea
166
+
167
+
168
+ inputReference.current.focus(); // position the cursor at the end
169
+
170
+ requestAnimationFrame(() => inputReference.current.setSelectionRange(-1, -1), 0);
171
+ };
172
+
173
+ const onClick = user => () => onSelect(user);
174
+
175
+ return /*#__PURE__*/_react.default.createElement("div", {
176
+ onKeyDown: onKeyDown,
177
+ onInput: onInput,
178
+ className: "jsx-".concat(_UserMentionWrapperStyle.userMentionWrapperClasses.__hash) + " " + "wrapper"
179
+ }, children, /*#__PURE__*/_react.default.createElement("div", {
180
+ className: "jsx-".concat(_UserMentionWrapperStyle.userMentionWrapperClasses.__hash) + " " + "clone"
181
+ }, /*#__PURE__*/_react.default.createElement("pre", {
182
+ ref: cloneRef,
183
+ className: "jsx-".concat(_UserMentionWrapperStyle.userMentionWrapperClasses.__hash)
184
+ }, cloneText)), captureText && /*#__PURE__*/_react.default.createElement(_ui.Portal, null, /*#__PURE__*/_react.default.createElement(_ui.Popper, {
185
+ reference: getVirtualPopperReference(cloneRef),
186
+ placement: "top-start"
187
+ }, /*#__PURE__*/_react.default.createElement(_ui.Card, null, /*#__PURE__*/_react.default.createElement("div", {
188
+ className: "jsx-".concat(_UserMentionWrapperStyle.userMentionWrapperClasses.__hash) + " " + "container"
189
+ }, /*#__PURE__*/_react.default.createElement(_ui.Menu, {
190
+ dense: true
191
+ }, /*#__PURE__*/_react.default.createElement(_ui.MenuSectionHeader, {
192
+ className: _UserMentionWrapperStyle.resolvedHeaderStyle.className,
193
+ dense: true,
194
+ hideDivider: true,
195
+ label: capturedText === '' ? _d2I18n.default.t('Search for a user') : _d2I18n.default.t('Searching for "{{searchText}}"', {
196
+ searchText: capturedText
197
+ })
198
+ }), fetching && /*#__PURE__*/_react.default.createElement(_ui.MenuItem, {
199
+ label: /*#__PURE__*/_react.default.createElement(_ui.CenteredContent, null, /*#__PURE__*/_react.default.createElement(_ui.CircularLoader, {
200
+ small: true
201
+ }))
202
+ }), !fetching && users.length > 0 && /*#__PURE__*/_react.default.createElement(_UserList.UserList, {
203
+ users: users,
204
+ selectedUserIndex: selectedUserIndex,
205
+ onUserClick: onClick,
206
+ pager: pager
207
+ }), capturedText && !fetching && users.length === 0 && /*#__PURE__*/_react.default.createElement(_ui.MenuItem, {
208
+ dense: true,
209
+ disabled: true,
210
+ label: _d2I18n.default.t('No results found')
211
+ })))))), /*#__PURE__*/_react.default.createElement(_style.default, {
212
+ id: _UserMentionWrapperStyle.userMentionWrapperClasses.__hash
213
+ }, _UserMentionWrapperStyle.userMentionWrapperClasses), _UserMentionWrapperStyle.resolvedHeaderStyle.styles);
214
+ };
215
+
216
+ exports.UserMentionWrapper = UserMentionWrapper;
217
+ UserMentionWrapper.defaultProps = {
218
+ onUserSelect: Function.prototype
219
+ };
220
+ UserMentionWrapper.propTypes = {
221
+ inputReference: _propTypes.default.object.isRequired,
222
+ onUserSelect: _propTypes.default.func.isRequired,
223
+ children: _propTypes.default.node
224
+ };
225
+ var _default = UserMentionWrapper;
226
+ exports.default = _default;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.userMentionWrapperClasses = exports.resolvedHeaderStyle = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _ui = require("@dhis2/ui");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ /*
17
+ * Note that the clone and clone > pre styles have been chosen
18
+ * to emulate the styles of the textarea. If we decide to make
19
+ * changes there, they should be refelcted here too.
20
+ */
21
+ const userMentionWrapperClasses = [".wrapper.jsx-1289989717{position:relative;}", ".clone.jsx-1289989717{position:absolute;visibility:hidden;inset:0;box-sizing:border-box;padding:".concat(_ui.spacers.dp8, " ").concat(_ui.spacers.dp12, ";border:1px solid ").concat(_ui.colors.grey500, ";font-size:14px;line-height:").concat(_ui.spacers.dp16, ";z-index:1;pointer-events:none;}"), ".clone.jsx-1289989717>pre.jsx-1289989717{display:inline;word-wrap:break-word;overflow-wrap:break-word;font:inherit;margin:0;}", ".container.jsx-1289989717{background-color:".concat(_ui.colors.white, ";max-height:180px;overflow:auto;}")];
22
+ exports.userMentionWrapperClasses = userMentionWrapperClasses;
23
+ userMentionWrapperClasses.__hash = "1289989717";
24
+ const resolvedHeaderStyle = {
25
+ styles: /*#__PURE__*/_react.default.createElement(_style.default, {
26
+ id: "4275958396"
27
+ }, [".jsx-4275958396{position:-webkit-sticky;position:sticky;top:0;}"]),
28
+ className: "jsx-4275958396"
29
+ };
30
+ exports.resolvedHeaderStyle = resolvedHeaderStyle;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useUserSearchResults = void 0;
7
+
8
+ var _appRuntime = require("@dhis2/app-runtime");
9
+
10
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
11
+
12
+ var _react = require("react");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ const usersQuery = {
17
+ users: {
18
+ resource: 'users/gist',
19
+ params: _ref => {
20
+ let {
21
+ searchText
22
+ } = _ref;
23
+ return {
24
+ fields: 'id,displayName,username',
25
+ order: 'firstName,surname',
26
+ total: true,
27
+ filter: "username:ilike:".concat(searchText, ",firstName:ilike:").concat(searchText, ",surname:ilike:").concat(searchText, ",email:ilike:").concat(searchText),
28
+ rootJunction: 'OR'
29
+ };
30
+ }
31
+ }
32
+ };
33
+
34
+ const useUserSearchResults = _ref2 => {
35
+ let {
36
+ searchText
37
+ } = _ref2;
38
+ const [{
39
+ users,
40
+ pager
41
+ }, setData] = (0, _react.useState)({
42
+ users: [],
43
+ pager: {}
44
+ });
45
+ const {
46
+ data,
47
+ fetching,
48
+ refetch
49
+ } = (0, _appRuntime.useDataQuery)(usersQuery, {
50
+ lazy: true
51
+ });
52
+ const debouncedRefetch = (0, _react.useCallback)((0, _debounce.default)(refetch, 250), [refetch]);
53
+ (0, _react.useEffect)(() => {
54
+ if (searchText.length) {
55
+ debouncedRefetch({
56
+ searchText
57
+ });
58
+ }
59
+
60
+ return () => debouncedRefetch.cancel();
61
+ }, [searchText]);
62
+ (0, _react.useEffect)(() => {
63
+ if (data) {
64
+ setData(data.users);
65
+ }
66
+ }, [data]);
67
+ return {
68
+ users,
69
+ pager,
70
+ fetching,
71
+ clear: () => setData({
72
+ users: [],
73
+ pager: {}
74
+ })
75
+ };
76
+ };
77
+
78
+ exports.useUserSearchResults = useUserSearchResults;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _index = require("./Interpretation/index.js");
8
+
9
+ Object.keys(_index).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _index[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _index[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _index2 = require("./Message/index.js");
21
+
22
+ Object.keys(_index2).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _index2[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _index2[key];
29
+ }
30
+ });
31
+ });
32
+
33
+ var _index3 = require("./RichTextEditor/index.js");
34
+
35
+ Object.keys(_index3).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _index3[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _index3[key];
42
+ }
43
+ });
44
+ });
@@ -453,6 +453,18 @@ Object.defineProperty(exports, "ITEM_PROP_ID", {
453
453
  return _item.ITEM_PROP_ID;
454
454
  }
455
455
  });
456
+ Object.defineProperty(exports, "InterpretationModal", {
457
+ enumerable: true,
458
+ get: function () {
459
+ return _InterpretationModal.InterpretationModal;
460
+ }
461
+ });
462
+ Object.defineProperty(exports, "InterpretationsUnit", {
463
+ enumerable: true,
464
+ get: function () {
465
+ return _InterpretationsUnit.InterpretationsUnit;
466
+ }
467
+ });
456
468
  Object.defineProperty(exports, "LAYOUT", {
457
469
  enumerable: true,
458
470
  get: function () {
@@ -1450,6 +1462,10 @@ var _LegendKey = _interopRequireDefault(require("./components/LegendKey/LegendKe
1450
1462
 
1451
1463
  var _AboutAOUnit = _interopRequireDefault(require("./components/AboutAOUnit/AboutAOUnit.js"));
1452
1464
 
1465
+ var _InterpretationsUnit = require("./components/Interpretations/InterpretationsUnit/InterpretationsUnit.js");
1466
+
1467
+ var _InterpretationModal = require("./components/Interpretations/InterpretationModal/InterpretationModal.js");
1468
+
1453
1469
  var _CachedDataQueryProvider = require("./components/CachedDataQueryProvider.js");
1454
1470
 
1455
1471
  var _Analytics = _interopRequireDefault(require("./api/analytics/Analytics.js"));