bug fixes

This commit is contained in:
Daniel 2023-05-28 20:52:01 +03:30
parent 287f7fa870
commit fcbecb5bc5
4 changed files with 156 additions and 136 deletions

View File

@ -99,11 +99,16 @@ export default function TeamManagement({
<div> <div>
<p className="mb-2 text-gray-500">Public Link (Click to copy)</p> <p className="mb-2 text-gray-500">Public Link (Click to copy)</p>
<div <div
onClick={() => onClick={() => {
navigator.clipboard try {
.writeText(publicCollectionURL) navigator.clipboard
.then(() => console.log("Copied!")) .writeText(publicCollectionURL)
} .then(() => console.log("Copied!"));
} catch (err) {
alert(err);
console.log(err);
}
}}
className="w-full hide-scrollbar overflow-x-auto whitespace-nowrap rounded-md p-3 border-sky-100 border-solid border outline-none hover:border-sky-500 duration-100 cursor-text" className="w-full hide-scrollbar overflow-x-auto whitespace-nowrap rounded-md p-3 border-sky-100 border-solid border outline-none hover:border-sky-500 duration-100 cursor-text"
> >
{publicCollectionURL} {publicCollectionURL}
@ -159,138 +164,149 @@ export default function TeamManagement({
</p> </p>
<div className="max-h-[20rem] overflow-auto flex flex-col gap-3 rounded-md shadow-inner"> <div className="max-h-[20rem] overflow-auto flex flex-col gap-3 rounded-md shadow-inner">
{collection.members.map((e, i) => { {collection.members
return ( .sort((a, b) => (a.userId as number) - (b.userId as number))
<div .map((e, i) => {
key={i} return (
className="relative border p-2 rounded-md border-sky-100 flex flex-col sm:flex-row sm:items-center gap-2 justify-between" <div
> key={i}
<FontAwesomeIcon className="relative border p-2 rounded-md border-sky-100 flex flex-col sm:flex-row sm:items-center gap-2 justify-between"
icon={faClose} >
className="absolute right-2 top-2 text-gray-500 h-4 hover:text-red-500 duration-100 cursor-pointer" <FontAwesomeIcon
title="Remove Member" icon={faClose}
onClick={() => { className="absolute right-2 top-2 text-gray-500 h-4 hover:text-red-500 duration-100 cursor-pointer"
const updatedMembers = collection.members.filter( title="Remove Member"
(member) => { onClick={() => {
return member.user.email !== e.user.email; const updatedMembers = collection.members.filter(
} (member) => {
); return member.user.email !== e.user.email;
setCollection({ }
...collection, );
members: updatedMembers, setCollection({
}); ...collection,
}} members: updatedMembers,
/> });
<div className="flex items-center gap-2"> }}
<ImageWithFallback />
key={i} <div className="flex items-center gap-2">
src={`/api/avatar/${e.userId}`} <ImageWithFallback
className="h-10 w-10 shadow rounded-full border-[3px] border-sky-100" key={i}
> src={`/api/avatar/${e.userId}`}
<div className="text-white bg-sky-500 h-10 w-10 shadow rounded-full border-[3px] border-sky-100 flex items-center justify-center"> className="h-10 w-10 shadow rounded-full border-[3px] border-sky-100"
<FontAwesomeIcon icon={faUser} className="w-5 h-5" /> >
<div className="text-white bg-sky-500 h-10 w-10 shadow rounded-full border-[3px] border-sky-100 flex items-center justify-center">
<FontAwesomeIcon icon={faUser} className="w-5 h-5" />
</div>
</ImageWithFallback>
<div>
<p className="text-sm font-bold text-sky-500">
{e.user.name}
</p>
<p className="text-sky-900">{e.user.email}</p>
</div>
</div>
<div className="flex sm:block items-center gap-5">
<div>
<p className="font-bold text-sm text-gray-500">
Permissions
</p>
<p className="text-xs text-gray-400 mb-2">
(Click to toggle.)
</p>
</div>
<div>
<label className="cursor-pointer mr-1">
<input
type="checkbox"
id="canCreate"
className="peer sr-only"
checked={e.canCreate}
onChange={() => {
const updatedMembers = collection.members.map(
(member) => {
if (member.user.email === e.user.email) {
return {
...member,
canCreate: !e.canCreate,
};
}
return member;
}
);
setCollection({
...collection,
members: updatedMembers,
});
}}
/>
<span className="text-sky-900 peer-checked:bg-sky-500 text-sm hover:bg-sky-200 duration-75 peer-checked:text-white rounded p-1 select-none">
Create
</span>
</label>
<label className="cursor-pointer mr-1">
<input
type="checkbox"
id="canUpdate"
className="peer sr-only"
checked={e.canUpdate}
onChange={() => {
const updatedMembers = collection.members.map(
(member) => {
if (member.user.email === e.user.email) {
return {
...member,
canUpdate: !e.canUpdate,
};
}
return member;
}
);
setCollection({
...collection,
members: updatedMembers,
});
}}
/>
<span className="text-sky-900 peer-checked:bg-sky-500 text-sm hover:bg-sky-200 duration-75 peer-checked:text-white rounded p-1 select-none">
Update
</span>
</label>
<label className="cursor-pointer mr-1">
<input
type="checkbox"
id="canDelete"
className="peer sr-only"
checked={e.canDelete}
onChange={() => {
const updatedMembers = collection.members.map(
(member) => {
if (member.user.email === e.user.email) {
return {
...member,
canDelete: !e.canDelete,
};
}
return member;
}
);
setCollection({
...collection,
members: updatedMembers,
});
}}
/>
<span className="text-sky-900 peer-checked:bg-sky-500 text-sm hover:bg-sky-200 duration-75 peer-checked:text-white rounded p-1 select-none">
Delete
</span>
</label>
</div> </div>
</ImageWithFallback>
<div>
<p className="text-sm font-bold text-sky-500">
{e.user.name}
</p>
<p className="text-sky-900">{e.user.email}</p>
</div> </div>
</div> </div>
<div className="flex sm:block items-center gap-5"> );
<div> })}
<p className="font-bold text-sm text-gray-500">
Permissions
</p>
<p className="text-xs text-gray-400 mb-2">
(Click to toggle.)
</p>
</div>
<div>
<label className="cursor-pointer mr-1">
<input
type="checkbox"
id="canCreate"
className="peer sr-only"
checked={e.canCreate}
onChange={() => {
const updatedMembers = collection.members.map(
(member) => {
if (member.user.email === e.user.email) {
return { ...member, canCreate: !e.canCreate };
}
return member;
}
);
setCollection({
...collection,
members: updatedMembers,
});
}}
/>
<span className="text-sky-900 peer-checked:bg-sky-500 text-sm hover:bg-sky-200 duration-75 peer-checked:text-white rounded p-1 select-none">
Create
</span>
</label>
<label className="cursor-pointer mr-1">
<input
type="checkbox"
id="canUpdate"
className="peer sr-only"
checked={e.canUpdate}
onChange={() => {
const updatedMembers = collection.members.map(
(member) => {
if (member.user.email === e.user.email) {
return { ...member, canUpdate: !e.canUpdate };
}
return member;
}
);
setCollection({
...collection,
members: updatedMembers,
});
}}
/>
<span className="text-sky-900 peer-checked:bg-sky-500 text-sm hover:bg-sky-200 duration-75 peer-checked:text-white rounded p-1 select-none">
Update
</span>
</label>
<label className="cursor-pointer mr-1">
<input
type="checkbox"
id="canDelete"
className="peer sr-only"
checked={e.canDelete}
onChange={() => {
const updatedMembers = collection.members.map(
(member) => {
if (member.user.email === e.user.email) {
return { ...member, canDelete: !e.canDelete };
}
return member;
}
);
setCollection({
...collection,
members: updatedMembers,
});
}}
/>
<span className="text-sky-900 peer-checked:bg-sky-500 text-sm hover:bg-sky-200 duration-75 peer-checked:text-white rounded p-1 select-none">
Delete
</span>
</label>
</div>
</div>
</div>
);
})}
</div> </div>
</> </>
) : null} ) : null}

