feat: support open mode sheet (#989)

Reviewed-on: daoyoucloud/tachybase#989
This commit is contained in:
sealday 2024-05-15 17:06:52 +08:00
parent 098ff4de0c
commit 04a6f3f09a
5 changed files with 89 additions and 1 deletions

View File

@ -2,6 +2,7 @@ import { observer, RecursionField, useField, useFieldSchema } from '@tachybase/s
import React from 'react'; import React from 'react';
import { useActionContext } from '.'; import { useActionContext } from '.';
import { ActionDrawer } from './Action.Drawer'; import { ActionDrawer } from './Action.Drawer';
import { ActionSheet } from './Action.Sheet';
import { ActionModal } from './Action.Modal'; import { ActionModal } from './Action.Modal';
import { ActionPage } from './Action.Page'; import { ActionPage } from './Action.Page';
import { ComposedActionDrawer } from './types'; import { ComposedActionDrawer } from './types';
@ -15,6 +16,9 @@ export const ActionContainer: ComposedActionDrawer = observer(
if (openMode === 'modal') { if (openMode === 'modal') {
return <ActionModal footerNodeName={'Action.Container.Footer'} {...props} />; return <ActionModal footerNodeName={'Action.Container.Footer'} {...props} />;
} }
if (openMode === 'sheet') {
return <ActionSheet footerNodeName={'Action.Container.Footer'} {...props} />;
}
return <ActionPage footerNodeName={'Action.Container.Footer'} {...props} />; return <ActionPage footerNodeName={'Action.Container.Footer'} {...props} />;
}, },
{ displayName: 'ActionContainer' }, { displayName: 'ActionContainer' },

View File

@ -0,0 +1,78 @@
import { observer, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import { Button, Drawer, Space } from 'antd';
import classNames from 'classnames';
import React from 'react';
import { OpenSize } from '.';
import { useStyles } from './Action.Drawer.style';
import { useActionContext } from './hooks';
import { ComposedActionDrawer } from './types';
import { css } from '@emotion/css';
import { useTranslation } from 'react-i18next';
export const ActionSheet: ComposedActionDrawer = observer(
(props) => {
const { footerNodeName = 'Action.Drawer.Footer', ...others } = props;
const { t } = useTranslation();
const { visible, setVisible, drawerProps } = useActionContext();
const schema = useFieldSchema();
const field = useField();
const { componentCls, hashId } = useStyles();
const footerSchema = schema.reduceProperties((buf, s) => {
if (s['x-component'] === footerNodeName) {
return s;
}
return buf;
});
return (
<Drawer
placement="bottom"
height="100%"
title={field.title}
{...others}
{...drawerProps}
rootStyle={{
...drawerProps?.style,
...others?.style,
}}
destroyOnClose
open={visible}
onClose={() => setVisible(false, true)}
rootClassName={classNames(componentCls, hashId, drawerProps?.className, others.className, 'reset')}
footer={
<Space
className={css`
width: 100%;
justify-content: flex-end;
`}
>
<Button type="primary" onClick={() => setVisible(false, true)}>
{t('Close')}
</Button>
</Space>
}
>
<RecursionField
basePath={field.address}
schema={schema}
onlyRenderProperties
filterProperties={(s) => {
return s['x-component'] !== footerNodeName;
}}
/>
</Drawer>
);
},
{ displayName: 'ActionDrawer' },
);
ActionSheet.Footer = observer(
() => {
const field = useField();
const schema = useFieldSchema();
return <RecursionField basePath={field.address} schema={schema} onlyRenderProperties />;
},
{ displayName: 'ActionDrawer.Footer' },
);
export default ActionSheet;

View File

@ -22,7 +22,7 @@ export interface ActionContextProps {
button?: any; button?: any;
visible?: boolean; visible?: boolean;
setVisible?: (v: boolean) => void; setVisible?: (v: boolean) => void;
openMode?: 'drawer' | 'modal' | 'page'; openMode?: 'drawer' | 'modal' | 'page' | 'sheet';
snapshot?: boolean; snapshot?: boolean;
openSize?: OpenSize; openSize?: OpenSize;
containerRefKey?: string; containerRefKey?: string;

View File

@ -99,6 +99,8 @@ export const SchemaSettingOpenModeSchemaItems: React.FC<Options> = (options) =>
options={[ options={[
{ label: t('Drawer'), value: 'drawer' }, { label: t('Drawer'), value: 'drawer' },
{ label: t('Dialog'), value: 'modal' }, { label: t('Dialog'), value: 'modal' },
{ label: t('Sheet'), value: 'sheet' },
{ label: t('Page'), value: 'page' },
]} ]}
value={openModeValue} value={openModeValue}
onChange={(value) => { onChange={(value) => {

View File

@ -173,3 +173,7 @@
transition: opacity 200ms, transform 200ms; transition: opacity 200ms, transform 200ms;
} }
// right to left animation start // right to left animation start
.menu-trigger {
height: 100%;
}