@churchapps/apphelper 0.0.14 → 0.1.1

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 (292) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +22 -16
  5. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  6. package/dist/components/FormSubmissionEdit.js +9 -2
  7. package/dist/components/FormSubmissionEdit.js.map +1 -1
  8. package/dist/components/QuestionEdit.d.ts.map +1 -1
  9. package/dist/components/QuestionEdit.js +2 -1
  10. package/dist/components/QuestionEdit.js.map +1 -1
  11. package/dist/components/iconPicker/IconNamesList.d.ts.map +1 -0
  12. package/dist/components/iconPicker/IconNamesList.js.map +1 -0
  13. package/dist/components/iconPicker/IconPicker.d.ts.map +1 -0
  14. package/dist/components/iconPicker/IconPicker.js.map +1 -0
  15. package/dist/components/index.d.ts +2 -1
  16. package/dist/components/index.d.ts.map +1 -1
  17. package/dist/components/index.js +4 -2
  18. package/dist/components/index.js.map +1 -1
  19. package/dist/components/markdownEditor/editor.css +787 -787
  20. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  21. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  22. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  23. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  26. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  27. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  29. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  30. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  31. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  32. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  33. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  34. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  35. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  36. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  37. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  38. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  39. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  40. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  41. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  42. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  43. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  44. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.js +1 -1
  45. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.js.map +1 -1
  46. package/dist/components/markdownEditor/plugins/emoji/EmojiNodeTransform.js +1 -1
  47. package/dist/components/markdownEditor/plugins/emoji/EmojiNodeTransform.js.map +1 -1
  48. package/dist/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.js +1 -1
  49. package/dist/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.js.map +1 -1
  50. package/dist/components/markdownEditor/plugins/emoji/EmojisPlugin.js +1 -1
  51. package/dist/components/markdownEditor/plugins/emoji/EmojisPlugin.js.map +1 -1
  52. package/dist/components/notes/Notes.d.ts +1 -0
  53. package/dist/components/notes/Notes.d.ts.map +1 -1
  54. package/dist/components/notes/Notes.js +18 -1
  55. package/dist/components/notes/Notes.js.map +1 -1
  56. package/dist/components/wrapper/AppList.d.ts.map +1 -0
  57. package/dist/components/wrapper/AppList.js.map +1 -0
  58. package/dist/components/wrapper/ChurchList.d.ts.map +1 -0
  59. package/dist/components/wrapper/ChurchList.js.map +1 -0
  60. package/dist/components/wrapper/Drawers.d.ts +22 -0
  61. package/dist/components/wrapper/Drawers.d.ts.map +1 -0
  62. package/dist/components/wrapper/Drawers.js +51 -0
  63. package/dist/components/wrapper/Drawers.js.map +1 -0
  64. package/dist/components/wrapper/NavItem.d.ts.map +1 -0
  65. package/dist/components/wrapper/NavItem.js.map +1 -0
  66. package/dist/components/wrapper/NewPrivateMessage.d.ts.map +1 -0
  67. package/dist/components/wrapper/NewPrivateMessage.js.map +1 -0
  68. package/dist/components/wrapper/NotificationMenu.d.ts +14 -0
  69. package/dist/components/wrapper/NotificationMenu.d.ts.map +1 -0
  70. package/dist/components/wrapper/NotificationMenu.js +60 -0
  71. package/dist/components/wrapper/NotificationMenu.js.map +1 -0
  72. package/dist/components/wrapper/Notifications.d.ts +8 -0
  73. package/dist/components/wrapper/Notifications.d.ts.map +1 -0
  74. package/dist/components/wrapper/Notifications.js +67 -0
  75. package/dist/components/wrapper/Notifications.js.map +1 -0
  76. package/dist/components/wrapper/PrivateMessageDetails.d.ts.map +1 -0
  77. package/dist/components/{material → wrapper}/PrivateMessageDetails.js +1 -1
  78. package/dist/components/wrapper/PrivateMessageDetails.js.map +1 -0
  79. package/dist/components/wrapper/PrivateMessages.d.ts.map +1 -0
  80. package/dist/components/{material → wrapper}/PrivateMessages.js +1 -1
  81. package/dist/components/wrapper/PrivateMessages.js.map +1 -0
  82. package/dist/components/wrapper/SiteWrapper.d.ts.map +1 -0
  83. package/dist/components/{material → wrapper}/SiteWrapper.js +13 -49
  84. package/dist/components/wrapper/SiteWrapper.js.map +1 -0
  85. package/dist/components/wrapper/TabPanel.d.ts +9 -0
  86. package/dist/components/wrapper/TabPanel.d.ts.map +1 -0
  87. package/dist/components/wrapper/TabPanel.js +24 -0
  88. package/dist/components/wrapper/TabPanel.js.map +1 -0
  89. package/dist/components/wrapper/UserMenu.d.ts.map +1 -0
  90. package/dist/components/{material → wrapper}/UserMenu.js +14 -31
  91. package/dist/components/wrapper/UserMenu.js.map +1 -0
  92. package/dist/components/{material → wrapper}/index.d.ts +0 -1
  93. package/dist/components/wrapper/index.d.ts.map +1 -0
  94. package/dist/components/{material → wrapper}/index.js +1 -3
  95. package/dist/components/wrapper/index.js.map +1 -0
  96. package/dist/interfaces/Messaging.d.ts +10 -0
  97. package/dist/interfaces/Messaging.d.ts.map +1 -1
  98. package/package.json +85 -84
  99. package/src/components/CreatePerson.tsx +80 -80
  100. package/src/components/DisplayBox.tsx +68 -68
  101. package/src/components/ErrorMessages.tsx +26 -26
  102. package/src/components/ExportLink.tsx +67 -67
  103. package/src/components/FloatingSupport.tsx +16 -16
  104. package/src/components/FormSubmissionEdit.tsx +129 -120
  105. package/src/components/HelpIcon.tsx +10 -10
  106. package/src/components/ImageEditor.tsx +126 -126
  107. package/src/components/InputBox.tsx +73 -73
  108. package/src/components/Loading.tsx +29 -29
  109. package/src/components/PersonAdd.tsx +75 -75
  110. package/src/components/QuestionEdit.tsx +63 -62
  111. package/src/components/SmallButton.tsx +39 -39
  112. package/src/components/SupportModal.tsx +26 -26
  113. package/src/components/TabPanel.tsx +34 -34
  114. package/src/components/gallery/GalleryModal.tsx +102 -102
  115. package/src/components/gallery/StockPhotos.tsx +74 -74
  116. package/src/components/gallery/index.ts +1 -1
  117. package/src/components/{material/iconPicker → iconPicker}/IconNamesList.ts +2240 -2240
  118. package/src/components/{material/iconPicker → iconPicker}/IconPicker.tsx +153 -153
  119. package/src/components/index.tsx +24 -23
  120. package/src/components/markdownEditor/Editor.tsx +132 -132
  121. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  122. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  123. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  124. package/src/components/markdownEditor/editor.css +787 -787
  125. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  126. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  127. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  128. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  129. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  130. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  131. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  132. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  133. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  134. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  135. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  136. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  137. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  138. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  139. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  140. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  141. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  142. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  143. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  144. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  145. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  146. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  147. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  148. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  149. package/src/components/markdownEditor/index.ts +2 -2
  150. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  151. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  152. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  153. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  154. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  155. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  156. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  157. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  158. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  159. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  160. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  161. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  162. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  163. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  164. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  165. package/src/components/markdownEditor/plugins/index.ts +6 -6
  166. package/src/components/markdownEditor/theme.ts +65 -65
  167. package/src/components/notes/AddNote.tsx +90 -90
  168. package/src/components/notes/Conversation.tsx +82 -82
  169. package/src/components/notes/Conversations.tsx +58 -58
  170. package/src/components/notes/NewConversation.tsx +78 -78
  171. package/src/components/notes/Note.tsx +44 -44
  172. package/src/components/notes/Notes.tsx +68 -52
  173. package/src/components/notes/index.ts +5 -5
  174. package/src/components/reporting/ChartReport.tsx +98 -98
  175. package/src/components/reporting/ReportFilter.tsx +54 -54
  176. package/src/components/reporting/ReportFilterField.tsx +160 -160
  177. package/src/components/reporting/ReportOutput.tsx +79 -79
  178. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  179. package/src/components/reporting/TableReport.tsx +57 -57
  180. package/src/components/reporting/TreeReport.tsx +111 -111
  181. package/src/components/reporting/index.ts +4 -4
  182. package/src/components/{material → wrapper}/AppList.tsx +20 -20
  183. package/src/components/{material → wrapper}/ChurchList.tsx +22 -22
  184. package/src/components/wrapper/Drawers.tsx +60 -0
  185. package/src/components/{material → wrapper}/NavItem.tsx +41 -41
  186. package/src/components/{material → wrapper}/NewPrivateMessage.tsx +103 -103
  187. package/src/components/wrapper/NotificationMenu.tsx +85 -0
  188. package/src/components/wrapper/Notifications.tsx +50 -0
  189. package/src/components/{material → wrapper}/PrivateMessageDetails.tsx +23 -23
  190. package/src/components/{material → wrapper}/PrivateMessages.tsx +87 -87
  191. package/src/components/{material → wrapper}/SiteWrapper.tsx +96 -145
  192. package/src/components/wrapper/TabPanel.tsx +30 -0
  193. package/src/components/{material → wrapper}/UserMenu.tsx +106 -141
  194. package/src/components/{material → wrapper}/index.tsx +5 -6
  195. package/src/donationComponents/DonationPage.tsx +136 -136
  196. package/src/donationComponents/components/BankForm.tsx +159 -159
  197. package/src/donationComponents/components/CardForm.tsx +104 -104
  198. package/src/donationComponents/components/DonationForm.tsx +235 -235
  199. package/src/donationComponents/components/FundDonation.tsx +49 -49
  200. package/src/donationComponents/components/FundDonations.tsx +39 -39
  201. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  202. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  203. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  204. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  205. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  206. package/src/donationComponents/components/index.tsx +9 -9
  207. package/src/donationComponents/index.ts +3 -3
  208. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  209. package/src/helpers/AnalyticsHelper.ts +33 -33
  210. package/src/helpers/ApiHelper.ts +125 -125
  211. package/src/helpers/AppearanceHelper.ts +69 -69
  212. package/src/helpers/ArrayHelper.ts +81 -81
  213. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  214. package/src/helpers/CurrencyHelper.ts +10 -10
  215. package/src/helpers/DateHelper.ts +108 -108
  216. package/src/helpers/DonationHelper.ts +26 -26
  217. package/src/helpers/ErrorHelper.ts +36 -36
  218. package/src/helpers/EventHelper.ts +52 -52
  219. package/src/helpers/FileHelper.ts +31 -31
  220. package/src/helpers/PersonHelper.ts +60 -60
  221. package/src/helpers/SocketHelper.ts +76 -76
  222. package/src/helpers/Themes.ts +14 -14
  223. package/src/helpers/UniqueIdHelper.ts +36 -36
  224. package/src/helpers/UserHelper.ts +59 -59
  225. package/src/helpers/createEmotionCache.ts +17 -17
  226. package/src/helpers/index.ts +18 -18
  227. package/src/hooks/index.ts +1 -1
  228. package/src/hooks/useMountedState.ts +16 -16
  229. package/src/index.ts +6 -6
  230. package/src/interfaces/Access.ts +24 -24
  231. package/src/interfaces/Attendance.ts +8 -8
  232. package/src/interfaces/Content.ts +10 -10
  233. package/src/interfaces/Doing.ts +24 -24
  234. package/src/interfaces/Donation.ts +45 -45
  235. package/src/interfaces/Error.ts +17 -17
  236. package/src/interfaces/Membership.ts +51 -51
  237. package/src/interfaces/Messaging.ts +21 -20
  238. package/src/interfaces/Permissions.ts +68 -68
  239. package/src/interfaces/Reporting.ts +7 -7
  240. package/src/interfaces/UserContextInterface.ts +13 -13
  241. package/src/interfaces/index.ts +13 -13
  242. package/src/pageComponents/LoginPage.tsx +244 -244
  243. package/src/pageComponents/LogoutPage.tsx +28 -28
  244. package/src/pageComponents/components/Forgot.tsx +79 -79
  245. package/src/pageComponents/components/Login.tsx +54 -54
  246. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  247. package/src/pageComponents/components/Register.tsx +107 -107
  248. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  249. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  250. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  251. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  252. package/src/pageComponents/index.ts +3 -3
  253. package/tsconfig.json +34 -34
  254. package/tslint.json +14 -14
  255. package/dist/components/material/AppList.d.ts.map +0 -1
  256. package/dist/components/material/AppList.js.map +0 -1
  257. package/dist/components/material/ChurchList.d.ts.map +0 -1
  258. package/dist/components/material/ChurchList.js.map +0 -1
  259. package/dist/components/material/NavItem.d.ts.map +0 -1
  260. package/dist/components/material/NavItem.js.map +0 -1
  261. package/dist/components/material/NewPrivateMessage.d.ts.map +0 -1
  262. package/dist/components/material/NewPrivateMessage.js.map +0 -1
  263. package/dist/components/material/PrivateMessageDetails.d.ts.map +0 -1
  264. package/dist/components/material/PrivateMessageDetails.js.map +0 -1
  265. package/dist/components/material/PrivateMessages.d.ts.map +0 -1
  266. package/dist/components/material/PrivateMessages.js.map +0 -1
  267. package/dist/components/material/SiteWrapper.d.ts.map +0 -1
  268. package/dist/components/material/SiteWrapper.js.map +0 -1
  269. package/dist/components/material/UserMenu.d.ts.map +0 -1
  270. package/dist/components/material/UserMenu.js.map +0 -1
  271. package/dist/components/material/iconPicker/IconNamesList.d.ts.map +0 -1
  272. package/dist/components/material/iconPicker/IconNamesList.js.map +0 -1
  273. package/dist/components/material/iconPicker/IconPicker.d.ts.map +0 -1
  274. package/dist/components/material/iconPicker/IconPicker.js.map +0 -1
  275. package/dist/components/material/index.d.ts.map +0 -1
  276. package/dist/components/material/index.js.map +0 -1
  277. /package/dist/components/{material/iconPicker → iconPicker}/IconNamesList.d.ts +0 -0
  278. /package/dist/components/{material/iconPicker → iconPicker}/IconNamesList.js +0 -0
  279. /package/dist/components/{material/iconPicker → iconPicker}/IconPicker.d.ts +0 -0
  280. /package/dist/components/{material/iconPicker → iconPicker}/IconPicker.js +0 -0
  281. /package/dist/components/{material → wrapper}/AppList.d.ts +0 -0
  282. /package/dist/components/{material → wrapper}/AppList.js +0 -0
  283. /package/dist/components/{material → wrapper}/ChurchList.d.ts +0 -0
  284. /package/dist/components/{material → wrapper}/ChurchList.js +0 -0
  285. /package/dist/components/{material → wrapper}/NavItem.d.ts +0 -0
  286. /package/dist/components/{material → wrapper}/NavItem.js +0 -0
  287. /package/dist/components/{material → wrapper}/NewPrivateMessage.d.ts +0 -0
  288. /package/dist/components/{material → wrapper}/NewPrivateMessage.js +0 -0
  289. /package/dist/components/{material → wrapper}/PrivateMessageDetails.d.ts +0 -0
  290. /package/dist/components/{material → wrapper}/PrivateMessages.d.ts +0 -0
  291. /package/dist/components/{material → wrapper}/SiteWrapper.d.ts +0 -0
  292. /package/dist/components/{material → wrapper}/UserMenu.d.ts +0 -0
