@churchapps/apphelper 0.6.15 → 0.6.16

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 (215) hide show
  1. package/dist/components/DisplayBox.d.ts +1 -1
  2. package/dist/components/DisplayBox.d.ts.map +1 -1
  3. package/dist/components/DisplayBox.js +2 -4
  4. package/dist/components/DisplayBox.js.map +1 -1
  5. package/dist/components/ErrorMessages.d.ts.map +1 -1
  6. package/dist/components/ErrorMessages.js +1 -1
  7. package/dist/components/ErrorMessages.js.map +1 -1
  8. package/dist/components/ExportLink.d.ts.map +1 -1
  9. package/dist/components/ExportLink.js +10 -10
  10. package/dist/components/ExportLink.js.map +1 -1
  11. package/dist/components/FloatingSupport.js.map +1 -1
  12. package/dist/components/FormCardPayment.d.ts.map +1 -1
  13. package/dist/components/FormCardPayment.js +20 -5
  14. package/dist/components/FormCardPayment.js.map +1 -1
  15. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  16. package/dist/components/FormSubmissionEdit.js +8 -10
  17. package/dist/components/FormSubmissionEdit.js.map +1 -1
  18. package/dist/components/HelpIcon.d.ts.map +1 -1
  19. package/dist/components/HelpIcon.js.map +1 -1
  20. package/dist/components/ImageEditor.d.ts.map +1 -1
  21. package/dist/components/ImageEditor.js +10 -10
  22. package/dist/components/ImageEditor.js.map +1 -1
  23. package/dist/components/InputBox.d.ts +1 -1
  24. package/dist/components/InputBox.d.ts.map +1 -1
  25. package/dist/components/InputBox.js +4 -6
  26. package/dist/components/InputBox.js.map +1 -1
  27. package/dist/components/Loading.d.ts.map +1 -1
  28. package/dist/components/Loading.js.map +1 -1
  29. package/dist/components/PageHeader.js +14 -14
  30. package/dist/components/PersonAvatar.d.ts.map +1 -1
  31. package/dist/components/PersonAvatar.js +9 -16
  32. package/dist/components/PersonAvatar.js.map +1 -1
  33. package/dist/components/QuestionEdit.js +3 -3
  34. package/dist/components/QuestionEdit.js.map +1 -1
  35. package/dist/components/SmallButton.d.ts.map +1 -1
  36. package/dist/components/SmallButton.js +2 -1
  37. package/dist/components/SmallButton.js.map +1 -1
  38. package/dist/components/SupportModal.js.map +1 -1
  39. package/dist/components/gallery/GalleryModal.js +10 -10
  40. package/dist/components/gallery/GalleryModal.js.map +1 -1
  41. package/dist/components/gallery/StockPhotos.js +12 -12
  42. package/dist/components/gallery/StockPhotos.js.map +1 -1
  43. package/dist/components/header/Banner.d.ts.map +1 -1
  44. package/dist/components/header/Banner.js.map +1 -1
  45. package/dist/components/header/PrimaryMenu.js +4 -4
  46. package/dist/components/header/PrimaryMenu.js.map +1 -1
  47. package/dist/components/header/SecondaryMenu.d.ts.map +1 -1
  48. package/dist/components/header/SecondaryMenu.js.map +1 -1
  49. package/dist/components/header/SecondaryMenuAlt.d.ts.map +1 -1
  50. package/dist/components/header/SecondaryMenuAlt.js.map +1 -1
  51. package/dist/components/header/SiteHeader.d.ts.map +1 -1
  52. package/dist/components/header/SiteHeader.js +7 -7
  53. package/dist/components/header/SiteHeader.js.map +1 -1
  54. package/dist/components/header/SupportDrawer.js +1 -1
  55. package/dist/components/header/SupportDrawer.js.map +1 -1
  56. package/dist/components/notes/AddNote.js +14 -14
  57. package/dist/components/notes/Note.d.ts.map +1 -1
  58. package/dist/components/notes/Note.js +7 -7
  59. package/dist/components/notes/Note.js.map +1 -1
  60. package/dist/components/notes/Notes.d.ts.map +1 -1
  61. package/dist/components/notes/Notes.js +4 -4
  62. package/dist/components/notes/Notes.js.map +1 -1
  63. package/dist/components/wrapper/AppList.d.ts.map +1 -1
  64. package/dist/components/wrapper/AppList.js.map +1 -1
  65. package/dist/components/wrapper/ChurchList.js +5 -5
  66. package/dist/components/wrapper/ChurchList.js.map +1 -1
  67. package/dist/components/wrapper/NavItem.js +1 -1
  68. package/dist/components/wrapper/NavItem.js.map +1 -1
  69. package/dist/components/wrapper/NewPrivateMessage.d.ts.map +1 -1
  70. package/dist/components/wrapper/NewPrivateMessage.js +7 -6
  71. package/dist/components/wrapper/NewPrivateMessage.js.map +1 -1
  72. package/dist/components/wrapper/Notifications.d.ts.map +1 -1
  73. package/dist/components/wrapper/Notifications.js +12 -14
  74. package/dist/components/wrapper/Notifications.js.map +1 -1
  75. package/dist/components/wrapper/PrivateMessageDetails.js +10 -10
  76. package/dist/components/wrapper/PrivateMessages.d.ts.map +1 -1
  77. package/dist/components/wrapper/PrivateMessages.js +119 -123
  78. package/dist/components/wrapper/PrivateMessages.js.map +1 -1
  79. package/dist/components/wrapper/UserMenu.d.ts.map +1 -1
  80. package/dist/components/wrapper/UserMenu.js +15 -15
  81. package/dist/components/wrapper/UserMenu.js.map +1 -1
  82. package/dist/helpers/AnalyticsHelper.d.ts.map +1 -1
  83. package/dist/helpers/AnalyticsHelper.js +3 -3
  84. package/dist/helpers/AnalyticsHelper.js.map +1 -1
  85. package/dist/helpers/ArrayHelper.d.ts.map +1 -1
  86. package/dist/helpers/ArrayHelper.js.map +1 -1
  87. package/dist/helpers/CurrencyHelper.d.ts +4 -0
  88. package/dist/helpers/CurrencyHelper.d.ts.map +1 -1
  89. package/dist/helpers/CurrencyHelper.js +65 -0
  90. package/dist/helpers/CurrencyHelper.js.map +1 -1
  91. package/dist/helpers/ErrorHelper.d.ts.map +1 -1
  92. package/dist/helpers/ErrorHelper.js.map +1 -1
  93. package/dist/helpers/EventHelper.d.ts.map +1 -1
  94. package/dist/helpers/EventHelper.js +1 -1
  95. package/dist/helpers/EventHelper.js.map +1 -1
  96. package/dist/helpers/FileHelper.d.ts.map +1 -1
  97. package/dist/helpers/FileHelper.js +3 -1
  98. package/dist/helpers/FileHelper.js.map +1 -1
  99. package/dist/helpers/Locale.d.ts.map +1 -1
  100. package/dist/helpers/Locale.js +10 -16
  101. package/dist/helpers/Locale.js.map +1 -1
  102. package/dist/helpers/NotificationService.js +4 -4
  103. package/dist/helpers/PersonHelper.d.ts.map +1 -1
  104. package/dist/helpers/PersonHelper.js +5 -4
  105. package/dist/helpers/PersonHelper.js.map +1 -1
  106. package/dist/helpers/SlugHelper.d.ts.map +1 -1
  107. package/dist/helpers/SlugHelper.js +5 -3
  108. package/dist/helpers/SlugHelper.js.map +1 -1
  109. package/dist/helpers/SocketHelper.d.ts.map +1 -1
  110. package/dist/helpers/SocketHelper.js +5 -10
  111. package/dist/helpers/SocketHelper.js.map +1 -1
  112. package/dist/helpers/UniqueIdHelper.d.ts.map +1 -1
  113. package/dist/helpers/UniqueIdHelper.js +132 -7
  114. package/dist/helpers/UniqueIdHelper.js.map +1 -1
  115. package/dist/helpers/UserHelper.d.ts.map +1 -1
  116. package/dist/helpers/UserHelper.js +2 -2
  117. package/dist/helpers/UserHelper.js.map +1 -1
  118. package/dist/hooks/useMountedState.d.ts.map +1 -1
  119. package/dist/hooks/useMountedState.js +1 -1
  120. package/dist/hooks/useMountedState.js.map +1 -1
  121. package/dist/hooks/useNotifications.d.ts +2 -2
  122. package/dist/hooks/useNotifications.js +5 -5
  123. package/dist/public/locales/de.json +15 -7
  124. package/dist/public/locales/es.json +193 -190
  125. package/dist/public/locales/fr.json +15 -7
  126. package/dist/public/locales/hi.json +15 -7
  127. package/dist/public/locales/it.json +15 -7
  128. package/dist/public/locales/ko.json +15 -7
  129. package/dist/public/locales/no.json +15 -7
  130. package/dist/public/locales/pt.json +15 -7
  131. package/dist/public/locales/ru.json +15 -7
  132. package/dist/public/locales/tl.json +15 -7
  133. package/dist/public/locales/zh.json +15 -7
  134. package/package.json +106 -73
  135. package/dist/helpers/DateHelper.d.ts +0 -18
  136. package/dist/helpers/DateHelper.d.ts.map +0 -1
  137. package/dist/helpers/DateHelper.js +0 -113
  138. package/dist/helpers/DateHelper.js.map +0 -1
  139. package/public/css/cropper.css +0 -309
  140. package/public/css/styles.css +0 -112
  141. package/public/locales/de.json +0 -273
  142. package/public/locales/en.json +0 -281
  143. package/public/locales/es.json +0 -278
  144. package/public/locales/fr.json +0 -273
  145. package/public/locales/hi.json +0 -273
  146. package/public/locales/it.json +0 -273
  147. package/public/locales/ko.json +0 -273
  148. package/public/locales/no.json +0 -273
  149. package/public/locales/pt.json +0 -273
  150. package/public/locales/ru.json +0 -273
  151. package/public/locales/tl.json +0 -273
  152. package/public/locales/zh.json +0 -273
  153. package/src/components/DisplayBox.tsx +0 -83
  154. package/src/components/ErrorMessages.tsx +0 -28
  155. package/src/components/ExportLink.tsx +0 -81
  156. package/src/components/FloatingSupport.tsx +0 -18
  157. package/src/components/FormCardPayment.tsx +0 -184
  158. package/src/components/FormSubmissionEdit.tsx +0 -168
  159. package/src/components/HelpIcon.tsx +0 -12
  160. package/src/components/ImageEditor.tsx +0 -167
  161. package/src/components/InputBox.tsx +0 -97
  162. package/src/components/Loading.tsx +0 -31
  163. package/src/components/PageHeader.tsx +0 -111
  164. package/src/components/PersonAvatar.tsx +0 -78
  165. package/src/components/QuestionEdit.tsx +0 -99
  166. package/src/components/SmallButton.tsx +0 -42
  167. package/src/components/SupportModal.tsx +0 -32
  168. package/src/components/TabPanel.tsx +0 -28
  169. package/src/components/gallery/GalleryModal.tsx +0 -170
  170. package/src/components/gallery/StockPhotos.tsx +0 -96
  171. package/src/components/gallery/index.ts +0 -2
  172. package/src/components/header/Banner.tsx +0 -11
  173. package/src/components/header/PrimaryMenu.tsx +0 -101
  174. package/src/components/header/SecondaryMenu.tsx +0 -23
  175. package/src/components/header/SecondaryMenuAlt.tsx +0 -40
  176. package/src/components/header/SiteHeader.tsx +0 -205
  177. package/src/components/header/SupportDrawer.tsx +0 -112
  178. package/src/components/header/index.tsx +0 -2
  179. package/src/components/index.tsx +0 -20
  180. package/src/components/notes/AddNote.tsx +0 -185
  181. package/src/components/notes/Note.tsx +0 -84
  182. package/src/components/notes/Notes.tsx +0 -208
  183. package/src/components/notes/index.ts +0 -3
  184. package/src/components/wrapper/AppList.tsx +0 -18
  185. package/src/components/wrapper/ChurchList.tsx +0 -145
  186. package/src/components/wrapper/NavItem.tsx +0 -47
  187. package/src/components/wrapper/NewPrivateMessage.tsx +0 -249
  188. package/src/components/wrapper/Notifications.tsx +0 -220
  189. package/src/components/wrapper/PrivateMessageDetails.tsx +0 -106
  190. package/src/components/wrapper/PrivateMessages.tsx +0 -574
  191. package/src/components/wrapper/UserMenu.tsx +0 -384
  192. package/src/components/wrapper/index.tsx +0 -8
  193. package/src/helpers/AnalyticsHelper.ts +0 -44
  194. package/src/helpers/AppearanceHelper.ts +0 -73
  195. package/src/helpers/ArrayHelper.ts +0 -87
  196. package/src/helpers/CurrencyHelper.ts +0 -10
  197. package/src/helpers/DateHelper.ts +0 -116
  198. package/src/helpers/ErrorHelper.ts +0 -41
  199. package/src/helpers/EventHelper.ts +0 -49
  200. package/src/helpers/FileHelper.ts +0 -31
  201. package/src/helpers/Locale.ts +0 -457
  202. package/src/helpers/NotificationService.ts +0 -233
  203. package/src/helpers/PersonHelper.ts +0 -62
  204. package/src/helpers/SlugHelper.ts +0 -27
  205. package/src/helpers/SocketHelper.ts +0 -183
  206. package/src/helpers/UniqueIdHelper.ts +0 -36
  207. package/src/helpers/UserHelper.ts +0 -103
  208. package/src/helpers/createEmotionCache.ts +0 -17
  209. package/src/helpers/index.ts +0 -58
  210. package/src/hooks/index.ts +0 -3
  211. package/src/hooks/useMountedState.ts +0 -18
  212. package/src/hooks/useNotifications.ts +0 -95
  213. package/src/index.ts +0 -3
  214. package/src/types/interface-extensions.d.ts +0 -12
  215. package/tsconfig.json +0 -32
