done users and roles page responsive view review nalang ang polish

This commit is contained in:
2026-03-19 16:27:37 +08:00
parent 8c776a5491
commit c9d5faebb0
12 changed files with 262 additions and 85 deletions

View File

@@ -23,7 +23,10 @@ const Toggle = ({ tabs = [], activeTab, onChange }) => {
{isMobile && activeTab === "permissions" && ( {isMobile && activeTab === "permissions" && (
<div className={styles.container}> <div className={styles.container}>
<div className={styles.searchBar}>
<MobileSearchBar /> <MobileSearchBar />
</div>
<button> <button>
<PlusIcon /> <PlusIcon />
</button> </button>

View File

@@ -20,13 +20,18 @@
align-items: center; align-items: center;
gap: 16px; gap: 16px;
flex: 1 0 0; flex: 1 0 0;
padding: 8px 0;
} }
.searchBar {
width: 100%;
}
.container > button { .container > button {
display: flex; display: flex;
padding: 8px; padding: 8px;
border: none; border: none;
justify-content: center; justify-content: center;
align-items: center; align-items: end;
gap: 12px; gap: 12px;
border-radius: 6px; border-radius: 6px;
background: #27293b; background: #27293b;

View File

@@ -20,15 +20,13 @@ const Permissions = ({ sampleData = [] }) => {
</div> </div>
</div> </div>
<div className={editUserStyle.wrapper}>
{sampleData.length === 0 ? ( {sampleData.length === 0 ? (
// Default Message
<div className={editUserStyle.permissionDefaultState}> <div className={editUserStyle.permissionDefaultState}>
<p>No permission added yet</p> <p>No permission added yet</p>
</div> </div>
) : ( ) : (
// Sampple Data(static) <div className={editUserStyle.permissionsList}>
sampleData.map((perm, index) => { {sampleData.map((perm, index) => {
return ( return (
<div className={editUserStyle.permissions} key={index}> <div className={editUserStyle.permissions} key={index}>
<div className={editUserStyle.permissionsItem}> <div className={editUserStyle.permissionsItem}>
@@ -40,9 +38,9 @@ const Permissions = ({ sampleData = [] }) => {
</div> </div>
</div> </div>
); );
}) })}
)}
</div> </div>
)}
</div> </div>
</> </>
); );

View File

@@ -22,7 +22,6 @@
align-items: flex-start; align-items: flex-start;
gap: 5px; gap: 5px;
flex: 1 0 0; flex: 1 0 0;
color: #d2d3e1; color: #d2d3e1;
font-family: Inter; font-family: Inter;
font-size: 20px; font-size: 20px;
@@ -53,22 +52,13 @@
background: #27293b; background: #27293b;
} }
.wrapper {
display: flex;
height: 43.813px;
padding: 8px 16px;
justify-content: center;
align-items: center;
align-self: stretch;
}
.permissionDefaultState { .permissionDefaultState {
display: flex;
justify-content: center;
align-items: center; align-items: center;
gap: 12px; gap: 12px;
flex: 1 0 0; flex: 1 0 0;
align-self: stretch; align-self: stretch;
height: 43.813px;
padding: 8px 16px;
} }
.permissionDefaultState p { .permissionDefaultState p {
display: flex; display: flex;
@@ -84,16 +74,19 @@
font-weight: 400; font-weight: 400;
line-height: normal; line-height: normal;
} }
.permissionsList {
width: 100%;
}
.permissions { .permissions {
display: flex; display: flex;
height: 43.813px; height: 43.813px;
padding: 8px 16px; padding: 8px 8px 8px 16px;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
align-self: stretch; align-self: stretch;
border-bottom: 0.5px solid #2e3042; border-bottom: 0.5px solid #2e3042;
} }
.permissions:hover { .permissions:hover {
border-bottom: 1px solid rgba(129, 135, 255, 0.25); border-bottom: 1px solid rgba(129, 135, 255, 0.25);
background: rgba(129, 135, 255, 0.05); background: rgba(129, 135, 255, 0.05);
@@ -153,21 +146,21 @@
font-size: 18px; font-size: 18px;
align-self: stretch; align-self: stretch;
} }
.svgContainer { .svgContainer {
display: none; display: none;
} }
.wrapper {
display: flex;
padding: 24px 16px 0 16px;
align-items: flex-start;
align-self: stretch;
}
.permissionDefaultState { .permissionDefaultState {
gap: 12px; gap: 12px;
align-self: stretch; align-self: stretch;
padding: 24px 16px 0 16px;
}
.permissionsList {
padding-top: 16px;
}
.permissions {
padding: 8px 16px;
} }
.permissionDefaultState > p { .permissionDefaultState > p {
font-weight: 500; font-weight: 500;
text-align: center; text-align: center;

View File

@@ -1,9 +1,11 @@
import React from "react"; "use client";
import React, { useState } from "react";
import TopHeader from "@/app/components/topHeader/TopHeader"; import TopHeader from "@/app/components/topHeader/TopHeader";
import globalStyle from "../../globalStyle.module.css"; import globalStyle from "../../globalStyle.module.css";
import editRoleStyle from "./styles.module.css"; import editRoleStyle from "./styles.module.css";
import TextField from "@/app/components/fields/textfield"; import TextField from "@/app/components/fields/textfield";
import Permissions from "@/app/components/permissions/Permissions"; import Permissions from "@/app/components/permissions/Permissions";
import Toggle from "@/app/components/mobileToggleTab/Toggle";
const ViewRolePage = () => { const ViewRolePage = () => {
const sampleData = [ const sampleData = [
@@ -22,6 +24,8 @@ const ViewRolePage = () => {
{ permission: "service.delete" }, { permission: "service.delete" },
{ permission: "service.update" }, { permission: "service.update" },
]; ];
const [activeTab, setActiveTab] = useState("details");
return ( return (
<div className={globalStyle.section}> <div className={globalStyle.section}>
<div className={globalStyle.mainContainer}> <div className={globalStyle.mainContainer}>
@@ -32,23 +36,30 @@ const ViewRolePage = () => {
state="view" state="view"
requiredButtons={["back", "title", "edit", "download"]} requiredButtons={["back", "title", "edit", "download"]}
/> />
<div className={editRoleStyle.addRoleContainer}> <div className={editRoleStyle.editRoleContainer}>
{/* Mobile Toggle */}
<Toggle
activeTab={activeTab}
onChange={setActiveTab}
tabs={[
{ label: "Role Details", value: "details" },
{ label: "Permissions", value: "permissions" },
]}
/>
{/* Input fields Container */} {/* Input fields Container */}
<div className={editRoleStyle.inputFieldContainer}> <div className={editRoleStyle.inputFieldContainer}>
{/* User Details */} {/* User Details */}
<div className={editRoleStyle.userDetails}> <div
{/* Header */} className={`${editRoleStyle.roleDetails} ${activeTab !== "details" ? editRoleStyle.hiddenMobile : ""}`}
>
<div className={editRoleStyle.header}> <div className={editRoleStyle.header}>
<div> <div>
<p>Role Details</p> <p>Role Details</p>
</div> </div>
</div> </div>
{/* Input fields */}
<form className={editRoleStyle.fields}> <form className={editRoleStyle.fields}>
{/* Email */}
<div className={editRoleStyle.inputMainContainer}> <div className={editRoleStyle.inputMainContainer}>
<div className={editRoleStyle.inputContainer}> <div className={editRoleStyle.inputContainer}>
{/* Label */}
<div className={editRoleStyle.label}> <div className={editRoleStyle.label}>
<p>Name</p> <p>Name</p>
</div> </div>
@@ -77,12 +88,17 @@ const ViewRolePage = () => {
</div> </div>
{/* Permissions */} {/* Permissions */}
<div
className={`${editRoleStyle.userPermissions} ${activeTab !== "permissions" ? editRoleStyle.hiddenMobile : ""}`}
>
<div className={editRoleStyle.imanginaryDiv}></div>
<Permissions sampleData={sampleData} /> <Permissions sampleData={sampleData} />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
); );
}; };

View File

@@ -1,4 +1,4 @@
.addRoleContainer { .editRoleContainer {
display: flex; display: flex;
padding: 0px 144px 0px 144px; padding: 0px 144px 0px 144px;
align-items: flex-start; align-items: flex-start;
@@ -13,7 +13,7 @@
flex: 1 0 0; flex: 1 0 0;
align-self: stretch; align-self: stretch;
} }
.userDetails { .roleDetails {
display: flex; display: flex;
width: 400px; width: 400px;
padding: 20px 24px 48px 24px; padding: 20px 24px 48px 24px;
@@ -23,6 +23,21 @@
border-radius: 6px; border-radius: 6px;
background: #1d1e2a; background: #1d1e2a;
} }
.imanginaryDiv {
padding: 18px;
}
.userPermissions {
display: flex;
flex-direction: column;
align-items: flex-start;
flex: 1 0 0;
align-self: stretch;
height: calc(100vh - 175px);
position: relative;
overflow-y: auto;
scrollbar-width: none;
padding-bottom: 60px;
}
.header { .header {
display: flex; display: flex;
padding-bottom: 24px; padding-bottom: 24px;
@@ -93,6 +108,36 @@
align-self: stretch; align-self: stretch;
} }
.imanginaryDiv { @media (max-width: 950px) {
padding: 18px; .hiddenMobile {
display: none;
}
.editRoleContainer {
align-self: stretch;
padding: 0 16px;
flex-direction: column;
gap: 0px;
}
.imanginaryDiv {
padding: 5px;
}
.header {
display: none;
}
.roleDetails {
background: none;
padding: 0px 0px 0px 0px;
margin-top: 32x;
}
.userPermissions {
height: calc(100vh - 295px);
}
}
@media (max-width: 768px) {
.roleDetails {
background: none;
padding: 0px 0px 0px 0px;
width: 100%;
}
} }

View File

@@ -1,5 +1,5 @@
"use client"; "use client";
import React from "react"; import React, { useState } from "react";
import TopHeader from "@/app/components/topHeader/TopHeader"; import TopHeader from "@/app/components/topHeader/TopHeader";
import globalStyle from "../../globalStyle.module.css"; import globalStyle from "../../globalStyle.module.css";
import addRoleStyle from "./styles.module.css"; import addRoleStyle from "./styles.module.css";
@@ -7,8 +7,11 @@ import TextField from "@/app/components/fields/textfield";
import Permissions from "@/app/components/permissions/Permissions"; import Permissions from "@/app/components/permissions/Permissions";
import useUserForm from "@/app/hooks/useUserForm"; import useUserForm from "@/app/hooks/useUserForm";
import Alert from "@/app/components/alerts/Alert"; import Alert from "@/app/components/alerts/Alert";
import Toggle from "@/app/components/mobileToggleTab/Toggle";
const AddRolePage = () => { const AddRolePage = () => {
// Mobile
const [activeTab, setActiveTab] = useState("details");
const { const {
register, register,
handleSubmit, handleSubmit,
@@ -36,30 +39,36 @@ const AddRolePage = () => {
requiredButtons={["title", "save"]} requiredButtons={["title", "save"]}
/> />
<div className={addRoleStyle.addRoleContainer}> <div className={addRoleStyle.addRoleContainer}>
<Toggle
activeTab={activeTab}
onChange={setActiveTab}
tabs={[
{ label: "Role Details", value: "details" },
{ label: "Permissions", value: "permissions" },
]}
/>
{/* Input fields Container */} {/* Input fields Container */}
<div className={addRoleStyle.inputFieldContainer}> <div className={addRoleStyle.inputFieldContainer}>
{/* User Details */} {/* User Details */}
<div className={addRoleStyle.roleDetails}> <div
{/* Header */} className={`${addRoleStyle.roleDetails} ${activeTab !== "details" ? addRoleStyle.hiddenMobile : ""}`}
>
<div className={addRoleStyle.header}> <div className={addRoleStyle.header}>
<div> <div>
<p>Role Details</p> <p>Role Details</p>
</div> </div>
</div> </div>
{/* Input fields */} {/* Ibalhin ning form na tag */}
<form <form
className={addRoleStyle.fields} className={addRoleStyle.fields}
id="form" id="form"
onSubmit={handleSubmit(onSubmit)} onSubmit={handleSubmit(onSubmit)}
> >
{/* Email */}
<div className={addRoleStyle.inputMainContainer}> <div className={addRoleStyle.inputMainContainer}>
<div className={addRoleStyle.inputContainer}> <div className={addRoleStyle.inputContainer}>
{/* Label */}
<div className={addRoleStyle.label}> <div className={addRoleStyle.label}>
<p>Name</p> <p>Name</p>
</div> </div>
{/* Input field */}
<div className={addRoleStyle.inputField}> <div className={addRoleStyle.inputField}>
<TextField <TextField
placeHolder="Enter name" placeHolder="Enter name"
@@ -69,14 +78,11 @@ const AddRolePage = () => {
</div> </div>
</div> </div>
</div> </div>
{/* Full Name */}
<div className={addRoleStyle.inputMainContainer}> <div className={addRoleStyle.inputMainContainer}>
<div className={addRoleStyle.inputContainer}> <div className={addRoleStyle.inputContainer}>
{/* Label */}
<div className={addRoleStyle.label}> <div className={addRoleStyle.label}>
<p>Organization ID</p> <p>Organization ID</p>
</div> </div>
{/* Input field */}
<div className={addRoleStyle.inputField}> <div className={addRoleStyle.inputField}>
<TextField <TextField
placeHolder="Enter organization ID" placeHolder="Enter organization ID"
@@ -90,12 +96,17 @@ const AddRolePage = () => {
</div> </div>
{/* Permissions */} {/* Permissions */}
<div
className={`${addRoleStyle.userPermissions} ${activeTab !== "permissions" ? addRoleStyle.hiddenMobile : ""}`}
>
<div className={addRoleStyle.imanginaryDiv}></div>
<Permissions /> <Permissions />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
); );
}; };

View File

@@ -22,7 +22,21 @@
align-items: flex-start; align-items: flex-start;
border-radius: 6px; border-radius: 6px;
background: #1d1e2a; background: #1d1e2a;
background: color(display-p3 0.1137 0.1176 0.1608); }
.imanginaryDiv {
padding: 18px;
}
.userPermissions {
display: flex;
flex-direction: column;
align-items: flex-start;
flex: 1 0 0;
align-self: stretch;
height: calc(100vh - 175px);
position: relative;
overflow: auto;
scrollbar-width: none;
padding-bottom: 60px;
} }
.header { .header {
display: flex; display: flex;
@@ -42,7 +56,6 @@
.header > div > p { .header > div > p {
width: 163px; width: 163px;
color: #d2d3e1; color: #d2d3e1;
color: color(display-p3 0.8235 0.8275 0.8784);
font-family: Inter; font-family: Inter;
font-size: 20px; font-size: 20px;
font-style: normal; font-style: normal;
@@ -79,7 +92,6 @@
} }
.label > p { .label > p {
color: #d2d3e1; color: #d2d3e1;
color: color(display-p3 0.8235 0.8275 0.8784);
font-family: Inter; font-family: Inter;
font-size: 16px; font-size: 16px;
font-style: normal; font-style: normal;
@@ -93,6 +105,35 @@
gap: 8px; gap: 8px;
align-self: stretch; align-self: stretch;
} }
.imanginaryDiv { @media (max-width: 950px) {
padding: 18px; .hiddenMobile {
display: none;
}
.addRoleContainer {
align-self: stretch;
padding: 0 16px;
flex-direction: column;
gap: 0px;
}
.imanginaryDiv {
padding: 5px;
}
.header {
display: none;
}
.roleDetails {
background: none;
padding: 0px 0px 0px 0px;
margin-top: 32px;
}
.userPermissions {
height: calc(100vh - 295px);
}
}
@media (max-width: 768px) {
.roleDetails {
background: none;
padding: 0px 0px 0px 0px;
width: 100%;
}
} }

View File

@@ -7,6 +7,7 @@ import { useState } from "react";
import TextField from "@/app/components/fields/textfield"; import TextField from "@/app/components/fields/textfield";
import SelectField from "@/app/components/select/SelectField"; import SelectField from "@/app/components/select/SelectField";
import Permissions from "@/app/components/permissions/Permissions"; import Permissions from "@/app/components/permissions/Permissions";
import Toggle from "@/app/components/mobileToggleTab/Toggle";
const ViewUserPage = () => { const ViewUserPage = () => {
const sampleData = [ const sampleData = [
@@ -26,6 +27,9 @@ const ViewUserPage = () => {
{ permission: "service.update" }, { permission: "service.update" },
]; ];
// Mobile
const [activeTab, setActiveTab] = useState("details");
return ( return (
<div className={globalStyle.section}> <div className={globalStyle.section}>
<div className={globalStyle.mainContainer}> <div className={globalStyle.mainContainer}>
@@ -36,12 +40,22 @@ const ViewUserPage = () => {
state="view" state="view"
requiredButtons={["back", "title", "edit", "download"]} requiredButtons={["back", "title", "edit", "download"]}
/> />
<div className={editUserStyle.addUserContainer}> <div className={editUserStyle.editUserContainer}>
{/* Mobile Toggle */}
<Toggle
activeTab={activeTab}
onChange={setActiveTab}
tabs={[
{ label: "User Details", value: "details" },
{ label: "Permissions", value: "permissions" },
]}
/>
{/* Input fields Container */} {/* Input fields Container */}
<div className={editUserStyle.inputFieldContainer}> <div className={editUserStyle.inputFieldContainer}>
{/* User Details */} {/* User Details */}
<div className={editUserStyle.userDetails}> <div
{/* Header */} className={`${editUserStyle.userDetails} ${activeTab !== "details" ? editUserStyle.hiddenMobile : ""}`}
>
<div className={editUserStyle.header}> <div className={editUserStyle.header}>
<div> <div>
<p>User Details</p> <p>User Details</p>
@@ -61,10 +75,8 @@ const ViewUserPage = () => {
]} ]}
/> />
</div> </div>
{/* Email */}
<div className={editUserStyle.inputMainContainer}> <div className={editUserStyle.inputMainContainer}>
<div className={editUserStyle.inputContainer}> <div className={editUserStyle.inputContainer}>
{/* Label */}
<div className={editUserStyle.label}> <div className={editUserStyle.label}>
<p>Email</p> <p>Email</p>
{/* <p className={editUserStyle.optionalTxt}>(Optional)</p> */} {/* <p className={editUserStyle.optionalTxt}>(Optional)</p> */}
@@ -98,12 +110,17 @@ const ViewUserPage = () => {
</form> </form>
</div> </div>
{/* Permissions */} {/* Permissions */}
<div
className={`${editUserStyle.userPermissions} ${activeTab !== "permissions" ? editUserStyle.hiddenMobile : ""}`}
>
<div className={editUserStyle.imanginaryDiv}></div>
<Permissions sampleData={sampleData} /> <Permissions sampleData={sampleData} />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
); );
}; };

View File

@@ -1,11 +1,11 @@
.addUserContainer { .editUserContainer {
display: flex; display: flex;
padding: 0px 144px 0 144px; padding: 0px 144px 0 144px;
align-items: flex-start; /* align-items: flex-start; */
gap: 24px; gap: 24px;
flex: 1 0 0; flex: 1 0 0;
align-self: stretch; align-self: stretch;
position: relative; /* position: relative; */
} }
.inputFieldContainer { .inputFieldContainer {
display: flex; display: flex;
@@ -24,6 +24,22 @@
border-radius: 6px; border-radius: 6px;
background: #1d1e2a; background: #1d1e2a;
} }
.imanginaryDiv {
padding: 18px;
}
.userPermissions {
display: flex;
flex-direction: column;
align-items: flex-start;
flex: 1 0 0;
align-self: stretch;
height: calc(100vh - 175px);
position: relative;
overflow-y: auto;
scrollbar-width: none;
padding-bottom: 60px;
}
.header { .header {
display: flex; display: flex;
padding-bottom: 24px; padding-bottom: 24px;
@@ -42,7 +58,6 @@
.header > div > p { .header > div > p {
width: 163px; width: 163px;
color: #d2d3e1; color: #d2d3e1;
color: color(display-p3 0.8235 0.8275 0.8784);
font-family: Inter; font-family: Inter;
font-size: 20px; font-size: 20px;
font-style: normal; font-style: normal;
@@ -113,6 +128,37 @@
gap: 8px; gap: 8px;
align-self: stretch; align-self: stretch;
} }
.imanginaryDiv {
padding: 18px; @media (max-width: 950px) {
.hiddenMobile {
display: none;
}
.editUserContainer {
align-self: stretch;
padding: 0 16px;
flex-direction: column;
gap: 0px;
}
.imanginaryDiv {
padding: 5px;
}
.header {
display: none;
}
.userDetails {
background: none;
padding: 0px 0px 0px 0px;
margin-top: 32x;
}
.userPermissions {
height: calc(100vh - 295px);
}
}
@media (max-width: 768px) {
.userDetails {
background: none;
padding: 0px 0px 0px 0px;
width: 100%;
}
} }

View File

@@ -11,6 +11,8 @@ import Alert from "@/app/components/alerts/Alert";
import Toggle from "@/app/components/mobileToggleTab/Toggle"; import Toggle from "@/app/components/mobileToggleTab/Toggle";
const AddUserPage = () => { const AddUserPage = () => {
// Mobile
const [activeTab, setActiveTab] = useState("details");
const { const {
register, register,
handleSubmit, handleSubmit,
@@ -20,9 +22,6 @@ const AddUserPage = () => {
setTriggerAlert, setTriggerAlert,
} = useUserForm(); } = useUserForm();
// Mobile
const [activeTab, setActiveTab] = useState("details");
return ( return (
<div className={globalStyle.section}> <div className={globalStyle.section}>
{triggerAlert && ( {triggerAlert && (
@@ -69,7 +68,6 @@ const AddUserPage = () => {
id="form" id="form"
onSubmit={handleSubmit(onSubmit)} onSubmit={handleSubmit(onSubmit)}
> >
{/* Role and Dropdown */}
<div className={addUserStyle.roleField}> <div className={addUserStyle.roleField}>
<p>Role</p> <p>Role</p>
<SelectField <SelectField

View File

@@ -33,11 +33,11 @@
align-items: flex-start; align-items: flex-start;
flex: 1 0 0; flex: 1 0 0;
align-self: stretch; align-self: stretch;
border-radius: 6px;
height: calc(100vh - 175px); height: calc(100vh - 175px);
position: relative; position: relative;
overflow: auto; overflow: auto;
scrollbar-width: none; scrollbar-width: none;
padding-bottom: 60px;
} }
.header { .header {
display: flex; display: flex;
@@ -122,18 +122,22 @@
align-self: stretch; align-self: stretch;
padding: 0 16px; padding: 0 16px;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 0px;
}
.imanginaryDiv {
padding: 5px;
} }
.header { .header {
display: none; display: none;
} }
.userDetails { .userDetails {
background: none; background: none;
padding: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;
margin-top: 16px; margin-top: 32px;
} }
.imanginaryDiv { .userPermissions {
display: none; height: calc(100vh - 295px);
} }
} }
@media (max-width: 768px) { @media (max-width: 768px) {