@dhis2/analytics 26.6.14 → 26.7.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 (52) hide show
  1. package/build/cjs/components/AboutAOUnit/AboutAOUnit.js +5 -3
  2. package/build/cjs/components/Interpretations/InterpretationModal/CommentAddForm.js +5 -4
  3. package/build/cjs/components/Interpretations/InterpretationModal/CommentUpdateForm.js +4 -3
  4. package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationForm.js +5 -4
  5. package/build/cjs/components/Interpretations/common/Interpretation/InterpretationUpdateForm.js +5 -4
  6. package/build/cjs/components/Interpretations/common/Message/Message.js +2 -2
  7. package/build/cjs/components/Interpretations/common/Message/MessageEditorContainer.js +5 -5
  8. package/build/cjs/components/Interpretations/common/index.js +0 -11
  9. package/build/cjs/components/{Interpretations/common/RichTextEditor/RichTextEditor.js → RichText/Editor/Editor.js} +76 -53
  10. package/build/cjs/components/RichText/Editor/__tests__/Editor.spec.js +38 -0
  11. package/build/cjs/components/RichText/Editor/__tests__/convertCtrlKey.spec.js +204 -0
  12. package/build/cjs/components/{Interpretations/common/RichTextEditor → RichText/Editor}/markdownHandler.js +12 -6
  13. package/build/cjs/components/{Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js → RichText/Editor/styles/Editor.style.js} +2 -2
  14. package/build/cjs/components/RichText/Parser/MdParser.js +106 -0
  15. package/build/cjs/components/RichText/Parser/Parser.js +35 -0
  16. package/build/cjs/components/RichText/Parser/__tests__/MdParser.spec.js +42 -0
  17. package/build/cjs/components/RichText/Parser/__tests__/Parser.spec.js +41 -0
  18. package/build/cjs/components/RichText/index.js +26 -0
  19. package/build/cjs/components/{Interpretations/common/UserMention → UserMention}/UserMentionWrapper.js +19 -9
  20. package/build/cjs/components/{Interpretations/common/UserMention → UserMention}/styles/UserMentionWrapper.style.js +2 -2
  21. package/build/cjs/components/{Interpretations/common/UserMention → UserMention}/useUserSearchResults.js +2 -2
  22. package/build/cjs/index.js +58 -46
  23. package/build/cjs/locales/en/translations.json +11 -11
  24. package/build/es/components/AboutAOUnit/AboutAOUnit.js +5 -3
  25. package/build/es/components/Interpretations/InterpretationModal/CommentAddForm.js +2 -1
  26. package/build/es/components/Interpretations/InterpretationModal/CommentUpdateForm.js +2 -1
  27. package/build/es/components/Interpretations/InterpretationsUnit/InterpretationForm.js +3 -2
  28. package/build/es/components/Interpretations/common/Interpretation/InterpretationUpdateForm.js +2 -1
  29. package/build/es/components/Interpretations/common/Message/Message.js +1 -1
  30. package/build/es/components/Interpretations/common/Message/MessageEditorContainer.js +5 -5
  31. package/build/es/components/Interpretations/common/index.js +0 -1
  32. package/build/es/components/{Interpretations/common/RichTextEditor/RichTextEditor.js → RichText/Editor/Editor.js} +51 -28
  33. package/build/es/components/RichText/Editor/__tests__/Editor.spec.js +35 -0
  34. package/build/es/components/RichText/Editor/__tests__/convertCtrlKey.spec.js +202 -0
  35. package/build/es/components/{Interpretations/common/RichTextEditor → RichText/Editor}/markdownHandler.js +12 -6
  36. package/build/es/components/{Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js → RichText/Editor/styles/Editor.style.js} +2 -2
  37. package/build/es/components/RichText/Parser/MdParser.js +98 -0
  38. package/build/es/components/RichText/Parser/Parser.js +25 -0
  39. package/build/es/components/RichText/Parser/__tests__/MdParser.spec.js +40 -0
  40. package/build/es/components/RichText/Parser/__tests__/Parser.spec.js +38 -0
  41. package/build/es/components/RichText/index.js +3 -0
  42. package/build/es/components/{Interpretations/common/UserMention → UserMention}/UserMentionWrapper.js +19 -8
  43. package/build/es/components/UserMention/styles/UserMentionWrapper.style.js +16 -0
  44. package/build/es/components/{Interpretations/common/UserMention → UserMention}/useUserSearchResults.js +2 -2
  45. package/build/es/index.js +1 -0
  46. package/build/es/locales/en/translations.json +11 -11
  47. package/package.json +2 -2
  48. package/build/cjs/components/Interpretations/common/RichTextEditor/index.js +0 -12
  49. package/build/es/components/Interpretations/common/RichTextEditor/index.js +0 -1
  50. package/build/es/components/Interpretations/common/UserMention/styles/UserMentionWrapper.style.js +0 -16
  51. /package/build/cjs/components/{Interpretations/common/UserMention → UserMention}/UserList.js +0 -0
  52. /package/build/es/components/{Interpretations/common/UserMention → UserMention}/UserList.js +0 -0
