静态管理员:我们如何在

时间:2018-01-26 10:19:32

标签: admin-on-rest

我们需要3个不同的菜单项对同一资源(“资产”)执行CRUD操作,但所有 CRUD操作只有category_id不同(直到你再按一次不同的菜单项。)

为了做到这一点,我们引入了一个名为kind的查询参数,这是这三个链接中唯一的实际区别:

    <MenuItemLink
        to={{
            pathname: '/assets',
            search: stringify({page: 1, perPage: 25}),
        }}
        primaryText="Assets" 
        onClick={onMenuTap} 
        leftIcon={<AssetsIcon />} 
    />

    <MenuItemLink
        to={{
            pathname: '/assets',
            search: stringify({
                page: 1,
                perPage: 25,
                kind: 'printers'
            }),
        }}
        primaryText="Printers"
        onClick={onMenuTap}
        leftIcon={<AssetsIcon />}
    />

    <MenuItemLink
        to={{
            pathname: '/assets',
            search: stringify({
                page: 1,
                perPage: 25,
                kind: 'vehicles'
            }),
        }}
        primaryText="Vehicles"
        onClick={onMenuTap}
        leftIcon={<AssetsIcon />}
    />

通过以下代码,List仅为这些资产提取记录:

//注意:'parsedKind'是使用以前的代码解析grom查询参数,它获取以下值之一:''OR'打印机'或'车辆'

    <List
        title={<TitleList location={props.location} />}
        {...props}
        filters={<AssetFilter location={props.location} key={parsedKind} />}
        perPage={15}
        filter={{cat_id: dbIds[parsedKind]}}
        sort={{field: 'name', order: 'ASC'}}
        actions={<OurCustomListActions parsedKind={parsedKind} {...props} />}
        key={parsedKind}
    >

为了实现这一点,我们必须使用自定义按钮自定义“操作”,以便parsedKind跟进。例如,CreateButton现在需要道具ourQuery

   <FlatButton
        primary
        label={label && translate(label)}
        icon={<ContentAdd />}
        containerElement={<Link to={`${basePath}/create?${ourQuery}`} />}
        style={styles.flat}
    />

我在这里有3个问题:

  1. 这是一项繁琐的工作(所有按钮都已定制),我想知道是否有其他解决方案可以满足这一需求。

  2. 仍然,“SaveButton”会导致头痛,因为它使用来自handleSubmitWithRedirect的{​​{1}}函数,参数只是视图的名称(例如'list') 。那么如何在最终的URL上添加查询参数呢?我在2秒后使用了一个丑陋的propssetTimeout),但显然这是非常错误的。 window.location.hash = window.location.hash + '?' + this.props.ourQuery;也存在问题,因为它会重定向到子视图。

  3. 使用上述方法,我在List分页中得到DeleteButton。为什么?这也能以某种方式解决吗?

  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

因此,我认为您最好的选择就是创建三种资源:AssetsVehiclesPrinters。 在restClient / dataProvider中,创建逻辑以使用正确的assets将这三个资源路由到parameter端点。我简单的中间件就足够了,就行了:

// MyAssetResourceMiddleware.js
export default restClient => (type, resource, params) => {
     switch(resource){
        case 'Assets':
        case 'Vehicles':
        case 'Printers':
          return restClient(type,'assets',{...params,kind:resource});
        default: 
          return restClient(type,resource,params);
     }    
}

用你的提供者包装

<Admin dataProvider={MyAssetResourceMiddleware(dataProvider)} .../>