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.
- package/README.md +878 -867
- package/client/package-lock.json +49 -0
- package/client/package.json +1 -0
- package/client/src/App.jsx +1 -1
- package/client/src/App.scss +13 -3
- package/client/src/AssistantChat.scss +3 -2
- package/client/src/DashboardView.jsx +569 -569
- package/client/src/DataEditor.jsx +2 -2
- package/client/src/DataLayout.jsx +1 -8
- package/client/src/DataTable.jsx +26 -4
- package/client/src/Field.jsx +1825 -1788
- package/client/src/FlexDataRenderer.jsx +2 -0
- package/client/src/FlexTreeUtils.js +1 -1
- package/client/src/KPIDialog.jsx +11 -1
- package/client/src/ModelCreator.jsx +1 -2
- package/client/src/ModelCreatorField.jsx +23 -27
- package/client/src/ModelList.jsx +1 -1
- package/client/src/constants.js +1 -1
- package/client/src/hooks/useTutorials.jsx +62 -65
- package/client/src/translations.js +2 -0
- package/package.json +2 -1
- package/perf/README.md +147 -0
- package/perf/artillery-hooks.js +37 -0
- package/perf/perf-shot-hardwork.yml +84 -0
- package/perf/perf-shot-search.yml +45 -0
- package/perf/setup.yml +26 -0
- package/server.js +1 -1
- package/src/constants.js +2 -27
- package/src/core.js +15 -1
- package/src/data.js +1 -1
- package/src/defaultModels.js +1544 -1540
- package/src/email.js +5 -2
- package/src/engine.js +5 -3
- package/src/filter.js +5 -3
- package/src/modules/assistant/assistant.js +3 -1
- package/src/modules/bucket.js +12 -15
- package/src/modules/data/data.backup.js +11 -8
- package/src/modules/data/data.js +6 -3
- package/src/modules/data/data.operations.js +3231 -2999
- package/src/modules/data/data.routes.js +1821 -1785
- package/src/modules/data/data.scheduling.js +2 -1
- package/src/modules/data/data.validation.js +4 -1
- package/src/modules/file.js +4 -2
- package/src/modules/user.js +4 -1
- package/src/modules/workflow.js +9 -10
- package/src/openai.jobs.js +2 -0
- package/src/packs.js +22 -5
- package/src/providers.js +22 -7
- package/test/data.integration.test.js +1060 -981
- 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
|
-
|
|
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' && (<>
|
package/client/src/DataTable.jsx
CHANGED
|
@@ -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={
|
|
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
|
-
|
|
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
|