@@ -7,13 +7,13 @@ exports.default = 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"));
10
- var _d2UiRichText = require("@dhis2/d2-ui-rich-text");
11
10
  var _ui = require("@dhis2/ui");
12
11
  var _classnames = _interopRequireDefault(require("classnames"));
13
12
  var _moment = _interopRequireDefault(require("moment"));
14
13
  var _propTypes = _interopRequireDefault(require("prop-types"));
15
14
  var _react = _interopRequireWildcard(require("react"));
16
15
  var _list = require("../../modules/list.js");
16
+ var _index = require("../RichText/index.js");
17
17
  var _AboutAOUnitStyle = _interopRequireDefault(require("./styles/AboutAOUnit.style.js"));
18
18
  var _utils = require("./utils.js");
19
19
  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); }
@@ -154,12 +154,14 @@ const AboutAOUnit = /*#__PURE__*/(0, _react.forwardRef)((_ref3, ref) => {
154
154
  small: true
155
155
  })), data && /*#__PURE__*/_react.default.createElement("div", {
156
156
  className: `jsx-${_AboutAOUnitStyle.default.__hash}` + " " + "content"
157
- }, /*#__PURE__*/_react.default.createElement("p", {
157
+ }, /*#__PURE__*/_react.default.createElement("div", {
158
158
  className: `jsx-${_AboutAOUnitStyle.default.__hash}` + " " + ((0, _classnames.default)('detailLine', {
159
159
  description: true,
160
160
  noDescription: !data.ao.displayDescription
161
161
  }) || "")
162
- }, data.ao.displayDescription ? /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, data.ao.displayDescription) : _d2I18n.default.t('No description')), /*#__PURE__*/_react.default.createElement("div", {
162
+ }, data.ao.displayDescription ? /*#__PURE__*/_react.default.createElement(_index.RichTextParser, null, data.ao.displayDescription) : /*#__PURE__*/_react.default.createElement("p", {
163
+ className: `jsx-${_AboutAOUnitStyle.default.__hash}`
164
+ }, _d2I18n.default.t('No description'))), /*#__PURE__*/_react.default.createElement("div", {
163
165
  className: `jsx-${_AboutAOUnitStyle.default.__hash}`
164
166
  }, /*#__PURE__*/_react.default.createElement("p", {
165
167
  className: `jsx-${_AboutAOUnitStyle.default.__hash}` + " " + "detailLine"
@@ -9,7 +9,8 @@ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
9
9
  var _ui = require("@dhis2/ui");
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _react = _interopRequireWildcard(require("react"));
12
- var _index = require("../common/index.js");
12
+ var _index = require("../../RichText/index.js");
13
+ var _index2 = require("../common/index.js");
13
14
  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); }
14
15
  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; }
15
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -42,7 +43,7 @@ const CommentAddForm = _ref => {
42
43
  }
43
44
  });
44
45
  const inputPlaceholder = _d2I18n.default.t('Write a reply');
45
- return /*#__PURE__*/_react.default.createElement(_index.MessageEditorContainer, {
46
+ return /*#__PURE__*/_react.default.createElement(_index2.MessageEditorContainer, {
46
47
  currentUser: currentUser
47
48
  }, showRichTextEditor ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_index.RichTextEditor, {
48
49
  inputPlaceholder: inputPlaceholder,
@@ -50,7 +51,7 @@ const CommentAddForm = _ref => {
50
51
  value: commentText,
51
52
  ref: focusRef,
52
53
  disabled: loading
53
- }), /*#__PURE__*/_react.default.createElement(_index.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
54
+ }), /*#__PURE__*/_react.default.createElement(_index2.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
54
55
  primary: true,
55
56
  small: true,
56
57
  onClick: () => save({
@@ -65,7 +66,7 @@ const CommentAddForm = _ref => {
65
66
  setCommentText('');
66
67
  setShowRichTextEditor(false);
67
68
  }
68
- }, _d2I18n.default.t('Cancel')))) : /*#__PURE__*/_react.default.createElement(_index.MessageInput, {
69
+ }, _d2I18n.default.t('Cancel')))) : /*#__PURE__*/_react.default.createElement(_index2.MessageInput, {
69
70
  onFocus: () => setShowRichTextEditor(true),
70
71
  placeholder: inputPlaceholder,
71
72
  ref: focusRef
@@ -10,7 +10,8 @@ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
10
10
  var _ui = require("@dhis2/ui");
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
- var _index = require("../common/index.js");
13
+ var _index = require("../../RichText/index.js");
14
+ var _index2 = require("../common/index.js");
14
15
  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); }
