@churchapps/apphelper 0.1.6 → 0.1.8

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 (216) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +24 -22
  5. package/dist/components/markdownEditor/editor.css +787 -787
  6. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  7. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  8. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  9. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  10. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  11. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  12. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  13. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  14. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  15. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  16. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  17. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  18. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  19. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  20. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  21. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  22. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  23. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  26. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  27. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  29. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  30. package/dist/components/notes/Notes.d.ts +1 -0
  31. package/dist/components/notes/Notes.d.ts.map +1 -1
  32. package/dist/components/notes/Notes.js +1 -1
  33. package/dist/components/notes/Notes.js.map +1 -1
  34. package/dist/components/wrapper/NotificationMenu.d.ts.map +1 -1
  35. package/dist/components/wrapper/NotificationMenu.js +28 -11
  36. package/dist/components/wrapper/NotificationMenu.js.map +1 -1
  37. package/dist/components/wrapper/Notifications.d.ts +1 -0
  38. package/dist/components/wrapper/Notifications.d.ts.map +1 -1
  39. package/dist/components/wrapper/Notifications.js +2 -0
  40. package/dist/components/wrapper/Notifications.js.map +1 -1
  41. package/dist/components/wrapper/PrivateMessageDetails.d.ts +1 -0
  42. package/dist/components/wrapper/PrivateMessageDetails.d.ts.map +1 -1
  43. package/dist/components/wrapper/PrivateMessageDetails.js +1 -1
  44. package/dist/components/wrapper/PrivateMessageDetails.js.map +1 -1
  45. package/dist/components/wrapper/PrivateMessages.d.ts +2 -0
  46. package/dist/components/wrapper/PrivateMessages.d.ts.map +1 -1
  47. package/dist/components/wrapper/PrivateMessages.js +6 -3
  48. package/dist/components/wrapper/PrivateMessages.js.map +1 -1
  49. package/dist/components/wrapper/SiteWrapper.d.ts.map +1 -1
  50. package/dist/components/wrapper/SiteWrapper.js +5 -1
  51. package/dist/components/wrapper/SiteWrapper.js.map +1 -1
  52. package/dist/helpers/DateHelper.d.ts.map +1 -1
  53. package/dist/helpers/DateHelper.js +2 -0
  54. package/dist/helpers/DateHelper.js.map +1 -1
  55. package/dist/helpers/SocketHelper.d.ts.map +1 -1
  56. package/dist/helpers/SocketHelper.js +4 -2
  57. package/dist/helpers/SocketHelper.js.map +1 -1
  58. package/dist/interfaces/Messaging.d.ts +10 -1
  59. package/dist/interfaces/Messaging.d.ts.map +1 -1
  60. package/package.json +86 -85
  61. package/src/components/CreatePerson.tsx +80 -80
  62. package/src/components/DisplayBox.tsx +68 -68
  63. package/src/components/ErrorMessages.tsx +26 -26
  64. package/src/components/ExportLink.tsx +67 -67
  65. package/src/components/FloatingSupport.tsx +16 -16
  66. package/src/components/FormSubmissionEdit.tsx +120 -120
  67. package/src/components/HelpIcon.tsx +10 -10
  68. package/src/components/ImageEditor.tsx +126 -126
  69. package/src/components/InputBox.tsx +73 -73
  70. package/src/components/Loading.tsx +29 -29
  71. package/src/components/PersonAdd.tsx +75 -75
  72. package/src/components/QuestionEdit.tsx +63 -63
  73. package/src/components/SmallButton.tsx +39 -39
  74. package/src/components/SupportModal.tsx +26 -26
  75. package/src/components/TabPanel.tsx +34 -34
  76. package/src/components/gallery/GalleryModal.tsx +102 -102
  77. package/src/components/gallery/StockPhotos.tsx +74 -74
  78. package/src/components/gallery/index.ts +1 -1
  79. package/src/components/iconPicker/IconNamesList.ts +2240 -2240
  80. package/src/components/iconPicker/IconPicker.tsx +153 -153
  81. package/src/components/index.tsx +24 -24
  82. package/src/components/markdownEditor/Editor.tsx +132 -132
  83. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  84. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  85. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  86. package/src/components/markdownEditor/editor.css +787 -787
  87. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  88. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  89. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  90. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  91. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  92. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  93. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  94. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  95. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  96. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  97. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  98. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  99. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  100. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  101. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  102. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  103. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  104. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  105. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  106. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  107. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  108. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  109. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  110. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  111. package/src/components/markdownEditor/index.ts +2 -2
  112. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  113. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  114. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  115. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  116. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  117. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  118. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  119. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  120. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  121. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  122. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  123. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  124. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  125. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  126. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  127. package/src/components/markdownEditor/plugins/index.ts +6 -6
  128. package/src/components/markdownEditor/theme.ts +65 -65
  129. package/src/components/notes/AddNote.tsx +90 -90
  130. package/src/components/notes/Conversation.tsx +82 -82
  131. package/src/components/notes/Conversations.tsx +58 -58
  132. package/src/components/notes/NewConversation.tsx +78 -78
  133. package/src/components/notes/Note.tsx +44 -44
  134. package/src/components/notes/Notes.tsx +69 -68
  135. package/src/components/notes/index.ts +5 -5
  136. package/src/components/reporting/ChartReport.tsx +98 -98
  137. package/src/components/reporting/ReportFilter.tsx +54 -54
  138. package/src/components/reporting/ReportFilterField.tsx +160 -160
  139. package/src/components/reporting/ReportOutput.tsx +79 -79
  140. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  141. package/src/components/reporting/TableReport.tsx +57 -57
  142. package/src/components/reporting/TreeReport.tsx +111 -111
  143. package/src/components/reporting/index.ts +4 -4
  144. package/src/components/wrapper/AppList.tsx +20 -20
  145. package/src/components/wrapper/ChurchList.tsx +22 -22
  146. package/src/components/wrapper/Drawers.tsx +60 -60
  147. package/src/components/wrapper/NavItem.tsx +41 -41
  148. package/src/components/wrapper/NewPrivateMessage.tsx +103 -103
  149. package/src/components/wrapper/NotificationMenu.tsx +96 -85
  150. package/src/components/wrapper/Notifications.tsx +53 -50
  151. package/src/components/wrapper/PrivateMessageDetails.tsx +24 -23
  152. package/src/components/wrapper/PrivateMessages.tsx +92 -87
  153. package/src/components/wrapper/SiteWrapper.tsx +99 -96
  154. package/src/components/wrapper/TabPanel.tsx +30 -30
  155. package/src/components/wrapper/UserMenu.tsx +106 -106
  156. package/src/components/wrapper/index.tsx +5 -5
  157. package/src/donationComponents/DonationPage.tsx +136 -136
  158. package/src/donationComponents/components/BankForm.tsx +159 -159
  159. package/src/donationComponents/components/CardForm.tsx +104 -104
  160. package/src/donationComponents/components/DonationForm.tsx +235 -235
  161. package/src/donationComponents/components/FundDonation.tsx +49 -49
  162. package/src/donationComponents/components/FundDonations.tsx +39 -39
  163. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  164. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  165. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  166. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  167. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  168. package/src/donationComponents/components/index.tsx +9 -9
  169. package/src/donationComponents/index.ts +3 -3
  170. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  171. package/src/helpers/AnalyticsHelper.ts +33 -33
  172. package/src/helpers/ApiHelper.ts +125 -125
  173. package/src/helpers/AppearanceHelper.ts +69 -69
  174. package/src/helpers/ArrayHelper.ts +81 -81
  175. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  176. package/src/helpers/CurrencyHelper.ts +10 -10
  177. package/src/helpers/DateHelper.ts +109 -108
  178. package/src/helpers/DonationHelper.ts +26 -26
  179. package/src/helpers/ErrorHelper.ts +36 -36
  180. package/src/helpers/EventHelper.ts +52 -52
  181. package/src/helpers/FileHelper.ts +31 -31
  182. package/src/helpers/PersonHelper.ts +60 -60
  183. package/src/helpers/SocketHelper.ts +78 -76
  184. package/src/helpers/Themes.ts +14 -14
  185. package/src/helpers/UniqueIdHelper.ts +36 -36
  186. package/src/helpers/UserHelper.ts +59 -59
  187. package/src/helpers/createEmotionCache.ts +17 -17
  188. package/src/helpers/index.ts +18 -18
  189. package/src/hooks/index.ts +1 -1
  190. package/src/hooks/useMountedState.ts +16 -16
  191. package/src/index.ts +6 -6
  192. package/src/interfaces/Access.ts +24 -24
  193. package/src/interfaces/Attendance.ts +8 -8
  194. package/src/interfaces/Content.ts +10 -10
  195. package/src/interfaces/Doing.ts +24 -24
  196. package/src/interfaces/Donation.ts +45 -45
  197. package/src/interfaces/Error.ts +17 -17
  198. package/src/interfaces/Membership.ts +51 -51
  199. package/src/interfaces/Messaging.ts +11 -21
  200. package/src/interfaces/Permissions.ts +68 -68
  201. package/src/interfaces/Reporting.ts +7 -7
  202. package/src/interfaces/UserContextInterface.ts +13 -13
  203. package/src/interfaces/index.ts +13 -13
  204. package/src/pageComponents/LoginPage.tsx +244 -244
  205. package/src/pageComponents/LogoutPage.tsx +28 -28
  206. package/src/pageComponents/components/Forgot.tsx +79 -79
  207. package/src/pageComponents/components/Login.tsx +54 -54
  208. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  209. package/src/pageComponents/components/Register.tsx +107 -107
  210. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  211. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  212. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  213. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  214. package/src/pageComponents/index.ts +3 -3
  215. package/tsconfig.json +34 -34
  216. package/tslint.json +14 -14
