@churchapps/apphelper 0.1.2 → 0.1.4

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 (193) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +22 -22
  5. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  6. package/dist/components/FormSubmissionEdit.js +2 -9
  7. package/dist/components/FormSubmissionEdit.js.map +1 -1
  8. package/dist/components/QuestionEdit.js +2 -2
  9. package/dist/components/QuestionEdit.js.map +1 -1
  10. package/dist/components/markdownEditor/editor.css +787 -787
  11. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  12. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  13. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  14. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  15. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  16. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  17. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  18. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  19. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  20. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  21. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  22. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  23. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  26. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  27. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  29. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  30. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  31. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  32. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  33. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  34. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  35. package/dist/pageComponents/components/SelectChurchRegister.js +3 -3
  36. package/dist/pageComponents/components/SelectChurchRegister.js.map +1 -1
  37. package/package.json +85 -85
  38. package/src/components/CreatePerson.tsx +80 -80
  39. package/src/components/DisplayBox.tsx +68 -68
  40. package/src/components/ErrorMessages.tsx +26 -26
  41. package/src/components/ExportLink.tsx +67 -67
  42. package/src/components/FloatingSupport.tsx +16 -16
  43. package/src/components/FormSubmissionEdit.tsx +120 -129
  44. package/src/components/HelpIcon.tsx +10 -10
  45. package/src/components/ImageEditor.tsx +126 -126
  46. package/src/components/InputBox.tsx +73 -73
  47. package/src/components/Loading.tsx +29 -29
  48. package/src/components/PersonAdd.tsx +75 -75
  49. package/src/components/QuestionEdit.tsx +63 -63
  50. package/src/components/SmallButton.tsx +39 -39
  51. package/src/components/SupportModal.tsx +26 -26
  52. package/src/components/TabPanel.tsx +34 -34
  53. package/src/components/gallery/GalleryModal.tsx +102 -102
  54. package/src/components/gallery/StockPhotos.tsx +74 -74
  55. package/src/components/gallery/index.ts +1 -1
  56. package/src/components/iconPicker/IconNamesList.ts +2240 -2240
  57. package/src/components/iconPicker/IconPicker.tsx +153 -153
  58. package/src/components/index.tsx +24 -24
  59. package/src/components/markdownEditor/Editor.tsx +132 -132
  60. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  61. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  62. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  63. package/src/components/markdownEditor/editor.css +787 -787
  64. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  65. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  66. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  67. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  68. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  69. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  70. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  71. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  72. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  73. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  74. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  75. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  76. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  77. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  78. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  79. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  80. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  81. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  82. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  83. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  84. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  85. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  86. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  87. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  88. package/src/components/markdownEditor/index.ts +2 -2
  89. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  90. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  91. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  92. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  93. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  94. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  95. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  96. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  97. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  98. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  99. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  100. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  101. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  102. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  103. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  104. package/src/components/markdownEditor/plugins/index.ts +6 -6
  105. package/src/components/markdownEditor/theme.ts +65 -65
  106. package/src/components/notes/AddNote.tsx +90 -90
  107. package/src/components/notes/Conversation.tsx +82 -82
  108. package/src/components/notes/Conversations.tsx +58 -58
  109. package/src/components/notes/NewConversation.tsx +78 -78
  110. package/src/components/notes/Note.tsx +44 -44
  111. package/src/components/notes/Notes.tsx +68 -68
  112. package/src/components/notes/index.ts +5 -5
  113. package/src/components/reporting/ChartReport.tsx +98 -98
  114. package/src/components/reporting/ReportFilter.tsx +54 -54
  115. package/src/components/reporting/ReportFilterField.tsx +160 -160
  116. package/src/components/reporting/ReportOutput.tsx +79 -79
  117. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  118. package/src/components/reporting/TableReport.tsx +57 -57
  119. package/src/components/reporting/TreeReport.tsx +111 -111
  120. package/src/components/reporting/index.ts +4 -4
  121. package/src/components/wrapper/AppList.tsx +20 -20
  122. package/src/components/wrapper/ChurchList.tsx +22 -22
  123. package/src/components/wrapper/Drawers.tsx +60 -60
  124. package/src/components/wrapper/NavItem.tsx +41 -41
  125. package/src/components/wrapper/NewPrivateMessage.tsx +103 -103
  126. package/src/components/wrapper/NotificationMenu.tsx +85 -85
  127. package/src/components/wrapper/Notifications.tsx +50 -50
  128. package/src/components/wrapper/PrivateMessageDetails.tsx +23 -23
  129. package/src/components/wrapper/PrivateMessages.tsx +87 -87
  130. package/src/components/wrapper/SiteWrapper.tsx +96 -96
  131. package/src/components/wrapper/TabPanel.tsx +30 -30
  132. package/src/components/wrapper/UserMenu.tsx +106 -106
  133. package/src/components/wrapper/index.tsx +5 -5
  134. package/src/donationComponents/DonationPage.tsx +136 -136
  135. package/src/donationComponents/components/BankForm.tsx +159 -159
  136. package/src/donationComponents/components/CardForm.tsx +104 -104
  137. package/src/donationComponents/components/DonationForm.tsx +235 -235
  138. package/src/donationComponents/components/FundDonation.tsx +49 -49
  139. package/src/donationComponents/components/FundDonations.tsx +39 -39
  140. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  141. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  142. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  143. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  144. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  145. package/src/donationComponents/components/index.tsx +9 -9
  146. package/src/donationComponents/index.ts +3 -3
  147. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  148. package/src/helpers/AnalyticsHelper.ts +33 -33
  149. package/src/helpers/ApiHelper.ts +125 -125
  150. package/src/helpers/AppearanceHelper.ts +69 -69
  151. package/src/helpers/ArrayHelper.ts +81 -81
  152. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  153. package/src/helpers/CurrencyHelper.ts +10 -10
  154. package/src/helpers/DateHelper.ts +108 -108
  155. package/src/helpers/DonationHelper.ts +26 -26
  156. package/src/helpers/ErrorHelper.ts +36 -36
  157. package/src/helpers/EventHelper.ts +52 -52
  158. package/src/helpers/FileHelper.ts +31 -31
  159. package/src/helpers/PersonHelper.ts +60 -60
  160. package/src/helpers/SocketHelper.ts +76 -76
  161. package/src/helpers/Themes.ts +14 -14
  162. package/src/helpers/UniqueIdHelper.ts +36 -36
  163. package/src/helpers/UserHelper.ts +59 -59
  164. package/src/helpers/createEmotionCache.ts +17 -17
  165. package/src/helpers/index.ts +18 -18
  166. package/src/hooks/index.ts +1 -1
  167. package/src/hooks/useMountedState.ts +16 -16
  168. package/src/index.ts +6 -6
  169. package/src/interfaces/Access.ts +24 -24
  170. package/src/interfaces/Attendance.ts +8 -8
  171. package/src/interfaces/Content.ts +10 -10
  172. package/src/interfaces/Doing.ts +24 -24
  173. package/src/interfaces/Donation.ts +45 -45
  174. package/src/interfaces/Error.ts +17 -17
  175. package/src/interfaces/Membership.ts +51 -51
  176. package/src/interfaces/Messaging.ts +21 -21
  177. package/src/interfaces/Permissions.ts +68 -68
  178. package/src/interfaces/Reporting.ts +7 -7
  179. package/src/interfaces/UserContextInterface.ts +13 -13
  180. package/src/interfaces/index.ts +13 -13
  181. package/src/pageComponents/LoginPage.tsx +244 -244
  182. package/src/pageComponents/LogoutPage.tsx +28 -28
  183. package/src/pageComponents/components/Forgot.tsx +79 -79
  184. package/src/pageComponents/components/Login.tsx +54 -54
  185. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  186. package/src/pageComponents/components/Register.tsx +107 -107
  187. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  188. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  189. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  190. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  191. package/src/pageComponents/index.ts +3 -3
  192. package/tsconfig.json +34 -34
  193. package/tslint.json +14 -14
