diff --git a/gh-pages/audio.html b/gh-pages/audio.html index 53f23d37..d55c6f6d 100644 --- a/gh-pages/audio.html +++ b/gh-pages/audio.html @@ -25,10 +25,10 @@
- - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + \n

除了能弹框,它还能设定很多行为比如:提交表单、发送 ajax、页面跳转、关闭弹框、复制文本等等。

\n

通用配置项

所有actionType都支持的通用配置项

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
typestringaction指定为 Page 渲染器。
actionTypestring-【必填】这是 action 最核心的配置,来指定该 action 的作用类型,支持:ajaxlinkurldrawerdialogconfirmcancelprevnextcopyclose
labelstring-按钮文本。可用 ${xxx} 取值。
levelstringdefault按钮样式,支持:linkprimarysecondaryinfosuccesswarningdangerlightdarkdefault
sizestring-按钮大小,支持:xssmmdlg
iconstring-设置图标,例如fa fa-plus
iconClassNamestring-给图标上添加类名。
activeboolean-按钮是否高亮。
activeLevelstring-按钮高亮时的样式,配置支持同level
activeClassNamestringis-active给按钮高亮添加类名。
blockboolean-display:"block"来显示按钮。
confirmTextstring-当设置后,操作在开始前会询问用户。可用 ${xxx} 取值。
reloadstring-指定此次操作完后,需要刷新的目标组件名字(组件的name值,自己配置的),多个请用 , 号隔开。
tooltipstring-鼠标停留时弹出该段文字,也可以配置对象类型:字段为titlecontent。可用 ${xxx} 取值。
disabledTipstring-被禁用后鼠标停留时弹出该段文字,也可以配置对象类型:字段为titlecontent。可用 ${xxx} 取值。
tooltipPlacementstringtop如果配置了tooltip或者disabledTip,指定提示信息位置,可配置topbottomleftright
closeboolean-action配置在dialogdraweractions中时,配置为true指定此次操作完后关闭当前dialogdrawer
requiredArray<string>-配置字符串数组,指定在form中进行操作之前,需要指定的字段名的表单项通过验证
\n

下面会分别介绍每种类型的 Action 配置项

\n

ajax

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringajax发送请求
apistringApiObject-请求地址,参考 api 格式说明。
redirectstring-指定当前请求结束后跳转的路径,可用 ${xxx} 取值。
feedbackDialogObject-如果 ajax 类型的,当 ajax 返回正常后,还能接着弹出一个 dialog 做其他交互。返回的数据可用于这个 dialog 中。格式可参考Dialog
feedback.visibleOnstring-可以用来配置 feedback 弹框出现的条件。
feedback.skipRestOnCancelboolean-如果配置了,在 feedback 弹窗里面,如果用户点了取消,那么这个按钮的其他动作也不做了。
messagesobject-success:ajax 操作成功后提示,可以不指定,不指定时以 api 返回为准。failed:ajax 操作失败提示。
\n
\n

link

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringlink单页跳转
linkstringlink用来指定跳转地址,跟 url 不同的是,这是单页跳转方式,不会渲染浏览器,请指定 amis 平台内的页面。可用 ${xxx} 取值。
\n
\n

url

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringurl页面跳转
urlstring-按钮点击后,会打开指定页面。可用 ${xxx} 取值。
blankbooleanfalse如果为 true 将在新 tab 页面打开。
\n
\n

注意:由于 amis 平台内 http 地址会被替换成 proxy 地址,所以在 amis 平台内使用请加上 raw: 作为前缀。 比如:raw:http://www.baidu.com

\n

dialog

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringdialog点击后显示一个弹出框
dialogstringDialogObject-指定弹框内容,格式可参考Dialog
nextConditionboolean-可以用来设置下一条数据的条件,默认为 true
\n
\n

drawer

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringdrawer点击后显示一个侧边栏
drawerstringDrawerObject-指定弹框内容,格式可参考Drawer
\n
\n

copy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringcopy复制一段内容到粘贴板
contentstring-指定复制的内容。可用 ${xxx} 取值。
\n

reload

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringreload刷新目标组件
targetstring-需要刷新的目标组件名字(组件的name值,自己配置的),多个请用 , 号隔开。
\n

add

该 actionType 为FormItem-Table专用

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringadd给指定FormItem-Table添加一条数据,
targetstring-指定FormItem-Table的名字(Tablename值),多个请用 , 号隔开。
\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/Action.md
", + "toc": { + "label": "目录", + "type": "toc", + "children": [ + { + "label": "Action", + "fragment": "action", + "fullPath": "#action", + "level": 2, + "children": [ + { + "label": "通用配置项", + "fragment": "%E9%80%9A%E7%94%A8%E9%85%8D%E7%BD%AE%E9%A1%B9", + "fullPath": "#%E9%80%9A%E7%94%A8%E9%85%8D%E7%BD%AE%E9%A1%B9", + "level": 3 + }, + { + "label": "ajax", + "fragment": "ajax", + "fullPath": "#ajax", + "level": 3 + }, + { + "label": "link", + "fragment": "link", + "fullPath": "#link", + "level": 3 + }, + { + "label": "url", + "fragment": "url", + "fullPath": "#url", + "level": 3 + }, + { + "label": "dialog", + "fragment": "dialog", + "fullPath": "#dialog", + "level": 3 + }, + { + "label": "drawer", + "fragment": "drawer", + "fullPath": "#drawer", + "level": 3 + }, + { + "label": "copy", + "fragment": "copy", + "fullPath": "#copy", + "level": 3 + }, + { + "label": "reload", + "fragment": "reload", + "fullPath": "#reload", + "level": 3 + }, + { + "label": "add", + "fragment": "add", + "fullPath": "#add", + "level": 3 + } + ] + } + ], + "level": 0 + } + }; + +}); diff --git a/gh-pages/docs/renderers/Action_843aa7b.js b/gh-pages/docs/renderers/Action_843aa7b.js deleted file mode 100644 index 1e7c7c2d..00000000 --- a/gh-pages/docs/renderers/Action_843aa7b.js +++ /dev/null @@ -1,76 +0,0 @@ -define('docs/renderers/Action.md', function(require, exports, module) { - - module.exports = { - "html": "