15
16
  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; }
16
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -47,7 +48,7 @@ const CommentUpdateForm = _ref => {
47
48
  const errorText = error ? _d2I18n.default.t('Could not update comment') : '';
48
49
  return /*#__PURE__*/_react.default.createElement("div", {
49
50
  className: _style.default.dynamic([["2690082310", [_ui.spacers.dp8, _ui.spacers.dp8, _ui.colors.grey100]]]) + " " + "message"
50
- }, /*#__PURE__*/_react.default.createElement(_index.MessageEditorContainer, {
51
+ }, /*#__PURE__*/_react.default.createElement(_index2.MessageEditorContainer, {
51
52
  currentUser: currentUser
52
53
  }, /*#__PURE__*/_react.default.createElement(_index.RichTextEditor, {
53
54
  inputPlaceholder: _d2I18n.default.t('Enter comment text'),
@@ -55,7 +56,7 @@ const CommentUpdateForm = _ref => {
55
56
  value: commentText,
56
57
  disabled: loading,
57
58
  errorText: errorText
58
- }), /*#__PURE__*/_react.default.createElement(_index.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
59
+ }), /*#__PURE__*/_react.default.createElement(_index2.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
59
60
  loading: loading,
60
61
  primary: true,
61
62
  small: true,
@@ -9,7 +9,8 @@ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
9
9
  var _ui = require("@dhis2/ui");
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _react = _interopRequireWildcard(require("react"));
12
- var _index = require("../common/index.js");
12
+ var _index = require("../../RichText/index.js");
13
+ var _index2 = require("../common/index.js");
13
14
  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); }
14
15
  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; }
15
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -44,16 +45,16 @@ const InterpretationForm = _ref => {
44
45
  }
45
46
  });
46
47
  const inputPlaceholder = _d2I18n.default.t('Write an interpretation');
47
- return /*#__PURE__*/_react.default.createElement(_index.MessageEditorContainer, {
48
+ return /*#__PURE__*/_react.default.createElement(_index2.MessageEditorContainer, {
48
49
  currentUser: currentUser,
49
50
  dataTest: "interpretation-form"
50
- }, showRichTextEditor ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_index.RichTextEditor, {
51
+ }, showRichTextEditor ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_index.RichTextEditor, {
51
52
  disabled: saveMutationInProgress,
52
53
  inputPlaceholder: inputPlaceholder,
53
54
  onChange: setInterpretationText,
54
55
  value: interpretationText,
55
56
  helpText: showNoTimeDimensionHelpText ? _d2I18n.default.t('Other people viewing this interpretation in the future may see more data.') : undefined
56
- }), /*#__PURE__*/_react.default.createElement(_index.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
57
+ }), /*#__PURE__*/_react.default.createElement(_index2.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
57
58
  primary: true,
58
59
  small: true,
59
60
  loading: saveMutationInProgress,
@@ -10,7 +10,8 @@ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
10
10
  var _ui = require("@dhis2/ui");
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
- var _index = require("../index.js");
13
+ var _index = require("../../../RichText/index.js");
14
+ var _index2 = require("../index.js");
14
15
  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); }
15
16
  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; }