@@ -1,65 +1,65 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
-
9
- import type {LexicalEditor} from 'lexical';
10
- import 'material-symbols';
11
- import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
12
- import {$createTextNode, TextNode} from 'lexical';
13
- import {useEffect} from 'react';
14
- import materialIcons from '../../../iconPicker/IconNamesList';
15
-
16
- import {$createEmojiNode, EmojiNode} from './EmojiNode';
17
- import { EMOJI_NODE_MARKDOWN_REGEX } from './EmojiNodeTransform';
18
-
19
-
20
- function useEmojis(editor: LexicalEditor): void {
21
- useEffect(() => {
22
- if (!editor.hasNodes([EmojiNode, TextNode])) {
23
- throw new Error('EmojisPlugin: EmojiNode not registered on editor');
24
- }
25
-
26
- return editor.registerNodeTransform(TextNode, (textNode) => {
27
- if (EMOJI_NODE_MARKDOWN_REGEX.test(textNode.getTextContent()) || materialIcons.map((materialIcon : string) => ':' + materialIcon + ':').some((materialIcon : string) => textNode.getTextContent().includes(materialIcon))) {
28
-
29
- const materialIconToInsert = materialIcons.find((materialIcon : string) => textNode.getTextContent().replaceAll(':', '').includes(materialIcon));
30
-
31
- if (!materialIconToInsert) return;
32
-
33
- const initialTextInput = textNode.getTextContent();
34
- const emojiNode = $createEmojiNode(materialIconToInsert);
35
-
36
- const leftoverTextNodes : Array<TextNode> = [];
37
-
38
- initialTextInput?.split(':').forEach((leftoverTextString : string, index : number) => {
39
- if (materialIcons.includes(leftoverTextString)) {
40
- const emojiNode = $createEmojiNode(leftoverTextString);
41
-
42
- leftoverTextNodes.push(emojiNode);
43
- return;
44
- }
45
- leftoverTextNodes.push($createTextNode(leftoverTextString));
46
- });
47
-
48
- textNode.setTextContent('');
49
-
50
-
51
- textNode.getParent().splice(textNode.getIndexWithinParent(), 1, leftoverTextNodes);
52
-
53
- (leftoverTextNodes.find((node : TextNode) => materialIcons.includes(node.__text)) || leftoverTextNodes[leftoverTextNodes.length - 1]).select();
54
-
55
- textNode.remove();
56
- }
57
- });
58
- }, [editor]);
59
- }
60
-
61
- export default function EmojisPlugin(): JSX.Element | null {
62
- const [editor] = useLexicalComposerContext();
63
- useEmojis(editor);
64
- return null;
65
- }
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import type {LexicalEditor} from 'lexical';
10
+ import 'material-symbols';
11
+ import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
12
+ import {$createTextNode, TextNode} from 'lexical';
13
+ import {useEffect} from 'react';
14
+ import materialIcons from '../../../iconPicker/IconNamesList';
15
+
16
+ import {$createEmojiNode, EmojiNode} from './EmojiNode';
17
+ import { EMOJI_NODE_MARKDOWN_REGEX } from './EmojiNodeTransform';
18
+
19
+
20
+ function useEmojis(editor: LexicalEditor): void {
21
+ useEffect(() => {
22
+ if (!editor.hasNodes([EmojiNode, TextNode])) {
23
+ throw new Error('EmojisPlugin: EmojiNode not registered on editor');
24
+ }
25
+
26
+ return editor.registerNodeTransform(TextNode, (textNode) => {
27
+ if (EMOJI_NODE_MARKDOWN_REGEX.test(textNode.getTextContent()) || materialIcons.map((materialIcon : string) => ':' + materialIcon + ':').some((materialIcon : string) => textNode.getTextContent().includes(materialIcon))) {
28
+
29
+ const materialIconToInsert = materialIcons.find((materialIcon : string) => textNode.getTextContent().replaceAll(':', '').includes(materialIcon));
30
+
31
+ if (!materialIconToInsert) return;
32
+
33
+ const initialTextInput = textNode.getTextContent();
34
+ const emojiNode = $createEmojiNode(materialIconToInsert);
35
+
36
+ const leftoverTextNodes : Array<TextNode> = [];
37
+
38
+ initialTextInput?.split(':').forEach((leftoverTextString : string, index : number) => {
39
+ if (materialIcons.includes(leftoverTextString)) {
40
+ const emojiNode = $createEmojiNode(leftoverTextString);
41
+
42
+ leftoverTextNodes.push(emojiNode);
43
+ return;
44
+ }
45
+ leftoverTextNodes.push($createTextNode(leftoverTextString));
46
+ });
47
+
48
+ textNode.setTextContent('');
49
+
50
+
51
+ textNode.getParent().splice(textNode.getIndexWithinParent(), 1, leftoverTextNodes);
52
+
53
+ (leftoverTextNodes.find((node : TextNode) => materialIcons.includes(node.__text)) || leftoverTextNodes[leftoverTextNodes.length - 1]).select();
54
+
55
+ textNode.remove();
56
+ }
57
+ });
58
+ }, [editor]);
59
+ }
60
+
61
+ export default function EmojisPlugin(): JSX.Element | null {
62
+ const [editor] = useLexicalComposerContext();
63
+ useEmojis(editor);
64
+ return null;
65
+ }
@@ -1,6 +1,6 @@
1
- export { ToolbarPlugin } from "./ToolbarPlugin";
2
- export { CustomAutoLinkPlugin } from "./AutoLinkPlugin";
3
- export { ListMaxIndentLevelPlugin } from "./ListMaxIndentLevelPlugin";
4
- export { PLAYGROUND_TRANSFORMERS } from "./MarkdownTransformers";
5
- export { ReadOnlyPlugin } from "./ReadOnlyPlugin";
6
- export { ControlledEditorPlugin } from "./ControlledEditorPlugin";
1
+ export { ToolbarPlugin } from "./ToolbarPlugin";
2
+ export { CustomAutoLinkPlugin } from "./AutoLinkPlugin";
3
+ export { ListMaxIndentLevelPlugin } from "./ListMaxIndentLevelPlugin";
4
+ export { PLAYGROUND_TRANSFORMERS } from "./MarkdownTransformers";
5
+ export { ReadOnlyPlugin } from "./ReadOnlyPlugin";
6
+ export { ControlledEditorPlugin } from "./ControlledEditorPlugin";
@@ -1,65 +1,65 @@
1
- export const theme = {
2
- placeholder: "editor-placeholder",
3
- paragraph: "editor-paragraph",
4
- quote: "editor-quote",
5
- heading: {
6
- h1: "editor-heading-h1",
7
- h2: "editor-heading-h2",
8
- h3: "editor-heading-h3",
9
- h4: "editor-heading-h4",
10
- h5: "editor-heading-h5"
11
- },
12
- list: {
13
- nested: {
14
- listitem: "editor-nested-listitem"
15
- },
16
- ol: "editor-list-ol",
17
- ul: "editor-list-ul",
18
- listitem: "editor-listitem"
19
- },
20
- image: "editor-image",
21
- link: "editor-link",
22
- text: {
23
- bold: "editor-text-bold",
24
- italic: "editor-text-italic",
25
- overflowed: "editor-text-overflowed",
26
- hashtag: "editor-text-hashtag",
27
- underline: "editor-text-underline",
28
- strikethrough: "editor-text-strikethrough",
29
- underlineStrikethrough: "editor-text-underlineStrikethrough",
30
- code: "editor-text-code"
31
- },
32
- code: "editor-code",
33
- codeHighlight: {
34
- atrule: "editor-tokenAttr",
35
- attr: "editor-tokenAttr",
36
- boolean: "editor-tokenProperty",
37
- builtin: "editor-tokenSelector",
38
- cdata: "editor-tokenComment",
39
- char: "editor-tokenSelector",
40
- class: "editor-tokenFunction",
41
- "class-name": "editor-tokenFunction",
42
- comment: "editor-tokenComment",
43
- constant: "editor-tokenProperty",
44
- deleted: "editor-tokenProperty",
45
- doctype: "editor-tokenComment",
46
- entity: "editor-tokenOperator",
47
- function: "editor-tokenFunction",
48
- important: "editor-tokenVariable",
49
- inserted: "editor-tokenSelector",
50
- keyword: "editor-tokenAttr",
51
- namespace: "editor-tokenVariable",
52
- number: "editor-tokenProperty",
53
- operator: "editor-tokenOperator",
54
- prolog: "editor-tokenComment",
55
- property: "editor-tokenProperty",
56
- punctuation: "editor-tokenPunctuation",
57
- regex: "editor-tokenVariable",
58
- selector: "editor-tokenSelector",
59
- string: "editor-tokenSelector",
60
- symbol: "editor-tokenProperty",
61
- tag: "editor-tokenProperty",
62
- url: "editor-tokenOperator",
63
- variable: "editor-tokenVariable"
64
- }
65
- };
1
+ export const theme = {
2
+ placeholder: "editor-placeholder",
3
+ paragraph: "editor-paragraph",
4
+ quote: "editor-quote",
5
+ heading: {
6
+ h1: "editor-heading-h1",
7
+ h2: "editor-heading-h2",
8
+ h3: "editor-heading-h3",
9
+ h4: "editor-heading-h4",
10
+ h5: "editor-heading-h5"
11
+ },
12
+ list: {
13
+ nested: {
14
+ listitem: "editor-nested-listitem"
15
+ },
16
+ ol: "editor-list-ol",
17
+ ul: "editor-list-ul",
18
+ listitem: "editor-listitem"
19
+ },
20
+ image: "editor-image",
21
+ link: "editor-link",
22
+ text: {
23
+ bold: "editor-text-bold",
24
+ italic: "editor-text-italic",
25
+ overflowed: "editor-text-overflowed",
26
+ hashtag: "editor-text-hashtag",
27
+ underline: "editor-text-underline",
28
+ strikethrough: "editor-text-strikethrough",
29
+ underlineStrikethrough: "editor-text-underlineStrikethrough",
30
+ code: "editor-text-code"
31
+ },
32
+ code: "editor-code",
33
+ codeHighlight: {
34
+ atrule: "editor-tokenAttr",
35
+ attr: "editor-tokenAttr",
36
+ boolean: "editor-tokenProperty",
37
+ builtin: "editor-tokenSelector",
38
+ cdata: "editor-tokenComment",
39
+ char: "editor-tokenSelector",
40
+ class: "editor-tokenFunction",
41
+ "class-name": "editor-tokenFunction",
42
+ comment: "editor-tokenComment",
43
+ constant: "editor-tokenProperty",
44
+ deleted: "editor-tokenProperty",
45
+ doctype: "editor-tokenComment",
46
+ entity: "editor-tokenOperator",
47
+ function: "editor-tokenFunction",
48
+ important: "editor-tokenVariable",
49
+ inserted: "editor-tokenSelector",
50
+ keyword: "editor-tokenAttr",
51
+ namespace: "editor-tokenVariable",
52
+ number: "editor-tokenProperty",
53
+ operator: "editor-tokenOperator",
54
+ prolog: "editor-tokenComment",
55
+ property: "editor-tokenProperty",
56
+ punctuation: "editor-tokenPunctuation",
57
+ regex: "editor-tokenVariable",
58
+ selector: "editor-tokenSelector",
59
+ string: "editor-tokenSelector",
60
+ symbol: "editor-tokenProperty",
61
+ tag: "editor-tokenProperty",
62
+ url: "editor-tokenOperator",
63
+ variable: "editor-tokenVariable"
64
+ }
65
+ };
@@ -1,90 +1,90 @@
1
- import React, { useState, useEffect } from "react"
2
- import { ApiHelper, PersonHelper } from "../../helpers"
3
- import { MessageInterface, UserContextInterface } from "../../interfaces"
4
- import { Icon, Stack, TextField } from "@mui/material"
5
- import { ErrorMessages } from "../ErrorMessages"
6
- import { SmallButton } from "../SmallButton"
7
-
8
- type Props = {
9
- messageId?: string;
10
- onUpdate: () => void;
11
- createConversation: () => Promise<string>;
12
- conversationId?: string;
13
- context: UserContextInterface
14
- };
15
-
16
- export function AddNote({ context, ...props }: Props) {
17
- const [message, setMessage] = useState<MessageInterface>()
18
- const [errors, setErrors] = React.useState<string[]>([]);
19
- const [isSubmitting, setIsSubmitting] = React.useState(false);
20
- const headerText = props.messageId ? "Edit note" : "Add a note"
21
-
22
- useEffect(() => {
23
- if (props.messageId) ApiHelper.get(`/messages/${props.messageId}`, "MessagingApi").then(n => setMessage(n));
24
- else setMessage({ conversationId: props.conversationId, content: "" });
25
- return () => {
26
- setMessage(null);
27
- };
28
- }, [props.messageId, props.conversationId])
29
-
30
- const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
31
- setErrors([]);
32
- const m = { ...message } as MessageInterface;
33
- m.content = e.target.value;
34
- setMessage(m);
35
- }
36
-
37
- const validate = () => {
38
- const result = [];
39
- if (!message.content.trim()) result.push("Please enter a note.");
40
- setErrors(result);
41
- return result.length === 0;
42
- }
43
-
44
- async function handleSave() {
45
- if (validate()) {
46
- setIsSubmitting(true);
47
- let cId = props.conversationId;
48
- if (!cId) cId = await props.createConversation();
49
-
50
- const m = { ...message };
51
- m.conversationId = cId;
52
- ApiHelper.post("/messages", [m], "MessagingApi")
53
- .then(() => {
54
- props.onUpdate();
55
- const m = { ...message } as MessageInterface;
56
- m.content = "";
57
- setMessage(m);
58
- })
59
- .finally(() => { setIsSubmitting(false); });
60
- }
61
- };
62
-
63
- async function deleteNote() {
64
- await ApiHelper.delete(`/messages/${props.messageId}`, "MessagingApi")
65
- props.onUpdate()
66
- }
67
-
68
- const deleteFunction = props.messageId ? deleteNote : null;
69
-
70
- const image = PersonHelper.getPhotoUrl(context?.person)
71
-
72
- return (
73
- <>
74
- <ErrorMessages errors={errors} />
75
-
76
- <Stack direction="row" spacing={1.5} style={{ marginTop: 15 }} justifyContent="end">
77
-
78
- {image ? <img src={image} alt="user" style={{ width: 60, height: 45, borderRadius: 5, marginLeft: 8 }} /> : <Icon>person</Icon>}
79
- <Stack direction="column" spacing={2} style={{ width: "100%" }} justifyContent="end">
80
- <div><b>{context?.person?.name?.display}</b></div>
81
- <TextField fullWidth name="noteText" aria-label={headerText} placeholder="Add a note" multiline style={{ marginTop: 0, border: "none" }} variant="standard" onChange={handleChange} value={message?.content} />
82
- </Stack>
83
- <Stack direction="column" spacing={1} justifyContent="end">
84
- <SmallButton icon="send" onClick={handleSave} />
85
- {deleteFunction && <SmallButton icon="delete" onClick={deleteFunction} disabled={isSubmitting} />}
86
- </Stack>
87
- </Stack>
88
- </>
89
- );
90
- }
1
+ import React, { useState, useEffect } from "react"
2
+ import { ApiHelper, PersonHelper } from "../../helpers"
3
+ import { MessageInterface, UserContextInterface } from "../../interfaces"
4
+ import { Icon, Stack, TextField } from "@mui/material"
5
+ import { ErrorMessages } from "../ErrorMessages"
6
+ import { SmallButton } from "../SmallButton"
7
+
8
+ type Props = {
9
+ messageId?: string;
10
+ onUpdate: () => void;
11
+ createConversation: () => Promise<string>;
12
+ conversationId?: string;
13
+ context: UserContextInterface
14
+ };
15
+
16
+ export function AddNote({ context, ...props }: Props) {
17
+ const [message, setMessage] = useState<MessageInterface>()
18
+ const [errors, setErrors] = React.useState<string[]>([]);
19
+ const [isSubmitting, setIsSubmitting] = React.useState(false);
20
+ const headerText = props.messageId ? "Edit note" : "Add a note"
21
+
22
+ useEffect(() => {
23
+ if (props.messageId) ApiHelper.get(`/messages/${props.messageId}`, "MessagingApi").then(n => setMessage(n));
24
+ else setMessage({ conversationId: props.conversationId, content: "" });
25
+ return () => {
26
+ setMessage(null);
27
+ };
28
+ }, [props.messageId, props.conversationId])
29
+
30
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
31
+ setErrors([]);
32
+ const m = { ...message } as MessageInterface;
33
+ m.content = e.target.value;
34
+ setMessage(m);
35
+ }
36
+
37
+ const validate = () => {
38
+ const result = [];
39
+ if (!message.content.trim()) result.push("Please enter a note.");
40
+ setErrors(result);
41
+ return result.length === 0;
42
+ }
43
+
44
+ async function handleSave() {
45
+ if (validate()) {
46
+ setIsSubmitting(true);
47
+ let cId = props.conversationId;
48
+ if (!cId) cId = await props.createConversation();
49
+
50
+ const m = { ...message };
51
+ m.conversationId = cId;
52
+ ApiHelper.post("/messages", [m], "MessagingApi")
53
+ .then(() => {
54
+ props.onUpdate();
55
+ const m = { ...message } as MessageInterface;
56
+ m.content = "";
57
+ setMessage(m);
58
+ })
59
+ .finally(() => { setIsSubmitting(false); });
60
+ }
61
+ };
62
+
63
+ async function deleteNote() {
64
+ await ApiHelper.delete(`/messages/${props.messageId}`, "MessagingApi")
65
+ props.onUpdate()
66
+ }
67
+
68
+ const deleteFunction = props.messageId ? deleteNote : null;
69
+
70
+ const image = PersonHelper.getPhotoUrl(context?.person)
71
+
72
+ return (
73
+ <>
74
+ <ErrorMessages errors={errors} />
75
+
76
+ <Stack direction="row" spacing={1.5} style={{ marginTop: 15 }} justifyContent="end">
77
+
78
+ {image ? <img src={image} alt="user" style={{ width: 60, height: 45, borderRadius: 5, marginLeft: 8 }} /> : <Icon>person</Icon>}
79
+ <Stack direction="column" spacing={2} style={{ width: "100%" }} justifyContent="end">
80
+ <div><b>{context?.person?.name?.display}</b></div>
81
+ <TextField fullWidth name="noteText" aria-label={headerText} placeholder="Add a note" multiline style={{ marginTop: 0, border: "none" }} variant="standard" onChange={handleChange} value={message?.content} />
82
+ </Stack>
83
+ <Stack direction="column" spacing={1} justifyContent="end">
84
+ <SmallButton icon="send" onClick={handleSave} />
85
+ {deleteFunction && <SmallButton icon="delete" onClick={deleteFunction} disabled={isSubmitting} />}
86
+ </Stack>
87
+ </Stack>
88
+ </>
89
+ );
90
+ }
@@ -1,82 +1,82 @@
1
- import { Box, Paper, Stack } from "@mui/material";
2
- import React from "react";
3
- import { ApiHelper, ArrayHelper, DateHelper, PersonHelper } from "../../helpers";
4
- import { ConversationInterface, MessageInterface, UserContextInterface } from "../../interfaces";
5
- import { AddNote } from "./AddNote";
6
- import { Note } from "./Note";
7
-
8
- interface Props {
9
- conversation: ConversationInterface;
10
- context: UserContextInterface;
11
- showCommentCount?: boolean;
12
- noWrapper?: boolean;
13
- }
14
-
15
- export function Conversation(props: Props) {
16
- const [conversation, setConversation] = React.useState<ConversationInterface>(null)
17
- const [editMessageId, setEditMessageId] = React.useState(null)
18
-
19
- const loadNotes = async () => {
20
- const messages: MessageInterface[] = (conversation.id) ? await ApiHelper.get("/messages/conversation/" + conversation.id, "MessagingApi") : [];
21
- if (messages.length > 0) {
22
- const peopleIds = ArrayHelper.getIds(messages, "personId");
23
- const people = await ApiHelper.get("/people/ids?ids=" + peopleIds.join(","), "MembershipApi");
24
- messages.forEach(n => {
25
- n.person = ArrayHelper.getOne(people, "id", n.personId);
26
- })
27
- }
28
- const c = { ...conversation }
29
- c.messages = messages;
30
- setConversation(c);
31
- setEditMessageId(null);
32
- };
33
-
34
- React.useEffect(() => { setConversation(props.conversation) }, [props.conversation]); //eslint-disable-line
35
-
36
- if (conversation === null) return null;
37
- else {
38
- const message = conversation.messages[0];
39
- const photoUrl = PersonHelper.getPhotoUrl(message.person);
40
- let datePosted = new Date(message.timeUpdated || message.timeSent);
41
- const displayDuration = DateHelper.getDisplayDuration(datePosted);
42
-
43
- const isEdited = message.timeUpdated && message.timeUpdated !== message.timeSent && <>(edited)</>;
44
- const contents = message.content?.split("\n");
45
-
46
- const getNotes = () => {
47
- let noteArray: React.ReactNode[] = [];
48
- for (let i = 1; i < conversation.messages.length; i++) noteArray.push(<Note message={conversation.messages[i]} key={conversation.messages[i].id} showEditNote={setEditMessageId} />);
49
- return noteArray;
50
- }
51
-
52
- let result = (<>
53
- <div className="conversation">
54
- <div className="postedBy">
55
- <img src={photoUrl} alt="avatar" />
56
- </div>
57
- <Box sx={{ width: "100%" }} className="conversationContents">
58
- <Stack direction="row" justifyContent="space-between">
59
- <div>
60
- <b>{message.person?.name?.display}</b> · <span className="text-grey">{displayDuration}{isEdited}</span>
61
- {contents.map((c, i) => c ? <p key={i}>{c}</p> : <br />)}
62
- </div>
63
- </Stack>
64
- </Box>
65
- </div>
66
- {props.showCommentCount && (
67
- <div className="commentCount">
68
- <div>{(conversation.postCount === 1) ? "1 comment" : conversation.postCount + " comments"}</div>
69
- {(conversation.postCount > conversation.messages.length) ? <a href="about:blank" onClick={(e) => { e.preventDefault(); loadNotes(); }}>View all {conversation.postCount} comments</a> : <>&nbsp;</>}
70
- </div>
71
- )}
72
- <div className="messages">
73
- {getNotes()}
74
- <AddNote context={props.context} conversationId={props.conversation.id} onUpdate={loadNotes} createConversation={async () => (props.conversation.id)} messageId={editMessageId} />
75
- </div>
76
- </>);
77
-
78
-
79
- if (props.noWrapper) return result;
80
- else return (<Paper sx={{ padding: 1, marginBottom: 2 }}>{result}</Paper>);
81
- }
82
- };
1
+ import { Box, Paper, Stack } from "@mui/material";
2
+ import React from "react";
3
+ import { ApiHelper, ArrayHelper, DateHelper, PersonHelper } from "../../helpers";
4
+ import { ConversationInterface, MessageInterface, UserContextInterface } from "../../interfaces";
5
+ import { AddNote } from "./AddNote";
6
+ import { Note } from "./Note";
7
+
8
+ interface Props {
9
+ conversation: ConversationInterface;
10
+ context: UserContextInterface;
11
+ showCommentCount?: boolean;
12
+ noWrapper?: boolean;
13
+ }
14
+
15
+ export function Conversation(props: Props) {
16
+ const [conversation, setConversation] = React.useState<ConversationInterface>(null)
17
+ const [editMessageId, setEditMessageId] = React.useState(null)
18
+
19
+ const loadNotes = async () => {
20
+ const messages: MessageInterface[] = (conversation.id) ? await ApiHelper.get("/messages/conversation/" + conversation.id, "MessagingApi") : [];
21
+ if (messages.length > 0) {
22
+ const peopleIds = ArrayHelper.getIds(messages, "personId");
23
+ const people = await ApiHelper.get("/people/ids?ids=" + peopleIds.join(","), "MembershipApi");
24
+ messages.forEach(n => {
25
+ n.person = ArrayHelper.getOne(people, "id", n.personId);
26
+ })
27
+ }
28
+ const c = { ...conversation }
29
+ c.messages = messages;
30
+ setConversation(c);
31
+ setEditMessageId(null);
32
+ };
33
+
34
+ React.useEffect(() => { setConversation(props.conversation) }, [props.conversation]); //eslint-disable-line
35
+
36
+ if (conversation === null) return null;
37
+ else {
38
+ const message = conversation.messages[0];
39
+ const photoUrl = PersonHelper.getPhotoUrl(message.person);
40
+ let datePosted = new Date(message.timeUpdated || message.timeSent);
41
+ const displayDuration = DateHelper.getDisplayDuration(datePosted);
42
+
43
+ const isEdited = message.timeUpdated && message.timeUpdated !== message.timeSent && <>(edited)</>;
44
+ const contents = message.content?.split("\n");
45
+
46
+ const getNotes = () => {
47
+ let noteArray: React.ReactNode[] = [];
48
+ for (let i = 1; i < conversation.messages.length; i++) noteArray.push(<Note message={conversation.messages[i]} key={conversation.messages[i].id} showEditNote={setEditMessageId} />);
49
+ return noteArray;
50
+ }
51
+
52
+ let result = (<>
53
+ <div className="conversation">
54
+ <div className="postedBy">
55
+ <img src={photoUrl} alt="avatar" />
56
+ </div>
57
+ <Box sx={{ width: "100%" }} className="conversationContents">
58
+ <Stack direction="row" justifyContent="space-between">
59
+ <div>
60
+ <b>{message.person?.name?.display}</b> · <span className="text-grey">{displayDuration}{isEdited}</span>
61
+ {contents.map((c, i) => c ? <p key={i}>{c}</p> : <br />)}
62
+ </div>
63
+ </Stack>
64
+ </Box>
65
+ </div>
66
+ {props.showCommentCount && (
67
+ <div className="commentCount">
68
+ <div>{(conversation.postCount === 1) ? "1 comment" : conversation.postCount + " comments"}</div>
69
+ {(conversation.postCount > conversation.messages.length) ? <a href="about:blank" onClick={(e) => { e.preventDefault(); loadNotes(); }}>View all {conversation.postCount} comments</a> : <>&nbsp;</>}
70
+ </div>
71
+ )}
72
+ <div className="messages">
73
+ {getNotes()}
74
+ <AddNote context={props.context} conversationId={props.conversation.id} onUpdate={loadNotes} createConversation={async () => (props.conversation.id)} messageId={editMessageId} />
75
+ </div>
76
+ </>);
77
+
78
+
79
+ if (props.noWrapper) return result;
80
+ else return (<Paper sx={{ padding: 1, marginBottom: 2 }}>{result}</Paper>);
81
+ }
82
+ };