@churchapps/apphelper 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +22 -22
  5. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  6. package/dist/components/FormSubmissionEdit.js +2 -9
  7. package/dist/components/FormSubmissionEdit.js.map +1 -1
  8. package/dist/components/QuestionEdit.js +2 -2
  9. package/dist/components/QuestionEdit.js.map +1 -1
  10. package/dist/components/markdownEditor/editor.css +787 -787
  11. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  12. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  13. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  14. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  15. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  16. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  17. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  18. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  19. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  20. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  21. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  22. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  23. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  26. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  27. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  29. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  30. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  31. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  32. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  33. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  34. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  35. package/dist/pageComponents/components/SelectChurchRegister.js +3 -3
  36. package/dist/pageComponents/components/SelectChurchRegister.js.map +1 -1
  37. package/package.json +85 -85
  38. package/src/components/CreatePerson.tsx +80 -80
  39. package/src/components/DisplayBox.tsx +68 -68
  40. package/src/components/ErrorMessages.tsx +26 -26
  41. package/src/components/ExportLink.tsx +67 -67
  42. package/src/components/FloatingSupport.tsx +16 -16
  43. package/src/components/FormSubmissionEdit.tsx +120 -129
  44. package/src/components/HelpIcon.tsx +10 -10
  45. package/src/components/ImageEditor.tsx +126 -126
  46. package/src/components/InputBox.tsx +73 -73
  47. package/src/components/Loading.tsx +29 -29
  48. package/src/components/PersonAdd.tsx +75 -75
  49. package/src/components/QuestionEdit.tsx +63 -63
  50. package/src/components/SmallButton.tsx +39 -39
  51. package/src/components/SupportModal.tsx +26 -26
  52. package/src/components/TabPanel.tsx +34 -34
  53. package/src/components/gallery/GalleryModal.tsx +102 -102
  54. package/src/components/gallery/StockPhotos.tsx +74 -74
  55. package/src/components/gallery/index.ts +1 -1
  56. package/src/components/iconPicker/IconNamesList.ts +2240 -2240
  57. package/src/components/iconPicker/IconPicker.tsx +153 -153
  58. package/src/components/index.tsx +24 -24
  59. package/src/components/markdownEditor/Editor.tsx +132 -132
  60. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  61. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  62. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  63. package/src/components/markdownEditor/editor.css +787 -787
  64. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  65. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  66. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  67. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  68. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  69. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  70. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  71. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  72. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  73. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  74. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  75. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  76. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  77. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  78. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  79. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  80. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  81. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  82. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  83. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  84. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  85. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  86. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  87. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  88. package/src/components/markdownEditor/index.ts +2 -2
  89. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  90. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  91. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  92. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  93. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  94. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  95. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  96. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  97. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  98. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  99. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  100. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  101. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  102. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  103. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  104. package/src/components/markdownEditor/plugins/index.ts +6 -6
  105. package/src/components/markdownEditor/theme.ts +65 -65
  106. package/src/components/notes/AddNote.tsx +90 -90
  107. package/src/components/notes/Conversation.tsx +82 -82
  108. package/src/components/notes/Conversations.tsx +58 -58
  109. package/src/components/notes/NewConversation.tsx +78 -78
  110. package/src/components/notes/Note.tsx +44 -44
  111. package/src/components/notes/Notes.tsx +68 -68
  112. package/src/components/notes/index.ts +5 -5
  113. package/src/components/reporting/ChartReport.tsx +98 -98
  114. package/src/components/reporting/ReportFilter.tsx +54 -54
  115. package/src/components/reporting/ReportFilterField.tsx +160 -160
  116. package/src/components/reporting/ReportOutput.tsx +79 -79
  117. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  118. package/src/components/reporting/TableReport.tsx +57 -57
  119. package/src/components/reporting/TreeReport.tsx +111 -111
  120. package/src/components/reporting/index.ts +4 -4
  121. package/src/components/wrapper/AppList.tsx +20 -20
  122. package/src/components/wrapper/ChurchList.tsx +22 -22
  123. package/src/components/wrapper/Drawers.tsx +60 -60
  124. package/src/components/wrapper/NavItem.tsx +41 -41
  125. package/src/components/wrapper/NewPrivateMessage.tsx +103 -103
  126. package/src/components/wrapper/NotificationMenu.tsx +85 -85
  127. package/src/components/wrapper/Notifications.tsx +50 -50
  128. package/src/components/wrapper/PrivateMessageDetails.tsx +23 -23
  129. package/src/components/wrapper/PrivateMessages.tsx +87 -87
  130. package/src/components/wrapper/SiteWrapper.tsx +96 -96
  131. package/src/components/wrapper/TabPanel.tsx +30 -30
  132. package/src/components/wrapper/UserMenu.tsx +106 -106
  133. package/src/components/wrapper/index.tsx +5 -5
  134. package/src/donationComponents/DonationPage.tsx +136 -136
  135. package/src/donationComponents/components/BankForm.tsx +159 -159
  136. package/src/donationComponents/components/CardForm.tsx +104 -104
  137. package/src/donationComponents/components/DonationForm.tsx +235 -235
  138. package/src/donationComponents/components/FundDonation.tsx +49 -49
  139. package/src/donationComponents/components/FundDonations.tsx +39 -39
  140. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  141. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  142. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  143. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  144. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  145. package/src/donationComponents/components/index.tsx +9 -9
  146. package/src/donationComponents/index.ts +3 -3
  147. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  148. package/src/helpers/AnalyticsHelper.ts +33 -33
  149. package/src/helpers/ApiHelper.ts +125 -125
  150. package/src/helpers/AppearanceHelper.ts +69 -69
  151. package/src/helpers/ArrayHelper.ts +81 -81
  152. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  153. package/src/helpers/CurrencyHelper.ts +10 -10
  154. package/src/helpers/DateHelper.ts +108 -108
  155. package/src/helpers/DonationHelper.ts +26 -26
  156. package/src/helpers/ErrorHelper.ts +36 -36
  157. package/src/helpers/EventHelper.ts +52 -52
  158. package/src/helpers/FileHelper.ts +31 -31
  159. package/src/helpers/PersonHelper.ts +60 -60
  160. package/src/helpers/SocketHelper.ts +76 -76
  161. package/src/helpers/Themes.ts +14 -14
  162. package/src/helpers/UniqueIdHelper.ts +36 -36
  163. package/src/helpers/UserHelper.ts +59 -59
  164. package/src/helpers/createEmotionCache.ts +17 -17
  165. package/src/helpers/index.ts +18 -18
  166. package/src/hooks/index.ts +1 -1
  167. package/src/hooks/useMountedState.ts +16 -16
  168. package/src/index.ts +6 -6
  169. package/src/interfaces/Access.ts +24 -24
  170. package/src/interfaces/Attendance.ts +8 -8
  171. package/src/interfaces/Content.ts +10 -10
  172. package/src/interfaces/Doing.ts +24 -24
  173. package/src/interfaces/Donation.ts +45 -45
  174. package/src/interfaces/Error.ts +17 -17
  175. package/src/interfaces/Membership.ts +51 -51
  176. package/src/interfaces/Messaging.ts +21 -21
  177. package/src/interfaces/Permissions.ts +68 -68
  178. package/src/interfaces/Reporting.ts +7 -7
  179. package/src/interfaces/UserContextInterface.ts +13 -13
  180. package/src/interfaces/index.ts +13 -13
  181. package/src/pageComponents/LoginPage.tsx +244 -244
  182. package/src/pageComponents/LogoutPage.tsx +28 -28
  183. package/src/pageComponents/components/Forgot.tsx +79 -79
  184. package/src/pageComponents/components/Login.tsx +54 -54
  185. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  186. package/src/pageComponents/components/Register.tsx +107 -107
  187. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  188. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  189. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  190. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  191. package/src/pageComponents/index.ts +3 -3
  192. package/tsconfig.json +34 -34
  193. package/tslint.json +14 -14
@@ -1,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";