data-primals-engine 1.4.3 → 1.5.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 (50) hide show
  1. package/README.md +878 -867
  2. package/client/package-lock.json +49 -0
  3. package/client/package.json +1 -0
  4. package/client/src/App.jsx +1 -1
  5. package/client/src/App.scss +13 -3
  6. package/client/src/AssistantChat.scss +3 -2
  7. package/client/src/DashboardView.jsx +569 -569
  8. package/client/src/DataEditor.jsx +2 -2
  9. package/client/src/DataLayout.jsx +1 -8
  10. package/client/src/DataTable.jsx +26 -4
  11. package/client/src/Field.jsx +1825 -1788
  12. package/client/src/FlexDataRenderer.jsx +2 -0
  13. package/client/src/FlexTreeUtils.js +1 -1
  14. package/client/src/KPIDialog.jsx +11 -1
  15. package/client/src/ModelCreator.jsx +1 -2
  16. package/client/src/ModelCreatorField.jsx +23 -27
  17. package/client/src/ModelList.jsx +1 -1
  18. package/client/src/constants.js +1 -1
  19. package/client/src/hooks/useTutorials.jsx +62 -65
  20. package/client/src/translations.js +2 -0
  21. package/package.json +2 -1
  22. package/perf/README.md +147 -0
  23. package/perf/artillery-hooks.js +37 -0
  24. package/perf/perf-shot-hardwork.yml +84 -0
  25. package/perf/perf-shot-search.yml +45 -0
  26. package/perf/setup.yml +26 -0
  27. package/server.js +1 -1
  28. package/src/constants.js +2 -27
  29. package/src/core.js +15 -1
  30. package/src/data.js +1 -1
  31. package/src/defaultModels.js +1544 -1540
  32. package/src/email.js +5 -2
  33. package/src/engine.js +5 -3
  34. package/src/filter.js +5 -3
  35. package/src/modules/assistant/assistant.js +3 -1
  36. package/src/modules/bucket.js +12 -15
  37. package/src/modules/data/data.backup.js +11 -8
  38. package/src/modules/data/data.js +6 -3
  39. package/src/modules/data/data.operations.js +3231 -2999
  40. package/src/modules/data/data.routes.js +1821 -1785
  41. package/src/modules/data/data.scheduling.js +2 -1
  42. package/src/modules/data/data.validation.js +4 -1
  43. package/src/modules/file.js +4 -2
  44. package/src/modules/user.js +4 -1
  45. package/src/modules/workflow.js +9 -10
  46. package/src/openai.jobs.js +2 -0
  47. package/src/packs.js +22 -5
  48. package/src/providers.js +22 -7
  49. package/test/data.integration.test.js +1060 -981
  50. package/test/import_export.integration.test.js +1 -1
@@ -88,9 +88,9 @@ export const DataEditor = forwardRef(function MyDataEditor({
88
88
  // --- Le reste de la fonction renderInputField reste identique ---
89
89
  switch (field.type) {
90
90
  case 'model':
91
- return <ModelField value={value} onChange={handleChange} model={model} field={field} />;
91
+ return <ModelField value={value} onChange={handleChange} model={model} field={field} formData={formData} />;
92
92
  case 'modelField':
93
- return <ModelField fields={true} value={value} onChange={handleChange} model={model} field={field} />;
93
+ return <ModelField fields={true} value={value} onChange={handleChange} model={model} field={field} formData={formData} />;
94
94
  case 'datetime':
95
95
  case 'date':
96
96
  if( field.min )
@@ -698,14 +698,7 @@ function DataLayout({refreshUI}) {
698
698
  />}
699
699
  <h2>{t(`model_${selectedModel?.name}`, selectedModel?.name)} <>({countByModel?.[selectedModel?.name]})</></h2>
700
700
 
701
- <div className={"flex"}>
702
- {t(`model_${selectedModel?.name}`, selectedModel?.name) !== selectedModel?.name && (
703
- <span className="badge"><strong>model</strong> : {selectedModel?.name}</span>)}
704
- {selectedModel.name === 'dashboard' && <button onClick={() => {
705
- nav('/user/'+getUserHash(me)+'/dashboards');
706
- }}><FaEye /> Afficher les tableaux de bord</button> }
707
- </div>
708
- <p className="model-desc hint">{t(`model_description_${selectedModel.name}`, selectedModel.description)}</p>
701
+
709
702
  {renderCurrentView()}
710
703
 
711
704
  {isDataLoaded && currentView === 'table' && (<>
@@ -11,7 +11,7 @@ import {Event} from "../../src/events.js";
11
11
  import {
12
12
  FaBook,
13
13
  FaCopy,
14
- FaDatabase, FaEraser,
14
+ FaDatabase, FaEraser, FaEye,
15
15
  FaFileExport,
16
16
  FaFileImport,
17
17
  FaFilter, FaHistory,
@@ -60,6 +60,7 @@ import {pagedFilterToMongoConds} from "./filter.js";
60
60
  import {isConditionMet} from "../../src/filter";
61
61
  import {DataImporter} from "./DataImporter.jsx";
62
62
  import {HistoryDialog} from "./HistoryDialog.jsx";
63
+ import {Config} from "../../src/config.js";
63
64
 
64
65
  const Header = ({
65
66
  reversed = false,
@@ -92,11 +93,25 @@ const Header = ({
92
93
  const handleAdvancedFilter = () => {
93
94
  setAdvancedFilterVisible(true);
94
95
  }
96
+
97
+ const [iconFilterActive, setIconFilterActive] = useState(true);
98
+ useEffect(() => {
99
+ if (pagedFilters && selectedModel?.name) {
100
+ const modelFilters = pagedFilters[selectedModel.name] || {};
101
+ const isActive = Object.keys(modelFilters)
102
+ .some(fieldKey => {
103
+ const fieldFilter = modelFilters[fieldKey];
104
+ return fieldFilter && Object.keys(fieldFilter).length > 0;
105
+ });
106
+ setIconFilterActive(isActive);
107
+ }
108
+ }, [pagedFilters, selectedModel?.name]);
109
+
95
110
  return <><tr className={reversed ? ' reversed' : ''}>
96
111
  {advanced && (<th className={"mini"}>
97
112
  <div className="flex flex-row">
98
113
 
99
- <Button onClick={handleFilter} className={filterActive ? ' active' : ''}><FaFilter/></Button>
114
+ <Button onClick={handleFilter} className={iconFilterActive ? ' active' : ''}><FaFilter/></Button>
100
115
  {filterActive && <Button onClick={() => handleAdvancedFilter()}><FaWrench /></Button>}
101
116
  <CheckboxField checkbox={true} checked={checkedItems?.length === data.length} onChange={e => {
102
117
  if (checkedItems?.length === data.length) {
@@ -355,7 +370,9 @@ export function DataTable({
355
370
  params.append("_user", getUserId(me));
356
371
 
357
372
  // Cas de la table de données : requête paginée
358
- params.append('limit', maxRequestData + '');
373
+
374
+ const m = Config.Get('maxRequestData', maxRequestData);
375
+ params.append('limit', m + '');
359
376
  params.append('attachment', '1');
360
377
  params.append("depth", data.depth+"");
361
378
  if( data.withModels )
@@ -446,7 +463,6 @@ export function DataTable({
446
463
  setFilterActive(!filterActive);
447
464
  }
448
465
 
449
-
450
466
  const [lightboxIndex, setLightboxIndex] = useState(0);
451
467
  const [lightboxOpened, setLightboxOpened] = useState(false);
452
468
  const [lightboxSlides, setLightboxSlides] = useState([]);
@@ -480,6 +496,12 @@ export function DataTable({
480
496
  return (
481
497
  <div className={`datatable${filterActive ? ' filter-active' : ''}`}>
482
498
  {advanced && <div className="flex actions flex-left">
499
+ {t(`model_${selectedModel?.name}`, selectedModel?.name) !== selectedModel?.name && (
500
+ <span className="badge"><strong>model</strong> : {selectedModel?.name}</span>)}
501
+ {selectedModel.name === 'dashboard' && <Button className={"btn"} onClick={() => {
502
+ nav('/user/'+getUserHash(me)+'/dashboards');
503
+ }}><FaEye /> Tableaux de bord</Button> }
504
+ <p className="model-desc hint">{t(`model_description_${selectedModel.name}`, selectedModel.description)}</p>
483
505
  <Button onClick={() => onAddData(model)}><FaPlus/><Trans i18nKey="btns.addData">Ajouter une
484
506
  donnée</Trans></Button>
485
507
  <Button onClick={handleImport} title={t("btns.import")}><FaFileImport/><Trans