0

我正在使用 KeystoneJS v6。我正在尝试启用允许我在另一个列表中使用时重新排列图像位置的功能。目前我正在设置下面的图像列表,但是由于粘贴的错误,我无法将其设置为defaultIsOrderabletrue

KeystoneJS 列表:

  Image: list({
    fields: {
      title: text({
        validation: { isRequired: true },
        isIndexed: 'unique',
        isFilterable: true,
        isOrderable: true,
      }),
      images: cloudinaryImage({
        cloudinary: {
          cloudName: process.env.CLOUDINARY_CLOUD_NAME,
          apiKey: process.env.CLOUDINARY_API_KEY,
          apiSecret: process.env.CLOUDINARY_API_SECRET,
          folder: process.env.CLOUDINARY_API_FOLDER,
        },
      }),
    },
    defaultIsOrderable: true
  }),

错误信息:

The expected type comes from property 'defaultIsOrderable' which is declared here on type 'ListConfig<BaseListTypeInfo, BaseFields<BaseListTypeInfo>>'

偷看定义字段显示

defaultIsOrderable?: false | ((args: FilterOrderArgs<ListTypeInfo>) => MaybePromise<boolean>);
4

1 回答 1

0

查看架构 API 文档defaultIsOrderable您可以设置:

[...] 用于isOrderable此列表中的字段的默认值。

您正在尝试将其设置为,true但根据字段 docs的相关部分,isOrderable字段选项已默认为true. 我相信这就是为什么defaultIsOrderable类型不允许你提供true文字的原因——这样做是多余的。

所以这解释了你得到的具体错误,但我认为你也可能误解了该orderBy选项的目的。

OrderBy选项_

field docs提到了 fieldOrderBy选项的两个影响:

如果true(默认),GraphQL API 和管理 UI 将支持按此字段排序。

以您上面的列表为例Image。由于该title字段是“可订购的”,因此它包含在列表的orderByGraphQL 类型 ( ImageOrderByInput) 中。查询列表时,您可以按此字段中的值对结果进行排序,如下所示:

query {
  images (orderBy: [{ title: desc }]) {
    id
    title
    images { publicUrl }
  }
}

GraphQL API 文档对此有一些详细信息。

在管理 UI 中列出项目时,您还可以使用该字段对项目进行排序,方法是单击列标题或从“排序”下拉列表中选择字段:

Keystone 列表视图订购选项

但请注意,这些功能在运行时通过存储在可订购字段中的值对项目进行排序。他们不允许管理员在管理 UI 中“重新排序”项目(除非您在这种情况下通过更改图像标题来这样做)。

指定订单

如果要设置列表中项目的顺序,则需要将单独的值存储在例如这样的displayOrder字段中:

  Image: list({
    fields: {
      title: text({
        validation: { isRequired: true },
        isIndexed: 'unique',
        isFilterable: true,
      }),
      displayOrder: integer(),
      // ...
    },
  }),

不幸的是,Keystone 还没有为您提供管理此管理 UI 的好方法(即,您不能在列表视图或类似的东西中“拖放”)。您需要单独编辑每个项目以设置displayOrder值。

在关系中排序

我注意到您的问题说您正在尝试“在另一个列表中使用时重新排列图像的位置”(强调我的)。在这种情况下,您谈论的是关系,这在一定程度上改变了问题。一些方法是..

  • 如果关系是一对多,您可以使用displayOrder: integer()上面显示的解决方案,但 UX 再次变得更糟。您仍在为每个项目设置订单值,但不是在关系的上下文中。但是,基于这些订单值进行查询并通过 GraphQL API 设置它们应该是相当直接的。
  • 如果关系是多对多,则类似,但您不能将“displayOrder”值存储在Image列表中,因为任何一张图像都可能链接到多个其他项目。您需要将订单信息“与”关系本身存储起来。这不是微不足道的,但我最近关于在多对多关系上存储附加值的答案可能会为您指明正确的方向。
  • 第三种选择是根本不使用关系字段,而是使用该字段的联关系功能document链接项目。这有点不同 - 从管理 UI 更容易管理,但在 GraphQL 中功能较弱,因为您不能轻松地遍历关系。但是,它确实为您提供了一种以多对多关系管理一组小的、有序的相关项目的方法。
  • 您可以将一组有序的 id 保存到json字段中。这类似于使用document字段,但更手动。

希望这可以清除当前“orderBy”功能和关系选项的可能性。这些解决方案中的哪一个最合适在很大程度上取决于您的项目和用例的具体情况。

还要注意,有计划扩展 Keystone 的功能,从 DX 和 UX 角度对列表进行排序和重新排序。请参阅Keystone 路线图上的“可排序列表” 。

于 2022-01-05T01:48:20.497 回答