@churchapps/apphelper 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +16 -16
  5. package/dist/components/ExportLink.d.ts.map +1 -1
  6. package/dist/components/ExportLink.js +3 -2
  7. package/dist/components/ExportLink.js.map +1 -1
  8. package/dist/components/markdownEditor/editor.css +787 -787
  9. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  10. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  11. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  12. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  13. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  14. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  15. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  16. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  17. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  18. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  19. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  20. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  21. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  22. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  23. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  26. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  27. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  29. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  30. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  31. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  32. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  33. package/dist/components/material/SiteWrapper.js +2 -2
  34. package/dist/components/material/SiteWrapper.js.map +1 -1
  35. package/dist/helpers/SocketHelper.d.ts +3 -3
  36. package/dist/helpers/SocketHelper.d.ts.map +1 -1
  37. package/dist/helpers/SocketHelper.js +6 -6
  38. package/dist/helpers/SocketHelper.js.map +1 -1
  39. package/dist/interfaces/Messaging.d.ts +1 -2
  40. package/dist/interfaces/Messaging.d.ts.map +1 -1
  41. package/package.json +84 -84
  42. package/src/components/CreatePerson.tsx +80 -80
  43. package/src/components/DisplayBox.tsx +68 -68
  44. package/src/components/ErrorMessages.tsx +26 -26
  45. package/src/components/ExportLink.tsx +67 -66
  46. package/src/components/FloatingSupport.tsx +16 -16
  47. package/src/components/FormSubmissionEdit.tsx +120 -120
  48. package/src/components/HelpIcon.tsx +10 -10
  49. package/src/components/ImageEditor.tsx +126 -126
  50. package/src/components/InputBox.tsx +73 -73
  51. package/src/components/Loading.tsx +29 -29
  52. package/src/components/PersonAdd.tsx +75 -75
  53. package/src/components/QuestionEdit.tsx +62 -62
  54. package/src/components/SmallButton.tsx +39 -39
  55. package/src/components/SupportModal.tsx +26 -26
  56. package/src/components/TabPanel.tsx +34 -34
  57. package/src/components/gallery/GalleryModal.tsx +102 -102
  58. package/src/components/gallery/StockPhotos.tsx +74 -74
  59. package/src/components/gallery/index.ts +1 -1
  60. package/src/components/index.tsx +23 -23
  61. package/src/components/markdownEditor/Editor.tsx +132 -132
  62. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  63. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  64. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  65. package/src/components/markdownEditor/editor.css +787 -787
  66. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  67. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  68. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  69. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  70. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  71. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  72. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  73. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  74. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  75. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  76. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  77. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  78. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  79. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  80. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  81. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  82. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  83. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  84. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  85. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  86. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  87. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  88. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  89. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  90. package/src/components/markdownEditor/index.ts +2 -2
  91. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  92. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  93. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  94. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  95. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  96. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  97. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  98. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  99. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  100. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  101. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  102. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  103. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  104. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  105. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  106. package/src/components/markdownEditor/plugins/index.ts +6 -6
  107. package/src/components/markdownEditor/theme.ts +65 -65
  108. package/src/components/material/AppList.tsx +20 -20
  109. package/src/components/material/ChurchList.tsx +22 -22
  110. package/src/components/material/NavItem.tsx +41 -41
  111. package/src/components/material/NewPrivateMessage.tsx +103 -103
  112. package/src/components/material/PrivateMessageDetails.tsx +23 -23
  113. package/src/components/material/PrivateMessages.tsx +87 -87
  114. package/src/components/material/SiteWrapper.tsx +140 -140
  115. package/src/components/material/UserMenu.tsx +141 -141
  116. package/src/components/material/iconPicker/IconNamesList.ts +2240 -2240
  117. package/src/components/material/iconPicker/IconPicker.tsx +153 -153
  118. package/src/components/material/index.tsx +6 -6
  119. package/src/components/notes/AddNote.tsx +90 -90
  120. package/src/components/notes/Conversation.tsx +82 -82
  121. package/src/components/notes/Conversations.tsx +58 -58
  122. package/src/components/notes/NewConversation.tsx +78 -78
  123. package/src/components/notes/Note.tsx +44 -44
  124. package/src/components/notes/Notes.tsx +52 -52
  125. package/src/components/notes/index.ts +5 -5
  126. package/src/components/reporting/ChartReport.tsx +98 -98
  127. package/src/components/reporting/ReportFilter.tsx +54 -54
  128. package/src/components/reporting/ReportFilterField.tsx +160 -160
  129. package/src/components/reporting/ReportOutput.tsx +79 -79
  130. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  131. package/src/components/reporting/TableReport.tsx +57 -57
  132. package/src/components/reporting/TreeReport.tsx +111 -111
  133. package/src/components/reporting/index.ts +4 -4
  134. package/src/donationComponents/DonationPage.tsx +136 -136
  135. package/src/donationComponents/components/BankForm.tsx +159 -159
  136. package/src/donationComponents/components/CardForm.tsx +104 -104
  137. package/src/donationComponents/components/DonationForm.tsx +235 -235
  138. package/src/donationComponents/components/FundDonation.tsx +49 -49
  139. package/src/donationComponents/components/FundDonations.tsx +39 -39
  140. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  141. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  142. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  143. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  144. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  145. package/src/donationComponents/components/index.tsx +9 -9
  146. package/src/donationComponents/index.ts +3 -3
  147. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  148. package/src/helpers/AnalyticsHelper.ts +33 -33
  149. package/src/helpers/ApiHelper.ts +125 -125
  150. package/src/helpers/AppearanceHelper.ts +69 -69
  151. package/src/helpers/ArrayHelper.ts +81 -81
  152. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  153. package/src/helpers/CurrencyHelper.ts +10 -10
  154. package/src/helpers/DateHelper.ts +108 -108
  155. package/src/helpers/DonationHelper.ts +26 -26
  156. package/src/helpers/ErrorHelper.ts +36 -36
  157. package/src/helpers/EventHelper.ts +52 -52
  158. package/src/helpers/FileHelper.ts +31 -31
  159. package/src/helpers/PersonHelper.ts +60 -60
  160. package/src/helpers/SocketHelper.ts +76 -76
  161. package/src/helpers/Themes.ts +14 -14
  162. package/src/helpers/UniqueIdHelper.ts +36 -36
  163. package/src/helpers/UserHelper.ts +59 -59
  164. package/src/helpers/createEmotionCache.ts +17 -17
  165. package/src/helpers/index.ts +18 -18
  166. package/src/hooks/index.ts +1 -1
  167. package/src/hooks/useMountedState.ts +16 -16
  168. package/src/index.ts +6 -6
  169. package/src/interfaces/Access.ts +24 -24
  170. package/src/interfaces/Attendance.ts +8 -8
  171. package/src/interfaces/Content.ts +10 -10
  172. package/src/interfaces/Doing.ts +24 -24
  173. package/src/interfaces/Donation.ts +45 -45
  174. package/src/interfaces/Error.ts +17 -17
  175. package/src/interfaces/Membership.ts +51 -51
  176. package/src/interfaces/Messaging.ts +20 -20
  177. package/src/interfaces/Permissions.ts +68 -68
  178. package/src/interfaces/Reporting.ts +7 -7
  179. package/src/interfaces/UserContextInterface.ts +13 -13
  180. package/src/interfaces/index.ts +13 -13
  181. package/src/pageComponents/LoginPage.tsx +244 -244
  182. package/src/pageComponents/LogoutPage.tsx +28 -28
  183. package/src/pageComponents/components/Forgot.tsx +79 -79
  184. package/src/pageComponents/components/Login.tsx +54 -54
  185. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  186. package/src/pageComponents/components/Register.tsx +107 -107
  187. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  188. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  189. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  190. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  191. package/src/pageComponents/index.ts +3 -3
  192. package/tsconfig.json +34 -34
  193. package/tslint.json +14 -14
