data-primals-engine 1.0.11 → 1.1.0
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/client/README.md +8 -0
- package/client/index.html +31 -0
- package/client/index.js +25 -0
- package/client/package-lock.json +11664 -0
- package/client/package.json +70 -0
- package/client/public/demo/26899917-d1ba-4df4-bb33-48d09a8778da.jpg +0 -0
- package/client/public/demo/4b9894c7-12cd-466d-8fd3-a2757b09ec96.jpg +0 -0
- package/client/public/demo/7ed369ac-a1a2-4b45-b0cd-4fd5bcf5a75a.jpg +0 -0
- package/client/public/doc/API.postman_collection.json +214 -0
- package/client/public/github.svg +1 -0
- package/client/public/profilCompany.jpg +0 -0
- package/client/public/profilDeveloper.jpg +0 -0
- package/client/public/profilEngineer.jpg +0 -0
- package/client/public/profilPersonal.jpg +0 -0
- package/client/public/profils .psd +0 -0
- package/client/public/react.svg +9 -0
- package/client/src/APIInfo.jsx +328 -0
- package/client/src/AddWidgetTypeModal.jsx +44 -0
- package/client/src/AddWidgetTypeModal.scss +87 -0
- package/client/src/App.css +42 -0
- package/client/src/App.jsx +586 -0
- package/client/src/App.scss +1466 -0
- package/client/src/AssistantChat.jsx +280 -0
- package/client/src/AssistantChat.scss +229 -0
- package/client/src/Button.jsx +12 -0
- package/client/src/Button.scss +197 -0
- package/client/src/CalculationBuilder.jsx +338 -0
- package/client/src/CalculationStepRow.jsx +199 -0
- package/client/src/CalendarConfigModal.jsx +49 -0
- package/client/src/ChartConfigModal.jsx +402 -0
- package/client/src/ConditionBuilder.jsx +622 -0
- package/client/src/ConditionBuilder.scss +672 -0
- package/client/src/ConditionBuilder2.jsx +757 -0
- package/client/src/ContentView.jsx +274 -0
- package/client/src/CronBuilder.jsx +126 -0
- package/client/src/CronBuilder.scss +128 -0
- package/client/src/CronPartBuilder.jsx +150 -0
- package/client/src/Dashboard.jsx +210 -0
- package/client/src/Dashboard.scss +445 -0
- package/client/src/DashboardChart.jsx +362 -0
- package/client/src/DashboardFlexViewItem.jsx +129 -0
- package/client/src/DashboardView.jsx +554 -0
- package/client/src/DataChart.jsx +349 -0
- package/client/src/DataEditor.jsx +556 -0
- package/client/src/DataLayout.jsx +709 -0
- package/client/src/DataTable.jsx +996 -0
- package/client/src/DataTable.scss +73 -0
- package/client/src/Dialog.jsx +90 -0
- package/client/src/Dialog.scss +117 -0
- package/client/src/DisplayFlexNodeRenderer.jsx +115 -0
- package/client/src/DocumentationPageLayout.jsx +93 -0
- package/client/src/DocumentationPageLayout.scss +262 -0
- package/client/src/Draggable.jsx +222 -0
- package/client/src/Draggable.scss +49 -0
- package/client/src/ExportDialog.jsx +172 -0
- package/client/src/Field.jsx +1558 -0
- package/client/src/FlexBuilder.jsx +269 -0
- package/client/src/FlexBuilder.scss +226 -0
- package/client/src/FlexBuilderControls.jsx +170 -0
- package/client/src/FlexBuilderModal.jsx +75 -0
- package/client/src/FlexBuilderModal.scss +109 -0
- package/client/src/FlexBuilderPreview.jsx +48 -0
- package/client/src/FlexBuilderUtils.js +84 -0
- package/client/src/FlexDataRenderer.jsx +170 -0
- package/client/src/FlexDataRenderer.scss +80 -0
- package/client/src/FlexNode.jsx +290 -0
- package/client/src/FlexTreeUtils.js +129 -0
- package/client/src/HiddenableCell.jsx +46 -0
- package/client/src/HiddenableCell.scss +36 -0
- package/client/src/KPIDialog.jsx +39 -0
- package/client/src/KPIWidget.jsx +139 -0
- package/client/src/KanbanCard.jsx +92 -0
- package/client/src/KanbanColumn.jsx +29 -0
- package/client/src/KanbanConfigModal.jsx +115 -0
- package/client/src/KanbanView.jsx +113 -0
- package/client/src/KanbanView.scss +107 -0
- package/client/src/MessageRotator.jsx +77 -0
- package/client/src/MessageRotator.scss +14 -0
- package/client/src/ModelCreator.jsx +640 -0
- package/client/src/ModelCreator.scss +154 -0
- package/client/src/ModelCreatorField.jsx +810 -0
- package/client/src/ModelImporter.jsx +120 -0
- package/client/src/ModelList.jsx +205 -0
- package/client/src/Notification.jsx +137 -0
- package/client/src/Notification.scss +126 -0
- package/client/src/NotificationProvider.jsx +73 -0
- package/client/src/PackGallery.jsx +211 -0
- package/client/src/PackGallery.scss +156 -0
- package/client/src/Pagination.jsx +141 -0
- package/client/src/RTE.jsx +415 -0
- package/client/src/RTETrans.jsx +103 -0
- package/client/src/RelationField.jsx +247 -0
- package/client/src/RelationValue.jsx +230 -0
- package/client/src/RestoreConfirmationModal.jsx +183 -0
- package/client/src/RestoreDialog.jsx +134 -0
- package/client/src/RestoreDialog.scss +67 -0
- package/client/src/RichTextEditorModal.jsx +34 -0
- package/client/src/RichTextEditorModal.scss +54 -0
- package/client/src/TourSpotlight.jsx +234 -0
- package/client/src/TourSpotlight.scss +100 -0
- package/client/src/TutorialsMenu.jsx +83 -0
- package/client/src/TutorialsMenu.scss +217 -0
- package/client/src/TutorialsRewardModal.jsx +65 -0
- package/client/src/Utils.jsx +78 -0
- package/client/src/ViewSwitcher.jsx +54 -0
- package/client/src/ViewSwitcher.scss +74 -0
- package/client/src/Webpage.jsx +69 -0
- package/client/src/_variables.scss +21 -0
- package/client/src/assets/react.svg +1 -0
- package/client/src/constants.js +68 -0
- package/client/src/contexts/AuthContext.jsx +28 -0
- package/client/src/contexts/ModelContext.jsx +328 -0
- package/client/src/contexts/UIContext.jsx +52 -0
- package/client/src/core/data.js +35 -0
- package/client/src/entry-client.jsx +15 -0
- package/client/src/entry-server.jsx +13 -0
- package/client/src/filter.js +222 -0
- package/client/src/hooks/data.js +101 -0
- package/client/src/hooks/useDebounce.js +20 -0
- package/client/src/hooks/useDragAndDrop.js +59 -0
- package/client/src/hooks/useLocalStorage.js +100 -0
- package/client/src/hooks/useMount.js +42 -0
- package/client/src/hooks/useTutorials.jsx +227 -0
- package/client/src/hooks/useWindowSize.js +24 -0
- package/client/src/i18n.js +47 -0
- package/client/src/index.css +90 -0
- package/client/src/index.js +10 -0
- package/client/src/main.jsx +11 -0
- package/client/src/translations.js +15940 -0
- package/client/src/tutorials.js +112 -0
- package/client/vite.config.js +30 -0
- package/eslint.config.js +50 -0
- package/package.json +48 -27
- package/server.js +9 -0
- package/src/constants.js +12 -23
- package/src/core.js +9 -8
- package/src/data.js +81 -80
- package/src/defaultModels.js +114 -115
- package/src/email.js +8 -9
- package/src/engine.js +5 -5
- package/src/events.js +1 -2
- package/src/i18n.js +212 -211
- package/src/middlewares/middleware-mongodb.js +94 -93
- package/src/migrate.js +24 -24
- package/src/modules/assistant.js +55 -55
- package/src/modules/bucket.js +10 -9
- package/src/modules/data.js +387 -357
- package/src/modules/file.js +3 -6
- package/src/modules/mongodb.js +6 -7
- package/src/modules/user.js +24 -47
- package/src/modules/workflow.js +68 -67
- package/src/openai.jobs.js +2 -2
- package/src/packs.js +30 -31
- package/src/providers.js +101 -3
- package/src/setenv.js +1 -1
- package/src/user.js +0 -17
- package/src/workers/crypto-worker.js +21 -20
- package/src/workers/import-export-worker.js +18 -18
- package/test/data.backup.integration.test.js +7 -12
- package/test/data.integration.test.js +27 -25
- package/test/globalSetup.js +2 -2
- package/test/import_export.integration.test.js +6 -6
- package/test/model.integration.test.js +21 -22
- package/test/workflow.integration.test.js +2 -5
- package/test/workflow.robustness.test.js +6 -13
- package/vitest.config.js +2 -2
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { useTranslation, Trans } from 'react-i18next';
|
|
3
|
+
import {Dialog} from './Dialog.jsx'; // Suppose l'existence d'un composant Dialog
|
|
4
|
+
import Button from './Button';
|
|
5
|
+
import { CheckboxField, SelectField, NumberField } from './Field'; // Suppose l'existence de ces composants
|
|
6
|
+
import { FaInfoCircle } from 'react-icons/fa';
|
|
7
|
+
import { Tooltip } from 'react-tooltip';
|
|
8
|
+
import {useAuthContext} from "./contexts/AuthContext.jsx"; // Utilisation de react-tooltip comme dans App.jsx
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* ExportDialog Component
|
|
12
|
+
*
|
|
13
|
+
* A dialog for configuring data export options.
|
|
14
|
+
*
|
|
15
|
+
* @param {object} props - Component props
|
|
16
|
+
* @param {boolean} props.isOpen - Whether the dialog is open.
|
|
17
|
+
* @param {function} props.onClose - Function to call when closing the dialog.
|
|
18
|
+
* @param {function} props.onExport - Function to call when initiating the export. Passes the configuration object.
|
|
19
|
+
* @param {string} props.currentModel - The name of the currently active model.
|
|
20
|
+
* @param {Array<object>} props.availableModels - Array of available models (e.g., [{ name: 'user', _id: '...' }, ...]).
|
|
21
|
+
* @param {boolean} props.hasSelection - Whether there is currently data selected in the table.
|
|
22
|
+
*/
|
|
23
|
+
function ExportDialog({ isOpen, onClose, onExport, currentModel, availableModels = [], hasSelection = false }) {
|
|
24
|
+
const { t } = useTranslation();
|
|
25
|
+
|
|
26
|
+
const [withModels, setWithModels] = useState(true);
|
|
27
|
+
// --- State Management ---
|
|
28
|
+
const [exportSelection, setExportSelection] = useState(hasSelection);
|
|
29
|
+
// Initialise avec le modèle courant s'il existe dans la liste des modèles disponibles
|
|
30
|
+
const [selectedModels, setSelectedModels] = useState(
|
|
31
|
+
availableModels.some(m => m.name === currentModel) ? [currentModel] : []
|
|
32
|
+
);
|
|
33
|
+
const [depthParam, setDepthParam] = useState(1); // Profondeur par défaut
|
|
34
|
+
|
|
35
|
+
// --- Effects ---
|
|
36
|
+
// Met à jour l'état de la case cher si la sélection change pendant que la modale est ouverte
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
setExportSelection(hasSelection);
|
|
39
|
+
}, [hasSelection]);
|
|
40
|
+
|
|
41
|
+
// Met à jour le modèle sélectionné par défaut si le modèle courant change
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (availableModels.some(m => m.name === currentModel)) {
|
|
44
|
+
// Si un seul modèle est sélectionnable à la fois (comme avec SelectField simple)
|
|
45
|
+
// setSelectedModels([currentModel]);
|
|
46
|
+
// Si plusieurs modèles sont sélectionnables (adapter selon le composant MultiSelect)
|
|
47
|
+
if (!selectedModels.includes(currentModel)) {
|
|
48
|
+
// Optionnel: Ajouter le modèle courant s'il n'est pas déjà sélectionné
|
|
49
|
+
// setSelectedModels(prev => [...prev, currentModel]);
|
|
50
|
+
// Ou le définir comme seule sélection par défaut si c'est l'intention
|
|
51
|
+
setSelectedModels([currentModel]);
|
|
52
|
+
}
|
|
53
|
+
} else if (selectedModels.length === 0 && availableModels.length > 0) {
|
|
54
|
+
// Si aucun modèle n'est sélectionné et qu'il y a des modèles disponibles,
|
|
55
|
+
// sélectionner le premier par défaut (ou laisser vide)
|
|
56
|
+
// setSelectedModels([availableModels[0].name]);
|
|
57
|
+
}
|
|
58
|
+
}, [currentModel, availableModels]);
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
// --- Event Handlers ---
|
|
62
|
+
const handleExportClick = () => {
|
|
63
|
+
if (!exportSelection && selectedModels.length === 0) {
|
|
64
|
+
// Afficher une notification ou un message d'erreur si aucun modèle n'est sélectionné
|
|
65
|
+
console.error("Veuillez sélectionner au moins un modèle à exporter.");
|
|
66
|
+
// Idéalement, utiliser un système de notification comme celui de l'application
|
|
67
|
+
// addNotification({ type: 'error', message: t('exportDialog.error.noModelSelected') });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
onExport({
|
|
71
|
+
exportSelection: hasSelection && exportSelection, // N'exporte la sélection que si elle existe ET est cochée
|
|
72
|
+
models: selectedModels,
|
|
73
|
+
depth: depthParam,
|
|
74
|
+
withModels
|
|
75
|
+
});
|
|
76
|
+
onClose(); // Ferme la modale après avoir lancé l'export
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const handleModelChange = (selectedOptions) => {
|
|
80
|
+
setSelectedModels(selectedOptions);
|
|
81
|
+
|
|
82
|
+
// Gérer la sélection multiple (si un composant MultiSelect est utilisé)
|
|
83
|
+
// setSelectedModels(selectedOptions.map(option => option.value));
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const { me } = useAuthContext()
|
|
87
|
+
// --- Render ---
|
|
88
|
+
const modelOptions = availableModels.filter(model => model._user === me?.username).map(model => ({
|
|
89
|
+
label: t(`model_${model.name}`, model.name), // Traduit le nom du modèle si possible
|
|
90
|
+
value: model.name,
|
|
91
|
+
}));
|
|
92
|
+
|
|
93
|
+
return isOpen && (
|
|
94
|
+
<Dialog onClose={onClose} title={t('exportDialog.title', "Options d'exportation")}>
|
|
95
|
+
<div className="dialog-content flex flex-row flex-start">
|
|
96
|
+
|
|
97
|
+
{/* 1. Export de la sélection */}
|
|
98
|
+
<CheckboxField
|
|
99
|
+
name="exportSelection"
|
|
100
|
+
label={t('exportDialog.exportSelection.label', "Exporter la sélection")}
|
|
101
|
+
checked={exportSelection}
|
|
102
|
+
onChange={(e) => setExportSelection(e.target.checked)}
|
|
103
|
+
disabled={!hasSelection}
|
|
104
|
+
hint={hasSelection
|
|
105
|
+
? t('exportDialog.exportSelection.hint', "Exportera uniquement les lignes actuellement sélectionnées dans le tableau.")
|
|
106
|
+
: t('exportDialog.exportSelection.hintDisabled', "Aucune ligne n'est sélectionnée dans le tableau.")
|
|
107
|
+
}
|
|
108
|
+
/>
|
|
109
|
+
|
|
110
|
+
{/* 2. Modèles à exporter */}
|
|
111
|
+
{/* Utiliser un SelectField simple pour un seul modèle */}
|
|
112
|
+
<SelectField
|
|
113
|
+
label={t('exportDialog.models.label', "Modèle à exporter")}
|
|
114
|
+
name="selectedModel"
|
|
115
|
+
value={selectedModels} // Prend le premier élément pour un Select simple
|
|
116
|
+
onChange={handleModelChange}
|
|
117
|
+
items={modelOptions}
|
|
118
|
+
placeholder={t('exportDialog.models.placeholder', "Sélectionnez un modèle...")}
|
|
119
|
+
multiple={true}
|
|
120
|
+
/>
|
|
121
|
+
|
|
122
|
+
<CheckboxField label={t('exportDialog.withModels.label', "Inclure les modèles ?")} checked={withModels} onChange={(e) => setWithModels(e.target.checked)} />
|
|
123
|
+
|
|
124
|
+
{/* OU: Utiliser un composant MultiSelectField (à créer/importer) pour plusieurs modèles */}
|
|
125
|
+
{/*
|
|
126
|
+
<MultiSelectField
|
|
127
|
+
label={t('exportDialog.models.label', "Modèles à exporter")}
|
|
128
|
+
name="selectedModels"
|
|
129
|
+
value={selectedModels}
|
|
130
|
+
onChange={handleModelChange} // Adapter cette fonction pour gérer un tableau de valeurs
|
|
131
|
+
options={modelOptions}
|
|
132
|
+
placeholder={t('exportDialog.models.placeholderMultiple', "Sélectionnez un ou plusieurs modèles...")}
|
|
133
|
+
required
|
|
134
|
+
/>
|
|
135
|
+
*/}
|
|
136
|
+
|
|
137
|
+
{/* 3. Profondeur de l'export */}
|
|
138
|
+
<NumberField
|
|
139
|
+
label={
|
|
140
|
+
<span className="flex flex-mini-gap">
|
|
141
|
+
{t('exportDialog.depth.label', "Profondeur des relations")}
|
|
142
|
+
<FaInfoCircle
|
|
143
|
+
data-tooltip-id="depth-tooltip"
|
|
144
|
+
data-tooltip-content={t('exportDialog.depth.tooltip', "Détermine jusqu'à quel niveau les données liées (relations) seront incluses. 0 = données du modèle uniquement, 1 = inclut les données directement liées, 2 = inclut les données liées aux données liées, etc.")}
|
|
145
|
+
className="hint-icon"
|
|
146
|
+
/>
|
|
147
|
+
</span>
|
|
148
|
+
}
|
|
149
|
+
name="depthParam"
|
|
150
|
+
value={depthParam}
|
|
151
|
+
onChange={(e) => setDepthParam(parseInt(e.target.value, 10) || 0)}
|
|
152
|
+
min={0}
|
|
153
|
+
step={1}
|
|
154
|
+
required
|
|
155
|
+
/>
|
|
156
|
+
<Tooltip id="depth-tooltip" place="top" effect="solid" />
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
</div>
|
|
160
|
+
<div className="dialog-actions actions">
|
|
161
|
+
<Button className="btn-secondary" onClick={onClose}>
|
|
162
|
+
{t('btns.cancel', "Annuler")}
|
|
163
|
+
</Button>
|
|
164
|
+
<Button className="btn-primary" onClick={handleExportClick} disabled={!exportSelection && selectedModels.length === 0}>
|
|
165
|
+
{t('btns.export', "Exporter")}
|
|
166
|
+
</Button>
|
|
167
|
+
</div>
|
|
168
|
+
</Dialog>
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export default ExportDialog;
|