@churchapps/apphelper 0.1.10 → 0.1.12

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 (190) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +24 -24
  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/markdownEditor/plugins/customLink/FloatingLinkEditor.d.ts.map +1 -1
  31. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.js +30 -15
  32. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.js.map +1 -1
  33. package/package.json +88 -88
  34. package/src/components/CreatePerson.tsx +80 -80
  35. package/src/components/DisplayBox.tsx +68 -68
  36. package/src/components/ErrorMessages.tsx +26 -26
  37. package/src/components/ExportLink.tsx +67 -67
  38. package/src/components/FloatingSupport.tsx +16 -16
  39. package/src/components/FormSubmissionEdit.tsx +120 -120
  40. package/src/components/HelpIcon.tsx +10 -10
  41. package/src/components/ImageEditor.tsx +126 -126
  42. package/src/components/InputBox.tsx +73 -73
  43. package/src/components/Loading.tsx +29 -29
  44. package/src/components/PersonAdd.tsx +75 -75
  45. package/src/components/QuestionEdit.tsx +63 -63
  46. package/src/components/SmallButton.tsx +39 -39
  47. package/src/components/SupportModal.tsx +26 -26
  48. package/src/components/TabPanel.tsx +34 -34
  49. package/src/components/gallery/GalleryModal.tsx +119 -119
  50. package/src/components/gallery/StockPhotos.tsx +74 -74
  51. package/src/components/gallery/index.ts +1 -1
  52. package/src/components/iconPicker/IconNamesList.ts +2240 -2240
  53. package/src/components/iconPicker/IconPicker.tsx +153 -153
  54. package/src/components/index.tsx +24 -24
  55. package/src/components/markdownEditor/Editor.tsx +132 -132
  56. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  57. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  58. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  59. package/src/components/markdownEditor/editor.css +787 -787
  60. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  61. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  62. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  63. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  64. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  65. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  66. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  67. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  68. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  69. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  70. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  71. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  72. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  73. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  74. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  75. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  76. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  77. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  78. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  79. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  80. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  81. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  82. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  83. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  84. package/src/components/markdownEditor/index.ts +2 -2
  85. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  86. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  87. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  88. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  89. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  90. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  91. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  92. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  93. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  94. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +258 -243
  95. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  96. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  97. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  98. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  99. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  100. package/src/components/markdownEditor/plugins/index.ts +6 -6
  101. package/src/components/markdownEditor/theme.ts +65 -65
  102. package/src/components/notes/AddNote.tsx +90 -90
  103. package/src/components/notes/Conversation.tsx +82 -82
  104. package/src/components/notes/Conversations.tsx +58 -58
  105. package/src/components/notes/NewConversation.tsx +78 -78
  106. package/src/components/notes/Note.tsx +44 -44
  107. package/src/components/notes/Notes.tsx +69 -69
  108. package/src/components/notes/index.ts +5 -5
  109. package/src/components/reporting/ChartReport.tsx +98 -98
  110. package/src/components/reporting/ReportFilter.tsx +54 -54
  111. package/src/components/reporting/ReportFilterField.tsx +160 -160
  112. package/src/components/reporting/ReportOutput.tsx +79 -79
  113. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  114. package/src/components/reporting/TableReport.tsx +57 -57
  115. package/src/components/reporting/TreeReport.tsx +111 -111
  116. package/src/components/reporting/index.ts +4 -4
  117. package/src/components/wrapper/AppList.tsx +20 -20
  118. package/src/components/wrapper/ChurchList.tsx +22 -22
  119. package/src/components/wrapper/Drawers.tsx +60 -60
  120. package/src/components/wrapper/NavItem.tsx +41 -41
  121. package/src/components/wrapper/NewPrivateMessage.tsx +103 -103
  122. package/src/components/wrapper/NotificationMenu.tsx +96 -96
  123. package/src/components/wrapper/Notifications.tsx +53 -53
  124. package/src/components/wrapper/PrivateMessageDetails.tsx +24 -24
  125. package/src/components/wrapper/PrivateMessages.tsx +92 -92
  126. package/src/components/wrapper/SiteWrapper.tsx +99 -99
  127. package/src/components/wrapper/TabPanel.tsx +30 -30
  128. package/src/components/wrapper/UserMenu.tsx +106 -106
  129. package/src/components/wrapper/index.tsx +5 -5
  130. package/src/donationComponents/DonationPage.tsx +136 -136
  131. package/src/donationComponents/components/BankForm.tsx +159 -159
  132. package/src/donationComponents/components/CardForm.tsx +104 -104
  133. package/src/donationComponents/components/DonationForm.tsx +235 -235
  134. package/src/donationComponents/components/FundDonation.tsx +49 -49
  135. package/src/donationComponents/components/FundDonations.tsx +39 -39
  136. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  137. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  138. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  139. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  140. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  141. package/src/donationComponents/components/index.tsx +9 -9
  142. package/src/donationComponents/index.ts +3 -3
  143. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  144. package/src/helpers/AnalyticsHelper.ts +33 -33
  145. package/src/helpers/ApiHelper.ts +125 -125
  146. package/src/helpers/AppearanceHelper.ts +69 -69
  147. package/src/helpers/ArrayHelper.ts +81 -81
  148. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  149. package/src/helpers/CurrencyHelper.ts +10 -10
  150. package/src/helpers/DateHelper.ts +109 -109
  151. package/src/helpers/DonationHelper.ts +26 -26
  152. package/src/helpers/ErrorHelper.ts +36 -36
  153. package/src/helpers/EventHelper.ts +52 -52
  154. package/src/helpers/FileHelper.ts +31 -31
  155. package/src/helpers/PersonHelper.ts +60 -60
  156. package/src/helpers/SlugHelper.ts +37 -37
  157. package/src/helpers/SocketHelper.ts +78 -78
  158. package/src/helpers/Themes.ts +14 -14
  159. package/src/helpers/UniqueIdHelper.ts +36 -36
  160. package/src/helpers/UserHelper.ts +59 -59
  161. package/src/helpers/createEmotionCache.ts +17 -17
  162. package/src/helpers/index.ts +19 -19
  163. package/src/hooks/index.ts +1 -1
  164. package/src/hooks/useMountedState.ts +16 -16
  165. package/src/index.ts +6 -6
  166. package/src/interfaces/Access.ts +24 -24
  167. package/src/interfaces/Attendance.ts +8 -8
  168. package/src/interfaces/Content.ts +10 -10
  169. package/src/interfaces/Doing.ts +24 -24
  170. package/src/interfaces/Donation.ts +45 -45
  171. package/src/interfaces/Error.ts +17 -17
  172. package/src/interfaces/Membership.ts +51 -51
  173. package/src/interfaces/Messaging.ts +11 -11
  174. package/src/interfaces/Permissions.ts +68 -68
  175. package/src/interfaces/Reporting.ts +7 -7
  176. package/src/interfaces/UserContextInterface.ts +13 -13
  177. package/src/interfaces/index.ts +13 -13
  178. package/src/pageComponents/LoginPage.tsx +244 -244
  179. package/src/pageComponents/LogoutPage.tsx +28 -28
  180. package/src/pageComponents/components/Forgot.tsx +79 -79
  181. package/src/pageComponents/components/Login.tsx +54 -54
  182. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  183. package/src/pageComponents/components/Register.tsx +107 -107
  184. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  185. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  186. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  187. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  188. package/src/pageComponents/index.ts +3 -3
  189. package/tsconfig.json +34 -34
  190. package/tslint.json +14 -14