@@ -1,224 +1,224 @@
1
- import { LexicalNode, createCommand, LexicalCommand, $isElementNode, $getSelection, ElementNode, NodeKey, $applyNodeReplacement, $isRangeSelection } from "lexical";
2
- import { LinkNode } from "@lexical/link";
3
- import utils from "@lexical/utils";
4
-
5
- export interface LinkCustomizationAttributes {
6
- url: string;
7
- target?: string;
8
- classNames?: Array<string>;
9
- }
10
-
11
- export class CustomLinkNode extends LinkNode {
12
- __url: string;
13
- __target: string;
14
- __classNames: Array<string>;
15
- constructor(
16
- url: string,
17
- target: string,
18
- classNames: Array<string>,
19
- key?: NodeKey
20
- ) {
21
- super(url, { target }, key);
22
- this.__url = url || "https://";
23
- this.__target = target || "_self";
24
- this.__classNames = classNames || [];
25
- }
26
-
27
- static importJSON(serializedNode: any) {
28
- return super.importJSON(serializedNode);
29
- }
30
-
31
- exportJSON() {
32
- return super.exportJSON();
33
- }
34
-
35
- static getType() : string {
36
- return "customlinknode";
37
- }
38
-
39
- static clone(node : CustomLinkNode) : CustomLinkNode {
40
- const newLinkNode = new CustomLinkNode(node.__url, node.__target, node.__classNames, node.__key);
41
-
42
- return $applyNodeReplacement(newLinkNode);
43
- }
44
-
45
- createDOM() {
46
- const link = document.createElement("a");
47
-
48
- link.href = this.__url;
49
-
50
- link.setAttribute("target", this.__target || "_blank");
51
-
52
- utils.addClassNamesToElement(link, (this.__classNames || []).join(" "));
53
-
54
- return link;
55
- }
56
-
57
- updateDOM(): boolean {
58
- return false;
59
- }
60
-
61
- setClassNames(classNames : Array<string>) : void {
62
- const writable = this.getWritable();
63
-
64
- writable.__classNames = classNames;
65
- }
66
- }
67
-
68
- export const TOGGLE_CUSTOM_LINK_NODE_COMMAND: LexicalCommand<LinkCustomizationAttributes> = createCommand();
69
-
70
- export function $createCustomLinkNode(
71
- url: string,
72
- target: string,
73
- classNames: Array<string>
74
- ): CustomLinkNode {
75
- return $applyNodeReplacement(new CustomLinkNode(url, target, classNames));
76
- }
77
-
78
- export function $isCustomLinkNode(
79
- node: LexicalNode | null | undefined | any
80
- ): node is CustomLinkNode {
81
- return node instanceof LinkNode;
82
- }
83
-
84
- export const toggleCustomLinkNode = (
85
- {
86
- url,
87
- target = "_blank",
88
- classNames = [],
89
- getNodeByKey
90
- } : LinkCustomizationAttributes & {
91
- getNodeByKey: (key: NodeKey) => HTMLElement | null;
92
- }): void => {
93
- const addAttributesToLinkNode = (linkNode: CustomLinkNode, { url, target, classNames}: LinkCustomizationAttributes) => {
94
- const dom = getNodeByKey(linkNode.getKey());
95
-
96
- if (!dom) return;
97
-
98
- const uniqueClassNames = classNames;
99
-
100
- linkNode.setURL(url);
101
- linkNode.setTarget(target);
102
-
103
- linkNode.setClassNames(uniqueClassNames);
104
-
105
- dom.setAttribute("href", url);
106
- dom.setAttribute("target", target);
107
-
108
- dom.setAttribute("class", uniqueClassNames.join(" "));
109
- };
110
-
111
- const selection = $getSelection();
112
-
113
- if (!$isRangeSelection(selection)) {
114
- return;
115
- }
116
-
117
- const nodes = selection.extract();
118
-
119
- if (url === null) {
120
- // Remove LinkNodes
121
- nodes.forEach((node) => {
122
- const parent = node.getParent();
123
-
124
- if ($isCustomLinkNode(parent)) {
125
- const children = parent.getChildren();
126
-
127
- for (let i = 0; i < children.length; i++) {
128
- parent.insertBefore(children[i]);
129
- }
130
-
131
- parent.remove();
132
- }
133
- });
134
- } else {
135
- // Add or merge LinkNodes
136
- if (nodes.length === 1) {
137
- const firstNode = nodes[0];
138
- // if the first node is a LinkNode or if its
139
- // parent is a LinkNode, we update the URL, target and rel.
140
- const linkNode = $isCustomLinkNode(firstNode)
141
- ? firstNode
142
- : $getLinkAncestor(firstNode);
143
- if (linkNode !== null && $isCustomLinkNode(linkNode)) {
144
- addAttributesToLinkNode(linkNode, {url, target, classNames});
145
- return;
146
- }
147
- }
148
-
149
- let prevParent: ElementNode | LinkNode | null = null;
150
- let linkNode: LinkNode | null = null;
151
-
152
- nodes.forEach((node) => {
153
- const parent = node.getParent();
154
-
155
- if (
156
- parent === linkNode
157
- || parent === null
158
- || ($isElementNode(node) && !node.isInline())
159
- ) {
160
- return;
161
- }
162
-
163
- if ($isCustomLinkNode(parent)) {
164
- linkNode = parent;
165
-
166
- addAttributesToLinkNode(parent, {url, target, classNames});
167
-
168
- return;
169
- }
170
-
171
- if (!parent.is(prevParent)) {
172
- prevParent = parent;
173
- linkNode = $createCustomLinkNode(url, target, classNames);
174
-
175
- if ($isCustomLinkNode(parent)) {
176
- if (node.getPreviousSibling() === null) {
177
- parent.insertBefore(linkNode);
178
- } else {
179
- parent.insertAfter(linkNode);
180
- }
181
- } else {
182
- node.insertBefore(linkNode);
183
- }
184
- }
185
-
186
- if ($isCustomLinkNode(node)) {
187
- if (node.is(linkNode)) {
188
- return;
189
- }
190
- if (linkNode !== null) {
191
- const children = node.getChildren();
192
-
193
- for (let i = 0; i < children.length; i++) {
194
- linkNode.append(children[i]);
195
- }
196
- }
197
-
198
- node.remove();
199
- return;
200
- }
201
-
202
- if (linkNode !== null) {
203
- linkNode.append(node);
204
- }
205
- });
206
- }
207
- }
208
-
209
- const $getLinkAncestor = (node: LexicalNode): null | LexicalNode => (
210
- $getAncestor(node, (ancestor) => $isCustomLinkNode(ancestor))
211
- )
212
-
213
- const $getAncestor = (
214
- node: LexicalNode,
215
- predicate: (ancestor: LexicalNode) => boolean
216
- ): null | LexicalNode => {
217
- let parent: null | LexicalNode = node;
218
- while (
219
- parent !== null
220
- && (parent = parent.getParent()) !== null
221
- && !predicate(parent)
222
- );
223
- return parent;
224
- }
1
+ import { LexicalNode, createCommand, LexicalCommand, $isElementNode, $getSelection, ElementNode, NodeKey, $applyNodeReplacement, $isRangeSelection } from "lexical";
2
+ import { LinkNode } from "@lexical/link";
3
+ import utils from "@lexical/utils";
4
+
5
+ export interface LinkCustomizationAttributes {
6
+ url: string;
7
+ target?: string;
8
+ classNames?: Array<string>;
9
+ }
10
+
11
+ export class CustomLinkNode extends LinkNode {
12
+ __url: string;
13
+ __target: string;
14
+ __classNames: Array<string>;
15
+ constructor(
16
+ url: string,
17
+ target: string,
18
+ classNames: Array<string>,
19
+ key?: NodeKey
20
+ ) {
21
+ super(url, { target }, key);
22
+ this.__url = url || "https://";
23
+ this.__target = target || "_self";
24
+ this.__classNames = classNames || [];
25
+ }
26
+
27
+ static importJSON(serializedNode: any) {
28
+ return super.importJSON(serializedNode);
29
+ }
30
+
31
+ exportJSON() {
32
+ return super.exportJSON();
33
+ }
34
+
35
+ static getType() : string {
36
+ return "customlinknode";
37
+ }
38
+
39
+ static clone(node : CustomLinkNode) : CustomLinkNode {
40
+ const newLinkNode = new CustomLinkNode(node.__url, node.__target, node.__classNames, node.__key);
41
+
42
+ return $applyNodeReplacement(newLinkNode);
43
+ }
44
+
45
+ createDOM() {
46
+ const link = document.createElement("a");
47
+
48
+ link.href = this.__url;
49
+
50
+ link.setAttribute("target", this.__target || "_blank");
51
+
52
+ utils.addClassNamesToElement(link, (this.__classNames || []).join(" "));
53
+
54
+ return link;
55
+ }
56
+
57
+ updateDOM(): boolean {
58
+ return false;
59
+ }
60
+
61
+ setClassNames(classNames : Array<string>) : void {
62
+ const writable = this.getWritable();
63
+
64
+ writable.__classNames = classNames;
65
+ }
66
+ }
67
+
68
+ export const TOGGLE_CUSTOM_LINK_NODE_COMMAND: LexicalCommand<LinkCustomizationAttributes> = createCommand();
69
+
70
+ export function $createCustomLinkNode(
71
+ url: string,
72
+ target: string,
73
+ classNames: Array<string>
74
+ ): CustomLinkNode {
75
+ return $applyNodeReplacement(new CustomLinkNode(url, target, classNames));
76
+ }
77
+
78
+ export function $isCustomLinkNode(
79
+ node: LexicalNode | null | undefined | any
80
+ ): node is CustomLinkNode {
81
+ return node instanceof LinkNode;
82
+ }
83
+
84
+ export const toggleCustomLinkNode = (
85
+ {
86
+ url,
87
+ target = "_blank",
88
+ classNames = [],
89
+ getNodeByKey
90
+ } : LinkCustomizationAttributes & {
91
+ getNodeByKey: (key: NodeKey) => HTMLElement | null;
92
+ }): void => {
93
+ const addAttributesToLinkNode = (linkNode: CustomLinkNode, { url, target, classNames}: LinkCustomizationAttributes) => {
94
+ const dom = getNodeByKey(linkNode.getKey());
95
+
96
+ if (!dom) return;
97
+
98
+ const uniqueClassNames = classNames;
99
+
100
+ linkNode.setURL(url);
101
+ linkNode.setTarget(target);
102
+
103
+ linkNode.setClassNames(uniqueClassNames);
104
+
105
+ dom.setAttribute("href", url);
106
+ dom.setAttribute("target", target);
107
+
108
+ dom.setAttribute("class", uniqueClassNames.join(" "));
109
+ };
110
+
111
+ const selection = $getSelection();
112
+
113
+ if (!$isRangeSelection(selection)) {
114
+ return;
115
+ }
116
+
117
+ const nodes = selection.extract();
118
+
119
+ if (url === null) {
120
+ // Remove LinkNodes
121
+ nodes.forEach((node) => {
122
+ const parent = node.getParent();
123
+
124
+ if ($isCustomLinkNode(parent)) {
125
+ const children = parent.getChildren();
126
+
127
+ for (let i = 0; i < children.length; i++) {
128
+ parent.insertBefore(children[i]);
129
+ }
130
+
131
+ parent.remove();
132
+ }
133
+ });
134
+ } else {
135
+ // Add or merge LinkNodes
136
+ if (nodes.length === 1) {
137
+ const firstNode = nodes[0];
138
+ // if the first node is a LinkNode or if its
139
+ // parent is a LinkNode, we update the URL, target and rel.
140
+ const linkNode = $isCustomLinkNode(firstNode)
141
+ ? firstNode
142
+ : $getLinkAncestor(firstNode);
143
+ if (linkNode !== null && $isCustomLinkNode(linkNode)) {
144
+ addAttributesToLinkNode(linkNode, {url, target, classNames});
145
+ return;
146
+ }
147
+ }
148
+
149
+ let prevParent: ElementNode | LinkNode | null = null;
150
+ let linkNode: LinkNode | null = null;
151
+
152
+ nodes.forEach((node) => {
153
+ const parent = node.getParent();
154
+
155
+ if (
156
+ parent === linkNode
157
+ || parent === null
158
+ || ($isElementNode(node) && !node.isInline())
159
+ ) {
160
+ return;
161
+ }
162
+
163
+ if ($isCustomLinkNode(parent)) {
164
+ linkNode = parent;
165
+
166
+ addAttributesToLinkNode(parent, {url, target, classNames});
167
+
168
+ return;
169
+ }
170
+
171
+ if (!parent.is(prevParent)) {
172
+ prevParent = parent;
173
+ linkNode = $createCustomLinkNode(url, target, classNames);
174
+
175
+ if ($isCustomLinkNode(parent)) {
176
+ if (node.getPreviousSibling() === null) {
177
+ parent.insertBefore(linkNode);
178
+ } else {
179
+ parent.insertAfter(linkNode);
180
+ }
181
+ } else {
182
+ node.insertBefore(linkNode);
183
+ }
184
+ }
185
+
186
+ if ($isCustomLinkNode(node)) {
187
+ if (node.is(linkNode)) {
188
+ return;
189
+ }
190
+ if (linkNode !== null) {
191
+ const children = node.getChildren();
192
+
193
+ for (let i = 0; i < children.length; i++) {
194
+ linkNode.append(children[i]);
195
+ }
196
+ }
197
+
198
+ node.remove();
199
+ return;
200
+ }
201
+
202
+ if (linkNode !== null) {
203
+ linkNode.append(node);
204
+ }
205
+ });
206
+ }
207
+ }
208
+
209
+ const $getLinkAncestor = (node: LexicalNode): null | LexicalNode => (
210
+ $getAncestor(node, (ancestor) => $isCustomLinkNode(ancestor))
211
+ )
212
+
213
+ const $getAncestor = (
214
+ node: LexicalNode,
215
+ predicate: (ancestor: LexicalNode) => boolean
216
+ ): null | LexicalNode => {
217
+ let parent: null | LexicalNode = node;
218
+ while (
219
+ parent !== null
220
+ && (parent = parent.getParent()) !== null
221
+ && !predicate(parent)
222
+ );
223
+ return parent;
224
+ }
@@ -1,32 +1,32 @@
1
- import { FC, useEffect } from "react";
2
- import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
3
- import {
4
- LinkCustomizationAttributes,
5
- toggleCustomLinkNode,
6
- TOGGLE_CUSTOM_LINK_NODE_COMMAND
7
- } from "./CustomLinkNode";
8
-
9
- const COMMAND_PRIORITY = 1;
10
-
11
- const CustomLinkNodePlugin: FC = () => {
12
- const [editor] = useLexicalComposerContext();
13
-
14
- useEffect(() => {
15
- editor.registerCommand(
16
- TOGGLE_CUSTOM_LINK_NODE_COMMAND,
17
- (props: LinkCustomizationAttributes) => {
18
- toggleCustomLinkNode({
19
- ...props,
20
- getNodeByKey: (key: string) => editor.getElementByKey(key)
21
- });
22
-
23
- return true;
24
- },
25
- COMMAND_PRIORITY
26
- );
27
- }, [editor]);
28
-
29
- return null;
30
- };
31
-
32
- export default CustomLinkNodePlugin;
1
+ import { FC, useEffect } from "react";
2
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
3
+ import {
4
+ LinkCustomizationAttributes,
5
+ toggleCustomLinkNode,
6
+ TOGGLE_CUSTOM_LINK_NODE_COMMAND
7
+ } from "./CustomLinkNode";
8
+
9
+ const COMMAND_PRIORITY = 1;
10
+
11
+ const CustomLinkNodePlugin: FC = () => {
12
+ const [editor] = useLexicalComposerContext();
13
+
14
+ useEffect(() => {
15
+ editor.registerCommand(
16
+ TOGGLE_CUSTOM_LINK_NODE_COMMAND,
17
+ (props: LinkCustomizationAttributes) => {
18
+ toggleCustomLinkNode({
19
+ ...props,
20
+ getNodeByKey: (key: string) => editor.getElementByKey(key)
21
+ });
22
+
23
+ return true;
24
+ },
25
+ COMMAND_PRIORITY
26
+ );
27
+ }, [editor]);
28
+
29
+ return null;
30
+ };
31
+
32
+ export default CustomLinkNodePlugin;