Action

Action 是一种特殊的渲染器,它本身是一个按钮,同时它能触发事件。

\n
\n

除了能弹框,它还能设定很多行为比如:提交表单、发送 ajax、页面跳转、关闭弹框、复制文本等等。

\n

通用配置项

所有actionType都支持的通用配置项

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
typestringaction指定为 Page 渲染器。
actionTypestring-【必填】这是action最核心的配置,来指定该action的作用类型,支持:ajaxlinkurldrawerdialogconfirmcancelprevnextcopyclose
labelstring-按钮文本。可用 ${xxx} 取值。
levelstringdefault按钮样式,支持:linkprimarysecondaryinfosuccesswarningdangerlightdarkdefault
sizestring-按钮大小,支持:xssmmdlg
iconstring-设置图标,例如fa fa-plus
iconClassNamestring-给图标上添加类名。
activeboolean-按钮是否高亮。
activeLevelstring-按钮高亮时的样式,配置支持同level
activeClassNamestringis-active给按钮高亮添加类名。
blockboolean-display:"block"来显示按钮。
confirmTextstring-当设置后,操作在开始前会询问用户。可用 ${xxx} 取值。
reloadstring-指定此次操作完后,需要刷新的目标组件名字(组件的name值,自己配置的),多个请用 , 号隔开。
tooltipstring-鼠标停留时弹出该段文字,也可以配置对象类型:字段为titlecontent。可用 ${xxx} 取值。
disabledTipstring-被禁用后鼠标停留时弹出该段文字,也可以配置对象类型:字段为titlecontent。可用 ${xxx} 取值。
tooltipPlacementstringtop如果配置了tooltip或者disabledTip,指定提示信息位置,可配置topbottomleftright
closeboolean-action配置在dialogdraweractions中时,配置为true指定此次操作完后关闭当前dialogdrawer
requiredArray<string>-配置字符串数组,指定在form中进行操作之前,需要指定的字段名的表单项通过验证
\n

下面会分别介绍每种类型的Action配置项

\n

ajax

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringajax发送请求
apistringApiObject-请求地址,参考 api 格式说明。
redirectstring-指定当前请求结束后跳转的路径,可用 ${xxx} 取值。
feedbackDialogObject-如果 ajax 类型的,当 ajax 返回正常后,还能接着弹出一个 dialog 做其他交互。返回的数据可用于这个 dialog 中。格式可参考Dialog
messagesobject-success:ajax 操作成功后提示,可以不指定,不指定时以 api 返回为准。failed:ajax 操作失败提示。
\n
\n

link

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringlink单页跳转
linkstringlink用来指定跳转地址,跟 url 不同的是,这是单页跳转方式,不会渲染浏览器,请指定 amis 平台内的页面。可用 ${xxx} 取值。
\n
\n

url

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringurl页面跳转
urlstring-按钮点击后,会打开指定页面。可用 ${xxx} 取值。
blankbooleanfalse如果为 true 将在新tab页面打开。
\n
\n

注意:由于 amis 平台内 http 地址会被替换成 proxy 地址,所以在 amis 平台内使用请加上 raw: 作为前缀。 比如:raw:http://www.baidu.com

\n

dialog

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringdialog点击后显示一个弹出框
dialogstringDialogObject-指定弹框内容,格式可参考Dialog
nextConditionboolean-可以用来设置下一条数据的条件,默认为 true
\n
\n

drawer

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringdrawer点击后显示一个侧边栏
drawerstringDrawerObject-指定弹框内容,格式可参考Drawer
\n
\n

copy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringcopy复制一段内容到粘贴板
contentstring-指定复制的内容。可用 ${xxx} 取值。
\n

reload

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringreload刷新目标组件
targetstring-需要刷新的目标组件名字(组件的name值,自己配置的),多个请用 , 号隔开。
\n

add