@@ -1,20 +1,20 @@
1
- import React from "react";
2
- import { ApiHelper } from "../../helpers/ApiHelper";
3
- import { UserHelper } from "../../helpers/UserHelper";
4
- import { NavItem } from "./NavItem";
5
- import { CommonEnvironmentHelper } from "../../helpers/CommonEnvironmentHelper";
6
- import { LoginUserChurchInterface } from "../../interfaces";
7
-
8
- export interface Props { appName: string; currentUserChurch: LoginUserChurchInterface; router?: any; }
9
-
10
- export const AppList: React.FC<Props> = props => {
11
- const jwt = ApiHelper.getConfig("MembershipApi").jwt;
12
- const churchId = UserHelper.currentUserChurch.church.id;
13
- return (
14
- <>
15
- <NavItem url={`${CommonEnvironmentHelper.ChumsRoot}/login?jwt=${jwt}&churchId=${churchId}`} selected={props.appName === "CHUMS"} external={true} label="Chums" icon="logout" router={props.router} />
16
- <NavItem url={`${CommonEnvironmentHelper.B1Root.replace("{key}", props.currentUserChurch.church.subDomain)}/login?jwt=${jwt}&churchId=${churchId}`} selected={props.appName === "B1.church"} external={true} label="B1.Church" icon="logout" router={props.router} />
17
- <NavItem url={`${CommonEnvironmentHelper.LessonsRoot}/login?jwt=${jwt}&churchId=${churchId}`} selected={props.appName === "Lessons.church"} external={true} label="Lessons.church" icon="logout" router={props.router} />
18
- </>
19
- );
20
- }
1
+ import React from "react";
2
+ import { ApiHelper } from "../../helpers/ApiHelper";
3
+ import { UserHelper } from "../../helpers/UserHelper";
4
+ import { NavItem } from "./NavItem";
5
+ import { CommonEnvironmentHelper } from "../../helpers/CommonEnvironmentHelper";
6
+ import { LoginUserChurchInterface } from "../../interfaces";
7
+
8
+ export interface Props { appName: string; currentUserChurch: LoginUserChurchInterface; router?: any; }
9
+
10
+ export const AppList: React.FC<Props> = props => {
11
+ const jwt = ApiHelper.getConfig("MembershipApi").jwt;
12
+ const churchId = UserHelper.currentUserChurch.church.id;
13
+ return (
14
+ <>
15
+ <NavItem url={`${CommonEnvironmentHelper.ChumsRoot}/login?jwt=${jwt}&churchId=${churchId}`} selected={props.appName === "CHUMS"} external={true} label="Chums" icon="logout" router={props.router} />
16
+ <NavItem url={`${CommonEnvironmentHelper.B1Root.replace("{key}", props.currentUserChurch.church.subDomain)}/login?jwt=${jwt}&churchId=${churchId}`} selected={props.appName === "B1.church"} external={true} label="B1.Church" icon="logout" router={props.router} />
17
+ <NavItem url={`${CommonEnvironmentHelper.LessonsRoot}/login?jwt=${jwt}&churchId=${churchId}`} selected={props.appName === "Lessons.church"} external={true} label="Lessons.church" icon="logout" router={props.router} />
18
+ </>
19
+ );
20
+ }
@@ -1,22 +1,22 @@
1
- import React from "react";
2
- import { LoginUserChurchInterface, UserContextInterface } from "../../interfaces";
3
- import { UserHelper } from "../../helpers/UserHelper";
4
- import { NavItem } from "./NavItem";
5
-
6
- export interface Props { userChurches: LoginUserChurchInterface[], currentUserChurch: LoginUserChurchInterface, context: UserContextInterface }
7
-
8
- export const ChurchList: React.FC<Props> = props => {
9
-
10
- if (props.userChurches.length < 2) return <></>;
11
- else {
12
- let result: JSX.Element[] = [];
13
- const userChurches = props.userChurches.filter(uc => uc.apis.length > 0)
14
- userChurches.forEach(uc => {
15
- const userChurch = uc;
16
- const churchName = uc.church.name;
17
- result.push(<NavItem key={userChurch.church.id} selected={(uc.church.id === props.currentUserChurch.church.id) && true} onClick={() => UserHelper.selectChurch(props.context, userChurch.church.id, null)} label={churchName} icon="church" />);
18
- });
19
-
20
- return <>{result}</>;
21
- }
22
- };
1
+ import React from "react";
2
+ import { LoginUserChurchInterface, UserContextInterface } from "../../interfaces";
3
+ import { UserHelper } from "../../helpers/UserHelper";
4
+ import { NavItem } from "./NavItem";
5
+
6
+ export interface Props { userChurches: LoginUserChurchInterface[], currentUserChurch: LoginUserChurchInterface, context: UserContextInterface }
7
+
8
+ export const ChurchList: React.FC<Props> = props => {
9
+
10
+ if (props.userChurches.length < 2) return <></>;
11
+ else {
12
+ let result: JSX.Element[] = [];
13
+ const userChurches = props.userChurches.filter(uc => uc.apis.length > 0)
14
+ userChurches.forEach(uc => {
15
+ const userChurch = uc;
16
+ const churchName = uc.church.name;
17
+ result.push(<NavItem key={userChurch.church.id} selected={(uc.church.id === props.currentUserChurch.church.id) && true} onClick={() => UserHelper.selectChurch(props.context, userChurch.church.id, null)} label={churchName} icon="church" />);
18
+ });
19
+
20
+ return <>{result}</>;
21
+ }
22
+ };
@@ -1,60 +1,60 @@
1
- import { AppBar, Drawer, styled } from "@mui/material";
2
-
3
- export const OpenDrawer = styled(Drawer)(
4
- ({ theme }) => ({
5
- "& .MuiDrawer-paper": {
6
- position: "relative",
7
- backgroundColor: theme.palette.primary.main,
8
- color: "#FFFFFF",
9
- whiteSpace: "nowrap",
10
- width: "100vw",
11
- zIndex: 9999,
12
- [theme.breakpoints.up("md")]: { width: 220 },
13
- transition: theme.transitions.create("width", {
14
- easing: theme.transitions.easing.sharp,
15
- duration: theme.transitions.duration.enteringScreen
16
- }),
17
- boxSizing: "border-box"
18
- },
19
- "& .MuiListItemButton-root, & .MuiListItemIcon-root": { color: "#FFFFFF" }
20
- })
21
- );
22
-
23
- export const ClosedDrawer = styled(OpenDrawer)(
24
- ({ theme }) => ({
25
- overflowX: "hidden",
26
- transition: theme.transitions.create("width", {
27
- easing: theme.transitions.easing.sharp,
28
- duration: theme.transitions.duration.leavingScreen
29
- }),
30
- zIndex: 1,
31
- width: theme.spacing(7),
32
- [theme.breakpoints.up("sm")]: { width: theme.spacing(7) },
33
- "& .MuiListSubheader-root": {
34
- opacity: 0
35
- }
36
- })
37
- );
38
-
39
- export const ClosedDrawerAppBar = styled(AppBar)(
40
- ({ theme }) => ({
41
- zIndex: theme.zIndex.drawer + 1,
42
- transition: theme.transitions.create(["width", "margin"], {
43
- easing: theme.transitions.easing.sharp,
44
- duration: theme.transitions.duration.leavingScreen
45
- }),
46
- "& .MuiIcon-root": { color: "#FFFFFF" }
47
- })
48
- );
49
-
50
- export const OpenDrawerAppBar = styled(ClosedDrawerAppBar)(
51
- ({ theme }) => ({
52
- marginLeft: 220,
53
- width: `calc(100% - ${220}px)`,
54
- transition: theme.transitions.create(["width", "margin"], {
55
- easing: theme.transitions.easing.sharp,
56
- duration: theme.transitions.duration.enteringScreen
57
- })
58
- })
59
- );
60
-
1
+ import { AppBar, Drawer, styled } from "@mui/material";
2
+
3
+ export const OpenDrawer = styled(Drawer)(
4
+ ({ theme }) => ({
5
+ "& .MuiDrawer-paper": {
6
+ position: "relative",
7
+ backgroundColor: theme.palette.primary.main,
8
+ color: "#FFFFFF",
9
+ whiteSpace: "nowrap",
10
+ width: "100vw",
11
+ zIndex: 9999,
12
+ [theme.breakpoints.up("md")]: { width: 220 },
13
+ transition: theme.transitions.create("width", {
14
+ easing: theme.transitions.easing.sharp,
15
+ duration: theme.transitions.duration.enteringScreen
16
+ }),
17
+ boxSizing: "border-box"
18
+ },
19
+ "& .MuiListItemButton-root, & .MuiListItemIcon-root": { color: "#FFFFFF" }
20
+ })
21
+ );
22
+
23
+ export const ClosedDrawer = styled(OpenDrawer)(
24
+ ({ theme }) => ({
25
+ overflowX: "hidden",
26
+ transition: theme.transitions.create("width", {
27
+ easing: theme.transitions.easing.sharp,
28
+ duration: theme.transitions.duration.leavingScreen
29
+ }),
30
+ zIndex: 1,
31
+ width: theme.spacing(7),
32
+ [theme.breakpoints.up("sm")]: { width: theme.spacing(7) },
33
+ "& .MuiListSubheader-root": {
34
+ opacity: 0
35
+ }
36
+ })
37
+ );
38
+
39
+ export const ClosedDrawerAppBar = styled(AppBar)(
40
+ ({ theme }) => ({
41
+ zIndex: theme.zIndex.drawer + 1,
42
+ transition: theme.transitions.create(["width", "margin"], {
43
+ easing: theme.transitions.easing.sharp,
44
+ duration: theme.transitions.duration.leavingScreen
45
+ }),
46
+ "& .MuiIcon-root": { color: "#FFFFFF" }
47
+ })
48
+ );
49
+
50
+ export const OpenDrawerAppBar = styled(ClosedDrawerAppBar)(
51
+ ({ theme }) => ({
52
+ marginLeft: 220,
53
+ width: `calc(100% - ${220}px)`,
54
+ transition: theme.transitions.create(["width", "margin"], {
55
+ easing: theme.transitions.easing.sharp,
56
+ duration: theme.transitions.duration.enteringScreen
57
+ })
58
+ })
59
+ );
60
+
@@ -1,41 +1,41 @@
1
- import React from "react";
2
- import { Icon, ListItemButton, ListItemIcon, ListItemText, styled, Tooltip } from "@mui/material";
3
- import { NavLink, useLocation } from "react-router-dom";
4
-
5
- interface Props {
6
- url?: string;
7
- target?: string;
8
- label: string;
9
- icon: string;
10
- onClick?: () => void;
11
- router?: any;
12
- external?: boolean;
13
- selected?: boolean;
14
- }
15
-
16
- const StyledNavLink = styled(NavLink)({
17
- textDecoration: "none",
18
- "&:hover": { textDecoration: "none" },
19
- "& .MuiListItemIcon-root": { minWidth: 40 }
20
- });
21
-
22
- export const NavItem: React.FC<Props> = (props) => {
23
- let isReact = false;
24
- try {
25
- const a = typeof useLocation();
26
- if (a !== null) isReact = true;
27
- } catch { }
28
-
29
- const getIcon = () => <Icon>{props.icon}</Icon>
30
-
31
- const getLinkContents = () => (<ListItemButton>
32
- <Tooltip title={props.label || ""} arrow placement="right">
33
- <ListItemIcon sx={{ minWidth: "40px" }}>{getIcon()}</ListItemIcon>
34
- </Tooltip>
35
- <ListItemText primary={props.label} />
36
- </ListItemButton>)
37
-
38
- if (props.router) return (<a href={props.url} target={props.target} onClick={(e) => { e.preventDefault(); props.onClick ? props.onClick() : props.router.push(props.url) }} className={(props.selected) ? "selected" : ""}>{getLinkContents()}</a>)
39
- else if (props.external || !isReact) return (<a href={props.url} target={props.target} rel="noreferrer" style={{ textDecoration: "none" }} className={(props.selected) ? "selected" : ""} onClick={(e) => { e.preventDefault(); props.onClick ? props.onClick() : window.location.href = props.url }}>{getLinkContents()}</a>)
40
- else return (<StyledNavLink to={props.url || "about:blank"} target={props.target} className={(props.selected) ? "selected" : ""} onClick={props.onClick ? (e) => { e.preventDefault(); props.onClick() } : null}>{getLinkContents()}</StyledNavLink>)
41
- };
1
+ import React from "react";
2
+ import { Icon, ListItemButton, ListItemIcon, ListItemText, styled, Tooltip } from "@mui/material";
3
+ import { NavLink, useLocation } from "react-router-dom";
4
+
5
+ interface Props {
6
+ url?: string;
7
+ target?: string;
8
+ label: string;
9
+ icon: string;
10
+ onClick?: () => void;
11
+ router?: any;
12
+ external?: boolean;
13
+ selected?: boolean;
14
+ }
15
+
16
+ const StyledNavLink = styled(NavLink)({
17
+ textDecoration: "none",
18
+ "&:hover": { textDecoration: "none" },
19
+ "& .MuiListItemIcon-root": { minWidth: 40 }
20
+ });
21
+
22
+ export const NavItem: React.FC<Props> = (props) => {
23
+ let isReact = false;
24
+ try {
25
+ const a = typeof useLocation();
26
+ if (a !== null) isReact = true;
27
+ } catch { }
28
+
29
+ const getIcon = () => <Icon>{props.icon}</Icon>
30
+
31
+ const getLinkContents = () => (<ListItemButton>
32
+ <Tooltip title={props.label || ""} arrow placement="right">
33
+ <ListItemIcon sx={{ minWidth: "40px" }}>{getIcon()}</ListItemIcon>
34
+ </Tooltip>
35
+ <ListItemText primary={props.label} />
36
+ </ListItemButton>)
37
+
38
+ if (props.router) return (<a href={props.url} target={props.target} onClick={(e) => { e.preventDefault(); props.onClick ? props.onClick() : props.router.push(props.url) }} className={(props.selected) ? "selected" : ""}>{getLinkContents()}</a>)
39
+ else if (props.external || !isReact) return (<a href={props.url} target={props.target} rel="noreferrer" style={{ textDecoration: "none" }} className={(props.selected) ? "selected" : ""} onClick={(e) => { e.preventDefault(); props.onClick ? props.onClick() : window.location.href = props.url }}>{getLinkContents()}</a>)
40
+ else return (<StyledNavLink to={props.url || "about:blank"} target={props.target} className={(props.selected) ? "selected" : ""} onClick={props.onClick ? (e) => { e.preventDefault(); props.onClick() } : null}>{getLinkContents()}</StyledNavLink>)
41
+ };
@@ -1,103 +1,103 @@
1
- import { Button, TextField, TableRow, TableCell, Table, TableBody } from "@mui/material";
2
- import React from "react";
3
- import { ApiHelper, PersonHelper } from "../../helpers";
4
- import { ConversationInterface, PersonInterface, PrivateMessageInterface, UserContextInterface } from "../../interfaces";
5
- import { AddNote } from "../notes/AddNote";
6
- import { SmallButton } from "../SmallButton";
7
-
8
- interface Props {
9
- context: UserContextInterface;
10
- onSelectMessage: (pm: PrivateMessageInterface) => void
11
- onBack: () => void
12
- }
13
-
14
- export const NewPrivateMessage: React.FC<Props> = (props) => {
15
-
16
- const [searchText, setSearchText] = React.useState("");
17
- const [searchResults, setSearchResults] = React.useState([]);
18
- const [selectedPerson, setSelectedPerson] = React.useState<PersonInterface>(null);
19
-
20
- const handleSubmit = (e: React.MouseEvent) => {
21
- if (e !== null) e.preventDefault();
22
- let term = escape(searchText.trim());
23
- ApiHelper.get("/people/search?term=" + term, "MembershipApi").then(data => setSearchResults(data));
24
- }
25
-
26
- const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
27
- setSearchText(e.currentTarget.value);
28
- }
29
-
30
- /*
31
- const handleKeyDown = (e: React.KeyboardEvent<any>) => {
32
- //if (e.key === "Enter") { e.preventDefault(); handleSubmit(null); }
33
- }
34
- */
35
-
36
- const handlePersonSelected = async (person: PersonInterface) => {
37
- const existing: PrivateMessageInterface = await ApiHelper.get("/privateMessages/existing/" + person.id, "MessagingApi");
38
- if (existing.id) {
39
- existing.person = person;
40
- props.onSelectMessage(existing);
41
- }
42
- else setSelectedPerson(person);
43
- }
44
-
45
- const getPeople = () => {
46
- let result = [];
47
- for (let i = 0; i < searchResults.length; i++) {
48
- const p = searchResults[i];
49
- result.push(<TableRow key={p.id}>
50
- <TableCell><img src={PersonHelper.getPhotoUrl(p)} alt="avatar" /></TableCell>
51
- <TableCell><a href="about:blank" onClick={(e) => { e.preventDefault(); handlePersonSelected(p) }}>{p.name.display}</a></TableCell>
52
- </TableRow>);
53
- }
54
- return result;
55
- }
56
-
57
- const handleNoteAdded = () => {
58
- handlePersonSelected(selectedPerson);
59
- }
60
-
61
- const createConversation = async () => {
62
- const conv: ConversationInterface = { allowAnonymousPosts: false, contentType: "privateMessage", contentId: props.context.person.id, title: props.context.person.name.display + " Private Message", visibility: "hidden" }
63
- const result: ConversationInterface[] = await ApiHelper.post("/conversations", [conv], "MessagingApi");
64
-
65
- const pm: PrivateMessageInterface = {
66
- fromPersonId: props.context.person.id,
67
- toPersonId: selectedPerson.id,
68
- conversationId: result[0].id
69
- }
70
- const privateMessages: PrivateMessageInterface[] = await ApiHelper.post("/privateMessages", [pm], "MessagingApi");
71
- return privateMessages[0].conversationId;
72
- }
73
-
74
- if (!selectedPerson) return (
75
- <div style={{ paddingLeft: 10, paddingRight: 10 }}>
76
- <span style={{ float: "right" }}>
77
- <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
78
- </span>
79
- <b>New Private Message</b>
80
- <div>Search for a person</div>
81
-
82
- <TextField fullWidth label="Name" id="searchText" data-cy="search-input" name="searchText" type="text" placeholder="Name" value={searchText} onChange={handleChange}
83
- InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSubmit}>Search</Button> }}
84
- />
85
- <br />
86
- <Table id="smallPeopleTable" size="small">
87
- <TableBody>{getPeople()}</TableBody>
88
- </Table>
89
- </div>
90
- );
91
- else {
92
- return (
93
- <div style={{ paddingLeft: 10, paddingRight: 10 }}>
94
- <span style={{ float: "right" }}>
95
- <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
96
- </span>
97
- <b>New Private Message</b>
98
- <div>To: {selectedPerson.name.display}</div>
99
- <AddNote context={props.context} conversationId={null} onUpdate={handleNoteAdded} createConversation={createConversation} />
100
- </div>
101
- )
102
- }
103
- }
1
+ import { Button, TextField, TableRow, TableCell, Table, TableBody } from "@mui/material";
2
+ import React from "react";
3
+ import { ApiHelper, PersonHelper } from "../../helpers";
4
+ import { ConversationInterface, PersonInterface, PrivateMessageInterface, UserContextInterface } from "../../interfaces";
5
+ import { AddNote } from "../notes/AddNote";
6
+ import { SmallButton } from "../SmallButton";
7
+
8
+ interface Props {
9
+ context: UserContextInterface;
10
+ onSelectMessage: (pm: PrivateMessageInterface) => void
11
+ onBack: () => void
12
+ }
13
+
14
+ export const NewPrivateMessage: React.FC<Props> = (props) => {
15
+
16
+ const [searchText, setSearchText] = React.useState("");
17
+ const [searchResults, setSearchResults] = React.useState([]);
18
+ const [selectedPerson, setSelectedPerson] = React.useState<PersonInterface>(null);
19
+
20
+ const handleSubmit = (e: React.MouseEvent) => {
21
+ if (e !== null) e.preventDefault();
22
+ let term = escape(searchText.trim());
23
+ ApiHelper.get("/people/search?term=" + term, "MembershipApi").then(data => setSearchResults(data));
24
+ }
25
+
26
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
27
+ setSearchText(e.currentTarget.value);
28
+ }
29
+
30
+ /*
31
+ const handleKeyDown = (e: React.KeyboardEvent<any>) => {
32
+ //if (e.key === "Enter") { e.preventDefault(); handleSubmit(null); }
33
+ }
34
+ */
35
+
36
+ const handlePersonSelected = async (person: PersonInterface) => {
37
+ const existing: PrivateMessageInterface = await ApiHelper.get("/privateMessages/existing/" + person.id, "MessagingApi");
38
+ if (existing.id) {
39
+ existing.person = person;
40
+ props.onSelectMessage(existing);
41
+ }
42
+ else setSelectedPerson(person);
43
+ }
44
+
45
+ const getPeople = () => {
46
+ let result = [];
47
+ for (let i = 0; i < searchResults.length; i++) {
48
+ const p = searchResults[i];
49
+ result.push(<TableRow key={p.id}>
50
+ <TableCell><img src={PersonHelper.getPhotoUrl(p)} alt="avatar" /></TableCell>
51
+ <TableCell><a href="about:blank" onClick={(e) => { e.preventDefault(); handlePersonSelected(p) }}>{p.name.display}</a></TableCell>
52
+ </TableRow>);
53
+ }
54
+ return result;
55
+ }
56
+
57
+ const handleNoteAdded = () => {
58
+ handlePersonSelected(selectedPerson);
59
+ }
60
+
61
+ const createConversation = async () => {
62
+ const conv: ConversationInterface = { allowAnonymousPosts: false, contentType: "privateMessage", contentId: props.context.person.id, title: props.context.person.name.display + " Private Message", visibility: "hidden" }
63
+ const result: ConversationInterface[] = await ApiHelper.post("/conversations", [conv], "MessagingApi");
64
+
65
+ const pm: PrivateMessageInterface = {
66
+ fromPersonId: props.context.person.id,
67
+ toPersonId: selectedPerson.id,
68
+ conversationId: result[0].id
69
+ }
70
+ const privateMessages: PrivateMessageInterface[] = await ApiHelper.post("/privateMessages", [pm], "MessagingApi");
71
+ return privateMessages[0].conversationId;
72
+ }
73
+
74
+ if (!selectedPerson) return (
75
+ <div style={{ paddingLeft: 10, paddingRight: 10 }}>
76
+ <span style={{ float: "right" }}>
77
+ <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
78
+ </span>
79
+ <b>New Private Message</b>
80
+ <div>Search for a person</div>
81
+
82
+ <TextField fullWidth label="Name" id="searchText" data-cy="search-input" name="searchText" type="text" placeholder="Name" value={searchText} onChange={handleChange}
83
+ InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSubmit}>Search</Button> }}
84
+ />
85
+ <br />
86
+ <Table id="smallPeopleTable" size="small">
87
+ <TableBody>{getPeople()}</TableBody>
88
+ </Table>
89
+ </div>
90
+ );
91
+ else {
92
+ return (
93
+ <div style={{ paddingLeft: 10, paddingRight: 10 }}>
94
+ <span style={{ float: "right" }}>
95
+ <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
96
+ </span>
97
+ <b>New Private Message</b>
98
+ <div>To: {selectedPerson.name.display}</div>
99
+ <AddNote context={props.context} conversationId={null} onUpdate={handleNoteAdded} createConversation={createConversation} />
100
+ </div>
101
+ )
102
+ }
103
+ }