16
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -56,7 +57,7 @@ const InterpretationUpdateForm = _ref3 => {
56
57
  const errorText = error ? error.message || _d2I18n.default.t('Could not update interpretation') : '';
57
58
  return /*#__PURE__*/_react.default.createElement("div", {
58
59
  className: _style.default.dynamic([["2690082310", [_ui.spacers.dp8, _ui.spacers.dp8, _ui.colors.grey100]]]) + " " + "message"
59
- }, /*#__PURE__*/_react.default.createElement(_index.MessageEditorContainer, {
60
+ }, /*#__PURE__*/_react.default.createElement(_index2.MessageEditorContainer, {
60
61
  currentUser: currentUser
61
62
  }, /*#__PURE__*/_react.default.createElement(_index.RichTextEditor, {
62
63
  inputPlaceholder: _d2I18n.default.t('Enter interpretation text'),
@@ -64,10 +65,10 @@ const InterpretationUpdateForm = _ref3 => {
64
65
  value: interpretationText,
65
66
  disabled: loading,
66
67
  errorText: errorText
67
- }), showSharingLink && /*#__PURE__*/_react.default.createElement(_index.InterpretationSharingLink, {
68
+ }), showSharingLink && /*#__PURE__*/_react.default.createElement(_index2.InterpretationSharingLink, {
68
69
  id: id,
69
70
  type: "interpretation"
70
- }), /*#__PURE__*/_react.default.createElement(_index.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
71
+ }), /*#__PURE__*/_react.default.createElement(_index2.MessageButtonStrip, null, /*#__PURE__*/_react.default.createElement(_ui.Button, {
71
72
  loading: loading,
72
73
  primary: true,
73
74
  small: true,
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.Message = void 0;
7
7
  var _style = _interopRequireDefault(require("styled-jsx/style"));
8
8
  var _appRuntime = require("@dhis2/app-runtime");
9
- var _d2UiRichText = require("@dhis2/d2-ui-rich-text");
10
9
  var _ui = require("@dhis2/ui");
11
10
  var _moment = _interopRequireDefault(require("moment"));
12
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
12
  var _react = _interopRequireDefault(require("react"));
13
+ var _index = require("../../../RichText/index.js");
14
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
15
  const Message = _ref => {
16
16
  let {
@@ -34,7 +34,7 @@ const Message = _ref => {
34
34
  className: _style.default.dynamic([["4031345705", [_ui.spacers.dp8, _ui.colors.grey100, _ui.spacers.dp8, _ui.colors.grey900, _ui.colors.grey600, _ui.colors.grey900, _ui.spacers.dp8]]])
35
35
  }, (0, _moment.default)(fromServerDate(created)).format('lll'))), /*#__PURE__*/_react.default.createElement("div", {
36
36
  className: _style.default.dynamic([["4031345705", [_ui.spacers.dp8, _ui.colors.grey100, _ui.spacers.dp8, _ui.colors.grey900, _ui.colors.grey600, _ui.colors.grey900, _ui.spacers.dp8]]]) + " " + "content"
37
- }, /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, text)), /*#__PURE__*/_react.default.createElement("div", {
37
+ }, /*#__PURE__*/_react.default.createElement(_index.RichTextParser, null, text)), /*#__PURE__*/_react.default.createElement("div", {
38
38
  className: _style.default.dynamic([["4031345705", [_ui.spacers.dp8, _ui.colors.grey100, _ui.spacers.dp8, _ui.colors.grey900, _ui.colors.grey600, _ui.colors.grey900, _ui.spacers.dp8]]]) + " " + "footer"
39
39
  }, children), /*#__PURE__*/_react.default.createElement(_style.default, {
40
40
  id: "4031345705",
@@ -17,18 +17,18 @@ const MessageEditorContainer = _ref => {
17
17
  } = _ref;
18
18
  return /*#__PURE__*/_react.default.createElement("div", {
19
19
  "data-test": dataTest,
20
- className: _style.default.dynamic([["3807884305", [_ui.spacers.dp8, _ui.spacers.dp12]]]) + " " + "container"
20
+ className: _style.default.dynamic([["969803715", [_ui.spacers.dp8, _ui.spacers.dp12]]]) + " " + "container"
21
21
  }, /*#__PURE__*/_react.default.createElement("div", {
22
- className: _style.default.dynamic([["3807884305", [_ui.spacers.dp8, _ui.spacers.dp12]]]) + " " + "avatar"
22
+ className: _style.default.dynamic([["969803715", [_ui.spacers.dp8, _ui.spacers.dp12]]]) + " " + "avatar"
23
23
  }, /*#__PURE__*/_react.default.createElement(_ui.UserAvatar, {
24
24
  name: currentUser.name,
25
25
  medium: true
26
26
  })), /*#__PURE__*/_react.default.createElement("div", {
27
- className: _style.default.dynamic([["3807884305", [_ui.spacers.dp8, _ui.spacers.dp12]]]) + " " + "editor"
27
+ className: _style.default.dynamic([["969803715", [_ui.spacers.dp8, _ui.spacers.dp12]]]) + " " + "editor"
28
28
  }, children), /*#__PURE__*/_react.default.createElement(_style.default, {
29
- id: "3807884305",
29
+ id: "969803715",
30
30
  dynamic: [_ui.spacers.dp8, _ui.spacers.dp12]
31
- }, [`.container.__jsx-style-dynamic-selector{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:${_ui.spacers.dp8};margin-top:${_ui.spacers.dp12};}`, ".avatar.__jsx-style-dynamic-selector{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;}", ".editor.__jsx-style-dynamic-selector{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}"]));
31
+ }, [`.container.__jsx-style-dynamic-selector{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:${_ui.spacers.dp8};margin-top:${_ui.spacers.dp12};}`, ".avatar.__jsx-style-dynamic-selector{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;}", ".editor.__jsx-style-dynamic-selector{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:100%;}"]));
32
32
  };
33
33
  exports.MessageEditorContainer = MessageEditorContainer;
34
34
  MessageEditorContainer.propTypes = {
@@ -25,17 +25,6 @@ Object.keys(_index2).forEach(function (key) {
25
25
  }
26
26
  });
27
27
  });
28
- var _index3 = require("./RichTextEditor/index.js");
29
- Object.keys(_index3).forEach(function (key) {
30
- if (key === "default" || key === "__esModule") return;
31
- if (key in exports && exports[key] === _index3[key]) return;
32
- Object.defineProperty(exports, key, {
33
- enumerable: true,
34
- get: function () {
35
- return _index3[key];
36
- }
37
- });
38
- });
39
28
  var _getInterpretationAccess = require("./getInterpretationAccess.js");
40
29
  Object.keys(_getInterpretationAccess).forEach(function (key) {
41
30
  if (key === "default" || key === "__esModule") return;
@@ -3,16 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RichTextEditor = void 0;
6
+ exports.Editor = void 0;
7
7
  var _style = _interopRequireDefault(require("styled-jsx/style"));
8
8
  var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
9
- var _d2UiRichText = require("@dhis2/d2-ui-rich-text");
10
9
  var _ui = require("@dhis2/ui");
10
+ var _classnames = _interopRequireDefault(require("classnames"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
- var _UserMentionWrapper = require("../UserMention/UserMentionWrapper.js");
13
+ var _UserMentionWrapper = require("../../UserMention/UserMentionWrapper.js");
14
+ var _Parser = require("../Parser/Parser.js");
14
15
  var _markdownHandler = require("./markdownHandler.js");
15
- var _RichTextEditorStyle = require("./styles/RichTextEditor.style.js");
16
+ var _EditorStyle = require("./styles/Editor.style.js");
16
17
  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); }
17
18
  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; }
18
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -26,22 +27,22 @@ const EmojisPopover = _ref => {
26
27
  reference: reference,
27
28
  onClickOutside: onClose
28
29
  }, /*#__PURE__*/_react.default.createElement("ul", {
29
- className: `jsx-${_RichTextEditorStyle.emojisPopoverClasses.__hash}` + " " + "emojisList"
30
+ className: `jsx-${_EditorStyle.emojisPopoverClasses.__hash}` + " " + "emojisList"
30
31
  }, /*#__PURE__*/_react.default.createElement("li", {
31
32
  onClick: () => onInsertMarkdown(_markdownHandler.EMOJI_SMILEY_FACE),
32
- className: `jsx-${_RichTextEditorStyle.emojisPopoverClasses.__hash}`
33
- }, /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_SMILEY_FACE])), /*#__PURE__*/_react.default.createElement("li", {
33
+ className: `jsx-${_EditorStyle.emojisPopoverClasses.__hash}`
34
+ }, /*#__PURE__*/_react.default.createElement(_Parser.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_SMILEY_FACE])), /*#__PURE__*/_react.default.createElement("li", {
34
35
  onClick: () => onInsertMarkdown(_markdownHandler.EMOJI_SAD_FACE),
35
- className: `jsx-${_RichTextEditorStyle.emojisPopoverClasses.__hash}`
36
- }, /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_SAD_FACE])), /*#__PURE__*/_react.default.createElement("li", {
36
+ className: `jsx-${_EditorStyle.emojisPopoverClasses.__hash}`
37
+ }, /*#__PURE__*/_react.default.createElement(_Parser.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_SAD_FACE])), /*#__PURE__*/_react.default.createElement("li", {
37
38
  onClick: () => onInsertMarkdown(_markdownHandler.EMOJI_THUMBS_UP),
38
- className: `jsx-${_RichTextEditorStyle.emojisPopoverClasses.__hash}`
39
- }, /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_THUMBS_UP])), /*#__PURE__*/_react.default.createElement("li", {
39
+ className: `jsx-${_EditorStyle.emojisPopoverClasses.__hash}`
40
+ }, /*#__PURE__*/_react.default.createElement(_Parser.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_THUMBS_UP])), /*#__PURE__*/_react.default.createElement("li", {
40
41
  onClick: () => onInsertMarkdown(_markdownHandler.EMOJI_THUMBS_DOWN),
41
- className: `jsx-${_RichTextEditorStyle.emojisPopoverClasses.__hash}`
42
- }, /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_THUMBS_DOWN]))), /*#__PURE__*/_react.default.createElement(_style.default, {
43
- id: _RichTextEditorStyle.emojisPopoverClasses.__hash
44
- }, _RichTextEditorStyle.emojisPopoverClasses));
42
+ className: `jsx-${_EditorStyle.emojisPopoverClasses.__hash}`
43
+ }, /*#__PURE__*/_react.default.createElement(_Parser.Parser, null, _markdownHandler.emojis[_markdownHandler.EMOJI_THUMBS_DOWN]))), /*#__PURE__*/_react.default.createElement(_style.default, {
44
+ id: _EditorStyle.emojisPopoverClasses.__hash
45
+ }, _EditorStyle.emojisPopoverClasses));
45
46
  };