该actionType为FormItem-Table专用

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
actionTypestringadd给指定FormItem-Table添加一条数据,
targetstring-指定FormItem-Table的名字(Tablename值),多个请用 , 号隔开。
\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/Action.md
", - "toc": { - "label": "目录", - "type": "toc", - "children": [ - { - "label": "Action", - "fragment": "action", - "fullPath": "#action", - "level": 2, - "children": [ - { - "label": "通用配置项", - "fragment": "%E9%80%9A%E7%94%A8%E9%85%8D%E7%BD%AE%E9%A1%B9", - "fullPath": "#%E9%80%9A%E7%94%A8%E9%85%8D%E7%BD%AE%E9%A1%B9", - "level": 3 - }, - { - "label": "ajax", - "fragment": "ajax", - "fullPath": "#ajax", - "level": 3 - }, - { - "label": "link", - "fragment": "link", - "fullPath": "#link", - "level": 3 - }, - { - "label": "url", - "fragment": "url", - "fullPath": "#url", - "level": 3 - }, - { - "label": "dialog", - "fragment": "dialog", - "fullPath": "#dialog", - "level": 3 - }, - { - "label": "drawer", - "fragment": "drawer", - "fullPath": "#drawer", - "level": 3 - }, - { - "label": "copy", - "fragment": "copy", - "fullPath": "#copy", - "level": 3 - }, - { - "label": "reload", - "fragment": "reload", - "fullPath": "#reload", - "level": 3 - }, - { - "label": "add", - "fragment": "add", - "fullPath": "#add", - "level": 3 - } - ] - } - ], - "level": 0 - } - }; - -}); diff --git a/gh-pages/docs/renderers/CRUD_1704b51.js b/gh-pages/docs/renderers/CRUD_1704b51.js deleted file mode 100644 index c5bdf575..00000000 --- a/gh-pages/docs/renderers/CRUD_1704b51.js +++ /dev/null @@ -1,72 +0,0 @@ -define('docs/renderers/CRUD.md', function(require, exports, module) { - - module.exports = { - "html": "

CRUD

增删改查模型,主要用来展现列表,并支持各类【增】【删】【改】【查】的操作。

\n

CRUD 支持三种模式:tablecardslist,默认为 table

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
typestringtype 指定为 CRUD 渲染器
modestring"table""table" 、 "cards" 或者 "list"
titlestring""可设置成空,当设置成空时,没有标题栏
classNamestring表格外层 Dom 的类名
apiApiCRUD 用来获取列表数据的 api。
loadDataOnceboolean是否一次性加载所有数据(前端分页)
loadDataOnceFetchOnFilterbooleantrue在开启loadDataOnce时,filter时是否去重新请求api
sourcestring数据映射接口返回某字段的值,不设置会默认把接口返回的items或者rows填充进mode区域
filterForm设置过滤器,当该表单提交后,会把数据带给当前 mode 刷新列表。
filterTogglablebooleanfalse是否可显隐过滤器
filterDefaultVisiblebooleantrue设置过滤器默认是否可见。
initFetchbooleantrue是否初始化的时候拉取数据, 只针对有 filter 的情况, 没有 filter 初始都会拉取数据
intervalnumber3000刷新时间(最低 3000)
silentPollingbooleanfalse配置刷新时是否隐藏加载动画
stopAutoRefreshWhenstring""通过表达式来配置停止刷新的条件
stopAutoRefreshWhenModalIsOpenbooleanfalse当有弹框时关闭自动刷新,关闭弹框又恢复
syncLocationbooleantrue是否将过滤条件的参数同步到地址栏
draggablebooleanfalse是否可通过拖拽排序
itemDraggableOnboolean表达式来配置是否可拖拽排序
saveOrderApiApi保存排序的 api。
quickSaveApiApi快速编辑后用来批量保存的 API。
quickSaveItemApiApi快速编辑配置成及时保存时使用的 API。
bulkActionsArray Of Action批量操作列表,配置后,表格可进行选中操作。
defaultCheckedbooleanfalse当可批量操作时,默认是否全部勾选。
messagesObject覆盖消息提示,如果不指定,将采用 api 返回的 message
messages.fetchFailedstring获取失败时提示
messages.saveOrderFailedstring保存顺序失败提示
messages.saveOrderSuccessstring保存顺序成功提示
messages.quickSaveFailedstring快速保存失败提示
messages.quickSaveSuccessstring快速保存成功提示
primaryFieldstring"id"设置 ID 字段名。
defaultParamsObject设置默认 filter 默认参数,会在查询的时候一起发给后端
pageFieldstring"page"设置分页页码字段名。
perPageFieldstring"perPage"设置分页一页显示的多少条数据的字段名。注意:最好与 defaultParams 一起使用,请看下面例子。
perPageAvailableArray<number>[5, 10, 20, 50, 100]设置一页显示多少条数据下拉框可选条数。
orderFieldstring设置用来确定位置的字段名,设置后新的顺序将被赋值到该字段中。
hideQuickSaveBtnbooleanfalse隐藏顶部快速保存提示
autoJumpToTopOnPagerChangebooleanfalse当切分页的时候,是否自动跳顶部。
syncResponse2Querybooleantrue将返回数据同步到过滤器上。
keepItemSelectionOnPageChangebooleantrue保留条目选择,默认分页、搜素后,用户选择条目会被清空,开启此选项后会保留用户选择,可以实现跨页面批量操作。
labelTplstring单条描述模板,keepItemSelectionOnPageChange设置为true后会把所有已选择条目列出来,此选项可以用来定制条目展示文案。
headerToolbarArray['bulkActions', 'pagination']顶部工具栏配置
footerToolbarArray['statistics', 'pagination']底部工具栏配置
\n

接口说明

