workspace users
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
hamid zarghami
2026-07-26 10:05:58 +03:30
parent 1990e73368
commit cabf248c0e
4 changed files with 62 additions and 30 deletions
@@ -3,10 +3,14 @@ import { FC, useRef, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import Select from "../../../../components/Select"; import Select from "../../../../components/Select";
import SwitchComponent from "../../../../components/Switch"; import SwitchComponent from "../../../../components/Switch";
import { useGetUsers } from "../../../users/hooks/useUserData"; import {
import { UserItemType } from "../../../users/types/UserTypes"; useGetWorkspaces,
import { useGetWorkspaces } from "../../workspace/hooks/useWorkspaceData"; useGetWorkspaceUsers,
import { WorkspaceItemType } from "../../workspace/types/WorkspaceTypes"; } from "../../workspace/hooks/useWorkspaceData";
import {
WorkspaceItemType,
WorkspaceUserType,
} from "../../workspace/types/WorkspaceTypes";
import WorkspaceColorPicker from "../../workspace/components/WorkspaceColorPicker"; import WorkspaceColorPicker from "../../workspace/components/WorkspaceColorPicker";
import UserAvatar from "../../components/UserAvatar"; import UserAvatar from "../../components/UserAvatar";
@@ -67,8 +71,8 @@ const CreateProjectSidebar: FC<Props> = ({
className, className,
}) => { }) => {
const { t } = useTranslation("global"); const { t } = useTranslation("global");
const getUsers = useGetUsers("");
const getWorkspaces = useGetWorkspaces(); const getWorkspaces = useGetWorkspaces();
const getWorkspaceUsers = useGetWorkspaceUsers(workspaceId);
const [userSelectValue, setUserSelectValue] = useState(""); const [userSelectValue, setUserSelectValue] = useState("");
const fileInputRef = useRef<HTMLInputElement>(null); const fileInputRef = useRef<HTMLInputElement>(null);
@@ -82,19 +86,24 @@ const CreateProjectSidebar: FC<Props> = ({
value: workspace.id, value: workspace.id,
})); }));
const userItems = const workspaceUsers: WorkspaceUserType[] = Array.isArray(
getUsers.data?.data?.users getWorkspaceUsers.data?.data,
?.filter((user: UserItemType) => !selectedUsers.some((selected) => selected.id === user.id)) )
.map((user: UserItemType) => ({ ? getWorkspaceUsers.data.data
label: `${user.firstName} ${user.lastName}`, : (getWorkspaceUsers.data?.data?.users ?? []);
value: user.id,
})) ?? []; const userItems = workspaceUsers
.filter((user) => !selectedUsers.some((selected) => selected.id === user.id))
.map((user) => ({
label: `${user.firstName} ${user.lastName}`,
value: user.id,
}));
const handleUserSelect = (e: React.ChangeEvent<HTMLSelectElement>) => { const handleUserSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {
const value = e.target.value; const value = e.target.value;
if (!value) return; if (!value) return;
const user = getUsers.data?.data?.users?.find((item: UserItemType) => item.id === value); const user = workspaceUsers.find((item) => item.id === value);
if (user) { if (user) {
onSelectedUsersChange([ onSelectedUsersChange([
@@ -140,14 +149,26 @@ const CreateProjectSidebar: FC<Props> = ({
placeholder={t("taskmanager.select_workspace")} placeholder={t("taskmanager.select_workspace")}
items={workspaceItems} items={workspaceItems}
value={workspaceId} value={workspaceId}
onChange={(e) => onWorkspaceIdChange(e.target.value)} onChange={(e) => {
onWorkspaceIdChange(e.target.value);
onSelectedUsersChange([]);
setUserSelectValue("");
}}
className="border" className="border"
error_text={workspaceError ?? ""} error_text={workspaceError ?? ""}
/> />
</div> </div>
<div className="mt-8"> <div className="mt-8">
<Select label={t("taskmanager.users")} placeholder={t("taskmanager.select_user")} items={userItems} value={userSelectValue} onChange={handleUserSelect} className="border" /> <Select
label={t("taskmanager.users")}
placeholder={t("taskmanager.select_user")}
items={userItems}
value={userSelectValue}
onChange={handleUserSelect}
className="border"
disabled={!workspaceId}
/>
<div className="mt-3 border border-dashed border-border rounded-xl p-4 flex gap-2 flex-wrap min-h-[52px]"> <div className="mt-3 border border-dashed border-border rounded-xl p-4 flex gap-2 flex-wrap min-h-[52px]">
{selectedUsers.length === 0 ? ( {selectedUsers.length === 0 ? (
@@ -3,7 +3,7 @@ import { CloseCircle } from "iconsax-react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import SwitchComponent from "../../../../components/Switch"; import SwitchComponent from "../../../../components/Switch";
import Select from "../../../../components/Select"; import Select from "../../../../components/Select";
import { useGetUsers } from "../../../users/hooks/useUserData"; import { useGetAdminsListAll } from "../../../users/hooks/useUserData";
import { UserItemType } from "../../../users/types/UserTypes"; import { UserItemType } from "../../../users/types/UserTypes";
import WorkspaceColorPicker from "./WorkspaceColorPicker"; import WorkspaceColorPicker from "./WorkspaceColorPicker";
import UserAvatar from "../../components/UserAvatar"; import UserAvatar from "../../components/UserAvatar";
@@ -32,27 +32,25 @@ const CreateWorkspaceSidebar: FC<Props> = ({
onSelectedUsersChange, onSelectedUsersChange,
}) => { }) => {
const { t } = useTranslation("global"); const { t } = useTranslation("global");
const getUsers = useGetUsers(""); const getAdmins = useGetAdminsListAll();
const [userSelectValue, setUserSelectValue] = useState(""); const [userSelectValue, setUserSelectValue] = useState("");
const userItems = const admins: UserItemType[] = getAdmins.data?.data ?? [];
getUsers.data?.data?.users
?.filter( const userItems = admins
(user: UserItemType) => .filter(
!selectedUsers.some((selected) => selected.id === user.id), (user) => !selectedUsers.some((selected) => selected.id === user.id),
) )
.map((user: UserItemType) => ({ .map((user) => ({
label: `${user.firstName} ${user.lastName}`, label: `${user.firstName} ${user.lastName}`,
value: user.id, value: user.id,
})) ?? []; }));
const handleUserSelect = (e: React.ChangeEvent<HTMLSelectElement>) => { const handleUserSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {
const value = e.target.value; const value = e.target.value;
if (!value) return; if (!value) return;
const user = getUsers.data?.data?.users?.find( const user = admins.find((item) => item.id === value);
(item: UserItemType) => item.id === value,
);
if (user) { if (user) {
onSelectedUsersChange([ onSelectedUsersChange([
@@ -20,6 +20,14 @@ export const useGetWorkspaceDetail = (id: string) => {
}); });
}; };
export const useGetWorkspaceUsers = (id: string) => {
return useQuery({
queryKey: ["workspace-users", id],
queryFn: () => api.getWorkspaceUsers(id),
enabled: !!id,
});
};
export const useCreateWorkspace = () => { export const useCreateWorkspace = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
@@ -14,6 +14,11 @@ export const getWorkspaceDetail = async (id: string) => {
return data; return data;
}; };
export const getWorkspaceUsers = async (id: string) => {
const { data } = await axios.get(`/task-manager/workspaces/${id}/users`);
return data;
};
export const createWorkspace = async (params: CreateWorkspaceType) => { export const createWorkspace = async (params: CreateWorkspaceType) => {
const { data } = await axios.post(`/task-manager/workspaces`, params); const { data } = await axios.post(`/task-manager/workspaces`, params);
return data; return data;