@churchapps/apphelper 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +22 -22
  5. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  6. package/dist/components/FormSubmissionEdit.js +2 -9
  7. package/dist/components/FormSubmissionEdit.js.map +1 -1
  8. package/dist/components/QuestionEdit.js +2 -2
  9. package/dist/components/QuestionEdit.js.map +1 -1
  10. package/dist/components/markdownEditor/editor.css +787 -787
  11. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  12. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  13. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  14. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  15. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  16. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  17. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  18. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  19. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  20. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  21. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  22. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  23. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  26. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  27. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  29. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  30. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  31. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  32. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  33. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  34. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  35. package/dist/pageComponents/components/SelectChurchRegister.js +3 -3
  36. package/dist/pageComponents/components/SelectChurchRegister.js.map +1 -1
  37. package/package.json +85 -85
  38. package/src/components/CreatePerson.tsx +80 -80
  39. package/src/components/DisplayBox.tsx +68 -68
  40. package/src/components/ErrorMessages.tsx +26 -26
  41. package/src/components/ExportLink.tsx +67 -67
  42. package/src/components/FloatingSupport.tsx +16 -16
  43. package/src/components/FormSubmissionEdit.tsx +120 -129
  44. package/src/components/HelpIcon.tsx +10 -10
  45. package/src/components/ImageEditor.tsx +126 -126
  46. package/src/components/InputBox.tsx +73 -73
  47. package/src/components/Loading.tsx +29 -29
  48. package/src/components/PersonAdd.tsx +75 -75
  49. package/src/components/QuestionEdit.tsx +63 -63
  50. package/src/components/SmallButton.tsx +39 -39
  51. package/src/components/SupportModal.tsx +26 -26
  52. package/src/components/TabPanel.tsx +34 -34
  53. package/src/components/gallery/GalleryModal.tsx +102 -102
  54. package/src/components/gallery/StockPhotos.tsx +74 -74
  55. package/src/components/gallery/index.ts +1 -1
  56. package/src/components/iconPicker/IconNamesList.ts +2240 -2240
  57. package/src/components/iconPicker/IconPicker.tsx +153 -153
  58. package/src/components/index.tsx +24 -24
  59. package/src/components/markdownEditor/Editor.tsx +132 -132
  60. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  61. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  62. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  63. package/src/components/markdownEditor/editor.css +787 -787
  64. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  65. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  66. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  67. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  68. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  69. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  70. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  71. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  72. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  73. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  74. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  75. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  76. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  77. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  78. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  79. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  80. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  81. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  82. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  83. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  84. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  85. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  86. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  87. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  88. package/src/components/markdownEditor/index.ts +2 -2
  89. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  90. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  91. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  92. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  93. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  94. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  95. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  96. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  97. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  98. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  99. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  100. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  101. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  102. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  103. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  104. package/src/components/markdownEditor/plugins/index.ts +6 -6
  105. package/src/components/markdownEditor/theme.ts +65 -65
  106. package/src/components/notes/AddNote.tsx +90 -90
  107. package/src/components/notes/Conversation.tsx +82 -82
  108. package/src/components/notes/Conversations.tsx +58 -58
  109. package/src/components/notes/NewConversation.tsx +78 -78
  110. package/src/components/notes/Note.tsx +44 -44
  111. package/src/components/notes/Notes.tsx +68 -68
  112. package/src/components/notes/index.ts +5 -5
  113. package/src/components/reporting/ChartReport.tsx +98 -98
  114. package/src/components/reporting/ReportFilter.tsx +54 -54
  115. package/src/components/reporting/ReportFilterField.tsx +160 -160
  116. package/src/components/reporting/ReportOutput.tsx +79 -79
  117. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  118. package/src/components/reporting/TableReport.tsx +57 -57
  119. package/src/components/reporting/TreeReport.tsx +111 -111
  120. package/src/components/reporting/index.ts +4 -4
  121. package/src/components/wrapper/AppList.tsx +20 -20
  122. package/src/components/wrapper/ChurchList.tsx +22 -22
  123. package/src/components/wrapper/Drawers.tsx +60 -60
  124. package/src/components/wrapper/NavItem.tsx +41 -41
  125. package/src/components/wrapper/NewPrivateMessage.tsx +103 -103
  126. package/src/components/wrapper/NotificationMenu.tsx +85 -85
  127. package/src/components/wrapper/Notifications.tsx +50 -50
  128. package/src/components/wrapper/PrivateMessageDetails.tsx +23 -23
  129. package/src/components/wrapper/PrivateMessages.tsx +87 -87
  130. package/src/components/wrapper/SiteWrapper.tsx +96 -96
  131. package/src/components/wrapper/TabPanel.tsx +30 -30
  132. package/src/components/wrapper/UserMenu.tsx +106 -106
  133. package/src/components/wrapper/index.tsx +5 -5
  134. package/src/donationComponents/DonationPage.tsx +136 -136
  135. package/src/donationComponents/components/BankForm.tsx +159 -159
  136. package/src/donationComponents/components/CardForm.tsx +104 -104
  137. package/src/donationComponents/components/DonationForm.tsx +235 -235
  138. package/src/donationComponents/components/FundDonation.tsx +49 -49
  139. package/src/donationComponents/components/FundDonations.tsx +39 -39
  140. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  141. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  142. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  143. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  144. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  145. package/src/donationComponents/components/index.tsx +9 -9
  146. package/src/donationComponents/index.ts +3 -3
  147. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  148. package/src/helpers/AnalyticsHelper.ts +33 -33
  149. package/src/helpers/ApiHelper.ts +125 -125
  150. package/src/helpers/AppearanceHelper.ts +69 -69
  151. package/src/helpers/ArrayHelper.ts +81 -81
  152. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  153. package/src/helpers/CurrencyHelper.ts +10 -10
  154. package/src/helpers/DateHelper.ts +108 -108
  155. package/src/helpers/DonationHelper.ts +26 -26
  156. package/src/helpers/ErrorHelper.ts +36 -36
  157. package/src/helpers/EventHelper.ts +52 -52
  158. package/src/helpers/FileHelper.ts +31 -31
  159. package/src/helpers/PersonHelper.ts +60 -60
  160. package/src/helpers/SocketHelper.ts +76 -76
  161. package/src/helpers/Themes.ts +14 -14
  162. package/src/helpers/UniqueIdHelper.ts +36 -36
  163. package/src/helpers/UserHelper.ts +59 -59
  164. package/src/helpers/createEmotionCache.ts +17 -17
  165. package/src/helpers/index.ts +18 -18
  166. package/src/hooks/index.ts +1 -1
  167. package/src/hooks/useMountedState.ts +16 -16
  168. package/src/index.ts +6 -6
  169. package/src/interfaces/Access.ts +24 -24
  170. package/src/interfaces/Attendance.ts +8 -8
  171. package/src/interfaces/Content.ts +10 -10
  172. package/src/interfaces/Doing.ts +24 -24
  173. package/src/interfaces/Donation.ts +45 -45
  174. package/src/interfaces/Error.ts +17 -17
  175. package/src/interfaces/Membership.ts +51 -51
  176. package/src/interfaces/Messaging.ts +21 -21
  177. package/src/interfaces/Permissions.ts +68 -68
  178. package/src/interfaces/Reporting.ts +7 -7
  179. package/src/interfaces/UserContextInterface.ts +13 -13
  180. package/src/interfaces/index.ts +13 -13
  181. package/src/pageComponents/LoginPage.tsx +244 -244
  182. package/src/pageComponents/LogoutPage.tsx +28 -28
  183. package/src/pageComponents/components/Forgot.tsx +79 -79
  184. package/src/pageComponents/components/Login.tsx +54 -54
  185. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  186. package/src/pageComponents/components/Register.tsx +107 -107
  187. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  188. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  189. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  190. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  191. package/src/pageComponents/index.ts +3 -3
  192. package/tsconfig.json +34 -34
  193. package/tslint.json +14 -14
@@ -1,98 +1,98 @@
1
- import React from "react";
2
- import { Chart } from "react-google-charts";
3
- import { ColumnInterface, ReportOutputInterface, ReportResultInterface } from "../../interfaces";
4
- import { DateHelper } from "../../helpers";
5
-
6
- interface Props { reportResult: ReportResultInterface, output: ReportOutputInterface }
7
-
8
- export const ChartReport = (props: Props) => {
9
- let rows: any = [];
10
-
11
- const getChartData = () => {
12
- if (props.output.columns.length === 2) return getSingleData();
13
- else return getMultiData();
14
- }
15
-
16
- const getHeaders = () => {
17
- const result: string[] = [];
18
- const uniqueValues: string[] = [];
19
-
20
- props.reportResult.table.forEach(d => {
21
- const val = getField(props.output.columns[1], d);
22
- if (uniqueValues.indexOf(val) === -1) uniqueValues.push(val);
23
- });
24
-
25
- result.push(props.output.columns[0].header);
26
- uniqueValues.forEach(v => result.push(v));
27
-
28
- return result;
29
- }
30
-
31
- const getHeaderIndex = (headers: string[], header: string) => {
32
- let result = -1;
33
- let i = 0;
34
- headers.forEach(h => {
35
- if (h === header) result = i;
36
- i++;
37
- })
38
- return result;
39
- }
40
-
41
- const transformData = (headers: string[]) => {
42
- const result: any[] = [];
43
- props.reportResult.table.forEach(d => {
44
- const firstVal = getField(props.output.columns[0], d);
45
- const secondVal = getField(props.output.columns[1], d);
46
- const headerIndex = getHeaderIndex(headers, secondVal);
47
-
48
- let row: any[] = []
49
- if (result.length === 0 || firstVal !== result[result.length - 1][0]) {
50
- row[0] = firstVal;
51
- for (let i = 1; i < headers.length; i++) row[i] = 0;
52
- result.push(row);
53
- } else row = result[result.length - 1];
54
-
55
- row[headerIndex] = parseFloat(d[props.output.columns[2].value]);
56
- });
57
-
58
- return result;
59
- }
60
-
61
- const getMultiData = () => {
62
- const headers = getHeaders();
63
- rows = [];
64
- rows.push(headers);
65
- transformData(headers).forEach(d => {
66
- rows.push(d);
67
- })
68
-
69
- return rows;
70
- }
71
-
72
- const getSingleData = () => {
73
- rows = [];
74
- rows.push([props.output.columns[0].header, props.output.columns[1].header]);
75
- props.reportResult.table.forEach(d => {
76
- rows.push([getField(props.output.columns[0], d), parseFloat(getField(props.output.columns[1], d))])
77
- });
78
- return rows;
79
- }
80
-
81
- const getField = (column: ColumnInterface, dataRow: any) => {
82
- let result = dataRow[column.value].toString() || "";
83
-
84
- switch (column.formatter) {
85
- case "date":
86
- let dt = new Date(result);
87
- result = DateHelper.prettyDate(dt);
88
- break;
89
- }
90
- return result;
91
- }
92
-
93
- let result = <p>There is no data to display</p>
94
- if (props.reportResult.table?.length > 0) result = (<Chart chartType="ColumnChart" data={getChartData()} width="100%" height="400px" options={{ height: 400, legend: { position: "top", maxLines: 3 }, bar: { groupWidth: "75%" }, isStacked: true }} />);
95
-
96
- return result;
97
-
98
- }
1
+ import React from "react";
2
+ import { Chart } from "react-google-charts";
3
+ import { ColumnInterface, ReportOutputInterface, ReportResultInterface } from "../../interfaces";
4
+ import { DateHelper } from "../../helpers";
5
+
6
+ interface Props { reportResult: ReportResultInterface, output: ReportOutputInterface }
7
+
8
+ export const ChartReport = (props: Props) => {
9
+ let rows: any = [];
10
+
11
+ const getChartData = () => {
12
+ if (props.output.columns.length === 2) return getSingleData();
13
+ else return getMultiData();
14
+ }
15
+
16
+ const getHeaders = () => {
17
+ const result: string[] = [];
18
+ const uniqueValues: string[] = [];
19
+
20
+ props.reportResult.table.forEach(d => {
21
+ const val = getField(props.output.columns[1], d);
22
+ if (uniqueValues.indexOf(val) === -1) uniqueValues.push(val);
23
+ });
24
+
25
+ result.push(props.output.columns[0].header);
26
+ uniqueValues.forEach(v => result.push(v));
27
+
28
+ return result;
29
+ }
30
+
31
+ const getHeaderIndex = (headers: string[], header: string) => {
32
+ let result = -1;
33
+ let i = 0;
34
+ headers.forEach(h => {
35
+ if (h === header) result = i;
36
+ i++;
37
+ })
38
+ return result;
39
+ }
40
+
41
+ const transformData = (headers: string[]) => {
42
+ const result: any[] = [];
43
+ props.reportResult.table.forEach(d => {
44
+ const firstVal = getField(props.output.columns[0], d);
45
+ const secondVal = getField(props.output.columns[1], d);
46
+ const headerIndex = getHeaderIndex(headers, secondVal);
47
+
48
+ let row: any[] = []
49
+ if (result.length === 0 || firstVal !== result[result.length - 1][0]) {
50
+ row[0] = firstVal;
51
+ for (let i = 1; i < headers.length; i++) row[i] = 0;
52
+ result.push(row);
53
+ } else row = result[result.length - 1];
54
+
55
+ row[headerIndex] = parseFloat(d[props.output.columns[2].value]);
56
+ });
57
+
58
+ return result;
59
+ }
60
+
61
+ const getMultiData = () => {
62
+ const headers = getHeaders();
63
+ rows = [];
64
+ rows.push(headers);
65
+ transformData(headers).forEach(d => {
66
+ rows.push(d);
67
+ })
68
+
69
+ return rows;
70
+ }
71
+
72
+ const getSingleData = () => {
73
+ rows = [];
74
+ rows.push([props.output.columns[0].header, props.output.columns[1].header]);
75
+ props.reportResult.table.forEach(d => {
76
+ rows.push([getField(props.output.columns[0], d), parseFloat(getField(props.output.columns[1], d))])
77
+ });
78
+ return rows;
79
+ }
80
+
81
+ const getField = (column: ColumnInterface, dataRow: any) => {
82
+ let result = dataRow[column.value].toString() || "";
83
+
84
+ switch (column.formatter) {
85
+ case "date":
86
+ let dt = new Date(result);
87
+ result = DateHelper.prettyDate(dt);
88
+ break;
89
+ }
90
+ return result;
91
+ }
92
+
93
+ let result = <p>There is no data to display</p>
94
+ if (props.reportResult.table?.length > 0) result = (<Chart chartType="ColumnChart" data={getChartData()} width="100%" height="400px" options={{ height: 400, legend: { position: "top", maxLines: 3 }, bar: { groupWidth: "75%" }, isStacked: true }} />);
95
+
96
+ return result;
97
+
98
+ }
@@ -1,54 +1,54 @@
1
- import React from "react";
2
- import { ReportInterface, ParameterInterface } from "../../interfaces";
3
- import { ArrayHelper } from "../../helpers"
4
- import { InputBox } from "../"
5
- import { ReportFilterField } from "./ReportFilterField";
6
-
7
- interface Props { report: ReportInterface, onChange: (report: ReportInterface) => void, onRun: () => void }
8
-
9
- export const ReportFilter = (props: Props) => {
10
-
11
- const handleChange = (parameter: ParameterInterface, permittedChildIds: string[]) => {
12
- const r = { ...props.report };
13
- const p: ParameterInterface = ArrayHelper.getOne(r.parameters, "keyName", parameter.keyName);
14
- p.value = parameter.value;
15
- updateChildIds(r, p, permittedChildIds)
16
- props.onChange(r);
17
- }
18
-
19
- const updateChildIds = (report: ReportInterface, parameter: ParameterInterface, permittedChildIds: string[]) => {
20
- switch (parameter.sourceKey) {
21
- case "campus":
22
- setRequiredParentIds(report, "service", permittedChildIds);
23
- break;
24
- case "service":
25
- setRequiredParentIds(report, "serviceTime", permittedChildIds);
26
- break;
27
- case "serviceTime":
28
- setRequiredParentIds(report, "group", permittedChildIds);
29
- break;
30
- }
31
- }
32
-
33
- const setRequiredParentIds = (report: ReportInterface, childSourceKey: string, requiredParentIds: string[]) => {
34
- const child: ParameterInterface = ArrayHelper.getOne(report.parameters, "sourceKey", childSourceKey);
35
- if (child) child.requiredParentIds = requiredParentIds;
36
- }
37
-
38
- const getInputs = () => {
39
- const result: JSX.Element[] = [];
40
- props.report.parameters.forEach((p, i) => {
41
- if (p.source === "dropdown" || p.source === "date") {
42
- result.push(<ReportFilterField key={i} parameter={p} report={props.report} onChange={handleChange} />)
43
- }
44
- });
45
- return result;
46
- }
47
-
48
- const inputs = getInputs();
49
- if (inputs.length > 0) {
50
- return <InputBox id="formSubmissionBox" headerText="Filter Report" headerIcon="summarize" saveFunction={props.onRun} saveText="Run Report">
51
- {inputs}
52
- </InputBox>
53
- } else return <> </>
54
- }
1
+ import React from "react";
2
+ import { ReportInterface, ParameterInterface } from "../../interfaces";
3
+ import { ArrayHelper } from "../../helpers"
4
+ import { InputBox } from "../"
5
+ import { ReportFilterField } from "./ReportFilterField";
6
+
7
+ interface Props { report: ReportInterface, onChange: (report: ReportInterface) => void, onRun: () => void }
8
+
9
+ export const ReportFilter = (props: Props) => {
10
+
11
+ const handleChange = (parameter: ParameterInterface, permittedChildIds: string[]) => {
12
+ const r = { ...props.report };
13
+ const p: ParameterInterface = ArrayHelper.getOne(r.parameters, "keyName", parameter.keyName);
14
+ p.value = parameter.value;
15
+ updateChildIds(r, p, permittedChildIds)
16
+ props.onChange(r);
17
+ }
18
+
19
+ const updateChildIds = (report: ReportInterface, parameter: ParameterInterface, permittedChildIds: string[]) => {
20
+ switch (parameter.sourceKey) {
21
+ case "campus":
22
+ setRequiredParentIds(report, "service", permittedChildIds);
23
+ break;
24
+ case "service":
25
+ setRequiredParentIds(report, "serviceTime", permittedChildIds);
26
+ break;
27
+ case "serviceTime":
28
+ setRequiredParentIds(report, "group", permittedChildIds);
29
+ break;
30
+ }
31
+ }
32
+
33
+ const setRequiredParentIds = (report: ReportInterface, childSourceKey: string, requiredParentIds: string[]) => {
34
+ const child: ParameterInterface = ArrayHelper.getOne(report.parameters, "sourceKey", childSourceKey);
35
+ if (child) child.requiredParentIds = requiredParentIds;
36
+ }
37
+
38
+ const getInputs = () => {
39
+ const result: JSX.Element[] = [];
40
+ props.report.parameters.forEach((p, i) => {
41
+ if (p.source === "dropdown" || p.source === "date") {
42
+ result.push(<ReportFilterField key={i} parameter={p} report={props.report} onChange={handleChange} />)
43
+ }
44
+ });
45
+ return result;
46
+ }
47
+
48
+ const inputs = getInputs();
49
+ if (inputs.length > 0) {
50
+ return <InputBox id="formSubmissionBox" headerText="Filter Report" headerIcon="summarize" saveFunction={props.onRun} saveText="Run Report">
51
+ {inputs}
52
+ </InputBox>
53
+ } else return <> </>
54
+ }
@@ -1,160 +1,160 @@
1
- import React from "react";
2
- import { ReportInterface, ParameterInterface } from "../../interfaces";
3
- import { ApiHelper, ArrayHelper, DateHelper } from "../../helpers";
4
- import { FormControl, InputLabel, Select, SelectChangeEvent, TextField, MenuItem } from "@mui/material";
5
- import { useMountedState } from "../../hooks/useMountedState";
6
-
7
- interface Props {
8
- parameter: ParameterInterface,
9
- report: ReportInterface,
10
- onChange: (parameter: ParameterInterface, permittedChildIds: string[]) => void
11
- }
12
-
13
- export const ReportFilterField = (props: Props) => {
14
-
15
- const [rawData, setRawData] = React.useState<any[]>(null);
16
- const [secondaryData, setSecondaryData] = React.useState<any[]>(null);
17
- const isMounted = useMountedState();
18
-
19
- const init = async () => {
20
- switch (props.parameter.sourceKey) {
21
- case "provided":
22
- setRawData(props.parameter.options);
23
- break;
24
- case "month":
25
- setRawData(getMonths());
26
- break;
27
- case "campus":
28
- ApiHelper.get("/campuses", "AttendanceApi").then(data => { data.unshift({ id: "", name: "Any" });
29
- if(isMounted()) {
30
- setRawData(data);
31
- }})
32
- break;
33
- case "service":
34
- ApiHelper.get("/services", "AttendanceApi").then(data => { data.unshift({ id: "", name: "Any" });
35
- if(isMounted()) {
36
- setRawData(data);
37
- }})
38
- break;
39
- case "serviceTime":
40
- ApiHelper.get("/serviceTimes", "AttendanceApi").then(data => { data.unshift({ id: "", name: "Any" });
41
- if(isMounted()) {
42
- setRawData(data);
43
- }})
44
- break;
45
- case "group":
46
- ApiHelper.get("/groups", "MembershipApi").then(data => { data.unshift({ id: "", name: "Any" });
47
- if(isMounted()) {
48
- setRawData(data);
49
- }})
50
- ApiHelper.get("/groupServiceTimes", "AttendanceApi").then(data => {
51
- if(isMounted()) {
52
- setSecondaryData(data);
53
- }})
54
- break;
55
- }
56
- setDefaultValue();
57
- }
58
-
59
- const setDefaultValue = () => {
60
- switch (props.parameter.source) {
61
- case "date":
62
- if (props.parameter.defaultValue) {
63
- let dt = new Date();
64
- if (props.parameter.defaultValue === "yesterday") dt.setDate(dt.getDate() - 1);
65
- if (props.parameter.defaultValue === "lastYear") dt.setFullYear(dt.getFullYear() - 1);
66
- if (props.parameter.defaultValue === "lastSunday") dt = DateHelper.getLastSunday();
67
- const p = { ...props.parameter };
68
- p.value = DateHelper.formatHtml5Date(dt);
69
- props.onChange(p, []);
70
- }
71
- break;
72
- }
73
- }
74
-
75
- const getMonths = () => {
76
- const list = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "Novermber", "December"]
77
- const result = [];
78
- for (let i = 0; i < list.length; i++) result.push({ value: (i + 1).toString(), text: list[i] });
79
- return result;
80
- }
81
-
82
- const getIdName = () => {
83
- const result: { value: string, text: string }[] = [];
84
- filterOptions().forEach(d => { result.push({ value: d.id, text: d.name }); });
85
- return result;
86
- }
87
-
88
- const filterOptions = () => {
89
- let result = rawData;
90
- if (props.parameter.requiredParentIds?.length > 0) {
91
- switch (props.parameter.sourceKey) {
92
- case "service":
93
- result = ArrayHelper.getAllArray(rawData, "campusId", props.parameter.requiredParentIds);
94
- result.unshift({ id: "", name: "Any" });
95
- break;
96
- case "serviceTime":
97
- result = ArrayHelper.getAllArray(rawData, "serviceId", props.parameter.requiredParentIds);
98
- result.unshift({ id: "", name: "Any" });
99
- break;
100
- case "group":
101
- const times = ArrayHelper.getAllArray(secondaryData, "serviceTimeId", props.parameter.requiredParentIds)
102
- result = ArrayHelper.getAllArray(rawData, "id", ArrayHelper.getUniqueValues(times, "groupId"));
103
- result.unshift({ id: "", name: "Any" });
104
- break;
105
- }
106
- }
107
- return result;
108
- }
109
-
110
- const getOptions = () => {
111
- let options: { value: string, text: string }[] = []
112
- if (rawData) {
113
- switch (props.parameter.sourceKey) {
114
- case "campus":
115
- case "service":
116
- case "serviceTime":
117
- case "group":
118
- options = getIdName();
119
- break;
120
- case "month":
121
- case "provided":
122
- options = rawData;
123
- break;
124
- }
125
- }
126
-
127
- return options;
128
- }
129
-
130
- const options = getOptions();
131
-
132
- const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | SelectChangeEvent<string>) => {
133
- const p = { ...props.parameter };
134
- p.value = e.target.value;
135
- let parentIds = [];
136
- if (p.value) parentIds.push(p.value);
137
- props.onChange(p, parentIds);
138
- }
139
-
140
- React.useEffect(() => { init() }, [props.parameter.keyName, isMounted]); //eslint-disable-line
141
-
142
- let result = <></>
143
- switch (props.parameter.source) {
144
- case "dropdown":
145
- result = (
146
- <FormControl fullWidth>
147
- <InputLabel>{props.parameter.displayName}</InputLabel>
148
- <Select value={options.find(v => v.value === props.parameter.value)?.value || ""} label={props.parameter.displayName} onChange={handleChange} name={props.parameter.keyName}>
149
- {options.map((o,i) => <MenuItem key={i} value={o.value}>{o.text}</MenuItem>)}
150
- </Select>
151
- </FormControl>
152
- );
153
- break;
154
- case "date":
155
- result = (<TextField type="date" fullWidth InputLabelProps={{shrink: true}} label="Date" value={props.parameter.value || ""} onChange={handleChange} name={props.parameter.keyName} />)
156
- break;
157
- }
158
- return result;
159
-
160
- }
1
+ import React from "react";
2
+ import { ReportInterface, ParameterInterface } from "../../interfaces";
3
+ import { ApiHelper, ArrayHelper, DateHelper } from "../../helpers";
4
+ import { FormControl, InputLabel, Select, SelectChangeEvent, TextField, MenuItem } from "@mui/material";
5
+ import { useMountedState } from "../../hooks/useMountedState";
6
+
7
+ interface Props {
8
+ parameter: ParameterInterface,
9
+ report: ReportInterface,
10
+ onChange: (parameter: ParameterInterface, permittedChildIds: string[]) => void
11
+ }
12
+
13
+ export const ReportFilterField = (props: Props) => {
14
+
15
+ const [rawData, setRawData] = React.useState<any[]>(null);
16
+ const [secondaryData, setSecondaryData] = React.useState<any[]>(null);
17
+ const isMounted = useMountedState();
18
+
19
+ const init = async () => {
20
+ switch (props.parameter.sourceKey) {
21
+ case "provided":
22
+ setRawData(props.parameter.options);
23
+ break;
24
+ case "month":
25
+ setRawData(getMonths());
26
+ break;
27
+ case "campus":
28
+ ApiHelper.get("/campuses", "AttendanceApi").then(data => { data.unshift({ id: "", name: "Any" });
29
+ if(isMounted()) {
30
+ setRawData(data);
31
+ }})
32
+ break;
33
+ case "service":
34
+ ApiHelper.get("/services", "AttendanceApi").then(data => { data.unshift({ id: "", name: "Any" });
35
+ if(isMounted()) {
36
+ setRawData(data);
37
+ }})
38
+ break;
39
+ case "serviceTime":
40
+ ApiHelper.get("/serviceTimes", "AttendanceApi").then(data => { data.unshift({ id: "", name: "Any" });
41
+ if(isMounted()) {
42
+ setRawData(data);
43
+ }})
44
+ break;
45
+ case "group":
46
+ ApiHelper.get("/groups", "MembershipApi").then(data => { data.unshift({ id: "", name: "Any" });
47
+ if(isMounted()) {
48
+ setRawData(data);
49
+ }})
50
+ ApiHelper.get("/groupServiceTimes", "AttendanceApi").then(data => {
51
+ if(isMounted()) {
52
+ setSecondaryData(data);
53
+ }})
54
+ break;
55
+ }
56
+ setDefaultValue();
57
+ }
58
+
59
+ const setDefaultValue = () => {
60
+ switch (props.parameter.source) {
61
+ case "date":
62
+ if (props.parameter.defaultValue) {
63
+ let dt = new Date();
64
+ if (props.parameter.defaultValue === "yesterday") dt.setDate(dt.getDate() - 1);
65
+ if (props.parameter.defaultValue === "lastYear") dt.setFullYear(dt.getFullYear() - 1);
66
+ if (props.parameter.defaultValue === "lastSunday") dt = DateHelper.getLastSunday();
67
+ const p = { ...props.parameter };
68
+ p.value = DateHelper.formatHtml5Date(dt);
69
+ props.onChange(p, []);
70
+ }
71
+ break;
72
+ }
73
+ }
74
+
75
+ const getMonths = () => {
76
+ const list = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "Novermber", "December"]
77
+ const result = [];
78
+ for (let i = 0; i < list.length; i++) result.push({ value: (i + 1).toString(), text: list[i] });
79
+ return result;
80
+ }
81
+
82
+ const getIdName = () => {
83
+ const result: { value: string, text: string }[] = [];
84
+ filterOptions().forEach(d => { result.push({ value: d.id, text: d.name }); });
85
+ return result;
86
+ }
87
+
88
+ const filterOptions = () => {
89
+ let result = rawData;
90
+ if (props.parameter.requiredParentIds?.length > 0) {
91
+ switch (props.parameter.sourceKey) {
92
+ case "service":
93
+ result = ArrayHelper.getAllArray(rawData, "campusId", props.parameter.requiredParentIds);
94
+ result.unshift({ id: "", name: "Any" });
95
+ break;
96
+ case "serviceTime":
97
+ result = ArrayHelper.getAllArray(rawData, "serviceId", props.parameter.requiredParentIds);
98
+ result.unshift({ id: "", name: "Any" });
99
+ break;
100
+ case "group":
101
+ const times = ArrayHelper.getAllArray(secondaryData, "serviceTimeId", props.parameter.requiredParentIds)
102
+ result = ArrayHelper.getAllArray(rawData, "id", ArrayHelper.getUniqueValues(times, "groupId"));
103
+ result.unshift({ id: "", name: "Any" });
104
+ break;
105
+ }
106
+ }
107
+ return result;
108
+ }
109
+
110
+ const getOptions = () => {
111
+ let options: { value: string, text: string }[] = []
112
+ if (rawData) {
113
+ switch (props.parameter.sourceKey) {
114
+ case "campus":
115
+ case "service":
116
+ case "serviceTime":
117
+ case "group":
118
+ options = getIdName();
119
+ break;
120
+ case "month":
121
+ case "provided":
122
+ options = rawData;
123
+ break;
124
+ }
125
+ }
126
+
127
+ return options;
128
+ }
129
+
130
+ const options = getOptions();
131
+
132
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | SelectChangeEvent<string>) => {
133
+ const p = { ...props.parameter };
134
+ p.value = e.target.value;
135
+ let parentIds = [];
136
+ if (p.value) parentIds.push(p.value);
137
+ props.onChange(p, parentIds);
138
+ }
139
+
140
+ React.useEffect(() => { init() }, [props.parameter.keyName, isMounted]); //eslint-disable-line
141
+
142
+ let result = <></>
143
+ switch (props.parameter.source) {
144
+ case "dropdown":
145
+ result = (
146
+ <FormControl fullWidth>
147
+ <InputLabel>{props.parameter.displayName}</InputLabel>
148
+ <Select value={options.find(v => v.value === props.parameter.value)?.value || ""} label={props.parameter.displayName} onChange={handleChange} name={props.parameter.keyName}>
149
+ {options.map((o,i) => <MenuItem key={i} value={o.value}>{o.text}</MenuItem>)}
150
+ </Select>
151
+ </FormControl>
152
+ );
153
+ break;
154
+ case "date":
155
+ result = (<TextField type="date" fullWidth InputLabelProps={{shrink: true}} label="Date" value={props.parameter.value || ""} onChange={handleChange} name={props.parameter.keyName} />)
156
+ break;
157
+ }
158
+ return result;
159
+
160
+ }