diff --git a/docs/renderers/Form/File.md b/docs/renderers/Form/File.md index eea796c4..e88a327c 100644 --- a/docs/renderers/Form/File.md +++ b/docs/renderers/Form/File.md @@ -34,3 +34,29 @@ ``` 如果不希望 File 控件接管上传,可以配置 `asBlob` 或者 `asBase64` 这两个属性(二选一),采用这种方式后,File 控件不再自己上传了,而是直接把文件数据作为表单项的值,文件内容会在 Form 表单提交的接口里面一起带上。 + +### 接口说明 + +开始之前请你先阅读[整体要求](../api.md)。 + +#### reciever + +用来自己实现文件接收 + +**发送:** + +POST 方式,内容体为 form-data/multipart 格式。文件的字段名为 file。 + +**响应:** + +常规返回格式如下: + +```json +{ + "status": 0, + "msg": "", + "data": { + "value": "一般为文件的下载地址" + } +} +``` diff --git a/examples/components/App.jsx b/examples/components/App.jsx index 684b2cfa..aab2995a 100644 --- a/examples/components/App.jsx +++ b/examples/components/App.jsx @@ -1,9 +1,11 @@ import React from 'react'; import NotFound from '../../src/components/404'; +import NotFound from '../../src/components/404'; import Layout from '../../src/components/Layout'; import AsideNav from '../../src/components/AsideNav'; import {AlertComponent, ToastComponent} from '../../src/components/index'; import {mapTree} from '../../src/utils/helper'; +import {Icon} from '../../src/components/icons'; import '../../src/locale/en'; import { Router, @@ -668,7 +670,9 @@ export class App extends React.PureComponent { key="expand-toggle" className={cx('AsideNav-itemArrow')} onClick={e => toggleExpand(link, e)} - /> + > + + ); } diff --git a/package.json b/package.json index fb8e5d47..d2d2159a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amis", - "version": "1.0.12", + "version": "1.0.14", "description": "一种MIS页面生成工具", "main": "lib/index.js", "scripts": { diff --git a/scss/_variables.scss b/scss/_variables.scss index e96061d8..f67dd964 100644 --- a/scss/_variables.scss +++ b/scss/_variables.scss @@ -948,7 +948,7 @@ $DropDown-menuItem-paddingY: ( ) / 2 !default; $DropDown-menuItem-paddingX: $gap-sm !default; $DropDown-menuItem-onHover-color: inherit !default; -$DropDown-menuItem-onHover-bg: $Button--default-onHover-bg !default; +$DropDown-menuItem-onHover-bg: $ListMenu-item--onHover-bg !default; // Checks $Checkbox-gap: $gap-sm !default; diff --git a/scss/components/_dropdown.scss b/scss/components/_dropdown.scss index d2b59173..c2c346f8 100644 --- a/scss/components/_dropdown.scss +++ b/scss/components/_dropdown.scss @@ -85,4 +85,8 @@ border: none; box-shadow: none; } + + > .#{$ns}Button { + min-width: unset; + } } diff --git a/scss/components/_pagination.scss b/scss/components/_pagination.scss index d95b012e..ace80db9 100644 --- a/scss/components/_pagination.scss +++ b/scss/components/_pagination.scss @@ -10,6 +10,7 @@ > a, > span { user-select: none; + cursor: pointer; position: relative; float: left; text-decoration: none; diff --git a/scss/layout/_aside.scss b/scss/layout/_aside.scss index c1dc9dc7..1c11874f 100644 --- a/scss/layout/_aside.scss +++ b/scss/layout/_aside.scss @@ -24,7 +24,7 @@ line-height: px2rem(17px); margin-top: px2rem(2px); - &::before { + &:empty:before { content: ''; display: inline-block; transform-origin: center; @@ -36,10 +36,22 @@ background-repeat: no-repeat; } - .#{$ns}AsideNav-item.is-open > a > &::before { + .#{$ns}AsideNav-item.is-open > a > &:empty:before { transform: rotate(90deg); color: $Layout-asideLink-onActive-arrowColor; } + + > svg { + color: $Layout-asideLink-color; + width: px2rem(10px); + height: px2rem(10px); + transform-origin: center; + transition: transform 0.2s ease; + } + + .#{$ns}AsideNav-item.is-open > a > & > svg { + transform: rotate(90deg); + } } &-itemBadge { diff --git a/scss/themes/cxd.scss b/scss/themes/cxd.scss index aad7bce7..77a0ccf5 100644 --- a/scss/themes/cxd.scss +++ b/scss/themes/cxd.scss @@ -415,7 +415,7 @@ $Toast-border-width: px2rem(1px); $Toast-icon-width: px2rem(16px); $Toast-icon-height: px2rem(16px); $Toast-opacity: 1; -$Toast-title-display: inline-block; +$Toast-title-display: inline; // Toast color $Toast-color: $white; diff --git a/src/components/InputBox.tsx b/src/components/InputBox.tsx index 77069e09..84309345 100644 --- a/src/components/InputBox.tsx +++ b/src/components/InputBox.tsx @@ -6,7 +6,7 @@ import {Icon} from './icons'; export interface InputBoxProps extends ThemeProps, - Omit, 'prefix' | 'onChange'> { + Omit, 'prefix' | 'onChange'> { value?: string; onChange?: (value: string) => void; onClear?: (e: React.MouseEvent) => void; diff --git a/src/components/Tinymce.tsx b/src/components/Tinymce.tsx index 4c09675b..c7538638 100644 --- a/src/components/Tinymce.tsx +++ b/src/components/Tinymce.tsx @@ -126,6 +126,17 @@ export default class TinymceEditor extends React.Component { tinymce.init(this.config); } + componentDidUpdate(prevProps: TinymceEditorProps) { + const props = this.props; + + if ( + props.model !== prevProps.model && + props.model !== this.currentContent + ) { + this.editor?.setContent(props.model || ''); + } + } + componentWillUnmount() { tinymce.remove(this.editor); } diff --git a/src/factory.tsx b/src/factory.tsx index 7cce0908..74c5490b 100644 --- a/src/factory.tsx +++ b/src/factory.tsx @@ -799,6 +799,7 @@ export function HocStoreFactory(renderer: { props.data.__super, false )) && + // nextProps.data.__super !== props.data.__super) && store.initData( createObject(nextProps.data.__super, { ...nextProps.data, diff --git a/src/icons/pencil.svg b/src/icons/pencil.svg index 09e550c1..bf30ecd5 100644 --- a/src/icons/pencil.svg +++ b/src/icons/pencil.svg @@ -1,6 +1,7 @@ - - - + + + + diff --git a/src/renderers/CRUD.tsx b/src/renderers/CRUD.tsx index 747b8d95..7b12e9b2 100644 --- a/src/renderers/CRUD.tsx +++ b/src/renderers/CRUD.tsx @@ -359,7 +359,7 @@ export default class CRUD extends React.Component { redirect && !action.blank && env.jumpTo(redirect, action); action.reload ? this.reloadTarget(action.reload, data) - : this.search(undefined, undefined, true); + : this.search(undefined, undefined, true, true); }) .catch(() => {}); } else if ( @@ -630,6 +630,7 @@ export default class CRUD extends React.Component { this.search( dialogAction.__from ? {[pageField || 'page']: 1} : undefined, undefined, + true, true ); } else if ( @@ -757,7 +758,15 @@ export default class CRUD extends React.Component { evalExpression(stopAutoRefreshWhen, data) )) && (this.timer = setTimeout( - silentPolling ? this.silentSearch : this.search, + silentPolling + ? this.silentSearch.bind(this, undefined, undefined, true) + : this.search.bind( + this, + undefined, + undefined, + undefined, + true + ), Math.max(interval, 3000) )); return value; @@ -765,8 +774,8 @@ export default class CRUD extends React.Component { : source && store.initFromScope(data, source); } - silentSearch(values?: object) { - return this.search(values, true); + silentSearch(values?: object, clearSelection?: boolean, forceReload = false) { + return this.search(values, true, clearSelection, forceReload); } handleChangePage(page: number, perPage?: number) { diff --git a/src/renderers/Card.tsx b/src/renderers/Card.tsx index aff85b79..f9b2e25f 100644 --- a/src/renderers/Card.tsx +++ b/src/renderers/Card.tsx @@ -434,6 +434,7 @@ export class CardItemFieldRenderer extends TableCell { render() { let { + type, className, render, style, diff --git a/src/renderers/Form/RichText.tsx b/src/renderers/Form/RichText.tsx index 733ca8bd..643b66c6 100644 --- a/src/renderers/Form/RichText.tsx +++ b/src/renderers/Form/RichText.tsx @@ -169,6 +169,7 @@ export default class RichTextControl extends React.Component< } else { const fetcher = props.env.fetcher; this.config = { + ...props.options, images_upload_url: props.reciever, images_upload_handler: async ( blobInfo: any, diff --git a/src/store/list.ts b/src/store/list.ts index f1cab522..94c8e4f2 100644 --- a/src/store/list.ts +++ b/src/store/list.ts @@ -9,7 +9,13 @@ import { import {iRendererStore} from './iRenderer'; import isEqual from 'lodash/isEqual'; import find from 'lodash/find'; -import {createObject, isObject, guid, immutableExtends} from '../utils/helper'; +import { + createObject, + isObject, + guid, + immutableExtends, + extendObject +} from '../utils/helper'; import {evalExpression} from '../utils/tpl'; export const Item = types @@ -41,7 +47,7 @@ export const Item = types get locals(): any { return createObject( - createObject((getParent(self, 2) as IListStore).data, { + extendObject((getParent(self, 2) as IListStore).data, { index: self.index }), self.data diff --git a/src/store/table.ts b/src/store/table.ts index 41c92d6a..3282c88f 100644 --- a/src/store/table.ts +++ b/src/store/table.ts @@ -22,7 +22,8 @@ import { flattenTree, eachTree, difference, - immutableExtends + immutableExtends, + extendObject } from '../utils/helper'; import {evalExpression} from '../utils/tpl'; @@ -128,7 +129,7 @@ export const Row = types get locals(): any { return createObject( - createObject((getParent(self, self.depth * 2) as ITableStore).data, { + extendObject((getParent(self, self.depth * 2) as ITableStore).data, { index: self.index }), self.data