开始之前请你先阅读整体要求

\n

api

用来返回列表数据。

\n

发送:

\n

可能会包含以下信息。

\n\n

另外如果 CRUD 配置了 Filter,即过滤器表单,表单里面的数据也会自动 merge 到这个请求里面。前提是:你没有干预接口参数。

\n

什么意思?来个对比 /api/xxxx/api/xxxx?a=${a}。第二个配置方式就是干预了,如果你配置接口的时候有明确指定要发送什么参数,那么 amis 则不再默认把所有你可能要的参数都发过去了。这个时候如果想要接收原来的那些参数,你需要进一步配置 api,把你需要的参数写上如:/api/xxxx?a=${a}&page=${page}&perPage=${perPage}

\n

响应:

\n

常规返回格式如下:

\n
{\n  \"status\": 0,\n  \"msg\": \"\",\n  \"data\": {\n    \"items\": [\n        { // 每个成员的数据。\n            \"id\": 1,\n            \"xxx\": \"xxxx\"\n        }\n    ],\n\n    \"total\": 200 // 注意这里不是当前请求返回的 items 的长度,而是一共有多少条数据,用于生成分页,\n    // 如果你不想要分页,把这个不返回就可以了。\n  }\n}\n
\n

如果无法知道数据总条数,只能知道是否有下一页,请返回如下格式,AMIS 会简单生成一个简单版本的分页控件。

\n
{\n  \"status\": 0,\n  \"msg\": \"\",\n  \"data\": {\n    \"items\": [\n        { // 每个成员的数据。\n            \"id\": 1,\n            \"xxx\": \"xxxx\"\n        }\n    ],\n\n    \"hasNext\": true // 是否有下一页。\n  }\n}\n
\n

如果不需要分页,或者配置了 loadDataOnce 则可以忽略掉 totalhasNext 参数。

\n

saveOrderApi

用来保存新的顺序,配置了 draggable 后会通过这个接口保存结果。

\n

发送:

\n

发送方式默认为 POST 会包含以下信息。

\n\n

发送数据多了?amis 只能猜你可能需要什么格式化的数据,api 不是可以配置数据映射吗?你可以通过 data 指定只发送什么如:

\n
{\n    \"saveOrderApi\": {\n        \"url\": \"/api/xxxx\",\n        \"data\": {\n            \"ids\": \"${ids}\"\n        }\n    }\n}\n
\n

这样就只会发送 ids 了。

\n

响应:

\n

响应没有什么特殊要求,只关注 status 状态。data 中返回了数据也不会影响结果集。默认调用完保存顺序接口会自动再调用一次 api 接口用来刷新数据。

\n

quickSaveApi

用来保存快速编辑结果,当 crud 的列配置快速保存时会调用进来。

\n

发送:

\n

发送方式默认为 POST 会包含以下信息。

\n\n

默认发送的数据有点多,不过可以通过api的数据映射自己选择需要的部分。

\n

响应:

\n

响应没有什么特殊要求,只关注 status 状态。

\n

quickSaveItemApi

跟 quickSaveApi 不一样的地方在于当你配置快速保存为立即保存的时候,优先使用此接口。因为只会保存单条数据,所以发送格式会不一样,直接就是整个更新后的成员数据。

\n

发送:

\n

POST payload 中就是更新后的成员数据。

\n

响应:

\n

响应没有什么特殊要求,只关注 status 状态。

\n

单条操作

当操作对象是单条数据时这类操作叫单条操作,比如:编辑、删除、通过、拒绝等等。CRUD 的 table 模式可以在 column 通过放置按钮来完成(其他模式参考 table 模式)。比如编辑就是添加个按钮行为是弹框类型的按钮或者添加一个页面跳转类型的按钮把当前行数据的 id 放在 query 中传过去、删除操作就是配置一个按钮行为是 AJAX 类型的按钮,将数据通过 api 发送给后端完成。

\n

CRUD 中不限制有多少个单条操作、添加一个操作对应的添加一个按钮就行了。CRUD 在处理按钮行为的时候会把当前行的完整数据传递过去,如果你的按钮行为是弹出时,还会包含一下信息:

\n\n

如果你的按钮类型是 AJAX,你也可以限定只发送部分数据比如。

\n
{\n    \"type\": \"button\",\n    \"label\": \"删除\",\n    \"actionType\": \"ajax\",\n    \"api\": \"delete:/api/xxxx/$id\",\n    \"confirmText\": \"确定要删除?\"\n}\n
\n

上面这个例子就会发送 id 字段了,如果想要全部发送过去同时还想添加点别的字段就这样:

\n
{\n    \"type\": \"button\",\n    \"label\": \"删除\",\n    \"actionType\": \"ajax\",\n    \"api\": {\n        \"method\": \"post\",\n        \"url\": \"/api/xxxx/$id\",\n        \"data\": {\n            \"&\": \"$$\",\n            \"op\": \"delete\"\n        }\n    },\n    \"confirmText\": \"确定要删除?\"\n}\n
\n

这取决于 api 怎么配置,关于 api 的配置说明请前往这

\n

批量操作

当操作对象是多条数据时这类操作叫批量操作、跟单条操作类似,将按钮放在 crud 的 bulkActions 中即可, 添加 bulkActions 后列表会自动出现选择框。CRUD 会准备以下数据供按钮行为使用。

\n\n

快速编辑

列信息中可以配置 quickEdit 属性来启动快速编辑功能、开启后当鼠标hover到对应的行时,会出现一个编辑的小图标,点开后弹出表单项完成编辑。保存的结果不会立即发送 api 完成保存,除非你配置了立即保存,当所有的编辑都完成了,可以点击表格顶部的提交按钮,crud 将通过 quickSaveApi 通知后端完成保存。更多信息请看 quickSaveApi 和 quickSaveItemApi 的说明。

\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/CRUD.md
", - "toc": { - "label": "目录", - "type": "toc", - "children": [ - { - "label": "CRUD", - "fragment": "crud", - "fullPath": "#crud", - "level": 2, - "children": [ - { - "label": "接口说明", - "fragment": "%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E", - "fullPath": "#%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E", - "level": 3, - "children": [ - { - "label": "api", - "fragment": "api", - "fullPath": "#api", - "level": 4 - }, - { - "label": "saveOrderApi", - "fragment": "saveorderapi", - "fullPath": "#saveorderapi", - "level": 4 - }, - { - "label": "quickSaveApi", - "fragment": "quicksaveapi", - "fullPath": "#quicksaveapi", - "level": 4 - }, - { - "label": "quickSaveItemApi", - "fragment": "quicksaveitemapi", - "fullPath": "#quicksaveitemapi", - "level": 4 - } - ] - }, - { - "label": "单条操作", - "fragment": "%E5%8D%95%E6%9D%A1%E6%93%8D%E4%BD%9C", - "fullPath": "#%E5%8D%95%E6%9D%A1%E6%93%8D%E4%BD%9C", - "level": 3 - }, - { - "label": "批量操作", - "fragment": "%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C", - "fullPath": "#%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C", - "level": 3 - }, - { - "label": "快速编辑", - "fragment": "%E5%BF%AB%E9%80%9F%E7%BC%96%E8%BE%91", - "fullPath": "#%E5%BF%AB%E9%80%9F%E7%BC%96%E8%BE%91", - "level": 3 - } - ] - } - ], - "level": 0 - } - }; - -}); diff --git a/gh-pages/docs/renderers/CRUD_2cd8a2f.js b/gh-pages/docs/renderers/CRUD_2cd8a2f.js new file mode 100644 index 00000000..e5ed968f --- /dev/null +++ b/gh-pages/docs/renderers/CRUD_2cd8a2f.js @@ -0,0 +1,72 @@ +define('docs/renderers/CRUD.md', function(require, exports, module) { + + module.exports = { + "html": "

CRUD

增删改查模型,主要用来展现列表,并支持各类【增】【删】【改】【查】的操作。

\n

CRUD 支持三种模式:tablecardslist,默认为 table

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
属性名类型默认值说明
typestringtype 指定为 CRUD 渲染器
modestring"table""table" 、 "cards" 或者 "list"
titlestring""可设置成空,当设置成空时,没有标题栏
classNamestring表格外层 Dom 的类名
apiApiCRUD 用来获取列表数据的 api。
loadDataOnceboolean是否一次性加载所有数据(前端分页)
loadDataOnceFetchOnFilterbooleantrue在开启 loadDataOnce 时,filter 时是否去重新请求 api
sourcestring数据映射接口返回某字段的值,不设置会默认把接口返回的items或者rows填充进mode区域
filterForm设置过滤器,当该表单提交后,会把数据带给当前 mode 刷新列表。
filterTogglablebooleanfalse是否可显隐过滤器
filterDefaultVisiblebooleantrue设置过滤器默认是否可见。
initFetchbooleantrue是否初始化的时候拉取数据, 只针对有 filter 的情况, 没有 filter 初始都会拉取数据
intervalnumber3000刷新时间(最低 3000)
silentPollingbooleanfalse配置刷新时是否隐藏加载动画
stopAutoRefreshWhenstring""通过表达式来配置停止刷新的条件
stopAutoRefreshWhenModalIsOpenbooleanfalse当有弹框时关闭自动刷新,关闭弹框又恢复
syncLocationbooleantrue是否将过滤条件的参数同步到地址栏
draggablebooleanfalse是否可通过拖拽排序
itemDraggableOnboolean表达式来配置是否可拖拽排序
saveOrderApiApi保存排序的 api。
quickSaveApiApi快速编辑后用来批量保存的 API。
quickSaveItemApiApi快速编辑配置成及时保存时使用的 API。
bulkActionsArray Of Action批量操作列表,配置后,表格可进行选中操作。
defaultCheckedbooleanfalse当可批量操作时,默认是否全部勾选。
messagesObject覆盖消息提示,如果不指定,将采用 api 返回的 message
messages.fetchFailedstring获取失败时提示
messages.saveOrderFailedstring保存顺序失败提示
messages.saveOrderSuccessstring保存顺序成功提示
messages.quickSaveFailedstring快速保存失败提示
messages.quickSaveSuccessstring快速保存成功提示
primaryFieldstring"id"设置 ID 字段名。
defaultParamsObject设置默认 filter 默认参数,会在查询的时候一起发给后端
pageFieldstring"page"设置分页页码字段名。
perPageFieldstring"perPage"设置分页一页显示的多少条数据的字段名。注意:最好与 defaultParams 一起使用,请看下面例子。
perPageAvailableArray<number>[5, 10, 20, 50, 100]设置一页显示多少条数据下拉框可选条数。
orderFieldstring设置用来确定位置的字段名,设置后新的顺序将被赋值到该字段中。
hideQuickSaveBtnbooleanfalse隐藏顶部快速保存提示
autoJumpToTopOnPagerChangebooleanfalse当切分页的时候,是否自动跳顶部。
syncResponse2Querybooleantrue将返回数据同步到过滤器上。
keepItemSelectionOnPageChangebooleantrue保留条目选择,默认分页、搜素后,用户选择条目会被清空,开启此选项后会保留用户选择,可以实现跨页面批量操作。
labelTplstring单条描述模板,keepItemSelectionOnPageChange设置为true后会把所有已选择条目列出来,此选项可以用来定制条目展示文案。
headerToolbarArray['bulk-actions', 'pagination']顶部工具栏配置, 可用控件: bulk-actionspaginatnionstatisticsswitch-per-pagefilter-toggler 或者放 tpl 或者 button 之类的渲染器控件。
footerToolbarArray['statistics', 'pagination']底部工具栏配置 , 可用控件: bulk-actionspaginatnionstatisticsswitch-per-pagefilter-toggler 或者放 tpl 或者 button 之类的渲染器控件。
\n

接口说明

开始之前请你先阅读整体要求

\n

api

用来返回列表数据。

\n

发送:

\n

可能会包含以下信息。

\n\n

另外如果 CRUD 配置了 Filter,即过滤器表单,表单里面的数据也会自动 merge 到这个请求里面。前提是:你没有干预接口参数。

\n

什么意思?来个对比 /api/xxxx/api/xxxx?a=${a}。第二个配置方式就是干预了,如果你配置接口的时候有明确指定要发送什么参数,那么 amis 则不再默认把所有你可能要的参数都发过去了。这个时候如果想要接收原来的那些参数,你需要进一步配置 api,把你需要的参数写上如:/api/xxxx?a=${a}&page=${page}&perPage=${perPage}

\n

响应:

\n

常规返回格式如下:

\n
{\n  \"status\": 0,\n  \"msg\": \"\",\n  \"data\": {\n    \"items\": [\n      {\n        // 每个成员的数据。\n        \"id\": 1,\n        \"xxx\": \"xxxx\"\n      }\n    ],\n\n    \"total\": 200 // 注意这里不是当前请求返回的 items 的长度,而是一共有多少条数据,用于生成分页,\n    // 如果你不想要分页,把这个不返回就可以了。\n  }\n}\n
\n

如果无法知道数据总条数,只能知道是否有下一页,请返回如下格式,AMIS 会简单生成一个简单版本的分页控件。

\n
{\n  \"status\": 0,\n  \"msg\": \"\",\n  \"data\": {\n    \"items\": [\n      {\n        // 每个成员的数据。\n        \"id\": 1,\n        \"xxx\": \"xxxx\"\n      }\n    ],\n\n    \"hasNext\": true // 是否有下一页。\n  }\n}\n
\n

如果不需要分页,或者配置了 loadDataOnce 则可以忽略掉 totalhasNext 参数。

\n

saveOrderApi

用来保存新的顺序,配置了 draggable 后会通过这个接口保存结果。

\n

发送:

\n

发送方式默认为 POST 会包含以下信息。

\n\n

发送数据多了?amis 只能猜你可能需要什么格式化的数据,api 不是可以配置数据映射吗?你可以通过 data 指定只发送什么如:

\n
{\n  \"saveOrderApi\": {\n    \"url\": \"/api/xxxx\",\n    \"data\": {\n      \"ids\": \"${ids}\"\n    }\n  }\n}\n
\n

这样就只会发送 ids 了。

\n

响应:

\n

响应没有什么特殊要求,只关注 status 状态。data 中返回了数据也不会影响结果集。默认调用完保存顺序接口会自动再调用一次 api 接口用来刷新数据。

\n

quickSaveApi

用来保存快速编辑结果,当 crud 的列配置快速保存时会调用进来。

\n

发送:

\n

发送方式默认为 POST 会包含以下信息。

\n\n

默认发送的数据有点多,不过可以通过 api 的数据映射自己选择需要的部分。

\n

响应:

\n

响应没有什么特殊要求,只关注 status 状态。

\n

quickSaveItemApi

跟 quickSaveApi 不一样的地方在于当你配置快速保存为立即保存的时候,优先使用此接口。因为只会保存单条数据,所以发送格式会不一样,直接就是整个更新后的成员数据。

\n

发送:

\n

POST payload 中就是更新后的成员数据。

\n

响应:

\n

响应没有什么特殊要求,只关注 status 状态。

\n

单条操作

当操作对象是单条数据时这类操作叫单条操作,比如:编辑、删除、通过、拒绝等等。CRUD 的 table 模式可以在 column 通过放置按钮来完成(其他模式参考 table 模式)。比如编辑就是添加个按钮行为是弹框类型的按钮或者添加一个页面跳转类型的按钮把当前行数据的 id 放在 query 中传过去、删除操作就是配置一个按钮行为是 AJAX 类型的按钮,将数据通过 api 发送给后端完成。

\n

CRUD 中不限制有多少个单条操作、添加一个操作对应的添加一个按钮就行了。CRUD 在处理按钮行为的时候会把当前行的完整数据传递过去,如果你的按钮行为是弹出时,还会包含一下信息:

\n\n

如果你的按钮类型是 AJAX,你也可以限定只发送部分数据比如。

\n
{\n  \"type\": \"button\",\n  \"label\": \"删除\",\n  \"actionType\": \"ajax\",\n  \"api\": \"delete:/api/xxxx/$id\",\n  \"confirmText\": \"确定要删除?\"\n}\n
\n

上面这个例子就会发送 id 字段了,如果想要全部发送过去同时还想添加点别的字段就这样:

\n
{\n  \"type\": \"button\",\n  \"label\": \"删除\",\n  \"actionType\": \"ajax\",\n  \"api\": {\n    \"method\": \"post\",\n    \"url\": \"/api/xxxx/$id\",\n    \"data\": {\n      \"&\": \"$$\",\n      \"op\": \"delete\"\n    }\n  },\n  \"confirmText\": \"确定要删除?\"\n}\n
\n

这取决于 api 怎么配置,关于 api 的配置说明请前往这

\n

批量操作

当操作对象是多条数据时这类操作叫批量操作、跟单条操作类似,将按钮放在 crud 的 bulkActions 中即可, 添加 bulkActions 后列表会自动出现选择框。CRUD 会准备以下数据供按钮行为使用。

\n\n

快速编辑

列信息中可以配置 quickEdit 属性来启动快速编辑功能、开启后当鼠标 hover 到对应的行时,会出现一个编辑的小图标,点开后弹出表单项完成编辑。保存的结果不会立即发送 api 完成保存,除非你配置了立即保存,当所有的编辑都完成了,可以点击表格顶部的提交按钮,crud 将通过 quickSaveApi 通知后端完成保存。更多信息请看 quickSaveApi 和 quickSaveItemApi 的说明。

\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/CRUD.md
", + "toc": { + "label": "目录", + "type": "toc", + "children": [ + { + "label": "CRUD", + "fragment": "crud", + "fullPath": "#crud", + "level": 2, + "children": [ + { + "label": "接口说明", + "fragment": "%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E", + "fullPath": "#%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E", + "level": 3, + "children": [ + { + "label": "api", + "fragment": "api", + "fullPath": "#api", + "level": 4 + }, + { + "label": "saveOrderApi", + "fragment": "saveorderapi", + "fullPath": "#saveorderapi", + "level": 4 + }, + { + "label": "quickSaveApi", + "fragment": "quicksaveapi", + "fullPath": "#quicksaveapi", + "level": 4 + }, + { + "label": "quickSaveItemApi", + "fragment": "quicksaveitemapi", + "fullPath": "#quicksaveitemapi", + "level": 4 + } + ] + }, + { + "label": "单条操作", + "fragment": "%E5%8D%95%E6%9D%A1%E6%93%8D%E4%BD%9C", + "fullPath": "#%E5%8D%95%E6%9D%A1%E6%93%8D%E4%BD%9C", + "level": 3 + }, + { + "label": "批量操作", + "fragment": "%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C", + "fullPath": "#%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C", + "level": 3 + }, + { + "label": "快速编辑", + "fragment": "%E5%BF%AB%E9%80%9F%E7%BC%96%E8%BE%91", + "fullPath": "#%E5%BF%AB%E9%80%9F%E7%BC%96%E8%BE%91", + "level": 3 + } + ] + } + ], + "level": 0 + } + }; + +}); diff --git a/gh-pages/docs/renderers/Form/NestedSelect_0968a6c.js b/gh-pages/docs/renderers/Form/NestedSelect_0968a6c.js deleted file mode 100644 index 12d9c1be..00000000 --- a/gh-pages/docs/renderers/Form/NestedSelect_0968a6c.js +++ /dev/null @@ -1,20 +0,0 @@ -define('docs/renderers/Form/NestedSelect.md', function(require, exports, module) { - - module.exports = { - "html": "

NestedSelect

树形结构选择框。

\n\n
\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/Form/NestedSelect.md
", - "toc": { - "label": "目录", - "type": "toc", - "children": [ - { - "label": "NestedSelect", - "fragment": "nestedselect", - "fullPath": "#nestedselect", - "level": 3 - } - ], - "level": 0 - } - }; - -}); diff --git a/gh-pages/docs/renderers/Form/NestedSelect_a35587a.js b/gh-pages/docs/renderers/Form/NestedSelect_a35587a.js new file mode 100644 index 00000000..c5842d6a --- /dev/null +++ b/gh-pages/docs/renderers/Form/NestedSelect_a35587a.js @@ -0,0 +1,20 @@ +define('docs/renderers/Form/NestedSelect.md', function(require, exports, module) { + + module.exports = { + "html": "

NestedSelect

嵌套选择框。

\n\n
\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/Form/NestedSelect.md
", + "toc": { + "label": "目录", + "type": "toc", + "children": [ + { + "label": "NestedSelect", + "fragment": "nestedselect", + "fullPath": "#nestedselect", + "level": 3 + } + ], + "level": 0 + } + }; + +}); diff --git a/gh-pages/docs/renderers/Form/array.html b/gh-pages/docs/renderers/Form/array.html index 53f23d37..d55c6f6d 100644 --- a/gh-pages/docs/renderers/Form/array.html +++ b/gh-pages/docs/renderers/Form/array.html @@ -25,10 +25,10 @@
- - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + \n

仔细看示例不难发现,语法跟 ejs 很像,<% 这里面是 js 语句 %>,所以只要会写 js,做页面渲染没有什么问题。另外以下是一些可用 js 方法。

\n\n

如:

\n
{\n  \"data\": {\n    \"user\": \"no one\"\n  },\n  \"body\": {\n    \"type\": \"tpl\",\n    \"tpl\": \"User: <%= formatDate(data.time, 'YYYY-MM-DD') %>\"\n  }\n}\n
\n

如果只想简单取下变量,可以用 $xxx 或者 ${xxx}。同时如果不指定渲染器类型,默认就是 tpl, 所以以上示例可以简化为。

\n
\n

取值支持多级,如果层级比较深可以用 . 来分割如: ${xx.xxx.xx}\n另外 $& 表示直接获取当前的 data

\n
\n
\n

注意:$xxx 与 <%= data.xxx %> 这两种语法不能同时使用,只有一种有效,所以不要交叉使用。

\n

通过 $xxx 取到的值,默认是会做 html 转义的,也就是说 $xxx 完全等价于 ${xxx | html}, 如果你想什么都不做,那么请这么写 ${xxx | raw}

\n

从上面的语法可以看出来,取值时是支持指定 filter 的,那么有哪些 filter 呢?

\n\n

组合使用。

\n\n

没有找到合适的?可以自定义 filter。如果是 AMIS 平台用户,可以将以下代码加入到自定义组件中,如果不是请想办法插入以下代码。

\n
import {registerFilter} from 'amis';\n\nregisterFilter('myfilter', (input: string) => `${input}Boom`);\n
\n

加入成功后就可以这样使用了 ${xxx | myfilter}。 如果 xxx 的值是 abc 那么输出将会是 abcBoom

\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/Tpl.md
", + "toc": { + "label": "目录", + "type": "toc", + "children": [ + { + "label": "Tpl", + "fragment": "tpl", + "fullPath": "#tpl", + "level": 2 + } + ], + "level": 0 + } + }; + +}); diff --git a/gh-pages/docs/renderers/Tpl_7eeef6d.js b/gh-pages/docs/renderers/Tpl_7eeef6d.js deleted file mode 100644 index c543086c..00000000 --- a/gh-pages/docs/renderers/Tpl_7eeef6d.js +++ /dev/null @@ -1,20 +0,0 @@ -define('docs/renderers/Tpl.md', function(require, exports, module) { - - module.exports = { - "html": "

Tpl

tpl 类型的渲染器支持用 JS 模板引擎来组织输出,采用的 lodash 的 template,关于语法部分,请前往 lodash 文档页面。

\n
\n

仔细看示例不难发现,语法跟 ejs 很像,<% 这里面是 js 语句 %>,所以只要会写 js,做页面渲染没有什么问题。另外以下是一些可用 js 方法。

\n\n

如:

\n
{\n  \"data\": {\n    \"user\": \"no one\"\n  },\n  \"body\": {\n    \"type\": \"tpl\",\n    \"tpl\": \"User: <%= formatDate(data.time, 'YYYY-MM-DD') %>\"\n  }\n}\n
\n

如果只想简单取下变量,可以用 $xxx 或者 ${xxx}。同时如果不指定渲染器类型,默认就是 tpl, 所以以上示例可以简化为。

\n
\n

取值支持多级,如果层级比较深可以用 . 来分割如: ${xx.xxx.xx}\n另外 $& 表示直接获取当前的 data

\n
\n
\n

注意:$xxx 与 <%= data.xxx %> 这两种语法不能同时使用,只有一种有效,所以不要交叉使用。

\n

通过 $xxx 取到的值,默认是会做 html 转义的,也就是说 $xxx 完全等价于 ${xxx | html}, 如果你想什么都不做,那么请这么写 ${xxx | raw}

\n

从上面的语法可以看出来,取值时是支持指定 filter 的,那么有哪些 filter 呢?

\n\n

组合使用。

\n\n

没有找到合适的?可以自定义 filter。如果是 AMIS 平台用户,可以将以下代码加入到自定义组件中,如果不是请想办法插入以下代码。

\n
import {registerFilter} from 'amis';\n\nregisterFilter('myfilter', (input: string) => `${input}Boom`);\n
\n

加入成功后就可以这样使用了 ${xxx | myfilter}。 如果 xxx 的值是 abc 那么输出将会是 abcBoom

\n\n\n
文档内容有误?欢迎大家一起来编写,文档地址:/docs/renderers/Tpl.md
", - "toc": { - "label": "目录", - "type": "toc", - "children": [ - { - "label": "Tpl", - "fragment": "tpl", - "fullPath": "#tpl", - "level": 2 - } - ], - "level": 0 - } - }; - -}); diff --git a/gh-pages/docs/renderers/action.html b/gh-pages/docs/renderers/action.html index 53f23d37..d55c6f6d 100644 --- a/gh-pages/docs/renderers/action.html +++ b/gh-pages/docs/renderers/action.html @@ -25,10 +25,10 @@
- - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - +