@churchapps/apphelper 0.2.34 → 0.2.35
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/dist/components/CreatePerson.d.ts +10 -2
- package/dist/components/CreatePerson.d.ts.map +1 -1
- package/dist/components/CreatePerson.js +93 -24
- package/dist/components/CreatePerson.js.map +1 -1
- package/dist/components/PersonAdd.d.ts.map +1 -1
- package/dist/components/PersonAdd.js +7 -2
- package/dist/components/PersonAdd.js.map +1 -1
- package/dist/public/locales/en.json +4 -2
- package/package.json +1 -1
- package/public/locales/en.json +4 -2
- package/src/components/CreatePerson.tsx +81 -24
- package/src/components/PersonAdd.tsx +4 -2
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { PersonInterface } from "@churchapps/helpers";
|
|
3
|
-
interface
|
|
3
|
+
interface CommonProps {
|
|
4
4
|
navigateOnCreate?: boolean;
|
|
5
5
|
onCreate?: (person: PersonInterface) => void;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
type ConditionalProps = {
|
|
8
|
+
showInModal: true;
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
} | {
|
|
11
|
+
showInModal?: false;
|
|
12
|
+
onClose?: never;
|
|
13
|
+
};
|
|
14
|
+
type Props = CommonProps & ConditionalProps;
|
|
15
|
+
export declare function CreatePerson({ navigateOnCreate, onCreate, showInModal, ...props }: Props): React.JSX.Element;
|
|
8
16
|
export {};
|
|
9
17
|
//# sourceMappingURL=CreatePerson.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreatePerson.d.ts","sourceRoot":"","sources":["../../src/components/CreatePerson.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAe,eAAe,EAAsB,MAAM,qBAAqB,CAAC;AAKvF,UAAU,
|
|
1
|
+
{"version":3,"file":"CreatePerson.d.ts","sourceRoot":"","sources":["../../src/components/CreatePerson.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAe,eAAe,EAAsB,MAAM,qBAAqB,CAAC;AAKvF,UAAU,WAAW;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9C;AAED,KAAK,gBAAgB,GACjB;IAAE,WAAW,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAAE,GAC3C;IAAE,WAAW,CAAC,EAAE,KAAK,CAAC;IAAC,OAAO,CAAC,EAAE,KAAK,CAAC;CAAE,CAAA;AAE7C,KAAK,KAAK,GAAG,WAAW,GAAG,gBAAgB,CAAA;AAE3C,wBAAgB,YAAY,CAAC,EAAE,gBAAuB,EAAE,QAAmB,EAAE,WAAmB,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,qBAqHlH"}
|
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
2
22
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
23
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
24
|
};
|
|
@@ -11,7 +31,8 @@ const helpers_2 = require("@churchapps/helpers");
|
|
|
11
31
|
const material_1 = require("@mui/material");
|
|
12
32
|
const ErrorMessages_1 = require("./ErrorMessages");
|
|
13
33
|
const useMountedState_1 = require("../hooks/useMountedState");
|
|
14
|
-
function CreatePerson(
|
|
34
|
+
function CreatePerson(_a) {
|
|
35
|
+
var { navigateOnCreate = true, onCreate = () => { }, showInModal = false } = _a, props = __rest(_a, ["navigateOnCreate", "onCreate", "showInModal"]);
|
|
15
36
|
const navigate = (0, react_router_dom_1.useNavigate)();
|
|
16
37
|
const [person, setPerson] = react_1.default.useState({ name: { first: "", last: "" }, contactInfo: {} });
|
|
17
38
|
const [errors, setErrors] = react_1.default.useState([]);
|
|
@@ -38,42 +59,90 @@ function CreatePerson({ navigateOnCreate = true, onCreate = () => { } }) {
|
|
|
38
59
|
case "last":
|
|
39
60
|
p.name.last = value;
|
|
40
61
|
break;
|
|
62
|
+
case "email":
|
|
63
|
+
p.contactInfo.email = value;
|
|
64
|
+
break;
|
|
41
65
|
}
|
|
42
66
|
setPerson(p);
|
|
43
67
|
};
|
|
44
|
-
|
|
68
|
+
const validateEmail = (email) => (/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(.\w{2,3})+$/.test(email));
|
|
69
|
+
const checkExistingEmail = () => __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const result = yield helpers_1.ApiHelper.get("/people/search?email=" + person.contactInfo.email, "MembershipApi");
|
|
71
|
+
return result[0];
|
|
72
|
+
});
|
|
73
|
+
const handleSave = () => {
|
|
45
74
|
let household = { name: person.name.last };
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
});
|
|
75
|
+
setIsSubmitting(true);
|
|
76
|
+
helpers_1.ApiHelper.post("/households", [household], "MembershipApi").then(data => {
|
|
77
|
+
household.id = data[0].id;
|
|
78
|
+
person.householdId = household.id;
|
|
79
|
+
person.name.display = [person.name.first, person.name.last].join(" ");
|
|
80
|
+
helpers_1.ApiHelper.post("/people", [person], "MembershipApi").then(data => {
|
|
81
|
+
person.id = data[0].id;
|
|
82
|
+
onCreate(person);
|
|
83
|
+
setPerson(Object.assign(Object.assign({}, person), { name: { first: "", last: "" }, contactInfo: { email: "" } }));
|
|
84
|
+
navigateOnCreate && navigate("/people/" + person.id);
|
|
85
|
+
}).finally(() => {
|
|
86
|
+
if (isMounted()) {
|
|
87
|
+
setIsSubmitting(false);
|
|
88
|
+
showInModal && props.onClose();
|
|
89
|
+
}
|
|
62
90
|
});
|
|
63
|
-
}
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
function handleSubmit() {
|
|
94
|
+
var _a, _b;
|
|
95
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
if (validate()) {
|
|
97
|
+
if (person.contactInfo.email && (((_a = person.contactInfo.email) === null || _a === void 0 ? void 0 : _a.trim()) !== undefined || ((_b = person.contactInfo.email) === null || _b === void 0 ? void 0 : _b.trim()) !== "")) {
|
|
98
|
+
if (!validateEmail(person.contactInfo.email)) {
|
|
99
|
+
setErrors(["Please enter a valid email address."]);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const existingPerson = yield checkExistingEmail();
|
|
103
|
+
if (existingPerson) {
|
|
104
|
+
if (window.confirm(`${existingPerson.name.display} already exists with an email of ${existingPerson.contactInfo.email}. Are you sure you wish to add ${person.name.first} ${person.name.last}?`)) {
|
|
105
|
+
handleSave();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
handleSave();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
handleSave();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
});
|
|
64
118
|
}
|
|
65
119
|
if (!helpers_1.UserHelper.checkAccess(helpers_2.Permissions.membershipApi.people.edit))
|
|
66
120
|
return null;
|
|
121
|
+
if (showInModal) {
|
|
122
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
123
|
+
react_1.default.createElement(ErrorMessages_1.ErrorMessages, { errors: errors }),
|
|
124
|
+
react_1.default.createElement(material_1.Dialog, { open: true, onClose: props.onClose, fullWidth: true },
|
|
125
|
+
react_1.default.createElement(material_1.DialogTitle, null, helpers_1.Locale.label("createPerson.addNewPerson")),
|
|
126
|
+
react_1.default.createElement(material_1.DialogContent, null,
|
|
127
|
+
react_1.default.createElement(material_1.TextField, { margin: "dense", required: true, fullWidth: true, type: "text", "aria-label": "firstName", label: helpers_1.Locale.label("createPerson.firstName"), name: "first", value: person.name.first || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit }),
|
|
128
|
+
react_1.default.createElement(material_1.TextField, { margin: "dense", required: true, fullWidth: true, type: "text", "aria-label": "lastName", label: helpers_1.Locale.label("createPerson.lastName"), name: "last", value: person.name.last || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit }),
|
|
129
|
+
react_1.default.createElement(material_1.TextField, { margin: "dense", fullWidth: true, type: "text", "aria-label": "email", label: helpers_1.Locale.label("createPerson.email"), name: "email", value: person.contactInfo.email || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit })),
|
|
130
|
+
react_1.default.createElement(material_1.DialogActions, null,
|
|
131
|
+
react_1.default.createElement(material_1.Button, { onClick: () => { props.onClose(); } }, helpers_1.Locale.label("common.cancel")),
|
|
132
|
+
react_1.default.createElement(material_1.Button, { type: "submit", variant: "contained", disabled: isSubmitting, onClick: handleSubmit }, helpers_1.Locale.label("common.add"))))));
|
|
133
|
+
}
|
|
67
134
|
return (react_1.default.createElement("div", null,
|
|
68
135
|
react_1.default.createElement("p", { className: "pl-1 mb-3 text-dark" },
|
|
69
136
|
react_1.default.createElement("b", null, helpers_1.Locale.label("createPerson.addNewPerson"))),
|
|
70
137
|
react_1.default.createElement(ErrorMessages_1.ErrorMessages, { errors: errors }),
|
|
71
138
|
react_1.default.createElement(material_1.Grid, { container: true, spacing: 3, alignItems: "center" },
|
|
72
|
-
react_1.default.createElement(material_1.Grid, { item: true, md:
|
|
73
|
-
react_1.default.createElement(material_1.TextField, { size: "small", margin: "none", fullWidth: true, type: "text", "aria-label": "firstName", label: helpers_1.Locale.label("createPerson.firstName"), name: "first", value: person.name.first || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit })),
|
|
74
|
-
react_1.default.createElement(material_1.Grid, { item: true, md:
|
|
75
|
-
react_1.default.createElement(material_1.TextField, { size: "small", margin: "none", fullWidth: true, type: "text", "aria-label": "lastName", label: helpers_1.Locale.label("createPerson.lastName"), name: "last", value: person.name.last || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit })),
|
|
76
|
-
react_1.default.createElement(material_1.Grid, { item: true,
|
|
139
|
+
react_1.default.createElement(material_1.Grid, { item: true, md: 6, xs: 12 },
|
|
140
|
+
react_1.default.createElement(material_1.TextField, { size: "small", margin: "none", required: true, fullWidth: true, type: "text", "aria-label": "firstName", label: helpers_1.Locale.label("createPerson.firstName"), name: "first", value: person.name.first || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit })),
|
|
141
|
+
react_1.default.createElement(material_1.Grid, { item: true, md: 6, xs: 12 },
|
|
142
|
+
react_1.default.createElement(material_1.TextField, { size: "small", margin: "none", required: true, fullWidth: true, type: "text", "aria-label": "lastName", label: helpers_1.Locale.label("createPerson.lastName"), name: "last", value: person.name.last || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit })),
|
|
143
|
+
react_1.default.createElement(material_1.Grid, { item: true, xs: 12 },
|
|
144
|
+
react_1.default.createElement(material_1.TextField, { size: "small", margin: "none", fullWidth: true, type: "text", "aria-label": "email", label: helpers_1.Locale.label("createPerson.email"), name: "email", value: person.contactInfo.email || "", onChange: handleChange, onKeyDown: (e) => e.key === "Enter" && handleSubmit })),
|
|
145
|
+
react_1.default.createElement(material_1.Grid, { item: true, xs: 12 },
|
|
77
146
|
react_1.default.createElement(material_1.Button, { type: "submit", fullWidth: true, variant: "contained", disabled: isSubmitting, onClick: handleSubmit }, helpers_1.Locale.label("common.add"))))));
|
|
78
147
|
}
|
|
79
148
|
exports.CreatePerson = CreatePerson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreatePerson.js","sourceRoot":"","sources":["../../src/components/CreatePerson.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CreatePerson.js","sourceRoot":"","sources":["../../src/components/CreatePerson.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersonAdd.d.ts","sourceRoot":"","sources":["../../src/components/PersonAdd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAKrD,UAAU,KAAK;IACb,WAAW,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,MAAM,CAAC;IACjD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"PersonAdd.d.ts","sourceRoot":"","sources":["../../src/components/PersonAdd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAKrD,UAAU,KAAK;IACb,WAAW,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,MAAM,CAAC;IACjD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0DrC,CAAA"}
|
|
@@ -33,6 +33,7 @@ const PersonAdd = ({ addFunction, getPhotoUrl, searchClicked, filterList = [], i
|
|
|
33
33
|
const [searchResults, setSearchResults] = (0, react_1.useState)([]);
|
|
34
34
|
const [searchText, setSearchText] = (0, react_1.useState)("");
|
|
35
35
|
const [hasSearched, setHasSearched] = (0, react_1.useState)(false);
|
|
36
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
36
37
|
const handleChange = (e) => { e.preventDefault(); setHasSearched(false); setSearchText(e.currentTarget.value); };
|
|
37
38
|
const handleKeyDown = (e) => { if (e.key === "Enter") {
|
|
38
39
|
e.preventDefault();
|
|
@@ -76,9 +77,13 @@ const PersonAdd = ({ addFunction, getPhotoUrl, searchClicked, filterList = [], i
|
|
|
76
77
|
}
|
|
77
78
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
78
79
|
react_1.default.createElement(material_1.TextField, { fullWidth: true, name: "personAddText", label: helpers_1.Locale.label("person.person"), value: searchText, onChange: handleChange, onKeyDown: handleKeyDown, InputProps: { endAdornment: react_1.default.createElement(material_1.Button, { variant: "contained", id: "searchButton", "data-cy": "search-button", onClick: handleSearch }, helpers_1.Locale.label("common.search")) } }),
|
|
79
|
-
showCreatePersonOnNotFound && hasSearched && searchText && searchResults.length === 0 && (react_1.default.createElement(
|
|
80
|
+
showCreatePersonOnNotFound && hasSearched && searchText && searchResults.length === 0 && (react_1.default.createElement(material_1.Typography, { sx: { marginTop: "7px" } },
|
|
81
|
+
helpers_1.Locale.label("person.noRec"),
|
|
82
|
+
" ",
|
|
83
|
+
react_1.default.createElement("a", { href: "about:blank", onClick: (e) => { e.preventDefault(); setOpen(true); } }, helpers_1.Locale.label("createPerson.addNewPerson")))),
|
|
80
84
|
react_1.default.createElement(material_1.Table, { size: "small", id: "householdMemberAddTable" },
|
|
81
|
-
react_1.default.createElement(material_1.TableBody, null, rows))
|
|
85
|
+
react_1.default.createElement(material_1.TableBody, null, rows)),
|
|
86
|
+
open && react_1.default.createElement(CreatePerson_1.CreatePerson, { showInModal: true, onClose: () => { setOpen(false); }, navigateOnCreate: false, onCreate: person => { setSearchText(""); setSearchResults([person]); } })));
|
|
82
87
|
};
|
|
83
88
|
exports.PersonAdd = PersonAdd;
|
|
84
89
|
//# sourceMappingURL=PersonAdd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersonAdd.js","sourceRoot":"","sources":["../../src/components/PersonAdd.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAwC;AACxC,wCAA+C;AAE/C,
|
|
1
|
+
{"version":3,"file":"PersonAdd.js","sourceRoot":"","sources":["../../src/components/PersonAdd.tsx"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"createPerson": {
|
|
30
30
|
"addNewPerson": "Add a New Person",
|
|
31
31
|
"firstName": "First Name",
|
|
32
|
-
"lastName": "Last Name"
|
|
32
|
+
"lastName": "Last Name",
|
|
33
|
+
"email": "Email"
|
|
33
34
|
},
|
|
34
35
|
"donation": {
|
|
35
36
|
"bankForm": {
|
|
@@ -214,7 +215,8 @@
|
|
|
214
215
|
"lastName": "Last Name",
|
|
215
216
|
"name": "Name",
|
|
216
217
|
"person": "Person",
|
|
217
|
-
"years": "years"
|
|
218
|
+
"years": "years",
|
|
219
|
+
"noRec": "Don't have a person record?"
|
|
218
220
|
},
|
|
219
221
|
"reporting": {
|
|
220
222
|
"detailedSummary": "Detailed Summary",
|
package/package.json
CHANGED
package/public/locales/en.json
CHANGED
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"createPerson": {
|
|
30
30
|
"addNewPerson": "Add a New Person",
|
|
31
31
|
"firstName": "First Name",
|
|
32
|
-
"lastName": "Last Name"
|
|
32
|
+
"lastName": "Last Name",
|
|
33
|
+
"email": "Email"
|
|
33
34
|
},
|
|
34
35
|
"donation": {
|
|
35
36
|
"bankForm": {
|
|
@@ -214,7 +215,8 @@
|
|
|
214
215
|
"lastName": "Last Name",
|
|
215
216
|
"name": "Name",
|
|
216
217
|
"person": "Person",
|
|
217
|
-
"years": "years"
|
|
218
|
+
"years": "years",
|
|
219
|
+
"noRec": "Don't have a person record?"
|
|
218
220
|
},
|
|
219
221
|
"reporting": {
|
|
220
222
|
"detailedSummary": "Detailed Summary",
|
|
@@ -2,16 +2,22 @@ import React from "react"
|
|
|
2
2
|
import { useNavigate } from "react-router-dom"
|
|
3
3
|
import { UserHelper, ApiHelper, Locale } from "../helpers";
|
|
4
4
|
import { Permissions, PersonInterface, HouseholdInterface } from "@churchapps/helpers";
|
|
5
|
-
import { Button, Grid, TextField } from "@mui/material"
|
|
5
|
+
import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Grid, TextField } from "@mui/material"
|
|
6
6
|
import { ErrorMessages } from "./ErrorMessages"
|
|
7
7
|
import { useMountedState } from "../hooks/useMountedState"
|
|
8
8
|
|
|
9
|
-
interface
|
|
9
|
+
interface CommonProps {
|
|
10
10
|
navigateOnCreate?: boolean;
|
|
11
11
|
onCreate?: (person: PersonInterface) => void;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
type ConditionalProps =
|
|
15
|
+
| { showInModal: true; onClose: () => void; }
|
|
16
|
+
| { showInModal?: false; onClose?: never; }
|
|
17
|
+
|
|
18
|
+
type Props = CommonProps & ConditionalProps
|
|
19
|
+
|
|
20
|
+
export function CreatePerson({ navigateOnCreate = true, onCreate = () => {}, showInModal = false, ...props }: Props) {
|
|
15
21
|
const navigate = useNavigate()
|
|
16
22
|
const [person, setPerson] = React.useState<PersonInterface>({ name: { first: "", last: "" }, contactInfo: {} });
|
|
17
23
|
const [errors, setErrors] = React.useState<string[]>([]);
|
|
@@ -33,45 +39,96 @@ export function CreatePerson({ navigateOnCreate = true, onCreate = () => {} }: P
|
|
|
33
39
|
switch (e.target.name) {
|
|
34
40
|
case "first": p.name.first = value; break;
|
|
35
41
|
case "last": p.name.last = value; break;
|
|
42
|
+
case "email": p.contactInfo.email = value; break;
|
|
36
43
|
}
|
|
37
44
|
setPerson(p);
|
|
38
45
|
}
|
|
39
46
|
|
|
40
|
-
|
|
47
|
+
const validateEmail = (email: string) => (/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(.\w{2,3})+$/.test(email));
|
|
48
|
+
|
|
49
|
+
const checkExistingEmail = async () => {
|
|
50
|
+
const result = await ApiHelper.get("/people/search?email=" + person.contactInfo.email, "MembershipApi");
|
|
51
|
+
return result[0];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const handleSave = () => {
|
|
41
55
|
let household = { name: person.name.last } as HouseholdInterface;
|
|
56
|
+
|
|
57
|
+
setIsSubmitting(true);
|
|
58
|
+
ApiHelper.post("/households", [household], "MembershipApi").then(data => {
|
|
59
|
+
household.id = data[0].id;
|
|
60
|
+
person.householdId = household.id;
|
|
61
|
+
person.name.display = [person.name.first, person.name.last].join(" ");
|
|
62
|
+
ApiHelper.post("/people", [person], "MembershipApi").then(data => {
|
|
63
|
+
person.id = data[0].id
|
|
64
|
+
onCreate(person);
|
|
65
|
+
setPerson({...person, name: { first: "", last: "" }, contactInfo: { email: "" }});
|
|
66
|
+
navigateOnCreate && navigate("/people/" + person.id);
|
|
67
|
+
}).finally(() => {
|
|
68
|
+
if (isMounted()) {
|
|
69
|
+
setIsSubmitting(false);
|
|
70
|
+
showInModal && props.onClose();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function handleSubmit() {
|
|
42
77
|
if (validate()) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (isMounted()) {
|
|
55
|
-
setIsSubmitting(false);
|
|
78
|
+
if (person.contactInfo.email && (person.contactInfo.email?.trim() !== undefined || person.contactInfo.email?.trim() !== "")) {
|
|
79
|
+
if (!validateEmail(person.contactInfo.email)) {
|
|
80
|
+
setErrors(["Please enter a valid email address."]);
|
|
81
|
+
} else {
|
|
82
|
+
const existingPerson = await checkExistingEmail();
|
|
83
|
+
if (existingPerson) {
|
|
84
|
+
if (window.confirm(`${existingPerson.name.display} already exists with an email of ${existingPerson.contactInfo.email}. Are you sure you wish to add ${person.name.first} ${person.name.last}?`)) {
|
|
85
|
+
handleSave();
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
handleSave();
|
|
56
89
|
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
handleSave();
|
|
93
|
+
}
|
|
59
94
|
}
|
|
60
95
|
}
|
|
61
96
|
|
|
62
97
|
if (!UserHelper.checkAccess(Permissions.membershipApi.people.edit)) return null;
|
|
98
|
+
if (showInModal) {
|
|
99
|
+
return(
|
|
100
|
+
<>
|
|
101
|
+
<ErrorMessages errors={errors} />
|
|
102
|
+
<Dialog open onClose={props.onClose} fullWidth>
|
|
103
|
+
<DialogTitle>{Locale.label("createPerson.addNewPerson")}</DialogTitle>
|
|
104
|
+
<DialogContent>
|
|
105
|
+
<TextField margin="dense" required fullWidth type="text" aria-label="firstName" label={Locale.label("createPerson.firstName")} name="first" value={person.name.first || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
106
|
+
<TextField margin="dense" required fullWidth type="text" aria-label="lastName" label={Locale.label("createPerson.lastName")} name="last" value={person.name.last || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
107
|
+
<TextField margin="dense" fullWidth type="text" aria-label="email" label={Locale.label("createPerson.email")} name="email" value={person.contactInfo.email || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
108
|
+
</DialogContent>
|
|
109
|
+
<DialogActions>
|
|
110
|
+
<Button onClick={() => { props.onClose(); }}>{Locale.label("common.cancel")}</Button>
|
|
111
|
+
<Button type="submit" variant="contained" disabled={isSubmitting} onClick={handleSubmit}>{Locale.label("common.add")}</Button>
|
|
112
|
+
</DialogActions>
|
|
113
|
+
</Dialog>
|
|
114
|
+
</>
|
|
115
|
+
)
|
|
116
|
+
}
|
|
63
117
|
return (
|
|
64
118
|
<div>
|
|
65
119
|
<p className="pl-1 mb-3 text-dark"><b>{Locale.label("createPerson.addNewPerson")}</b></p>
|
|
66
120
|
<ErrorMessages errors={errors} />
|
|
67
121
|
<Grid container spacing={3} alignItems="center">
|
|
68
|
-
<Grid item md={
|
|
69
|
-
<TextField size="small" margin="none" fullWidth type="text" aria-label="firstName" label={Locale.label("createPerson.firstName")} name="first" value={person.name.first || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
122
|
+
<Grid item md={6} xs={12}>
|
|
123
|
+
<TextField size="small" margin="none" required fullWidth type="text" aria-label="firstName" label={Locale.label("createPerson.firstName")} name="first" value={person.name.first || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
124
|
+
</Grid>
|
|
125
|
+
<Grid item md={6} xs={12}>
|
|
126
|
+
<TextField size="small" margin="none" required fullWidth type="text" aria-label="lastName" label={Locale.label("createPerson.lastName")} name="last" value={person.name.last || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
70
127
|
</Grid>
|
|
71
|
-
<Grid item
|
|
72
|
-
<TextField size="small" margin="none" fullWidth type="text" aria-label="
|
|
128
|
+
<Grid item xs={12}>
|
|
129
|
+
<TextField size="small" margin="none" fullWidth type="text" aria-label="email" label={Locale.label("createPerson.email")} name="email" value={person.contactInfo.email || ""} onChange={handleChange} onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => e.key === "Enter" && handleSubmit} />
|
|
73
130
|
</Grid>
|
|
74
|
-
<Grid item
|
|
131
|
+
<Grid item xs={12}>
|
|
75
132
|
<Button type="submit" fullWidth variant="contained" disabled={isSubmitting} onClick={handleSubmit}>{Locale.label("common.add")}</Button>
|
|
76
133
|
</Grid>
|
|
77
134
|
</Grid>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useState } from "react";
|
|
2
2
|
import { ApiHelper, Locale } from "../helpers";
|
|
3
3
|
import { PersonInterface } from "@churchapps/helpers"
|
|
4
|
-
import { TextField, Button, Table, TableBody, TableRow, TableCell } from "@mui/material";
|
|
4
|
+
import { TextField, Button, Table, TableBody, TableRow, TableCell, Typography } from "@mui/material";
|
|
5
5
|
import { SmallButton } from "./SmallButton";
|
|
6
6
|
import { CreatePerson } from "./CreatePerson";
|
|
7
7
|
|
|
@@ -20,6 +20,7 @@ export const PersonAdd: React.FC<Props> = ({ addFunction, getPhotoUrl, searchCli
|
|
|
20
20
|
const [searchResults, setSearchResults] = useState<PersonInterface[]>([]);
|
|
21
21
|
const [searchText, setSearchText] = useState("");
|
|
22
22
|
const [hasSearched, setHasSearched] = useState<boolean>(false);
|
|
23
|
+
const [open, setOpen] = useState<boolean>(false);
|
|
23
24
|
|
|
24
25
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { e.preventDefault(); setHasSearched(false); setSearchText(e.currentTarget.value); }
|
|
25
26
|
const handleKeyDown = (e: React.KeyboardEvent<any>) => { if (e.key === "Enter") { e.preventDefault(); handleSearch(null); } }
|
|
@@ -67,9 +68,10 @@ export const PersonAdd: React.FC<Props> = ({ addFunction, getPhotoUrl, searchCli
|
|
|
67
68
|
InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSearch}>{Locale.label("common.search")}</Button> }}
|
|
68
69
|
/>
|
|
69
70
|
{showCreatePersonOnNotFound && hasSearched && searchText && searchResults.length === 0 && (
|
|
70
|
-
<
|
|
71
|
+
<Typography sx={{ marginTop: "7px" }}>{Locale.label("person.noRec")} <a href="about:blank" onClick={(e) => { e.preventDefault(); setOpen(true); }}>{Locale.label("createPerson.addNewPerson")}</a></Typography>
|
|
71
72
|
)}
|
|
72
73
|
<Table size="small" id="householdMemberAddTable"><TableBody>{rows}</TableBody></Table>
|
|
74
|
+
{open && <CreatePerson showInModal onClose={() => { setOpen(false); }} navigateOnCreate={false} onCreate={person => { setSearchText(""); setSearchResults([person]) }} />}
|
|
73
75
|
</>
|
|
74
76
|
);
|
|
75
77
|
}
|