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.
Files changed (166) hide show
  1. package/client/README.md +8 -0
  2. package/client/index.html +31 -0
  3. package/client/index.js +25 -0
  4. package/client/package-lock.json +11664 -0
  5. package/client/package.json +70 -0
  6. package/client/public/demo/26899917-d1ba-4df4-bb33-48d09a8778da.jpg +0 -0
  7. package/client/public/demo/4b9894c7-12cd-466d-8fd3-a2757b09ec96.jpg +0 -0
  8. package/client/public/demo/7ed369ac-a1a2-4b45-b0cd-4fd5bcf5a75a.jpg +0 -0
  9. package/client/public/doc/API.postman_collection.json +214 -0
  10. package/client/public/github.svg +1 -0
  11. package/client/public/profilCompany.jpg +0 -0
  12. package/client/public/profilDeveloper.jpg +0 -0
  13. package/client/public/profilEngineer.jpg +0 -0
  14. package/client/public/profilPersonal.jpg +0 -0
  15. package/client/public/profils .psd +0 -0
  16. package/client/public/react.svg +9 -0
  17. package/client/src/APIInfo.jsx +328 -0
  18. package/client/src/AddWidgetTypeModal.jsx +44 -0
  19. package/client/src/AddWidgetTypeModal.scss +87 -0
  20. package/client/src/App.css +42 -0
  21. package/client/src/App.jsx +586 -0
  22. package/client/src/App.scss +1466 -0
  23. package/client/src/AssistantChat.jsx +280 -0
  24. package/client/src/AssistantChat.scss +229 -0
  25. package/client/src/Button.jsx +12 -0
  26. package/client/src/Button.scss +197 -0
  27. package/client/src/CalculationBuilder.jsx +338 -0
  28. package/client/src/CalculationStepRow.jsx +199 -0
  29. package/client/src/CalendarConfigModal.jsx +49 -0
  30. package/client/src/ChartConfigModal.jsx +402 -0
  31. package/client/src/ConditionBuilder.jsx +622 -0
  32. package/client/src/ConditionBuilder.scss +672 -0
  33. package/client/src/ConditionBuilder2.jsx +757 -0
  34. package/client/src/ContentView.jsx +274 -0
  35. package/client/src/CronBuilder.jsx +126 -0
  36. package/client/src/CronBuilder.scss +128 -0
  37. package/client/src/CronPartBuilder.jsx +150 -0
  38. package/client/src/Dashboard.jsx +210 -0
  39. package/client/src/Dashboard.scss +445 -0
  40. package/client/src/DashboardChart.jsx +362 -0
  41. package/client/src/DashboardFlexViewItem.jsx +129 -0
  42. package/client/src/DashboardView.jsx +554 -0
  43. package/client/src/DataChart.jsx +349 -0
  44. package/client/src/DataEditor.jsx +556 -0
  45. package/client/src/DataLayout.jsx +709 -0
  46. package/client/src/DataTable.jsx +996 -0
  47. package/client/src/DataTable.scss +73 -0
  48. package/client/src/Dialog.jsx +90 -0
  49. package/client/src/Dialog.scss +117 -0
  50. package/client/src/DisplayFlexNodeRenderer.jsx +115 -0
  51. package/client/src/DocumentationPageLayout.jsx +93 -0
  52. package/client/src/DocumentationPageLayout.scss +262 -0
  53. package/client/src/Draggable.jsx +222 -0
  54. package/client/src/Draggable.scss +49 -0
  55. package/client/src/ExportDialog.jsx +172 -0
  56. package/client/src/Field.jsx +1558 -0
  57. package/client/src/FlexBuilder.jsx +269 -0
  58. package/client/src/FlexBuilder.scss +226 -0
  59. package/client/src/FlexBuilderControls.jsx +170 -0
  60. package/client/src/FlexBuilderModal.jsx +75 -0
  61. package/client/src/FlexBuilderModal.scss +109 -0
  62. package/client/src/FlexBuilderPreview.jsx +48 -0
  63. package/client/src/FlexBuilderUtils.js +84 -0
  64. package/client/src/FlexDataRenderer.jsx +170 -0
  65. package/client/src/FlexDataRenderer.scss +80 -0
  66. package/client/src/FlexNode.jsx +290 -0
  67. package/client/src/FlexTreeUtils.js +129 -0
  68. package/client/src/HiddenableCell.jsx +46 -0
  69. package/client/src/HiddenableCell.scss +36 -0
  70. package/client/src/KPIDialog.jsx +39 -0
  71. package/client/src/KPIWidget.jsx +139 -0
  72. package/client/src/KanbanCard.jsx +92 -0
  73. package/client/src/KanbanColumn.jsx +29 -0
  74. package/client/src/KanbanConfigModal.jsx +115 -0
  75. package/client/src/KanbanView.jsx +113 -0
  76. package/client/src/KanbanView.scss +107 -0
  77. package/client/src/MessageRotator.jsx +77 -0
  78. package/client/src/MessageRotator.scss +14 -0
  79. package/client/src/ModelCreator.jsx +640 -0
  80. package/client/src/ModelCreator.scss +154 -0
  81. package/client/src/ModelCreatorField.jsx +810 -0
  82. package/client/src/ModelImporter.jsx +120 -0
  83. package/client/src/ModelList.jsx +205 -0
  84. package/client/src/Notification.jsx +137 -0
  85. package/client/src/Notification.scss +126 -0
  86. package/client/src/NotificationProvider.jsx +73 -0
  87. package/client/src/PackGallery.jsx +211 -0
  88. package/client/src/PackGallery.scss +156 -0
  89. package/client/src/Pagination.jsx +141 -0
  90. package/client/src/RTE.jsx +415 -0
  91. package/client/src/RTETrans.jsx +103 -0
  92. package/client/src/RelationField.jsx +247 -0
  93. package/client/src/RelationValue.jsx +230 -0
  94. package/client/src/RestoreConfirmationModal.jsx +183 -0
  95. package/client/src/RestoreDialog.jsx +134 -0
  96. package/client/src/RestoreDialog.scss +67 -0
  97. package/client/src/RichTextEditorModal.jsx +34 -0
  98. package/client/src/RichTextEditorModal.scss +54 -0
  99. package/client/src/TourSpotlight.jsx +234 -0
  100. package/client/src/TourSpotlight.scss +100 -0
  101. package/client/src/TutorialsMenu.jsx +83 -0
  102. package/client/src/TutorialsMenu.scss +217 -0
  103. package/client/src/TutorialsRewardModal.jsx +65 -0
  104. package/client/src/Utils.jsx +78 -0
  105. package/client/src/ViewSwitcher.jsx +54 -0
  106. package/client/src/ViewSwitcher.scss +74 -0
  107. package/client/src/Webpage.jsx +69 -0
  108. package/client/src/_variables.scss +21 -0
  109. package/client/src/assets/react.svg +1 -0
  110. package/client/src/constants.js +68 -0
  111. package/client/src/contexts/AuthContext.jsx +28 -0
  112. package/client/src/contexts/ModelContext.jsx +328 -0
  113. package/client/src/contexts/UIContext.jsx +52 -0
  114. package/client/src/core/data.js +35 -0
  115. package/client/src/entry-client.jsx +15 -0
  116. package/client/src/entry-server.jsx +13 -0
  117. package/client/src/filter.js +222 -0
  118. package/client/src/hooks/data.js +101 -0
  119. package/client/src/hooks/useDebounce.js +20 -0
  120. package/client/src/hooks/useDragAndDrop.js +59 -0
  121. package/client/src/hooks/useLocalStorage.js +100 -0
  122. package/client/src/hooks/useMount.js +42 -0
  123. package/client/src/hooks/useTutorials.jsx +227 -0
  124. package/client/src/hooks/useWindowSize.js +24 -0
  125. package/client/src/i18n.js +47 -0
  126. package/client/src/index.css +90 -0
  127. package/client/src/index.js +10 -0
  128. package/client/src/main.jsx +11 -0
  129. package/client/src/translations.js +15940 -0
  130. package/client/src/tutorials.js +112 -0
  131. package/client/vite.config.js +30 -0
  132. package/eslint.config.js +50 -0
  133. package/package.json +48 -27
  134. package/server.js +9 -0
  135. package/src/constants.js +12 -23
  136. package/src/core.js +9 -8
  137. package/src/data.js +81 -80
  138. package/src/defaultModels.js +114 -115
  139. package/src/email.js +8 -9
  140. package/src/engine.js +5 -5
  141. package/src/events.js +1 -2
  142. package/src/i18n.js +212 -211
  143. package/src/middlewares/middleware-mongodb.js +94 -93
  144. package/src/migrate.js +24 -24
  145. package/src/modules/assistant.js +55 -55
  146. package/src/modules/bucket.js +10 -9
  147. package/src/modules/data.js +387 -357
  148. package/src/modules/file.js +3 -6
  149. package/src/modules/mongodb.js +6 -7
  150. package/src/modules/user.js +24 -47
  151. package/src/modules/workflow.js +68 -67
  152. package/src/openai.jobs.js +2 -2
  153. package/src/packs.js +30 -31
  154. package/src/providers.js +101 -3
  155. package/src/setenv.js +1 -1
  156. package/src/user.js +0 -17
  157. package/src/workers/crypto-worker.js +21 -20
  158. package/src/workers/import-export-worker.js +18 -18
  159. package/test/data.backup.integration.test.js +7 -12
  160. package/test/data.integration.test.js +27 -25
  161. package/test/globalSetup.js +2 -2
  162. package/test/import_export.integration.test.js +6 -6
  163. package/test/model.integration.test.js +21 -22
  164. package/test/workflow.integration.test.js +2 -5
  165. package/test/workflow.robustness.test.js +6 -13
  166. 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;