@@ -1,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
+ };
@@ -1,74 +1,74 @@
1
- import { Button, Grid, TextField } from "@mui/material";
2
- import React, { useState } from "react";
3
- import { ApiHelper } from "../../helpers";
4
- import { CommonEnvironmentHelper } from "../../helpers/CommonEnvironmentHelper";
5
-
6
- interface Props {
7
- aspectRatio: number,
8
- onSelect: (img: string) => void,
9
- onStockSelect: (img: string) => void
10
- }
11
-
12
- interface SearchResult { description: string, url: string, photographer: string, photographerUrl: string, large: string, thumbnail: string }
13
-
14
- export const StockPhotos: React.FC<Props> = (props: Props) => {
15
- const [images, setImages] = useState<string[]>([]);
16
- const [searchText, setSearchText] = useState("");
17
- const [searchResults, setSearchResults] = useState<SearchResult[]>(null);
18
-
19
- const loadData = () => { ApiHelper.getAnonymous("/gallery/stock/" + props.aspectRatio.toString(), "ContentApi").then(data => setImages(data.images)); }
20
-
21
- React.useEffect(loadData, [props.aspectRatio]); //eslint-disable-line
22
-
23
- const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { e.preventDefault(); setSearchText(e.currentTarget.value); }
24
-
25
- const handleSearch = (e: React.MouseEvent) => {
26
- if (e !== null) e.preventDefault();
27
- let term = searchText.trim();
28
- ApiHelper.post("/stock/search", { term: term }, "ContentApi").then((data: SearchResult[]) => { setSearchResults(data) });
29
- }
30
-
31
- const getImages = () => {
32
- if (searchResults) return getResults();
33
- else return getSuggested();
34
- }
35
-
36
- const getResults = () => {
37
- let result: JSX.Element[] = [];
38
- searchResults.forEach(p => {
39
- result.push(<Grid item md={4} xs={12}>
40
- <a href="about:blank" onClick={(e) => { e.preventDefault(); props.onStockSelect(p.large) }}>
41
- <img src={p.thumbnail} className="img-fluid" alt="stock" />
42
- </a>
43
- <div>
44
- <i style={{ fontSize: 12 }}>
45
- <a href={p.url} target="_blank" rel="noreferrer noopener">Photo</a> by: <a href={p.photographerUrl} target="_blank" rel="noreferrer noopener">{p.photographer}</a></i>
46
- </div>
47
- </Grid>);
48
- })
49
- return result;
50
- }
51
-
52
- const getSuggested = () => {
53
- let result: JSX.Element[] = [];
54
- images.forEach(img => {
55
- result.push(<Grid item md={4} xs={12}>
56
- <a href="about:blank" onClick={(e) => { e.preventDefault(); props.onSelect(CommonEnvironmentHelper.ContentRoot + "/" + img) }}>
57
- <img src={CommonEnvironmentHelper.ContentRoot + "/" + img} className="img-fluid" alt="stock" />
58
- </a>
59
- </Grid>);
60
- })
61
- return result;
62
- }
63
-
64
- return (<>
65
- <TextField fullWidth name="personAddText" label="Search Term" value={searchText} onChange={handleChange}
66
- InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSearch}>Search</Button> }}
67
- />
68
- {searchResults && <div>Stock photos provided by <a href="https://pexels.com">Pexels</a>.</div>}
69
- <Grid container spacing={3} alignItems="center">
70
- {getImages()}
71
- </Grid>
72
-
73
- </>);
74
- };
1
+ import { Button, Grid, TextField } from "@mui/material";
2
+ import React, { useState } from "react";
3
+ import { ApiHelper } from "../../helpers";
4
+ import { CommonEnvironmentHelper } from "../../helpers/CommonEnvironmentHelper";
5
+
6
+ interface Props {
7
+ aspectRatio: number,
8
+ onSelect: (img: string) => void,
9
+ onStockSelect: (img: string) => void
10
+ }
11
+
12
+ interface SearchResult { description: string, url: string, photographer: string, photographerUrl: string, large: string, thumbnail: string }
13
+
14
+ export const StockPhotos: React.FC<Props> = (props: Props) => {
15
+ const [images, setImages] = useState<string[]>([]);
16
+ const [searchText, setSearchText] = useState("");
17
+ const [searchResults, setSearchResults] = useState<SearchResult[]>(null);
18
+
19
+ const loadData = () => { ApiHelper.getAnonymous("/gallery/stock/" + props.aspectRatio.toString(), "ContentApi").then(data => setImages(data.images)); }
20
+
21
+ React.useEffect(loadData, [props.aspectRatio]); //eslint-disable-line
22
+
23
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { e.preventDefault(); setSearchText(e.currentTarget.value); }
24
+
25
+ const handleSearch = (e: React.MouseEvent) => {
26
+ if (e !== null) e.preventDefault();
27
+ let term = searchText.trim();
28
+ ApiHelper.post("/stock/search", { term: term }, "ContentApi").then((data: SearchResult[]) => { setSearchResults(data) });
29
+ }
30
+
31
+ const getImages = () => {
32
+ if (searchResults) return getResults();
33
+ else return getSuggested();
34
+ }
35
+
36
+ const getResults = () => {
37
+ let result: JSX.Element[] = [];
38
+ searchResults.forEach(p => {
39
+ result.push(<Grid item md={4} xs={12}>
40
+ <a href="about:blank" onClick={(e) => { e.preventDefault(); props.onStockSelect(p.large) }}>
41
+ <img src={p.thumbnail} className="img-fluid" alt="stock" />
42
+ </a>
43
+ <div>
44
+ <i style={{ fontSize: 12 }}>
45
+ <a href={p.url} target="_blank" rel="noreferrer noopener">Photo</a> by: <a href={p.photographerUrl} target="_blank" rel="noreferrer noopener">{p.photographer}</a></i>
46
+ </div>
47
+ </Grid>);
48
+ })
49
+ return result;
50
+ }
51
+
52
+ const getSuggested = () => {
53
+ let result: JSX.Element[] = [];
54
+ images.forEach(img => {
55
+ result.push(<Grid item md={4} xs={12}>
56
+ <a href="about:blank" onClick={(e) => { e.preventDefault(); props.onSelect(CommonEnvironmentHelper.ContentRoot + "/" + img) }}>
57
+ <img src={CommonEnvironmentHelper.ContentRoot + "/" + img} className="img-fluid" alt="stock" />
58
+ </a>
59
+ </Grid>);
60
+ })
61
+ return result;
62
+ }
63
+
64
+ return (<>
65
+ <TextField fullWidth name="personAddText" label="Search Term" value={searchText} onChange={handleChange}
66
+ InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSearch}>Search</Button> }}
67
+ />
68
+ {searchResults && <div>Stock photos provided by <a href="https://pexels.com">Pexels</a>.</div>}
69
+ <Grid container spacing={3} alignItems="center">
70
+ {getImages()}
71
+ </Grid>
72
+
73
+ </>);
74
+ };
@@ -1 +1 @@
1
- export { GalleryModal } from "./GalleryModal";
1
+ export { GalleryModal } from "./GalleryModal";
@@ -1,23 +1,23 @@
1
- export { CreatePerson } from "./CreatePerson";
2
- export { ErrorMessages } from "./ErrorMessages";
3
- export { ExportLink } from "./ExportLink";
4
- export { DisplayBox } from "./DisplayBox";
5
- export { FloatingSupport } from "./FloatingSupport";
6
- export { FormSubmissionEdit } from "./FormSubmissionEdit";
7
- export { HelpIcon } from "./HelpIcon";
8
- export { ImageEditor } from "./ImageEditor";
9
- export { InputBox } from "./InputBox";
10
- export { Loading } from "./Loading";
11
- export { Notes } from "./notes/Notes";
12
- export { PersonAdd } from "./PersonAdd";
13
- export { QuestionEdit } from "./QuestionEdit";
14
- export { SmallButton } from "./SmallButton";
15
- export { SupportModal } from "./SupportModal";
16
- export { MarkdownEditor } from "./markdownEditor/MarkdownEditor";
17
- export { MarkdownPreview } from "./markdownEditor/MarkdownPreview";
18
-
19
- export * from "./material";
20
- export * from "./gallery";
21
- export * from "./markdownEditor";
22
- export * from "./notes";
23
- export * from "./reporting";
1
+ export { CreatePerson } from "./CreatePerson";
2
+ export { ErrorMessages } from "./ErrorMessages";
3
+ export { ExportLink } from "./ExportLink";
4
+ export { DisplayBox } from "./DisplayBox";
5
+ export { FloatingSupport } from "./FloatingSupport";
6
+ export { FormSubmissionEdit } from "./FormSubmissionEdit";
7
+ export { HelpIcon } from "./HelpIcon";
8
+ export { ImageEditor } from "./ImageEditor";
9
+ export { InputBox } from "./InputBox";
10
+ export { Loading } from "./Loading";
11
+ export { Notes } from "./notes/Notes";
12
+ export { PersonAdd } from "./PersonAdd";
13
+ export { QuestionEdit } from "./QuestionEdit";
14
+ export { SmallButton } from "./SmallButton";
15
+ export { SupportModal } from "./SupportModal";
16
+ export { MarkdownEditor } from "./markdownEditor/MarkdownEditor";
17
+ export { MarkdownPreview } from "./markdownEditor/MarkdownPreview";
18
+
19
+ export * from "./material";
20
+ export * from "./gallery";
21
+ export * from "./markdownEditor";
22
+ export * from "./notes";
23
+ export * from "./reporting";