ptechcore_ui 1.0.25 → 1.0.27
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.
- package/dist/index.cjs +500 -5
- package/dist/index.d.cts +422 -1
- package/dist/index.d.ts +422 -1
- package/dist/index.js +497 -5
- package/package.json +3 -1
package/dist/index.cjs
CHANGED
|
@@ -40,6 +40,7 @@ __export(index_exports, {
|
|
|
40
40
|
CHOICES: () => Choices_default,
|
|
41
41
|
CountrySelector: () => CountrySelector,
|
|
42
42
|
DateInput: () => DateInput,
|
|
43
|
+
EntityFileManager: () => EntityFileManager,
|
|
43
44
|
FDrawer: () => FDrawer,
|
|
44
45
|
FetchApi: () => FetchApi,
|
|
45
46
|
FileInput: () => FileInput,
|
|
@@ -69,11 +70,13 @@ __export(index_exports, {
|
|
|
69
70
|
ToastContainer: () => Toast_default,
|
|
70
71
|
ToastProvider: () => ToastProvider,
|
|
71
72
|
UserServices: () => UserServices,
|
|
73
|
+
fileManagerApi: () => fileManagerApi,
|
|
72
74
|
formatDate: () => formatDate,
|
|
73
75
|
formatFileSize: () => formatFileSize,
|
|
74
76
|
getFileIcon: () => getFileIcon,
|
|
75
77
|
useAlert: () => useAlert,
|
|
76
78
|
useFileManager: () => useFileManager,
|
|
79
|
+
useFileManagerApi: () => useFileManagerApi,
|
|
77
80
|
useSession: () => useSession,
|
|
78
81
|
useToast: () => useToast
|
|
79
82
|
});
|
|
@@ -765,7 +768,7 @@ var import_react2 = require("react");
|
|
|
765
768
|
|
|
766
769
|
// src/services/api.ts
|
|
767
770
|
var chooseEnv = localStorage.getItem("env") ?? "prod";
|
|
768
|
-
var ADDRESS_IP = chooseEnv === "prod" ? "backend-
|
|
771
|
+
var ADDRESS_IP = chooseEnv === "prod" ? "core.backend-rewise.praedium-tech.com" : "localhost:8000";
|
|
769
772
|
var ADDRESS_IP_URL = chooseEnv === "prod" ? `https://${ADDRESS_IP}/` : `http://${ADDRESS_IP}/`;
|
|
770
773
|
var API_URL = `${ADDRESS_IP_URL}api`;
|
|
771
774
|
var FetchApi = class {
|
|
@@ -995,6 +998,7 @@ var SessionProvider = ({ children }) => {
|
|
|
995
998
|
activeBusinessEntity,
|
|
996
999
|
setActiveBusinessEntity,
|
|
997
1000
|
token,
|
|
1001
|
+
setToken,
|
|
998
1002
|
login,
|
|
999
1003
|
logout,
|
|
1000
1004
|
showAuthModal,
|
|
@@ -1027,9 +1031,8 @@ var UserServices = {
|
|
|
1027
1031
|
deleteUser: (id, token) => FetchApi.delete(`${USERS_API_URL}${id}/`, token),
|
|
1028
1032
|
// Obtenir les utilisateurs d'une entité
|
|
1029
1033
|
getEntityUsers: (entityId, token) => FetchApi.get(`${API_URL}/core/entities/${entityId}/users/`, token),
|
|
1030
|
-
// Obtenir les
|
|
1031
|
-
getuserEntitiesAccess: (id, token) => FetchApi.get(`${API_URL}/core/entities/`, token),
|
|
1032
|
-
// !!! ce n'est pas la bonne url
|
|
1034
|
+
// Obtenir les entités auxquelles un utilisateur a accès
|
|
1035
|
+
getuserEntitiesAccess: (id, token) => FetchApi.get(`${API_URL}/core/users/${id}/entities/`, token),
|
|
1033
1036
|
// Ajouter un utilisateur à une entité
|
|
1034
1037
|
addUserToEntity: (entityId, userId, token) => FetchApi.post(`${API_URL}/core/entities/${entityId}/users/`, { user_id: userId }, token),
|
|
1035
1038
|
// === Nouvelles méthodes pour le profil utilisateur ===
|
|
@@ -1896,7 +1899,7 @@ var RewiseLayout = ({ children, module_name = "Rewise", module_description = "De
|
|
|
1896
1899
|
"organizations": "organizations",
|
|
1897
1900
|
"entities": "entities"
|
|
1898
1901
|
};
|
|
1899
|
-
setSelectedModule(routeMapping[moduleId] ||
|
|
1902
|
+
setSelectedModule(routeMapping[moduleId] || moduleId);
|
|
1900
1903
|
}
|
|
1901
1904
|
}, [location]);
|
|
1902
1905
|
const handleThemeChange = (type) => {
|
|
@@ -7762,6 +7765,495 @@ var FileManagerContent = ({ className }) => {
|
|
|
7762
7765
|
var FileManager = (props) => {
|
|
7763
7766
|
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(FileManagerProvider, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(FileManagerContent, { className: props.className }) });
|
|
7764
7767
|
};
|
|
7768
|
+
|
|
7769
|
+
// src/components/common/FileManager/components/EntityFileManager.tsx
|
|
7770
|
+
var import_react22 = __toESM(require("react"), 1);
|
|
7771
|
+
var import_lucide_react17 = require("lucide-react");
|
|
7772
|
+
|
|
7773
|
+
// src/components/common/FileManager/hooks/useFileManagerApi.ts
|
|
7774
|
+
var import_react21 = require("react");
|
|
7775
|
+
|
|
7776
|
+
// src/components/common/FileManager/services/fileManagerApi.ts
|
|
7777
|
+
var API_BASE = "/api/files_manager";
|
|
7778
|
+
var ENTITY_MODEL_MAP = {
|
|
7779
|
+
CLIENT: "accounting.Client",
|
|
7780
|
+
VENDOR: "accounting.Vendor",
|
|
7781
|
+
RFQ: "procurement.RFQ",
|
|
7782
|
+
DEPT: "core.Departments",
|
|
7783
|
+
PROJECT: "core.Project"
|
|
7784
|
+
};
|
|
7785
|
+
async function apiRequest(endpoint, options = {}) {
|
|
7786
|
+
const url = `${API_BASE}${endpoint}`;
|
|
7787
|
+
const headers = {
|
|
7788
|
+
...options.headers
|
|
7789
|
+
};
|
|
7790
|
+
if (!(options.body instanceof FormData)) {
|
|
7791
|
+
headers["Content-Type"] = "application/json";
|
|
7792
|
+
}
|
|
7793
|
+
const csrfToken = getCsrfToken();
|
|
7794
|
+
if (csrfToken) {
|
|
7795
|
+
headers["X-CSRFToken"] = csrfToken;
|
|
7796
|
+
}
|
|
7797
|
+
const response = await fetch(url, {
|
|
7798
|
+
...options,
|
|
7799
|
+
headers,
|
|
7800
|
+
credentials: "include"
|
|
7801
|
+
// Inclure les cookies pour l'auth
|
|
7802
|
+
});
|
|
7803
|
+
if (!response.ok) {
|
|
7804
|
+
let errorMessage = `Erreur HTTP ${response.status}`;
|
|
7805
|
+
try {
|
|
7806
|
+
const errorData = await response.json();
|
|
7807
|
+
errorMessage = errorData.detail || errorData.message || errorMessage;
|
|
7808
|
+
} catch {
|
|
7809
|
+
}
|
|
7810
|
+
throw new Error(errorMessage);
|
|
7811
|
+
}
|
|
7812
|
+
if (response.status === 204) {
|
|
7813
|
+
return {};
|
|
7814
|
+
}
|
|
7815
|
+
return response.json();
|
|
7816
|
+
}
|
|
7817
|
+
function getCsrfToken() {
|
|
7818
|
+
const name = "csrftoken";
|
|
7819
|
+
const cookies = document.cookie.split(";");
|
|
7820
|
+
for (const cookie of cookies) {
|
|
7821
|
+
const trimmed = cookie.trim();
|
|
7822
|
+
if (trimmed.startsWith(`${name}=`)) {
|
|
7823
|
+
return trimmed.substring(name.length + 1);
|
|
7824
|
+
}
|
|
7825
|
+
}
|
|
7826
|
+
return null;
|
|
7827
|
+
}
|
|
7828
|
+
function buildQueryString(params) {
|
|
7829
|
+
const searchParams = new URLSearchParams();
|
|
7830
|
+
for (const [key, value] of Object.entries(params)) {
|
|
7831
|
+
if (value !== void 0 && value !== null) {
|
|
7832
|
+
searchParams.append(key, String(value));
|
|
7833
|
+
}
|
|
7834
|
+
}
|
|
7835
|
+
const queryString = searchParams.toString();
|
|
7836
|
+
return queryString ? `?${queryString}` : "";
|
|
7837
|
+
}
|
|
7838
|
+
async function getEntityFolders(entityType, entityId, folderType) {
|
|
7839
|
+
const model = ENTITY_MODEL_MAP[entityType];
|
|
7840
|
+
if (!model) {
|
|
7841
|
+
throw new Error(`Type d'entit\xE9 non support\xE9: ${entityType}`);
|
|
7842
|
+
}
|
|
7843
|
+
const params = buildQueryString({
|
|
7844
|
+
model,
|
|
7845
|
+
id: entityId,
|
|
7846
|
+
type: folderType
|
|
7847
|
+
});
|
|
7848
|
+
return apiRequest(`/folders/for_entity/${params}`);
|
|
7849
|
+
}
|
|
7850
|
+
async function getFolderTree(folderCode) {
|
|
7851
|
+
return apiRequest(`/folders/${folderCode}/tree/`);
|
|
7852
|
+
}
|
|
7853
|
+
async function getFolder(folderCode) {
|
|
7854
|
+
return apiRequest(`/folders/${folderCode}/`);
|
|
7855
|
+
}
|
|
7856
|
+
async function createFolder(name, parentCode, businessEntityId) {
|
|
7857
|
+
return apiRequest("/folders/", {
|
|
7858
|
+
method: "POST",
|
|
7859
|
+
body: JSON.stringify({
|
|
7860
|
+
name,
|
|
7861
|
+
parent: parentCode,
|
|
7862
|
+
business_entity: businessEntityId,
|
|
7863
|
+
folder_type: "MISC",
|
|
7864
|
+
// Type par défaut pour les dossiers créés manuellement
|
|
7865
|
+
is_system_folder: false
|
|
7866
|
+
})
|
|
7867
|
+
});
|
|
7868
|
+
}
|
|
7869
|
+
async function renameFolder(folderCode, newName) {
|
|
7870
|
+
return apiRequest(`/folders/${folderCode}/`, {
|
|
7871
|
+
method: "PATCH",
|
|
7872
|
+
body: JSON.stringify({ name: newName })
|
|
7873
|
+
});
|
|
7874
|
+
}
|
|
7875
|
+
async function deleteFolder(folderCode) {
|
|
7876
|
+
await apiRequest(`/folders/${folderCode}/`, {
|
|
7877
|
+
method: "DELETE"
|
|
7878
|
+
});
|
|
7879
|
+
}
|
|
7880
|
+
async function getFolderFiles(folderId) {
|
|
7881
|
+
const params = buildQueryString({ folder: folderId });
|
|
7882
|
+
return apiRequest(`/files/${params}`);
|
|
7883
|
+
}
|
|
7884
|
+
async function uploadFile(file, folderCode, options = {}) {
|
|
7885
|
+
const formData = new FormData();
|
|
7886
|
+
formData.append("file", file);
|
|
7887
|
+
formData.append("folder_id", folderCode);
|
|
7888
|
+
if (options.name) {
|
|
7889
|
+
formData.append("name", options.name);
|
|
7890
|
+
}
|
|
7891
|
+
if (options.description) {
|
|
7892
|
+
formData.append("description", options.description);
|
|
7893
|
+
}
|
|
7894
|
+
if (options.tags && options.tags.length > 0) {
|
|
7895
|
+
formData.append("tags", JSON.stringify(options.tags));
|
|
7896
|
+
}
|
|
7897
|
+
return apiRequest("/files/", {
|
|
7898
|
+
method: "POST",
|
|
7899
|
+
body: formData
|
|
7900
|
+
});
|
|
7901
|
+
}
|
|
7902
|
+
async function uploadFiles(files, folderCode) {
|
|
7903
|
+
const results = [];
|
|
7904
|
+
for (const file of files) {
|
|
7905
|
+
const uploaded = await uploadFile(file, folderCode);
|
|
7906
|
+
results.push(uploaded);
|
|
7907
|
+
}
|
|
7908
|
+
return results;
|
|
7909
|
+
}
|
|
7910
|
+
async function renameFile(fileCode, newName) {
|
|
7911
|
+
return apiRequest(`/files/${fileCode}/`, {
|
|
7912
|
+
method: "PATCH",
|
|
7913
|
+
body: JSON.stringify({ name: newName })
|
|
7914
|
+
});
|
|
7915
|
+
}
|
|
7916
|
+
async function deleteFile(fileCode) {
|
|
7917
|
+
await apiRequest(`/files/${fileCode}/`, {
|
|
7918
|
+
method: "DELETE"
|
|
7919
|
+
});
|
|
7920
|
+
}
|
|
7921
|
+
function getDownloadUrl(fileCode) {
|
|
7922
|
+
return `${API_BASE}/files/${fileCode}/download/`;
|
|
7923
|
+
}
|
|
7924
|
+
function getFileUrl(fileUrl) {
|
|
7925
|
+
if (fileUrl.startsWith("http://") || fileUrl.startsWith("https://")) {
|
|
7926
|
+
return fileUrl;
|
|
7927
|
+
}
|
|
7928
|
+
return fileUrl.startsWith("/") ? fileUrl : `/${fileUrl}`;
|
|
7929
|
+
}
|
|
7930
|
+
var fileManagerApi = {
|
|
7931
|
+
// Dossiers
|
|
7932
|
+
getEntityFolders,
|
|
7933
|
+
getFolderTree,
|
|
7934
|
+
getFolder,
|
|
7935
|
+
createFolder,
|
|
7936
|
+
renameFolder,
|
|
7937
|
+
deleteFolder,
|
|
7938
|
+
// Fichiers
|
|
7939
|
+
getFolderFiles,
|
|
7940
|
+
uploadFile,
|
|
7941
|
+
uploadFiles,
|
|
7942
|
+
renameFile,
|
|
7943
|
+
deleteFile,
|
|
7944
|
+
// URLs
|
|
7945
|
+
getDownloadUrl,
|
|
7946
|
+
getFileUrl,
|
|
7947
|
+
// Helpers exposés
|
|
7948
|
+
ENTITY_MODEL_MAP
|
|
7949
|
+
};
|
|
7950
|
+
|
|
7951
|
+
// src/components/common/FileManager/hooks/useFileManagerApi.ts
|
|
7952
|
+
function transformFile(backendFile, parentPath, parentId) {
|
|
7953
|
+
return {
|
|
7954
|
+
id: backendFile.code,
|
|
7955
|
+
name: backendFile.name,
|
|
7956
|
+
type: "file",
|
|
7957
|
+
mimeType: backendFile.mime_type,
|
|
7958
|
+
size: backendFile.size,
|
|
7959
|
+
path: `${parentPath}/${backendFile.name}`,
|
|
7960
|
+
parentId,
|
|
7961
|
+
url: fileManagerApi.getFileUrl(backendFile.file_url),
|
|
7962
|
+
createdAt: backendFile.created_at,
|
|
7963
|
+
updatedAt: backendFile.updated_at,
|
|
7964
|
+
metadata: {
|
|
7965
|
+
extension: backendFile.extension,
|
|
7966
|
+
folderId: backendFile.folder
|
|
7967
|
+
}
|
|
7968
|
+
};
|
|
7969
|
+
}
|
|
7970
|
+
function transformFolder(backendFolder, parentPath = "", parentId = null) {
|
|
7971
|
+
const currentPath = parentPath ? `${parentPath}/${backendFolder.name}` : `/${backendFolder.name}`;
|
|
7972
|
+
const childFolders = (backendFolder.children || []).map(
|
|
7973
|
+
(child) => transformFolder(child, currentPath, backendFolder.code)
|
|
7974
|
+
);
|
|
7975
|
+
const childFiles = (backendFolder.files || []).map(
|
|
7976
|
+
(file) => transformFile(file, currentPath, backendFolder.code)
|
|
7977
|
+
);
|
|
7978
|
+
return {
|
|
7979
|
+
id: backendFolder.code,
|
|
7980
|
+
name: backendFolder.name,
|
|
7981
|
+
type: "folder",
|
|
7982
|
+
path: currentPath,
|
|
7983
|
+
parentId,
|
|
7984
|
+
children: [...childFolders, ...childFiles],
|
|
7985
|
+
metadata: {
|
|
7986
|
+
folderType: backendFolder.folder_type,
|
|
7987
|
+
folderTypeDisplay: backendFolder.folder_type_display,
|
|
7988
|
+
categoryType: backendFolder.category_type,
|
|
7989
|
+
isSystemFolder: backendFolder.is_system_folder,
|
|
7990
|
+
fileCount: backendFolder.file_count,
|
|
7991
|
+
totalSize: backendFolder.total_size
|
|
7992
|
+
}
|
|
7993
|
+
};
|
|
7994
|
+
}
|
|
7995
|
+
function extractRootChildren(entityFolder) {
|
|
7996
|
+
return entityFolder.children || [];
|
|
7997
|
+
}
|
|
7998
|
+
function useFileManagerApi(entityType, entityId, businessEntityId) {
|
|
7999
|
+
const [data, setData] = (0, import_react21.useState)([]);
|
|
8000
|
+
const [loading, setLoading] = (0, import_react21.useState)(true);
|
|
8001
|
+
const [error, setError] = (0, import_react21.useState)(null);
|
|
8002
|
+
const [rootFolderCode, setRootFolderCode] = (0, import_react21.useState)(null);
|
|
8003
|
+
const loadEntityFolders = (0, import_react21.useCallback)(async () => {
|
|
8004
|
+
setLoading(true);
|
|
8005
|
+
setError(null);
|
|
8006
|
+
try {
|
|
8007
|
+
const folders = await fileManagerApi.getEntityFolders(entityType, entityId);
|
|
8008
|
+
if (!folders || folders.length === 0) {
|
|
8009
|
+
setData([]);
|
|
8010
|
+
setRootFolderCode(null);
|
|
8011
|
+
setLoading(false);
|
|
8012
|
+
return;
|
|
8013
|
+
}
|
|
8014
|
+
const entityFolder = folders.find((f) => f.folder_type === "ENTITY");
|
|
8015
|
+
if (!entityFolder) {
|
|
8016
|
+
console.warn("Dossier ENTITY non trouv\xE9, utilisation du premier dossier");
|
|
8017
|
+
const firstFolder = folders[0];
|
|
8018
|
+
setRootFolderCode(firstFolder.code);
|
|
8019
|
+
const tree = await fileManagerApi.getFolderTree(firstFolder.code);
|
|
8020
|
+
const transformed = transformFolder(tree);
|
|
8021
|
+
setData(extractRootChildren(transformed));
|
|
8022
|
+
} else {
|
|
8023
|
+
setRootFolderCode(entityFolder.code);
|
|
8024
|
+
const tree = await fileManagerApi.getFolderTree(entityFolder.code);
|
|
8025
|
+
const transformed = transformFolder(tree);
|
|
8026
|
+
setData(extractRootChildren(transformed));
|
|
8027
|
+
}
|
|
8028
|
+
} catch (err) {
|
|
8029
|
+
console.error("Erreur lors du chargement des dossiers:", err);
|
|
8030
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8031
|
+
setData([]);
|
|
8032
|
+
} finally {
|
|
8033
|
+
setLoading(false);
|
|
8034
|
+
}
|
|
8035
|
+
}, [entityType, entityId]);
|
|
8036
|
+
const refresh = (0, import_react21.useCallback)(async () => {
|
|
8037
|
+
await loadEntityFolders();
|
|
8038
|
+
}, [loadEntityFolders]);
|
|
8039
|
+
(0, import_react21.useEffect)(() => {
|
|
8040
|
+
loadEntityFolders();
|
|
8041
|
+
}, [loadEntityFolders]);
|
|
8042
|
+
const handleCreateFolder = (0, import_react21.useCallback)(
|
|
8043
|
+
async (name, parentId) => {
|
|
8044
|
+
try {
|
|
8045
|
+
const created = await fileManagerApi.createFolder(
|
|
8046
|
+
name,
|
|
8047
|
+
parentId,
|
|
8048
|
+
businessEntityId
|
|
8049
|
+
);
|
|
8050
|
+
await refresh();
|
|
8051
|
+
return transformFolder(created, "", parentId);
|
|
8052
|
+
} catch (err) {
|
|
8053
|
+
console.error("Erreur lors de la cr\xE9ation du dossier:", err);
|
|
8054
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8055
|
+
throw err;
|
|
8056
|
+
}
|
|
8057
|
+
},
|
|
8058
|
+
[businessEntityId, refresh]
|
|
8059
|
+
);
|
|
8060
|
+
const handleUploadFiles = (0, import_react21.useCallback)(
|
|
8061
|
+
async (files, parentId) => {
|
|
8062
|
+
try {
|
|
8063
|
+
const uploaded = await fileManagerApi.uploadFiles(files, parentId);
|
|
8064
|
+
await refresh();
|
|
8065
|
+
return uploaded.map((file) => transformFile(file, "", parentId));
|
|
8066
|
+
} catch (err) {
|
|
8067
|
+
console.error("Erreur lors de l'upload:", err);
|
|
8068
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8069
|
+
throw err;
|
|
8070
|
+
}
|
|
8071
|
+
},
|
|
8072
|
+
[refresh]
|
|
8073
|
+
);
|
|
8074
|
+
const handleRename = (0, import_react21.useCallback)(
|
|
8075
|
+
async (item, newName) => {
|
|
8076
|
+
try {
|
|
8077
|
+
if (item.type === "folder") {
|
|
8078
|
+
await fileManagerApi.renameFolder(item.id, newName);
|
|
8079
|
+
} else {
|
|
8080
|
+
await fileManagerApi.renameFile(item.id, newName);
|
|
8081
|
+
}
|
|
8082
|
+
await refresh();
|
|
8083
|
+
} catch (err) {
|
|
8084
|
+
console.error("Erreur lors du renommage:", err);
|
|
8085
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8086
|
+
throw err;
|
|
8087
|
+
}
|
|
8088
|
+
},
|
|
8089
|
+
[refresh]
|
|
8090
|
+
);
|
|
8091
|
+
const handleDelete = (0, import_react21.useCallback)(
|
|
8092
|
+
async (item) => {
|
|
8093
|
+
try {
|
|
8094
|
+
if (item.metadata?.isSystemFolder) {
|
|
8095
|
+
throw new Error("Les dossiers syst\xE8me ne peuvent pas \xEAtre supprim\xE9s");
|
|
8096
|
+
}
|
|
8097
|
+
if (item.type === "folder") {
|
|
8098
|
+
await fileManagerApi.deleteFolder(item.id);
|
|
8099
|
+
} else {
|
|
8100
|
+
await fileManagerApi.deleteFile(item.id);
|
|
8101
|
+
}
|
|
8102
|
+
await refresh();
|
|
8103
|
+
} catch (err) {
|
|
8104
|
+
console.error("Erreur lors de la suppression:", err);
|
|
8105
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8106
|
+
throw err;
|
|
8107
|
+
}
|
|
8108
|
+
},
|
|
8109
|
+
[refresh]
|
|
8110
|
+
);
|
|
8111
|
+
const handleDownload = (0, import_react21.useCallback)((item) => {
|
|
8112
|
+
if (item.type === "file") {
|
|
8113
|
+
const url = item.url || fileManagerApi.getDownloadUrl(item.id);
|
|
8114
|
+
window.open(url, "_blank");
|
|
8115
|
+
}
|
|
8116
|
+
}, []);
|
|
8117
|
+
return {
|
|
8118
|
+
data,
|
|
8119
|
+
loading,
|
|
8120
|
+
error,
|
|
8121
|
+
rootFolderCode,
|
|
8122
|
+
refresh,
|
|
8123
|
+
handlers: {
|
|
8124
|
+
onCreateFolder: handleCreateFolder,
|
|
8125
|
+
onUploadFiles: handleUploadFiles,
|
|
8126
|
+
onRename: handleRename,
|
|
8127
|
+
onDelete: handleDelete,
|
|
8128
|
+
onDownload: handleDownload
|
|
8129
|
+
}
|
|
8130
|
+
};
|
|
8131
|
+
}
|
|
8132
|
+
|
|
8133
|
+
// src/components/common/FileManager/components/EntityFileManager.tsx
|
|
8134
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
8135
|
+
function getRootName(entityType) {
|
|
8136
|
+
const names = {
|
|
8137
|
+
CLIENT: "Documents Client",
|
|
8138
|
+
VENDOR: "Documents Fournisseur",
|
|
8139
|
+
RFQ: "Documents RFQ",
|
|
8140
|
+
DEPT: "Documents D\xE9partement",
|
|
8141
|
+
PROJECT: "Documents Projet"
|
|
8142
|
+
};
|
|
8143
|
+
return names[entityType] || "Documents";
|
|
8144
|
+
}
|
|
8145
|
+
var LoadingState = ({ height = "400px" }) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
8146
|
+
"div",
|
|
8147
|
+
{
|
|
8148
|
+
className: "flex flex-col items-center justify-center bg-gray-50 dark:bg-gray-900 rounded-xl border border-gray-200 dark:border-gray-800",
|
|
8149
|
+
style: { height },
|
|
8150
|
+
children: [
|
|
8151
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react17.Loader2, { className: "w-10 h-10 text-blue-500 animate-spin mb-4" }),
|
|
8152
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-gray-600 dark:text-gray-400 text-sm", children: "Chargement des documents..." })
|
|
8153
|
+
]
|
|
8154
|
+
}
|
|
8155
|
+
);
|
|
8156
|
+
var ErrorState = ({ error, onRetry, height = "400px" }) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
8157
|
+
"div",
|
|
8158
|
+
{
|
|
8159
|
+
className: "flex flex-col items-center justify-center bg-red-50 dark:bg-red-900/20 rounded-xl border border-red-200 dark:border-red-800",
|
|
8160
|
+
style: { height },
|
|
8161
|
+
children: [
|
|
8162
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react17.AlertCircle, { className: "w-10 h-10 text-red-500 mb-4" }),
|
|
8163
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-red-600 dark:text-red-400 text-sm font-medium mb-2", children: "Erreur lors du chargement" }),
|
|
8164
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-red-500 dark:text-red-400 text-xs mb-4 max-w-md text-center px-4", children: error.message }),
|
|
8165
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
8166
|
+
"button",
|
|
8167
|
+
{
|
|
8168
|
+
onClick: onRetry,
|
|
8169
|
+
className: "flex items-center gap-2 px-4 py-2 bg-red-100 dark:bg-red-900/40 text-red-700 dark:text-red-300 rounded-lg hover:bg-red-200 dark:hover:bg-red-900/60 transition-colors text-sm",
|
|
8170
|
+
children: [
|
|
8171
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react17.RefreshCw, { className: "w-4 h-4" }),
|
|
8172
|
+
"R\xE9essayer"
|
|
8173
|
+
]
|
|
8174
|
+
}
|
|
8175
|
+
)
|
|
8176
|
+
]
|
|
8177
|
+
}
|
|
8178
|
+
);
|
|
8179
|
+
var EmptyState = ({ height = "400px" }) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
8180
|
+
"div",
|
|
8181
|
+
{
|
|
8182
|
+
className: "flex flex-col items-center justify-center bg-gray-50 dark:bg-gray-900 rounded-xl border border-gray-200 dark:border-gray-800",
|
|
8183
|
+
style: { height },
|
|
8184
|
+
children: [
|
|
8185
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react17.FolderX, { className: "w-10 h-10 text-gray-400 mb-4" }),
|
|
8186
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-gray-600 dark:text-gray-400 text-sm font-medium mb-1", children: "Aucun document trouv\xE9" }),
|
|
8187
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-gray-500 dark:text-gray-500 text-xs", children: "La structure de dossiers n'a pas encore \xE9t\xE9 cr\xE9\xE9e pour cette entit\xE9." })
|
|
8188
|
+
]
|
|
8189
|
+
}
|
|
8190
|
+
);
|
|
8191
|
+
var EntityFileManager = ({
|
|
8192
|
+
entityType,
|
|
8193
|
+
entityId,
|
|
8194
|
+
businessEntityId,
|
|
8195
|
+
className,
|
|
8196
|
+
height = "600px",
|
|
8197
|
+
// Permissions (défaut: tout autorisé)
|
|
8198
|
+
allowUpload = true,
|
|
8199
|
+
allowCreateFolder = true,
|
|
8200
|
+
allowRename = true,
|
|
8201
|
+
allowDelete = true,
|
|
8202
|
+
allowDownload = true,
|
|
8203
|
+
// Callbacks
|
|
8204
|
+
onFileSelect,
|
|
8205
|
+
onFileOpen,
|
|
8206
|
+
onUploadSuccess,
|
|
8207
|
+
onError
|
|
8208
|
+
}) => {
|
|
8209
|
+
const { data, loading, error, refresh, handlers } = useFileManagerApi(
|
|
8210
|
+
entityType,
|
|
8211
|
+
entityId,
|
|
8212
|
+
businessEntityId
|
|
8213
|
+
);
|
|
8214
|
+
import_react22.default.useEffect(() => {
|
|
8215
|
+
if (error && onError) {
|
|
8216
|
+
onError(error);
|
|
8217
|
+
}
|
|
8218
|
+
}, [error, onError]);
|
|
8219
|
+
if (loading) {
|
|
8220
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(LoadingState, { height });
|
|
8221
|
+
}
|
|
8222
|
+
if (error) {
|
|
8223
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(ErrorState, { error, onRetry: refresh, height });
|
|
8224
|
+
}
|
|
8225
|
+
if (!data || data.length === 0) {
|
|
8226
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(EmptyState, { height });
|
|
8227
|
+
}
|
|
8228
|
+
const handleUploadFiles = async (files, parentId) => {
|
|
8229
|
+
const result = await handlers.onUploadFiles(files, parentId);
|
|
8230
|
+
if (result && onUploadSuccess) {
|
|
8231
|
+
onUploadSuccess(result);
|
|
8232
|
+
}
|
|
8233
|
+
return result;
|
|
8234
|
+
};
|
|
8235
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn("relative", className), style: { height }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
8236
|
+
FileManager,
|
|
8237
|
+
{
|
|
8238
|
+
data,
|
|
8239
|
+
rootName: getRootName(entityType),
|
|
8240
|
+
onCreateFolder: handlers.onCreateFolder,
|
|
8241
|
+
onUploadFiles: handleUploadFiles,
|
|
8242
|
+
onRename: handlers.onRename,
|
|
8243
|
+
onDelete: handlers.onDelete,
|
|
8244
|
+
onDownload: handlers.onDownload,
|
|
8245
|
+
onSelect: onFileSelect,
|
|
8246
|
+
onOpen: onFileOpen,
|
|
8247
|
+
allowUpload,
|
|
8248
|
+
allowCreateFolder,
|
|
8249
|
+
allowRename,
|
|
8250
|
+
allowDelete,
|
|
8251
|
+
allowDownload,
|
|
8252
|
+
allowMultiSelect: true,
|
|
8253
|
+
className: "h-full"
|
|
8254
|
+
}
|
|
8255
|
+
) });
|
|
8256
|
+
};
|
|
7765
8257
|
// Annotate the CommonJS export names for ESM import in node:
|
|
7766
8258
|
0 && (module.exports = {
|
|
7767
8259
|
Alert,
|
|
@@ -7775,6 +8267,7 @@ var FileManager = (props) => {
|
|
|
7775
8267
|
CHOICES,
|
|
7776
8268
|
CountrySelector,
|
|
7777
8269
|
DateInput,
|
|
8270
|
+
EntityFileManager,
|
|
7778
8271
|
FDrawer,
|
|
7779
8272
|
FetchApi,
|
|
7780
8273
|
FileInput,
|
|
@@ -7804,11 +8297,13 @@ var FileManager = (props) => {
|
|
|
7804
8297
|
ToastContainer,
|
|
7805
8298
|
ToastProvider,
|
|
7806
8299
|
UserServices,
|
|
8300
|
+
fileManagerApi,
|
|
7807
8301
|
formatDate,
|
|
7808
8302
|
formatFileSize,
|
|
7809
8303
|
getFileIcon,
|
|
7810
8304
|
useAlert,
|
|
7811
8305
|
useFileManager,
|
|
8306
|
+
useFileManagerApi,
|
|
7812
8307
|
useSession,
|
|
7813
8308
|
useToast
|
|
7814
8309
|
});
|