ptechcore_ui 1.0.24 → 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.js
CHANGED
|
@@ -712,7 +712,7 @@ import { createContext as createContext2, useContext as useContext2, useEffect a
|
|
|
712
712
|
|
|
713
713
|
// src/services/api.ts
|
|
714
714
|
var chooseEnv = localStorage.getItem("env") ?? "prod";
|
|
715
|
-
var ADDRESS_IP = chooseEnv === "prod" ? "
|
|
715
|
+
var ADDRESS_IP = chooseEnv === "prod" ? "core.backend-rewise.praedium-tech.com" : "localhost:8000";
|
|
716
716
|
var ADDRESS_IP_URL = chooseEnv === "prod" ? `https://${ADDRESS_IP}/` : `http://${ADDRESS_IP}/`;
|
|
717
717
|
var API_URL = `${ADDRESS_IP_URL}api`;
|
|
718
718
|
var FetchApi = class {
|
|
@@ -942,6 +942,7 @@ var SessionProvider = ({ children }) => {
|
|
|
942
942
|
activeBusinessEntity,
|
|
943
943
|
setActiveBusinessEntity,
|
|
944
944
|
token,
|
|
945
|
+
setToken,
|
|
945
946
|
login,
|
|
946
947
|
logout,
|
|
947
948
|
showAuthModal,
|
|
@@ -974,9 +975,8 @@ var UserServices = {
|
|
|
974
975
|
deleteUser: (id, token) => FetchApi.delete(`${USERS_API_URL}${id}/`, token),
|
|
975
976
|
// Obtenir les utilisateurs d'une entité
|
|
976
977
|
getEntityUsers: (entityId, token) => FetchApi.get(`${API_URL}/core/entities/${entityId}/users/`, token),
|
|
977
|
-
// Obtenir les
|
|
978
|
-
getuserEntitiesAccess: (id, token) => FetchApi.get(`${API_URL}/core/entities/`, token),
|
|
979
|
-
// !!! ce n'est pas la bonne url
|
|
978
|
+
// Obtenir les entités auxquelles un utilisateur a accès
|
|
979
|
+
getuserEntitiesAccess: (id, token) => FetchApi.get(`${API_URL}/core/users/${id}/entities/`, token),
|
|
980
980
|
// Ajouter un utilisateur à une entité
|
|
981
981
|
addUserToEntity: (entityId, userId, token) => FetchApi.post(`${API_URL}/core/entities/${entityId}/users/`, { user_id: userId }, token),
|
|
982
982
|
// === Nouvelles méthodes pour le profil utilisateur ===
|
|
@@ -1843,7 +1843,7 @@ var RewiseLayout = ({ children, module_name = "Rewise", module_description = "De
|
|
|
1843
1843
|
"organizations": "organizations",
|
|
1844
1844
|
"entities": "entities"
|
|
1845
1845
|
};
|
|
1846
|
-
setSelectedModule(routeMapping[moduleId] ||
|
|
1846
|
+
setSelectedModule(routeMapping[moduleId] || moduleId);
|
|
1847
1847
|
}
|
|
1848
1848
|
}, [location]);
|
|
1849
1849
|
const handleThemeChange = (type) => {
|
|
@@ -7721,6 +7721,495 @@ var FileManagerContent = ({ className }) => {
|
|
|
7721
7721
|
var FileManager = (props) => {
|
|
7722
7722
|
return /* @__PURE__ */ jsx28(FileManagerProvider, { ...props, children: /* @__PURE__ */ jsx28(FileManagerContent, { className: props.className }) });
|
|
7723
7723
|
};
|
|
7724
|
+
|
|
7725
|
+
// src/components/common/FileManager/components/EntityFileManager.tsx
|
|
7726
|
+
import React19 from "react";
|
|
7727
|
+
import { Loader2 as Loader22, FolderX, AlertCircle as AlertCircle4, RefreshCw as RefreshCw3 } from "lucide-react";
|
|
7728
|
+
|
|
7729
|
+
// src/components/common/FileManager/hooks/useFileManagerApi.ts
|
|
7730
|
+
import { useState as useState19, useEffect as useEffect13, useCallback as useCallback4 } from "react";
|
|
7731
|
+
|
|
7732
|
+
// src/components/common/FileManager/services/fileManagerApi.ts
|
|
7733
|
+
var API_BASE = "/api/files_manager";
|
|
7734
|
+
var ENTITY_MODEL_MAP = {
|
|
7735
|
+
CLIENT: "accounting.Client",
|
|
7736
|
+
VENDOR: "accounting.Vendor",
|
|
7737
|
+
RFQ: "procurement.RFQ",
|
|
7738
|
+
DEPT: "core.Departments",
|
|
7739
|
+
PROJECT: "core.Project"
|
|
7740
|
+
};
|
|
7741
|
+
async function apiRequest(endpoint, options = {}) {
|
|
7742
|
+
const url = `${API_BASE}${endpoint}`;
|
|
7743
|
+
const headers = {
|
|
7744
|
+
...options.headers
|
|
7745
|
+
};
|
|
7746
|
+
if (!(options.body instanceof FormData)) {
|
|
7747
|
+
headers["Content-Type"] = "application/json";
|
|
7748
|
+
}
|
|
7749
|
+
const csrfToken = getCsrfToken();
|
|
7750
|
+
if (csrfToken) {
|
|
7751
|
+
headers["X-CSRFToken"] = csrfToken;
|
|
7752
|
+
}
|
|
7753
|
+
const response = await fetch(url, {
|
|
7754
|
+
...options,
|
|
7755
|
+
headers,
|
|
7756
|
+
credentials: "include"
|
|
7757
|
+
// Inclure les cookies pour l'auth
|
|
7758
|
+
});
|
|
7759
|
+
if (!response.ok) {
|
|
7760
|
+
let errorMessage = `Erreur HTTP ${response.status}`;
|
|
7761
|
+
try {
|
|
7762
|
+
const errorData = await response.json();
|
|
7763
|
+
errorMessage = errorData.detail || errorData.message || errorMessage;
|
|
7764
|
+
} catch {
|
|
7765
|
+
}
|
|
7766
|
+
throw new Error(errorMessage);
|
|
7767
|
+
}
|
|
7768
|
+
if (response.status === 204) {
|
|
7769
|
+
return {};
|
|
7770
|
+
}
|
|
7771
|
+
return response.json();
|
|
7772
|
+
}
|
|
7773
|
+
function getCsrfToken() {
|
|
7774
|
+
const name = "csrftoken";
|
|
7775
|
+
const cookies = document.cookie.split(";");
|
|
7776
|
+
for (const cookie of cookies) {
|
|
7777
|
+
const trimmed = cookie.trim();
|
|
7778
|
+
if (trimmed.startsWith(`${name}=`)) {
|
|
7779
|
+
return trimmed.substring(name.length + 1);
|
|
7780
|
+
}
|
|
7781
|
+
}
|
|
7782
|
+
return null;
|
|
7783
|
+
}
|
|
7784
|
+
function buildQueryString(params) {
|
|
7785
|
+
const searchParams = new URLSearchParams();
|
|
7786
|
+
for (const [key, value] of Object.entries(params)) {
|
|
7787
|
+
if (value !== void 0 && value !== null) {
|
|
7788
|
+
searchParams.append(key, String(value));
|
|
7789
|
+
}
|
|
7790
|
+
}
|
|
7791
|
+
const queryString = searchParams.toString();
|
|
7792
|
+
return queryString ? `?${queryString}` : "";
|
|
7793
|
+
}
|
|
7794
|
+
async function getEntityFolders(entityType, entityId, folderType) {
|
|
7795
|
+
const model = ENTITY_MODEL_MAP[entityType];
|
|
7796
|
+
if (!model) {
|
|
7797
|
+
throw new Error(`Type d'entit\xE9 non support\xE9: ${entityType}`);
|
|
7798
|
+
}
|
|
7799
|
+
const params = buildQueryString({
|
|
7800
|
+
model,
|
|
7801
|
+
id: entityId,
|
|
7802
|
+
type: folderType
|
|
7803
|
+
});
|
|
7804
|
+
return apiRequest(`/folders/for_entity/${params}`);
|
|
7805
|
+
}
|
|
7806
|
+
async function getFolderTree(folderCode) {
|
|
7807
|
+
return apiRequest(`/folders/${folderCode}/tree/`);
|
|
7808
|
+
}
|
|
7809
|
+
async function getFolder(folderCode) {
|
|
7810
|
+
return apiRequest(`/folders/${folderCode}/`);
|
|
7811
|
+
}
|
|
7812
|
+
async function createFolder(name, parentCode, businessEntityId) {
|
|
7813
|
+
return apiRequest("/folders/", {
|
|
7814
|
+
method: "POST",
|
|
7815
|
+
body: JSON.stringify({
|
|
7816
|
+
name,
|
|
7817
|
+
parent: parentCode,
|
|
7818
|
+
business_entity: businessEntityId,
|
|
7819
|
+
folder_type: "MISC",
|
|
7820
|
+
// Type par défaut pour les dossiers créés manuellement
|
|
7821
|
+
is_system_folder: false
|
|
7822
|
+
})
|
|
7823
|
+
});
|
|
7824
|
+
}
|
|
7825
|
+
async function renameFolder(folderCode, newName) {
|
|
7826
|
+
return apiRequest(`/folders/${folderCode}/`, {
|
|
7827
|
+
method: "PATCH",
|
|
7828
|
+
body: JSON.stringify({ name: newName })
|
|
7829
|
+
});
|
|
7830
|
+
}
|
|
7831
|
+
async function deleteFolder(folderCode) {
|
|
7832
|
+
await apiRequest(`/folders/${folderCode}/`, {
|
|
7833
|
+
method: "DELETE"
|
|
7834
|
+
});
|
|
7835
|
+
}
|
|
7836
|
+
async function getFolderFiles(folderId) {
|
|
7837
|
+
const params = buildQueryString({ folder: folderId });
|
|
7838
|
+
return apiRequest(`/files/${params}`);
|
|
7839
|
+
}
|
|
7840
|
+
async function uploadFile(file, folderCode, options = {}) {
|
|
7841
|
+
const formData = new FormData();
|
|
7842
|
+
formData.append("file", file);
|
|
7843
|
+
formData.append("folder_id", folderCode);
|
|
7844
|
+
if (options.name) {
|
|
7845
|
+
formData.append("name", options.name);
|
|
7846
|
+
}
|
|
7847
|
+
if (options.description) {
|
|
7848
|
+
formData.append("description", options.description);
|
|
7849
|
+
}
|
|
7850
|
+
if (options.tags && options.tags.length > 0) {
|
|
7851
|
+
formData.append("tags", JSON.stringify(options.tags));
|
|
7852
|
+
}
|
|
7853
|
+
return apiRequest("/files/", {
|
|
7854
|
+
method: "POST",
|
|
7855
|
+
body: formData
|
|
7856
|
+
});
|
|
7857
|
+
}
|
|
7858
|
+
async function uploadFiles(files, folderCode) {
|
|
7859
|
+
const results = [];
|
|
7860
|
+
for (const file of files) {
|
|
7861
|
+
const uploaded = await uploadFile(file, folderCode);
|
|
7862
|
+
results.push(uploaded);
|
|
7863
|
+
}
|
|
7864
|
+
return results;
|
|
7865
|
+
}
|
|
7866
|
+
async function renameFile(fileCode, newName) {
|
|
7867
|
+
return apiRequest(`/files/${fileCode}/`, {
|
|
7868
|
+
method: "PATCH",
|
|
7869
|
+
body: JSON.stringify({ name: newName })
|
|
7870
|
+
});
|
|
7871
|
+
}
|
|
7872
|
+
async function deleteFile(fileCode) {
|
|
7873
|
+
await apiRequest(`/files/${fileCode}/`, {
|
|
7874
|
+
method: "DELETE"
|
|
7875
|
+
});
|
|
7876
|
+
}
|
|
7877
|
+
function getDownloadUrl(fileCode) {
|
|
7878
|
+
return `${API_BASE}/files/${fileCode}/download/`;
|
|
7879
|
+
}
|
|
7880
|
+
function getFileUrl(fileUrl) {
|
|
7881
|
+
if (fileUrl.startsWith("http://") || fileUrl.startsWith("https://")) {
|
|
7882
|
+
return fileUrl;
|
|
7883
|
+
}
|
|
7884
|
+
return fileUrl.startsWith("/") ? fileUrl : `/${fileUrl}`;
|
|
7885
|
+
}
|
|
7886
|
+
var fileManagerApi = {
|
|
7887
|
+
// Dossiers
|
|
7888
|
+
getEntityFolders,
|
|
7889
|
+
getFolderTree,
|
|
7890
|
+
getFolder,
|
|
7891
|
+
createFolder,
|
|
7892
|
+
renameFolder,
|
|
7893
|
+
deleteFolder,
|
|
7894
|
+
// Fichiers
|
|
7895
|
+
getFolderFiles,
|
|
7896
|
+
uploadFile,
|
|
7897
|
+
uploadFiles,
|
|
7898
|
+
renameFile,
|
|
7899
|
+
deleteFile,
|
|
7900
|
+
// URLs
|
|
7901
|
+
getDownloadUrl,
|
|
7902
|
+
getFileUrl,
|
|
7903
|
+
// Helpers exposés
|
|
7904
|
+
ENTITY_MODEL_MAP
|
|
7905
|
+
};
|
|
7906
|
+
|
|
7907
|
+
// src/components/common/FileManager/hooks/useFileManagerApi.ts
|
|
7908
|
+
function transformFile(backendFile, parentPath, parentId) {
|
|
7909
|
+
return {
|
|
7910
|
+
id: backendFile.code,
|
|
7911
|
+
name: backendFile.name,
|
|
7912
|
+
type: "file",
|
|
7913
|
+
mimeType: backendFile.mime_type,
|
|
7914
|
+
size: backendFile.size,
|
|
7915
|
+
path: `${parentPath}/${backendFile.name}`,
|
|
7916
|
+
parentId,
|
|
7917
|
+
url: fileManagerApi.getFileUrl(backendFile.file_url),
|
|
7918
|
+
createdAt: backendFile.created_at,
|
|
7919
|
+
updatedAt: backendFile.updated_at,
|
|
7920
|
+
metadata: {
|
|
7921
|
+
extension: backendFile.extension,
|
|
7922
|
+
folderId: backendFile.folder
|
|
7923
|
+
}
|
|
7924
|
+
};
|
|
7925
|
+
}
|
|
7926
|
+
function transformFolder(backendFolder, parentPath = "", parentId = null) {
|
|
7927
|
+
const currentPath = parentPath ? `${parentPath}/${backendFolder.name}` : `/${backendFolder.name}`;
|
|
7928
|
+
const childFolders = (backendFolder.children || []).map(
|
|
7929
|
+
(child) => transformFolder(child, currentPath, backendFolder.code)
|
|
7930
|
+
);
|
|
7931
|
+
const childFiles = (backendFolder.files || []).map(
|
|
7932
|
+
(file) => transformFile(file, currentPath, backendFolder.code)
|
|
7933
|
+
);
|
|
7934
|
+
return {
|
|
7935
|
+
id: backendFolder.code,
|
|
7936
|
+
name: backendFolder.name,
|
|
7937
|
+
type: "folder",
|
|
7938
|
+
path: currentPath,
|
|
7939
|
+
parentId,
|
|
7940
|
+
children: [...childFolders, ...childFiles],
|
|
7941
|
+
metadata: {
|
|
7942
|
+
folderType: backendFolder.folder_type,
|
|
7943
|
+
folderTypeDisplay: backendFolder.folder_type_display,
|
|
7944
|
+
categoryType: backendFolder.category_type,
|
|
7945
|
+
isSystemFolder: backendFolder.is_system_folder,
|
|
7946
|
+
fileCount: backendFolder.file_count,
|
|
7947
|
+
totalSize: backendFolder.total_size
|
|
7948
|
+
}
|
|
7949
|
+
};
|
|
7950
|
+
}
|
|
7951
|
+
function extractRootChildren(entityFolder) {
|
|
7952
|
+
return entityFolder.children || [];
|
|
7953
|
+
}
|
|
7954
|
+
function useFileManagerApi(entityType, entityId, businessEntityId) {
|
|
7955
|
+
const [data, setData] = useState19([]);
|
|
7956
|
+
const [loading, setLoading] = useState19(true);
|
|
7957
|
+
const [error, setError] = useState19(null);
|
|
7958
|
+
const [rootFolderCode, setRootFolderCode] = useState19(null);
|
|
7959
|
+
const loadEntityFolders = useCallback4(async () => {
|
|
7960
|
+
setLoading(true);
|
|
7961
|
+
setError(null);
|
|
7962
|
+
try {
|
|
7963
|
+
const folders = await fileManagerApi.getEntityFolders(entityType, entityId);
|
|
7964
|
+
if (!folders || folders.length === 0) {
|
|
7965
|
+
setData([]);
|
|
7966
|
+
setRootFolderCode(null);
|
|
7967
|
+
setLoading(false);
|
|
7968
|
+
return;
|
|
7969
|
+
}
|
|
7970
|
+
const entityFolder = folders.find((f) => f.folder_type === "ENTITY");
|
|
7971
|
+
if (!entityFolder) {
|
|
7972
|
+
console.warn("Dossier ENTITY non trouv\xE9, utilisation du premier dossier");
|
|
7973
|
+
const firstFolder = folders[0];
|
|
7974
|
+
setRootFolderCode(firstFolder.code);
|
|
7975
|
+
const tree = await fileManagerApi.getFolderTree(firstFolder.code);
|
|
7976
|
+
const transformed = transformFolder(tree);
|
|
7977
|
+
setData(extractRootChildren(transformed));
|
|
7978
|
+
} else {
|
|
7979
|
+
setRootFolderCode(entityFolder.code);
|
|
7980
|
+
const tree = await fileManagerApi.getFolderTree(entityFolder.code);
|
|
7981
|
+
const transformed = transformFolder(tree);
|
|
7982
|
+
setData(extractRootChildren(transformed));
|
|
7983
|
+
}
|
|
7984
|
+
} catch (err) {
|
|
7985
|
+
console.error("Erreur lors du chargement des dossiers:", err);
|
|
7986
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
7987
|
+
setData([]);
|
|
7988
|
+
} finally {
|
|
7989
|
+
setLoading(false);
|
|
7990
|
+
}
|
|
7991
|
+
}, [entityType, entityId]);
|
|
7992
|
+
const refresh = useCallback4(async () => {
|
|
7993
|
+
await loadEntityFolders();
|
|
7994
|
+
}, [loadEntityFolders]);
|
|
7995
|
+
useEffect13(() => {
|
|
7996
|
+
loadEntityFolders();
|
|
7997
|
+
}, [loadEntityFolders]);
|
|
7998
|
+
const handleCreateFolder = useCallback4(
|
|
7999
|
+
async (name, parentId) => {
|
|
8000
|
+
try {
|
|
8001
|
+
const created = await fileManagerApi.createFolder(
|
|
8002
|
+
name,
|
|
8003
|
+
parentId,
|
|
8004
|
+
businessEntityId
|
|
8005
|
+
);
|
|
8006
|
+
await refresh();
|
|
8007
|
+
return transformFolder(created, "", parentId);
|
|
8008
|
+
} catch (err) {
|
|
8009
|
+
console.error("Erreur lors de la cr\xE9ation du dossier:", err);
|
|
8010
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8011
|
+
throw err;
|
|
8012
|
+
}
|
|
8013
|
+
},
|
|
8014
|
+
[businessEntityId, refresh]
|
|
8015
|
+
);
|
|
8016
|
+
const handleUploadFiles = useCallback4(
|
|
8017
|
+
async (files, parentId) => {
|
|
8018
|
+
try {
|
|
8019
|
+
const uploaded = await fileManagerApi.uploadFiles(files, parentId);
|
|
8020
|
+
await refresh();
|
|
8021
|
+
return uploaded.map((file) => transformFile(file, "", parentId));
|
|
8022
|
+
} catch (err) {
|
|
8023
|
+
console.error("Erreur lors de l'upload:", err);
|
|
8024
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8025
|
+
throw err;
|
|
8026
|
+
}
|
|
8027
|
+
},
|
|
8028
|
+
[refresh]
|
|
8029
|
+
);
|
|
8030
|
+
const handleRename = useCallback4(
|
|
8031
|
+
async (item, newName) => {
|
|
8032
|
+
try {
|
|
8033
|
+
if (item.type === "folder") {
|
|
8034
|
+
await fileManagerApi.renameFolder(item.id, newName);
|
|
8035
|
+
} else {
|
|
8036
|
+
await fileManagerApi.renameFile(item.id, newName);
|
|
8037
|
+
}
|
|
8038
|
+
await refresh();
|
|
8039
|
+
} catch (err) {
|
|
8040
|
+
console.error("Erreur lors du renommage:", err);
|
|
8041
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8042
|
+
throw err;
|
|
8043
|
+
}
|
|
8044
|
+
},
|
|
8045
|
+
[refresh]
|
|
8046
|
+
);
|
|
8047
|
+
const handleDelete = useCallback4(
|
|
8048
|
+
async (item) => {
|
|
8049
|
+
try {
|
|
8050
|
+
if (item.metadata?.isSystemFolder) {
|
|
8051
|
+
throw new Error("Les dossiers syst\xE8me ne peuvent pas \xEAtre supprim\xE9s");
|
|
8052
|
+
}
|
|
8053
|
+
if (item.type === "folder") {
|
|
8054
|
+
await fileManagerApi.deleteFolder(item.id);
|
|
8055
|
+
} else {
|
|
8056
|
+
await fileManagerApi.deleteFile(item.id);
|
|
8057
|
+
}
|
|
8058
|
+
await refresh();
|
|
8059
|
+
} catch (err) {
|
|
8060
|
+
console.error("Erreur lors de la suppression:", err);
|
|
8061
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
8062
|
+
throw err;
|
|
8063
|
+
}
|
|
8064
|
+
},
|
|
8065
|
+
[refresh]
|
|
8066
|
+
);
|
|
8067
|
+
const handleDownload = useCallback4((item) => {
|
|
8068
|
+
if (item.type === "file") {
|
|
8069
|
+
const url = item.url || fileManagerApi.getDownloadUrl(item.id);
|
|
8070
|
+
window.open(url, "_blank");
|
|
8071
|
+
}
|
|
8072
|
+
}, []);
|
|
8073
|
+
return {
|
|
8074
|
+
data,
|
|
8075
|
+
loading,
|
|
8076
|
+
error,
|
|
8077
|
+
rootFolderCode,
|
|
8078
|
+
refresh,
|
|
8079
|
+
handlers: {
|
|
8080
|
+
onCreateFolder: handleCreateFolder,
|
|
8081
|
+
onUploadFiles: handleUploadFiles,
|
|
8082
|
+
onRename: handleRename,
|
|
8083
|
+
onDelete: handleDelete,
|
|
8084
|
+
onDownload: handleDownload
|
|
8085
|
+
}
|
|
8086
|
+
};
|
|
8087
|
+
}
|
|
8088
|
+
|
|
8089
|
+
// src/components/common/FileManager/components/EntityFileManager.tsx
|
|
8090
|
+
import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
8091
|
+
function getRootName(entityType) {
|
|
8092
|
+
const names = {
|
|
8093
|
+
CLIENT: "Documents Client",
|
|
8094
|
+
VENDOR: "Documents Fournisseur",
|
|
8095
|
+
RFQ: "Documents RFQ",
|
|
8096
|
+
DEPT: "Documents D\xE9partement",
|
|
8097
|
+
PROJECT: "Documents Projet"
|
|
8098
|
+
};
|
|
8099
|
+
return names[entityType] || "Documents";
|
|
8100
|
+
}
|
|
8101
|
+
var LoadingState = ({ height = "400px" }) => /* @__PURE__ */ jsxs24(
|
|
8102
|
+
"div",
|
|
8103
|
+
{
|
|
8104
|
+
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",
|
|
8105
|
+
style: { height },
|
|
8106
|
+
children: [
|
|
8107
|
+
/* @__PURE__ */ jsx29(Loader22, { className: "w-10 h-10 text-blue-500 animate-spin mb-4" }),
|
|
8108
|
+
/* @__PURE__ */ jsx29("p", { className: "text-gray-600 dark:text-gray-400 text-sm", children: "Chargement des documents..." })
|
|
8109
|
+
]
|
|
8110
|
+
}
|
|
8111
|
+
);
|
|
8112
|
+
var ErrorState = ({ error, onRetry, height = "400px" }) => /* @__PURE__ */ jsxs24(
|
|
8113
|
+
"div",
|
|
8114
|
+
{
|
|
8115
|
+
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",
|
|
8116
|
+
style: { height },
|
|
8117
|
+
children: [
|
|
8118
|
+
/* @__PURE__ */ jsx29(AlertCircle4, { className: "w-10 h-10 text-red-500 mb-4" }),
|
|
8119
|
+
/* @__PURE__ */ jsx29("p", { className: "text-red-600 dark:text-red-400 text-sm font-medium mb-2", children: "Erreur lors du chargement" }),
|
|
8120
|
+
/* @__PURE__ */ jsx29("p", { className: "text-red-500 dark:text-red-400 text-xs mb-4 max-w-md text-center px-4", children: error.message }),
|
|
8121
|
+
/* @__PURE__ */ jsxs24(
|
|
8122
|
+
"button",
|
|
8123
|
+
{
|
|
8124
|
+
onClick: onRetry,
|
|
8125
|
+
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",
|
|
8126
|
+
children: [
|
|
8127
|
+
/* @__PURE__ */ jsx29(RefreshCw3, { className: "w-4 h-4" }),
|
|
8128
|
+
"R\xE9essayer"
|
|
8129
|
+
]
|
|
8130
|
+
}
|
|
8131
|
+
)
|
|
8132
|
+
]
|
|
8133
|
+
}
|
|
8134
|
+
);
|
|
8135
|
+
var EmptyState = ({ height = "400px" }) => /* @__PURE__ */ jsxs24(
|
|
8136
|
+
"div",
|
|
8137
|
+
{
|
|
8138
|
+
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",
|
|
8139
|
+
style: { height },
|
|
8140
|
+
children: [
|
|
8141
|
+
/* @__PURE__ */ jsx29(FolderX, { className: "w-10 h-10 text-gray-400 mb-4" }),
|
|
8142
|
+
/* @__PURE__ */ jsx29("p", { className: "text-gray-600 dark:text-gray-400 text-sm font-medium mb-1", children: "Aucun document trouv\xE9" }),
|
|
8143
|
+
/* @__PURE__ */ jsx29("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." })
|
|
8144
|
+
]
|
|
8145
|
+
}
|
|
8146
|
+
);
|
|
8147
|
+
var EntityFileManager = ({
|
|
8148
|
+
entityType,
|
|
8149
|
+
entityId,
|
|
8150
|
+
businessEntityId,
|
|
8151
|
+
className,
|
|
8152
|
+
height = "600px",
|
|
8153
|
+
// Permissions (défaut: tout autorisé)
|
|
8154
|
+
allowUpload = true,
|
|
8155
|
+
allowCreateFolder = true,
|
|
8156
|
+
allowRename = true,
|
|
8157
|
+
allowDelete = true,
|
|
8158
|
+
allowDownload = true,
|
|
8159
|
+
// Callbacks
|
|
8160
|
+
onFileSelect,
|
|
8161
|
+
onFileOpen,
|
|
8162
|
+
onUploadSuccess,
|
|
8163
|
+
onError
|
|
8164
|
+
}) => {
|
|
8165
|
+
const { data, loading, error, refresh, handlers } = useFileManagerApi(
|
|
8166
|
+
entityType,
|
|
8167
|
+
entityId,
|
|
8168
|
+
businessEntityId
|
|
8169
|
+
);
|
|
8170
|
+
React19.useEffect(() => {
|
|
8171
|
+
if (error && onError) {
|
|
8172
|
+
onError(error);
|
|
8173
|
+
}
|
|
8174
|
+
}, [error, onError]);
|
|
8175
|
+
if (loading) {
|
|
8176
|
+
return /* @__PURE__ */ jsx29(LoadingState, { height });
|
|
8177
|
+
}
|
|
8178
|
+
if (error) {
|
|
8179
|
+
return /* @__PURE__ */ jsx29(ErrorState, { error, onRetry: refresh, height });
|
|
8180
|
+
}
|
|
8181
|
+
if (!data || data.length === 0) {
|
|
8182
|
+
return /* @__PURE__ */ jsx29(EmptyState, { height });
|
|
8183
|
+
}
|
|
8184
|
+
const handleUploadFiles = async (files, parentId) => {
|
|
8185
|
+
const result = await handlers.onUploadFiles(files, parentId);
|
|
8186
|
+
if (result && onUploadSuccess) {
|
|
8187
|
+
onUploadSuccess(result);
|
|
8188
|
+
}
|
|
8189
|
+
return result;
|
|
8190
|
+
};
|
|
8191
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("relative", className), style: { height }, children: /* @__PURE__ */ jsx29(
|
|
8192
|
+
FileManager,
|
|
8193
|
+
{
|
|
8194
|
+
data,
|
|
8195
|
+
rootName: getRootName(entityType),
|
|
8196
|
+
onCreateFolder: handlers.onCreateFolder,
|
|
8197
|
+
onUploadFiles: handleUploadFiles,
|
|
8198
|
+
onRename: handlers.onRename,
|
|
8199
|
+
onDelete: handlers.onDelete,
|
|
8200
|
+
onDownload: handlers.onDownload,
|
|
8201
|
+
onSelect: onFileSelect,
|
|
8202
|
+
onOpen: onFileOpen,
|
|
8203
|
+
allowUpload,
|
|
8204
|
+
allowCreateFolder,
|
|
8205
|
+
allowRename,
|
|
8206
|
+
allowDelete,
|
|
8207
|
+
allowDownload,
|
|
8208
|
+
allowMultiSelect: true,
|
|
8209
|
+
className: "h-full"
|
|
8210
|
+
}
|
|
8211
|
+
) });
|
|
8212
|
+
};
|
|
7724
8213
|
export {
|
|
7725
8214
|
Alert_default as Alert,
|
|
7726
8215
|
AlertProvider,
|
|
@@ -7733,6 +8222,7 @@ export {
|
|
|
7733
8222
|
Choices_default as CHOICES,
|
|
7734
8223
|
CountrySelector,
|
|
7735
8224
|
DateInput,
|
|
8225
|
+
EntityFileManager,
|
|
7736
8226
|
FDrawer,
|
|
7737
8227
|
FetchApi,
|
|
7738
8228
|
FileInput,
|
|
@@ -7762,11 +8252,13 @@ export {
|
|
|
7762
8252
|
Toast_default as ToastContainer,
|
|
7763
8253
|
ToastProvider,
|
|
7764
8254
|
UserServices,
|
|
8255
|
+
fileManagerApi,
|
|
7765
8256
|
formatDate,
|
|
7766
8257
|
formatFileSize,
|
|
7767
8258
|
getFileIcon,
|
|
7768
8259
|
useAlert,
|
|
7769
8260
|
useFileManager,
|
|
8261
|
+
useFileManagerApi,
|
|
7770
8262
|
useSession,
|
|
7771
8263
|
useToast
|
|
7772
8264
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ptechcore_ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"dev": "vite",
|
|
20
20
|
"build": "tsup src/index.ts --format cjs,esm --dts",
|
|
21
|
+
"build:app": "vite build",
|
|
22
|
+
"build:lib": "tsup src/index.ts --format cjs,esm --dts",
|
|
21
23
|
"lint": "eslint .",
|
|
22
24
|
"preview": "vite preview"
|
|
23
25
|
},
|