/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ import { observer, useFieldSchema } from '@formily/react'; import { CollectionContext, createStyles, css, DataSourceContext, DndContext, Icon, NocoBaseRecursionField, useBlockHeight, useDesignable, useOpenModeContext, useSchemaInitializerRender, withDynamicSchemaProps, } from '@nocobase/client'; import { Avatar, Space, theme } from 'antd'; import { Grid, List } from 'antd-mobile'; import React, { createContext } from 'react'; import { WorkbenchLayout } from './workbenchBlockSettings'; const ConfigureActionsButton = observer( () => { const fieldSchema = useFieldSchema(); const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); return render(); }, { displayName: 'WorkbenchConfigureActionsButton' }, ); function isMobile() { return window.matchMedia('(max-width: 768px)').matches; } const gap = 8; const ResponsiveSpace = () => { const fieldSchema = useFieldSchema(); const isMobileMedia = isMobile(); const { isMobile: underMobileCtx } = useOpenModeContext() || {}; const { itemsPerRow = 4 } = fieldSchema.parent['x-decorator-props'] || {}; if (underMobileCtx || isMobileMedia) { return ( {fieldSchema.mapProperties((s, key) => { return ; })} ); } return ( {fieldSchema.mapProperties((s, key) => { return ; })} ); }; const InternalIcons = () => { const fieldSchema = useFieldSchema(); const { layout = WorkbenchLayout.Grid } = fieldSchema.parent['x-component-props'] || {}; return (
{layout === WorkbenchLayout.Grid ? ( ) : ( {fieldSchema.mapProperties((s, key) => { const icon = s['x-component-props']?.['icon']; const backgroundColor = s['x-component-props']?.['iconColor']; return ( } />} onClick={() => {}} style={{ marginTop: '5px' }} > ); })} )}
); }; export const WorkbenchBlockContext = createContext({ layout: 'grid', ellipsis: true }); const useStyles = createStyles(({ token, css }) => ({ containerClass: css` &.list { margin: -${token.paddingLG}px; border-radius: ${(token as any).borderRadiusBlock}px; overflow: hidden; .adm-list { --padding-left: ${token.paddingLG}px; --padding-right: ${token.paddingLG}px; .adm-list-item-content-main { display: flex; button { background-color: transparent; border: none; height: auto; box-shadow: none; padding: 16px 32px; margin: -12px -32px; width: calc(100% + 64px); text-align: start; justify-content: start !important; color: ${token.colorText}; } } } button[aria-label*='schema-initializer-WorkbenchBlock.ActionBar-workbench:configureActions'] { margin-bottom: ${token.paddingLG}px; margin-left: ${token.paddingLG}px; } } `, })); export const WorkbenchBlock: any = withDynamicSchemaProps( (props) => { const fieldSchema = useFieldSchema(); const { layout = 'grid', ellipsis } = fieldSchema['x-component-props'] || {}; const { styles } = useStyles(); const { title } = fieldSchema['x-decorator-props'] || {}; const targetHeight = useBlockHeight(); const { token } = theme.useToken(); const { designable } = useDesignable(); const titleHeight = title ? token.fontSizeLG * token.lineHeightLG + token.padding * 2 : 0; let containerHeight = targetHeight - 2 * token.paddingLG - titleHeight; // 减去 1rem 的 margin,减去 padding,减去按钮高度,给 Initializer 按钮留出空间 let wrapperHeight = `calc(${containerHeight}px - 1rem - ${token.controlHeight}px)`; if (layout === 'list') { // list 有一个负的 margin containerHeight = targetHeight - titleHeight; wrapperHeight = `calc(${containerHeight}px - 1rem - ${token.controlHeight + token.paddingLG}px)`; } const heightClass = css` height: ${targetHeight ? containerHeight + 'px' : '100%'}; .nb-action-panel-warp { height: ${designable ? wrapperHeight : '100%'}; overflow-y: auto; } `; return (
{props.children}
); }, { displayName: 'WorkbenchBlock' }, ); WorkbenchBlock.ActionBar = () => { return ( <> ); };