drf-react-by-schema 0.28.25 → 0.28.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/README.md +10 -0
- package/dist/@types/index.d.ts +115 -6
- package/dist/@types/index.d.ts.map +1 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -1
- package/dist/components/details/DetailBySchema.d.ts.map +1 -1
- package/dist/components/details/DetailBySchema.js +152 -29
- package/dist/components/details/DetailFieldBySchema.d.ts +2 -2
- package/dist/components/details/DetailFieldBySchema.d.ts.map +1 -1
- package/dist/components/details/DetailFieldBySchema.js +49 -26
- package/dist/components/details/DetailPage.d.ts +8 -0
- package/dist/components/details/DetailPage.d.ts.map +1 -0
- package/dist/components/details/DetailPage.js +123 -0
- package/dist/components/details/detailPaths.d.ts +8 -0
- package/dist/components/details/detailPaths.d.ts.map +1 -0
- package/dist/components/details/detailPaths.js +41 -0
- package/dist/components/forms/Form.d.ts +2 -0
- package/dist/components/forms/Form.d.ts.map +1 -1
- package/dist/hooks/useDetailData.d.ts +7 -0
- package/dist/hooks/useDetailData.d.ts.map +1 -0
- package/dist/hooks/useDetailData.js +70 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/docs/API_REFERENCE.md +665 -0
- package/docs/FIELD_TYPES.md +145 -0
- package/docs/localization.md +173 -0
- package/docs/password-reset-and-email.md +145 -0
- package/package.json +3 -2
|
@@ -19,19 +19,42 @@ const Image_1 = __importDefault(require("../Image"));
|
|
|
19
19
|
const FileTypeIcon_1 = __importDefault(require("../FileTypeIcon"));
|
|
20
20
|
const HtmlContent_1 = __importDefault(require("../HtmlContent"));
|
|
21
21
|
const GeoThumbCell_1 = __importDefault(require("../DataGridBySchemaEditable/GeoThumbCell"));
|
|
22
|
-
|
|
22
|
+
const detailPaths_1 = require("./detailPaths");
|
|
23
|
+
function DetailFieldBySchema({ fieldKey, fieldSchema, value, item, valueFormatter, renderValue, emptyValue, hideIfEmpty, sxField, sxLabel, sxValue, sxValueList, sxValueListItem, sxValueListItemText, }) {
|
|
23
24
|
const { serverEndPoint } = (0, DRFReactBySchemaContext_1.useDRFReactBySchema)();
|
|
24
25
|
if (!fieldSchema) {
|
|
25
26
|
console.error(`DetailFieldBySchema: could not find schema for field ${fieldKey}`);
|
|
26
27
|
return null;
|
|
27
28
|
}
|
|
28
29
|
if (!value) {
|
|
29
|
-
return react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
30
|
+
return react_1.default.createElement(Box_1.default, { sx: sxField }, emptyValue === undefined ? '-' : emptyValue);
|
|
30
31
|
}
|
|
32
|
+
const rawValue = value.value;
|
|
33
|
+
const isEmpty = (0, detailPaths_1.isEmptyDetailValue)(rawValue);
|
|
34
|
+
const resolvedItem = (item || {});
|
|
35
|
+
const label = value.title;
|
|
36
|
+
if (isEmpty && hideIfEmpty) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (isEmpty && emptyValue !== undefined) {
|
|
40
|
+
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
41
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
42
|
+
emptyValue));
|
|
43
|
+
}
|
|
44
|
+
if (renderValue) {
|
|
45
|
+
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
46
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
47
|
+
renderValue({ value: rawValue, item: resolvedItem, fieldSchema, label })));
|
|
48
|
+
}
|
|
49
|
+
const formatted = !isEmpty && valueFormatter
|
|
50
|
+
? valueFormatter(rawValue, resolvedItem, fieldSchema)
|
|
51
|
+
: value.valueStr;
|
|
52
|
+
const valueStr = typeof formatted === 'string' ? formatted : (formatted !== null && formatted !== void 0 ? formatted : '');
|
|
53
|
+
const valueStrParts = String(valueStr).split(', ');
|
|
31
54
|
if (fieldSchema.model_html) {
|
|
32
|
-
const html = typeof
|
|
55
|
+
const html = typeof rawValue === 'string' ? rawValue : valueStr;
|
|
33
56
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
34
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
57
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
35
58
|
react_1.default.createElement(HtmlContent_1.default, { html: html, sx: sxValue })));
|
|
36
59
|
}
|
|
37
60
|
const fieldType = fieldSchema.type;
|
|
@@ -41,55 +64,55 @@ function DetailFieldBySchema({ fieldKey, fieldSchema, value, sxField, sxLabel, s
|
|
|
41
64
|
const multiple = fieldSchema.many || false;
|
|
42
65
|
if (multiple) {
|
|
43
66
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
44
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
45
|
-
value.value.length > 0 ? (react_1.default.createElement(List_1.default, { sx: sxValueList },
|
|
67
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
68
|
+
value.value && value.value.length > 0 ? (react_1.default.createElement(List_1.default, { sx: sxValueList }, valueStrParts.map((singleValue, index) => (react_1.default.createElement(ListItem_1.default, { key: `${label}_${index}`, sx: sxValueListItem },
|
|
46
69
|
react_1.default.createElement(ListItemText_1.default, { sx: sxValueListItemText }, singleValue)))))) : (react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, "-"))));
|
|
47
70
|
}
|
|
48
71
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
49
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
50
|
-
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue },
|
|
72
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
73
|
+
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, valueStr)));
|
|
51
74
|
case 'choice':
|
|
52
75
|
case 'list':
|
|
53
76
|
const multipleChoice = fieldType === 'list' || fieldSchema.many ? true : false;
|
|
54
77
|
if (multipleChoice) {
|
|
55
78
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
56
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
57
|
-
value.value.length > 0 ? (react_1.default.createElement(List_1.default, { sx: sxValueList },
|
|
79
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
80
|
+
value.value && value.value.length > 0 ? (react_1.default.createElement(List_1.default, { sx: sxValueList }, valueStrParts.map((singleValue, index) => (react_1.default.createElement(ListItem_1.default, { key: `${label}_${index}`, sx: sxValueListItem },
|
|
58
81
|
react_1.default.createElement(ListItemText_1.default, { sx: sxValueListItemText }, singleValue)))))) : (react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, "-"))));
|
|
59
82
|
}
|
|
60
83
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
61
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
62
|
-
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue },
|
|
84
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
85
|
+
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, valueStr)));
|
|
63
86
|
case 'email':
|
|
64
87
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
65
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
88
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
66
89
|
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue },
|
|
67
|
-
react_1.default.createElement("a", { href: `mailto: ${
|
|
90
|
+
react_1.default.createElement("a", { href: `mailto: ${valueStr}` }, valueStr))));
|
|
68
91
|
case 'file upload':
|
|
69
92
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
70
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
71
|
-
|
|
72
|
-
react_1.default.createElement(FileTypeIcon_1.default, { name:
|
|
93
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
94
|
+
rawValue ? (react_1.default.createElement(Stack_1.default, { direction: "row", spacing: 1, alignItems: "center" },
|
|
95
|
+
react_1.default.createElement(FileTypeIcon_1.default, { name: rawValue.name }),
|
|
73
96
|
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue },
|
|
74
|
-
react_1.default.createElement(Button_1.default, { href: `${serverEndPoint === null || serverEndPoint === void 0 ? void 0 : serverEndPoint.url}${
|
|
97
|
+
react_1.default.createElement(Button_1.default, { href: `${serverEndPoint === null || serverEndPoint === void 0 ? void 0 : serverEndPoint.url}${rawValue.url}`, target: "_blank", variant: "outlined", startIcon: react_1.default.createElement(Download_1.default, null) }, valueStr)))) : (react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, "-"))));
|
|
75
98
|
case 'image upload':
|
|
76
99
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
77
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
78
|
-
|
|
79
|
-
react_1.default.createElement(Image_1.default, { sx: styles_1.Layout.detailFieldImg, src: `${serverEndPoint === null || serverEndPoint === void 0 ? void 0 : serverEndPoint.url}${
|
|
100
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
101
|
+
rawValue ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
102
|
+
react_1.default.createElement(Image_1.default, { sx: styles_1.Layout.detailFieldImg, src: `${serverEndPoint === null || serverEndPoint === void 0 ? void 0 : serverEndPoint.url}${rawValue.url}`, alt: valueStr }),
|
|
80
103
|
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue },
|
|
81
|
-
react_1.default.createElement(Button_1.default, { href: `${serverEndPoint === null || serverEndPoint === void 0 ? void 0 : serverEndPoint.url}${
|
|
104
|
+
react_1.default.createElement(Button_1.default, { href: `${serverEndPoint === null || serverEndPoint === void 0 ? void 0 : serverEndPoint.url}${rawValue.url}`, target: "_blank", variant: "contained", startIcon: react_1.default.createElement(Download_1.default, null) }, valueStr)))) : (react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, "-"))));
|
|
82
105
|
case 'point':
|
|
83
106
|
case 'polygon':
|
|
84
107
|
case 'multipoint':
|
|
85
108
|
case 'multipolygon':
|
|
86
109
|
case 'geometrycollection':
|
|
87
110
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
88
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
89
|
-
react_1.default.createElement(GeoThumbCell_1.default, { geometry: fieldType, value:
|
|
111
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
112
|
+
react_1.default.createElement(GeoThumbCell_1.default, { geometry: fieldType, value: rawValue })));
|
|
90
113
|
default:
|
|
91
114
|
return (react_1.default.createElement(Box_1.default, { sx: sxField },
|
|
92
|
-
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel },
|
|
93
|
-
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue },
|
|
115
|
+
react_1.default.createElement(Typography_1.default, { variant: "h5", sx: sxLabel }, label),
|
|
116
|
+
react_1.default.createElement(Typography_1.default, { variant: "body2", sx: sxValue }, valueStr)));
|
|
94
117
|
}
|
|
95
118
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DetailPageProps, TField } from '../../@types';
|
|
3
|
+
/**
|
|
4
|
+
* Schema-driven detail page: header (back/title/edit), optional hero, tabs
|
|
5
|
+
* rendered from `sections` and/or `render` escape hatches. No router import.
|
|
6
|
+
*/
|
|
7
|
+
export default function DetailPage<T extends TField = void>({ model, objId, titleField, title: titleProp, backLink, backLabel, onBack, editLink, editLabel, hero, tabs, sections, fieldsLayout, hiddenFields, fieldsProps, elevation, renderHeader, renderShell, emptyLabel, errorLabel, retryLabel, sxSection, sxSectionTitle, sxRow, sxRowMultiple, sxField, sxLabel, sxValue, sxValueList, sxValueListItem, sxValueListItemText, }: DetailPageProps<T>): React.JSX.Element;
|
|
8
|
+
//# sourceMappingURL=DetailPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailPage.d.ts","sourceRoot":"","sources":["../../../src/components/details/DetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAU5D,OAAO,EAAE,eAAe,EAAmC,MAAM,EAAE,MAAM,cAAc,CAAC;AAYxF;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,EAAE,EAC1D,KAAK,EACL,KAAK,EACL,UAAU,EACV,KAAK,EAAE,SAAS,EAChB,QAAQ,EACR,SAAkB,EAClB,MAAM,EACN,QAAQ,EACR,SAAkB,EAClB,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAa,EACb,YAAY,EACZ,WAAW,EACX,UAA+B,EAC/B,UAAU,EACV,UAAoB,EACpB,SAAS,EACT,cAAc,EACd,KAAK,EACL,aAAa,EACb,OAAO,EACP,OAAO,EACP,OAAO,EACP,WAAW,EACX,eAAe,EACf,mBAAmB,GACpB,EAAE,eAAe,CAAC,CAAC,CAAC,qBAqKpB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.default = DetailPage;
|
|
40
|
+
const react_1 = __importStar(require("react"));
|
|
41
|
+
const Alert_1 = __importDefault(require("@mui/material/Alert"));
|
|
42
|
+
const Box_1 = __importDefault(require("@mui/material/Box"));
|
|
43
|
+
const Button_1 = __importDefault(require("@mui/material/Button"));
|
|
44
|
+
const CircularProgress_1 = __importDefault(require("@mui/material/CircularProgress"));
|
|
45
|
+
const Stack_1 = __importDefault(require("@mui/material/Stack"));
|
|
46
|
+
const Tab_1 = __importDefault(require("@mui/material/Tab"));
|
|
47
|
+
const Tabs_1 = __importDefault(require("@mui/material/Tabs"));
|
|
48
|
+
const Typography_1 = __importDefault(require("@mui/material/Typography"));
|
|
49
|
+
const DetailBySchema_1 = __importDefault(require("./DetailBySchema"));
|
|
50
|
+
const useDetailData_1 = require("../../hooks/useDetailData");
|
|
51
|
+
function tabLabel(tab, values) {
|
|
52
|
+
const count = tab.count ? tab.count(values) : undefined;
|
|
53
|
+
return count === undefined ? tab.label : `${tab.label} (${count})`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Schema-driven detail page: header (back/title/edit), optional hero, tabs
|
|
57
|
+
* rendered from `sections` and/or `render` escape hatches. No router import.
|
|
58
|
+
*/
|
|
59
|
+
function DetailPage({ model, objId, titleField, title: titleProp, backLink, backLabel = 'Back', onBack, editLink, editLabel = 'Edit', hero, tabs, sections, fieldsLayout, hiddenFields, fieldsProps, elevation = 0, renderHeader, renderShell, emptyLabel = 'No record found.', errorLabel, retryLabel = 'Retry', sxSection, sxSectionTitle, sxRow, sxRowMultiple, sxField, sxLabel, sxValue, sxValueList, sxValueListItem, sxValueListItemText, }) {
|
|
60
|
+
const { values, schema, columns, loading, error, reload } = (0, useDetailData_1.useDetailData)({
|
|
61
|
+
model,
|
|
62
|
+
objId,
|
|
63
|
+
titleField,
|
|
64
|
+
});
|
|
65
|
+
const [tabIndex, setTabIndex] = (0, react_1.useState)(0);
|
|
66
|
+
(0, react_1.useEffect)(() => {
|
|
67
|
+
setTabIndex(0);
|
|
68
|
+
}, [model, objId]);
|
|
69
|
+
const title = (0, react_1.useMemo)(() => {
|
|
70
|
+
if (titleProp) {
|
|
71
|
+
return titleProp;
|
|
72
|
+
}
|
|
73
|
+
if (titleField && values && values[titleField] != null) {
|
|
74
|
+
return String(values[titleField]);
|
|
75
|
+
}
|
|
76
|
+
return model;
|
|
77
|
+
}, [titleProp, titleField, values, model]);
|
|
78
|
+
const renderProps = {
|
|
79
|
+
values,
|
|
80
|
+
schema,
|
|
81
|
+
columns,
|
|
82
|
+
id: objId,
|
|
83
|
+
title,
|
|
84
|
+
};
|
|
85
|
+
const visibleTabs = (0, react_1.useMemo)(() => (tabs || []).filter((tab) => !(values && tab.hidden && tab.hidden(values))), [tabs, values]);
|
|
86
|
+
const activeTabIndex = visibleTabs.length > 0 ? Math.min(tabIndex, visibleTabs.length - 1) : 0;
|
|
87
|
+
let body;
|
|
88
|
+
if (loading) {
|
|
89
|
+
body = (react_1.default.createElement(Box_1.default, { sx: { display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: 160 } },
|
|
90
|
+
react_1.default.createElement(CircularProgress_1.default, null)));
|
|
91
|
+
}
|
|
92
|
+
else if (error) {
|
|
93
|
+
body = (react_1.default.createElement(Alert_1.default, { severity: "error", action: react_1.default.createElement(Button_1.default, { color: "inherit", size: "small", onClick: reload }, retryLabel) }, errorLabel || error.message || 'Could not load the record.'));
|
|
94
|
+
}
|
|
95
|
+
else if (!values || !schema) {
|
|
96
|
+
body = react_1.default.createElement(Alert_1.default, { severity: "info" }, emptyLabel);
|
|
97
|
+
}
|
|
98
|
+
else if (visibleTabs.length === 0) {
|
|
99
|
+
body = (react_1.default.createElement(DetailBySchema_1.default, { values: values, schema: schema, columns: columns, fieldsLayout: sections || fieldsLayout, hiddenFields: hiddenFields, fieldsProps: fieldsProps, elevation: elevation, sxSection: sxSection, sxSectionTitle: sxSectionTitle, sxRow: sxRow, sxRowMultiple: sxRowMultiple, sxField: sxField, sxLabel: sxLabel, sxValue: sxValue, sxValueList: sxValueList, sxValueListItem: sxValueListItem, sxValueListItemText: sxValueListItemText }));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const activeTab = visibleTabs[activeTabIndex];
|
|
103
|
+
body = (react_1.default.createElement(react_1.default.Fragment, null,
|
|
104
|
+
react_1.default.createElement(Tabs_1.default, { value: activeTabIndex, onChange: (_event, value) => setTabIndex(value), variant: "scrollable", allowScrollButtonsMobile: true }, visibleTabs.map((tab) => (react_1.default.createElement(Tab_1.default, { key: tab.key, label: tabLabel(tab, values), icon: tab.icon })))),
|
|
105
|
+
react_1.default.createElement(Box_1.default, { sx: { mt: 2 } }, activeTab.sections ? (react_1.default.createElement(DetailBySchema_1.default, { values: values, schema: schema, columns: columns, fieldsLayout: activeTab.sections, hiddenFields: hiddenFields, fieldsProps: fieldsProps, elevation: elevation, sxSection: sxSection, sxSectionTitle: sxSectionTitle, sxRow: sxRow, sxRowMultiple: sxRowMultiple, sxField: sxField, sxLabel: sxLabel, sxValue: sxValue, sxValueList: sxValueList, sxValueListItem: sxValueListItem, sxValueListItemText: sxValueListItemText })) : activeTab.render ? (activeTab.render({
|
|
106
|
+
values,
|
|
107
|
+
schema,
|
|
108
|
+
columns,
|
|
109
|
+
id: objId,
|
|
110
|
+
label: activeTab.label,
|
|
111
|
+
})) : null)));
|
|
112
|
+
}
|
|
113
|
+
const header = renderHeader ? (react_1.default.createElement(react_1.default.Fragment, null, renderHeader(renderProps))) : (react_1.default.createElement(Stack_1.default, { direction: "row", alignItems: "center", spacing: 2, justifyContent: "space-between", sx: { mb: 2 } },
|
|
114
|
+
react_1.default.createElement(Stack_1.default, { direction: "row", alignItems: "center", spacing: 2 },
|
|
115
|
+
(onBack || backLink) && (react_1.default.createElement(Button_1.default, { variant: "outlined", onClick: onBack, href: onBack ? undefined : backLink }, backLabel)),
|
|
116
|
+
react_1.default.createElement(Typography_1.default, { variant: "h4" }, title)),
|
|
117
|
+
editLink && (react_1.default.createElement(Button_1.default, { variant: "contained", href: editLink }, editLabel))));
|
|
118
|
+
const content = (react_1.default.createElement(react_1.default.Fragment, null,
|
|
119
|
+
header,
|
|
120
|
+
hero,
|
|
121
|
+
body));
|
|
122
|
+
return react_1.default.createElement(react_1.default.Fragment, null, renderShell ? renderShell(content, renderProps) : content);
|
|
123
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Field, GenericValue, Item, SchemaType } from '../../@types';
|
|
2
|
+
/** Reads a possibly dotted path (`contratacao.valor`) from a detail item. */
|
|
3
|
+
export declare function getValueByPath(item: Item | null | undefined, path: string): GenericValue;
|
|
4
|
+
/** Resolves the field metadata for a possibly dotted path. */
|
|
5
|
+
export declare function getFieldSchemaByPath(schema: SchemaType | null | undefined, path: string): Field | undefined;
|
|
6
|
+
/** Empty means "nothing to render" (`0` and `false` are values). */
|
|
7
|
+
export declare function isEmptyDetailValue(value: GenericValue): boolean;
|
|
8
|
+
//# sourceMappingURL=detailPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detailPaths.d.ts","sourceRoot":"","sources":["../../../src/components/details/detailPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAErE,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAaxF;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACrC,IAAI,EAAE,MAAM,GACX,KAAK,GAAG,SAAS,CAcnB;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAO/D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getValueByPath = getValueByPath;
|
|
4
|
+
exports.getFieldSchemaByPath = getFieldSchemaByPath;
|
|
5
|
+
exports.isEmptyDetailValue = isEmptyDetailValue;
|
|
6
|
+
/** Reads a possibly dotted path (`contratacao.valor`) from a detail item. */
|
|
7
|
+
function getValueByPath(item, path) {
|
|
8
|
+
if (!item) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
if (!path.includes('.')) {
|
|
12
|
+
return item[path];
|
|
13
|
+
}
|
|
14
|
+
return path
|
|
15
|
+
.split('.')
|
|
16
|
+
.reduce((acc, key) => (acc === null || acc === undefined ? undefined : acc[key]), item);
|
|
17
|
+
}
|
|
18
|
+
/** Resolves the field metadata for a possibly dotted path. */
|
|
19
|
+
function getFieldSchemaByPath(schema, path) {
|
|
20
|
+
var _a;
|
|
21
|
+
if (!schema) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
if (!path.includes('.')) {
|
|
25
|
+
return schema[path];
|
|
26
|
+
}
|
|
27
|
+
const segments = path.split('.');
|
|
28
|
+
let current = schema[segments[0]];
|
|
29
|
+
for (let index = 1; index < segments.length && current; index++) {
|
|
30
|
+
const children = current.children || ((_a = current.child) === null || _a === void 0 ? void 0 : _a.children);
|
|
31
|
+
current = children === null || children === void 0 ? void 0 : children[segments[index]];
|
|
32
|
+
}
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
/** Empty means "nothing to render" (`0` and `false` are values). */
|
|
36
|
+
function isEmptyDetailValue(value) {
|
|
37
|
+
return (value === null ||
|
|
38
|
+
value === undefined ||
|
|
39
|
+
value === '' ||
|
|
40
|
+
(Array.isArray(value) && value.length === 0));
|
|
41
|
+
}
|
|
@@ -52,7 +52,9 @@ interface FormProps<T extends TField = void> extends Omit<CommonFieldProps<T>, '
|
|
|
52
52
|
elevation?: number;
|
|
53
53
|
CustomFormActions?: (props: FormActionsProps) => React.JSX.Element;
|
|
54
54
|
extraValidators?: ExtraValidators<T>;
|
|
55
|
+
/** Field names monitored on change; requires `onWatchChange`. */
|
|
55
56
|
watchValues?: FieldList<T>;
|
|
57
|
+
/** Called with `{ [field]: value }` when a watched value changes. */
|
|
56
58
|
onWatchChange?: (values: FormWatchObject<T>) => void;
|
|
57
59
|
reloadStateStamp?: number | string;
|
|
58
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../src/components/forms/Form.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../src/components/forms/Form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TField, UseDetailDataProps, UseDetailDataResult } from '../@types';
|
|
2
|
+
/**
|
|
3
|
+
* Loads one detail record (schema + columns + values) in a single request.
|
|
4
|
+
* Independent from the router and from `pageForm`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function useDetailData<T extends TField = void>({ model, objId, }: UseDetailDataProps<T>): UseDetailDataResult<T>;
|
|
7
|
+
//# sourceMappingURL=useDetailData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDetailData.d.ts","sourceRoot":"","sources":["../../src/hooks/useDetailData.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,MAAM,EACN,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,WAAW,CAAC;AAInB;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,EAAE,EACrD,KAAK,EACL,KAAK,GACN,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAsDhD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.useDetailData = useDetailData;
|
|
16
|
+
const react_1 = require("react");
|
|
17
|
+
const axios_1 = __importDefault(require("axios"));
|
|
18
|
+
const APIWrapperContext_1 = require("../context/APIWrapperContext");
|
|
19
|
+
const utils_1 = require("../utils/utils");
|
|
20
|
+
/**
|
|
21
|
+
* Loads one detail record (schema + columns + values) in a single request.
|
|
22
|
+
* Independent from the router and from `pageForm`.
|
|
23
|
+
*/
|
|
24
|
+
function useDetailData({ model, objId, }) {
|
|
25
|
+
const { getGenericModel } = (0, APIWrapperContext_1.useAPIWrapper)();
|
|
26
|
+
const [values, setValues] = (0, react_1.useState)(null);
|
|
27
|
+
const [schema, setSchema] = (0, react_1.useState)(null);
|
|
28
|
+
const [columns, setColumns] = (0, react_1.useState)([]);
|
|
29
|
+
const [loading, setLoading] = (0, react_1.useState)(Boolean(objId));
|
|
30
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
31
|
+
const [reloadIndex, setReloadIndex] = (0, react_1.useState)(0);
|
|
32
|
+
const requestId = (0, react_1.useRef)(0);
|
|
33
|
+
const reload = (0, react_1.useCallback)(() => setReloadIndex((index) => index + 1), []);
|
|
34
|
+
(0, react_1.useEffect)(() => {
|
|
35
|
+
const currentRequest = ++requestId.current;
|
|
36
|
+
if (!objId) {
|
|
37
|
+
setValues(null);
|
|
38
|
+
setSchema(null);
|
|
39
|
+
setColumns([]);
|
|
40
|
+
setError(null);
|
|
41
|
+
setLoading(false);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
setLoading(true);
|
|
45
|
+
setError(null);
|
|
46
|
+
const load = () => __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const response = yield getGenericModel({ model, id: objId });
|
|
48
|
+
if (currentRequest !== requestId.current) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (axios_1.default.isAxiosError(response)) {
|
|
52
|
+
setError(response);
|
|
53
|
+
setValues(null);
|
|
54
|
+
setSchema(null);
|
|
55
|
+
setColumns([]);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
setValues((0, utils_1.populateValues)({
|
|
59
|
+
data: response.data,
|
|
60
|
+
schema: response.schema,
|
|
61
|
+
}));
|
|
62
|
+
setSchema(response.schema);
|
|
63
|
+
setColumns(response.columns || []);
|
|
64
|
+
}
|
|
65
|
+
setLoading(false);
|
|
66
|
+
});
|
|
67
|
+
load();
|
|
68
|
+
}, [model, objId, getGenericModel, reloadIndex]);
|
|
69
|
+
return { values, schema, columns, loading, error, reload };
|
|
70
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,8 @@ export { getThemeTexts } from './styles/texts';
|
|
|
35
35
|
export type { DRFReactBySchemaTexts, GeometryTexts, FormTexts, AuthTexts, RichTextTexts, } from './styles/texts';
|
|
36
36
|
import DetailBySchema from './components/details/DetailBySchema';
|
|
37
37
|
import DetailFieldBySchema from './components/details/DetailFieldBySchema';
|
|
38
|
-
|
|
38
|
+
import DetailPage from './components/details/DetailPage';
|
|
39
|
+
import { useDetailData } from './hooks/useDetailData';
|
|
40
|
+
export { DRFReactBySchemaProvider, useAPIWrapper, Form, DialogFormBySchema, ChangePasswordForm, ForgotPasswordForm, DataGridBySchemaEditable, GenericModelList, GenericRelatedModelList, DataTotals, DialogActions, FileTypeIcon, HtmlContent, SelectEditInputCell, GridDateInput, GridDecimalInput, GridPatternInput, BooleanInputCell, FormWatcher, FormBySchema, FieldBySchema, TextFieldBySchema, HtmlFieldBySchema, BooleanFieldBySchema, DesktopDatePickerBySchema, DesktopDateTimePickerBySchema, EditableAutocompleteFieldBySchema, AutocompleteFieldBySchema, FloatFieldBySchema, DetailBySchema, DetailFieldBySchema, DetailPage, useDetailData, setAuthToken, emptyByType, getChoiceByValue, populateValues, enrichChoices, buildGenericYupValidationSchema, getDataGridColumns, errorProps, getFieldErrorsFromResponse, getTmpId, isTmpId, isReadOnlyField, isRelationField, getPatternFormat, clearJWT, hasJWT, slugToCamelCase, AUTH_EXPIRED_EVENT, };
|
|
39
41
|
export * from './@types/index';
|
|
40
42
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC/F,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,+BAA+B,EAC/B,UAAU,EACV,0BAA0B,EAC1B,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,wBAAwB,MAAM,oCAAoC,CAAC;AAG1E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAC3C,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AACvE,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AACvE,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AAGvE,OAAO,wBAAwB,MAAM,uCAAuC,CAAC;AAC7E,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,uBAAuB,MAAM,sCAAsC,CAAC;AAC3E,OAAO,UAAU,MAAM,yBAAyB,CAAC;AACjD,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAGrD,OAAO,mBAAmB,MAAM,2DAA2D,CAAC;AAC5F,OAAO,aAAa,MAAM,qDAAqD,CAAC;AAChF,OAAO,gBAAgB,MAAM,wDAAwD,CAAC;AACtF,OAAO,gBAAgB,MAAM,wDAAwD,CAAC;AACtF,OAAO,gBAAgB,MAAM,wDAAwD,CAAC;AAGtF,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAC3D,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,iBAAiB,MAAM,6CAA6C,CAAC;AAC5E,OAAO,iBAAiB,MAAM,6CAA6C,CAAC;AAC5E,OAAO,WAAW,MAAM,0BAA0B,CAAC;AACnD,OAAO,oBAAoB,MAAM,gDAAgD,CAAC;AAClF,OAAO,yBAAyB,MAAM,qDAAqD,CAAC;AAC5F,OAAO,6BAA6B,MAAM,yDAAyD,CAAC;AACpG,OAAO,iCAAiC,MAAM,6DAA6D,CAAC;AAC5G,OAAO,yBAAyB,MAAM,qDAAqD,CAAC;AAC5F,OAAO,kBAAkB,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,mBAAmB,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,8 +17,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.
|
|
21
|
-
exports.AUTH_EXPIRED_EVENT = exports.slugToCamelCase = exports.hasJWT = exports.clearJWT = void 0;
|
|
20
|
+
exports.isReadOnlyField = exports.isTmpId = exports.getTmpId = exports.getFieldErrorsFromResponse = exports.errorProps = exports.getDataGridColumns = exports.buildGenericYupValidationSchema = exports.enrichChoices = exports.populateValues = exports.getChoiceByValue = exports.emptyByType = exports.setAuthToken = exports.useDetailData = exports.DetailPage = exports.DetailFieldBySchema = exports.DetailBySchema = exports.FloatFieldBySchema = exports.AutocompleteFieldBySchema = exports.EditableAutocompleteFieldBySchema = exports.DesktopDateTimePickerBySchema = exports.DesktopDatePickerBySchema = exports.BooleanFieldBySchema = exports.HtmlFieldBySchema = exports.TextFieldBySchema = exports.FieldBySchema = exports.FormBySchema = exports.FormWatcher = exports.BooleanInputCell = exports.GridPatternInput = exports.GridDecimalInput = exports.GridDateInput = exports.SelectEditInputCell = exports.HtmlContent = exports.FileTypeIcon = exports.DialogActions = exports.DataTotals = exports.GenericRelatedModelList = exports.GenericModelList = exports.DataGridBySchemaEditable = exports.ForgotPasswordForm = exports.ChangePasswordForm = exports.DialogFormBySchema = exports.Form = exports.useAPIWrapper = exports.DRFReactBySchemaProvider = exports.getThemeTexts = exports.DEFAULT_LAYERS = exports.DRF_REACT_BY_SCHEMA_MARKER_ICON = exports.applyThemeMarkerIcon = exports.applyDefaultLeafletIcon = void 0;
|
|
21
|
+
exports.AUTH_EXPIRED_EVENT = exports.slugToCamelCase = exports.hasJWT = exports.clearJWT = exports.getPatternFormat = exports.isRelationField = void 0;
|
|
22
22
|
// Methods:
|
|
23
23
|
const api_1 = require("./api");
|
|
24
24
|
Object.defineProperty(exports, "setAuthToken", { enumerable: true, get: function () { return api_1.setAuthToken; } });
|
|
@@ -117,4 +117,8 @@ const DetailBySchema_1 = __importDefault(require("./components/details/DetailByS
|
|
|
117
117
|
exports.DetailBySchema = DetailBySchema_1.default;
|
|
118
118
|
const DetailFieldBySchema_1 = __importDefault(require("./components/details/DetailFieldBySchema"));
|
|
119
119
|
exports.DetailFieldBySchema = DetailFieldBySchema_1.default;
|
|
120
|
+
const DetailPage_1 = __importDefault(require("./components/details/DetailPage"));
|
|
121
|
+
exports.DetailPage = DetailPage_1.default;
|
|
122
|
+
const useDetailData_1 = require("./hooks/useDetailData");
|
|
123
|
+
Object.defineProperty(exports, "useDetailData", { enumerable: true, get: function () { return useDetailData_1.useDetailData; } });
|
|
120
124
|
__exportStar(require("./@types/index"), exports);
|