@churchapps/apphelper 0.1.10 → 0.1.12
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 +24 -24
- 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/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.d.ts.map +1 -1
- package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.js +30 -15
- package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.js.map +1 -1
- package/package.json +88 -88
- 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 -67
- 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 +63 -63
- 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 +119 -119
- package/src/components/gallery/StockPhotos.tsx +74 -74
- package/src/components/gallery/index.ts +1 -1
- package/src/components/iconPicker/IconNamesList.ts +2240 -2240
- package/src/components/iconPicker/IconPicker.tsx +153 -153
- package/src/components/index.tsx +24 -24
- 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 +258 -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/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 +69 -69
- 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/components/wrapper/AppList.tsx +20 -20
- package/src/components/wrapper/ChurchList.tsx +22 -22
- package/src/components/wrapper/Drawers.tsx +60 -60
- package/src/components/wrapper/NavItem.tsx +41 -41
- package/src/components/wrapper/NewPrivateMessage.tsx +103 -103
- package/src/components/wrapper/NotificationMenu.tsx +96 -96
- package/src/components/wrapper/Notifications.tsx +53 -53
- package/src/components/wrapper/PrivateMessageDetails.tsx +24 -24
- package/src/components/wrapper/PrivateMessages.tsx +92 -92
- package/src/components/wrapper/SiteWrapper.tsx +99 -99
- package/src/components/wrapper/TabPanel.tsx +30 -30
- package/src/components/wrapper/UserMenu.tsx +106 -106
- package/src/components/wrapper/index.tsx +5 -5
- 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 +109 -109
- 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/SlugHelper.ts +37 -37
- package/src/helpers/SocketHelper.ts +78 -78
- 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 +19 -19
- 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 +11 -11
- 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,79 +1,79 @@
|
|
|
1
|
-
import React, { useRef } from "react";
|
|
2
|
-
import { ReportInterface, ReportResultInterface } from "../../interfaces";
|
|
3
|
-
import { DisplayBox, ExportLink, Loading } from "../"
|
|
4
|
-
import { ApiHelper } from "../../helpers"
|
|
5
|
-
import { useReactToPrint } from "react-to-print";
|
|
6
|
-
import { TableReport } from "./TableReport";
|
|
7
|
-
import { ChartReport } from "./ChartReport";
|
|
8
|
-
import { TreeReport } from "./TreeReport";
|
|
9
|
-
import { Icon } from "@mui/material";
|
|
10
|
-
import { useMountedState } from "../../hooks/useMountedState";
|
|
11
|
-
|
|
12
|
-
interface Props { report: ReportInterface }
|
|
13
|
-
|
|
14
|
-
export const ReportOutput = (props: Props) => {
|
|
15
|
-
const [reportResult, setReportResult] = React.useState<ReportResultInterface>(null);
|
|
16
|
-
const contentRef = useRef<HTMLDivElement>(null);
|
|
17
|
-
const isMounted = useMountedState();
|
|
18
|
-
|
|
19
|
-
const handlePrint = useReactToPrint({
|
|
20
|
-
content: () => contentRef.current
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
const runReport = () => {
|
|
24
|
-
if (props.report) {
|
|
25
|
-
const queryParams: string[] = [];
|
|
26
|
-
props.report.parameters.forEach(p => {
|
|
27
|
-
if (p.value) queryParams.push(p.keyName + "=" + p.value);
|
|
28
|
-
});
|
|
29
|
-
let url = "/reports/" + props.report.keyName + "/run";
|
|
30
|
-
if (queryParams) url += "?" + queryParams.join("&");
|
|
31
|
-
|
|
32
|
-
ApiHelper.get(url, "ReportingApi").then((data: ReportResultInterface) => {
|
|
33
|
-
if(isMounted()) {
|
|
34
|
-
setReportResult(data);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
React.useEffect(runReport, [props.report, isMounted]);
|
|
41
|
-
|
|
42
|
-
const getEditContent = () => {
|
|
43
|
-
const result: JSX.Element[] = [];
|
|
44
|
-
|
|
45
|
-
if (reportResult) {
|
|
46
|
-
result.push(<button type="button" className="no-default-style" key={result.length - 2} onClick={handlePrint} title="print"><Icon>print</Icon></button>);
|
|
47
|
-
result.push(<ExportLink key={result.length - 1} data={reportResult.table} filename={props.report.displayName.replace(" ", "_") + ".csv"} />);
|
|
48
|
-
}
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const getOutputs = () => {
|
|
53
|
-
const result: JSX.Element[] = [];
|
|
54
|
-
reportResult.outputs.forEach(o => {
|
|
55
|
-
if (o.outputType === "table") result.push(<TableReport key={o.outputType} reportResult={reportResult} output={o} />)
|
|
56
|
-
if (o.outputType === "tree") result.push(<TreeReport key={o.outputType} reportResult={reportResult} output={o} />)
|
|
57
|
-
else if (o.outputType === "barChart") result.push(<ChartReport key={o.outputType} reportResult={reportResult} output={o} />)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
return result;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const getResults = () => {
|
|
64
|
-
if (!props.report) return (<DisplayBox ref={contentRef} id="reportsBox" headerIcon="summarize" headerText="Run Report" editContent={getEditContent()}><p>Use the filter to run the report.</p></DisplayBox>);
|
|
65
|
-
|
|
66
|
-
else if (!reportResult) return <Loading />
|
|
67
|
-
else {
|
|
68
|
-
return (<DisplayBox ref={contentRef} id="reportsBox" headerIcon="summarize" headerText={props.report.displayName} editContent={getEditContent()}>
|
|
69
|
-
{getOutputs()}
|
|
70
|
-
</DisplayBox>);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return (
|
|
75
|
-
<>
|
|
76
|
-
{getResults()}
|
|
77
|
-
</>
|
|
78
|
-
);
|
|
79
|
-
}
|
|
1
|
+
import React, { useRef } from "react";
|
|
2
|
+
import { ReportInterface, ReportResultInterface } from "../../interfaces";
|
|
3
|
+
import { DisplayBox, ExportLink, Loading } from "../"
|
|
4
|
+
import { ApiHelper } from "../../helpers"
|
|
5
|
+
import { useReactToPrint } from "react-to-print";
|
|
6
|
+
import { TableReport } from "./TableReport";
|
|
7
|
+
import { ChartReport } from "./ChartReport";
|
|
8
|
+
import { TreeReport } from "./TreeReport";
|
|
9
|
+
import { Icon } from "@mui/material";
|
|
10
|
+
import { useMountedState } from "../../hooks/useMountedState";
|
|
11
|
+
|
|
12
|
+
interface Props { report: ReportInterface }
|
|
13
|
+
|
|
14
|
+
export const ReportOutput = (props: Props) => {
|
|
15
|
+
const [reportResult, setReportResult] = React.useState<ReportResultInterface>(null);
|
|
16
|
+
const contentRef = useRef<HTMLDivElement>(null);
|
|
17
|
+
const isMounted = useMountedState();
|
|
18
|
+
|
|
19
|
+
const handlePrint = useReactToPrint({
|
|
20
|
+
content: () => contentRef.current
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const runReport = () => {
|
|
24
|
+
if (props.report) {
|
|
25
|
+
const queryParams: string[] = [];
|
|
26
|
+
props.report.parameters.forEach(p => {
|
|
27
|
+
if (p.value) queryParams.push(p.keyName + "=" + p.value);
|
|
28
|
+
});
|
|
29
|
+
let url = "/reports/" + props.report.keyName + "/run";
|
|
30
|
+
if (queryParams) url += "?" + queryParams.join("&");
|
|
31
|
+
|
|
32
|
+
ApiHelper.get(url, "ReportingApi").then((data: ReportResultInterface) => {
|
|
33
|
+
if(isMounted()) {
|
|
34
|
+
setReportResult(data);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
React.useEffect(runReport, [props.report, isMounted]);
|
|
41
|
+
|
|
42
|
+
const getEditContent = () => {
|
|
43
|
+
const result: JSX.Element[] = [];
|
|
44
|
+
|
|
45
|
+
if (reportResult) {
|
|
46
|
+
result.push(<button type="button" className="no-default-style" key={result.length - 2} onClick={handlePrint} title="print"><Icon>print</Icon></button>);
|
|
47
|
+
result.push(<ExportLink key={result.length - 1} data={reportResult.table} filename={props.report.displayName.replace(" ", "_") + ".csv"} />);
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const getOutputs = () => {
|
|
53
|
+
const result: JSX.Element[] = [];
|
|
54
|
+
reportResult.outputs.forEach(o => {
|
|
55
|
+
if (o.outputType === "table") result.push(<TableReport key={o.outputType} reportResult={reportResult} output={o} />)
|
|
56
|
+
if (o.outputType === "tree") result.push(<TreeReport key={o.outputType} reportResult={reportResult} output={o} />)
|
|
57
|
+
else if (o.outputType === "barChart") result.push(<ChartReport key={o.outputType} reportResult={reportResult} output={o} />)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const getResults = () => {
|
|
64
|
+
if (!props.report) return (<DisplayBox ref={contentRef} id="reportsBox" headerIcon="summarize" headerText="Run Report" editContent={getEditContent()}><p>Use the filter to run the report.</p></DisplayBox>);
|
|
65
|
+
|
|
66
|
+
else if (!reportResult) return <Loading />
|
|
67
|
+
else {
|
|
68
|
+
return (<DisplayBox ref={contentRef} id="reportsBox" headerIcon="summarize" headerText={props.report.displayName} editContent={getEditContent()}>
|
|
69
|
+
{getOutputs()}
|
|
70
|
+
</DisplayBox>);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<>
|
|
76
|
+
{getResults()}
|
|
77
|
+
</>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { ReportInterface, ReportPermissionInterface } from "../../interfaces";
|
|
3
|
-
import { ApiHelper, UserHelper } from "../../helpers"
|
|
4
|
-
import { Loading } from "../Loading"
|
|
5
|
-
import { Grid } from "@mui/material"
|
|
6
|
-
import { ReportOutput } from "./ReportOutput"
|
|
7
|
-
import { ReportFilter } from "./ReportFilter"
|
|
8
|
-
import { useMountedState } from "../../hooks/useMountedState";
|
|
9
|
-
|
|
10
|
-
interface Props { keyName: string, autoRun: boolean }
|
|
11
|
-
|
|
12
|
-
export const ReportWithFilter = (props: Props) => {
|
|
13
|
-
const [report, setReport] = React.useState<ReportInterface>(null);
|
|
14
|
-
const [reportToRun, setReportToRun] = React.useState<ReportInterface>(null);
|
|
15
|
-
const isMounted = useMountedState();
|
|
16
|
-
|
|
17
|
-
const loadData = () => {
|
|
18
|
-
setReportToRun(null);
|
|
19
|
-
setReport(null);
|
|
20
|
-
ApiHelper.get("/reports/" + props.keyName, "ReportingApi").then(data => {
|
|
21
|
-
if(isMounted()) {
|
|
22
|
-
setReport(data);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const handleAutoRun = () => {
|
|
28
|
-
if (props.autoRun && report) {
|
|
29
|
-
setReportToRun(report);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
React.useEffect(loadData, [props.keyName, isMounted]);
|
|
34
|
-
React.useEffect(handleAutoRun, [report, props.autoRun]);
|
|
35
|
-
|
|
36
|
-
const handleRun = () => { setReportToRun(report); }
|
|
37
|
-
|
|
38
|
-
const handleChange = (r: ReportInterface) => setReport(r);
|
|
39
|
-
|
|
40
|
-
const checkAccess = () => {
|
|
41
|
-
let result = true;
|
|
42
|
-
report.permissions.forEach(rpg => {
|
|
43
|
-
let groupResult = checkGroup(rpg.requireOne);
|
|
44
|
-
if (!groupResult) result = false; //between groups use AND
|
|
45
|
-
})
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
//Within groups use OR
|
|
50
|
-
const checkGroup = (pa: ReportPermissionInterface[]) => {
|
|
51
|
-
let result = false;
|
|
52
|
-
pa.forEach(p => {
|
|
53
|
-
if (UserHelper.checkAccess(p)) result = true;
|
|
54
|
-
});
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (!report) return <Loading />
|
|
59
|
-
if (!checkAccess()) return <></>
|
|
60
|
-
else {
|
|
61
|
-
return (<Grid container spacing={3}>
|
|
62
|
-
<Grid item md={8} xs={12}>
|
|
63
|
-
<ReportOutput report={reportToRun} />
|
|
64
|
-
</Grid>
|
|
65
|
-
<Grid item md={4} xs={12}>
|
|
66
|
-
<ReportFilter report={report} onChange={handleChange} onRun={handleRun} />
|
|
67
|
-
</Grid>
|
|
68
|
-
</Grid>)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ReportInterface, ReportPermissionInterface } from "../../interfaces";
|
|
3
|
+
import { ApiHelper, UserHelper } from "../../helpers"
|
|
4
|
+
import { Loading } from "../Loading"
|
|
5
|
+
import { Grid } from "@mui/material"
|
|
6
|
+
import { ReportOutput } from "./ReportOutput"
|
|
7
|
+
import { ReportFilter } from "./ReportFilter"
|
|
8
|
+
import { useMountedState } from "../../hooks/useMountedState";
|
|
9
|
+
|
|
10
|
+
interface Props { keyName: string, autoRun: boolean }
|
|
11
|
+
|
|
12
|
+
export const ReportWithFilter = (props: Props) => {
|
|
13
|
+
const [report, setReport] = React.useState<ReportInterface>(null);
|
|
14
|
+
const [reportToRun, setReportToRun] = React.useState<ReportInterface>(null);
|
|
15
|
+
const isMounted = useMountedState();
|
|
16
|
+
|
|
17
|
+
const loadData = () => {
|
|
18
|
+
setReportToRun(null);
|
|
19
|
+
setReport(null);
|
|
20
|
+
ApiHelper.get("/reports/" + props.keyName, "ReportingApi").then(data => {
|
|
21
|
+
if(isMounted()) {
|
|
22
|
+
setReport(data);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const handleAutoRun = () => {
|
|
28
|
+
if (props.autoRun && report) {
|
|
29
|
+
setReportToRun(report);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
React.useEffect(loadData, [props.keyName, isMounted]);
|
|
34
|
+
React.useEffect(handleAutoRun, [report, props.autoRun]);
|
|
35
|
+
|
|
36
|
+
const handleRun = () => { setReportToRun(report); }
|
|
37
|
+
|
|
38
|
+
const handleChange = (r: ReportInterface) => setReport(r);
|
|
39
|
+
|
|
40
|
+
const checkAccess = () => {
|
|
41
|
+
let result = true;
|
|
42
|
+
report.permissions.forEach(rpg => {
|
|
43
|
+
let groupResult = checkGroup(rpg.requireOne);
|
|
44
|
+
if (!groupResult) result = false; //between groups use AND
|
|
45
|
+
})
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//Within groups use OR
|
|
50
|
+
const checkGroup = (pa: ReportPermissionInterface[]) => {
|
|
51
|
+
let result = false;
|
|
52
|
+
pa.forEach(p => {
|
|
53
|
+
if (UserHelper.checkAccess(p)) result = true;
|
|
54
|
+
});
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!report) return <Loading />
|
|
59
|
+
if (!checkAccess()) return <></>
|
|
60
|
+
else {
|
|
61
|
+
return (<Grid container spacing={3}>
|
|
62
|
+
<Grid item md={8} xs={12}>
|
|
63
|
+
<ReportOutput report={reportToRun} />
|
|
64
|
+
</Grid>
|
|
65
|
+
<Grid item md={4} xs={12}>
|
|
66
|
+
<ReportFilter report={report} onChange={handleChange} onRun={handleRun} />
|
|
67
|
+
</Grid>
|
|
68
|
+
</Grid>)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { ColumnInterface, ReportOutputInterface, ReportResultInterface } from "../../interfaces";
|
|
3
|
-
import { DateHelper } from "../../helpers";
|
|
4
|
-
import { Table, TableBody, TableRow, TableCell, TableHead } from "@mui/material";
|
|
5
|
-
|
|
6
|
-
interface Props { reportResult: ReportResultInterface, output: ReportOutputInterface }
|
|
7
|
-
|
|
8
|
-
export const TableReport = (props: Props) => {
|
|
9
|
-
|
|
10
|
-
const getHeaders = () => {
|
|
11
|
-
const result: JSX.Element[] = []
|
|
12
|
-
props.output.columns.forEach((c, i) => {
|
|
13
|
-
result.push(<th key={i}>{c.header}</th>);
|
|
14
|
-
})
|
|
15
|
-
return result;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const getRows = () => {
|
|
19
|
-
const result: JSX.Element[] = []
|
|
20
|
-
props.reportResult.table.forEach(d => {
|
|
21
|
-
const row: JSX.Element[] = [];
|
|
22
|
-
props.output.columns.forEach(c => {
|
|
23
|
-
row.push(<TableCell>{getField(c, d)}</TableCell>);
|
|
24
|
-
})
|
|
25
|
-
result.push(<TableRow>{row}</TableRow>);
|
|
26
|
-
});
|
|
27
|
-
return result;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const getField = (column: ColumnInterface, dataRow: any) => {
|
|
31
|
-
let result = ""
|
|
32
|
-
try {
|
|
33
|
-
result = dataRow[column.value]?.toString() || "";
|
|
34
|
-
} catch { }
|
|
35
|
-
|
|
36
|
-
switch (column.formatter) {
|
|
37
|
-
case "date":
|
|
38
|
-
let dt = new Date(result);
|
|
39
|
-
result = DateHelper.prettyDate(dt);
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<Table className="table">
|
|
47
|
-
<TableHead>
|
|
48
|
-
<TableRow>
|
|
49
|
-
{getHeaders()}
|
|
50
|
-
</TableRow>
|
|
51
|
-
</TableHead>
|
|
52
|
-
<TableBody>
|
|
53
|
-
{getRows()}
|
|
54
|
-
</TableBody>
|
|
55
|
-
</Table>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ColumnInterface, ReportOutputInterface, ReportResultInterface } from "../../interfaces";
|
|
3
|
+
import { DateHelper } from "../../helpers";
|
|
4
|
+
import { Table, TableBody, TableRow, TableCell, TableHead } from "@mui/material";
|
|
5
|
+
|
|
6
|
+
interface Props { reportResult: ReportResultInterface, output: ReportOutputInterface }
|
|
7
|
+
|
|
8
|
+
export const TableReport = (props: Props) => {
|
|
9
|
+
|
|
10
|
+
const getHeaders = () => {
|
|
11
|
+
const result: JSX.Element[] = []
|
|
12
|
+
props.output.columns.forEach((c, i) => {
|
|
13
|
+
result.push(<th key={i}>{c.header}</th>);
|
|
14
|
+
})
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const getRows = () => {
|
|
19
|
+
const result: JSX.Element[] = []
|
|
20
|
+
props.reportResult.table.forEach(d => {
|
|
21
|
+
const row: JSX.Element[] = [];
|
|
22
|
+
props.output.columns.forEach(c => {
|
|
23
|
+
row.push(<TableCell>{getField(c, d)}</TableCell>);
|
|
24
|
+
})
|
|
25
|
+
result.push(<TableRow>{row}</TableRow>);
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const getField = (column: ColumnInterface, dataRow: any) => {
|
|
31
|
+
let result = ""
|
|
32
|
+
try {
|
|
33
|
+
result = dataRow[column.value]?.toString() || "";
|
|
34
|
+
} catch { }
|
|
35
|
+
|
|
36
|
+
switch (column.formatter) {
|
|
37
|
+
case "date":
|
|
38
|
+
let dt = new Date(result);
|
|
39
|
+
result = DateHelper.prettyDate(dt);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Table className="table">
|
|
47
|
+
<TableHead>
|
|
48
|
+
<TableRow>
|
|
49
|
+
{getHeaders()}
|
|
50
|
+
</TableRow>
|
|
51
|
+
</TableHead>
|
|
52
|
+
<TableBody>
|
|
53
|
+
{getRows()}
|
|
54
|
+
</TableBody>
|
|
55
|
+
</Table>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { ColumnInterface, ReportOutputInterface, ReportResultInterface } from "../../interfaces"
|
|
3
|
-
import { DateHelper } from "../../helpers"
|
|
4
|
-
import { Table, TableBody, TableRow, TableCell, TableHead } from "@mui/material"
|
|
5
|
-
|
|
6
|
-
interface Props { reportResult: ReportResultInterface, output: ReportOutputInterface }
|
|
7
|
-
|
|
8
|
-
export const TreeReport = (props: Props) => {
|
|
9
|
-
|
|
10
|
-
const getPreviousGroupingCount = (depth: number) => {
|
|
11
|
-
let result = 0;
|
|
12
|
-
for (let i = 0; i < depth; i++) result += props.output.groupings[i];
|
|
13
|
-
return result;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
let totalGroupings = getPreviousGroupingCount(props.output.groupings.length);
|
|
17
|
-
|
|
18
|
-
const getHeaders = () => {
|
|
19
|
-
const result: JSX.Element[] = []
|
|
20
|
-
const columns = props.output.columns;
|
|
21
|
-
for (let i = totalGroupings; i < columns.length; i++) {
|
|
22
|
-
const c = columns[i];
|
|
23
|
-
if (i === totalGroupings) result.push(<th key={i}>{c.header}</th>);
|
|
24
|
-
else result.push(<th key={i}>{c.header}</th>);
|
|
25
|
-
}
|
|
26
|
-
return result;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const getRows = () => {
|
|
30
|
-
const result: JSX.Element[] = []
|
|
31
|
-
const columns = props.output.columns;
|
|
32
|
-
let previousData = {}
|
|
33
|
-
props.reportResult.table.forEach(d => {
|
|
34
|
-
const row: JSX.Element[] = [];
|
|
35
|
-
const groupingRows: JSX.Element[] = getGroupingRows(previousData, d);
|
|
36
|
-
groupingRows.forEach(gr => result.push(gr));
|
|
37
|
-
for (let i = totalGroupings; i < columns.length; i++) {
|
|
38
|
-
const c = columns[i];
|
|
39
|
-
if (i === totalGroupings) row.push(<TableCell style={{ paddingLeft: 30 * totalGroupings }}>{getField(c, d)}</TableCell>);
|
|
40
|
-
else row.push(<TableCell>{getField(c, d)}</TableCell>);
|
|
41
|
-
}
|
|
42
|
-
result.push(<TableRow>{row}</TableRow>);
|
|
43
|
-
previousData = d;
|
|
44
|
-
});
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const getGroupingRows = (previousData: any, data: any) => {
|
|
49
|
-
const result: JSX.Element[] = [];
|
|
50
|
-
let firstGroupModified = getFirstGroupModified(previousData, data);
|
|
51
|
-
for (let i = firstGroupModified; i <= props.output.groupings.length; i++) {
|
|
52
|
-
result.push(getGroupingRow(data, i))
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const getGroupingRow = (row: any, groupNumber: number) => {
|
|
58
|
-
const g = props.output.groupings[groupNumber];
|
|
59
|
-
const prevCols = getPreviousGroupingCount(groupNumber);
|
|
60
|
-
const outputRow: JSX.Element[] = [];
|
|
61
|
-
for (let i = prevCols; i < prevCols + g; i++) {
|
|
62
|
-
const c = props.output.columns[i];
|
|
63
|
-
const className = "heading" + (groupNumber + 1);
|
|
64
|
-
if (i === prevCols && i > 0) outputRow.push(<TableCell className={className} style={{ paddingLeft: 30 * groupNumber }}>{getField(c, row)}</TableCell>);
|
|
65
|
-
else outputRow.push(<TableCell className={className}>{getField(c, row)}</TableCell>);
|
|
66
|
-
}
|
|
67
|
-
return (<TableRow>{outputRow}</TableRow>);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const getFirstGroupModified = (previousRow: any, row: any) => {
|
|
71
|
-
let firstColumnModified = props.output.columns.length - 1;
|
|
72
|
-
for (let i = props.output.columns.length - 1; i >= 0; i--) {
|
|
73
|
-
const colName = props.output.columns[i].value;
|
|
74
|
-
if (row[colName] !== previousRow[colName]) {
|
|
75
|
-
firstColumnModified = i;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
let firstGroupModified = props.output.groupings.length;
|
|
80
|
-
for (let i = props.output.groupings.length - 1; i >= 0; i--) {
|
|
81
|
-
let totalColumns = getPreviousGroupingCount(i);
|
|
82
|
-
if (totalColumns >= firstColumnModified) firstGroupModified = i;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return firstGroupModified;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const getField = (column: ColumnInterface, dataRow: any) => {
|
|
89
|
-
let result = dataRow[column.value].toString() || "";
|
|
90
|
-
switch (column.formatter) {
|
|
91
|
-
case "date":
|
|
92
|
-
let dt = new Date(result);
|
|
93
|
-
result = DateHelper.prettyDate(dt);
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
return result;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return (
|
|
100
|
-
<Table className="table table-sm report">
|
|
101
|
-
<TableHead className="thead-dark">
|
|
102
|
-
<TableRow>
|
|
103
|
-
{getHeaders()}
|
|
104
|
-
</TableRow>
|
|
105
|
-
</TableHead>
|
|
106
|
-
<TableBody>
|
|
107
|
-
{getRows()}
|
|
108
|
-
</TableBody>
|
|
109
|
-
</Table>
|
|
110
|
-
);
|
|
111
|
-
}
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ColumnInterface, ReportOutputInterface, ReportResultInterface } from "../../interfaces"
|
|
3
|
+
import { DateHelper } from "../../helpers"
|
|
4
|
+
import { Table, TableBody, TableRow, TableCell, TableHead } from "@mui/material"
|
|
5
|
+
|
|
6
|
+
interface Props { reportResult: ReportResultInterface, output: ReportOutputInterface }
|
|
7
|
+
|
|
8
|
+
export const TreeReport = (props: Props) => {
|
|
9
|
+
|
|
10
|
+
const getPreviousGroupingCount = (depth: number) => {
|
|
11
|
+
let result = 0;
|
|
12
|
+
for (let i = 0; i < depth; i++) result += props.output.groupings[i];
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let totalGroupings = getPreviousGroupingCount(props.output.groupings.length);
|
|
17
|
+
|
|
18
|
+
const getHeaders = () => {
|
|
19
|
+
const result: JSX.Element[] = []
|
|
20
|
+
const columns = props.output.columns;
|
|
21
|
+
for (let i = totalGroupings; i < columns.length; i++) {
|
|
22
|
+
const c = columns[i];
|
|
23
|
+
if (i === totalGroupings) result.push(<th key={i}>{c.header}</th>);
|
|
24
|
+
else result.push(<th key={i}>{c.header}</th>);
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const getRows = () => {
|
|
30
|
+
const result: JSX.Element[] = []
|
|
31
|
+
const columns = props.output.columns;
|
|
32
|
+
let previousData = {}
|
|
33
|
+
props.reportResult.table.forEach(d => {
|
|
34
|
+
const row: JSX.Element[] = [];
|
|
35
|
+
const groupingRows: JSX.Element[] = getGroupingRows(previousData, d);
|
|
36
|
+
groupingRows.forEach(gr => result.push(gr));
|
|
37
|
+
for (let i = totalGroupings; i < columns.length; i++) {
|
|
38
|
+
const c = columns[i];
|
|
39
|
+
if (i === totalGroupings) row.push(<TableCell style={{ paddingLeft: 30 * totalGroupings }}>{getField(c, d)}</TableCell>);
|
|
40
|
+
else row.push(<TableCell>{getField(c, d)}</TableCell>);
|
|
41
|
+
}
|
|
42
|
+
result.push(<TableRow>{row}</TableRow>);
|
|
43
|
+
previousData = d;
|
|
44
|
+
});
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const getGroupingRows = (previousData: any, data: any) => {
|
|
49
|
+
const result: JSX.Element[] = [];
|
|
50
|
+
let firstGroupModified = getFirstGroupModified(previousData, data);
|
|
51
|
+
for (let i = firstGroupModified; i <= props.output.groupings.length; i++) {
|
|
52
|
+
result.push(getGroupingRow(data, i))
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const getGroupingRow = (row: any, groupNumber: number) => {
|
|
58
|
+
const g = props.output.groupings[groupNumber];
|
|
59
|
+
const prevCols = getPreviousGroupingCount(groupNumber);
|
|
60
|
+
const outputRow: JSX.Element[] = [];
|
|
61
|
+
for (let i = prevCols; i < prevCols + g; i++) {
|
|
62
|
+
const c = props.output.columns[i];
|
|
63
|
+
const className = "heading" + (groupNumber + 1);
|
|
64
|
+
if (i === prevCols && i > 0) outputRow.push(<TableCell className={className} style={{ paddingLeft: 30 * groupNumber }}>{getField(c, row)}</TableCell>);
|
|
65
|
+
else outputRow.push(<TableCell className={className}>{getField(c, row)}</TableCell>);
|
|
66
|
+
}
|
|
67
|
+
return (<TableRow>{outputRow}</TableRow>);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const getFirstGroupModified = (previousRow: any, row: any) => {
|
|
71
|
+
let firstColumnModified = props.output.columns.length - 1;
|
|
72
|
+
for (let i = props.output.columns.length - 1; i >= 0; i--) {
|
|
73
|
+
const colName = props.output.columns[i].value;
|
|
74
|
+
if (row[colName] !== previousRow[colName]) {
|
|
75
|
+
firstColumnModified = i;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let firstGroupModified = props.output.groupings.length;
|
|
80
|
+
for (let i = props.output.groupings.length - 1; i >= 0; i--) {
|
|
81
|
+
let totalColumns = getPreviousGroupingCount(i);
|
|
82
|
+
if (totalColumns >= firstColumnModified) firstGroupModified = i;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return firstGroupModified;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const getField = (column: ColumnInterface, dataRow: any) => {
|
|
89
|
+
let result = dataRow[column.value].toString() || "";
|
|
90
|
+
switch (column.formatter) {
|
|
91
|
+
case "date":
|
|
92
|
+
let dt = new Date(result);
|
|
93
|
+
result = DateHelper.prettyDate(dt);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<Table className="table table-sm report">
|
|
101
|
+
<TableHead className="thead-dark">
|
|
102
|
+
<TableRow>
|
|
103
|
+
{getHeaders()}
|
|
104
|
+
</TableRow>
|
|
105
|
+
</TableHead>
|
|
106
|
+
<TableBody>
|
|
107
|
+
{getRows()}
|
|
108
|
+
</TableBody>
|
|
109
|
+
</Table>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ReportFilter } from "./ReportFilter"
|
|
2
|
-
export { ReportFilterField } from "./ReportFilterField"
|
|
3
|
-
export { ReportOutput } from "./ReportOutput"
|
|
4
|
-
export { ReportWithFilter } from "./ReportWithFilter"
|
|
1
|
+
export { ReportFilter } from "./ReportFilter"
|
|
2
|
+
export { ReportFilterField } from "./ReportFilterField"
|
|
3
|
+
export { ReportOutput } from "./ReportOutput"
|
|
4
|
+
export { ReportWithFilter } from "./ReportWithFilter"
|