46
47
  EmojisPopover.propTypes = {
47
48
  onClose: _propTypes.default.func.isRequired,
@@ -69,7 +70,7 @@ const IconButtonWithTooltip = _ref2 => {
69
70
  ref: ref,
70
71
  onMouseOver: onMouseOver,
71
72
  onMouseOut: onMouseOut,
72
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash}` + " " + "tooltip"
73
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash}` + " " + "tooltip"
73
74
  }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
74
75
  secondary: true,
75
76
  small: true,
@@ -78,8 +79,8 @@ const IconButtonWithTooltip = _ref2 => {
78
79
  onClick: onClick
79
80
  }));
80
81
  }), /*#__PURE__*/_react.default.createElement(_style.default, {
81
- id: _RichTextEditorStyle.tooltipAnchorClasses.__hash
82
- }, _RichTextEditorStyle.tooltipAnchorClasses));
82
+ id: _EditorStyle.tooltipAnchorClasses.__hash
83
+ }, _EditorStyle.tooltipAnchorClasses));
83
84
  };
84
85
  IconButtonWithTooltip.propTypes = {
85
86
  disabled: _propTypes.default.bool,
@@ -99,11 +100,11 @@ const Toolbar = _ref4 => {
99
100
  const [emojisPopoverIsOpen, setEmojisPopoverIsOpen] = (0, _react.useState)(false);
100
101
  const iconColor = disabled ? _ui.colors.grey600 : _ui.colors.grey700;
101
102
  return /*#__PURE__*/_react.default.createElement("div", {
102
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash} jsx-${_RichTextEditorStyle.toolbarClasses.__hash}` + " " + "toolbar"
103
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash} jsx-${_EditorStyle.toolbarClasses.__hash}` + " " + "toolbar"
103
104
  }, !previewMode ? /*#__PURE__*/_react.default.createElement("div", {
104
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash} jsx-${_RichTextEditorStyle.toolbarClasses.__hash}` + " " + "actionsWrapper"
105
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash} jsx-${_EditorStyle.toolbarClasses.__hash}` + " " + "actionsWrapper"
105
106
  }, /*#__PURE__*/_react.default.createElement("div", {
106
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash} jsx-${_RichTextEditorStyle.toolbarClasses.__hash}` + " " + "mainActions"
107
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash} jsx-${_EditorStyle.toolbarClasses.__hash}` + " " + "mainActions"
107
108
  }, /*#__PURE__*/_react.default.createElement(IconButtonWithTooltip, {
108
109
  tooltipContent: _d2I18n.default.t('Bold text'),
109
110
  disabled: disabled,
@@ -134,7 +135,7 @@ const Toolbar = _ref4 => {
134
135
  onClick: () => onInsertMarkdown(_markdownHandler.MENTION)
135
136
  }), /*#__PURE__*/_react.default.createElement("span", {
136
137
  ref: emojisButtonRef,
137
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash} jsx-${_RichTextEditorStyle.toolbarClasses.__hash}` + " " + "tooltip"
138
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash} jsx-${_EditorStyle.toolbarClasses.__hash}` + " " + "tooltip"
138
139
  }, /*#__PURE__*/_react.default.createElement(IconButtonWithTooltip, {
139
140
  tooltipContent: _d2I18n.default.t('Add emoji'),
140
141
  disabled: disabled,
@@ -150,24 +151,24 @@ const Toolbar = _ref4 => {
150
151
  },
151
152
  reference: emojisButtonRef
152
153
  })), /*#__PURE__*/_react.default.createElement("div", {
153
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash} jsx-${_RichTextEditorStyle.toolbarClasses.__hash}` + " " + "sideActions"
154
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash} jsx-${_EditorStyle.toolbarClasses.__hash}` + " " + "sideActions"
154
155
  }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
155
156
  secondary: true,
156
157
  small: true,
157
158
  disabled: previewButtonDisabled || disabled,
158
159
  onClick: onTogglePreview
159
160
  }, _d2I18n.default.t('Preview')))) : /*#__PURE__*/_react.default.createElement("div", {
160
- className: `jsx-${_RichTextEditorStyle.tooltipAnchorClasses.__hash} jsx-${_RichTextEditorStyle.toolbarClasses.__hash}` + " " + "previewWrapper"
161
+ className: `jsx-${_EditorStyle.tooltipAnchorClasses.__hash} jsx-${_EditorStyle.toolbarClasses.__hash}` + " " + "previewWrapper"
161
162
  }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
162
163
  secondary: true,
163
164
  small: true,
164
165
  onClick: onTogglePreview,
165
166
  disabled: disabled
166
167
  }, _d2I18n.default.t('Back to write mode'))), /*#__PURE__*/_react.default.createElement(_style.default, {
167
- id: _RichTextEditorStyle.tooltipAnchorClasses.__hash
168
- }, _RichTextEditorStyle.tooltipAnchorClasses), /*#__PURE__*/_react.default.createElement(_style.default, {
169
- id: _RichTextEditorStyle.toolbarClasses.__hash
170
- }, _RichTextEditorStyle.toolbarClasses));
168
+ id: _EditorStyle.tooltipAnchorClasses.__hash
169
+ }, _EditorStyle.tooltipAnchorClasses), /*#__PURE__*/_react.default.createElement(_style.default, {
170
+ id: _EditorStyle.toolbarClasses.__hash
171
+ }, _EditorStyle.toolbarClasses));
171
172
  };
