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