View File

@ -15,7 +15,7 @@ export default function ProfilePhoto({ src, className }: Props) {
className={`h-10 w-10 shadow rounded-full border-[3px] border-sky-100 ${className}`} className={`h-10 w-10 shadow rounded-full border-[3px] border-sky-100 ${className}`}
> >
<div <div
className={`text-white bg-sky-500 h-10 w-10 shadow rounded-full border-[3px] border-sky-100 flex items-center justify-center ${className}`} className={`bg-sky-500 text-white h-10 w-10 shadow rounded-full border-[3px] border-sky-100 flex items-center justify-center ${className}`}
> >
<FontAwesomeIcon icon={faUser} className="w-5 h-5" /> <FontAwesomeIcon icon={faUser} className="w-5 h-5" />
</div> </div>

View File

@ -149,7 +149,7 @@ export default function () {
<ProfilePhoto <ProfilePhoto
key={i} key={i}
src={`/api/avatar/${e.userId}`} src={`/api/avatar/${e.userId}`}
className="-mr-3 bg-white duration-100" className="-mr-3 duration-100"
/> />
); );
}) })

View File

@ -1,9 +1,13 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
content: [ content: [
"./app/**/*.{js,ts,jsx,tsx}", "./app/**/*.{js,ts,jsx,tsx}",
"./pages/**/*.{js,ts,jsx,tsx}", "./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}",
// For the "layouts" directory
"./layouts/**/*.{js,ts,jsx,tsx}",
], ],
theme: { theme: {
extend: {}, extend: {},