@@ -1,97 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import { Paper, Box, Typography, Stack, Button, PaperProps } from "@mui/material";
5
- import { Icon } from "@mui/material";
6
- import { HelpIcon } from "./HelpIcon";
7
- import { Locale } from "../helpers";
8
- import { styled, useTheme } from '@mui/material/styles';
9
-
10
- declare module '@mui/material/styles' {
11
- interface Palette {
12
- InputBox: { headerText: string; };
13
- }
14
- interface PaletteOptions {
15
- InputBox?: { headerText?: string; };
16
- }
17
- }
18
-
19
-
20
- interface Props {
21
- id?: string;
22
- children?: React.ReactNode;
23
- headerIcon?: string;
24
- headerText?: string;
25
- help?: string;
26
- saveText?: string;
27
- saveTextSubmitting?: string;
28
- deleteText?: string;
29
- cancelText?: string;
30
- headerActionContent?: React.ReactNode;
31
- cancelFunction?: () => void;
32
- deleteFunction?: () => void;
33
- saveFunction?: () => void;
34
- "data-testid"?: string;
35
- className?: string;
36
- isSubmitting?: boolean;
37
- ariaLabelDelete?: string;
38
- ariaLabelSave?: string;
39
- saveButtonType?: "submit" | "button";
40
- mainContainerCssProps?: PaperProps;
41
- }
42
-
43
- const CustomContextBox = styled(Box)({
44
- name: "InputBox",
45
- slot: "root",
46
- marginTop: 10,
47
- overflowX: "hidden",
48
- "& p": { color: "#666" },
49
- "& label": { color: "#999" },
50
- "& ul": { paddingLeft: 15 },
51
- "& li": {
52
- marginBottom: 10,
53
- "& i": { marginRight: 5 }
54
- },
55
- "& td": {
56
- "& i": { marginRight: 5 }
57
- }
58
- })
59
-
60
-
61
- export function InputBox({ mainContainerCssProps = {}, ...props }: Props) {
62
- const theme = useTheme();
63
- const headerText = theme?.palette?.InputBox?.headerText ? theme?.palette?.InputBox?.headerText : "primary";
64
-
65
- let buttons = [];
66
- if (props.cancelFunction) buttons.push(<Button key="cancel" onClick={props.cancelFunction} color="warning" sx={{ "&:focus": { outline: "none" } }}>{props.cancelText || Locale.label("common.cancel")}</Button>);
67
- if (props.deleteFunction) buttons.push(<Button key="delete" id="delete" variant="outlined" aria-label={props.ariaLabelDelete} onClick={props.deleteFunction} color="error" sx={{ "&:focus": { outline: "none" } }}>{props.deleteText || Locale.label("common.delete")}</Button>);
68
- if (props.saveFunction) buttons.push(<Button key="save" type={props.saveButtonType || "button"} variant="contained" disableElevation aria-label={props.ariaLabelSave} onClick={props.saveFunction} disabled={props.isSubmitting} sx={{ "&:focus": { outline: "none" } }}>{props.isSubmitting && props.saveTextSubmitting ? props.saveTextSubmitting : (props.saveText || Locale.label("common.save"))}</Button>);
69
-
70
- let classNames = ["inputBox"];
71
- if (props.className) {
72
- classNames.push(props.className);
73
- }
74
-
75
- return (
76
- <Paper id={props.id || "input-box"} sx={{ padding: 2, marginBottom: 4 }} data-testid={props["data-testid"]} {...mainContainerCssProps}>
77
- {props.help && <HelpIcon article={props.help} />}
78
- <Box id="input-box-header" sx={{ display: "flex", justifyContent: "space-between", alignItems: "center", position: "relative" }} data-testid="input-box-header">
79
- <Box id="input-box-title-section" display="flex" alignItems="center">
80
- {props.headerIcon && <Icon id="input-box-icon" sx={{ color: headerText }}>{props.headerIcon}</Icon>}
81
- {props.headerText && (
82
- <Typography id="input-box-title" component="h2" sx={{ display: "inline-block", marginLeft: props.headerIcon ? 1 : 0 }} variant="h6" color={headerText}>
83
- {props.headerText}
84
- </Typography>
85
- )}
86
- </Box>
87
- <Box id="input-box-actions">
88
- {props.headerActionContent}
89
- </Box>
90
- </Box>
91
- <CustomContextBox id="input-box-content">{props.children}</CustomContextBox>
92
- <Stack id="input-box-buttons" direction="row" sx={{ marginTop: 1 }} spacing={1} justifyContent="end">
93
- {buttons}
94
- </Stack>
95
- </Paper>
96
- );
97
- }
@@ -1,31 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import { Dots } from "react-activity";
5
- import "react-activity/dist/Dots.css";
6
-
7
- interface Props { size?: "sm" | "md" | "lg", loadingText?: string, color?: string }
8
-
9
- export const Loading: React.FC<Props> = (props) => {
10
-
11
- const getContents = () => {
12
- const text = (props.loadingText) ? props.loadingText : "Loading"
13
- const color = (props.color) ? props.color : "#222"
14
- let result = <><Dots speed={0.8} animating={true} size={32} color={color} /><p style={{ color: color }}>{text}</p></>
15
- switch (props.size) {
16
- case "sm":
17
- result = <><Dots speed={0.8} animating={true} size={20} color={color} /><p style={{ fontSize: 12, color: color }}>{text}</p></>
18
- break;
19
- case "lg":
20
- result = <><Dots speed={0.8} animating={true} size={48} color={color} /><p style={{ fontSize: 30, color: color }}>{text}</p></>
21
- break;
22
- }
23
- return result;
24
- }
25
-
26
- return (
27
- <div id="loading-component" style={{ textAlign: "center", fontFamily: "Roboto" }}>
28
- {getContents()}
29
- </div>
30
- )
31
- }
@@ -1,111 +0,0 @@
1
- import React, { ReactNode } from "react";
2
- import { Box, Typography, Stack } from "@mui/material";
3
-
4
- interface PageHeaderProps {
5
- icon: ReactNode;
6
- title: string;
7
- subtitle?: string;
8
- children?: ReactNode; // For action buttons or tabs
9
- statistics?: Array<{ icon: ReactNode; value: string; label: string }>;
10
- }
11
-
12
- export const PageHeader: React.FC<PageHeaderProps> = ({ icon, title, subtitle, children, statistics }) => {
13
- return (
14
- <Box id="page-header" sx={{
15
- backgroundColor: "var(--c1l2)",
16
- color: "#FFF",
17
- position: 'relative',
18
- left: '50%',
19
- right: '50%',
20
- marginLeft: '-50vw',
21
- marginRight: '-50vw',
22
- width: '100vw',
23
- '--c1': '#1565C0',
24
- '--c1d1': '#1358AD',
25
- '--c1d2': '#114A99',
26
- '--c1l2': '#568BDA'
27
- }}>
28
- <Box sx={{
29
- paddingX: { xs: 2, sm: 3, md: 4 },
30
- paddingY: 3
31
- }}>
32
- <Stack direction={{ xs: "column", md: "row" }} spacing={{ xs: 2, md: 4 }} alignItems={{ xs: "flex-start", md: "center" }} sx={{ width: "100%" }}>
33
- {/* Left side: Title and Icon */}
34
- <Stack id="page-header-title-section" direction="row" spacing={2} alignItems="center" sx={{ flex: 1 }}>
35
- <Box
36
- id="page-header-icon"
37
- sx={{
38
- backgroundColor: "rgba(255,255,255,0.2)",
39
- borderRadius: "12px",
40
- p: 1.5,
41
- display: "flex",
42
- alignItems: "center",
43
- justifyContent: "center",
44
- }}
45
- >
46
- {React.cloneElement(icon as React.ReactElement<any>, { sx: { fontSize: 32, color: "#FFF" } })}
47
- </Box>
48
- <Box id="page-header-text">
49
- <Typography
50
- id="page-header-title"
51
- variant="h4"
52
- sx={{
53
- fontWeight: 600,
54
- mb: 0.5,
55
- fontSize: { xs: "1.75rem", md: "2.125rem" },
56
- }}
57
- >
58
- {title}
59
- </Typography>
60
- {subtitle && (
61
- <Typography
62
- id="page-header-subtitle"
63
- variant="body1"
64
- sx={{
65
- color: "rgba(255,255,255,0.9)",
66
- fontSize: { xs: "0.875rem", md: "1rem" },
67
- }}
68
- >
69
- {subtitle}
70
- </Typography>
71
- )}
72
- </Box>
73
- </Stack>
74
-
75
- {/* Right side: Action Buttons/Tabs */}
76
- {children && (
77
- <Stack
78
- id="page-header-actions"
79
- direction="row"
80
- spacing={1}
81
- sx={{
82
- flexShrink: 0,
83
- justifyContent: { xs: "flex-start", md: "flex-end" },
84
- width: { xs: "100%", md: "auto" },
85
- }}
86
- >
87
- {children}
88
- </Stack>
89
- )}
90
- </Stack>
91
-
92
- {/* Statistics row */}
93
- {statistics && statistics.length > 0 && (
94
- <Stack id="page-header-statistics" direction={{ xs: "column", sm: "row" }} spacing={3} sx={{ mt: 3 }}>
95
- {statistics.map((stat) => (
96
- <Stack key={stat.label} direction="row" spacing={1} alignItems="center">
97
- {React.cloneElement(stat.icon as React.ReactElement<any>, { sx: { color: "#FFF", fontSize: 20 } })}
98
- <Typography variant="h6" sx={{ color: "#FFF", fontWeight: 600, mr: 1 }}>
99
- {stat.value}
100
- </Typography>
101
- <Typography variant="body2" sx={{ color: "rgba(255,255,255,0.9)", fontSize: "0.875rem" }}>
102
- {stat.label}
103
- </Typography>
104
- </Stack>
105
- ))}
106
- </Stack>
107
- )}
108
- </Box>
109
- </Box>
110
- );
111
- };
@@ -1,78 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import { Avatar, SxProps } from "@mui/material";
5
- import { PersonInterface } from "@churchapps/helpers";
6
- import { PersonHelper } from "../helpers";
7
-
8
- interface Props {
9
- person: PersonInterface;
10
- size?: "small" | "medium" | "large" | "xlarge" | "xxlarge" | "responsive";
11
- sx?: SxProps;
12
- onClick?: () => void;
13
- }
14
-
15
- export const PersonAvatar: React.FC<Props> = ({ person, size = "medium", sx, onClick }) => {
16
- const [imageError, setImageError] = React.useState(false);
17
-
18
- const getSizeProps = () => {
19
- switch (size) {
20
- case "small":
21
- return { width: 48, height: 48 };
22
- case "medium":
23
- return { width: 56, height: 56 };
24
- case "large":
25
- return { width: 80, height: 80 };
26
- case "xlarge":
27
- return { width: 100, height: 100 };
28
- case "xxlarge":
29
- return { width: 120, height: 120 };
30
- case "responsive":
31
- return { width: { xs: 70, sm: 80, md: 100 }, height: { xs: 70, sm: 80, md: 100 } };
32
- default:
33
- return { width: 56, height: 56 };
34
- }
35
- };
36
-
37
- const getInitials = () => {
38
- if (!person?.name?.display) return "?";
39
-
40
- const names = person.name.display.trim().split(" ");
41
- if (names.length >= 2) {
42
- return (names[0][0] + names[names.length - 1][0]).toUpperCase();
43
- } else if (names.length === 1) {
44
- return names[0][0]?.toUpperCase() || "?";
45
- }
46
- return "?";
47
- };
48
-
49
- const photoUrl = PersonHelper.getPhotoUrl(person);
50
- const sizeProps = getSizeProps();
51
-
52
- // Combine default styles with custom sx
53
- const combinedSx = {
54
- ...sizeProps,
55
- cursor: onClick ? "pointer" : "default",
56
- "&:hover": onClick ? {
57
- opacity: 0.8,
58
- transition: "opacity 0.2s ease-in-out",
59
- } : {},
60
- ...sx,
61
- };
62
-
63
- const handleImageError = () => {
64
- setImageError(true);
65
- };
66
-
67
- return (
68
- <Avatar
69
- src={!imageError ? photoUrl : undefined}
70
- alt={person?.name?.display || "User avatar"}
71
- sx={combinedSx}
72
- onClick={onClick}
73
- onError={handleImageError}
74
- >
75
- {(imageError || !photoUrl) && getInitials()}
76
- </Avatar>
77
- );
78
- };
@@ -1,99 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import { Elements } from "@stripe/react-stripe-js";
5
- import { Stripe } from "@stripe/stripe-js";
6
- import { MuiTelInput } from "mui-tel-input";
7
- import { AnswerInterface, QuestionInterface } from "@churchapps/helpers";
8
- import { Checkbox, Select, MenuItem, SelectChangeEvent, FormControl, InputLabel, TextField, FormLabel, FormGroup, FormControlLabel, Box } from "@mui/material";
9
- import { FormCardPayment } from "./FormCardPayment";
10
-
11
- interface Props {
12
- answer: AnswerInterface
13
- question: QuestionInterface,
14
- noBackground?: boolean,
15
- changeFunction: (questionId: string, value: string) => void,
16
- churchId?: string,
17
- ref?: React.ForwardedRef<any>,
18
- stripePromise?: Promise<Stripe>
19
- }
20
-
21
- export const QuestionEdit = React.forwardRef<any, Props>(({noBackground = false, ...props}, ref) => {
22
- const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | SelectChangeEvent<string>) => {
23
- props.changeFunction(props.question.id, e.target.value);
24
- }
25
-
26
- const handleCheck = (e: React.ChangeEvent<HTMLInputElement>) => {
27
- const selectedOptions = props.answer.value ? props.answer.value.split(",") : [];
28
- if (e.target.checked) {
29
- selectedOptions.push(e.target.name);
30
- } else {
31
- const idx = selectedOptions.indexOf(e.target.name);
32
- selectedOptions.splice(idx, 1);
33
- }
34
- props.changeFunction(props.question.id, selectedOptions.join());
35
- }
36
-
37
- let q = props.question;
38
-
39
- if (q.fieldType === "Heading") return <h5>{q.title}</h5>;
40
- else {
41
- let input = null;
42
- let choiceOptions = [];
43
- if (q.choices !== undefined && q.choices !== null) {
44
- if (q.fieldType === "Multiple Choice") {
45
- for (let i = 0; i < q.choices.length; i++) choiceOptions.push(<MenuItem key={q.choices[i].value} value={q.choices[i].value}>{q.choices[i].text}</MenuItem>);
46
- } else if (q.fieldType === "Checkbox") {
47
- for (let i = 0; i < q.choices.length; i++) choiceOptions.push(<FormControlLabel key={q.choices[i].value} label={q.choices[i].text} control={<Checkbox onChange={handleCheck} name={q.choices[i].value} />} />);
48
- }
49
- }
50
-
51
- let answerValue = (props.answer === null) ? "" : props.answer.value
52
- switch (q.fieldType) {
53
- case "Textbox": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} InputLabelProps={{ sx: { fontWeight: "bold" } }} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
54
- case "Multiple Choice": {
55
- input = (
56
- <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
57
- <InputLabel sx={{ fontWeight: "bold" }}>{q.title}</InputLabel>
58
- <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>{choiceOptions}</Select>
59
- </FormControl>);
60
- break;
61
- }
62
- case "Yes/No": {
63
- input = (
64
- <FormControl fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}}>
65
- <InputLabel sx={{ fontWeight: "bold" }}>{q.title}</InputLabel>
66
- <Select fullWidth label={q.title} value={answerValue} onChange={handleChange}>
67
- <MenuItem value="False">No</MenuItem>
68
- <MenuItem value="True">Yes</MenuItem>
69
- </Select>
70
- </FormControl>);
71
- break;
72
- }
73
- case "Checkbox": {
74
- input = (
75
- <FormControl fullWidth sx={{ marginLeft: 1 }}>
76
- <FormLabel sx={{ fontWeight: "bold" }}>{q.title}</FormLabel>
77
- <FormGroup>
78
- {choiceOptions}
79
- </FormGroup>
80
- </FormControl>
81
- );
82
- break;
83
- }
84
- case "Whole Number":
85
- case "Decimal":
86
- input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="number" InputLabelProps={{ shrink: true, sx: { fontWeight: "bold" } }} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />;
87
- break;
88
- case "Date": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="date" InputLabelProps={{ shrink: true, sx: { fontWeight: "bold" } }} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
89
- case "Phone Number": input = <MuiTelInput fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} InputLabelProps={{ sx: { fontWeight: "bold" } }} label={q.title} placeholder="" value={answerValue} onChange={(value) => { props.changeFunction(props.question.id, value); }} defaultCountry="US" focusOnSelectCountry excludedCountries={["TA", "AC"]} />; break;
90
- case "Email": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} type="email" InputLabelProps={{ sx: { fontWeight: "bold" } }} label={q.title} placeholder="john@doe.com" value={answerValue} onChange={handleChange} />; break;
91
- case "Text Area": input = <TextField fullWidth style={noBackground ? {backgroundColor: "white", borderRadius: "4px"} : {}} multiline rows={4} InputLabelProps={{ sx: { fontWeight: "bold" } }} label={q.title} placeholder={q.placeholder} value={answerValue} onChange={handleChange} />; break;
92
- case "Payment": input = <Elements stripe={props.stripePromise}><FormCardPayment churchId={props.churchId} question={q} ref={ref} /></Elements>; break;
93
- default: return null;
94
- }
95
- return input;
96
- }
97
-
98
- });
99
-
@@ -1,42 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import { Button, Icon, Tooltip } from "@mui/material";
5
- import { Navigate } from "react-router-dom";
6
-
7
- interface Props {
8
- ariaLabel?: string;
9
- text?: string;
10
- icon: string;
11
- color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning";
12
- toolTip?: string;
13
- onClick?: (e: React.MouseEvent) => void;
14
- href?: string;
15
- disabled?: boolean;
16
- "data-testid"?: string;
17
- }
18
-
19
- export const SmallButton = React.forwardRef<HTMLDivElement, Props>((props, ref) => {
20
- const [redirectUrl, setRedirectUrl] = React.useState("");
21
-
22
- const handleClick = (e: React.MouseEvent) => {
23
- e.preventDefault();
24
- if (props.href) setRedirectUrl(props.href);
25
- else if (props.onClick) props.onClick(e);
26
- }
27
-
28
- const style = (props.text)
29
- ? { backgroundColor: props.color, "& span": { marginRight: 1 } }
30
- : { minWidth: "auto", padding: "4px 4px" }
31
-
32
- if (redirectUrl) return <Navigate to={redirectUrl} />
33
- else return (
34
- <Tooltip title={props.toolTip || ""} arrow placement="top">
35
- <Button sx={style} disabled={props.disabled} variant={props.text ? "outlined" : "text"} color={props.color} aria-label={props.ariaLabel || "editButton"} onClick={handleClick} size="small" data-testid={props["data-testid"] || `small-button-${props.icon}`}>
36
- <Icon>{props.icon}</Icon>{(props.text) ? props.text : ""}
37
- </Button>
38
- </Tooltip>
39
- );
40
- });
41
-
42
- SmallButton.displayName = "SmallButton";
@@ -1,32 +0,0 @@
1
- "use client";
2
-
3
- import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Icon, Stack } from "@mui/material";
4
- import React from "react";
5
- import { Locale } from "../helpers";
6
-
7
- interface Props {
8
- appName?: string
9
- onClose: () => void
10
- }
11
-
12
- export const SupportModal: React.FC<Props> = ({ appName = "", onClose }) => {
13
- const subject = appName ? `?subject=${appName} Support` : ""
14
-
15
- return (<>
16
- <Dialog
17
- open={true}
18
- onClose={onClose}
19
- aria-labelledby="support-modal-title"
20
- aria-describedby="support-modal-content"
21
- >
22
- <DialogTitle id="support-modal-title">Get Support</DialogTitle>
23
- <DialogContent id="support-modal-content">
24
- <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>info</Icon> {Locale.label("support.documentation")}:</Stack></b> <a href="https://support.churchapps.org" target="_new">https://support.churchapps.org</a></Stack>
25
- <Stack direction="row" alignItems="center" sx={{flexWrap: "wrap"}} mb={2}><b><Stack direction="row" alignItems="center" mr="5px"><Icon sx={{marginRight: "5px"}}>forum</Icon> {Locale.label("support.discussions")}:</Stack></b> <a href="https://github.com/orgs/ChurchApps/discussions" target="_new">https://github.com/orgs/ChurchApps/discussions</a></Stack>
26
- </DialogContent>
27
- <DialogActions sx={{ paddingX: "16px", paddingBottom: "12px" }}>
28
- <Button variant="outlined" onClick={onClose}>Close</Button>
29
- </DialogActions>
30
- </Dialog>
31
- </>);
32
- };
@@ -1,28 +0,0 @@
1
- import React from "react";
2
- import { Box } from "@mui/material";
3
-
4
- interface TabPanelProps {
5
- children?: React.ReactNode;
6
- index: number;
7
- value: number;
8
- }
9
-
10
- export function TabPanel(props: TabPanelProps) {
11
- const { children, value, index, ...other } = props;
12
-
13
- return (
14
- <div
15
- role="tabpanel"
16
- hidden={value !== index}
17
- id={`simple-tabpanel-${index}`}
18
- aria-labelledby={`simple-tab-${index}`}
19
- {...other}
20
- >
21
- {value === index && (
22
- <Box sx={{ p: 3 }}>
23
- {children}
24
- </Box>
25
- )}
26
- </div>
27
- );
28
- }