eleven-solutions-common-website-unique-web 20.0.9 → 20.0.11
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.
@@ -82,6 +82,6 @@ const UserForm = ({ url }) => {
|
|
82
82
|
window.history.pushState({}, "", "/admin/users");
|
83
83
|
window.dispatchEvent(new PopStateEvent("popstate"));
|
84
84
|
};
|
85
|
-
return (_jsx("div", { className: "max-w-4xl p-6 mx-auto dark:bg-gray-800", children: _jsx("div", { children: _jsxs("form", { children: [_jsx("h1", { className: "text-3xl font-bold text-center text-blue-600 capitalize dark:text-white mb-4", children: isEditMode ? "Edit User" : "Add User" }), _jsxs("div", { className: "mb-6 w-full", children: [_jsxs("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: ["
|
85
|
+
return (_jsx("div", { className: "max-w-4xl p-6 mx-auto dark:bg-gray-800", children: _jsx("div", { children: _jsxs("form", { children: [_jsx("h1", { className: "text-3xl font-bold text-center text-blue-600 capitalize dark:text-white mb-4", children: isEditMode ? "Edit User" : "Add User" }), _jsxs("div", { className: "mb-6 w-full", children: [_jsxs("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: ["Name ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsx("input", { required: true, value: userName, onChange: (e) => setUserName(e.target.value), type: "text", className: "w-full px-4 py-2 mt-2 text-gray-800 bg-white border border-gray-400 rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-800 focus:border-blue-400 focus:ring-blue-300 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring", placeholder: "Enter User Name" })] }), _jsxs("div", { className: "mb-6 w-full", children: [_jsxs("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: ["Email ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsx("input", { required: true, value: email, onChange: (e) => setEmail(e.target.value), type: "email", className: "w-full px-4 py-2 mt-2 text-gray-800 bg-white border border-gray-400 rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-800 focus:border-blue-400 focus:ring-blue-300 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring", placeholder: "Enter Email", disabled: isEditMode })] }), _jsxs("div", { className: "mb-6 w-full", children: [_jsx("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: "Mobile Number" }), _jsx("input", { required: true, value: mobile, onChange: (e) => setMobile(e.target.value), type: "number", className: "w-full px-4 py-2 mt-2 text-gray-800 bg-white border border-gray-400 rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-800 focus:border-blue-400 focus:ring-blue-300 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring", placeholder: "Enter Mobile Number" })] }), _jsxs("div", { className: "mb-6 w-full", children: [_jsx("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: "Address" }), _jsx("input", { required: true, value: address, onChange: (e) => setAddress(e.target.value), type: "text", className: "w-full px-4 py-2 mt-2 text-gray-800 bg-white border border-gray-400 rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-800 focus:border-blue-400 focus:ring-blue-300 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring", placeholder: "Address" })] }), _jsxs("div", { className: "mb-6 w-full", children: [_jsxs("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: ["Gender ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsxs("select", { required: true, value: gender, onChange: (e) => setGender(e.target.value), className: "w-full px-4 py-2 mt-2 text-gray-800 bg-white border border-gray-400 rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-800 focus:border-blue-400 focus:ring-blue-300 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring", children: [_jsx("option", { value: "", children: "Select a Gender" }), _jsx("option", { value: "1", children: "Male" }), _jsx("option", { value: "2", children: "Female" })] })] }), _jsxs("div", { className: "mb-6 w-full", children: [_jsxs("label", { className: "text-gray-900 dark:text-gray-200 font-semibold", children: ["Role Type ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsxs("select", { required: true, value: roleType, onChange: (e) => setRoleType(e.target.value), className: "w-full px-4 py-2 mt-2 text-gray-800 bg-white border border-gray-400 rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-800 focus:border-blue-400 focus:ring-blue-300 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring", children: [_jsx("option", { value: "", children: "Select a Role Type" }), _jsx("option", { value: "1", children: "Guest" }), _jsx("option", { value: "2", children: "Admin" })] })] }), _jsxs("div", { className: "flex space-x-4 mt-6 justify-end", children: [_jsx("button", { type: "submit", onClick: handleSubmit, className: "px-8 py-2.5 leading-5 text-white transition-colors duration-300 transform bg-blue-600 rounded-md hover:bg-blue-500 focus:outline-none focus:bg-gray-600", children: isEditMode ? "Edit" : "Add" }), _jsx("button", { type: "button", onClick: handleCancelClick, className: "px-8 py-2.5 leading-5 text-white transition-colors duration-300 transform bg-blue-600 rounded-md hover:bg-blue-500 focus:outline-none focus:bg-gray-600", children: "Cancel" })] })] }) }) }));
|
86
86
|
};
|
87
87
|
export default UserForm;
|
@@ -13,6 +13,7 @@ import { FaPlus } from "react-icons/fa";
|
|
13
13
|
import { fetchUsersApi, deleteUserApi } from "../api/user";
|
14
14
|
const Users = ({ url }) => {
|
15
15
|
const [users, setUsers] = useState([]);
|
16
|
+
const [searchTerm, setSearchTerm] = useState("");
|
16
17
|
const fetchUsersData = () => __awaiter(void 0, void 0, void 0, function* () {
|
17
18
|
const data = yield fetchUsersApi(url);
|
18
19
|
if (data) {
|
@@ -32,7 +33,14 @@ const Users = ({ url }) => {
|
|
32
33
|
};
|
33
34
|
const [currentPage, setCurrentPage] = useState(1);
|
34
35
|
const itemsPerPage = 10;
|
35
|
-
const
|
36
|
+
const filteredUsers = users.filter((user) => {
|
37
|
+
var _a, _b, _c;
|
38
|
+
return ((_a = user.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchTerm)) ||
|
39
|
+
((_b = user.email) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchTerm)) ||
|
40
|
+
((_c = user.mobile) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchTerm));
|
41
|
+
});
|
42
|
+
// const totalPages = Math.ceil(users.length / itemsPerPage);
|
43
|
+
const totalPages = Math.ceil(filteredUsers.length / itemsPerPage);
|
36
44
|
const handleNextPage = () => {
|
37
45
|
if (currentPage < totalPages) {
|
38
46
|
setCurrentPage(currentPage + 1);
|
@@ -46,7 +54,7 @@ const Users = ({ url }) => {
|
|
46
54
|
const handlePageClick = (pageNumber) => {
|
47
55
|
setCurrentPage(pageNumber);
|
48
56
|
};
|
49
|
-
const paginatedUsers =
|
57
|
+
const paginatedUsers = filteredUsers.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage);
|
50
58
|
const handleDeleteClick = (id) => __awaiter(void 0, void 0, void 0, function* () {
|
51
59
|
try {
|
52
60
|
yield deleteUserApi(url, id);
|
@@ -62,7 +70,11 @@ const Users = ({ url }) => {
|
|
62
70
|
window.history.pushState({}, "", path + id);
|
63
71
|
window.dispatchEvent(new PopStateEvent("popstate"));
|
64
72
|
};
|
65
|
-
|
73
|
+
const handleSearchChange = (event) => {
|
74
|
+
setSearchTerm(event.target.value.toLowerCase());
|
75
|
+
setCurrentPage(1); // Reset to the first page on search
|
76
|
+
};
|
77
|
+
return (_jsxs("div", { className: "container px-4 mx-auto mt-6", children: [_jsx("div", { className: "w-3/4", children: _jsx("h1", { className: "text-3xl font-bold text-blue-600 mb-5", children: "Users" }) }), _jsx("div", { className: "flex-grow ml-0 w-full mt-10", children: _jsxs("form", { className: "w-full ", children: [_jsx("label", { htmlFor: "default-search", className: "mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white", children: "Search" }), _jsxs("div", { className: "relative w-full", children: [_jsx("div", { className: "absolute inset-y-0 start-0 flex items-center ps-3 pointer-events-none", children: _jsx("svg", { className: "w-4 h-4 text-gray-500 dark:text-gray-400", "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 20 20", children: _jsx("path", { stroke: "currentColor", "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", d: "m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z" }) }) }), _jsx("input", { type: "search", id: "default-search", className: "inline-block min-w-full p-3 ps-10 outline-none text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500", placeholder: "Search by Name, Email or Mobile", value: searchTerm, onChange: handleSearchChange, required: true }), _jsx("button", { type: "submit", className: "text-white absolute end-1.5 bottom-1.5 bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800", children: "Search" })] })] }) }), _jsx("div", { className: "flex-grow ml-0 w-3/4", children: _jsx("form", { className: "w-auto" }) }), _jsxs("div", { className: "flex-grow ml-0 mt-4 w-full", children: [_jsx("div", { className: "overflow-hidden border border-gray-200 dark:border-gray-700 md:rounded-lg mt-6", children: _jsxs("table", { className: "min-w-full divide-y divide-gray-200 dark:divide-gray-700", children: [_jsx("thead", { className: "bg-gray-50 dark:bg-gray-800", children: _jsxs("tr", { children: [_jsx("th", { scope: "col", className: "px-4 py-3.5 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: "Edit/Delete" }), _jsx("th", { scope: "col", className: "py-3.5 px-4 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: _jsx("div", { className: "flex items-center gap-x-3", children: _jsx("span", { children: "Name" }) }) }), _jsx("th", { scope: "col", className: "px-4 py-3.5 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: _jsx("button", { className: "flex items-center gap-x-2", children: _jsx("span", { children: "Email" }) }) }), _jsx("th", { scope: "col", className: "px-4 py-3.5 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: _jsx("button", { className: "flex items-center gap-x-2", children: _jsx("span", { children: "Mobile" }) }) }), _jsx("th", { scope: "col", className: "px-4 py-3.5 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: "Address" }), _jsx("th", { scope: "col", className: "px-4 py-3.5 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: "Gender" }), _jsx("th", { scope: "col", className: "px-4 py-3.5 text-md font-normal text-left rtl:text-right text-gray-500 dark:text-gray-400", children: "Role Type" })] }) }), _jsx("tbody", { className: "bg-white divide-y divide-gray-200 dark:divide-gray-700 dark:bg-gray-900", children: paginatedUsers.map((user, index) => (_jsxs("tr", { children: [_jsx("td", { className: "px-4 py-4 text-sm whitespace-nowrap", children: _jsxs("div", { className: "flex items-center gap-x-6", children: [_jsx("button", { onClick: () => handleDeleteClick(user.id), className: "text-gray-500 transition-colors duration-200 dark:hover:text-red-600 dark:text-gray-300 hover:text-red-500 focus:outline-none", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", "stroke-width": "1.5", stroke: "currentColor", className: "w-5 h-5", children: _jsx("path", { "stroke-linecap": "round", "stroke-linejoin": "round", d: "M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" }) }) }), _jsx("button", { onClick: (event) => handleEditClick(event, "/admin/users/userform?id=", user.id), className: "text-gray-500 transition-colors duration-200 dark:hover:text-yellow-500 dark:text-gray-300 hover:text-yellow-500 focus:outline-none", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: "1.5", stroke: "currentColor", className: "w-5 h-5", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10" }) }) })] }) }), _jsx("td", { className: "px-4 py-4 text-sm font-medium text-gray-700 whitespace-nowrap", children: _jsx("div", { className: "inline-flex items-center gap-x-3", children: _jsx("div", { className: "flex items-center gap-x-2", children: _jsx("div", { children: _jsx("h2", { className: " text-sm font-medium text-gray-800 dark:text-white ", children: user.name }) }) }) }) }), _jsx("td", { className: "px-4 py-4 text-sm text-gray-500 dark:text-gray-300 whitespace-nowrap", children: user.email }), _jsx("td", { className: "px-4 py-4 text-sm text-gray-500 dark:text-gray-300 whitespace-nowrap", children: user.mobile }), _jsx("td", { className: "px-4 py-4 text-sm text-gray-500 dark:text-gray-300 whitespace-nowrap", children: user.address }), _jsx("td", { className: "px-4 py-4 text-sm text-gray-500 dark:text-gray-300 whitespace-nowrap", children: user.gender != null
|
66
78
|
? user.gender === 1
|
67
79
|
? "Male"
|
68
80
|
: "Female"
|
package/package.json
CHANGED
@@ -119,7 +119,7 @@ const UserForm = ({ url }: UserFormProps) => {
|
|
119
119
|
|
120
120
|
<div className="mb-6 w-full">
|
121
121
|
<label className="text-gray-900 dark:text-gray-200 font-semibold">
|
122
|
-
|
122
|
+
Name <span className="text-red-500">*</span>
|
123
123
|
</label>
|
124
124
|
<input
|
125
125
|
required
|
@@ -11,6 +11,7 @@ interface UsersProps {
|
|
11
11
|
|
12
12
|
const Users = ({ url }: UsersProps) => {
|
13
13
|
const [users, setUsers] = useState<any[]>([]);
|
14
|
+
const [searchTerm, setSearchTerm] = useState<string>("");
|
14
15
|
|
15
16
|
const fetchUsersData = async () => {
|
16
17
|
const data = await fetchUsersApi(url);
|
@@ -34,7 +35,15 @@ const Users = ({ url }: UsersProps) => {
|
|
34
35
|
const [currentPage, setCurrentPage] = useState(1);
|
35
36
|
const itemsPerPage = 10;
|
36
37
|
|
37
|
-
const
|
38
|
+
const filteredUsers = users.filter(
|
39
|
+
(user) =>
|
40
|
+
user.name?.toLowerCase().includes(searchTerm) ||
|
41
|
+
user.email?.toLowerCase().includes(searchTerm) ||
|
42
|
+
user.mobile?.toLowerCase().includes(searchTerm)
|
43
|
+
);
|
44
|
+
|
45
|
+
// const totalPages = Math.ceil(users.length / itemsPerPage);
|
46
|
+
const totalPages = Math.ceil(filteredUsers.length / itemsPerPage);
|
38
47
|
|
39
48
|
const handleNextPage = () => {
|
40
49
|
if (currentPage < totalPages) {
|
@@ -52,7 +61,7 @@ const Users = ({ url }: UsersProps) => {
|
|
52
61
|
setCurrentPage(pageNumber);
|
53
62
|
};
|
54
63
|
|
55
|
-
const paginatedUsers =
|
64
|
+
const paginatedUsers = filteredUsers.slice(
|
56
65
|
(currentPage - 1) * itemsPerPage,
|
57
66
|
currentPage * itemsPerPage
|
58
67
|
);
|
@@ -78,6 +87,11 @@ const Users = ({ url }: UsersProps) => {
|
|
78
87
|
window.dispatchEvent(new PopStateEvent("popstate"));
|
79
88
|
};
|
80
89
|
|
90
|
+
const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
91
|
+
setSearchTerm(event.target.value.toLowerCase());
|
92
|
+
setCurrentPage(1); // Reset to the first page on search
|
93
|
+
};
|
94
|
+
|
81
95
|
return (
|
82
96
|
<div className="container px-4 mx-auto mt-6">
|
83
97
|
<div className="w-3/4">
|
@@ -113,7 +127,9 @@ const Users = ({ url }: UsersProps) => {
|
|
113
127
|
type="search"
|
114
128
|
id="default-search"
|
115
129
|
className="inline-block min-w-full p-3 ps-10 outline-none text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
116
|
-
placeholder="Search
|
130
|
+
placeholder="Search by Name, Email or Mobile"
|
131
|
+
value={searchTerm}
|
132
|
+
onChange={handleSearchChange}
|
117
133
|
required
|
118
134
|
/>
|
119
135
|
<button
|