Revert 253c922: restore the PM/RBAC work to the integration
Reverting the production revert so the pm branch can merge cleanly on top of the restored RBAC base. Conflicts against newer integration work resolved by combining: - App.tsx: v7's bot-draft wizard bypass + login returnUrl kept alongside the supervisor gating (no-project block screen, panel scoping) - LoginPage: returnUrl navigation kept, supervisor routing added - migration.sql: bot_drafts table kept, unified-projects ALTERs restored
This commit is contained in:
+44
-9
@@ -91,7 +91,7 @@ function handle401(path: string, res: Response): void {
|
||||
// ادمین/مدیر تدارکات بدون پارامتر (همهی پروژهها) باقی میماند.
|
||||
function activeProjectId(): string | null {
|
||||
const { user } = useAuthStore.getState();
|
||||
return user?.role === "pm" ? user.project_id : null;
|
||||
return user?.role === "supervisor" || user?.role === "pm" ? user.project_id : null;
|
||||
}
|
||||
|
||||
function projectQuery(projectId?: string | null): string {
|
||||
@@ -339,6 +339,12 @@ interface RawSupplier {
|
||||
interface RawProject {
|
||||
id: string;
|
||||
name: string;
|
||||
location?: string | null;
|
||||
project_manager?: string | null;
|
||||
description?: string | null;
|
||||
start_date?: string | null;
|
||||
status?: string | null;
|
||||
progress?: number | null;
|
||||
}
|
||||
interface RawSpec {
|
||||
attribute_key: string;
|
||||
@@ -1231,11 +1237,36 @@ export const api = {
|
||||
projects: {
|
||||
list: async (): Promise<Project[]> => {
|
||||
const raw = await getData<RawProject[]>(`/projects?page_size=${PAGE_SIZE}`);
|
||||
return raw.map((p) => ({ id: p.id, name: p.name }));
|
||||
return raw.map((p) => ({
|
||||
id: p.id,
|
||||
name: p.name,
|
||||
location: p.location || "",
|
||||
project_manager: p.project_manager || "",
|
||||
description: p.description || "",
|
||||
start_date: p.start_date,
|
||||
status: p.status || "ACTIVE",
|
||||
progress: p.progress != null ? Number(p.progress) : 0,
|
||||
}));
|
||||
},
|
||||
create: async (p: Project): Promise<Project> => {
|
||||
const raw = await postData<RawProject>("/projects", { name: p.name });
|
||||
return { id: raw.id, name: raw.name };
|
||||
const raw = await postData<RawProject>("/projects", {
|
||||
name: p.name,
|
||||
location: p.location || "",
|
||||
project_manager: p.project_manager || "",
|
||||
description: p.description || "",
|
||||
});
|
||||
return {
|
||||
id: raw.id,
|
||||
name: raw.name,
|
||||
location: raw.location || "",
|
||||
project_manager: raw.project_manager || "",
|
||||
description: raw.description || "",
|
||||
status: raw.status || "ACTIVE",
|
||||
progress: raw.progress != null ? Number(raw.progress) : 0,
|
||||
};
|
||||
},
|
||||
delete: async (id: string): Promise<void> => {
|
||||
await deleteData(`/projects/${id}`);
|
||||
},
|
||||
},
|
||||
|
||||
@@ -1625,10 +1656,11 @@ interface RawUnitL { id: number; code: string; name_fa: string | null; }
|
||||
export interface UserRow {
|
||||
id: string;
|
||||
casdoor_id: string;
|
||||
username?: string | null;
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
phone: string | null;
|
||||
role: "pm" | "procurement_manager" | "admin" | null;
|
||||
role: "pm" | "procurement_manager" | "admin" | "supervisor" | null;
|
||||
role_label: string | null;
|
||||
project_id: string | null;
|
||||
project_name: string | null;
|
||||
@@ -1653,10 +1685,11 @@ export const apiV26 = {
|
||||
user: {
|
||||
id: string;
|
||||
casdoor_id: string;
|
||||
username?: string;
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
phone: string | null;
|
||||
role: "pm" | "procurement_manager" | "admin" | null;
|
||||
role: "pm" | "procurement_manager" | "admin" | "supervisor" | null;
|
||||
role_label: string | null;
|
||||
project_id: string | null;
|
||||
project_name: string | null;
|
||||
@@ -1670,6 +1703,7 @@ export const apiV26 = {
|
||||
expires_in: res.data.expires_in,
|
||||
user: {
|
||||
...u,
|
||||
username: u.username || u.casdoor_id,
|
||||
display_name: `${u.first_name} ${u.last_name}`.trim() || u.casdoor_id,
|
||||
},
|
||||
};
|
||||
@@ -1689,14 +1723,15 @@ export const apiV26 = {
|
||||
users: {
|
||||
me: async (): Promise<import("../store/auth").AuthUser> => {
|
||||
const data = await getData<{
|
||||
id: string; casdoor_id: string; first_name: string; last_name: string; phone: string | null;
|
||||
role: "pm" | "procurement_manager" | "admin" | null; role_label: string | null;
|
||||
id: string; casdoor_id: string; username?: string; first_name: string; last_name: string; phone: string | null;
|
||||
role: "pm" | "procurement_manager" | "admin" | "supervisor" | null; role_label: string | null;
|
||||
project_id: string | null; project_name: string | null;
|
||||
projects?: { id: string; name: string }[];
|
||||
}>("/users/me");
|
||||
return {
|
||||
id: data.id,
|
||||
casdoor_id: data.casdoor_id,
|
||||
username: data.username || data.casdoor_id,
|
||||
first_name: data.first_name,
|
||||
last_name: data.last_name,
|
||||
phone: data.phone,
|
||||
@@ -1720,7 +1755,7 @@ export const apiV26 = {
|
||||
first_name: string; last_name?: string; phone?: string | null;
|
||||
casdoor_id?: string | null; role?: "pm" | "procurement_manager" | "admin" | null;
|
||||
}): Promise<UserRow> => postData<UserRow>("/users", body),
|
||||
updateRole: async (id: string, role: "pm" | "procurement_manager" | "admin" | null): Promise<UserRow> =>
|
||||
updateRole: async (id: string, role: "pm" | "procurement_manager" | "admin" | "supervisor" | null): Promise<UserRow> =>
|
||||
patchData<UserRow>(`/users/${id}`, { role }),
|
||||
assignProject: async (id: string, projectId: string | null): Promise<UserRow> =>
|
||||
postData<UserRow>(`/users/${id}/project`, { project_id: projectId }),
|
||||
|
||||
Reference in New Issue
Block a user