@churchapps/apphelper 0.1.6 → 0.1.7

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 +1 -0
  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 +97 -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,63 +1,63 @@
1
- import React from "react";
2
- import { MuiTelInput } from "mui-tel-input";
3
- import { AnswerInterface, QuestionInterface } from "../interfaces";
4
- import { Select, MenuItem, SelectChangeEvent, FormControl, InputLabel, TextField } from "@mui/material";
5
-
6
- interface Props {
7
- answer: AnswerInterface
8
- question: QuestionInterface,
9
- noBackground?: boolean,
10
- changeFunction: (questionId: string, value: string) => void
11
- }
12
-
13
- export const QuestionEdit: React.FC<Props> = ({noBackground = false, ...props}) => {
14
- const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | SelectChangeEvent<string>) => {
15
- props.changeFunction(props.question.id, e.target.value);
16
- }
17
- let q = props.question;
18
-
19
- if (q.fieldType === "Heading") return <h5>{q.title}</h5>;
20
- else {
21
- let input = null;
22
- let choiceOptions = [];
23
- if (q.choices !== undefined && q.choices !== null) {
24
- for (let i = 0; i < q.choices.length; i++) choiceOptions.push(<MenuItem key={i} value={q.choices[i].value}>{q.choices[i].text}</MenuItem>);
25
- }
26
-
27
- let answerValue = (props.answer === null) ? "" : props.answer.value
28
- switch (q.fieldType) {
29
- case "Textbox": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
30
- case "Multiple Choice": {
31
- input = (
32
- <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
33
- <InputLabel>{q.title}</InputLabel>
34
- <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>{choiceOptions}</Select>
35
- </FormControl>);
36
- break;
37
- }
38
- case "Yes/No": {
39
- input = (
40
- <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
41
- <InputLabel>{q.title}</InputLabel>
42
- <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>
43
- <MenuItem value="False">No</MenuItem>
44
- <MenuItem value="True">Yes</MenuItem>
45
- </Select>
46
- </FormControl>);
47
- break;
48
- }
49
- case "Whole Number":
50
- case "Decimal":
51
- input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="number" InputLabelProps={{shrink: true}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />;
52
- break;
53
- case "Date": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="date" InputLabelProps={{shrink: true}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
54
- case "Phone Number": input = <MuiTelInput fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} label={q.title} placeholder="" value={answerValue} onChange={(value) => { props.changeFunction(props.question.id, value); }} defaultCountry="US" focusOnSelectCountry excludedCountries={["TA", "AC"]} />; break;
55
- case "Email": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="email" label={q.title} placeholder="john@doe.com" value={answerValue} onChange={handleChange} />; break;
56
- case "Text Area": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} multiline rows={4} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
57
- default: return null;
58
- }
59
- return input;
60
- }
61
-
62
- }
63
-
1
+ import React from "react";
2
+ import { MuiTelInput } from "mui-tel-input";
3
+ import { AnswerInterface, QuestionInterface } from "../interfaces";
4
+ import { Select, MenuItem, SelectChangeEvent, FormControl, InputLabel, TextField } from "@mui/material";
5
+
6
+ interface Props {
7
+ answer: AnswerInterface
8
+ question: QuestionInterface,
9
+ noBackground?: boolean,
10
+ changeFunction: (questionId: string, value: string) => void
11
+ }
12
+
13
+ export const QuestionEdit: React.FC<Props> = ({noBackground = false, ...props}) => {
14
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | SelectChangeEvent<string>) => {
15
+ props.changeFunction(props.question.id, e.target.value);
16
+ }
17
+ let q = props.question;
18
+
19
+ if (q.fieldType === "Heading") return <h5>{q.title}</h5>;
20
+ else {
21
+ let input = null;
22
+ let choiceOptions = [];
23
+ if (q.choices !== undefined && q.choices !== null) {
24
+ for (let i = 0; i < q.choices.length; i++) choiceOptions.push(<MenuItem key={i} value={q.choices[i].value}>{q.choices[i].text}</MenuItem>);
25
+ }
26
+
27
+ let answerValue = (props.answer === null) ? "" : props.answer.value
28
+ switch (q.fieldType) {
29
+ case "Textbox": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
30
+ case "Multiple Choice": {
31
+ input = (
32
+ <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
33
+ <InputLabel>{q.title}</InputLabel>
34
+ <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>{choiceOptions}</Select>
35
+ </FormControl>);
36
+ break;
37
+ }
38
+ case "Yes/No": {
39
+ input = (
40
+ <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
41
+ <InputLabel>{q.title}</InputLabel>
42
+ <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>
43
+ <MenuItem value="False">No</MenuItem>
44
+ <MenuItem value="True">Yes</MenuItem>
45
+ </Select>
46
+ </FormControl>);
47
+ break;
48
+ }
49
+ case "Whole Number":
50
+ case "Decimal":
51
+ input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="number" InputLabelProps={{shrink: true}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />;
52
+ break;
53
+ case "Date": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="date" InputLabelProps={{shrink: true}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
54
+ case "Phone Number": input = <MuiTelInput fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} label={q.title} placeholder="" value={answerValue} onChange={(value) => { props.changeFunction(props.question.id, value); }} defaultCountry="US" focusOnSelectCountry excludedCountries={["TA", "AC"]} />; break;
55
+ case "Email": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="email" label={q.title} placeholder="john@doe.com" value={answerValue} onChange={handleChange} />; break;
56
+ case "Text Area": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} multiline rows={4} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
57
+ default: return null;
58
+ }
59
+ return input;
60
+ }
61
+
62
+ }
63
+
@@ -1,39 +1,39 @@
1
- import React from "react";
2
- import { Button, Icon, Tooltip } from "@mui/material";
3
- import { Navigate } from "react-router-dom";
4
-
5
- interface Props {
6
- ariaLabel?: string;
7
- text?: string;
8
- icon: string;
9
- color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning";
10
- toolTip?: string;
11
- onClick?: (e: React.MouseEvent) => void;
12
- href?: string;
13
- disabled?: boolean
14
- }
15
-
16
- export const SmallButton = React.forwardRef<HTMLDivElement, Props>((props, ref) => {
17
- const [redirectUrl, setRedirectUrl] = React.useState("");
18
-
19
- const handleClick = (e: React.MouseEvent) => {
20
- e.preventDefault();
21
- if (props.href) setRedirectUrl(props.href);
22
- else props.onClick(e);
23
- }
24
-
25
- const style = (props.text)
26
- ? { backgroundColor: props.color, "& span": { marginRight: 1 } }
27
- : { minWidth: "auto", padding: "4px 4px" }
28
-
29
- if (redirectUrl) return <Navigate to={redirectUrl} />
30
- else return (
31
- <Tooltip title={props.toolTip || ""} arrow placement="top">
32
- <Button sx={style} disabled={props.disabled} variant={props.text ? "outlined" : "text"} color={props.color} aria-label={props.ariaLabel || "editButton"} onClick={handleClick} size="small">
33
- <Icon>{props.icon}</Icon>{(props.text) ? props.text : ""}
34
- </Button>
35
- </Tooltip>
36
- );
37
- });
38
-
39
- SmallButton.displayName = "SmallButton";
1
+ import React from "react";
2
+ import { Button, Icon, Tooltip } from "@mui/material";
3
+ import { Navigate } from "react-router-dom";
4
+
5
+ interface Props {
6
+ ariaLabel?: string;
7
+ text?: string;
8
+ icon: string;
9
+ color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning";
10
+ toolTip?: string;
11
+ onClick?: (e: React.MouseEvent) => void;
12
+ href?: string;
13
+ disabled?: boolean
14
+ }
15
+
16
+ export const SmallButton = React.forwardRef<HTMLDivElement, Props>((props, ref) => {
17
+ const [redirectUrl, setRedirectUrl] = React.useState("");
18
+
19
+ const handleClick = (e: React.MouseEvent) => {
20
+ e.preventDefault();
21
+ if (props.href) setRedirectUrl(props.href);
22
+ else props.onClick(e);
23
+ }
24
+
25
+ const style = (props.text)
26
+ ? { backgroundColor: props.color, "& span": { marginRight: 1 } }
27
+ : { minWidth: "auto", padding: "4px 4px" }
28
+
29
+ if (redirectUrl) return <Navigate to={redirectUrl} />
30
+ else return (
31
+ <Tooltip title={props.toolTip || ""} arrow placement="top">
32
+ <Button sx={style} disabled={props.disabled} variant={props.text ? "outlined" : "text"} color={props.color} aria-label={props.ariaLabel || "editButton"} onClick={handleClick} size="small">
33
+ <Icon>{props.icon}</Icon>{(props.text) ? props.text : ""}
34
+ </Button>
35
+ </Tooltip>
36
+ );
37
+ });
38
+
39
+ SmallButton.displayName = "SmallButton";
@@ -1,26 +1,26 @@
1
- import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Icon, Stack } from "@mui/material";
2
- import React from "react";
3
-
4
- interface Props {
5
- appName?: string
6
- onClose: () => void
7
- }
8
-
9
- export const SupportModal: React.FC<Props> = ({ appName = "", onClose }) => {
10
- const subject = appName ? `?subject=${appName} Support` : ""
11
-
12
- return (<>
13
- <Dialog open={true} onClose={onClose}>
14
- <DialogTitle>Get Support</DialogTitle>
15
- <DialogContent>
16
- <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>mail</Icon> Email:</Stack></b> <a href={"mailto:support@livecs.org" + subject}>support@livecs.org</a></Stack>
17
- <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>phone_iphone</Icon> Phone:</Stack></b> <a href="tel:+19189942638">+1 (918) 994-2638</a></Stack>
18
- <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>forum</Icon> Messenger:</Stack></b> <a href="https://m.me/livecsolutions" target="_new">https://m.me/livecsolutions</a></Stack>
19
- <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>info</Icon> Knowledge Base:</Stack></b> <a href="https://support.churchapps.org" target="_new">https://support.churchapps.org</a></Stack>
20
- </DialogContent>
21
- <DialogActions sx={{ paddingX: "16px", paddingBottom: "12px" }}>
22
- <Button variant="outlined" onClick={onClose}>Close</Button>
23
- </DialogActions>
24
- </Dialog>
25
- </>);
26
- };
1
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Icon, Stack } from "@mui/material";
2
+ import React from "react";
3
+
4
+ interface Props {
5
+ appName?: string
6
+ onClose: () => void
7
+ }
8
+
9
+ export const SupportModal: React.FC<Props> = ({ appName = "", onClose }) => {
10
+ const subject = appName ? `?subject=${appName} Support` : ""
11
+
12
+ return (<>
13
+ <Dialog open={true} onClose={onClose}>
14
+ <DialogTitle>Get Support</DialogTitle>
15
+ <DialogContent>
16
+ <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>mail</Icon> Email:</Stack></b> <a href={"mailto:support@livecs.org" + subject}>support@livecs.org</a></Stack>
17
+ <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>phone_iphone</Icon> Phone:</Stack></b> <a href="tel:+19189942638">+1 (918) 994-2638</a></Stack>
18
+ <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>forum</Icon> Messenger:</Stack></b> <a href="https://m.me/livecsolutions" target="_new">https://m.me/livecsolutions</a></Stack>
19
+ <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>info</Icon> Knowledge Base:</Stack></b> <a href="https://support.churchapps.org" target="_new">https://support.churchapps.org</a></Stack>
20
+ </DialogContent>
21
+ <DialogActions sx={{ paddingX: "16px", paddingBottom: "12px" }}>
22
+ <Button variant="outlined" onClick={onClose}>Close</Button>
23
+ </DialogActions>
24
+ </Dialog>
25
+ </>);
26
+ };
@@ -1,34 +1,34 @@
1
- import { Box, styled } from "@mui/material";
2
- import React from "react"
3
-
4
- interface Props {
5
- children?: React.ReactNode;
6
- index: number;
7
- value: number;
8
- }
9
-
10
- export const TabPanel: React.FC<Props> = (props: Props) => {
11
-
12
- const { children, value, index } = props;
13
- const StyledMenuBox = styled(Box)(
14
- ({ theme }) => ({
15
- paddingTop: 10,
16
- "& .MuiListItemButton-root": { paddingLeft: 30 },
17
- "& .MuiListItemIcon-root": {
18
- color: theme.palette.primary.main
19
- },
20
- "& .MuiListItemText-root": { color: theme.palette.text.primary },
21
- "& .selected .MuiListItemText-root span": { fontWeight: "bold" }
22
- })
23
- );
24
-
25
- return (
26
- <div role="tabpanel" hidden={value !== index} id={`userMenuPanel-${index}`}>
27
- {value === index && (
28
- <StyledMenuBox>
29
- <Box>{children}</Box>
30
- </StyledMenuBox>
31
- )}
32
- </div>
33
- );
34
- }
1
+ import { Box, styled } from "@mui/material";
2
+ import React from "react"
3
+
4
+ interface Props {
5
+ children?: React.ReactNode;
6
+ index: number;
7
+ value: number;
8
+ }
9
+
10
+ export const TabPanel: React.FC<Props> = (props: Props) => {
11
+
12
+ const { children, value, index } = props;
13
+ const StyledMenuBox = styled(Box)(
14
+ ({ theme }) => ({
15
+ paddingTop: 10,
16
+ "& .MuiListItemButton-root": { paddingLeft: 30 },
17
+ "& .MuiListItemIcon-root": {
18
+ color: theme.palette.primary.main
19
+ },
20
+ "& .MuiListItemText-root": { color: theme.palette.text.primary },
21
+ "& .selected .MuiListItemText-root span": { fontWeight: "bold" }
22
+ })
23
+ );
24
+
25
+ return (
26
+ <div role="tabpanel" hidden={value !== index} id={`userMenuPanel-${index}`}>
27
+ {value === index && (
28
+ <StyledMenuBox>
29
+ <Box>{children}</Box>
30
+ </StyledMenuBox>
31
+ )}
32
+ </div>
33
+ );
34
+ }
@@ -1,102 +1,102 @@
1
- import { FileHelper, ApiHelper } from "../../helpers";
2
- import { CommonEnvironmentHelper } from "../../helpers/CommonEnvironmentHelper";
3
- import { } from "../../helpers";
4
- import { Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, Grid, InputLabel, MenuItem, Select, Tab, Tabs } from "@mui/material";
5
- import React, { useState } from "react";
6
- import { ImageEditor } from "../ImageEditor";
7
- import { TabPanel } from "../TabPanel";
8
- import { StockPhotos } from "./StockPhotos";
9
-
10
- interface Props {
11
- aspectRatio: number,
12
- onClose: () => void,
13
- onSelect: (img: string) => void
14
- }
15
-
16
- export const GalleryModal: React.FC<Props> = (props: Props) => {
17
- const [images, setImages] = useState<string[]>([]);
18
- const [tabIndex, setTabIndex] = React.useState(0);
19
- const [aspectRatio, setAspectRatio] = React.useState(Math.round(props.aspectRatio * 100) / 100);
20
- const [editorPhotoUrl, setEditorPhotoUrl] = React.useState("");
21
-
22
- const handleTabChange = (el: any, newValue: any) => { setTabIndex(newValue); }
23
-
24
- const loadData = () => { ApiHelper.get("/gallery/" + aspectRatio.toString(), "ContentApi").then(data => setImages(data.images)); }
25
-
26
- const handleImageUpdated = async (dataUrl: string) => {
27
- const fileName = Math.floor(Date.now() / 1000).toString() + ".jpg"
28
- const blob = FileHelper.dataURLtoBlob(dataUrl);
29
- const file = new File([blob], "file_name");
30
-
31
- const params = { folder: aspectRatio.toString(), fileName };
32
- const presigned = await ApiHelper.post("/gallery/requestUpload", params, "ContentApi");
33
- const doUpload = presigned.key !== undefined;
34
- if (doUpload) await FileHelper.postPresignedFile(presigned, file, () => { });
35
- //return doUpload;
36
- setTabIndex(0);
37
- loadData();
38
- };
39
-
40
- React.useEffect(() => { if (aspectRatio !== props.aspectRatio) setAspectRatio(Math.round(props.aspectRatio * 100) / 100) }, [props.aspectRatio]); //eslint-disable-line
41
- React.useEffect(loadData, [aspectRatio]); //eslint-disable-line
42
-
43
- const getImages = () => {
44
- let result: JSX.Element[] = [];
45
- images.forEach(img => {
46
- result.push(<Grid item md={4} xs={12}>
47
- <a href="about:blank" onClick={(e) => { e.preventDefault(); props.onSelect(CommonEnvironmentHelper.ContentRoot + "/" + img) }}>
48
- <img src={CommonEnvironmentHelper.ContentRoot + "/" + img} className="img-fluid" alt="custom" />
49
- </a>
50
- </Grid>);
51
- })
52
- return result;
53
- }
54
-
55
- const handleStockSelect = (url: string) => {
56
- setEditorPhotoUrl(url);
57
- setTabIndex(1);
58
- }
59
-
60
- return (<>
61
- <Dialog open={true} onClose={props.onClose}>
62
- <DialogTitle>Select a Photo</DialogTitle>
63
- <DialogContent style={{ minWidth: 600 }}>
64
-
65
- <Tabs variant="fullWidth" value={tabIndex} onChange={handleTabChange}>
66
- <Tab label="Gallery" />
67
- <Tab label="Upload" />
68
- <Tab label="Stock Photos" />
69
- </Tabs>
70
- <TabPanel value={tabIndex} index={0}>
71
- {(props.aspectRatio === 0) && (
72
- <FormControl fullWidth>
73
- <InputLabel>Aspect Ratio</InputLabel>
74
- <Select size="small" label="Aspect Ratio" name="aspectRatio" value={aspectRatio} onChange={(e) => setAspectRatio(parseFloat(e.target.value.toString()))}>
75
- <MenuItem value="0">Free Form</MenuItem>
76
- <MenuItem value="1">1:1</MenuItem>
77
- <MenuItem value="2">2:1</MenuItem>
78
- <MenuItem value="4">4:1</MenuItem>
79
- <MenuItem value="1.33">4:3</MenuItem>
80
- <MenuItem value="1.78">16:9</MenuItem>
81
- <MenuItem value="0.5">1:2</MenuItem>
82
- <MenuItem value="0.5625">9:16</MenuItem>
83
- </Select>
84
- </FormControl>
85
- )}
86
- <Grid container spacing={3} alignItems="center">
87
- {getImages()}
88
- </Grid>
89
- </TabPanel>
90
- <TabPanel value={tabIndex} index={1}>
91
- <ImageEditor onUpdate={handleImageUpdated} photoUrl={editorPhotoUrl} aspectRatio={aspectRatio} outputWidth={1280} outputHeight={768} hideDelete={true} />
92
- </TabPanel>
93
- <TabPanel value={tabIndex} index={2}>
94
- <StockPhotos aspectRatio={aspectRatio} onSelect={props.onSelect} onStockSelect={handleStockSelect} />
95
- </TabPanel>
96
- </DialogContent>
97
- <DialogActions sx={{ paddingX: "16px", paddingBottom: "12px" }}>
98
- <Button variant="outlined" onClick={props.onClose}>Close</Button>
99
- </DialogActions>
100
- </Dialog>
101
- </>);
102
- };
1
+ import { FileHelper, ApiHelper } from "../../helpers";
2
+ import { CommonEnvironmentHelper } from "../../helpers/CommonEnvironmentHelper";
3
+ import { } from "../../helpers";
4
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, Grid, InputLabel, MenuItem, Select, Tab, Tabs } from "@mui/material";
5
+ import React, { useState } from "react";
6
+ import { ImageEditor } from "../ImageEditor";
7
+ import { TabPanel } from "../TabPanel";
8
+ import { StockPhotos } from "./StockPhotos";
9
+
10
+ interface Props {
11
+ aspectRatio: number,
12
+ onClose: () => void,
13
+ onSelect: (img: string) => void
14
+ }
15
+
16
+ export const GalleryModal: React.FC<Props> = (props: Props) => {
17
+ const [images, setImages] = useState<string[]>([]);
18
+ const [tabIndex, setTabIndex] = React.useState(0);
19
+ const [aspectRatio, setAspectRatio] = React.useState(Math.round(props.aspectRatio * 100) / 100);
20
+ const [editorPhotoUrl, setEditorPhotoUrl] = React.useState("");
21
+
22
+ const handleTabChange = (el: any, newValue: any) => { setTabIndex(newValue); }
23
+
24
+ const loadData = () => { ApiHelper.get("/gallery/" + aspectRatio.toString(), "ContentApi").then(data => setImages(data.images)); }
25
+
26
+ const handleImageUpdated = async (dataUrl: string) => {
27
+ const fileName = Math.floor(Date.now() / 1000).toString() + ".jpg"
28
+ const blob = FileHelper.dataURLtoBlob(dataUrl);
29
+ const file = new File([blob], "file_name");
30
+
31
+ const params = { folder: aspectRatio.toString(), fileName };
32
+ const presigned = await ApiHelper.post("/gallery/requestUpload", params, "ContentApi");
33
+ const doUpload = presigned.key !== undefined;
34
+ if (doUpload) await FileHelper.postPresignedFile(presigned, file, () => { });
35
+ //return doUpload;
36
+ setTabIndex(0);
37
+ loadData();
38
+ };
39
+
40
+ React.useEffect(() => { if (aspectRatio !== props.aspectRatio) setAspectRatio(Math.round(props.aspectRatio * 100) / 100) }, [props.aspectRatio]); //eslint-disable-line
41
+ React.useEffect(loadData, [aspectRatio]); //eslint-disable-line
42
+
43
+ const getImages = () => {
44
+ let result: JSX.Element[] = [];
45
+ images.forEach(img => {
46
+ result.push(<Grid item md={4} xs={12}>
47
+ <a href="about:blank" onClick={(e) => { e.preventDefault(); props.onSelect(CommonEnvironmentHelper.ContentRoot + "/" + img) }}>
48
+ <img src={CommonEnvironmentHelper.ContentRoot + "/" + img} className="img-fluid" alt="custom" />
49
+ </a>
50
+ </Grid>);
51
+ })
52
+ return result;
53
+ }
54
+
55
+ const handleStockSelect = (url: string) => {
56
+ setEditorPhotoUrl(url);
57
+ setTabIndex(1);
58
+ }
59
+
60
+ return (<>
61
+ <Dialog open={true} onClose={props.onClose}>
62
+ <DialogTitle>Select a Photo</DialogTitle>
63
+ <DialogContent style={{ minWidth: 600 }}>
64
+
65
+ <Tabs variant="fullWidth" value={tabIndex} onChange={handleTabChange}>
66
+ <Tab label="Gallery" />
67
+ <Tab label="Upload" />
68
+ <Tab label="Stock Photos" />
69
+ </Tabs>
70
+ <TabPanel value={tabIndex} index={0}>
71
+ {(props.aspectRatio === 0) && (
72
+ <FormControl fullWidth>
73
+ <InputLabel>Aspect Ratio</InputLabel>
74
+ <Select size="small" label="Aspect Ratio" name="aspectRatio" value={aspectRatio} onChange={(e) => setAspectRatio(parseFloat(e.target.value.toString()))}>
75
+ <MenuItem value="0">Free Form</MenuItem>
76
+ <MenuItem value="1">1:1</MenuItem>
77
+ <MenuItem value="2">2:1</MenuItem>
78
+ <MenuItem value="4">4:1</MenuItem>
79
+ <MenuItem value="1.33">4:3</MenuItem>
80
+ <MenuItem value="1.78">16:9</MenuItem>
81
+ <MenuItem value="0.5">1:2</MenuItem>
82
+ <MenuItem value="0.5625">9:16</MenuItem>
83
+ </Select>
84
+ </FormControl>
85
+ )}
86
+ <Grid container spacing={3} alignItems="center">
87
+ {getImages()}
88
+ </Grid>
89
+ </TabPanel>
90
+ <TabPanel value={tabIndex} index={1}>
91
+ <ImageEditor onUpdate={handleImageUpdated} photoUrl={editorPhotoUrl} aspectRatio={aspectRatio} outputWidth={1280} outputHeight={768} hideDelete={true} />
92
+ </TabPanel>
93
+ <TabPanel value={tabIndex} index={2}>
94
+ <StockPhotos aspectRatio={aspectRatio} onSelect={props.onSelect} onStockSelect={handleStockSelect} />
95
+ </TabPanel>
96
+ </DialogContent>
97
+ <DialogActions sx={{ paddingX: "16px", paddingBottom: "12px" }}>
98
+ <Button variant="outlined" onClick={props.onClose}>Close</Button>
99
+ </DialogActions>
100
+ </Dialog>
101
+ </>);
102
+ };