172
173
  Toolbar.propTypes = {
173
174
  previewButtonDisabled: _propTypes.default.bool.isRequired,
@@ -176,31 +177,45 @@ Toolbar.propTypes = {
176
177
  onTogglePreview: _propTypes.default.func.isRequired,
177
178
  disabled: _propTypes.default.bool
178
179
  };
179
- const RichTextEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref5, externalRef) => {
180
+ const Editor = /*#__PURE__*/(0, _react.forwardRef)((_ref5, externalRef) => {
180
181
  let {
181
182
  value,
182
183
  disabled,
183
184
  inputPlaceholder,
184
185
  onChange,
185
186
  errorText,
186
- helpText
187
+ helpText,
188
+ initialFocus,
189
+ resizable
187
190
  } = _ref5;
188
191
  const [previewMode, setPreviewMode] = (0, _react.useState)(false);
189
192
  const internalRef = (0, _react.useRef)();
190
193
  const textareaRef = externalRef || internalRef;
194
+ const caretPosRef = (0, _react.useRef)(undefined);
195
+ const insertMarkdownCallback = (text, caretPos) => {
196
+ caretPosRef.current = caretPos;
197
+ onChange(text);
198
+ textareaRef.current.focus();
199
+ };
191
200
  (0, _react.useEffect)(() => {
192
- var _textareaRef$current;
193
- return (_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0 ? void 0 : _textareaRef$current.focus();
194
- }, [textareaRef]);
201
+ if (initialFocus) {
202
+ var _textareaRef$current;
203
+ (_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0 ? void 0 : _textareaRef$current.focus();
204
+ }
205
+ }, [initialFocus, textareaRef]);
206
+ (0, _react.useEffect)(() => {
207
+ if (caretPosRef.current) {
208
+ var _textareaRef$current2;
209
+ (_textareaRef$current2 = textareaRef.current) === null || _textareaRef$current2 === void 0 ? void 0 : _textareaRef$current2.setSelectionRange(caretPosRef.current, caretPosRef.current);
210
+ caretPosRef.current = undefined;
211
+ }
212
+ }, [value, textareaRef]);
195
213
  return /*#__PURE__*/_react.default.createElement("div", {
196
- className: `jsx-${_RichTextEditorStyle.mainClasses.__hash}` + " " + "container"
214
+ "data-test": "@dhis2-analytics-richtexteditor",
215
+ className: `jsx-${_EditorStyle.mainClasses.__hash}` + " " + "container"
197
216
  }, /*#__PURE__*/_react.default.createElement(Toolbar, {
198
217
  onInsertMarkdown: markdown => {
199
- (0, _markdownHandler.insertMarkdown)(markdown, textareaRef.current, (text, caretPos) => {
200
- onChange(text);
201
- textareaRef.current.focus();
202
- textareaRef.current.selectionEnd = caretPos;
203
- });
218
+ (0, _markdownHandler.insertMarkdown)(markdown, textareaRef.current, insertMarkdownCallback);
204
219
  if (markdown === _markdownHandler.MENTION) {
205
220
  textareaRef.current.dispatchEvent(new KeyboardEvent('keydown', {
206
221
  key: '@',
@@ -213,11 +228,9 @@ const RichTextEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref5, externalRef)
213
228
  previewButtonDisabled: !value,
214
229
  disabled: disabled
215
230
  }), previewMode ? /*#__PURE__*/_react.default.createElement("div", {
216
- className: `jsx-${_RichTextEditorStyle.mainClasses.__hash}` + " " + "preview"
217
- }, /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, value)) : /*#__PURE__*/_react.default.createElement(_ui.Field, {
218
- error: !!errorText,
219
- validationText: errorText,
220
- helpText: helpText
231
+ className: `jsx-${_EditorStyle.mainClasses.__hash}` + " " + "preview"
232
+ }, /*#__PURE__*/_react.default.createElement(_Parser.Parser, null, value)) : /*#__PURE__*/_react.default.createElement("div", {
233
+ className: `jsx-${_EditorStyle.mainClasses.__hash}` + " " + "edit"
221
234
  }, /*#__PURE__*/_react.default.createElement(_UserMentionWrapper.UserMentionWrapper, {
222
235
  onUserSelect: onChange,
223
236
  inputReference: textareaRef
@@ -227,19 +240,29 @@ const RichTextEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref5, externalRef)
227
240
  disabled: disabled,
228
241
  value: value,
229
242
  onChange: event => onChange(event.target.value),
230
- onKeyDown: event => (0, _markdownHandler.convertCtrlKey)(event, onChange),
231
- className: `jsx-${_RichTextEditorStyle.mainClasses.__hash}` + " " + "textarea"
232
- }))), /*#__PURE__*/_react.default.createElement(_style.default, {
233
- id: _RichTextEditorStyle.mainClasses.__hash
234
- }, _RichTextEditorStyle.mainClasses));
243
+ onKeyDown: event => (0, _markdownHandler.convertCtrlKey)(event, insertMarkdownCallback),
244
+ className: `jsx-${_EditorStyle.mainClasses.__hash}` + " " + ((0, _classnames.default)('textarea', {
245
+ resizable
246
+ }) || "")
247
+ })), errorText && /*#__PURE__*/_react.default.createElement(_ui.Help, {
248
+ error: !!errorText
249
+ }, errorText), helpText && /*#__PURE__*/_react.default.createElement(_ui.Help, null, helpText)), /*#__PURE__*/_react.default.createElement(_style.default, {
250
+ id: _EditorStyle.mainClasses.__hash
251
+ }, _EditorStyle.mainClasses));
235
252
  });
