@churchapps/apphelper 0.0.8 → 0.0.10
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.
- package/.eslintignore +3 -3
- package/.eslintrc.json +22 -22
- package/LICENSE +21 -21
- package/README.md +16 -16
- package/dist/components/ExportLink.d.ts.map +1 -1
- package/dist/components/ExportLink.js +10 -7
- package/dist/components/ExportLink.js.map +1 -1
- package/dist/components/markdownEditor/editor.css +787 -787
- package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
- package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
- package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
- package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
- package/dist/components/markdownEditor/images/icons/code.svg +2 -2
- package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
- package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
- package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
- package/dist/components/markdownEditor/images/icons/link.svg +3 -3
- package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
- package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
- package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
- package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
- package/package.json +84 -84
- package/src/components/CreatePerson.tsx +80 -80
- package/src/components/DisplayBox.tsx +68 -68
- package/src/components/ErrorMessages.tsx +26 -26
- package/src/components/ExportLink.tsx +67 -61
- package/src/components/FloatingSupport.tsx +16 -16
- package/src/components/FormSubmissionEdit.tsx +120 -120
- package/src/components/HelpIcon.tsx +10 -10
- package/src/components/ImageEditor.tsx +126 -126
- package/src/components/InputBox.tsx +73 -73
- package/src/components/Loading.tsx +29 -29
- package/src/components/PersonAdd.tsx +75 -75
- package/src/components/QuestionEdit.tsx +62 -62
- package/src/components/SmallButton.tsx +39 -39
- package/src/components/SupportModal.tsx +26 -26
- package/src/components/TabPanel.tsx +34 -34
- package/src/components/gallery/GalleryModal.tsx +102 -102
- package/src/components/gallery/StockPhotos.tsx +74 -74
- package/src/components/gallery/index.ts +1 -1
- package/src/components/index.tsx +23 -23
- package/src/components/markdownEditor/Editor.tsx +132 -132
- package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
- package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
- package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
- package/src/components/markdownEditor/editor.css +787 -787
- package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
- package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
- package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
- package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
- package/src/components/markdownEditor/images/icons/code.svg +2 -2
- package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
- package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
- package/src/components/markdownEditor/images/icons/justify.svg +2 -2
- package/src/components/markdownEditor/images/icons/link.svg +3 -3
- package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
- package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
- package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
- package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
- package/src/components/markdownEditor/index.ts +2 -2
- package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
- package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
- package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
- package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
- package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
- package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
- package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
- package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
- package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
- package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
- package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
- package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
- package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
- package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
- package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
- package/src/components/markdownEditor/plugins/index.ts +6 -6
- package/src/components/markdownEditor/theme.ts +65 -65
- package/src/components/material/AppList.tsx +20 -20
- package/src/components/material/ChurchList.tsx +22 -22
- package/src/components/material/NavItem.tsx +41 -41
- package/src/components/material/NewPrivateMessage.tsx +103 -103
- package/src/components/material/PrivateMessageDetails.tsx +23 -23
- package/src/components/material/PrivateMessages.tsx +87 -87
- package/src/components/material/SiteWrapper.tsx +140 -140
- package/src/components/material/UserMenu.tsx +141 -141
- package/src/components/material/iconPicker/IconNamesList.ts +2240 -2240
- package/src/components/material/iconPicker/IconPicker.tsx +153 -153
- package/src/components/material/index.tsx +6 -6
- package/src/components/notes/AddNote.tsx +90 -90
- package/src/components/notes/Conversation.tsx +82 -82
- package/src/components/notes/Conversations.tsx +58 -58
- package/src/components/notes/NewConversation.tsx +78 -78
- package/src/components/notes/Note.tsx +44 -44
- package/src/components/notes/Notes.tsx +52 -52
- package/src/components/notes/index.ts +5 -5
- package/src/components/reporting/ChartReport.tsx +98 -98
- package/src/components/reporting/ReportFilter.tsx +54 -54
- package/src/components/reporting/ReportFilterField.tsx +160 -160
- package/src/components/reporting/ReportOutput.tsx +79 -79
- package/src/components/reporting/ReportWithFilter.tsx +70 -70
- package/src/components/reporting/TableReport.tsx +57 -57
- package/src/components/reporting/TreeReport.tsx +111 -111
- package/src/components/reporting/index.ts +4 -4
- package/src/donationComponents/DonationPage.tsx +136 -136
- package/src/donationComponents/components/BankForm.tsx +159 -159
- package/src/donationComponents/components/CardForm.tsx +104 -104
- package/src/donationComponents/components/DonationForm.tsx +235 -235
- package/src/donationComponents/components/FundDonation.tsx +49 -49
- package/src/donationComponents/components/FundDonations.tsx +39 -39
- package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
- package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
- package/src/donationComponents/components/PaymentMethods.tsx +135 -135
- package/src/donationComponents/components/RecurringDonations.tsx +121 -121
- package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
- package/src/donationComponents/components/index.tsx +9 -9
- package/src/donationComponents/index.ts +3 -3
- package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
- package/src/helpers/AnalyticsHelper.ts +33 -33
- package/src/helpers/ApiHelper.ts +125 -125
- package/src/helpers/AppearanceHelper.ts +69 -69
- package/src/helpers/ArrayHelper.ts +81 -81
- package/src/helpers/CommonEnvironmentHelper.ts +80 -80
- package/src/helpers/CurrencyHelper.ts +10 -10
- package/src/helpers/DateHelper.ts +108 -108
- package/src/helpers/DonationHelper.ts +26 -26
- package/src/helpers/ErrorHelper.ts +36 -36
- package/src/helpers/EventHelper.ts +52 -52
- package/src/helpers/FileHelper.ts +31 -31
- package/src/helpers/PersonHelper.ts +60 -60
- package/src/helpers/SocketHelper.ts +76 -76
- package/src/helpers/Themes.ts +14 -14
- package/src/helpers/UniqueIdHelper.ts +36 -36
- package/src/helpers/UserHelper.ts +59 -59
- package/src/helpers/createEmotionCache.ts +17 -17
- package/src/helpers/index.ts +18 -18
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useMountedState.ts +16 -16
- package/src/index.ts +6 -6
- package/src/interfaces/Access.ts +24 -24
- package/src/interfaces/Attendance.ts +8 -8
- package/src/interfaces/Content.ts +10 -10
- package/src/interfaces/Doing.ts +24 -24
- package/src/interfaces/Donation.ts +45 -45
- package/src/interfaces/Error.ts +17 -17
- package/src/interfaces/Membership.ts +51 -51
- package/src/interfaces/Messaging.ts +20 -20
- package/src/interfaces/Permissions.ts +68 -68
- package/src/interfaces/Reporting.ts +7 -7
- package/src/interfaces/UserContextInterface.ts +13 -13
- package/src/interfaces/index.ts +13 -13
- package/src/pageComponents/LoginPage.tsx +244 -244
- package/src/pageComponents/LogoutPage.tsx +28 -28
- package/src/pageComponents/components/Forgot.tsx +79 -79
- package/src/pageComponents/components/Login.tsx +54 -54
- package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
- package/src/pageComponents/components/Register.tsx +107 -107
- package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
- package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
- package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
- package/src/pageComponents/components/SelectableChurch.tsx +38 -38
- package/src/pageComponents/index.ts +3 -3
- package/tsconfig.json +34 -34
- package/tslint.json +14 -14
|
@@ -1,62 +1,62 @@
|
|
|
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 { 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,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
|
+
};
|