@applica-software-guru/react-admin 1.5.293 → 1.5.295
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/dist/components/ra-buttons/Button.d.ts +7 -1
- package/dist/components/ra-buttons/Button.d.ts.map +1 -1
- package/dist/components/ra-buttons/CreateButton.d.ts +45 -0
- package/dist/components/ra-buttons/CreateButton.d.ts.map +1 -0
- package/dist/components/ra-buttons/index.d.ts +1 -0
- package/dist/components/ra-buttons/index.d.ts.map +1 -1
- package/dist/components/ra-forms/TableForm/{CreateButton.d.ts → TableCreateButton.d.ts} +3 -3
- package/dist/components/ra-forms/TableForm/TableCreateButton.d.ts.map +1 -0
- package/dist/components/ra-forms/TableForm/TableFormIterator.d.ts +2 -2
- package/dist/components/ra-forms/TableForm/TableFormIterator.d.ts.map +1 -1
- package/dist/components/ra-forms/TableForm/index.d.ts +1 -1
- package/dist/components/ra-forms/TableForm/index.d.ts.map +1 -1
- package/dist/components/ra-lists/List.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/react-admin.cjs.js +52 -52
- package/dist/react-admin.cjs.js.gz +0 -0
- package/dist/react-admin.cjs.js.map +1 -1
- package/dist/react-admin.es.js +6191 -6096
- package/dist/react-admin.es.js.gz +0 -0
- package/dist/react-admin.es.js.map +1 -1
- package/dist/react-admin.umd.js +52 -52
- package/dist/react-admin.umd.js.gz +0 -0
- package/dist/react-admin.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ra-buttons/Button.tsx +9 -2
- package/src/components/ra-buttons/CreateButton.tsx +169 -0
- package/src/components/ra-buttons/index.ts +1 -0
- package/src/components/ra-forms/TableForm/{CreateButton.tsx → TableCreateButton.tsx} +2 -2
- package/src/components/ra-forms/TableForm/TableFormIterator.tsx +6 -5
- package/src/components/ra-forms/TableForm/index.ts +1 -1
- package/src/components/ra-lists/List.tsx +3 -0
- package/src/index.ts +0 -1
- package/dist/components/ra-forms/TableForm/CreateButton.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Button as MuiButton } from '@mui/material';
|
|
2
2
|
import { styled } from '@mui/material/styles';
|
|
3
|
-
import {
|
|
3
|
+
import { Button as RaButton, ButtonProps as RaButtonProps, useTranslate } from 'react-admin';
|
|
4
|
+
import { Path } from 'react-router';
|
|
4
5
|
|
|
5
6
|
type ButtonProps = RaButtonProps & {
|
|
6
7
|
/**
|
|
@@ -80,5 +81,11 @@ function Button(props: ButtonProps): JSX.Element {
|
|
|
80
81
|
return <RaButton {...props} />;
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
type LocationDescriptor = Partial<Path> & {
|
|
85
|
+
redirect?: boolean;
|
|
86
|
+
state?: any;
|
|
87
|
+
replace?: boolean;
|
|
88
|
+
};
|
|
89
|
+
|
|
83
90
|
export { Button };
|
|
84
|
-
export type { ButtonProps };
|
|
91
|
+
export type { ButtonProps, LocationDescriptor };
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import ContentAdd from '@mui/icons-material/Add';
|
|
3
|
+
import { Fab, Theme, useMediaQuery } from '@mui/material';
|
|
4
|
+
import { styled } from '@mui/material/styles';
|
|
5
|
+
import clsx from 'clsx';
|
|
6
|
+
import isEqual from 'lodash/isEqual';
|
|
7
|
+
import merge from 'lodash/merge';
|
|
8
|
+
import PropTypes from 'prop-types';
|
|
9
|
+
import { useCreatePath, useResourceContext, useTranslate } from 'ra-core';
|
|
10
|
+
import { Link, To } from 'react-router-dom';
|
|
11
|
+
|
|
12
|
+
import { Button, ButtonProps, LocationDescriptor } from './Button';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Opens the Create view of a given resource
|
|
16
|
+
*
|
|
17
|
+
* Renders as a regular button on desktop, and a Floating Action Button
|
|
18
|
+
* on mobile.
|
|
19
|
+
*
|
|
20
|
+
* @example // basic usage
|
|
21
|
+
* import { CreateButton } from 'react-admin';
|
|
22
|
+
*
|
|
23
|
+
* const CommentCreateButton = () => (
|
|
24
|
+
* <CreateButton label="Create comment" />
|
|
25
|
+
* );
|
|
26
|
+
*/
|
|
27
|
+
function CreateBtn(props: CreateButtonProps) {
|
|
28
|
+
const {
|
|
29
|
+
className,
|
|
30
|
+
icon = defaultIcon,
|
|
31
|
+
label = 'ra.action.create',
|
|
32
|
+
resource: resourceProp,
|
|
33
|
+
scrollToTop = true,
|
|
34
|
+
variant,
|
|
35
|
+
to: locationDescriptor,
|
|
36
|
+
state: initialState = {},
|
|
37
|
+
disableFloatingButton = false,
|
|
38
|
+
...rest
|
|
39
|
+
} = props;
|
|
40
|
+
|
|
41
|
+
const resource = useResourceContext(props);
|
|
42
|
+
const createPath = useCreatePath();
|
|
43
|
+
const translate = useTranslate();
|
|
44
|
+
const isSmall = useMediaQuery((theme: Theme) => theme.breakpoints.down('md'));
|
|
45
|
+
const state = merge({}, scrollStates.get(String(scrollToTop)), initialState);
|
|
46
|
+
// Duplicated behaviour of Button component (legacy use) which will be removed in v5.
|
|
47
|
+
const linkParams = getLinkParams(locationDescriptor);
|
|
48
|
+
|
|
49
|
+
return !disableFloatingButton && isSmall ? (
|
|
50
|
+
<StyledFab
|
|
51
|
+
component={Link}
|
|
52
|
+
to={createPath({ resource, type: 'create' })}
|
|
53
|
+
state={state}
|
|
54
|
+
// @ts-ignore FabProps ships its own runtime palette `FabPropsColorOverrides` provoking an overlap error with `ButtonProps`
|
|
55
|
+
color="primary"
|
|
56
|
+
className={clsx(CreateButtonClasses.floating, className)}
|
|
57
|
+
aria-label={label ? translate(label) : 'ra.action.create'}
|
|
58
|
+
{...rest}
|
|
59
|
+
{...linkParams}
|
|
60
|
+
>
|
|
61
|
+
{icon}
|
|
62
|
+
</StyledFab>
|
|
63
|
+
) : (
|
|
64
|
+
<StyledButton
|
|
65
|
+
component={Link}
|
|
66
|
+
to={createPath({ resource, type: 'create' })}
|
|
67
|
+
state={state}
|
|
68
|
+
className={clsx(CreateButtonClasses.root, className)}
|
|
69
|
+
label={label}
|
|
70
|
+
variant={variant}
|
|
71
|
+
{...(rest as any)}
|
|
72
|
+
{...linkParams}
|
|
73
|
+
>
|
|
74
|
+
{icon}
|
|
75
|
+
</StyledButton>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const defaultIcon = <ContentAdd />;
|
|
80
|
+
|
|
81
|
+
// avoids using useMemo to get a constant value for the link state
|
|
82
|
+
const scrollStates = new Map([
|
|
83
|
+
['true', { _scrollToTop: true }],
|
|
84
|
+
['false', {}]
|
|
85
|
+
]);
|
|
86
|
+
|
|
87
|
+
interface Props {
|
|
88
|
+
resource?: string;
|
|
89
|
+
icon?: React.ReactElement;
|
|
90
|
+
scrollToTop?: boolean;
|
|
91
|
+
to?: LocationDescriptor | To;
|
|
92
|
+
state?: any;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
interface DisableFloatingButtonProps {
|
|
96
|
+
disableFloatingButton?: boolean;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
type CreateButtonProps = DisableFloatingButtonProps & Props & Omit<ButtonProps, 'to'>;
|
|
100
|
+
|
|
101
|
+
CreateBtn.propTypes = {
|
|
102
|
+
resource: PropTypes.string,
|
|
103
|
+
className: PropTypes.string,
|
|
104
|
+
icon: PropTypes.element,
|
|
105
|
+
label: PropTypes.string
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const PREFIX = 'RaCreateButton';
|
|
109
|
+
|
|
110
|
+
const CreateButtonClasses = {
|
|
111
|
+
root: `${PREFIX}-root`,
|
|
112
|
+
floating: `${PREFIX}-floating`
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const StyledFab = styled(Fab, {
|
|
116
|
+
name: PREFIX,
|
|
117
|
+
overridesResolver: (_props, styles) => styles.root
|
|
118
|
+
})(({ theme }) => ({
|
|
119
|
+
[`&.${CreateButtonClasses.floating}`]: {
|
|
120
|
+
color: theme.palette.getContrastText(theme.palette.primary.main),
|
|
121
|
+
margin: 0,
|
|
122
|
+
top: 'auto',
|
|
123
|
+
right: 20,
|
|
124
|
+
bottom: 60,
|
|
125
|
+
left: 'auto',
|
|
126
|
+
position: 'fixed',
|
|
127
|
+
zIndex: 1000
|
|
128
|
+
}
|
|
129
|
+
})) as unknown as typeof Fab;
|
|
130
|
+
|
|
131
|
+
const StyledButton = styled(Button, {
|
|
132
|
+
name: PREFIX,
|
|
133
|
+
overridesResolver: (_props, styles) => styles.root
|
|
134
|
+
})({});
|
|
135
|
+
|
|
136
|
+
function arePropsEqual(prevProps: CreateButtonProps, nextProps: CreateButtonProps) {
|
|
137
|
+
return (
|
|
138
|
+
prevProps.resource === nextProps.resource &&
|
|
139
|
+
prevProps.label === nextProps.label &&
|
|
140
|
+
prevProps.translate === nextProps.translate &&
|
|
141
|
+
prevProps.disabled === nextProps.disabled &&
|
|
142
|
+
isEqual(prevProps.to, nextProps.to) &&
|
|
143
|
+
isEqual(prevProps.state, nextProps.state)
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const CreateButton = React.memo(CreateBtn, arePropsEqual);
|
|
148
|
+
|
|
149
|
+
function getLinkParams(locationDescriptor?: LocationDescriptor | string) {
|
|
150
|
+
// eslint-disable-next-line eqeqeq
|
|
151
|
+
if (locationDescriptor == undefined) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (typeof locationDescriptor === 'string') {
|
|
156
|
+
return { to: locationDescriptor };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const { redirect, replace, state, ...to } = locationDescriptor;
|
|
160
|
+
return {
|
|
161
|
+
to,
|
|
162
|
+
redirect,
|
|
163
|
+
replace,
|
|
164
|
+
state
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export { CreateButton, CreateButtonClasses };
|
|
169
|
+
export type { CreateButtonProps };
|
|
@@ -13,7 +13,7 @@ interface CreateButtonProps {
|
|
|
13
13
|
children: React.ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
function
|
|
16
|
+
function TableCreateButton(props: CreateButtonProps): JSX.Element {
|
|
17
17
|
const { label, disableAdd, inset, source, template } = props;
|
|
18
18
|
const [open, setOpen] = React.useState(false);
|
|
19
19
|
const { append } = useArrayInput();
|
|
@@ -55,4 +55,4 @@ function CreateButton(props: CreateButtonProps): JSX.Element {
|
|
|
55
55
|
);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
export {
|
|
58
|
+
export { TableCreateButton };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Field } from './Field';
|
|
2
2
|
import { AddTableRow } from './AddTableRow';
|
|
3
|
-
import {
|
|
3
|
+
import { TableCreateButton } from './TableCreateButton';
|
|
4
4
|
import { EditButton } from './EditButton';
|
|
5
5
|
import { ActionsMenu } from '@/components/ActionsMenu';
|
|
6
6
|
import { TableFormIteratorContext } from '@/components/ra-forms/TableForm/TableFormIteratorContext';
|
|
@@ -147,7 +147,8 @@ function RawTableFormIterator(props: TableFormIteratorProps): ReactElement | nul
|
|
|
147
147
|
const basicStyles =
|
|
148
148
|
inset === true
|
|
149
149
|
? {
|
|
150
|
-
borderRadius: 0
|
|
150
|
+
borderRadius: 0,
|
|
151
|
+
borderBottom: `1px solid ${theme.palette.divider}`
|
|
151
152
|
}
|
|
152
153
|
: {
|
|
153
154
|
mt: 2,
|
|
@@ -166,7 +167,7 @@ function RawTableFormIterator(props: TableFormIteratorProps): ReactElement | nul
|
|
|
166
167
|
disableAdd,
|
|
167
168
|
template,
|
|
168
169
|
onClick:
|
|
169
|
-
addButton?.type !==
|
|
170
|
+
addButton?.type !== TableCreateButton
|
|
170
171
|
? handleAddButtonClick((props?.addButton as any)?.props?.onClick)
|
|
171
172
|
: undefined,
|
|
172
173
|
inset
|
|
@@ -348,7 +349,7 @@ type ITableForm = typeof TableFormIterator & {
|
|
|
348
349
|
* </Grid>
|
|
349
350
|
* </Grid>
|
|
350
351
|
*/
|
|
351
|
-
CreateButton: typeof
|
|
352
|
+
CreateButton: typeof TableCreateButton;
|
|
352
353
|
|
|
353
354
|
/**
|
|
354
355
|
* TableFormiterator allows a child EditButton which will render an edit button in the ActionsMenu of each row.
|
|
@@ -406,7 +407,7 @@ type ITableForm = typeof TableFormIterator & {
|
|
|
406
407
|
|
|
407
408
|
const DefaultTableForm = TableFormIterator as ITableForm;
|
|
408
409
|
|
|
409
|
-
DefaultTableForm.CreateButton =
|
|
410
|
+
DefaultTableForm.CreateButton = TableCreateButton;
|
|
410
411
|
DefaultTableForm.EditButton = EditButton;
|
|
411
412
|
DefaultTableForm.Field = Field;
|
|
412
413
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './AddTableRow';
|
|
2
|
-
export * from './CreateButton';
|
|
3
2
|
export * from './EditButton';
|
|
4
3
|
export * from './Field';
|
|
4
|
+
export * from './TableCreateButton';
|
|
5
5
|
export * from './TableFormIterator';
|
|
6
6
|
export * from './TableFormIteratorContext';
|
|
7
7
|
export * from './TableFormIteratorItem';
|
|
@@ -122,6 +122,9 @@ const StyledList = styled(RaList, { slot: 'root' })(({ theme }) => ({
|
|
|
122
122
|
minHeight: 80,
|
|
123
123
|
alignItems: 'center',
|
|
124
124
|
padding: theme.spacing(2.5),
|
|
125
|
+
[theme.breakpoints.down('sm')]: {
|
|
126
|
+
flexDirection: 'row'
|
|
127
|
+
},
|
|
125
128
|
'& form': {
|
|
126
129
|
alignItems: 'center',
|
|
127
130
|
minHeight: 'auto',
|
package/src/index.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CreateButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/ra-forms/TableForm/CreateButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAwC3D;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|