236
- exports.RichTextEditor = RichTextEditor;
237
- RichTextEditor.displayName = 'RichTextEditor';
238
- RichTextEditor.propTypes = {
253
+ exports.Editor = Editor;
254
+ Editor.displayName = 'Editor';
255
+ Editor.defaultProps = {
256
+ initialFocus: true,
257
+ resizable: true
258
+ };
259
+ Editor.propTypes = {
239
260
  value: _propTypes.default.string.isRequired,
240
261
  onChange: _propTypes.default.func.isRequired,
241
262
  disabled: _propTypes.default.bool,
242
263
  errorText: _propTypes.default.string,
243
264
  helpText: _propTypes.default.string,
244
- inputPlaceholder: _propTypes.default.string
265
+ initialFocus: _propTypes.default.bool,
266
+ inputPlaceholder: _propTypes.default.string,
267
+ resizable: _propTypes.default.bool
245
268
  };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ require("@testing-library/jest-dom");
4
+ var _react = require("@testing-library/react");
5
+ var _react2 = _interopRequireDefault(require("react"));
6
+ var _Editor = require("../Editor.js");
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+ const mockConvertCtrlKey = jest.fn();
9
+ jest.mock('../markdownHandler.js', () => ({
10
+ convertCtrlKey: () => mockConvertCtrlKey()
11
+ }));
12
+ jest.mock('../../../UserMention/UserMentionWrapper.js', () => ({
13
+ UserMentionWrapper: jest.fn(props => /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, props.children))
14
+ }));
15
+ describe('RichText: Editor component', () => {
16
+ const componentProps = {
17
+ value: '',
18
+ onChange: jest.fn()
19
+ };
20
+ beforeEach(() => {
21
+ mockConvertCtrlKey.mockClear();
22
+ });
23
+ const renderComponent = props => {
24
+ return (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_Editor.Editor, props));
25
+ };
26
+ it('renders a result', () => {
27
+ renderComponent(componentProps);
28
+ expect(_react.screen.getByTestId('@dhis2-analytics-richtexteditor')).toBeVisible();
29
+ });
30
+ it('calls convertCtrlKey on keydown', () => {
31
+ renderComponent(componentProps);
32
+ _react.fireEvent.keyDown(_react.screen.getByRole('textbox'), {
33
+ key: 'A',
34
+ code: 'keyA'
35
+ });
36
+ expect(mockConvertCtrlKey).toHaveBeenCalled();
37
+ });
38
+ });