mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-04-20 04:18:05 +00:00
refactor: 删除 editor-setters
This commit is contained in:
parent
ea6bc7aeb8
commit
f14b871b0d
@ -1,856 +0,0 @@
|
|||||||
# Change Log
|
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
||||||
|
|
||||||
<a name="0.13.1-29"></a>
|
|
||||||
## [0.13.1-29](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-28...v0.13.1-29) (2020-12-03)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-28"></a>
|
|
||||||
## [0.13.1-28](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-27...v0.13.1-28) (2020-12-03)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-27"></a>
|
|
||||||
## [0.13.1-27](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-26...v0.13.1-27) (2020-12-02)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-26"></a>
|
|
||||||
## [0.13.1-26](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-25...v0.13.1-26) (2020-12-02)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-25"></a>
|
|
||||||
## [0.13.1-25](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-24...v0.13.1-25) (2020-12-01)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-24"></a>
|
|
||||||
## [0.13.1-24](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-23...v0.13.1-24) (2020-11-26)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-23"></a>
|
|
||||||
## [0.13.1-23](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-22...v0.13.1-23) (2020-11-25)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-22"></a>
|
|
||||||
## [0.13.1-22](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-19...v0.13.1-22) (2020-11-25)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-19"></a>
|
|
||||||
## [0.13.1-19](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-18...v0.13.1-19) (2020-11-24)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-18"></a>
|
|
||||||
## [0.13.1-18](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-15...v0.13.1-18) (2020-11-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-15"></a>
|
|
||||||
## [0.13.1-15](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-11...v0.13.1-15) (2020-11-18)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-19"></a>
|
|
||||||
## [0.12.1-19](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-18...v0.12.1-19) (2020-10-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-18"></a>
|
|
||||||
## [0.12.1-18](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-17...v0.12.1-18) (2020-10-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-17"></a>
|
|
||||||
## [0.12.1-17](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-16...v0.12.1-17) (2020-10-14)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-16"></a>
|
|
||||||
## [0.12.1-16](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-15...v0.12.1-16) (2020-10-12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-15"></a>
|
|
||||||
## [0.12.1-15](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-1...v0.12.1-15) (2020-10-12)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* 使用 release/1.0.0 的 editor-setters ([80d74d6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/80d74d6))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-14"></a>
|
|
||||||
## [0.12.1-14](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-13...v0.12.1-14) (2020-10-10)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-13"></a>
|
|
||||||
## [0.12.1-13](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-12...v0.12.1-13) (2020-09-28)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-12"></a>
|
|
||||||
## [0.12.1-12](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-11...v0.12.1-12) (2020-09-28)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-11"></a>
|
|
||||||
## [0.12.1-11](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-10...v0.12.1-11) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-10"></a>
|
|
||||||
## [0.12.1-10](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-9...v0.12.1-10) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-9"></a>
|
|
||||||
## [0.12.1-9](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-8...v0.12.1-9) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-8"></a>
|
|
||||||
## [0.12.1-8](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-7...v0.12.1-8) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-7"></a>
|
|
||||||
## [0.12.1-7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-2...v0.12.1-7) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.13.1-12"></a>
|
|
||||||
## [0.13.1-12](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-11...v0.13.1-12) (2020-11-18)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-19"></a>
|
|
||||||
## [0.12.1-19](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-18...v0.12.1-19) (2020-10-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-18"></a>
|
|
||||||
## [0.12.1-18](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-17...v0.12.1-18) (2020-10-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-17"></a>
|
|
||||||
## [0.12.1-17](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-16...v0.12.1-17) (2020-10-14)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-16"></a>
|
|
||||||
## [0.12.1-16](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-15...v0.12.1-16) (2020-10-12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-15"></a>
|
|
||||||
## [0.12.1-15](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-1...v0.12.1-15) (2020-10-12)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* 使用 release/1.0.0 的 editor-setters ([80d74d6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/80d74d6))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-14"></a>
|
|
||||||
## [0.12.1-14](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-13...v0.12.1-14) (2020-10-10)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-13"></a>
|
|
||||||
## [0.12.1-13](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-12...v0.12.1-13) (2020-09-28)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-12"></a>
|
|
||||||
## [0.12.1-12](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-11...v0.12.1-12) (2020-09-28)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-11"></a>
|
|
||||||
## [0.12.1-11](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-10...v0.12.1-11) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-10"></a>
|
|
||||||
## [0.12.1-10](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-9...v0.12.1-10) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-9"></a>
|
|
||||||
## [0.12.1-9](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-8...v0.12.1-9) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-8"></a>
|
|
||||||
## [0.12.1-8](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-7...v0.12.1-8) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.12.1-7"></a>
|
|
||||||
## [0.12.1-7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-2...v0.12.1-7) (2020-09-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.13.1-11"></a>
|
|
||||||
## [0.13.1-11](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-10...v0.13.1-11) (2020-11-02)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-10"></a>
|
|
||||||
## [0.13.1-10](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-9...v0.13.1-10) (2020-10-26)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-9"></a>
|
|
||||||
## [0.13.1-9](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-7...v0.13.1-9) (2020-10-26)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-8"></a>
|
|
||||||
## [0.13.1-8](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-7...v0.13.1-8) (2020-10-26)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-7"></a>
|
|
||||||
## [0.13.1-7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-6...v0.13.1-7) (2020-10-23)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-6"></a>
|
|
||||||
## [0.13.1-6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-5...v0.13.1-6) (2020-10-22)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-5"></a>
|
|
||||||
## [0.13.1-5](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-4...v0.13.1-5) (2020-10-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-4"></a>
|
|
||||||
## [0.13.1-4](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-3...v0.13.1-4) (2020-10-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-3"></a>
|
|
||||||
## [0.13.1-3](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-2...v0.13.1-3) (2020-10-19)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-2"></a>
|
|
||||||
## [0.13.1-2](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.13.1-1...v0.13.1-2) (2020-10-19)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.1-1"></a>
|
|
||||||
## [0.13.1-1](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-3...v0.13.1-1) (2020-10-12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.12.1-3"></a>
|
|
||||||
## [0.12.1-3](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-2...v0.12.1-3) (2020-10-12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.12.1-2"></a>
|
|
||||||
## [0.12.1-2](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v0.12.1-1...v0.12.1-2) (2020-09-23)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.12.1-1"></a>
|
|
||||||
## [0.12.1-1](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-9...v0.12.1-1) (2020-09-22)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.9-9"></a>
|
|
||||||
## [1.0.9-9](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-8...v1.0.9-9) (2020-09-22)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.9-8"></a>
|
|
||||||
## [1.0.9-8](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-7...v1.0.9-8) (2020-09-22)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.9-7"></a>
|
|
||||||
## [1.0.9-7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-5...v1.0.9-7) (2020-09-18)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.9-5"></a>
|
|
||||||
## [1.0.9-5](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-2...v1.0.9-5) (2020-09-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* source-editor bug & exp-setter bug ([5cd88d4](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/5cd88d4))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.0.9-2"></a>
|
|
||||||
## [1.0.9-2](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-1...v1.0.9-2) (2020-09-14)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.9-1"></a>
|
|
||||||
## [1.0.9-1](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/v1.0.9-0...v1.0.9-1) (2020-09-14)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.9-0"></a>
|
|
||||||
## 1.0.9-0 (2020-09-14)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* fix function-setter bug ([dced647](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/dced647))
|
|
||||||
* fix function-setter bug ([8fd77df](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/8fd77df))
|
|
||||||
* fix NextTable callback function ([ce77375](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/ce77375))
|
|
||||||
* rename MixinSetter to MixedSetter ([0e9a740](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0e9a740))
|
|
||||||
* 合并master分支 ([bd2c6ad](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/bd2c6ad))
|
|
||||||
* 清理代码依赖及版本 ([0b15d30](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0b15d30))
|
|
||||||
* 适配Nav组件 ([7e9829f](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/7e9829f))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* add function setter ([114b6b0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/114b6b0))
|
|
||||||
* add style-setters ([99b1d84](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/99b1d84))
|
|
||||||
* setting-pane 新增removeProp 函数 ([b97c807](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/b97c807))
|
|
||||||
* tree 组件修改 ([7efa52f](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/7efa52f))
|
|
||||||
* 新增functionSetter ([9359ac6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/9359ac6))
|
|
||||||
* 新增事件入参功能 ([0614fa7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0614fa7))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.0.8-0"></a>
|
|
||||||
## [1.0.8-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.21...@ali/lowcode-editor-setters@1.0.8-0) (2020-09-09)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* 合并master分支 ([bd2c6ad](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/bd2c6ad))
|
|
||||||
* 清理代码依赖及版本 ([0b15d30](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0b15d30))
|
|
||||||
* 适配Nav组件 ([7e9829f](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/7e9829f))
|
|
||||||
* fix function-setter bug ([dced647](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/dced647))
|
|
||||||
* fix function-setter bug ([8fd77df](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/8fd77df))
|
|
||||||
* fix NextTable callback function ([ce77375](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/ce77375))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* 新增事件入参功能 ([0614fa7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0614fa7))
|
|
||||||
* 新增functionSetter ([9359ac6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/9359ac6))
|
|
||||||
* add function setter ([114b6b0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/114b6b0))
|
|
||||||
* add style-setters ([99b1d84](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/99b1d84))
|
|
||||||
* setting-pane 新增removeProp 函数 ([b97c807](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/b97c807))
|
|
||||||
* tree 组件修改 ([7efa52f](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/7efa52f))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.0.7-0"></a>
|
|
||||||
## [1.0.7-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@1.0.6-0...@ali/lowcode-editor-setters@1.0.7-0) (2020-09-02)
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
<a name="1.0.6-0"></a>
|
|
||||||
## [1.0.6-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.19...@ali/lowcode-editor-setters@1.0.6-0) (2020-09-02)
|
|
||||||
|
|
||||||
<a name="0.9.21"></a>
|
|
||||||
## [0.9.21](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.20...@ali/lowcode-editor-setters@0.9.21) (2020-09-03)
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.20"></a>
|
|
||||||
## [0.9.20](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.19...@ali/lowcode-editor-setters@0.9.20) (2020-09-03)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* 合并master分支 ([bd2c6ad](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/bd2c6ad))
|
|
||||||
* 清理代码依赖及版本 ([0b15d30](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0b15d30))
|
|
||||||
* 适配Nav组件 ([7e9829f](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/7e9829f))
|
|
||||||
* fix function-setter bug ([dced647](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/dced647))
|
|
||||||
* fix function-setter bug ([8fd77df](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/8fd77df))
|
|
||||||
* fix NextTable callback function ([ce77375](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/ce77375))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* 新增事件入参功能 ([0614fa7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0614fa7))
|
|
||||||
* 新增functionSetter ([9359ac6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/9359ac6))
|
|
||||||
* add function setter ([114b6b0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/114b6b0))
|
|
||||||
* add style-setters ([99b1d84](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/99b1d84))
|
|
||||||
* setting-pane 新增removeProp 函数 ([b97c807](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/b97c807))
|
|
||||||
* tree 组件修改 ([7efa52f](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/7efa52f))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.0.5-0"></a>
|
|
||||||
## [1.0.5-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@1.0.4-0...@ali/lowcode-editor-setters@1.0.5-0) (2020-08-20)
|
|
||||||
|
|
||||||
<a name="0.9.19"></a>
|
|
||||||
## [0.9.19](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.18...@ali/lowcode-editor-setters@0.9.19) (2020-08-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.18"></a>
|
|
||||||
## [0.9.18](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.17...@ali/lowcode-editor-setters@0.9.18) (2020-08-24)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.17"></a>
|
|
||||||
## [0.9.17](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.16...@ali/lowcode-editor-setters@0.9.17) (2020-08-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.4-0"></a>
|
|
||||||
## [1.0.4-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@1.0.3-0...@ali/lowcode-editor-setters@1.0.4-0) (2020-08-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.3-0"></a>
|
|
||||||
## [1.0.3-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@1.0.2-0...@ali/lowcode-editor-setters@1.0.3-0) (2020-08-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.2-0"></a>
|
|
||||||
## [1.0.2-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@1.0.1-0...@ali/lowcode-editor-setters@1.0.2-0) (2020-08-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="1.0.1-0"></a>
|
|
||||||
## [1.0.1-0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.16...@ali/lowcode-editor-setters@1.0.1-0) (2020-08-20)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* fix function-setter bug ([8fd77df](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/8fd77df))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* add function setter ([114b6b0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/114b6b0))
|
|
||||||
* add style-setters ([99b1d84](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/99b1d84))
|
|
||||||
* setting-pane 新增removeProp 函数 ([b97c807](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/b97c807))
|
|
||||||
* 新增functionSetter ([9359ac6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/9359ac6))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.0.0"></a>
|
|
||||||
# [1.0.0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.14.0...@ali/lowcode-editor-setters@1.0.0) (2020-08-17)
|
|
||||||
<a name="0.9.16"></a>
|
|
||||||
## [0.9.16](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.15...@ali/lowcode-editor-setters@0.9.16) (2020-08-19)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.14.0"></a>
|
|
||||||
# [0.14.0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.13.0...@ali/lowcode-editor-setters@0.14.0) (2020-08-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.13.0"></a>
|
|
||||||
# [0.13.0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.11.0...@ali/lowcode-editor-setters@0.13.0) (2020-08-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.12.0"></a>
|
|
||||||
# [0.12.0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.11.0...@ali/lowcode-editor-setters@0.12.0) (2020-08-17)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.11.0"></a>
|
|
||||||
# [0.11.0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.10.0...@ali/lowcode-editor-setters@0.11.0) (2020-08-16)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.10.0"></a>
|
|
||||||
# [0.10.0](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.14...@ali/lowcode-editor-setters@0.10.0) (2020-08-14)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* add style-setters ([99b1d84](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/99b1d84))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.9.14"></a>
|
|
||||||
## [0.9.14](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.13...@ali/lowcode-editor-setters@0.9.14) (2020-08-04)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.13"></a>
|
|
||||||
## [0.9.13](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.11...@ali/lowcode-editor-setters@0.9.13) (2020-08-04)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.12"></a>
|
|
||||||
## [0.9.12](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.11...@ali/lowcode-editor-setters@0.9.12) (2020-08-04)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.11"></a>
|
|
||||||
## [0.9.11](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.10...@ali/lowcode-editor-setters@0.9.11) (2020-07-28)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.10"></a>
|
|
||||||
## [0.9.10](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.9...@ali/lowcode-editor-setters@0.9.10) (2020-07-22)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.9"></a>
|
|
||||||
## [0.9.9](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.8...@ali/lowcode-editor-setters@0.9.9) (2020-07-21)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.8"></a>
|
|
||||||
## [0.9.8](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.7...@ali/lowcode-editor-setters@0.9.8) (2020-07-21)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* rename MixinSetter to MixedSetter ([0e9a740](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/0e9a740))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.9.7"></a>
|
|
||||||
## [0.9.7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.6...@ali/lowcode-editor-setters@0.9.7) (2020-07-13)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.6"></a>
|
|
||||||
## [0.9.6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.5...@ali/lowcode-editor-setters@0.9.6) (2020-07-12)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.5"></a>
|
|
||||||
## [0.9.5](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.4...@ali/lowcode-editor-setters@0.9.5) (2020-06-23)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.4"></a>
|
|
||||||
## [0.9.4](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.3...@ali/lowcode-editor-setters@0.9.4) (2020-06-23)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.3"></a>
|
|
||||||
## [0.9.3](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.2...@ali/lowcode-editor-setters@0.9.3) (2020-06-15)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.2"></a>
|
|
||||||
## [0.9.2](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-editor-setters@0.9.1...@ali/lowcode-editor-setters@0.9.2) (2020-05-20)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.9.1"></a>
|
|
||||||
## 0.9.1 (2020-05-18)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-editor-setters
|
|
||||||
|
|
||||||
<a name="0.8.15"></a>
|
|
||||||
## [0.8.15](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.14...@ali/lowcode-setters@0.8.15) (2020-05-15)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.14"></a>
|
|
||||||
## [0.8.14](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.13...@ali/lowcode-setters@0.8.14) (2020-05-13)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.13"></a>
|
|
||||||
## [0.8.13](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.12...@ali/lowcode-setters@0.8.13) (2020-05-08)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.12"></a>
|
|
||||||
## [0.8.12](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.11...@ali/lowcode-setters@0.8.12) (2020-05-07)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.11"></a>
|
|
||||||
## [0.8.11](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.10...@ali/lowcode-setters@0.8.11) (2020-04-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.10"></a>
|
|
||||||
## [0.8.10](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.9...@ali/lowcode-setters@0.8.10) (2020-04-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.9"></a>
|
|
||||||
## [0.8.9](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.8...@ali/lowcode-setters@0.8.9) (2020-04-27)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.8"></a>
|
|
||||||
## [0.8.8](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.7...@ali/lowcode-setters@0.8.8) (2020-04-16)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.7"></a>
|
|
||||||
## [0.8.7](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.6...@ali/lowcode-setters@0.8.7) (2020-04-15)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* mixin-setter get all setter ([eaa84d2](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/eaa84d2))
|
|
||||||
* mixin-setter get all setter ([a5eb62d](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/a5eb62d))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.8.6"></a>
|
|
||||||
## [0.8.6](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.5...@ali/lowcode-setters@0.8.6) (2020-03-31)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.5"></a>
|
|
||||||
## [0.8.5](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.4...@ali/lowcode-setters@0.8.5) (2020-03-30)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.4"></a>
|
|
||||||
## [0.8.4](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.3...@ali/lowcode-setters@0.8.4) (2020-03-30)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.3"></a>
|
|
||||||
## [0.8.3](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/compare/@ali/lowcode-setters@0.8.2...@ali/lowcode-setters@0.8.3) (2020-03-30)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** Version bump only for package @ali/lowcode-setters
|
|
||||||
|
|
||||||
<a name="0.8.2"></a>
|
|
||||||
## 0.8.2 (2020-03-30)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* ts type ([1732e7d](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/1732e7d))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.8.1"></a>
|
|
||||||
## 0.8.1 (2020-03-30)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* ts type ([1732e7d](https://gitlab.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/commit/1732e7d))
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@ali/lowcode-editor-setters",
|
|
||||||
"version": "0.13.1-29",
|
|
||||||
"description": "Builtin setters for Ali lowCode engine",
|
|
||||||
"files": [
|
|
||||||
"es",
|
|
||||||
"lib"
|
|
||||||
],
|
|
||||||
"main": "lib/index.js",
|
|
||||||
"module": "es/index.js",
|
|
||||||
"scripts": {
|
|
||||||
"build": "build-scripts build --skip-demo",
|
|
||||||
"test": "ava",
|
|
||||||
"test:snapshot": "ava --update-snapshots"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@ali/iceluna-comp-expression": "^1.0.6",
|
|
||||||
"@ali/iceluna-comp-form": "^1.0.20",
|
|
||||||
"@ali/iceluna-comp-list": "^1.0.26",
|
|
||||||
"@ali/iceluna-comp-object-button": "^1.0.23",
|
|
||||||
"@ali/iceluna-comp-react-node": "^1.0.5",
|
|
||||||
"@ali/iceluna-sdk": "^1.0.5-beta.24",
|
|
||||||
"@ali/lc-style-setter": "^0.0.1",
|
|
||||||
"@ali/lowcode-editor-core": "^0.13.1-29",
|
|
||||||
"@alifd/next": "^1.19.16",
|
|
||||||
"acorn": "^6.4.1",
|
|
||||||
"classnames": "^2.2.6",
|
|
||||||
"intl-messageformat": "^9.3.1",
|
|
||||||
"js-beautify": "^1.13.0",
|
|
||||||
"qs": "^6.9.1",
|
|
||||||
"react": "^16",
|
|
||||||
"react-dom": "^16.7.0",
|
|
||||||
"react-monaco-editor": "0.40.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@alib/build-scripts": "^0.1.18",
|
|
||||||
"@types/classnames": "^2.2.7",
|
|
||||||
"@types/node": "^13.7.1",
|
|
||||||
"@types/react": "^16",
|
|
||||||
"@types/react-dom": "^16",
|
|
||||||
"build-plugin-component": "^0.2.10",
|
|
||||||
"build-plugin-fusion": "^0.1.0",
|
|
||||||
"build-plugin-moment-locales": "^0.1.0"
|
|
||||||
},
|
|
||||||
"ava": {
|
|
||||||
"compileEnhancements": false,
|
|
||||||
"snapshotDir": "test/fixtures/__snapshots__",
|
|
||||||
"extensions": [
|
|
||||||
"ts"
|
|
||||||
],
|
|
||||||
"require": [
|
|
||||||
"ts-node/register"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"publishConfig": {
|
|
||||||
"registry": "https://registry.npm.alibaba-inc.com"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,97 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { SketchPicker } from 'react-color';
|
|
||||||
import { Input, Balloon } from '@alife/next';
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
interface Color {
|
|
||||||
rgb: any;
|
|
||||||
onChange: () => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PluginProps {
|
|
||||||
value: string;
|
|
||||||
onChange: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class ColorPickerView extends PureComponent<PluginProps> {
|
|
||||||
static display = 'ColorPicker';
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
onChange: PropTypes.func,
|
|
||||||
value: PropTypes.string,
|
|
||||||
};
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
onChange: () => {},
|
|
||||||
value: '',
|
|
||||||
};
|
|
||||||
|
|
||||||
constructor(props: Readonly<{ value: string; defaultValue: string }>) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
value: props.value || props.defaultValue,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static getDerivedStateFromProps(props: { value: string }, state: { preValue: string }) {
|
|
||||||
if (props.value != state.preValue) {
|
|
||||||
return {
|
|
||||||
preValue: props.value,
|
|
||||||
value: props.value,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
onChangeComplete = (color: Color): void => {
|
|
||||||
let value;
|
|
||||||
if (color.rgb.a < 1) {
|
|
||||||
const { rgb } = color;
|
|
||||||
const rgba = [rgb.r, rgb.g, rgb.b, rgb.a];
|
|
||||||
value = `rgba(${rgba.join(',')})`;
|
|
||||||
} else {
|
|
||||||
value = color.hex;
|
|
||||||
}
|
|
||||||
this.setState({
|
|
||||||
value,
|
|
||||||
});
|
|
||||||
this.props.onChange && this.props.onChange(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
onInputChange = (value: string): void => {
|
|
||||||
if (/^[0-9a-zA-Z]{6}$/.test(value)) value = `#${ value}`;
|
|
||||||
this.setState({
|
|
||||||
value,
|
|
||||||
});
|
|
||||||
this.props.onChange && this.props.onChange(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
render(): React.ReactNode {
|
|
||||||
const { value, onChange, ...restProps } = this.props;
|
|
||||||
const boxStyle = {
|
|
||||||
backgroundColor: this.state.value,
|
|
||||||
};
|
|
||||||
const triggerNode = (
|
|
||||||
<div className="lowcode-color-box">
|
|
||||||
<div style={boxStyle} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
const InnerBeforeNode = (
|
|
||||||
<Balloon
|
|
||||||
className={'lowcode-color-content'}
|
|
||||||
trigger={triggerNode}
|
|
||||||
needAdjust
|
|
||||||
triggerType="click"
|
|
||||||
closable={false}
|
|
||||||
alignEdge="edge"
|
|
||||||
offset={[-3, -6]}
|
|
||||||
>
|
|
||||||
<SketchPicker onChangeComplete={this.onChangeComplete} color={this.state.value} arrowPointAtCenter />
|
|
||||||
</Balloon>
|
|
||||||
);
|
|
||||||
return (
|
|
||||||
<Input {...restProps} innerBefore={InnerBeforeNode} onChange={this.onInputChange} value={this.state.value} />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,464 +0,0 @@
|
|||||||
import { Component } from 'react';
|
|
||||||
import { Radio, Menu, Table, Icon } from '@alifd/next';
|
|
||||||
import nativeEvents from './native-events';
|
|
||||||
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
const { Item, Group } = Menu;
|
|
||||||
const RadioGroup = Radio.Group;
|
|
||||||
|
|
||||||
const EVENT_CONTENTS = {
|
|
||||||
COMPONENT_EVENT: 'componentEvent',
|
|
||||||
NATIVE_EVENT: 'nativeEvent',
|
|
||||||
LIFE_CYCLE_EVENT: 'lifeCycleEvent',
|
|
||||||
};
|
|
||||||
|
|
||||||
const DEFINITION_EVENT_TYPE = {
|
|
||||||
EVENTS: 'events',
|
|
||||||
NATIVE_EVENTS: 'nativeEvents',
|
|
||||||
LIFE_CYCLE_EVENT: 'lifeCycleEvent',
|
|
||||||
};
|
|
||||||
|
|
||||||
const SETTER_NAME = 'event-setter';
|
|
||||||
|
|
||||||
export default class EventsSetter extends Component<{
|
|
||||||
value: any[];
|
|
||||||
onChange: (eventList: any[]) => void;
|
|
||||||
}> {
|
|
||||||
state = {
|
|
||||||
eventBtns: [],
|
|
||||||
eventList: [],
|
|
||||||
selectType: null,
|
|
||||||
nativeEventList: [],
|
|
||||||
lifeCycleEventList: [],
|
|
||||||
eventDataList: (this.props?.value?.eventDataList ? this.props.value.eventDataList : this.props?.value) || [],
|
|
||||||
};
|
|
||||||
|
|
||||||
// constructor (){
|
|
||||||
// super();
|
|
||||||
// debugger;
|
|
||||||
// // if (!this.props || !this.props.value){
|
|
||||||
// // this.setState({
|
|
||||||
// // eventDataList:[]
|
|
||||||
// // })
|
|
||||||
// // }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// static getDerivedStateFromProps(nextProps, prevState) {
|
|
||||||
// debugger;
|
|
||||||
// // const { value } = nextProps;
|
|
||||||
// // debugger;
|
|
||||||
// // if (value !== prevState.eventDataList) {
|
|
||||||
// // return {
|
|
||||||
// // value,
|
|
||||||
// // };
|
|
||||||
// // }
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
private bindEventName: string;
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
console.log(this.state.eventDataList);
|
|
||||||
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
this.initEventBtns();
|
|
||||||
this.initEventList();
|
|
||||||
editor.on(`${SETTER_NAME}.bindEvent`, (relatedEventName, paramStr) => {
|
|
||||||
this.bindEvent(relatedEventName, paramStr);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化事件按钮
|
|
||||||
*/
|
|
||||||
initEventBtns() {
|
|
||||||
const { definition } = this.props;
|
|
||||||
let isRoot = false;
|
|
||||||
let isCustom = false;
|
|
||||||
let eventBtns = [];
|
|
||||||
definition.map(item => {
|
|
||||||
if (item.type === DEFINITION_EVENT_TYPE.LIFE_CYCLE_EVENT) {
|
|
||||||
isRoot = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.type === DEFINITION_EVENT_TYPE.EVENTS) {
|
|
||||||
isCustom = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (isRoot) {
|
|
||||||
eventBtns = [
|
|
||||||
{
|
|
||||||
value: EVENT_CONTENTS.LIFE_CYCLE_EVENT,
|
|
||||||
label: '生命周期',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (isCustom) {
|
|
||||||
eventBtns = [
|
|
||||||
{
|
|
||||||
value: EVENT_CONTENTS.COMPONENT_EVENT,
|
|
||||||
label: '组件自带事件',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
eventBtns = [
|
|
||||||
{
|
|
||||||
value: EVENT_CONTENTS.NATIVE_EVENT,
|
|
||||||
label: '原生事件',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
eventBtns,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
initEventList() {
|
|
||||||
const { definition } = this.props;
|
|
||||||
let nativeEventList = [];
|
|
||||||
definition.map(item => {
|
|
||||||
if (item.type === DEFINITION_EVENT_TYPE.EVENTS) {
|
|
||||||
this.checkEventListStatus(item.list, DEFINITION_EVENT_TYPE.EVENTS);
|
|
||||||
this.setState({
|
|
||||||
eventList: item.list,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.type === DEFINITION_EVENT_TYPE.NATIVE_EVENTS) {
|
|
||||||
this.checkEventListStatus(
|
|
||||||
item.list,
|
|
||||||
DEFINITION_EVENT_TYPE.NATIVE_EVENTS,
|
|
||||||
);
|
|
||||||
nativeEventList = item.list;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.type === DEFINITION_EVENT_TYPE.LIFE_CYCLE_EVENT) {
|
|
||||||
this.checkEventListStatus(
|
|
||||||
item.list,
|
|
||||||
DEFINITION_EVENT_TYPE.LIFE_CYCLE_EVENT,
|
|
||||||
);
|
|
||||||
this.setState({
|
|
||||||
lifeCycleEventList: item.list,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (nativeEventList.length == 0) {
|
|
||||||
nativeEventList = nativeEvents;
|
|
||||||
this.setState({
|
|
||||||
nativeEventList,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
checkEventListStatus = (eventList: any[], eventType: string) => {
|
|
||||||
const { eventDataList } = this.state;
|
|
||||||
if (
|
|
||||||
eventType === DEFINITION_EVENT_TYPE.EVENTS ||
|
|
||||||
eventType === DEFINITION_EVENT_TYPE.LIFE_CYCLE_EVENT
|
|
||||||
) {
|
|
||||||
eventList.map(item => {
|
|
||||||
item.disabled = false;
|
|
||||||
eventDataList.map(eventDataItem => {
|
|
||||||
if (item.name === eventDataItem.name) {
|
|
||||||
item.disabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return eventDataItem;
|
|
||||||
});
|
|
||||||
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
} else if (eventType === DEFINITION_EVENT_TYPE.NATIVE_EVENTS) {
|
|
||||||
eventDataList.map(eventDataItem => {
|
|
||||||
eventList.map(item => {
|
|
||||||
item.eventList.map(eventItem => {
|
|
||||||
if (eventItem.name === eventDataItem.name) {
|
|
||||||
item.disabled = true;
|
|
||||||
} else {
|
|
||||||
item.disabled = false;
|
|
||||||
}
|
|
||||||
return eventItem;
|
|
||||||
});
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
return eventDataItem;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 渲染事件信息
|
|
||||||
*/
|
|
||||||
renderEventInfoCell = (value, index, record) => {
|
|
||||||
let eventTagText = '';
|
|
||||||
if (record.type === EVENT_CONTENTS.NATIVE_EVENT) {
|
|
||||||
eventTagText = '原';
|
|
||||||
} else if (record.type === EVENT_CONTENTS.COMPONENT_EVENT) {
|
|
||||||
eventTagText = '组';
|
|
||||||
} else if (record.type === EVENT_CONTENTS.LIFE_CYCLE_EVENT) {
|
|
||||||
eventTagText = '生';
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div className="event-cell">
|
|
||||||
<div className="event-type-tag">{eventTagText}</div>
|
|
||||||
{record.name}
|
|
||||||
</div>
|
|
||||||
<div className="event-cell" style={{ marginTop: '8px' }}>
|
|
||||||
<Icon type="attachment" size="small" className="related-icon" />
|
|
||||||
<span className="related-event-name" onClick={() => this.onRelatedEventNameClick(record.relatedEventName)}>
|
|
||||||
{record.relatedEventName || ''}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 渲染事件操作项
|
|
||||||
*/
|
|
||||||
renderEventOperateCell = (eventName: string) => {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<Icon
|
|
||||||
type="set"
|
|
||||||
className="event-operate-icon"
|
|
||||||
style={{ marginLeft: '3px', marginRight: '4px' }}
|
|
||||||
onClick={() => this.openDialog(eventName)}
|
|
||||||
/>
|
|
||||||
<Icon
|
|
||||||
type="ashbin"
|
|
||||||
className="event-operate-icon"
|
|
||||||
onClick={() => this.openDeleteEventDialog(eventName)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
updateEventListStatus = (eventName: string, unDisabled: boolean) => {
|
|
||||||
const { eventList, nativeEventList, lifeCycleEventList } = this.state;
|
|
||||||
eventList.map(item => {
|
|
||||||
if (item.name === eventName) {
|
|
||||||
item.disabled = !unDisabled;
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
lifeCycleEventList.map(item => {
|
|
||||||
if (item.name === eventName) {
|
|
||||||
item.disabled = !unDisabled;
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
nativeEventList.map(item => {
|
|
||||||
item.eventList.map(itemData => {
|
|
||||||
if (itemData.name === eventName) {
|
|
||||||
itemData.disabled = !unDisabled;
|
|
||||||
}
|
|
||||||
return itemData;
|
|
||||||
});
|
|
||||||
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
onRadioChange = value => {
|
|
||||||
this.setState({
|
|
||||||
selectType: value,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
onEventMenuClick = (eventName: string) => {
|
|
||||||
const { selectType, eventDataList } = this.state;
|
|
||||||
eventDataList.push({
|
|
||||||
type: selectType,
|
|
||||||
name: eventName,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
eventDataList,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.updateEventListStatus(eventName);
|
|
||||||
this.closeEventMenu();
|
|
||||||
this.openDialog(eventName);
|
|
||||||
};
|
|
||||||
|
|
||||||
onRelatedEventNameClick = (eventName: string) => {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
|
|
||||||
editor.get('skeleton').getPanel('sourceEditor').show();
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
editor.emit('sourceEditor.focusByFunction', {
|
|
||||||
functionName: eventName,
|
|
||||||
});
|
|
||||||
}, 300);
|
|
||||||
|
|
||||||
|
|
||||||
// editor.emit('sourceEditor.focusByFunction',{
|
|
||||||
// functionName:eventName
|
|
||||||
// })
|
|
||||||
};
|
|
||||||
|
|
||||||
closeEventMenu = () => {
|
|
||||||
if (this.state.selectType !== null) {
|
|
||||||
this.setState({
|
|
||||||
selectType: null,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
openDeleteEventDialog = (eventName: string) => {
|
|
||||||
this.deleteEvent(eventName);
|
|
||||||
// Dialog.confirm({
|
|
||||||
// title: '删除事件',
|
|
||||||
// content: '确定删除当前事件吗',
|
|
||||||
// onOk: () => this.deleteEvent(eventName),
|
|
||||||
// });
|
|
||||||
};
|
|
||||||
|
|
||||||
deleteEvent = (eventName: string) => {
|
|
||||||
const { eventDataList, eventList } = this.state;
|
|
||||||
eventDataList.map((item, index) => {
|
|
||||||
if (item.name === eventName) {
|
|
||||||
eventDataList.splice(index, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
eventDataList,
|
|
||||||
});
|
|
||||||
this.props.onChange({ eventDataList, eventList });
|
|
||||||
this.updateEventListStatus(eventName, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
openDialog = (bindEventName: string) => {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
const { eventDataList } = this.state;
|
|
||||||
let paramStr;
|
|
||||||
eventDataList.map((item) => {
|
|
||||||
if (item.name == bindEventName) {
|
|
||||||
paramStr = item.paramStr;
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
this.bindEventName = bindEventName;
|
|
||||||
editor.emit('eventBindDialog.openDialog', bindEventName, SETTER_NAME, paramStr);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
bindEvent = (relatedEventName: string, paramStr: string) => {
|
|
||||||
const { eventDataList, eventList } = this.state;
|
|
||||||
eventDataList.map(item => {
|
|
||||||
if (item.name === this.bindEventName) {
|
|
||||||
item.relatedEventName = relatedEventName;
|
|
||||||
if (paramStr) {
|
|
||||||
item.paramStr = paramStr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
eventDataList,
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
this.props.onChange({ eventDataList, eventList });
|
|
||||||
|
|
||||||
// this.closeDialog();
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
eventBtns,
|
|
||||||
eventList,
|
|
||||||
nativeEventList,
|
|
||||||
lifeCycleEventList,
|
|
||||||
selectType,
|
|
||||||
eventDataList,
|
|
||||||
} = this.state;
|
|
||||||
const showEventList =
|
|
||||||
lifeCycleEventList.length > 0 ? lifeCycleEventList : eventList;
|
|
||||||
return (
|
|
||||||
<div className="lc-block-setter event-body" onClick={this.closeEventMenu}>
|
|
||||||
|
|
||||||
<div className="event-title">
|
|
||||||
{
|
|
||||||
eventBtns.length > 1 ? <span>点击选择事件类型</span> : <span>点击绑定事件</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<RadioGroup
|
|
||||||
dataSource={eventBtns}
|
|
||||||
shape="button"
|
|
||||||
size="medium"
|
|
||||||
value={selectType}
|
|
||||||
onChange={this.onRadioChange}
|
|
||||||
style={{ width: '100%' }}
|
|
||||||
/>
|
|
||||||
{selectType && selectType != EVENT_CONTENTS.NATIVE_EVENT && (
|
|
||||||
<Menu
|
|
||||||
defaultOpenKeys="sub-menu"
|
|
||||||
className="event-menu"
|
|
||||||
onItemClick={this.onEventMenuClick}
|
|
||||||
>
|
|
||||||
{showEventList.map((item) => (
|
|
||||||
<Item
|
|
||||||
key={item.name}
|
|
||||||
helper={item.description}
|
|
||||||
disabled={item.disabled}
|
|
||||||
>
|
|
||||||
{item.name}
|
|
||||||
</Item>
|
|
||||||
))}
|
|
||||||
</Menu>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{selectType && selectType === EVENT_CONTENTS.NATIVE_EVENT && (
|
|
||||||
<Menu
|
|
||||||
defaultOpenKeys="sub-menu"
|
|
||||||
className="event-menu"
|
|
||||||
onItemClick={this.onEventMenuClick}
|
|
||||||
>
|
|
||||||
{nativeEventList.map((item, index) => (
|
|
||||||
<Group label={item.name} key={index}>
|
|
||||||
{item.eventList.map(groupItem => (
|
|
||||||
<Item key={groupItem.name} disabled={groupItem.disabled}>
|
|
||||||
{groupItem.name}
|
|
||||||
</Item>
|
|
||||||
))}
|
|
||||||
</Group>
|
|
||||||
))}
|
|
||||||
</Menu>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div className="event-table">
|
|
||||||
<Table dataSource={eventDataList} size="small">
|
|
||||||
<Table.Column title="已有事件" cell={this.renderEventInfoCell} />
|
|
||||||
<Table.Column
|
|
||||||
title="操作"
|
|
||||||
dataIndex="name"
|
|
||||||
cell={this.renderEventOperateCell}
|
|
||||||
width={70}
|
|
||||||
/>
|
|
||||||
</Table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,349 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { Select, Balloon } from '@alife/next';
|
|
||||||
import * as acorn from 'acorn';
|
|
||||||
|
|
||||||
import { isJSExpression, generateI18n } from './locale/utils';
|
|
||||||
import zhCN from './locale/zh-CN';
|
|
||||||
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
const { Option, AutoComplete } = Select;
|
|
||||||
const { Tooltip } = Balloon;
|
|
||||||
const helpMap = {
|
|
||||||
this: '容器上下文对象',
|
|
||||||
state: '容器的state',
|
|
||||||
props: '容器的props',
|
|
||||||
context: '容器的context',
|
|
||||||
schema: '页面上下文对象',
|
|
||||||
component: '组件上下文对象',
|
|
||||||
constants: '应用常量对象',
|
|
||||||
utils: '应用工具对象',
|
|
||||||
dataSourceMap: '容器数据源Map',
|
|
||||||
field: '表单Field对象',
|
|
||||||
};
|
|
||||||
|
|
||||||
export default class ExpressionView extends PureComponent {
|
|
||||||
static displayName = 'Expression';
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
context: PropTypes.object,
|
|
||||||
dataSource: PropTypes.array,
|
|
||||||
locale: PropTypes.string,
|
|
||||||
messages: PropTypes.object,
|
|
||||||
onChange: PropTypes.func,
|
|
||||||
placeholder: PropTypes.string,
|
|
||||||
value: PropTypes.string,
|
|
||||||
};
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
context: {},
|
|
||||||
dataSource: [],
|
|
||||||
locale: 'zh-CN',
|
|
||||||
messages: zhCN,
|
|
||||||
onChange: () => {},
|
|
||||||
placeholder: '',
|
|
||||||
value: '',
|
|
||||||
};
|
|
||||||
|
|
||||||
expression: React.RefObject<unknown>;
|
|
||||||
|
|
||||||
i18n: any;
|
|
||||||
|
|
||||||
t: void;
|
|
||||||
|
|
||||||
$input: any;
|
|
||||||
|
|
||||||
listenerFun: ((event: any) => void) | undefined;
|
|
||||||
|
|
||||||
static getInitValue(val: { value: any; match: (arg0: RegExp) => any; }) {
|
|
||||||
if (isJSExpression(val)) {
|
|
||||||
if (typeof val === 'object') {
|
|
||||||
return val.value;
|
|
||||||
} else if (typeof val === 'string') {
|
|
||||||
const arr = val.match(/^\{\{(.*?)\}\}$/);
|
|
||||||
if (arr) return arr[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(props: any) {
|
|
||||||
super(props);
|
|
||||||
this.expression = React.createRef();
|
|
||||||
this.i18n = generateI18n(props.locale, props.messages);
|
|
||||||
this.state = {
|
|
||||||
value: ExpressionView.getInitValue(props.value),
|
|
||||||
dataSource: props.dataSource || [],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static getDerivedStateFromProps(props: { value: any; }, state: { preValue: any; }) {
|
|
||||||
const curValue = ExpressionView.getInitValue(props.value);
|
|
||||||
if (curValue !== state.preValue) {
|
|
||||||
return {
|
|
||||||
preValue: curValue,
|
|
||||||
value: curValue,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
onChange(value: string, actionType: string) {
|
|
||||||
let realInputValue = value;
|
|
||||||
const realDataSource = null;
|
|
||||||
let nextCursorIndex: number;
|
|
||||||
// 更新值
|
|
||||||
if (actionType === 'itemClick' || actionType === 'enter') {
|
|
||||||
const curValue = this.state.value;
|
|
||||||
if (curValue) {
|
|
||||||
realInputValue = curValue + realInputValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 更新数据源
|
|
||||||
const newState = {
|
|
||||||
value: realInputValue,
|
|
||||||
};
|
|
||||||
if (realDataSource !== null) newState.dataSource = realDataSource;
|
|
||||||
this.setState(newState, () => {
|
|
||||||
nextCursorIndex && this.setInputCursorPosition(nextCursorIndex);
|
|
||||||
});
|
|
||||||
// 默认加上变量表达式
|
|
||||||
this.t && clearTimeout(this.t);
|
|
||||||
this.t = setTimeout(() => {
|
|
||||||
const { onChange } = this.props;
|
|
||||||
// realInputValue = realInputValue ? `{{${realInputValue}}}` : undefined;
|
|
||||||
onChange && onChange({
|
|
||||||
type: 'JSExpression',
|
|
||||||
value: realInputValue,
|
|
||||||
});
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取AutoComplete数据源
|
|
||||||
* @param {String}
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
getDataSource(): any[] {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
const schema = editor.get('designer').project.getSchema();
|
|
||||||
const stateMap = schema.componentsTree[0].state;
|
|
||||||
const dataSource = [];
|
|
||||||
|
|
||||||
for (const key in stateMap) {
|
|
||||||
dataSource.push(`this.state.${key}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dataSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取光标前的对象字符串,语法解析获取对象字符串
|
|
||||||
* @param {String} str 模板字符串
|
|
||||||
* @return {String} 光标前的对象字符串
|
|
||||||
*/
|
|
||||||
getCurrentFiled(str: string | any[]) {
|
|
||||||
str += 'x'; // .后面加一个x字符,便于acorn解析
|
|
||||||
try {
|
|
||||||
const astTree = acorn.parse(str);
|
|
||||||
const right = astTree.body[0].expression.right || astTree.body[0].expression;
|
|
||||||
if (right.type === 'MemberExpression') {
|
|
||||||
const { start, end } = right;
|
|
||||||
str = str.slice(start, end);
|
|
||||||
return { str, start, end };
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取输入的上下文信息
|
|
||||||
* @param {Array}
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
getContextKeys(keys: []) {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
console.log(editor);
|
|
||||||
const limitKeys = ['schema', 'utils', 'constants'];
|
|
||||||
if (keys.length === 0) return limitKeys;
|
|
||||||
if (!limitKeys.includes(keys[0])) return [];
|
|
||||||
let result = [];
|
|
||||||
let keyValue = editor;
|
|
||||||
let assert = false;
|
|
||||||
keys.forEach(item => {
|
|
||||||
if (!keyValue[item] || typeof keyValue[item] !== 'object') {
|
|
||||||
assert = true;
|
|
||||||
}
|
|
||||||
if (keyValue[item]) {
|
|
||||||
keyValue = keyValue[item];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (assert) return [];
|
|
||||||
result = Object.keys(keyValue);
|
|
||||||
return result;
|
|
||||||
// return utilsKeys.concat(constantsKeys).concat(schemaKeys);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 过滤key */
|
|
||||||
filterKey(obj: any, name: string) {
|
|
||||||
const filterKeys = [
|
|
||||||
'reloadDataSource',
|
|
||||||
'REACT_HOT_LOADER_RENDERED_GENERATION',
|
|
||||||
'refs',
|
|
||||||
'updater',
|
|
||||||
'appHelper',
|
|
||||||
'isReactComponent',
|
|
||||||
'forceUpdate',
|
|
||||||
'setState',
|
|
||||||
'isPureReactComponent',
|
|
||||||
];
|
|
||||||
const result = [];
|
|
||||||
for (const key in obj) {
|
|
||||||
if (key.indexOf('_') !== 0 && filterKeys.indexOf(key) === -1) {
|
|
||||||
result.push(`${name}.${key}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据输入项进行筛选
|
|
||||||
* @param {String}
|
|
||||||
* @param {String}
|
|
||||||
* @return {Boolen}
|
|
||||||
*/
|
|
||||||
filterOption(inputValue: string, item: { value: string | any[]; }) {
|
|
||||||
const cursorIndex = this.getInputCursorPosition();
|
|
||||||
const preStr = inputValue.substr(0, cursorIndex);
|
|
||||||
const lastKey: string[] = preStr.split('.').slice(-1);
|
|
||||||
if (!lastKey) return true;
|
|
||||||
if (item.value.indexOf(lastKey) > -1) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleClick = () => {
|
|
||||||
// this.props.field.editor.emit('variableBindDialog.open');
|
|
||||||
// }
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { value, dataSource } = this.state;
|
|
||||||
const { placeholder } = this.props;
|
|
||||||
const isValObject = !!(value == '[object Object]');
|
|
||||||
const title = isValObject
|
|
||||||
? this.i18n('valueIllegal')
|
|
||||||
: (value || placeholder || this.i18n('jsExpression')).toString();
|
|
||||||
const cursorIndex = this.getInputCursorPosition();
|
|
||||||
const childNode = cursorIndex ? (
|
|
||||||
<div className="cursor-blink">
|
|
||||||
{title.substr(0, cursorIndex)}
|
|
||||||
<b>|</b>
|
|
||||||
{title.substr(cursorIndex)}
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
title
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div ref={this.expression} style={{ width: '100%', display: 'inline-block' }}>
|
|
||||||
<Tooltip
|
|
||||||
triggerType={isValObject ? ['click'] : ['focus']}
|
|
||||||
align="tl"
|
|
||||||
popupClassName="code-input-overlay"
|
|
||||||
trigger={
|
|
||||||
isValObject ? (
|
|
||||||
value
|
|
||||||
) : (
|
|
||||||
<div>
|
|
||||||
<AutoComplete
|
|
||||||
{...this.props}
|
|
||||||
style={{ width: '100%' }}
|
|
||||||
dataSource={dataSource}
|
|
||||||
placeholder={placeholder || this.i18n('jsExpression')}
|
|
||||||
value={value}
|
|
||||||
disabled={isValObject}
|
|
||||||
innerBefore={<span style={{ color: '#999', marginLeft: 4 }}>{'{{'}</span>}
|
|
||||||
innerAfter={<span style={{ color: '#999', marginRight: 4 }}>{'}}'}</span>}
|
|
||||||
popupClassName="expression-setter-item-inner"
|
|
||||||
// eslint-disable-next-line no-shadow
|
|
||||||
itemRender={({ value }) => {
|
|
||||||
return (
|
|
||||||
<Option key={value} text={value} value={value}>
|
|
||||||
<div className="code-input-value">{value}</div>
|
|
||||||
<div className="code-input-help">{helpMap[value]}</div>
|
|
||||||
</Option>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
onChange={this.onChange.bind(this)}
|
|
||||||
filter={this.filterOption.bind(this)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{childNode}
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.$input = this.findInputElement();
|
|
||||||
if (this.$input) {
|
|
||||||
this.listenerFun = event => {
|
|
||||||
const isMoveKey = !!(event.type == 'keyup' && ~[37, 38, 39, 91].indexOf(event.keyCode));
|
|
||||||
const isMouseup = event.type == 'mouseup';
|
|
||||||
if (isMoveKey || isMouseup) {
|
|
||||||
// eslint-disable-next-line react/no-access-state-in-setstate
|
|
||||||
const dataSource = this.getDataSource(this.state.value) || [];
|
|
||||||
this.setState({
|
|
||||||
dataSource,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
this.$input.addEventListener('keyup', this.listenerFun, false);
|
|
||||||
this.$input.addEventListener('mouseup', this.listenerFun, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
if (this.listenerFun && this.$input) {
|
|
||||||
this.$input.removeEventListener('keyup', this.listenerFun, false);
|
|
||||||
this.$input.removeEventListener('mouseup', this.listenerFun, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取Input输入框DOM节点
|
|
||||||
*/
|
|
||||||
findInputElement() {
|
|
||||||
return this.expression.current.children[0].getElementsByTagName('input')[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取光标位置
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
getInputCursorPosition() {
|
|
||||||
if (!this.$input) return;
|
|
||||||
return this.$input.selectionStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 字符串取得对象keys
|
|
||||||
*/
|
|
||||||
getObjectKeys(str: string) {
|
|
||||||
let keys: string | any[] = [];
|
|
||||||
if (str) keys = str.split('.');
|
|
||||||
return keys.slice(0, keys.length - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 设置input组件光标位置在闭合}前
|
|
||||||
*/
|
|
||||||
setInputCursorPosition(idx: number) {
|
|
||||||
this.$input.setSelectionRange(idx, idx);
|
|
||||||
this.forceUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,242 +0,0 @@
|
|||||||
export default [
|
|
||||||
{
|
|
||||||
label: 'constants',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'constants',
|
|
||||||
detail: '应用全局常量',
|
|
||||||
documentation: '应用范围定义的通用常量',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'utils',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'utils',
|
|
||||||
detail: '应用全局公共函数',
|
|
||||||
documentation: '应用范围扩展的公共函数',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'state',
|
|
||||||
kind: 'Enum',
|
|
||||||
insertText: 'state',
|
|
||||||
detail: '当前所在容器组件内部状态',
|
|
||||||
documentation: 'React Class内部状态state',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'setState',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'setState({\n\t$0\n})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '设置当前所在容器组件的state数据',
|
|
||||||
documentation: '原生React方法,会自动更新组件视图',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'reloadDataSource',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'reloadDataSource(${1:${2:namespace}, ${3:false}, ${4:callback}})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '刷新当前所在的容器组件',
|
|
||||||
documentation: '触发当前所在的容器组件,重新发送异步请求,并用最新数据更新视图',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'location',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'location',
|
|
||||||
detail: '路由解析对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'location.query',
|
|
||||||
kind: 'Value',
|
|
||||||
insertText: 'location.query.${1:xxxx}',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '从路由解析对象中获取参数信息',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'history',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'history',
|
|
||||||
detail: '路由历史对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'React',
|
|
||||||
kind: 'Keyword',
|
|
||||||
insertText: 'React',
|
|
||||||
detail: 'React对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'ReactDOM',
|
|
||||||
kind: 'Keyword',
|
|
||||||
insertText: 'ReactDOM',
|
|
||||||
detail: 'ReactDom对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'ReactDOM.findDOMNode',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'ReactDOM.findDOMNode(${1:this.refs.xxxx})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'ReactDom查找真实dom node',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Dialog.alert',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Dialog.alert({',
|
|
||||||
"\tcontent: '${1:Alert content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'alert弹框 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Dialog.confirm',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Dialog.confirm({',
|
|
||||||
"\tcontent: '${1:Confirm content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '确认弹出框 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.success',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.success(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '成功反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.error',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.error(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '错误反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.help',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.help(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '帮助反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.loading',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.loading(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'loading反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.notice',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.notice(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '注意反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.waining',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.waining(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '警告反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.confirm',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.confirm({',
|
|
||||||
"\tcontent: '${1:Confirm content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '确认弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.info',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.info({',
|
|
||||||
"\tcontent: '${1:Info content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '信息弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.success',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.success({',
|
|
||||||
"\tcontent: '${1:Success content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '成功弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.error',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.error({',
|
|
||||||
"\tcontent: '${1:Error content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '错误弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.warning',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.warning({',
|
|
||||||
"\tcontent: '${1:Warning content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '警告弹出框 By Antd',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import IntlMessageFormat from 'intl-messageformat';
|
|
||||||
|
|
||||||
export const isJSExpression = (obj = '') => {
|
|
||||||
if (obj && typeof obj === 'object' && obj.type === 'JSExpression') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于构造国际化字符串处理函数
|
|
||||||
* @param {*} locale 国际化标识,例如 zh-CN、en-US
|
|
||||||
* @param {*} messages 国际化语言包
|
|
||||||
*/
|
|
||||||
export const generateI18n = (locale = 'zh-CN', messages = {}) => {
|
|
||||||
return function (key, values = {}) {
|
|
||||||
if (!messages || !messages[key]) return '';
|
|
||||||
const formater = new IntlMessageFormat(messages[key], locale);
|
|
||||||
return formater.format(values);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
export default {
|
|
||||||
// function
|
|
||||||
setting: '点击设置',
|
|
||||||
edit: '编辑',
|
|
||||||
submitConfirm: '确认提交 cmd+s',
|
|
||||||
close: '关闭 esc',
|
|
||||||
fullScreen: '全屏',
|
|
||||||
cancelFullScreen: '取消全屏',
|
|
||||||
jsonIllegal: '非json格式',
|
|
||||||
functionIllegal: '非function格式',
|
|
||||||
objectIllegal: '非object格式',
|
|
||||||
circularRef: '对象中出现循环引用的对象',
|
|
||||||
formatError: '格式错误',
|
|
||||||
saved: '已保存',
|
|
||||||
// expression
|
|
||||||
valueIllegal: '值类型为对象类型,与当前组件属性设置的控件类型不匹配,请在属性“代码编辑模式”下进行编辑',
|
|
||||||
jsExpression: '请输入JS表达式',
|
|
||||||
// Mixin
|
|
||||||
input: '字符串Input',
|
|
||||||
textarea: '多行字符串Textarea',
|
|
||||||
expression: '变量控件Expression',
|
|
||||||
monacoEditor: '编辑器MonacoEditor',
|
|
||||||
numberPicker: '数字NumberPicker',
|
|
||||||
bool: '布尔Switch',
|
|
||||||
datePicker: '日期选择DatePicker',
|
|
||||||
select: '下拉选择Select',
|
|
||||||
radio: '单项选择RadioGroup',
|
|
||||||
date: '日期选择DatePicker',
|
|
||||||
dateYear: '年选择DatePicker',
|
|
||||||
dateMonth: '月选择DatePicker',
|
|
||||||
dateRange: '日期区间选择DatePicker',
|
|
||||||
list: '数组List',
|
|
||||||
object: '对象ObjectButton',
|
|
||||||
reactNode: '节点类型ReactNode',
|
|
||||||
typeError: 'Minix组件属性Types配置错误,存在不支持类型[{type}],请检查组件属性配置',
|
|
||||||
};
|
|
||||||
@ -1,230 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
// import PropTypes from 'prop-types';
|
|
||||||
import { Button, Icon, Dialog } from '@alifd/next';
|
|
||||||
import MonacoEditor from 'react-monaco-editor';
|
|
||||||
import { js_beautify } from 'js-beautify';
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
const SETTER_NAME = 'function-setter';
|
|
||||||
|
|
||||||
const defaultEditorOption = {
|
|
||||||
width: '100%',
|
|
||||||
height: '100%',
|
|
||||||
options: {
|
|
||||||
readOnly: false,
|
|
||||||
automaticLayout: true,
|
|
||||||
folding: true, // 默认开启折叠代码功能
|
|
||||||
lineNumbers: 'on',
|
|
||||||
wordWrap: 'off',
|
|
||||||
formatOnPaste: true,
|
|
||||||
fontSize: 12,
|
|
||||||
tabSize: 2,
|
|
||||||
scrollBeyondLastLine: false,
|
|
||||||
fixedOverflowWidgets: false,
|
|
||||||
snippetSuggestions: 'top',
|
|
||||||
minimap: {
|
|
||||||
enabled: false,
|
|
||||||
},
|
|
||||||
scrollbar: {
|
|
||||||
vertical: 'auto',
|
|
||||||
horizontal: 'auto',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
interface FunctionSetterProps {
|
|
||||||
value: string;
|
|
||||||
type: string;
|
|
||||||
defaultValue: string;
|
|
||||||
placeholder: string;
|
|
||||||
hasClear: boolean;
|
|
||||||
onChange: (icon: string) => undefined;
|
|
||||||
icons: string[];
|
|
||||||
}
|
|
||||||
export default class FunctionSetter extends PureComponent<FunctionSetterProps> {
|
|
||||||
static defaultProps = {
|
|
||||||
value: undefined,
|
|
||||||
type: 'string',
|
|
||||||
defaultValue: '',
|
|
||||||
hasClear: true,
|
|
||||||
placeholder: '请点击选择 Icon',
|
|
||||||
onChange: () => undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
private emitEventName = '';
|
|
||||||
|
|
||||||
state = {
|
|
||||||
isShowDialog: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
this.emitEventName = `${SETTER_NAME}-${this.props.field.id}`;
|
|
||||||
editor.on(`${this.emitEventName}.bindEvent`, this.bindEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
bindEvent = (eventName) => {
|
|
||||||
this.bindEventCallback(eventName);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
editor.off(`${this.emitEventName}.bindEvent`, this.bindEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bindFunction = () => {
|
|
||||||
const { field } = this.props;
|
|
||||||
field.editor.emit('eventBindDialog.openDialog', field.name, this.emitEventName);
|
|
||||||
};
|
|
||||||
|
|
||||||
openDialog = () => {
|
|
||||||
const { value = {} } = this.props;
|
|
||||||
this.setState({
|
|
||||||
isShowDialog: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.functionCode = value.value;
|
|
||||||
};
|
|
||||||
|
|
||||||
closeDialog = () => {
|
|
||||||
this.setState({
|
|
||||||
isShowDialog: false,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
removeFunctionBind = () => {
|
|
||||||
const { removeProp } = this.props;
|
|
||||||
removeProp();
|
|
||||||
};
|
|
||||||
|
|
||||||
parseFunctionName = (functionString: string) => {
|
|
||||||
// 因为函数格式是固定的,所以可以按照字符换去匹配获取函数名
|
|
||||||
const funNameStr = functionString.split('this.')[1];
|
|
||||||
|
|
||||||
|
|
||||||
if (funNameStr) {
|
|
||||||
const endIndex = funNameStr.indexOf('(');
|
|
||||||
return funNameStr.substr(0, endIndex);
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 渲染按钮(初始状态)
|
|
||||||
*/
|
|
||||||
renderButton = () => {
|
|
||||||
return <Button type="normal" onClick={() => this.bindFunction()}>绑定函数</Button>;
|
|
||||||
};
|
|
||||||
|
|
||||||
updateCode = (newCode) => {
|
|
||||||
this.functionCode = newCode;
|
|
||||||
};
|
|
||||||
|
|
||||||
onDialogOk = () => {
|
|
||||||
const { onChange } = this.props;
|
|
||||||
onChange({
|
|
||||||
type: 'JSFunction',
|
|
||||||
value: this.functionCode,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.closeDialog();
|
|
||||||
};
|
|
||||||
|
|
||||||
focusFunctionName = (functionName) => {
|
|
||||||
const { editor } = this.props.field;
|
|
||||||
|
|
||||||
editor.get('skeleton').getPanel('sourceEditor').show();
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
editor.emit('sourceEditor.focusByFunction', {
|
|
||||||
functionName,
|
|
||||||
});
|
|
||||||
}, 300);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 渲染绑定函数
|
|
||||||
*/
|
|
||||||
renderBindFunction = () => {
|
|
||||||
const { value } = this.props;
|
|
||||||
|
|
||||||
// 解析函数名
|
|
||||||
const functionName = this.parseFunctionName(value.value);
|
|
||||||
return (
|
|
||||||
<div className="function-container">
|
|
||||||
<img className="funtion-icon" src="https://gw.alicdn.com/tfs/TB1NXNhk639YK4jSZPcXXXrUFXa-200-200.png" />
|
|
||||||
<span className="function-name" onClick={() => this.focusFunctionName(functionName)}>{functionName}</span>
|
|
||||||
<Icon type="set" size="medium" className="funtion-operate-icon" onClick={this.bindFunction} />
|
|
||||||
<Icon type="ashbin" size="medium" className="funtion-operate-icon" onClick={this.removeFunctionBind} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 渲染编辑函数按钮(可直接编辑函数内容)
|
|
||||||
*/
|
|
||||||
renderEditFunctionButton = () => {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<Button type="primary" onClick={this.openDialog}><Icon type="edit" />编辑函数</Button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
bindEventCallback = (eventName: string) => {
|
|
||||||
const { onChange } = this.props;
|
|
||||||
onChange({
|
|
||||||
type: 'JSFunction',
|
|
||||||
value: `function(){ this.${eventName}() }`,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { value } = this.props;
|
|
||||||
const { isShowDialog } = this.state;
|
|
||||||
|
|
||||||
let functionName = '';
|
|
||||||
if (value && value.value) {
|
|
||||||
functionName = this.parseFunctionName(value.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
let renderFunction;
|
|
||||||
if (value) {
|
|
||||||
if (functionName) {
|
|
||||||
renderFunction = this.renderBindFunction;
|
|
||||||
} else {
|
|
||||||
renderFunction = this.renderEditFunctionButton;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
renderFunction = this.renderButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="lc-function-setter">
|
|
||||||
{
|
|
||||||
renderFunction()
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
value && value.value &&
|
|
||||||
<Dialog visible={isShowDialog} closeable={'close'} title="函数编辑" onCancel={this.closeDialog} onOk={this.onDialogOk} onClose={() => { this.closeDialog(); }}>
|
|
||||||
<div style={{ width: '500px', height: '400px' }}>
|
|
||||||
<MonacoEditor
|
|
||||||
value={js_beautify(value.value)}
|
|
||||||
{...defaultEditorOption}
|
|
||||||
{...{ language: 'javascript' }}
|
|
||||||
onChange={(newCode) => this.updateCode(newCode)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</Dialog>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,171 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
// import PropTypes from 'prop-types';
|
|
||||||
import { Input, Icon, Balloon } from '@alifd/next';
|
|
||||||
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
const icons = [
|
|
||||||
'smile',
|
|
||||||
'cry',
|
|
||||||
'success',
|
|
||||||
'warning',
|
|
||||||
'prompt',
|
|
||||||
'error',
|
|
||||||
'help',
|
|
||||||
'clock',
|
|
||||||
'success-filling',
|
|
||||||
'delete-filling',
|
|
||||||
'favorites-filling',
|
|
||||||
'add',
|
|
||||||
'minus',
|
|
||||||
'arrow-up',
|
|
||||||
'arrow-down',
|
|
||||||
'arrow-left',
|
|
||||||
'arrow-right',
|
|
||||||
'arrow-double-left',
|
|
||||||
'arrow-double-right',
|
|
||||||
'switch',
|
|
||||||
'sorting',
|
|
||||||
'descending',
|
|
||||||
'ascending',
|
|
||||||
'select',
|
|
||||||
'semi-select',
|
|
||||||
'loading',
|
|
||||||
'search',
|
|
||||||
'close',
|
|
||||||
'ellipsis',
|
|
||||||
'picture',
|
|
||||||
'calendar',
|
|
||||||
'ashbin',
|
|
||||||
'upload',
|
|
||||||
'download',
|
|
||||||
'set',
|
|
||||||
'edit',
|
|
||||||
'refresh',
|
|
||||||
'filter',
|
|
||||||
'attachment',
|
|
||||||
'account',
|
|
||||||
'email',
|
|
||||||
'atm',
|
|
||||||
'copy',
|
|
||||||
'exit',
|
|
||||||
'eye',
|
|
||||||
'eye-close',
|
|
||||||
'toggle-left',
|
|
||||||
'toggle-right',
|
|
||||||
'lock',
|
|
||||||
'unlock',
|
|
||||||
'chart-pie',
|
|
||||||
'chart-bar',
|
|
||||||
'form',
|
|
||||||
'detail',
|
|
||||||
'list',
|
|
||||||
'dashboard',
|
|
||||||
];
|
|
||||||
interface IconSetterProps {
|
|
||||||
value: string;
|
|
||||||
type: string;
|
|
||||||
defaultValue: string;
|
|
||||||
placeholder: string;
|
|
||||||
hasClear: boolean;
|
|
||||||
onChange: (icon: string) => undefined;
|
|
||||||
icons: string[];
|
|
||||||
}
|
|
||||||
export default class IconSetter extends PureComponent<IconSetterProps> {
|
|
||||||
static defaultProps = {
|
|
||||||
value: undefined,
|
|
||||||
type: 'string',
|
|
||||||
defaultValue: '',
|
|
||||||
hasClear: true,
|
|
||||||
icons,
|
|
||||||
placeholder: '请点击选择 Icon',
|
|
||||||
onChange: () => undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
state = {
|
|
||||||
firstLoad: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
_onChange = (icon: string) => {
|
|
||||||
const { onChange, type } = this.props;
|
|
||||||
if (type === 'string') {
|
|
||||||
onChange(icon);
|
|
||||||
} else if (type === 'node') {
|
|
||||||
onChange({
|
|
||||||
componentName: 'Icon',
|
|
||||||
props: {
|
|
||||||
type: icon,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
onInputChange = (icon: string) => {
|
|
||||||
this._onChange(icon);
|
|
||||||
};
|
|
||||||
|
|
||||||
onSelectIcon = (icon: string) => {
|
|
||||||
this._onChange(icon);
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { value, defaultValue, onChange, placeholder, hasClear } = this.props;
|
|
||||||
const { firstLoad } = this.state;
|
|
||||||
const _value = typeof value === 'object' ? value?.props?.type : value;
|
|
||||||
if (firstLoad && defaultValue && typeof value === 'undefined') {
|
|
||||||
onChange(defaultValue);
|
|
||||||
this.setState({
|
|
||||||
firstLoad: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const currentIcon = <Icon size="xs" type={_value} />;
|
|
||||||
const clearIcon = hasClear && (
|
|
||||||
<Icon
|
|
||||||
size="xs"
|
|
||||||
id="icon-clear"
|
|
||||||
type="delete-filling"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
this.onSelectIcon('');
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
|
|
||||||
const triggerNode = (
|
|
||||||
<div>
|
|
||||||
<Input
|
|
||||||
placeholder={placeholder}
|
|
||||||
addonTextBefore={currentIcon}
|
|
||||||
onChange={this.onInputChange}
|
|
||||||
value={_value}
|
|
||||||
defaultValue={defaultValue}
|
|
||||||
readOnly
|
|
||||||
addonTextAfter={clearIcon}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
const InnerBeforeNode = (
|
|
||||||
<Balloon
|
|
||||||
className={'lowcode-icon-content'}
|
|
||||||
trigger={triggerNode}
|
|
||||||
needAdjust
|
|
||||||
triggerType="click"
|
|
||||||
closable={false}
|
|
||||||
alignEdge
|
|
||||||
align="l"
|
|
||||||
popupClassName="lowcode-icon-setter-popup"
|
|
||||||
>
|
|
||||||
<ul className="lowcode-icon-list">
|
|
||||||
{icons.map((icon) => (
|
|
||||||
<li key={icon} onClick={() => this.onSelectIcon(icon)}>
|
|
||||||
<Icon type={icon} size="medium" />
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</Balloon>
|
|
||||||
);
|
|
||||||
|
|
||||||
return <div className="lc-icon-setter">{InnerBeforeNode}</div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,131 +0,0 @@
|
|||||||
import React, { Component } from 'react';
|
|
||||||
import { registerSetter } from '@ali/lowcode-editor-core';
|
|
||||||
import { isJSExpression, isJSFunction } from '@ali/lowcode-types';
|
|
||||||
import { DatePicker, TimePicker, Input, Radio, Select, Switch, NumberPicker } from '@alifd/next';
|
|
||||||
import ExpressionSetter from './expression-setter';
|
|
||||||
import ColorSetter from './color-setter';
|
|
||||||
import JsonSetter from './json-setter';
|
|
||||||
import EventsSetter from './events-setter';
|
|
||||||
import StyleSetter from './style-setter';
|
|
||||||
import IconSetter from './icon-setter';
|
|
||||||
import FunctionSetter from './function-setter';
|
|
||||||
// import ClassNameSetter from './classname-setter';
|
|
||||||
// import MixedSetter from './mixed-setter';
|
|
||||||
|
|
||||||
export const StringSetter = {
|
|
||||||
component: Input,
|
|
||||||
defaultProps: { placeholder: '请输入', style: { maxWidth: 180 } },
|
|
||||||
title: 'StringSetter',
|
|
||||||
recommend: true,
|
|
||||||
condition: (field: any) => {
|
|
||||||
const v = field.getValue();
|
|
||||||
return typeof v === 'string';
|
|
||||||
},
|
|
||||||
};
|
|
||||||
export const NumberSetter = NumberPicker;
|
|
||||||
export class BoolSetter extends Component {
|
|
||||||
render() {
|
|
||||||
const { onChange, value, defaultValue } = this.props;
|
|
||||||
return <Switch checked={value} defaultChecked={defaultValue} onChange={onChange} />;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export const SelectSetter = Select;
|
|
||||||
|
|
||||||
// suggest: 做成 SelectSetter 一种变体
|
|
||||||
export const RadioGroupSetter = {
|
|
||||||
component: Radio.Group,
|
|
||||||
defaultProps: {
|
|
||||||
shape: 'button',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
// suggest: 做成 StringSetter 的一个参数,
|
|
||||||
export const TextAreaSetter = {
|
|
||||||
component: Input.TextArea,
|
|
||||||
defaultProps: { placeholder: '请输入', style: { maxWidth: 180 } },
|
|
||||||
title: 'TextAreaSetter',
|
|
||||||
recommend: true,
|
|
||||||
condition: (field: any) => {
|
|
||||||
const v = field.getValue();
|
|
||||||
return typeof v === 'string';
|
|
||||||
},
|
|
||||||
};
|
|
||||||
export const DateSetter = DatePicker;
|
|
||||||
export const DateYearSetter = DatePicker.YearPicker;
|
|
||||||
export const DateMonthSetter = DatePicker.MonthPicker;
|
|
||||||
export const DateRangeSetter = DatePicker.RangePicker;
|
|
||||||
|
|
||||||
export { ExpressionSetter, EventsSetter, JsonSetter, IconSetter };
|
|
||||||
|
|
||||||
// eslint-disable-next-line react/no-multi-comp
|
|
||||||
class StringDateSetter extends Component {
|
|
||||||
render() {
|
|
||||||
const { onChange } = this.props;
|
|
||||||
return (
|
|
||||||
<DatePicker
|
|
||||||
onChange={(val) => {
|
|
||||||
onChange(val.format());
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line react/no-multi-comp
|
|
||||||
class StringTimePicker extends Component {
|
|
||||||
render() {
|
|
||||||
const { onChange } = this.props;
|
|
||||||
return (
|
|
||||||
<TimePicker
|
|
||||||
onChange={(val) => {
|
|
||||||
onChange(val.format('HH:mm:ss'));
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const VariableSetter = {
|
|
||||||
component: ExpressionSetter,
|
|
||||||
condition: (field: any) => {
|
|
||||||
const v = field.getValue();
|
|
||||||
return isJSExpression(v);
|
|
||||||
},
|
|
||||||
defaultProps: { placeholder: '请输入表达式' },
|
|
||||||
title: '表达式输入',
|
|
||||||
recommend: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const FunctionBindSetter = {
|
|
||||||
component: FunctionSetter,
|
|
||||||
title: '函数绑定',
|
|
||||||
condition: (field: any) => {
|
|
||||||
const v = field.getValue();
|
|
||||||
return v == isJSFunction(v);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const builtinSetters: any = {
|
|
||||||
StringSetter,
|
|
||||||
NumberSetter,
|
|
||||||
BoolSetter,
|
|
||||||
SelectSetter,
|
|
||||||
VariableSetter,
|
|
||||||
ExpressionSetter: VariableSetter,
|
|
||||||
RadioGroupSetter,
|
|
||||||
TextAreaSetter,
|
|
||||||
DateSetter: StringDateSetter,
|
|
||||||
TimePicker: StringTimePicker,
|
|
||||||
DateYearSetter,
|
|
||||||
DateMonthSetter,
|
|
||||||
DateRangeSetter,
|
|
||||||
EventsSetter,
|
|
||||||
ColorSetter,
|
|
||||||
JsonSetter,
|
|
||||||
StyleSetter,
|
|
||||||
IconSetter,
|
|
||||||
ClassNameSetter,
|
|
||||||
FunctionSetter: FunctionBindSetter,
|
|
||||||
};
|
|
||||||
|
|
||||||
registerSetter(builtinSetters);
|
|
||||||
@ -1,622 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { js_beautify, css_beautify } from 'js-beautify';
|
|
||||||
import MonacoEditor from 'react-monaco-editor';
|
|
||||||
import classNames from 'classnames';
|
|
||||||
|
|
||||||
import { Icon, Message } from '@alife/next';
|
|
||||||
import ObjectButton from '@ali/iceluna-comp-object-button';
|
|
||||||
import FormItem from '@ali/iceluna-comp-form/lib/item';
|
|
||||||
import { serialize, jsonuri, generateI18n } from '@ali/iceluna-sdk/lib/utils';
|
|
||||||
import localeConfig from '@ali/iceluna-sdk/lib/hoc/localeConfig';
|
|
||||||
|
|
||||||
import Snippets from './locale/snippets';
|
|
||||||
import zhCN from './locale/zh-CN';
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
let registerApiAndSnippetStatus = false; // 判断注册api机制
|
|
||||||
|
|
||||||
window.bt = js_beautify;
|
|
||||||
class MonacoEditorView extends PureComponent {
|
|
||||||
static displayName = 'MonacoEditor';
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { type, ...restProps } = this.props;
|
|
||||||
const Node = type == 'button' ? MonacoEditorButtonView : MonacoEditorDefaultView;
|
|
||||||
return <Node {...restProps} registerApi={(apis) => Object.assign(this, apis)} />;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
localeConfig('MonacoEditor', MonacoEditorView);
|
|
||||||
|
|
||||||
// monaco编辑器存在3种主题:vs、vs-dark、hc-black
|
|
||||||
// eslint-disable-next-line react/no-multi-comp
|
|
||||||
class MonacoEditorDefaultView extends PureComponent {
|
|
||||||
static displayName = 'MonacoEditorDefault';
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
locale: PropTypes.string,
|
|
||||||
messages: PropTypes.object,
|
|
||||||
language: PropTypes.string,
|
|
||||||
};
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
locale: 'zh-CN',
|
|
||||||
messages: zhCN,
|
|
||||||
width: '100%',
|
|
||||||
height: '300px',
|
|
||||||
language: 'json',
|
|
||||||
autoFocus: false, // 自动获得焦点
|
|
||||||
autoSubmit: true, // 自动提交
|
|
||||||
placeholder: '', // 默认占位内容
|
|
||||||
btnText: '提交',
|
|
||||||
btnSize: 'small',
|
|
||||||
rules: [], // 校验规则
|
|
||||||
options: {
|
|
||||||
readOnly: false,
|
|
||||||
automaticLayout: true,
|
|
||||||
folding: true, // 默认开启折叠代码功能
|
|
||||||
lineNumbers: 'on',
|
|
||||||
wordWrap: 'off',
|
|
||||||
formatOnPaste: true,
|
|
||||||
fontSize: 12,
|
|
||||||
tabSize: 2,
|
|
||||||
scrollBeyondLastLine: false,
|
|
||||||
fixedOverflowWidgets: false,
|
|
||||||
snippetSuggestions: 'top',
|
|
||||||
minimap: {
|
|
||||||
enabled: true,
|
|
||||||
},
|
|
||||||
scrollbar: {
|
|
||||||
vertical: 'hidden',
|
|
||||||
horizontal: 'hidden',
|
|
||||||
verticalScrollbarSize: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
strValue: string;
|
|
||||||
|
|
||||||
i18n: any;
|
|
||||||
|
|
||||||
editorRef: React.RefObject<unknown>;
|
|
||||||
|
|
||||||
options: any;
|
|
||||||
|
|
||||||
fullScreenOptions: any;
|
|
||||||
|
|
||||||
position: any;
|
|
||||||
|
|
||||||
editor: any;
|
|
||||||
|
|
||||||
editorNode: unknown;
|
|
||||||
|
|
||||||
editorParentNode: any;
|
|
||||||
|
|
||||||
constructor(props: Readonly) {
|
|
||||||
super(props);
|
|
||||||
this.strValue = '';
|
|
||||||
this.i18n = generateI18n(props.locale, props.messages);
|
|
||||||
this.editorRef = React.createRef();
|
|
||||||
this.options = Object.assign({}, MonacoEditorDefaultView.defaultProps.options, props.options);
|
|
||||||
this.fullScreenOptions = {
|
|
||||||
...this.options,
|
|
||||||
lineNumbers: 'on',
|
|
||||||
folding: true,
|
|
||||||
scrollBeyondLastLine: true,
|
|
||||||
minimap: {
|
|
||||||
enabled: true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
this.state = {
|
|
||||||
isFullScreen: false,
|
|
||||||
};
|
|
||||||
this.onChange = this.onChange.bind(this);
|
|
||||||
this.onSubmit = this.onSubmit.bind(this);
|
|
||||||
this.fullScreen = this.fullScreen.bind(this);
|
|
||||||
this.format = this.format.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidUpdate() {
|
|
||||||
// 如果是全屏操作,获得焦点,光标保留在原来位置;
|
|
||||||
if (this.position) {
|
|
||||||
this.editor.focus();
|
|
||||||
this.editor.setPosition(this.position);
|
|
||||||
delete this.position;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.editorNode = this.editorRef.current; // 记录当前dom节点;
|
|
||||||
this.editorParentNode = this.editorNode.parentNode; // 记录父节点;
|
|
||||||
// 自动获得焦点, 格式化需要时间
|
|
||||||
if (this.props.autoFocus) {
|
|
||||||
setTimeout(() => {
|
|
||||||
this.editor.setPosition({
|
|
||||||
column: 4,
|
|
||||||
lineNumber: 2,
|
|
||||||
});
|
|
||||||
this.editor.focus();
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
// 快捷键编码
|
|
||||||
const CtrlCmd = 2048;
|
|
||||||
const KEY_S = 49;
|
|
||||||
const Shift = 1024;
|
|
||||||
const KEY_F = 36;
|
|
||||||
const KEY_B = 32;
|
|
||||||
const Escape = 9;
|
|
||||||
|
|
||||||
this.editor.addCommand(CtrlCmd | KEY_S, () => {
|
|
||||||
this.onSubmit(); // 保存快捷键
|
|
||||||
});
|
|
||||||
this.editor.addCommand(CtrlCmd | Shift | KEY_F, () => {
|
|
||||||
this.fullScreen(); // 全屏快捷键
|
|
||||||
});
|
|
||||||
this.editor.addCommand(CtrlCmd | KEY_B, () => {
|
|
||||||
this.format(); // 美化快捷键
|
|
||||||
});
|
|
||||||
this.editor.addCommand(Escape, () => {
|
|
||||||
this.props.onEscape && this.props.onEscape();
|
|
||||||
});
|
|
||||||
// 注册api
|
|
||||||
this.editor.submit = this.onSubmit;
|
|
||||||
this.editor.format = this.format;
|
|
||||||
this.editor.fullScreen = this.fullScreen;
|
|
||||||
this.editor.toJson = this.toJson;
|
|
||||||
this.editor.toObject = this.toObject;
|
|
||||||
this.editor.toFunction = this.toFunction;
|
|
||||||
// 针对object情况,改写setValue和getValue api
|
|
||||||
if (this.props.language === 'object') {
|
|
||||||
const { getValue } = this.editor;
|
|
||||||
const { setValue } = this.editor;
|
|
||||||
this.editor.getValue = () => {
|
|
||||||
return getValue.call(this.editor).substring(this.valuePrefix.length);
|
|
||||||
};
|
|
||||||
this.editor.setValue = (value) => {
|
|
||||||
return setValue.call(this.editor, [this.valuePrefix + value]);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
value,
|
|
||||||
placeholder,
|
|
||||||
style,
|
|
||||||
className,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
language,
|
|
||||||
theme,
|
|
||||||
editorWillMount,
|
|
||||||
editorDidMount,
|
|
||||||
registerApi,
|
|
||||||
} = this.props;
|
|
||||||
|
|
||||||
const { isFullScreen } = this.state;
|
|
||||||
this.valuePrefix = ''; // 值前缀
|
|
||||||
if (language === 'object') this.valuePrefix = 'export default ';
|
|
||||||
if (!this.isFullScreenAction) {
|
|
||||||
// 将值转换成目标值
|
|
||||||
const nowValue = this.valueHandler(value || placeholder, language);
|
|
||||||
const curValue = this.valueHandler(this.strValue, language);
|
|
||||||
if (nowValue !== curValue) this.strValue = nowValue;
|
|
||||||
if (language === 'object') this.strValue = this.strValue || placeholder || '{\n\t\n}'; // 设置初始化值
|
|
||||||
if (language === 'json' && this.strValue === '{}') this.strValue = '{\n\t\n}';
|
|
||||||
}
|
|
||||||
this.isFullScreenAction = false;
|
|
||||||
// 真实高亮语言
|
|
||||||
let tarLanguage = language;
|
|
||||||
if (language === 'object' || language === 'function') {
|
|
||||||
tarLanguage = 'javascript';
|
|
||||||
}
|
|
||||||
const classes = classNames('monaco-editor-wrap', {
|
|
||||||
'monaco-fullscreen': !!isFullScreen,
|
|
||||||
'monaco-nofullscreen': !isFullScreen,
|
|
||||||
});
|
|
||||||
const tarStyle = Object.assign({ minHeight: 60, width, height }, style);
|
|
||||||
let tempValue = this.valuePrefix + this.strValue;
|
|
||||||
if (tarLanguage === 'json') {
|
|
||||||
try {
|
|
||||||
tempValue = JSON.stringify(JSON.parse(tempValue || '{}'), null, 2);
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div className={className} style={tarStyle}>
|
|
||||||
<div ref={this.editorRef} style={{ height: '100%' }} className={classes}>
|
|
||||||
<MonacoEditor
|
|
||||||
value={tempValue}
|
|
||||||
width="100%"
|
|
||||||
height="300"
|
|
||||||
language={tarLanguage}
|
|
||||||
theme={theme || window.__monacoTheme}
|
|
||||||
options={isFullScreen ? this.fullScreenOptions : this.options}
|
|
||||||
onChange={this.onChange}
|
|
||||||
editorWillMount={editorWillMount}
|
|
||||||
editorDidMount={(editor, monaco) => {
|
|
||||||
this.editor = editor;
|
|
||||||
registerApi({ editor });
|
|
||||||
this.registerApiAndSnippet(monaco);
|
|
||||||
editorDidMount && editorDidMount.call(this, arguments);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<a
|
|
||||||
onClick={this.fullScreen}
|
|
||||||
className="monaco_fullscreen_icon"
|
|
||||||
title={
|
|
||||||
isFullScreen ? `${this.i18n('cancelFullScreen')} cmd+shift+f` : `${this.i18n('fullScreen')} cmd+shift+f`
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Icon type={isFullScreen ? 'quxiaoquanping' : 'quanping'} />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 值变化
|
|
||||||
onChange(curValue) {
|
|
||||||
if (curValue === this.valuePrefix + this.strValue) return;
|
|
||||||
const { onAfterChange, language, autoSubmit, onChange } = this.props;
|
|
||||||
this.strValue = curValue; // 记录当前格式
|
|
||||||
if (this.ct) clearTimeout(this.ct);
|
|
||||||
this.ct = setTimeout(() => {
|
|
||||||
this.position = this.editor.getPosition();
|
|
||||||
const ret = this.resultHandler(curValue, language);
|
|
||||||
if (autoSubmit) onChange && onChange(ret.value);
|
|
||||||
onAfterChange && onAfterChange(ret.value, ret.error, this.editor);
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 提交动作
|
|
||||||
onSubmit() {
|
|
||||||
const { onSubmit, onChange, language } = this.props;
|
|
||||||
const curValue = this.editor.getValue();
|
|
||||||
const ret = this.resultHandler(curValue, language);
|
|
||||||
if (!ret.error) onChange && onChange(ret.value);
|
|
||||||
onSubmit && onSubmit(ret.value, ret.error, this.editor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 值类型转换处理
|
|
||||||
valueHandler(value, language) {
|
|
||||||
let tarValue = value || '';
|
|
||||||
if (language === 'json') {
|
|
||||||
if (value && typeof value === 'object') {
|
|
||||||
tarValue = JSON.stringify(value, null, 2);
|
|
||||||
} else if (value && typeof value === 'string') {
|
|
||||||
try {
|
|
||||||
const ret = this.toJson(value);
|
|
||||||
if (!ret.error) {
|
|
||||||
tarValue = JSON.stringify(ret.value, null, 2);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (language === 'function') {
|
|
||||||
if (typeof value === 'function') {
|
|
||||||
tarValue = value.toString();
|
|
||||||
}
|
|
||||||
if (tarValue && typeof tarValue === 'string') {
|
|
||||||
tarValue = js_beautify(tarValue, { indent_size: 2, indent_empty_lines: true });
|
|
||||||
}
|
|
||||||
} else if (language === 'object') {
|
|
||||||
// 先转成对象,在进行序列化和格式化;
|
|
||||||
value = value || {};
|
|
||||||
if (value && typeof value === 'object') {
|
|
||||||
try {
|
|
||||||
tarValue = serialize(value, { unsafe: true });
|
|
||||||
tarValue = js_beautify(tarValue, { indent_size: 2, indent_empty_lines: true });
|
|
||||||
} catch (err) {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
} else if (typeof value === 'string') {
|
|
||||||
try {
|
|
||||||
const ret = this.resultHandler(value, 'object');
|
|
||||||
tarValue = ret.error ? ret.value : serialize(ret.value, { unsafe: true });
|
|
||||||
tarValue = js_beautify(tarValue, { indent_size: 2, indent_empty_lines: true });
|
|
||||||
} catch (err) {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tarValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 结果处理
|
|
||||||
resultHandler(value, language) {
|
|
||||||
let ret = { value };
|
|
||||||
if (language === 'json') {
|
|
||||||
ret = this.toJson(value);
|
|
||||||
} else if (language === 'object') {
|
|
||||||
ret = this.toObject(value);
|
|
||||||
} else if (language === 'function') {
|
|
||||||
ret = this.toFunction(value);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置全屏时的动作
|
|
||||||
fullScreen() {
|
|
||||||
if (!this.editorRef) return;
|
|
||||||
// 还原到原来位置;
|
|
||||||
this.position = this.editor.getPosition();
|
|
||||||
if (this.state.isFullScreen) {
|
|
||||||
if (this.editorParentNode) {
|
|
||||||
if (this.editorParentNode.firstChild) {
|
|
||||||
this.editorParentNode.insertBefore(this.editorNode, this.editorParentNode.firstChild);
|
|
||||||
} else {
|
|
||||||
this.editorParentNode.appendChild(this.editorNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
document.body.appendChild(this.editorNode);
|
|
||||||
}
|
|
||||||
// eslint-disable-next-line react/no-access-state-in-setstate
|
|
||||||
const nextFs = !this.state.isFullScreen;
|
|
||||||
this.isFullScreenAction = true; // 记录是全屏幕操作
|
|
||||||
this.setState(
|
|
||||||
{
|
|
||||||
isFullScreen: nextFs,
|
|
||||||
},
|
|
||||||
() => {
|
|
||||||
this.editor.updateOptions(nextFs ? this.fullScreenOptions : this.options);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 美化代码
|
|
||||||
format() {
|
|
||||||
if (!this.editor) return;
|
|
||||||
if (/^\$_obj?\{.*?\}$/m.test(this.editor.getValue())) return;
|
|
||||||
if (this.props.language === 'json' || this.props.language === 'object' || this.props.language === 'function') {
|
|
||||||
const tarValue = js_beautify(this.editor.getValue(), { indent_size: 2 });
|
|
||||||
this.editor.setValue(tarValue);
|
|
||||||
} else if (this.props.language === 'less' || this.props.language === 'css' || this.props.language === 'scss') {
|
|
||||||
const tarValue = css_beautify(this.editor.getValue(), { indent_size: 2 });
|
|
||||||
this.editor.setValue(tarValue);
|
|
||||||
} else {
|
|
||||||
this.editor.getAction('editor.action.formatDocument').run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 校验是否是json
|
|
||||||
toJson(value) {
|
|
||||||
try {
|
|
||||||
// eslint-disable-next-line no-new-func
|
|
||||||
const obj = new Function(`'use strict'; return ${value.replace(/[\r\n\t]/g, '')}`)();
|
|
||||||
if (typeof obj === 'object' && obj) {
|
|
||||||
// eslint-disable-next-line no-new-func
|
|
||||||
const tarValue = new Function(`'use strict'; return ${value}`)();
|
|
||||||
return { value: JSON.parse(JSON.stringify(tarValue)) };
|
|
||||||
}
|
|
||||||
return { error: this.i18n('jsonIllegal'), value };
|
|
||||||
} catch (err) {
|
|
||||||
return { error: err, value };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 校验是否为object对象
|
|
||||||
toObject(value) {
|
|
||||||
try {
|
|
||||||
// eslint-disable-next-line no-new-func
|
|
||||||
const obj = new Function(`'use strict';return ${value}`)();
|
|
||||||
if (obj && typeof obj === 'object') {
|
|
||||||
if (jsonuri.isCircular(obj)) return { error: this.i18n('circularRef'), value };
|
|
||||||
return { value: obj };
|
|
||||||
} else {
|
|
||||||
return { error: this.i18n('objectIllegal'), value };
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
return { error: err, value };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 校验是否为function
|
|
||||||
toFunction(value) {
|
|
||||||
try {
|
|
||||||
// eslint-disable-next-line no-new-func
|
|
||||||
const fun = new Function(`'use strict';return ${value}`)();
|
|
||||||
if (fun && typeof fun === 'function') {
|
|
||||||
return { value: fun };
|
|
||||||
} else {
|
|
||||||
return { error: this.i18n('functionIllegal'), value };
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
return { error: err, value };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册api和代码片段
|
|
||||||
registerApiAndSnippet(monaco) {
|
|
||||||
if (registerApiAndSnippetStatus) return;
|
|
||||||
registerApiAndSnippetStatus = true;
|
|
||||||
// 注册this.提示的方法;
|
|
||||||
const thisSuggestions = [];
|
|
||||||
Snippets.map((item) => {
|
|
||||||
if (!item.label || !item.kind || !item.insertText) return;
|
|
||||||
const tarItem = Object.assign(item, {
|
|
||||||
label: item.label,
|
|
||||||
kind: monaco.languages.CompletionItemKind[item.kind],
|
|
||||||
insertText: item.insertText,
|
|
||||||
});
|
|
||||||
if (item.insertTextRules) tarItem.insertTextRules = monaco.languages.CompletionItemInsertTextRule[item.insertTextRules];
|
|
||||||
thisSuggestions.push(tarItem);
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
monaco.languages.registerCompletionItemProvider('javascript', {
|
|
||||||
provideCompletionItems: (model, position) => {
|
|
||||||
const textUntilPosition = model.getValueInRange({
|
|
||||||
startLineNumber: position.lineNumber,
|
|
||||||
startColumn: 1,
|
|
||||||
endLineNumber: position.lineNumber,
|
|
||||||
endColumn: position.column,
|
|
||||||
});
|
|
||||||
const match = textUntilPosition.match(/(^this\.)|(\sthis\.)/);
|
|
||||||
const suggestions = match ? thisSuggestions : [];
|
|
||||||
return { suggestions };
|
|
||||||
},
|
|
||||||
triggerCharacters: ['.'],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// const prefix = 'data:text/javascript;charset=utf-8,';
|
|
||||||
// const baseUrl = 'https://g.alicdn.com/iceluna/iceluna-vendor/0.0.1/';
|
|
||||||
// window.MonacoEnvironment = {
|
|
||||||
// getWorkerUrl(label: string) {
|
|
||||||
// if (label === 'json') {
|
|
||||||
// return `${prefix}${encodeURIComponent(`
|
|
||||||
// importScripts('${baseUrl}json.worker.js');`)}`;
|
|
||||||
// }
|
|
||||||
// if (['css', 'less', 'scss'].includes(label)) {
|
|
||||||
// return `${prefix}${encodeURIComponent(`
|
|
||||||
// importScripts('${baseUrl}css.worker.js');`)}`;
|
|
||||||
// }
|
|
||||||
// if (label === 'html') {
|
|
||||||
// return `${prefix}${encodeURIComponent(`
|
|
||||||
// importScripts('${baseUrl}html.worker.js');`)}`;
|
|
||||||
// }
|
|
||||||
// if (['typescript', 'javascript'].includes(label)) {
|
|
||||||
// return `${prefix}${encodeURIComponent(`
|
|
||||||
// importScripts('${baseUrl}typescript.worker.js');`)}`;
|
|
||||||
// }
|
|
||||||
// return `${prefix}${encodeURIComponent(`
|
|
||||||
// importScripts('${baseUrl}editor.worker.js');`)}`;
|
|
||||||
// },
|
|
||||||
// };
|
|
||||||
|
|
||||||
// eslint-disable-next-line react/no-multi-comp
|
|
||||||
export default class MonacoEditorButtonView extends PureComponent {
|
|
||||||
static displayName = 'JsonSetter';
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
locale: PropTypes.string,
|
|
||||||
messages: PropTypes.object,
|
|
||||||
};
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
locale: 'zh-CN',
|
|
||||||
messages: zhCN,
|
|
||||||
};
|
|
||||||
|
|
||||||
i18n: any;
|
|
||||||
|
|
||||||
objectButtonRef: React.RefObject<unknown>;
|
|
||||||
|
|
||||||
constructor(props: Readonly) {
|
|
||||||
super(props);
|
|
||||||
this.i18n = generateI18n(props.locale, props.messages);
|
|
||||||
this.objectButtonRef = React.createRef();
|
|
||||||
// 兼容代码,待去除
|
|
||||||
window.__ctx.appHelper.constants = window.__ctx.appHelper.constants || {};
|
|
||||||
}
|
|
||||||
|
|
||||||
afterHandler(value: { nrs_temp_field: any }) {
|
|
||||||
if (!value) return;
|
|
||||||
return value.nrs_temp_field;
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeHandler(value: any) {
|
|
||||||
if (!value) return;
|
|
||||||
return { nrs_temp_field: value };
|
|
||||||
}
|
|
||||||
|
|
||||||
message(type: string, title: any, dom: Element | null) {
|
|
||||||
Message.show({
|
|
||||||
type,
|
|
||||||
title,
|
|
||||||
duration: 1000,
|
|
||||||
align: 'cc cc',
|
|
||||||
overlayProps: {
|
|
||||||
target: dom,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
const { registerApi } = this.props;
|
|
||||||
const objectButtonThis = this.objectButtonRef;
|
|
||||||
registerApi &&
|
|
||||||
registerApi({
|
|
||||||
show: objectButtonThis.showModal,
|
|
||||||
hide: objectButtonThis.hideModal,
|
|
||||||
submit: objectButtonThis.submitHandler,
|
|
||||||
setValues: objectButtonThis.setValues,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const self = this;
|
|
||||||
const { locale, messages, value, onChange, field, languages, ...restProps } = this.props;
|
|
||||||
const { id } = field;
|
|
||||||
const tarRestProps = { ...restProps };
|
|
||||||
tarRestProps.autoSubmit = true;
|
|
||||||
tarRestProps.autoFocus = true;
|
|
||||||
const tarOnSubmit = tarRestProps.onSubmit;
|
|
||||||
// 确保monaco快捷键保存,能出发最外层的保存
|
|
||||||
tarRestProps.onSubmit = (editorValue, error) => {
|
|
||||||
const msgDom = document.querySelector('.object-button-overlay .next-dialog-body');
|
|
||||||
if (error) return this.message('error', this.i18n('formatError'), msgDom);
|
|
||||||
this.objectButtonRef &&
|
|
||||||
this.objectButtonRef.current &&
|
|
||||||
this.objectButtonRef.current.submitHandler(() => {
|
|
||||||
this.message('success', this.i18n('saved'), msgDom);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const tarObjProps = {};
|
|
||||||
tarObjProps.className = 'luna-monaco-button';
|
|
||||||
if (tarRestProps['data-meta']) {
|
|
||||||
delete tarRestProps['data-meta'];
|
|
||||||
tarObjProps['data-meta'] = 'Field';
|
|
||||||
}
|
|
||||||
|
|
||||||
tarObjProps.id = id;
|
|
||||||
tarObjProps.value = value || '';
|
|
||||||
tarObjProps.onChange = onChange;
|
|
||||||
const tarRule = [];
|
|
||||||
// 判断,如果是json,function, object等类型,自动追加校验规则;
|
|
||||||
if (tarRestProps.language && ['json', 'function', 'object'].includes(tarRestProps.language)) {
|
|
||||||
if (['json', 'object'].includes(tarRestProps.language)) {
|
|
||||||
tarRule.push({
|
|
||||||
validator(validatorValue: any, callback: (arg0: undefined) => void) {
|
|
||||||
if (typeof validatorValue !== 'object') {
|
|
||||||
callback(self.i18n('formatError'));
|
|
||||||
} else {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
tarRule.push({
|
|
||||||
validator(validatorValue: any, callback: (arg0: undefined) => void) {
|
|
||||||
if (typeof validatorValue !== 'function') {
|
|
||||||
callback(self.i18n('formatError'));
|
|
||||||
} else {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<ObjectButton
|
|
||||||
locale={locale}
|
|
||||||
messages={messages}
|
|
||||||
{...tarObjProps}
|
|
||||||
ref={this.objectButtonRef}
|
|
||||||
beforeHandler={this.beforeHandler.bind(this)}
|
|
||||||
afterHandler={this.afterHandler.bind(this)}
|
|
||||||
onSubmit={tarOnSubmit}
|
|
||||||
>
|
|
||||||
<FormItem name="nrs_temp_field" rules={tarRule}>
|
|
||||||
<MonacoEditorDefaultView {...tarRestProps} registerApi={(apis: any) => Object.assign(this, apis)} />
|
|
||||||
</FormItem>
|
|
||||||
</ObjectButton>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,242 +0,0 @@
|
|||||||
export default [
|
|
||||||
{
|
|
||||||
label: 'constants',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'constants',
|
|
||||||
detail: '应用全局常量',
|
|
||||||
documentation: '应用范围定义的通用常量',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'utils',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'utils',
|
|
||||||
detail: '应用全局公共函数',
|
|
||||||
documentation: '应用范围扩展的公共函数',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'state',
|
|
||||||
kind: 'Enum',
|
|
||||||
insertText: 'state',
|
|
||||||
detail: '当前所在容器组件内部状态',
|
|
||||||
documentation: 'React Class内部状态state',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'setState',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'setState({\n\t$0\n})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '设置当前所在容器组件的state数据',
|
|
||||||
documentation: '原生React方法,会自动更新组件视图',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'reloadDataSource',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'reloadDataSource(${1:${2:namespace}, ${3:false}, ${4:callback}})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '刷新当前所在的容器组件',
|
|
||||||
documentation: '触发当前所在的容器组件,重新发送异步请求,并用最新数据更新视图',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'location',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'location',
|
|
||||||
detail: '路由解析对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'location.query',
|
|
||||||
kind: 'Value',
|
|
||||||
insertText: 'location.query.${1:xxxx}',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '从路由解析对象中获取参数信息',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'history',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'history',
|
|
||||||
detail: '路由历史对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'React',
|
|
||||||
kind: 'Keyword',
|
|
||||||
insertText: 'React',
|
|
||||||
detail: 'React对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'ReactDOM',
|
|
||||||
kind: 'Keyword',
|
|
||||||
insertText: 'ReactDOM',
|
|
||||||
detail: 'ReactDom对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'ReactDOM.findDOMNode',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'ReactDOM.findDOMNode(${1:this.refs.xxxx})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'ReactDom查找真实dom node',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Dialog.alert',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Dialog.alert({',
|
|
||||||
"\tcontent: '${1:Alert content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'alert弹框 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Dialog.confirm',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Dialog.confirm({',
|
|
||||||
"\tcontent: '${1:Confirm content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '确认弹出框 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.success',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.success(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '成功反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.error',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.error(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '错误反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.help',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.help(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '帮助反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.loading',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.loading(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'loading反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.notice',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.notice(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '注意反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.waining',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.waining(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '警告反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.confirm',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.confirm({',
|
|
||||||
"\tcontent: '${1:Confirm content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '确认弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.info',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.info({',
|
|
||||||
"\tcontent: '${1:Info content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '信息弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.success',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.success({',
|
|
||||||
"\tcontent: '${1:Success content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '成功弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.error',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.error({',
|
|
||||||
"\tcontent: '${1:Error content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '错误弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.warning',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.warning({',
|
|
||||||
"\tcontent: '${1:Warning content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '警告弹出框 By Antd',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import IntlMessageFormat from 'intl-messageformat';
|
|
||||||
|
|
||||||
export const isJSExpression = (obj = '') => {
|
|
||||||
if (obj && typeof obj === 'object' && obj.type === 'JSExpression') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于构造国际化字符串处理函数
|
|
||||||
* @param {*} locale 国际化标识,例如 zh-CN、en-US
|
|
||||||
* @param {*} messages 国际化语言包
|
|
||||||
*/
|
|
||||||
export const generateI18n = (locale = 'zh-CN', messages = {}) => {
|
|
||||||
return function (key, values = {}) {
|
|
||||||
if (!messages || !messages[key]) return '';
|
|
||||||
const formater = new IntlMessageFormat(messages[key], locale);
|
|
||||||
return formater.format(values);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
export default {
|
|
||||||
// function
|
|
||||||
setting: '点击设置',
|
|
||||||
edit: '编辑',
|
|
||||||
submitConfirm: '确认提交 cmd+s',
|
|
||||||
close: '关闭 esc',
|
|
||||||
fullScreen: '全屏',
|
|
||||||
cancelFullScreen: '取消全屏',
|
|
||||||
jsonIllegal: '非json格式',
|
|
||||||
functionIllegal: '非function格式',
|
|
||||||
objectIllegal: '非object格式',
|
|
||||||
circularRef: '对象中出现循环引用的对象',
|
|
||||||
formatError: '格式错误',
|
|
||||||
saved: '已保存',
|
|
||||||
// expression
|
|
||||||
valueIllegal: '值类型为对象类型,与当前组件属性设置的控件类型不匹配,请在属性“代码编辑模式”下进行编辑',
|
|
||||||
jsExpression: '请输入JS表达式',
|
|
||||||
// Mixin
|
|
||||||
input: '字符串Input',
|
|
||||||
textarea: '多行字符串Textarea',
|
|
||||||
expression: '变量控件Expression',
|
|
||||||
monacoEditor: '编辑器MonacoEditor',
|
|
||||||
numberPicker: '数字NumberPicker',
|
|
||||||
bool: '布尔Switch',
|
|
||||||
datePicker: '日期选择DatePicker',
|
|
||||||
select: '下拉选择Select',
|
|
||||||
radio: '单项选择RadioGroup',
|
|
||||||
date: '日期选择DatePicker',
|
|
||||||
dateYear: '年选择DatePicker',
|
|
||||||
dateMonth: '月选择DatePicker',
|
|
||||||
dateRange: '日期区间选择DatePicker',
|
|
||||||
list: '数组List',
|
|
||||||
object: '对象ObjectButton',
|
|
||||||
reactNode: '节点类型ReactNode',
|
|
||||||
typeError: 'Minix组件属性Types配置错误,存在不支持类型[{type}],请检查组件属性配置',
|
|
||||||
};
|
|
||||||
@ -1,242 +0,0 @@
|
|||||||
export default [
|
|
||||||
{
|
|
||||||
label: 'constants',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'constants',
|
|
||||||
detail: '应用全局常量',
|
|
||||||
documentation: '应用范围定义的通用常量',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'utils',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'utils',
|
|
||||||
detail: '应用全局公共函数',
|
|
||||||
documentation: '应用范围扩展的公共函数',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'state',
|
|
||||||
kind: 'Enum',
|
|
||||||
insertText: 'state',
|
|
||||||
detail: '当前所在容器组件内部状态',
|
|
||||||
documentation: 'React Class内部状态state',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'setState',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'setState({\n\t$0\n})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '设置当前所在容器组件的state数据',
|
|
||||||
documentation: '原生React方法,会自动更新组件视图',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'reloadDataSource',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'reloadDataSource(${1:${2:namespace}, ${3:false}, ${4:callback}})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '刷新当前所在的容器组件',
|
|
||||||
documentation: '触发当前所在的容器组件,重新发送异步请求,并用最新数据更新视图',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'location',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'location',
|
|
||||||
detail: '路由解析对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'location.query',
|
|
||||||
kind: 'Value',
|
|
||||||
insertText: 'location.query.${1:xxxx}',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '从路由解析对象中获取参数信息',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'history',
|
|
||||||
kind: 'Class',
|
|
||||||
insertText: 'history',
|
|
||||||
detail: '路由历史对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'React',
|
|
||||||
kind: 'Keyword',
|
|
||||||
insertText: 'React',
|
|
||||||
detail: 'React对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'ReactDOM',
|
|
||||||
kind: 'Keyword',
|
|
||||||
insertText: 'ReactDOM',
|
|
||||||
detail: 'ReactDom对象',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'ReactDOM.findDOMNode',
|
|
||||||
kind: 'Function',
|
|
||||||
insertText: 'ReactDOM.findDOMNode(${1:this.refs.xxxx})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'ReactDom查找真实dom node',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Dialog.alert',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Dialog.alert({',
|
|
||||||
"\tcontent: '${1:Alert content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'alert弹框 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Dialog.confirm',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Dialog.confirm({',
|
|
||||||
"\tcontent: '${1:Confirm content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '确认弹出框 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.success',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.success(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '成功反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.error',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.error(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '错误反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.help',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.help(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '帮助反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.loading',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.loading(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: 'loading反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.notice',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.notice(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '注意反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Message.waining',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: 'Message.waining(${1:content})',
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '警告反馈提示 By Fusion',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.confirm',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.confirm({',
|
|
||||||
"\tcontent: '${1:Confirm content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '确认弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.info',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.info({',
|
|
||||||
"\tcontent: '${1:Info content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '信息弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.success',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.success({',
|
|
||||||
"\tcontent: '${1:Success content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '成功弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.error',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.error({',
|
|
||||||
"\tcontent: '${1:Error content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '错误弹出框 By Antd',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Modal.warning',
|
|
||||||
kind: 'Method',
|
|
||||||
insertText: [
|
|
||||||
'Modal.warning({',
|
|
||||||
"\tcontent: '${1:Warning content}',",
|
|
||||||
"\ttitle: '${2:Title}',",
|
|
||||||
'\tonOk: () => {',
|
|
||||||
'\t\t$3',
|
|
||||||
'\t},',
|
|
||||||
'\tonCancel: () => {',
|
|
||||||
'\t\t$4',
|
|
||||||
'\t}',
|
|
||||||
'})',
|
|
||||||
].join('\n'),
|
|
||||||
insertTextRules: 'InsertAsSnippet',
|
|
||||||
detail: '警告弹出框 By Antd',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import IntlMessageFormat from 'intl-messageformat';
|
|
||||||
|
|
||||||
export const isJSExpression = (obj = '') => {
|
|
||||||
if (obj && typeof obj === 'object' && obj.type === 'JSExpression') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于构造国际化字符串处理函数
|
|
||||||
* @param {*} locale 国际化标识,例如 zh-CN、en-US
|
|
||||||
* @param {*} messages 国际化语言包
|
|
||||||
*/
|
|
||||||
export const generateI18n = (locale = 'zh-CN', messages = {}) => {
|
|
||||||
return function (key, values = {}) {
|
|
||||||
if (!messages || !messages[key]) return '';
|
|
||||||
const formater = new IntlMessageFormat(messages[key], locale);
|
|
||||||
return formater.format(values);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
export default {
|
|
||||||
// function
|
|
||||||
setting: '点击设置',
|
|
||||||
edit: '编辑',
|
|
||||||
submitConfirm: '确认提交 cmd+s',
|
|
||||||
close: '关闭 esc',
|
|
||||||
fullScreen: '全屏',
|
|
||||||
cancelFullScreen: '取消全屏',
|
|
||||||
jsonIllegal: '非json格式',
|
|
||||||
functionIllegal: '非function格式',
|
|
||||||
objectIllegal: '非object格式',
|
|
||||||
circularRef: '对象中出现循环引用的对象',
|
|
||||||
formatError: '格式错误',
|
|
||||||
saved: '已保存',
|
|
||||||
// expression
|
|
||||||
valueIllegal: '值类型为对象类型,与当前组件属性设置的控件类型不匹配,请在属性“代码编辑模式”下进行编辑',
|
|
||||||
jsExpression: '请输入JS表达式',
|
|
||||||
// Mixin
|
|
||||||
input: '字符串Input',
|
|
||||||
textarea: '多行字符串Textarea',
|
|
||||||
expression: '变量控件Expression',
|
|
||||||
monacoEditor: '编辑器MonacoEditor',
|
|
||||||
numberPicker: '数字NumberPicker',
|
|
||||||
bool: '布尔Switch',
|
|
||||||
datePicker: '日期选择DatePicker',
|
|
||||||
select: '下拉选择Select',
|
|
||||||
radio: '单项选择RadioGroup',
|
|
||||||
date: '日期选择DatePicker',
|
|
||||||
dateYear: '年选择DatePicker',
|
|
||||||
dateMonth: '月选择DatePicker',
|
|
||||||
dateRange: '日期区间选择DatePicker',
|
|
||||||
list: '数组List',
|
|
||||||
object: '对象ObjectButton',
|
|
||||||
reactNode: '节点类型ReactNode',
|
|
||||||
typeError: 'Minix组件属性Types配置错误,存在不支持类型[{type}],请检查组件属性配置',
|
|
||||||
};
|
|
||||||
@ -1,161 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import classNames from 'classnames';
|
|
||||||
import { Dropdown, Button, Menu, Icon } from '@alifd/next';
|
|
||||||
import { getSetter } from '@ali/lowcode-editor-core';
|
|
||||||
|
|
||||||
import { generateI18n } from './locale/utils';
|
|
||||||
import zhCN from './locale/zh-CN';
|
|
||||||
import './index.scss';
|
|
||||||
|
|
||||||
export default class Mixed extends PureComponent {
|
|
||||||
static displayName = 'Mixed';
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
locale: PropTypes.string,
|
|
||||||
messages: PropTypes.object,
|
|
||||||
defaultType: PropTypes.string,
|
|
||||||
types: PropTypes.arrayOf(PropTypes.string),
|
|
||||||
inputProps: PropTypes.object,
|
|
||||||
expressionProps: PropTypes.object,
|
|
||||||
monacoEditorProps: PropTypes.object,
|
|
||||||
switchProps: PropTypes.object,
|
|
||||||
selectProps: PropTypes.object,
|
|
||||||
radioGroupProps: PropTypes.object,
|
|
||||||
};
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
locale: 'zh-CN',
|
|
||||||
messages: zhCN,
|
|
||||||
types: [
|
|
||||||
{
|
|
||||||
name: 'StringSetter',
|
|
||||||
props: {},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
typeMap: any;
|
|
||||||
|
|
||||||
i18n: (key: any, values) => string | void | Array<string | void>;
|
|
||||||
|
|
||||||
constructor(props: Readonly) {
|
|
||||||
super(props);
|
|
||||||
const type = props.defaultType; // judgeTypeHandler(props, {});
|
|
||||||
this.i18n = generateI18n(props.locale, props.messages);
|
|
||||||
this.state = {
|
|
||||||
type,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
changeType(type: string) {
|
|
||||||
if (typeof type === 'object' || type === this.state.type) return;
|
|
||||||
const { onChange } = this.props;
|
|
||||||
let newValue;
|
|
||||||
const setterProps = this.typeMap[type].props;
|
|
||||||
if (setterProps) {
|
|
||||||
if (setterProps.value !== undefined) {
|
|
||||||
newValue = setterProps.value;
|
|
||||||
} else if (setterProps.defaultValue !== undefined) {
|
|
||||||
newValue = setterProps.defaultValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (type === 'BoolSetter' && newValue === undefined) {
|
|
||||||
newValue = false; // 给切换到switch默认值为false
|
|
||||||
}
|
|
||||||
this.setState({ type });
|
|
||||||
onChange && onChange(newValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { style = {}, className, locale, messages, types = [], defaultType, ...restProps } = this.props;
|
|
||||||
this.typeMap = {};
|
|
||||||
const realTypes: any[] = [];
|
|
||||||
types.forEach((el: { name: any; props: any }) => {
|
|
||||||
const { name, props } = el;
|
|
||||||
const Setter = getSetter(name);
|
|
||||||
if (Setter) {
|
|
||||||
this.typeMap[name] = {
|
|
||||||
label: name,
|
|
||||||
component: Setter.component,
|
|
||||||
props,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
realTypes.push(name);
|
|
||||||
});
|
|
||||||
let moreBtnNode = null;
|
|
||||||
// 如果只有2种,且有变量表达式,则直接展示变量按钮
|
|
||||||
if (realTypes.length > 1) {
|
|
||||||
const isTwoType = !!(realTypes.length === 2 && ~realTypes.indexOf('ExpressionSetter'));
|
|
||||||
const btnProps = {
|
|
||||||
size: 'small',
|
|
||||||
text: true,
|
|
||||||
style: {
|
|
||||||
position: 'absolute',
|
|
||||||
left: '100%',
|
|
||||||
top: 0,
|
|
||||||
bottom: 0,
|
|
||||||
margin: 'auto 0 auto 8px',
|
|
||||||
padding: 0,
|
|
||||||
width: 16,
|
|
||||||
height: 16,
|
|
||||||
lineHeight: '16px',
|
|
||||||
textAlign: 'center',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
if (isTwoType) {
|
|
||||||
btnProps.onClick = this.changeType.bind(this, realTypes.indexOf(this.state.type) ? realTypes[0] : realTypes[1]);
|
|
||||||
}
|
|
||||||
const triggerNode = (
|
|
||||||
<Button {...btnProps} size={isTwoType ? 'large' : 'small'}>
|
|
||||||
<Icon type={isTwoType ? 'edit' : 'ellipsis'} />
|
|
||||||
</Button>
|
|
||||||
);
|
|
||||||
if (isTwoType) {
|
|
||||||
moreBtnNode = triggerNode;
|
|
||||||
} else {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
||||||
const MenuItems: {} | null | undefined = [];
|
|
||||||
realTypes.map((type) => {
|
|
||||||
if (this.typeMap[type]) {
|
|
||||||
MenuItems.push(<Menu.Item key={type}>{this.typeMap[type].label}</Menu.Item>);
|
|
||||||
} else {
|
|
||||||
console.error(
|
|
||||||
this.i18n('typeError', {
|
|
||||||
type,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return type;
|
|
||||||
});
|
|
||||||
const MenuNode = (
|
|
||||||
<Menu
|
|
||||||
selectMode="single"
|
|
||||||
hasSelectedIcon={false}
|
|
||||||
selectedKeys={this.state.type}
|
|
||||||
onItemClick={this.changeType.bind(this)}
|
|
||||||
>
|
|
||||||
{MenuItems}
|
|
||||||
</Menu>
|
|
||||||
);
|
|
||||||
|
|
||||||
moreBtnNode = (
|
|
||||||
<Dropdown trigger={triggerNode} triggerType="click">
|
|
||||||
{MenuNode}
|
|
||||||
</Dropdown>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const TargetNode = this.typeMap[this.state.type]?.component || 'div';
|
|
||||||
const targetProps = this.typeMap[this.state.type]?.props || {};
|
|
||||||
const tarStyle = { position: 'relative', ...style };
|
|
||||||
const classes = classNames(className, 'lowcode-setter-mixin');
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div style={tarStyle} className={classes}>
|
|
||||||
<TargetNode {...restProps} {...targetProps} />
|
|
||||||
{moreBtnNode}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import IntlMessageFormat from 'intl-messageformat';
|
|
||||||
|
|
||||||
export const isJSExpression = (obj = '') => {
|
|
||||||
if (obj && typeof obj === 'object' && obj.type === 'JSExpression') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于构造国际化字符串处理函数
|
|
||||||
* @param {*} locale 国际化标识,例如 zh-CN、en-US
|
|
||||||
* @param {*} messages 国际化语言包
|
|
||||||
*/
|
|
||||||
export const generateI18n = (locale = 'zh-CN', messages = {}) => {
|
|
||||||
return function (key, values = {}) {
|
|
||||||
if (!messages || !messages[key]) return '';
|
|
||||||
const formater = new IntlMessageFormat(messages[key], locale);
|
|
||||||
return formater.format(values);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
export default {
|
|
||||||
// function
|
|
||||||
setting: '点击设置',
|
|
||||||
edit: '编辑',
|
|
||||||
submitConfirm: '确认提交 cmd+s',
|
|
||||||
close: '关闭 esc',
|
|
||||||
fullScreen: '全屏',
|
|
||||||
cancelFullScreen: '取消全屏',
|
|
||||||
jsonIllegal: '非json格式',
|
|
||||||
functionIllegal: '非function格式',
|
|
||||||
objectIllegal: '非object格式',
|
|
||||||
circularRef: '对象中出现循环引用的对象',
|
|
||||||
formatError: '格式错误',
|
|
||||||
saved: '已保存',
|
|
||||||
// expression
|
|
||||||
valueIllegal: '值类型为对象类型,与当前组件属性设置的控件类型不匹配,请在属性“代码编辑模式”下进行编辑',
|
|
||||||
jsExpression: '请输入JS表达式',
|
|
||||||
// Mixin
|
|
||||||
input: '字符串Input',
|
|
||||||
textarea: '多行字符串Textarea',
|
|
||||||
expression: '变量控件Expression',
|
|
||||||
monacoEditor: '编辑器MonacoEditor',
|
|
||||||
numberPicker: '数字NumberPicker',
|
|
||||||
bool: '布尔Switch',
|
|
||||||
datePicker: '日期选择DatePicker',
|
|
||||||
select: '下拉选择Select',
|
|
||||||
radio: '单项选择RadioGroup',
|
|
||||||
date: '日期选择DatePicker',
|
|
||||||
dateYear: '年选择DatePicker',
|
|
||||||
dateMonth: '月选择DatePicker',
|
|
||||||
dateRange: '日期区间选择DatePicker',
|
|
||||||
list: '数组List',
|
|
||||||
object: '对象ObjectButton',
|
|
||||||
reactNode: '节点类型ReactNode',
|
|
||||||
typeError: 'Minix组件属性Types配置错误,存在不支持类型[{type}],请检查组件属性配置',
|
|
||||||
};
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
import './style.less';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import LowStyleSetter from '@ali/lc-style-setter';
|
|
||||||
import { globalLocale } from '@ali/lowcode-editor-core';
|
|
||||||
|
|
||||||
export default class StyleSetter extends Component {
|
|
||||||
static displayName = 'StyleSetter';
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
value: PropTypes.object,
|
|
||||||
onChange: PropTypes.func,
|
|
||||||
placeholder: PropTypes.string,
|
|
||||||
locale: PropTypes.string,
|
|
||||||
};
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
value: {},
|
|
||||||
onChange: () => { },
|
|
||||||
placeholder: '',
|
|
||||||
locale: globalLocale.getLocale() || 'en-US',
|
|
||||||
};
|
|
||||||
|
|
||||||
onChange = (val: any) => {
|
|
||||||
const { onChange } = this.props;
|
|
||||||
onChange(val.native);
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { value } = this.props;
|
|
||||||
return (
|
|
||||||
<div className="lc-block-setter">
|
|
||||||
<LowStyleSetter {...this.props} value={value} onChange={this.onChange} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user