@@ -1,62 +1,63 @@
1
- import React from "react";
2
- import { AnswerInterface, QuestionInterface } from "../interfaces";
3
- import { Select, MenuItem, SelectChangeEvent, FormControl, InputLabel, TextField } from "@mui/material";
4
-
5
- interface Props {
6
- answer: AnswerInterface
7
- question: QuestionInterface,
8
- noBackground?: boolean,
9
- changeFunction: (questionId: string, value: string) => void
10
- }
11
-
12
- export const QuestionEdit: React.FC<Props> = ({noBackground = false, ...props}) => {
13
- const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | SelectChangeEvent<string>) => {
14
- props.changeFunction(props.question.id, e.target.value);
15
- }
16
- let q = props.question;
17
-
18
- if (q.fieldType === "Heading") return <h5>{q.title}</h5>;
19
- else {
20
- let input = null;
21
- let choiceOptions = [];
22
- if (q.choices !== undefined && q.choices !== null) {
23
- for (let i = 0; i < q.choices.length; i++) choiceOptions.push(<MenuItem key={i} value={q.choices[i].value}>{q.choices[i].text}</MenuItem>);
24
- }
25
-
26
- let answerValue = (props.answer === null) ? "" : props.answer.value
27
- switch (q.fieldType) {
28
- case "Textbox": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
29
- case "Multiple Choice": {
30
- input = (
31
- <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
32
- <InputLabel>{q.title}</InputLabel>
33
- <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>{choiceOptions}</Select>
34
- </FormControl>);
35
- break;
36
- }
37
- case "Yes/No": {
38
- input = (
39
- <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
40
- <InputLabel>{q.title}</InputLabel>
41
- <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>
42
- <MenuItem value="False">No</MenuItem>
43
- <MenuItem value="True">Yes</MenuItem>
44
- </Select>
45
- </FormControl>);
46
- break;
47
- }
48
- case "Whole Number":
49
- case "Decimal":
50
- input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="number" InputLabelProps={{shrink: true}} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />;
51
- break;
52
- 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;
53
- case "Phone Number": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="number" InputLabelProps={{shrink: true}} label={q.title} placeholder="555-555-5555" value={answerValue} onChange={handleChange} />; break;
54
- 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;
55
- 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;
56
- default: return null;
57
- }
58
- return input;
59
- }
60
-
61
- }
62
-
1
+ import React from "react";
2
+ import { PatternFormat } from "react-number-format";
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 = <PatternFormat format="###-###-####" patternChar="#" customInput={TextField} fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} label={q.title} placeholder="555-555-5555" value={answerValue} onChange={handleChange} />; 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
+ };