From 83803fa2a35f0b8ad90d4101a2095ec44cf66914 Mon Sep 17 00:00:00 2001 From: WenG <450292408@qq.com> Date: Tue, 8 Mar 2022 20:54:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/design/FormDesignController.java | 19 + .../form/controller/pojo/FormField.java | 48 + .../pojo/vos/design/FormDesignVO.java | 31 + .../design/FormDesignRouteController.java | 27 + .../FormDesignStaticController.java | 54 + .../form/enums/design/FormFieldTypeEnum.java | 50 + .../service/design/IFormDesignService.java | 20 + .../design/impl/FormDesignServiceImpl.java | 34 + .../service/design/impl/FormServiceImpl.java | 2 - .../static/form-design/images/88_thumb.gif | Bin 0 -> 4854 bytes .../form-design/images/angrya_thumb.gif | Bin 0 -> 3291 bytes .../static/form-design/images/banner1.PNG | Bin 0 -> 25012 bytes .../static/form-design/images/banner2.PNG | Bin 0 -> 28296 bytes .../static/form-design/images/banner3.PNG | Bin 0 -> 24647 bytes .../static/form-design/images/bba_thumb.gif | Bin 0 -> 3127 bytes .../static/form-design/images/bs2_thumb.gif | Bin 0 -> 2797 bytes .../static/form-design/images/bs_thumb.gif | Bin 0 -> 3644 bytes .../static/form-design/images/bz_thumb.gif | Bin 0 -> 4221 bytes .../static/form-design/images/cake.gif | Bin 0 -> 2737 bytes .../static/form-design/images/cj_thumb.gif | Bin 0 -> 2213 bytes .../static/form-design/images/come_thumb.gif | Bin 0 -> 2705 bytes .../static/form-design/images/cool_thumb.gif | Bin 0 -> 2331 bytes .../form-design/images/crazya_thumb.gif | Bin 0 -> 5305 bytes .../static/form-design/images/cry.gif | Bin 0 -> 5191 bytes .../static/form-design/images/cza_thumb.gif | Bin 0 -> 2793 bytes .../form-design/images/dizzya_thumb.gif | Bin 0 -> 3154 bytes .../static/form-design/images/good_thumb.gif | Bin 0 -> 2196 bytes .../static/form-design/images/gza_thumb.gif | Bin 0 -> 6495 bytes .../static/form-design/images/h_thumb.gif | Bin 0 -> 2674 bytes .../static/form-design/images/hatea_thumb.gif | Bin 0 -> 3615 bytes .../form-design/images/hearta_thumb.gif | Bin 0 -> 2333 bytes .../static/form-design/images/heia_thumb.gif | Bin 0 -> 7425 bytes .../static/form-design/images/hsa_thumb.gif | Bin 0 -> 1513 bytes .../static/form-design/images/k_thumb.gif | Bin 0 -> 8096 bytes .../static/form-design/images/kbsa_thumb.gif | Bin 0 -> 4567 bytes .../static/form-design/images/kl_thumb.gif | Bin 0 -> 5689 bytes .../static/form-design/images/laugh.gif | Bin 0 -> 3222 bytes .../static/form-design/images/lazu_thumb.gif | Bin 0 -> 3509 bytes .../static/form-design/images/ldln_thumb.gif | Bin 0 -> 4439 bytes .../static/form-design/images/lovea_thumb.gif | Bin 0 -> 4121 bytes .../static/form-design/images/mb_thumb.gif | Bin 0 -> 6721 bytes .../static/form-design/images/money_thumb.gif | Bin 0 -> 3700 bytes .../static/form-design/images/nm_thumb.gif | Bin 0 -> 1312 bytes .../static/form-design/images/no_thumb.gif | Bin 0 -> 1971 bytes .../static/form-design/images/ok_thumb.gif | Bin 0 -> 777 bytes .../static/form-design/images/qq_thumb.gif | Bin 0 -> 2375 bytes .../static/form-design/images/sad_thumb.gif | Bin 0 -> 2258 bytes .../static/form-design/images/sada_thumb.gif | Bin 0 -> 3361 bytes .../static/form-design/images/sb_thumb.gif | Bin 0 -> 1793 bytes .../form-design/images/shamea_thumb.gif | Bin 0 -> 3398 bytes .../static/form-design/images/sk_thumb.gif | Bin 0 -> 2555 bytes .../form-design/images/sleepa_thumb.gif | Bin 0 -> 2454 bytes .../form-design/images/sleepya_thumb.gif | Bin 0 -> 3576 bytes .../static/form-design/images/sw_thumb.gif | Bin 0 -> 1800 bytes .../form-design/images/sweata_thumb.gif | Bin 0 -> 2002 bytes .../static/form-design/images/t_thumb.gif | Bin 0 -> 3792 bytes .../form-design/images/tootha_thumb.gif | Bin 0 -> 5514 bytes .../static/form-design/images/tza_thumb.gif | Bin 0 -> 4017 bytes .../static/form-design/images/unheart.gif | Bin 0 -> 2689 bytes .../static/form-design/images/wq_thumb.gif | Bin 0 -> 9823 bytes .../static/form-design/images/x_thumb.gif | Bin 0 -> 5144 bytes .../static/form-design/images/ye_thumb.gif | Bin 0 -> 2127 bytes .../static/form-design/images/yhh_thumb.gif | Bin 0 -> 3017 bytes .../static/form-design/images/yw_thumb.gif | Bin 0 -> 4377 bytes .../static/form-design/images/yx_thumb.gif | Bin 0 -> 4126 bytes .../static/form-design/images/z2_thumb.gif | Bin 0 -> 2034 bytes .../static/form-design/images/zhh_thumb.gif | Bin 0 -> 3040 bytes .../static/form-design/images/zy_thumb.gif | Bin 0 -> 4050 bytes .../resources/static/form-design/js/config.js | 13 + .../static/form-design/js/htmlformat.js | 409 ++ .../static/form-design/js/jsformat.js | 568 +++ .../modules/HandwrittenSignature.css | 56 + .../modules/HandwrittenSignature.js | 1 + .../form-design/modules/Sortable/Sortable.js | 3709 +++++++++++++++ .../modules/Sortable/Sortable.min.js | 2 + .../static/form-design/modules/cron.css | 178 + .../static/form-design/modules/cron.js | 1131 +++++ .../form-design/modules/formDesigner.css | 370 ++ .../form-design/modules/formDesigner.js | 4111 +++++++++++++++++ .../static/form-design/modules/formField.js | 454 ++ .../form-design/modules/formPreview.css | 78 + .../static/form-design/modules/formPreview.js | 1645 +++++++ .../modules/iceEditor/iceEditor.js | 1918 ++++++++ .../static/form-design/modules/iconPicker.js | 327 ++ .../form-design/modules/labelGeneration.css | 4 + .../form-design/modules/labelGeneration.js | 256 + .../static/form-design/modules/xmSelect.js | 8 + .../resources/templates/form-design/save.html | 44 + 88 files changed, 15565 insertions(+), 2 deletions(-) create mode 100644 module-form/src/main/java/ink/wgink/module/form/controller/pojo/FormField.java create mode 100644 module-form/src/main/java/ink/wgink/module/form/controller/pojo/vos/design/FormDesignVO.java create mode 100644 module-form/src/main/java/ink/wgink/module/form/controller/route/design/FormDesignRouteController.java create mode 100644 module-form/src/main/java/ink/wgink/module/form/controller/staticfile/FormDesignStaticController.java create mode 100644 module-form/src/main/java/ink/wgink/module/form/enums/design/FormFieldTypeEnum.java create mode 100644 module-form/src/main/java/ink/wgink/module/form/service/design/IFormDesignService.java create mode 100644 module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java create mode 100644 module-form/src/main/resources/static/form-design/images/88_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/angrya_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/banner1.PNG create mode 100644 module-form/src/main/resources/static/form-design/images/banner2.PNG create mode 100644 module-form/src/main/resources/static/form-design/images/banner3.PNG create mode 100644 module-form/src/main/resources/static/form-design/images/bba_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/bs2_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/bs_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/bz_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/cake.gif create mode 100644 module-form/src/main/resources/static/form-design/images/cj_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/come_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/cool_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/crazya_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/cry.gif create mode 100644 module-form/src/main/resources/static/form-design/images/cza_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/dizzya_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/good_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/gza_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/h_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/hatea_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/hearta_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/heia_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/hsa_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/k_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/kbsa_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/kl_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/laugh.gif create mode 100644 module-form/src/main/resources/static/form-design/images/lazu_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/ldln_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/lovea_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/mb_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/money_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/nm_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/no_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/ok_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/qq_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sad_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sada_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sb_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/shamea_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sk_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sleepa_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sleepya_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sw_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/sweata_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/t_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/tootha_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/tza_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/unheart.gif create mode 100644 module-form/src/main/resources/static/form-design/images/wq_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/x_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/ye_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/yhh_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/yw_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/yx_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/z2_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/zhh_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/images/zy_thumb.gif create mode 100644 module-form/src/main/resources/static/form-design/js/config.js create mode 100644 module-form/src/main/resources/static/form-design/js/htmlformat.js create mode 100644 module-form/src/main/resources/static/form-design/js/jsformat.js create mode 100644 module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.css create mode 100644 module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.js create mode 100644 module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.js create mode 100644 module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.min.js create mode 100644 module-form/src/main/resources/static/form-design/modules/cron.css create mode 100644 module-form/src/main/resources/static/form-design/modules/cron.js create mode 100644 module-form/src/main/resources/static/form-design/modules/formDesigner.css create mode 100644 module-form/src/main/resources/static/form-design/modules/formDesigner.js create mode 100644 module-form/src/main/resources/static/form-design/modules/formField.js create mode 100644 module-form/src/main/resources/static/form-design/modules/formPreview.css create mode 100644 module-form/src/main/resources/static/form-design/modules/formPreview.js create mode 100644 module-form/src/main/resources/static/form-design/modules/iceEditor/iceEditor.js create mode 100644 module-form/src/main/resources/static/form-design/modules/iconPicker.js create mode 100644 module-form/src/main/resources/static/form-design/modules/labelGeneration.css create mode 100644 module-form/src/main/resources/static/form-design/modules/labelGeneration.js create mode 100644 module-form/src/main/resources/static/form-design/modules/xmSelect.js create mode 100644 module-form/src/main/resources/templates/form-design/save.html diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormDesignController.java b/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormDesignController.java index 46bd7230..17aae1e6 100644 --- a/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormDesignController.java +++ b/module-form/src/main/java/ink/wgink/module/form/controller/api/design/FormDesignController.java @@ -3,7 +3,17 @@ package ink.wgink.module.form.controller.api.design; import ink.wgink.common.base.DefaultBaseController; import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.form.controller.pojo.vos.design.FormDesignVO; +import ink.wgink.module.form.service.design.IFormDesignService; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -12,6 +22,15 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping(ISystemConstant.API_PREFIX + "/form-design") public class FormDesignController extends DefaultBaseController { + @Autowired + private IFormDesignService formDesignService; + @ApiOperation(value = "保存表单", notes = "保存表单接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("save") + public SuccessResult save(@RequestBody FormDesignVO formDesignVO) { + formDesignService.save(formDesignVO); + return new SuccessResult(); + } } diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/pojo/FormField.java b/module-form/src/main/java/ink/wgink/module/form/controller/pojo/FormField.java new file mode 100644 index 00000000..f46de51f --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/controller/pojo/FormField.java @@ -0,0 +1,48 @@ +package ink.wgink.module.form.controller.pojo; + +/** + * @Description: 基础字段 + * @Author: WenG + * @Date: 2022/3/8 20:24 + * @Version: 1.0 + **/ +public class FormField { + + private String id; + private String tag; + private String label; + private Integer index; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } + +} diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/pojo/vos/design/FormDesignVO.java b/module-form/src/main/java/ink/wgink/module/form/controller/pojo/vos/design/FormDesignVO.java new file mode 100644 index 00000000..1ef90b25 --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/controller/pojo/vos/design/FormDesignVO.java @@ -0,0 +1,31 @@ +package ink.wgink.module.form.controller.pojo.vos.design; + +import com.alibaba.fastjson.JSONArray; + +/** + * @Description: 表单设计 + * @Author: WenG + * @Date: 2022/3/8 20:21 + * @Version: 1.0 + **/ +public class FormDesignVO { + + private JSONArray data; + private String code; + + public JSONArray getData() { + return data; + } + + public void setData(JSONArray data) { + this.data = data; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/route/design/FormDesignRouteController.java b/module-form/src/main/java/ink/wgink/module/form/controller/route/design/FormDesignRouteController.java new file mode 100644 index 00000000..870e16d2 --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/controller/route/design/FormDesignRouteController.java @@ -0,0 +1,27 @@ +package ink.wgink.module.form.controller.route.design; + +import ink.wgink.interfaces.consts.ISystemConstant; +import io.swagger.annotations.Api; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Description: 表单设计 + * @Author: WenG + * @Date: 2022/3/7 11:17 + * @Version: 1.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "表单设计") +@Controller +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/form-design") +public class FormDesignRouteController { + + @GetMapping("save") + public ModelAndView save() { + ModelAndView mv = new ModelAndView("/form-design/save"); + return mv; + } + +} diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/staticfile/FormDesignStaticController.java b/module-form/src/main/java/ink/wgink/module/form/controller/staticfile/FormDesignStaticController.java new file mode 100644 index 00000000..12b9359e --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/controller/staticfile/FormDesignStaticController.java @@ -0,0 +1,54 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ink.wgink.module.form.controller.staticfile; + +import ink.wgink.util.ResourceUtil; +import ink.wgink.util.request.StaticResourceRequestUtil; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; + +@RestController +@RequestMapping("static/form-design") +public class FormDesignStaticController { + + @GetMapping("images/{fileName}") + public void images(HttpServletResponse httpServletResponse, @PathVariable("fileName") String fileName) throws IOException { + InputStream inputStream = ResourceUtil.getJarResourceInputStream("static/form-design/images/" + fileName); + StaticResourceRequestUtil.download(httpServletResponse, inputStream, fileName); + } + + @GetMapping("js/{fileName}") + public void js(HttpServletResponse httpServletResponse, @PathVariable("fileName") String fileName) throws IOException { + InputStream inputStream = ResourceUtil.getJarResourceInputStream("static/form-design/js/" + fileName); + StaticResourceRequestUtil.download(httpServletResponse, inputStream, fileName); + } + + @GetMapping("modules/{fileName}") + public void modules(HttpServletResponse httpServletResponse, @PathVariable("fileName") String fileName) throws IOException { + InputStream inputStream = ResourceUtil.getJarResourceInputStream("static/form-design/modules/" + fileName); + StaticResourceRequestUtil.download(httpServletResponse, inputStream, fileName); + } + + @GetMapping("modules/{sub}/{fileName}") + public void modulesSum(HttpServletResponse httpServletResponse, @PathVariable("sub") String sub, @PathVariable("fileName") String fileName) throws IOException { + InputStream inputStream = ResourceUtil.getJarResourceInputStream("static/form-design/modules/" + sub + "/" + fileName); + StaticResourceRequestUtil.download(httpServletResponse, inputStream, fileName); + } + +} diff --git a/module-form/src/main/java/ink/wgink/module/form/enums/design/FormFieldTypeEnum.java b/module-form/src/main/java/ink/wgink/module/form/enums/design/FormFieldTypeEnum.java new file mode 100644 index 00000000..eff3a93a --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/enums/design/FormFieldTypeEnum.java @@ -0,0 +1,50 @@ +package ink.wgink.module.form.enums.design; + +/** + * @Description: 表单字段类型 + * @Author: WenG + * @Date: 2022/3/8 20:40 + * @Version: 1.0 + **/ +public enum FormFieldTypeEnum { + + INPUT("input", "单行文本"), + PASSWORD("password", "密码框"), + SELECT("select", "下拉框"), + RADIO("radio", "单选组"), + CHECKBOX("checkbox", "复选组"), + SWITCH("switch", "开关"), + SLIDER("slider", "滑块"), + NUMBER_INPUT("numberInput", "数字输入框"), + LABEL_GENERATION("labelGeneration", "标签组件"), + BOTTOM("bottom", "按钮组件"), + SIGN("sign", "签名组件"), + ICON_PICKER("iconPicker", "图标选择器"), + CRON("cron", "Cron表达式"), + DATE("date", "日期"), + DATE_RANGE("dateRange", "日期范围"), + RATE("rate", "评分"), + CAROUSEL("carousel", "轮播图"), + COLOR_PICKER("colorpicker", "颜色选择器"), + IMAGE("image", "上传图片"), + FILE("file", "上传文件"), + TEXTAREA("textarea", "多行文本"), + EDITOR("editor", "编辑器"), + GRID("grid", "布局网格"); + + private String type; + private String label; + + FormFieldTypeEnum(String type, String label) { + this.type = type; + this.label = label; + } + + public String getType() { + return type; + } + + public String getLabel() { + return label; + } +} diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormDesignService.java b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormDesignService.java new file mode 100644 index 00000000..2edb65fe --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormDesignService.java @@ -0,0 +1,20 @@ +package ink.wgink.module.form.service.design; + +import ink.wgink.module.form.controller.pojo.vos.design.FormDesignVO; + +/** + * @Description: 表单设计 + * @Author: WenG + * @Date: 2022/3/7 10:53 + * @Version: 1.0 + **/ +public interface IFormDesignService { + + /** + * 保存表单 + * + * @param formDesignVO + */ + void save(FormDesignVO formDesignVO); + +} diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java new file mode 100644 index 00000000..d1cd57eb --- /dev/null +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java @@ -0,0 +1,34 @@ +package ink.wgink.module.form.service.design.impl; + +import com.alibaba.fastjson.JSONArray; +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.module.form.controller.pojo.FormField; +import ink.wgink.module.form.controller.pojo.vos.design.FormDesignVO; +import ink.wgink.module.form.service.design.IFormDesignService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: 表单设计 + * @Author: WenG + * @Date: 2022/3/7 10:53 + * @Version: 1.0 + **/ +@Service +public class FormDesignServiceImpl extends DefaultBaseService implements IFormDesignService { + + + @Override + public void save(FormDesignVO formDesignVO) { + + } + + private void setFormField(List formFields, JSONArray dataJsonArray) { + formFields = formFields == null ? new ArrayList<>() : formFields; + for (int i = 0; i < dataJsonArray.size(); i++) { + // grid特殊,需要递归处理 + } + } +} diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java index 604c4c24..dbced309 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java @@ -5,7 +5,6 @@ import com.github.pagehelper.PageInfo; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.module.form.dao.design.IFormDao; import ink.wgink.module.form.pojo.dtos.design.FormDTO; -import ink.wgink.module.form.pojo.dtos.design.FormFieldDTO; import ink.wgink.module.form.pojo.pos.design.FormPO; import ink.wgink.module.form.pojo.vos.design.FormVO; import ink.wgink.module.form.service.design.IFormService; @@ -108,5 +107,4 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService return new SuccessResultList<>(dataDTOs, pageInfo.getPageNum(), pageInfo.getTotal()); } - } diff --git a/module-form/src/main/resources/static/form-design/images/88_thumb.gif b/module-form/src/main/resources/static/form-design/images/88_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..5dd7442b164b2ea32b5ae97da71073a31a699c83 GIT binary patch literal 4854 zcmeHIX;f3!7QTT55(Q+ENuVK6#mbN{CyIm+0$KtHSZRw&NK!!|iAmIm0|60GTN$Jk zE0sa56Bekx3W^#T91tW-3J%OFs3<5Z(42c-(CYJbweR;^%ieX?y65b>hi~7#&$j~> zvAn1p6T}30jUwPS8{DLWTTIZo=wT%R^l(7`YS2bgHIhK9JGdJGx}!jYrK-suw0naV zH*_$$Iui#QXICYfjMcqsP*iy4Onu z=zU2;nE-S}?H7Lu+Zpvc=MI#5qR)!Yt|6$N9!H0FpNKMmt@B~W;zxCS)j$&3FF?l? zaI6x2^z9)w?!lQrcsumw(K$yVaG*Q3vvmH$-%P>1sIfb#u-Wr>B^mS!?w_6qm2Op; z4qz}H9o{=xZ~6EV32mm{E&k;7?XSQ{IlL7Bub99)OVOwMz|fA09dn*kSxofFLC-2M zl!^|e4xZB+Ym<(*vOwqOot3LWyO*kq+qlyNJj!X@h}-M-Hi4$YVS?TMDit*y3%zlK-KSJ2%Z1?SAuzD6DnqX}TYE$)9KW;q{3a`SlX`Kp6})CJ z@u+yBH~n?rp0jCsDy1WAqhFAl!N&>b6YXJVDC`V|H~nF=OLvK@s?A5$BY^F;uzwls zVvG+RhF#I{e$q&lE9?k_{fTfu0Ndul8)ogre)lUv;q!uyV)}UB_pqA_n=N45LU1Px z4n)HnR=+p6-z^EL&vfoACXe+W7(C;uNV0m?7!U8QgpHrU&M*k;!BFmGoh|w#2iy)8 zxZ!p!Gc8SDSiGK6DKdi)A_!swrw98-g!}o1`nx!hH8F2Rk?c?+lOyG*-wS+XA`W*A zUrLPOuZk0Rlb)TsNFv7Zyh+R4*<`lJj~^Qsm?-9lCk97w6W4I5Jd)2s;sO~>mLN*t zOF2YYLcBmilX;UkJYfu1Ep;D<+K3rTJ)f$eHjRGl0<|vTZzVpE3OSs}Vku**yAWnJY#0b|(y-8}M zZ&OGRy>}~+IK4^7i7QNSmT^SR6esdjO79fe?EkHrknmnxA`RpJ2k&1xmPBk6@two? z65%>Am#k{|^={sBAds`;?Z*8ZVAwi^$%;byX*7JERu`q%7CTUvSUtnQU8U9o^UoW*k|G&oa z)|U6TSp59|7K^hQjPq1!KPdG(k-C4Tw(lEPeR$vce1W>(#p=e!KoqEcpPU$f{p#h| zi|3;w&z=rHdHiT-@Zp2|1O0uyJ>6aR?%uiG*>US;ds}Nuv$E+%W5f0OYgeyauB)x7 zzNEN#;e6G(vy~NRe*4$yQ@@s%mHu+FC*^!Z7m#DQ$tM;HWOHa zF@hovYNk++P!j~fLj({ky?9#5*4~x|c@$ouU%HvhzBnZXfwe_R@m#3R)X#-k5;OAy3r zT4Eb!K!w$BwD`9;S;(%s|8=3-tc9VPN4s>w2O8p^zcYwVagBF zv{smlmiuB5j5h7lQPU#2hW3f_!ZOA|M7Q?~!6y0x8;xgy2e(f5s_EOA@_1QfzJX}S zfFJ{^eccv4{mc|i4A#M1v2_O$yFW2Iujxd=ZY{jUI5}oOz70WWBD#iklxwi|XqGb5 zE`KbUzEz$-qR=D+b%gj>M}`N^;x!l@u*M%1V>MzTeyy?mC0Cj0)m0LXcim>`%95?U zy0#WKJGY#L7pCeneE2eqmU&}tcz{mtL=BTPJ1Sb+YTsr|z3JYu7vFh&{cU!Dj-lN# z-dvq1rF>3W&?v*{@>r|CRms&o0j4V^ZLy>xw`Q!StlEWO4McNO@S;S!RK1Yc=s}~p zisnpglA+;|0PB}r4I2{CUunYfP9vOM{&75@@7AK2gZ zVa*AqF}6qL+@kosK32N=ZX=x9s~Bwzc2F@tGyYTq@!En@$v!!v7Hy45jJR5Jh8?{Z z8=v3G@@T6#Rp^sQEUY)cXDqpcicZ0{iB-a G^ZyND2?^l< literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/angrya_thumb.gif b/module-form/src/main/resources/static/form-design/images/angrya_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..45c4fb5563081d684f00cc3560df41b803cf7bbf GIT binary patch literal 3291 zcmeHI`#;p_7awFU=3N(!aa z)@F63%VJeZ7o=9ZQnt0-6xqs9JUi^x?ho7dFZh0*&+GMhp7S~9ywBzRI**T^H`7C4 z2s4C@Ps2a}4)C#HI~NoigHSB6*8!HOC}Tq)*G;fC2OKPj(FGJVaMc0jhEI`juo?%# zaMPRdAVYurYr<3!zjB>V21i&gak{lAP5J_jKOvfu-^l)FrbJJ zYMHdu?mXbW<6M<|Y| zA7M8>`ZC!V2bA`phykRIr;IV+AX^n{3v%H74Duba8K{B=jqE_49XJ^VR%_n&!S)dB z9_rY26KnuO1C-jd*p-SfdSR<_g2Or}K^W7S`c_1>>H(0|FnoE2Dtn+MKt7mk-&j=y~ypsn%lmxoVC zdZ5H|I>KavivdiXQX}mqD?~$B*i#4WNk77aw9K>q-nW-Wl{i>Tyn5Y}zx7_pjuXpm z-amiVI}dkG5I%)vQPqK4LQ?mp&HY5Z8&QJyH1vm&(Xlk* z^NW`zUCN#(D_Jix)u)Q(37JxkRKCK&g@>X)-I7O%@1c zF(Q_FKO=S~L$fN%L^j!T<_9!`=_ON$Aa{zZQ!JH6gXnY$&CQ)or#V6{RGN!3RsGVP zXl^WbI?IIt{r!;DXbNE*E12i~Hba%90aga>y%$4%zw(V#U%Kf!(Zyzdy@QnyeH^V?};EHd*b1A{Gl- z3|Bs#>dBzWidmzAMzk)=-blj~^x{RO9d8z5QeC&FIMMSHmw~Jb(7|_o3gO{5tsf(ZIw0Uw(ej z_tX7*y?1-MyYAe+b+hxv^^R*-ueATz*4pyJGV% z-LO7InXFhRmq{f_iEG6P@o^$yY>Xg!&FZMgi14sgD_1NJ4G9hkTo&N})zT$?zCPZ3 zo)_1Xvv?7E;R2QilR>co;>YZj#w?Q2>&na`qI z;P6A9*UbBTGj5qHeb0NMbcesk>yo7nt>&=64j3%Gu)bZ(E-AD_%hEo&CC|scp>@Z? zB&#mGyRfCTjNaG9(VE+vk+&0#)yRV{sBXxHXUVS)?Mav<;AeZMGt;}7F;7r07;<#B zcYzt6SxCK7!7kZSa~aA~zn0s5Gh?nELQ$(3%P%ybUKFn@4$Lx4U+a6kuT_ag6*8M`RjFL!A)XSUC?DQd$IFpPS^kjr2)m5Fadb!#?~ zU?17hwYm<~GGKB$Q+BxvfZm2h8moZb!vTPlnm{-Fbvs zTiy8VW>&3@PL@xR?~6<-^j{c3F!98{F|xnG&BMSuQmipmE8=;oyT7A{X96tV-m~NL8l~6+F7aUlOIu@M5({Ic8FO>gh^2MGk_!BcJ BI{yFw literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/banner1.PNG b/module-form/src/main/resources/static/form-design/images/banner1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ab58508b2b0b4d539ef26c9e2048a4d6dd04888e GIT binary patch literal 25012 zcmd43X*`tu`#)TlE?PuF$QqTkY{^bpBKy*iY-LThY{@XDqA*0V@5#O=`<^n$8k2pi z5n~J{W-PPcC;EP`>%L$2gZsh%cfWoQdYzqho}csBm-lfHWn!dr`sDeOM~)mheOp({ z?8uR0+DDEY{e7Gs_?H_ON2Y+wQ9m;sjU$yqJZRwNnCnf$n@5gR$DJZS_#3!C@mSZ& z@5m9RFZ+Lv_IMXN9Xayg_HC`3cb?jW_DJi7n;Va2+1M%^fq0aA?(LCk_V@8;bYCC)>%x|vPYbVLj2uK>sTRF^+8$xAf*A_m+vr=NqZ z%{G~f7A)JgVG?bC4+WTq3xen}b{C-bz#EmN+mZJHQj2SxgMORw&9?5&2O}Q!#PaHi z%7H+bs4Z~5y#m0I2}eIT?9J9Y)Lh^~mIbyI7i(4u2i4h$RLO(s-j?3i+JESK=SN@8 zt+krr!fnh%k@7~P(A<+5PxCtP_M?Ktbc>~Jt#Ww>3JWHF{&80fAdz>m$?zY}GxeV6 z`CzOevpV@P7&j;%eUtH%O&3^boWGhcYWsG%rLTfnwwxd*!0M`ll|e+@(E-_E6?2<2 zbSbG!9T3u!g2eNU4sG#tV?{Zk&3CK1h}u&7#EgC9Y*qRFi4LB|*?8yl6F^$uVB5Np z+j`~pTRysLdUU`ugCB!8nuI;)n(H{r@0@-NJX6VzNtmz;z5*v+8rmJ=M4!F|$SnEu zM{BR90?y(|=Ubw3<$WExteBLBd2m@{xfrLkH6Xvcdi`F_=t86x_T4Sff^%jU#wER5 zH@ojh$soM00Vm|uuf5{-5;4LvJp?{-f!%>}wgm;R8f~TQ%*YO%19;=CbDpq=LVVsI zXb)F$29pBZx9tVZht_EC8_p*)t0(Jq6X%4%4A=BT>)xEK4h`BKvutsR{EU)+hfTlJ>=|ULWmrId~sC z+?&~Lo*Rt{w6L|b-3)2TYOUXD-nf@xG`s%Ee?+#RKf6hUcQSa2QEtyqbZmbAyGu!y zupHDCtcK9O@vh#V0$JLEGFN!NNz}S9YhPX+VnukhXiLd(y;!TC8IVIPR;UIoV~WJG zanD#0QFJN`UJN#gb|M=bH}&A#h)2KgYnK#SMsDke3s#?cy}0ie0X1uV;#Cs+0$VnN z4@C97dG{Xda`#SzuwRy_Ob}^GGahCoNH-?1n}Kx{9~;=Gim;RtZToP`M;qB3ntNc@ zoCVI7Ha^-u?*nhhrj(w%PP82lY)Ehz*VT@c0m=T&l$FL)vo?CR=JsXR!Y;y;3p6os zJ#D?dDO^x*2{>`8*3H~f#4O+gXy1=Nuq8{dr7?=UFO3zK=}8lWOW!1_S`@+NTrS%o z3>whZE-(?fiIYnv`5}idm@xET?I3UM>%--n*yq?vE>_t)6CSb0&l(xHyJlS)Eh%vf z@wa68V4&hfUgyX!S5^EgdI$%1HovLYAr>KgcpgATqmScsYf#O8OexOFeJO~WffTZt z4M-szh?G81v;8q%$cqHq203%B64N_p4#a0sW0L=9N4tm^E*O-oO9;W@HcAy$>@6E* z`aO&EMBd-2{3gj3gvts$Fs-*`JsYy-MJNSxr&VD{f66X26Foc;ykNxM!;e0#J-}xA z=qmgElQ*))91DA8ISN>zil(3odX@7g`F=ca`y3%MYYTQ67NoBe0^ zuc{xvP#dId*zQQstXqvi;v?6;_vLTms?QD6dM3sG1pi8KE>}A{-jqkv>BqNR9H;HD z^hBCqLHbV)cNa*NUS0W%16kE*pVCe=Tdx#2uu=n&_lfrsPwvO!cSC@NOSDV=XaA#6 zBi_<3NL#evmBk+c+!6Up%Hux-e0tAvpsLGkN6)=JpjS5c_=kswVm_h$O#9He3`G8t zIDg2$2Fv}C<3RFwro;+65`F7HsA(q0?p`}Q@*EFLWwVP_uY`U=!2+^s=ps=w>xrv6 z?r)o}CTtfO(0HPUA2o#LKq7}}?`nO`Q64&Dj)wPgEPx=><;ZkTR#iSva9`Ew<;%If z;Q``Gbicly$p;^4D{}$2a();lhMbm4aW>;(^SqbFG`;?=c55_hxZOB1QN91`?|iV; zuXN9}flHGPwFf##crC%k<@8$xq)NBB`rD~eR{OHIB-@m8_lIiN>?*}zB8bspLn`a*!4C3n24<$Brw)isl^)~yhhLUFs;jViXgG&YDcb^ z^ehlRmey!*=aM0BNVfeZ!vg!Bb)cn>_aX%0_ggvdTJqXE#L8;JxXw`c%B+^Jy;)z& zu9Z>SU1IIe6aUtmRAsNYSrV8SSS@-rZfS(zQS>6=`1^3dMZjS8iQ!yRW2M7Hb?%hQ zo>c>j2r*9ed*N87c zjL9;)@N}hMIp~OLowv;yYYhrrh6beB(wY|rWN*+r7wWd{S2E8obAK_(zn1Z?;V{;m zLj~tF+@`m>j4_Tf$!k3|Dv`6U1z*36P0=iz!kXV%`0&Wr%0La;n*8(F6~?$jo;Rl; zF020ApPH}(uZE;$o2$??1w*O58}&3FD`IH&OSK&Pka54vmk2rY{M46%oF%OL9`Vg- zQP$ka;ZrMeG^+HZsqZ!uQn{z4_&na&Zerl*UWjHqvIcuh*StS>%Ws+;W-!!j)#0A3 zbBsGku?uab@wU?B;(*ZI2b%}Za+%vo#H>J!EzM<>^PKcu{*c1nUq_(H-||?~uX$Rg zH$@00K>KqvcTrQplwZDgee~K5Z5D7=sK<`UZyfK5XjB}YQU(<{8@5`~8RRW;78N+i z_B9N{`H)#{<{gf+;D+<;peh?WGfRr=vSDa8C1nu*xO8todAF$)6nSEQ0rieS_>(+j(=j^?u(4qyIx_yu>Qp4UX$C_8qxfT ze#`oJ)swkOqj14L0rX>fgdnS6*0^9q$VTbgK*~Il&iaY1f0Ce)oKwTEIYu4=Hl%3i0jmd z=hWKGNE>yZ)r|l8>HY+2l>3^2T?YoY-X7{3l&n@J_$`$>Wq4)RN;5t!r%FQIWl1JW zrk{ifXKKl=+9i-g=22ZF^oet@i97A(!zgJtVz9W&MMKD~u^jjdJ8N{Ezxu?$pI~^6 z4b9uN(^8Ioc7>Tpv=GjZoH0D5ZE=onaFt|u$A`ojv)sA(>xMtkvwtGaN5o9-p(NBx zHRr)(okt<_D$d!QZnq?jNqiJ`lm4fyn*D8+jjgDj%pJ0-OAr+9$h;L|emM-b7h9oF zu-gvG)t*&@s)N<4kTq#PYa}bNRIh-)gAwyHYgHAPno^<%@u18xw7{6;PrjdH*GdGP z)>7`H8#rN0*Y`1d#*pbM&JVu0`--o|)}9&1+nXHrVhb%Q%Ty@Lu)JjA8SxAz1fEN>9Yfo0&L~2my3ug3T#5ejDlsJ;C*ptn!K)2{5LE(%Tv zwSHTACT*AC_NTGP>$1m~AcK4o1ED-=w-I3xt0X4A?w9jDB2XGVE!z<4*}^sv0Euw@ zV*rd#azq)}DGZgiyBIG2jq{m1j4`gKwZS>=^%%?pHM*(!9}Yy{RG_9qr!Ps(J=Tby z9}e}(?H#Ck;1y@tIu2*lE`(%^%94D+D{nEjv9ICWFEZ>Qhio zC*#dqW2n0)#b7;Hh-y*}#lNO);&xbs#6e~9wcB+!4M-?AwI*(S6kg*DiG~oGE;Ga; z?Cl9eA7*VOZ1tlvs_Qjr--4~AO>z{^oS=Kj1lWl2ifJVmf8eWK%N3OkkE)6u{Er7) zL8Th;eZz(B^aeWUk3U}tCSZMjd@79ilSk4-Wuzb4NY6<2{vrj?W0unGMP$rZq-VDE zT|YR>SPOhpPTk+_&WGh9V5habo1#ml=r~^JRV39_UE;VH46T6xr-IYouwy5R7 zzU6y=n8?Gri$j?}xd!})+}t_`yA#zpT~60F^drFc85iB0=^$I0A#LL0cOdP-QJ|2@ zwmJ;OxMlFW>(~h%vC>sPKA>|z6TpLfuz?*a;B5hr1=MW8(>1q-3~Jf{=Wl~k8{qap z^97Pol6nW%Un#2-Q&#Vjb-a`=8NiLkioa$ahO zF@%BhhUCkaOimYovhc_e!}|Q(frR=Ae#<`nrONCF%6>LrWEsbVB z_7o-l5a7s#6NCIbdm?Sd7NT)ZIJ z>q-~2ComEQ^p|7@=Tk|T%rmH>7qN}T12X8$EBK&Hu74;LI-%`w8D9J5!99VqH*YDP z>1}!MKLHC!_^E|m(jH`ku|dT*5G79`39@RJ?cCuwi?Lt9_j)mzCgFnO#D)5z!U#FU ziGTBZnVzaG5bvsGa7s%F>=Iy*&d5Q3g6;{>dMf2=j19aAO6S85paP7f%$?pjxcw>D z=75&fxGvr$487QWiM*P7gtEGH-|p5OplsL#LAmjU;C5kB-qf(dsQd3VK;tG`cI1{G@zTk zrx<0WKB}48nSHT0MNn^@g|UfUk@K zmAn63NOZx4!;(fTS2yVQf-LU67#liGTDr<4|2W5!jF3!)PpjXZvrL>2L?i*0#?794 z8|$8WHYL!@KK$INpe)dEynSG$Tj$`~D=t{qQFDgtJ~IJTfkv*ZDYoDI-i&?b`EvF@ z${Yz7l-`T`kh^DnQcFXWGc}V-nu|X1%S+n_U!2~_uyfu4saUW`B)Z)7&u%DoyYQv* z)8%Z}iET0f!uj5<`g3(Ok z^dBXwd=twvi!iwuD|)t5mr1j)L(QDYkp9ZQV#$>tk+U~-U9al~z0wW8@Sw6og%v(} zSjSvub9)E0!+aS}e~(u68N3wq35rS+Ts(jcuI*R<$uewFb50JIb;(z{2!X;hqd6}m zu_6o8x0_XR_n#P6o0!|{!2bUhtoED#e|%0Op8o8ABLfioF0%bATj+{>{%~kttgvfu zOu`==;1q@cjRLvH|5fIPNhCnQp#gg)J+O(se=%}1`RhyWZXwR73C^mdKl=Xvt1a*l z$&EBCZK^wS2#E{;H243Tf&aOicL!{n5sOeoc;?|p7Vu!$ZujH=%JG{(e}2?+-O8ul zjEA+#zCsSNOZa8>FNaRCFC>llp$w1*~04p@|BdQDIfC&`r5OMB+T-$|Vm?_=K=AKW?-O9VK=(r_p%TM$H@!aS0(Gh5bDA-s_`| zFvdp|(H4ye1&GPOn!+WQ4E%s#)H~-_kA?nRvy6L7g}hSznj)h8m_$W zIwX7d*8SpK-D6yI=_h5v1z-OOjp0CO+)WroBU5=7ejuh z&HfnO$B~zU=09~JP4Zfpq6CNTcfRXiLFHPPkcS84Gzo_9h@&dsoj_RHT*%i;AX?4z%=C6kfZ<0 zix9pR^1apOQ$r5nf=g)^+GMp0Uvjd*{IiR&8?pswVc%2!YfnKI+M5k*k>O@X%)%M7 zY#;Pp=&clRkTIF6YcbH?KE|aj;;R?fJ6fhBmB#2+sICLQDlb>VncM5(8z~)N5FaY5 z4Rj!1g9r3PWWaxX>ghYsEoW(sc*S8hE&;Z$vRVWGr5lK}_hL+(uGhR0WSubPeJHn3 zD9rd3#10#%<77Hy?aw0@WVKJSJTsVe5n~h0*$~auh5Qpd0KsIh0{vdqDFRWUTUYUi z2)}y1{qGBGCCvYvv1a1L^BmaUAB_??{Q~g{__`4 z0pK)%r~W?!6VOuV{>w}Mgfc3cF!n%$RcxO7U-1k`5~t*^$#O>RvSDBU@t1w#{^tVm zKSy6rG|>_ro4t2@pD7d9Q%u@Ni2sK%_i(}g<1qgIk%X}Rl!A`wMhOTQ_Yt2qky0?+ zUM&IHSa)`-3QR6&3zX0&wW^yc3$KPbqj626ABWm~o_3HzMup3`^Ml!VxF4g112S85lYF1|*870!`( zB3ZUNTlRCz+*mc~V1DYy0sD|xOBu0fTBmc`A9oC#gLQ3cBcBS%FNFB9#2nXtn4rQL zH$D^SnVoLz6**&dWUB;k&Y23rSVv4F3go``g@Jw42k!zJ#O(kY5!i&k60jC#(Bo>O1_|J=I-e zCX?uo@6*9}9@drkGgV0f;9={&N;?UZwZqA#`gG9Ljp7{f1jP83G4_?E21~LA&y2>5 z{WQ$h%|Y?VabSugn__Yi7{g@z>U`RQ~ju<1lwD@61Bo zBt&z@p4bcwgzF$T0J&!Kz*_O6`Us79VA8BFqEWWg`4pt1y84sbxR{4cTh*W9^XC9$ zk;wx#WXrh@8S`yO%;=7erL?uq48x&m-hkG;6lAvDt?0XHddJ2xfM0I6um9(eGImXZ z>#mLac)2LmxSXhV%Z-#*rZCx3&n(fh)hCV!#JxTQX6^S*XMps zg>}P8?fWlG^7)cdz5q5gVSII$b}qccQ9o=N?Mp(_^jU zXL(a~dzu+N~ulKQ3t+s2FcRc+fKyV2z}mao=73QbB0d(M(4V=Z#FU_Gv~7INQ; z(Zb=|*|3y4_ld%?s&*w?->;X@mK{V8aY+)IcC~rsz5mab98bn1LpM*!y$YCiD`KyC z@#+$vIA6_bQ+G+M0x}XGZ!aOfic+TqIcII>nIld_&_-&NFgk#gAm*4>+z_S|H>|F1 z`?&LOIQYUidy4H7tLF9knNe0_mH6yXBD!QTDiIn4%n}o}cH2r5vN2I|>S@=dz~oq2 zG4HZv%OFKgPHC~QaKUNnirx%EGCY(jZGDkmQhJP1Qj{%5e{GY5t}fV(*WtUpzrkV3 ztcrhg9tUHmH3wjnqM=lzG_txh+i`ZaN1f_J#6={tv-eD*D>5qgZWFiDNJaXgzo*;+ z&|Epj^0w5)K9XD$5O3PwZ*ZRnKa{-bpgP)uG3Z!~0-`_}8B(>H z-?6!hljXC#|78^co4GS*IasmfD<$P{$K|9p5JXY{V~(z9sAiY1Urr8-pDegcFV7O& zbwgN8Q5W<2VX&j2l>vbZ$(3y@*60b>5U=rO z;tL^!s=L=lGc-Xwmg_A01KneVn~KSF@vhlHF4Ge6Au92qfc9f=^JU)P{)G+pW}qw; zc~z-o-|(J;E-mE0=JrZ`s7`@Sn-AI@N|ds1ylw{)y>Y1?**!kX6Vp|BO}aP=ja3wg zni6Vq_>tG$f^1~2E`U}d)qEC8dw3>@Xk%!)+UDNJ_gm$~%3h5Ewws70w7lzv>SNo` zaVmPp9h%GsUg<39adUvjyeZ}p(|&v&5FvNpb6vG$-Rw&;GnKL<(qF?^UwLabH;JqY zK^OdbRO+eS_`TAb-wfETlN!82!K*&sXT>BL=!9++$g_>?q}1;lt4Gu8qxy_C4$)p~ zdaPk-Jh5E^@x`1gzusxd<$1Mjk2~x}+=P2Bs)6F-^tD7}&U24mLI1$ppJOj7i6BFU zd2y3OYq{TC`5P@rar3ymWs5`MwdF?EcO1kFhc{=#k~nL-eq5rLmQIa&e9&NBT zQ)k%2c*n~3qiOV0I+3|bx_=;KpgfvuN#nl3{D%|^;hh(O9#UIx)+H{A*4k!$Gd@BAdf zj&VI_?=50BmW?u7>M`?^^t7Lea2`4CD|Hqz<2bI%=;W}h%lOD)N0;%jugUv#%gr*) zYHKZZAKTf&)po<;y`@AT&zBc-&X#qGMd-1FYduZ>^5(8<7cq|~^3M8ogtGocF=ivq zSYH8O!YlqF)%MMw{y&Bm&c%G!qPC|fqaNXtQZ#26ZULKH-o)sRy=bIlbeTMxslN4e zdp&c%!~L^#Nt_?LK3$3sl1}}4^mZlZO0mnh>h7#LkMMg-n{yMOxgybkO*lu9vA3PY z9mWk14fZ3?hDB`YTP@G4u4cz?HvmB>^gZuQGR{m=BTWsT>lr4@ZbAh(OQOgS$-tqp z6>-Uk>&!98rw@X7S)kZ<(#DXS1bwb5bp$a1dGZ5v}xQ-bWgcGh0% zY)fwvB=@pk&{aJCwMG+Jlcg_kHi43iV=@B zd9%cEKp&_jw*h(=6^jruRTTJ|#Bi;Ymp$xlaVaMKZU8g`^Lt?BH`yO`Z-B zB{`oCg)HS8Bb$WLl=eHBv0QqFKz0Lp-h5rT<@<2vlgRkdnhGH#ajzwHxh6KUa|FgN z4tqYLP$_gE{SND_=}^LTMK-i2$tQFHvdbG?Zw$E-Orz|Y-%;fG3aUejFhBafXUW5X zjFE#TFxir-M%Cgd@@PM6s@F7Topy1(4)WfPGCca+n6`^f)d@77@Fd(`qGXt)*oOv9 zW3m8+-E2GGy5;fF_spoWa=!eTsM32KzdBF&S+YkCjOTK}W8zo7X$fDVmsqM$uhtf3 z_TO6AQx}O2K=}0VPAH~~{*2(av*8D7#UGdbL-rHlmEsYQ9h2vI&eKXOTyTrUv~iZ| zOA2=?gdC3CvD4}D#Jv+8XYsl5yBTOL%W5g;TVp$pg`07q_`G&c^$5Z0*xn1e1IPN0 zKD>ix-aPN>3)W;n&;^Cr$`zLXZf2+hh6vT`7JTi zCraAZn>7VY+B9U(s|Kve~_0NNU}&cEj@a)0Yl+P-oD}#vAeV8&3x-jJisR-gam1zJRuGy zCy4Pwc`&7AmFZw_K-cNkNt$m;rJU+-9K=Q&kbum@6=m%nRO1}SCC;zB=_~%rO!{|h z__8w2Anf{)%|NwN?cQ&CXZ9-fx;C}lvhHuW=Dz;i({y<%y=lWrf-j=roIIx;dE>+0 zD75z~l>af^4%1r7!;YrY_WmQ<+QGv>L-0Bg4na0L1*yi1Pg93OcWQ26Iy)8vyXcdHq1~Q#MSXnV-r~25|2>3>#yn}IJOVo++R!fp z77T~WsbDa5$h*i>vf?(jy)9^!>NC@5+)leaOxye(uxO(VG}^`>x?s76)zccjpa3nf zIFJqor2dMRP*RJQcDxt}c6ett4`xm2*{~$|TNwZ$8T>whZ8r{G>(eg!k5&!&IR^tx z60hK?l!4mV$h1D-;c}tU7YH9K9bktEG))~?{l2qER%oEum04C@4c#o_c^tBpkRze- z7E{%srb=3?flHG#26{t*suV`*s+4P!)e~%$ad)B?z7#A?3z)DCEPzZFMOn&$`MdLT>GRWDkHOm|{fKT-XsVsfZWjLY^x`NkkT1cmk)-T~dzFM9G~8v+ z{W`R}aD`8NBZD86AxWXuqRuxo6IaWM=8ebh+g&LyRT7{8=`ht+@l4wKyV5Y&m78Cf zZn>=Df8pA)vKu|elHW~wKjl$Yr2thJ$l4^Ytd%ESMG980S{~5#fk8*MLg-^*#i4qk zPXgRXfQTqzdlEuNfXE2MJTGZKr!zh($&C<#^m{>r2OEX2)k^7KKWfE{TYDRl=J3jB z9BUZ0gZcwop!38oWqx7P1-v`RG0H8ukYE?I#(^f(^%S^zQGCIKPX3}4eg&bn#^p(T z*H~~-k++hHrwwhfcAGGR*qO+=jcu#BvOY_g?{c)sVVWn{pNk9HIt4W&v@V*lz`970 zrRTqwHGx18j^FyiSY0gGBef!&IbW$d=Fg(PS_eAZ^YB>eRnM^6z;})3DwKu*#@(Gb z9rC+trLkMmQSM)MUIN&8D%Y}-Luy#wek5Z$?q{X*i}W3Uf$R#_nO&-&~FJ0rP-{N%r_COXs z`@|hp)NUa?B`)N#CKx;Csm-~y^~JTw6{{lC_F+TWtv?~9utB~`AKOa255^Iqk_Pio z1r>2w3D+x>MO7h)6a?!8U#49nrWQY4Q-+9LuQH++;-6L6ZcJ$d`!3<)G~v)!1jwD! zTOeBLs*OZG5Y?zaL1M#Ps#N@d9*AkI47a1_%1RTJRe{BJ=%#!<@fWG9c5-E}i_nVo zVf~jaC`k2%rNZy(Fk*Zn+F~Pb6l`FQA5<#*vu5=a9!n>a+HEpYVpJDPf7dGq5*Yv-)HyCy?7h%538s9tI$^aA73{EAoI{WdD{L zyy**@b$s4p0)yt_5V#0v=QR=Zw}O6uOvOY#V2oXEiH)QakHsiyh?rH4?gW--&cxO8 z$nw5lNA2)20ekgG?^^6r^$QU~K8&$@0i}(QIc9}>Op*?-dNt_cC6aA}x_b>U7KO6J zhaXZco_wpL>5NP%FHshZXY5)P+sNPI5PpH7LaH4*Gl1{g7dAA^rp!ZdQ}_+*;ljXr z)%5vL^m6Uy&?3S-Wj(%rj`SKoEm)l0FVv-S;Psfzf zYfpWcV4-BYnt0m$37%I2yhsFp^6Mkl{(9p(!yobbQZ=! zW!vG}@LhvF`8`zx41Pe4A-@6>r|+%)R0B++dKaz7WoOTat_|S3h17Mc$`voGD*I%d z?wD6s^}{tF^3dH#MTh!cv%RsZP*AxO5*2{b6fw&I(x2!#;@kk>M*<8WN=64Eql9)Q zPYstgY;gJ_U(m1kN~00J;I()r<+Ts(Rnkg#zo_j!N>JJR5r(sCA6MSTagrVGUn>vL zni2?0dQc^FPD$as&M7yNMm#vFzG|KMQEq>QivC5Wx6Pc$Jqd!Mpp=7@M*J(7n->H5 zp)Y-pd_AQBJvGCupRqwR0uK;EZ_y^zpyU; z=Z%!tYZamLnjnF*ak2@iO7}J=A+NNM@hSktf!r3dcHR<>BJN6iX zz(e!z=5ie%D(-xoFVR_A`oKn)H_POBUuGdd%ZiWf3S7zI4a)QFp2zacP6iJw28gx= z>+Ynmz8piI8pq21E8Q+Z=XA(duy3y!RO_1t)epbxa6vo)MAp0y$xZMP8?<$>nL4x- z{P))+z)NP+<`;H!!LEy|wc8^#qh%OlqpEUMG0)Z|eRPxi&h5A=GR_|x2US-MM2w)@ z2Hg=1Gvh`0)vh0?f@lPTF+>vb`}YK5h}4lf4_*6J>-goi+f4J9QHU$eZZjmM$ot%I zz^pm{m7zE@FZ>cLX)LgVH0R)42Xs+GSIVvgh`cQ#S=gqCj}lY=Y6!rL<55s53LYBf zL+DZ4sV+fKRvFayZpPoTw6z49$UCeHkiaoFL6WV%KfkX@%8{pr z#avNaqKPclF@jA#uI#M=E#Apn;9tWs6DYOaCWklIdM%tVS>QW%O!|saV!+SntjqmY zdhbygmY{8=V=&u(#rieQHPIaa6Gb)Sn;R$q;Ml&k1(yK&asE5hkUqH;-{@+q_Tdx4 znctfHeYz@d6PnU}9~0rgG@|$+qfYClF)VgIAdu_@UM-{>-MQjE%HXY<{G|PfC3u&h zAH5jf8agcPHZy0hZ;d7Tf&;dXqNkGhjjcEKz+f!Af0RMe-u9RvI*q@OnNL+|y%AG` zuHX(duCm*$#uKyp5zBQtg`^>BARM=3`>_2tQeEOet`sqgt&tNe@^hZwb9({UGie|9 zD^XfXG#|BW-%6_NZ{Mk_Vi%tX$=MqQ5`2Uff#~h%~?_6C!N$`2sGKuy5^W~O~9>HtX%Bgdd=iG)?74* z$>OjNk+yv@WCVJv#1j? za@?!wQVY+(u6^%h;LoIjQ45kvU`!?D3t-L+h3nF!#R_4w>75(XP0j(+o8$s?)@gM; zZ}rC^V9b0~zWm0dx@R-lcoY*DBHFf#Hy&je&IU?8nl-vKW7nvxk`jlWcUMohYuovP zUJ|F-PPc+P@LRk(g~3o6E|`ZQx3F@uH`x_VFztIC`UXbxFjgb{a#+ej%$i0B_V7bP zCI~A6T|WeJ;;zUpkmh$`2%le+6%{fSOA8%|QUt1B)a=cuqz6qk=BPt!4x@-EjRZYG ze8J9rcz5GsG$qUt<2;622LMbsblQ)dSE{r3Dk#Sj1mA#+To9`Yo^GFydT!3xOdKmN z{E1pJ>3MG2v@`8q)yMS)$HnFxT^B2*Fbx8ELKAZ%)q2(n)&o=O7wpGSV^v7p70Cw9 zj3vw~$g?rKO}|z`lY_jvi!fljoMdbU74bfA_qQ`NJ-hYivsy}0s_2%Jp0`^1C^vH< zemV;sW|&eG$PWxULKjTYgUUPl8C66?t>?BHx-BAB535ez_8;4ZrZFk*<`hwe2^{DF z`%n?p$4fe+ILpv$p6%PuYTdS3(DSnDW-1Fqc&by+Rv0Z`hG0Jc$Wkrf+f9Z7+>o+& zskzN|&XSb-msh9Z(DR$}f#f^{i?t4p@YJ}?TGvnKVx>AdKLJ+qIK>X^CJmR1?d8o% zS(!}4CWu?S+Drvai~#_yh~$D#Whr*nqpru4--y(@9XN_wAaoSv%=vtNq0H%%nWgYK zgrJBd%L5R{(3R!Nl|7z@;A!uk1w)3ly>)yZcWh+{&9it5rIZ2-h&xQ$-cZtvZT}NC z(Doc>ZTs(+lKK6T9j*14$dK~z(%rdmF{qti$t<>*c$KN8mNF$yA2&^{>>1y2t=w{z zn-ClB<{BUVy~A1)vgHSl2|AGb!()nUK@Z3Hi-fCY)Z1*s1&#CZ%bKF_O$|HyjL~H4 zQ3h^k!aS5HjLu?ckFTF6m*AHTp~>@B6k+sWMxb#DmAH@}HcUxDi+7OkD&bof40UMu zoB~ql_D}rQc8)Q(H}O$3DrP}4+gpr{>kI7H^_)r~v)?3pR?O3(mHS$7V;Fp-7)Jnp zCbLc91Bjs36m~Z2O(O;9!z{@?xXn0ds{$`OgN4|Fu%*fq{}-i|!7I5Du!=fa5V_0B z0}cN1oI#A=F%@KY^^w)|A~(O0It6VUef_$9hP-$7^()thdP1?MOt-;fwyc1xn!{gJ%VjEZT1XK$z#UdTPE7Vbr+q}0o3z%~l`Q&jK z@df|(MtE0}44U!sP=(E$Umb?xmQ;-Y2%NT1i~J1DYWE${LBQOZ4D7859Bzaunha&# ziY75vyUL1&W0>>nMG6>Pw|kMc^s`R>v%kBNcWuB;uMY zgwosV6iUfK+hy}dUGGRVn9{!r@E~oHK{;+ASF1@zV~}%Y-2sIFuzd|gEhmC%N%O;U zr6Fl)g4;rXmrsg4#>di(M@Cwfm!U~~9gnd1o&LZ=09yG)O|-L57%h`8swJ!@+Sw&l zHd6Z0r_^ck=nwYf7W|TZ$VFb?&WcZD&9xab5nM21OtA#A6kSEE<7;B7;KqM@FVIh?2Cqs0pm zJZ2tWzwTz~GhC{l>@tX(oMw#!1!O3Jf|`n*;nK>;N#5$RzK~t6SSD|3T(!+6YY1-2 zweh%CJuRzm0+=p=JReLtw;?*Ve2Ymwe_)>SKScpNY3R}!={ZXJJVfZ=BV zt|P%Jk*0j+S~EFqwUmv~9a0&w)psdpW^k-!*1;pW%FiGknD1Y^bL}%bH?4eS zB@04R*W<37lx^c>xCcR{CC-N^6ij&QyY<(Jw)tA=Wn48%nR}v39Q~XBw(G3_QzcZr zcVUese^#h3#uP2Q8MrNt4wes*gV4G=Zi`ov%#?n#LUYszUlwlX*lz+07&*VyIfhf9 zZ+H85$@~Y2MNMpUY7$i!VnvQ%$?4$@oHY%)xDMo(Af-py&snmP6r`-wXd`i<{;NmA zMlM8kGzrO=Gh7NCypR(MOXKxPB!sBdvuQIFhh#JZO`V}BmCs_#V_}ed>KaSTKtQ)H z&o&vDimid$=PQyo`Il^BuR?*T0LSy*tzDX5hYG@!suHZepzw5q8M^nyp$S9*KRXP7 zN=z{>);dl>QXju#BA-&9@)|O0X%PI<-DminMc%Iu+X2%8_2Mm8Hd*y$ndQiS+&Y

+yyLN5DkPn^?1>3|5QO|ang4Y~{ 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 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/banner2.PNG b/module-form/src/main/resources/static/form-design/images/banner2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..fdfc4b4df01341f6e632d74209af7eef1449e864 GIT binary patch literal 28296 zcmeFZcTiJn|1XME6%Y%EiWuBj5TqzgI)aLgqKK%Js7NP7sX{^`P24E3Er1XK5g`ad zR7$7`u^}Y{q(lgipb|=e1QJL{NH_~|zx(~2xxblv=H7SCnYs55hpf2P_j#Ug`F!ij zpH2>T^6Pi37ZVecKXvlhc`-2woS2ySzO~Z8H(}-%QNW)yq37*v#L7E%P5>8@zDMnk ziiy2VlU=$d1zfMYdGd0onAnC7EC1FsLyK>Si3O{kI(GEJZO`c;**80TbH<`b9~U~p znx`7nBd&XS`CRw%z3vkY^YW=O>(>9#A3>Sa2kR zxb05V4!t6IX$jYiHL)AlT3D-DuU%uacK7V&XxUS1*I68K!#|EHaq!70X|2PS1pDMN z_kY(Na!XHlF?JknVYjun@}C}{6{K0V_KbW;qD*$?+bSMEmyU5-&R|Nc5fgLLwur}A zePheSiL7U7gm_3et!Yj2i{h`Y#mjR7V?32Dumuiz!LFIcP+(nHY+^{?6N$}zP_POr z6$-e{ipSH-ZG`F6yiwbm8cQX>txkxsGjs;I6@$R6Hs#O}+g?-mGz^`#_vvVY&cV2mZ>+ z8NW}(DCmtahi~y-S4_-0+&d0qb+7w*hZIAvj^*mtM@+xtj>;qhtPIzj4>gONsTAfS zNT5Yx5*WDsiL*YhE*2$=%kQj@WO`QIp1lq;LmN9Qx^T~1p)H++xqPdkt?TiK<#l3W zcjo+MaWiZ0%Hnir0i9T1(k?ddM;c{9NZ5V++y##_JuWhi?_$9~-Rugf$Bgz2zhJiSY*#IMt{+d)h;n%z{O(Cx61!&t2weyO{d&`ck zoO3>YQo&?sJ8=6IU^nvoLH`c^>9jI8?1lq89pg+#vrmJ<6XTZn;X{#mgW180>D}$4 zj2IG~zGP z;>z=+=0WQ+XI6L~v)3QtRvmPRO(#~Y5Q*t^&XjrY!wpEJoZ2;8MH;fSAL|_26<|1h z03VHJ7yze4|32kRD6S6U%yI#=`MG%AFSP$U;3B~|ELIC|1%Qlo6h{sx zN-UG!3^%&~doJf9*hIZ}snJ{>H}Q%{WKHfGOZw^L9Usc54l3>q-3&jVnY-DF$5*cT zW0gN6w0a1|sKUQ{AG=9H;hW4|>3g5fT&1;aK9c2LA|G$Jygdv zI)pD2A%6sio<`sIo4}puoJL3<0cYcPb&rg{wYfzP{RHqkKY=C-00t!8fQ#1dCp(_Ipn7^O;0DBcjgAwrjRWz}a>bL= z=dLP0rNrOTUkkIlKMf(OQ5H{zvepLEB9?JMvnF7`s@4%!>|)?Fz`x`dt(R^EViK1?@r0!h$du>@Ui~qn!$WKD# zP+d5%MRiPz+OO?Xo=Ae9$U@@k)K@M)rqE;uB&+OJm~&5spj^2wAZO&Ss{|hG4ZCcQ%6OI9HUx8j9E>_Nd^^L_05iqjla2z>ehKVj*?Bu{?i*q)L4gyOUV;f`J}HF(i%GrY@cl~=7Q zaM_#%%~RGc8t0F+CKR9GO>Tu(*d1USKn|zXF^m(kA8Yq^`gEvVy&Hw|D1<(*G8P3{Ol*=aIB#nRj1(=mkSlml<-T6M=3 zCQQEH|MM5fd@TD&z`8nxq{|+SrJ*doqs+_0-JZ&~L+l#8adJU*NBKb?UkTe`2;nX+vYC@5EzT-2>NbMCcmod?TOS_ z`z$#Zs-n$Z&_kssOgKzGgp~T24g7_I$q|%SHTnC+Qgz&^zXI@OR9fKJkDS(0DlD-^ z6F9X&W(D@aK*Z^n$~6I1r$F9g6m6dLE?d@ds62Ym ztkEL+X>NHSaz-hr`|9BQNgpYtz{g>B36aqiHAenW)UIf0Y6FYy_RoWV#zX6KM>OS& z%AC^yU|P^ex5O+|zu*1(j96*$ACMQ`J&=B7S=_|CGo^XYgD4sm?G@}2XV_KNs`->& zV12p?See;>(8~T-&Ddz~3e*Mk7;gV1mw+Gl{_~iyzN*C|Fl7-NxsB}zJrFrzI9Vlb z`8Q8AdiJ@jZ7kLB!IkcDM`{m&|-&Y@}(ePU(5RyVaZjduSxJpRIt=TqCw zla%3QN?sOVTOa;y=|^0ZXX+0JK;?*dsaH2c){ee9cP{WRisV}0SGWXX?B9)f}9_DcmNA@B4F z%Hh8)anvDvCT9IDAjg6AT$Ek)=OvY;7sQGx3ak7@pE6%l(FttV!uUK zW%`{F=O?NjCSb!&LnHVt5?h_4D%Zn3-*$48jNm9+I_MmNVN^j-K;ub3DFV;&2xZYXy zYuMYCKT28sK%5c+9-r(gqft!PPkk%EWlcQx&t^l1$A)Hd)f;bL-2Q>77Y7B~!SjL> zMs)HfT#j^r*3G#5O+_P>H*hD&)<1&ZInk!W8)%ktfK+4AYmB!f=o7HVyX(n2qj86~ zU1T+?-RyC-gH0Qxc5fmmKR)`m2e*~SMGTUmjufh@*+&nGi1Qr3S6BA=q?KE+vCfVg0HISCitOB8VYX_DtSbB z7GsHLq>5|(te#Mx;!E-VcJbF~1gzXYmvOZF|9JU0-G4%dwYY!6g?|hZ2oe78JOEhv z@M8B1*XA>0?>QgO4Fxs*fXQ^_Kee@!m zGxnp4Lm>BWfgw7$ z-bgx{HWqklK)2?Be)LjIt?Hh}vCQ?=UUS*mq~2nhpv|9R@)!n{=TsSH9P>#!oy5JB z_$w0rezAjwQZSGzQQC20Cw%^j#BTeMGLuFjtRag2{;sFjTN-8WS?u;Omc7k2MmYV$ zjSytD>J{$(d}FMfIP#4CPOcnoD33Ho-|qg|-a>>kxa31UqdL6BQV?k*%5|@)#I)ec zKFpo0T!t7uHOf49`|?>%Reux=Th-XN{&yJFK)|xB>kYqTgvuElSAvs84X1X{z8GwHn=UJec4PL;v?}` zh7DS$1h|H|kCv4hNg8)iFTKy4y*ob!XVH3B%A!wdGqHZQAyo0a zfjx{Ccvnv4#yhq%?JZYuw8WQ11PTqyqU+bZuji{pA+S3sp7oNEf4m$JRcE{>V9D$W zlPQCiz-e8c&oVB;AEtZ>H$8HA>DzZR>pfNq%R;BA@Kb`oKxOwnCEL|#ZY7E}@E6OK zm(CZpyDf0`NTt)p@Tut> zFy(3-6mglO46n!E717DNbUrXY^a<3^t}KXK?k6x<5ZKlgnl$j{`fsD@-2_&-D2|<1 zg2(SxU$=RY7HDg`V?Cz=vs>3da%Ql|ZxD*kC+jFT}7j+^$2bzf|ogSmuji)c% z%rbY>;7Mnu$Uo1gp$3f}&;p^DQ{zgjLjS(_0261!{(i9~1~Sre_s`C&_%j-(m=%~$ zchjcW#-s7j8RpYVEcwQZXtGfI)4)sD@iQ|}?SdP%HTcpzHJ7P-0o<{+$%wq}AIu77 ziYI%mY+_qArB1qcft+{wgy-4_)0wj^>l%&BnBw`htJ(Ig``_Sn%-L(^gg-rPmhcF_!gK2q}u=tt9vG{ z#IM)SFTdYG$|Rfd7Wjf}W&u1L-m%q;Sv@h3d5XL-4`=0;4gvf*q?u*Sf`mppQmlSzp)71ph_dC3?4JUnAy>-pPbGC|d6|MIyG_>N~|=hjwFm z*ppzaT$F4M{&2%~jZ?&`*LBh4T|WY3+NysCwEy8u``>-Xf0xRm9<7u@3@5YYeo43L z*2n){b%FnGw=NpIas#h!pX^!U1V$C2|3m*uciA%w;)Al2h#5l#d$W~dfiWrhkUr$| zZLf|`K`4EF^E^aiZsbbBFO**}bYxsOo}o-op8p+X7XksDb-(@{2R)wVjk-4hAG|eA zM)y9ghK)}-MQ^Zhomt2V6-T->H+kIHZyjM0=G9FZ)VKz4s0ZEM9 z$+?Z&s(pV$+mV81Y90M!+s zR96Gk7o_8^VFKhkDq=BCESKlE2zwOI#}NuEatYeTR*j#p6I?OK*R#+~{iB`sZ=L>1 zc;Cl3D}J8A{V57EtDJGP!Egs4D%fRh;>|&QUIfxI59NDvyYW0v@U;^aqq~TYyt>@+ znfe&E{EhsR+IKDL#$L<;0V47dxm%!tFJdg2Z-IG?{$@v1JXA*`EF)o!RBW~S?1$jsA;`p&YAI|Q-w6Bc&&MIaZQ>ytdRIryGL41>QMLf@whi5fS5cSP! z96y{&d!y8|)!_p>Ko*yU-@R@tBrOny^~8gMD%d9jE)a~P5L{!a%slz)s&UY(wI+%2 zP|R3&=r{j;n}^>a!Ddy*-;M@?1KrH3tu7)XndGMpN%5FcYZe5lEfU-~j41`mb3mo^ zmR1ytcz2)tK!pUW)7oO4w9eUT8LGA3N!xFy6U8kq64W+2xTVXw68s0Ww!j-%UF)~j zzDY;v)Sq2y`p&7d3i=~o4dftLkFyZJf*9W2n5TM(bMzuotF5{!x}q^>JQ@A z0j`rjMb*#xm%XeMiHum@5>CONaNSRn!KFvm zU*(|0IVK2*6!Y{e+kbgGqk41G1S7}%tNrtfkE;E^Mk$k~R2^hqdIy#q*ygW*Yhfpd z`(V6(c-r2q%LU|;x&$km7opl2nm}a~s2vZkxICMqzg%8F>xmreag@>ff*CDE_z)v# zsLwQR--HmsIwkQOyhRq*XybqtxFuJe;zx$b#k2^^?mRi@$c^mx{%ZK73aCO^DF#GxIr;n0 zjLSGvXDhtk0_@48Q5eiXT-sdktclxH1EnYsyzi3@e69uvcQ?9MAOl4fU#G)e0MJ~i zv+do0n>M)0-0FGdTCY5Z@&Rnr6t?bewyOrbN_7_E8-F~OwzX$TwBVV5* zw|&m4@iaRfoYewc^okc$;N6QECY;l=MqP94jP9xQiRq}t(J67?=M7QCW!YGn3}3p) z-z&v;b~LXb9KT%C2P4?B%6@kUTDQX`j#j!>i4!H`G0Jex(^EiuiLbS}C^<2152rfg z%w_{h=409B*wLwqHVukHmRgQm(E@_WU2^yfj!KMpbb~58VG!-Wb>~~LJ#9RGXM@8u zl&p5n-Zf{heY&fzQuj3=Av@?>i!@jYq>>Q_I3f9)s;$VFT3XNINk0=M>h_0btvfCS zUoq16O*71}#R9oxR|~VhsXu_s5_-A~j1H^&83QW~FL?+i=$+I*TUYxPWg%!&Ea+N$ zAP~06m8Mu{Boyx97)S)@@uYM28+$wkJ=64i0r?uy6YjtdO;Z~{7#P*t{_(K#T=T+0 zZb1wJS6Ma$Q!9I`6y0G!qYq%d3FQ6`(}5Ck$P-=Ar2#F)r&qAvX>(QdER$%zv^npw zQks`UI+A0g44)R(HqVz#oofqudP(D?xHpSAu>=0t=!;c3#MgFUUygV&)o5nyEbM3e zn;83HHXo8Diz^1LV$$hd@Cx)Z&2Km2|0-&cd3~{_w-P8YZTu1vTdnjyWJJf~o~%ILFHf-C8o*3OPWhK5&-=GT2KT^G5=d?g;t zOv=4JJ|A`)(m@7yWR0TA`sSwQco*DQ;cWS;0|ANurPzm#`q`IQx^Q(+?tQiR$U%$= z>7@;cYFc;6{;|B2%SarQZDCDI`BiOF3;zER@;}f^%x`u8x`a=?jI({c>T(VHp1ymQ zT=i#0;5c*A$s)t;t+%Y)-|RR2UJvPL7r*BJ2LVfR%3Sw0+ZW^Hb|d>$w<8Op-KKN# zLDaNC);|x7%Hh^K5S)5yufzuZK_GkO)yHIahXCb}HQiFsEWjn%4Q0sQuSvaeO!Nwt~wk`0hY_i?-WUz27y4!B-vq*4w`# zK4O)MKYs;co|>R0&5&dID$lk|=U*hXYyu;jKOOtGRgUl$Oy7-bf--={`NBQuT+PD9 zjJqT44Yn=^c|K!cEREuSxe)17;MM{z`5!2`b_l-ymd3q(M_Y3~Ka?m67S3AS z7PsoAtG^K)sOI-O^%?RsUweyZH%r%gu5?C`7M~UV+$HsXvuBO}bs&>)2U;r6)&U&& zzRH37WBR!DZp8a;d%0EOS2q6)D(*jdPrs-W{mns|NF;I0R#qu9V(TKZ$KOdw|G8@Xr=`GhGXICQ+?|0rk>nRAJXSjg#YU)0DuDRFPXyMbSD>@rDz%Ur>G}R>qGy(<@7=H2fR!xYVkP8}ZTuXv`(ORJ zQlO4~eN9*#fqb{`1dG_)Zt^3gxsp1(^)EB?VGJ+|aANF0mn&+VdGOtq=i={}DLYEf zq3jh`T>xOtTA$+xZ{4cI+mFRzf?f4IvZ7uafT-H$-#RI~os7dwAGvQ8CWueNH3IK2 z(+1!`b}sBi6Zie@zs*Tg-`f={hCRL+AW;Omr*f?Va0;>3-IZ}iy|OvA(@RU_d~&+% zn+1(Zd8d4}^oHtpNvYrS)#{yh!=Av}AB?4a5t!-iz^08wi1DUJQ(yZ=Uagz~1rFx* z*Xp&5bzn!I;4^f%j+0gW0!Ek5P+tA-?(s@m%-oozIxdJG^{;5&5$`>exuH|YdN`6Q zW}Mr$;qwPOX~?*|+@Rq$NAb5H>(#V<-mUz79`rI*>2+j> z;AjDiUF-flq%Aarq@9hgN1g_^Ib}M>)2R*kI!GU*7WRA6;v>O$y9R{-CATJ>k*{&X z`rjGcu@g)0_iuV8SL`M+b!@K2CVnccX?Q2i)q2FJi%J(qA%gEdO8~)xoNjer@!$9k zyVuG$!*?IgFKTR{SBK20K4pOw3=xq5D@#6J`E(u=u9@kK8JhuSSAa?0X!kXSG6 zh>C_pJOt+E)ikJKUrGoMyty;m@|w)Zj+2yb{l|F~y|;tqKdM+^6{_7x{bk7;zS@=f zp?GcYEQ()Z3y+@YrhmYDd|o(|Lm_rh?`98n$iUp@p0-#-#?yP{t~m>?)KRT!$@{Wh z=P9q7LzRDz3#{b6u_3hTKH3q3I}RYSoK0h8>anU^$8;6W*bT5O`?&*;{284-7P<9et7sc=`=cwNG8`pMDkIzqj+Srlj*S%EYGKyKhSS1` z#{_}IHe71Rfu4P$0~O~dx_w}k>@S{YFajCYz*3ZBbgg}F$mINB<7%^ZE6Epb=oIWZ zs9B4F=mn!&q!Q`OXp5Zp5UgM`k$leP_`os3%NTTgcs%q_zUn$l?f8yq^67W}Xt1qXG zb^JXIL{R>4DBtL<+4d!;0=2K}xkf$hH_?qo-!}e?I~{VPQ^Bx*qJq6S@wv~*?4Hmu z`{}^#lOe68L8$rYnc>yrtMjhEhg^@hS8qs2i`###FdV6Kd*JGip*)2{MjBDvvG;>7 zbIqWDk=)F5_VlK_CWmrY_2qwGmis@!ef2{buvqbG%LW*OTk{+k{aKxe`~Sqpa5)?Z z!P^bs{0?CDasKhI2w@J$Oso}teGJgr3CBXI!A8*GAUYA{yJ464Q_G!VllH>=)mhzj zzXlS!^?5j8CfbKw?m?v0-yE^2@M=!wjEFfwOGTP7o&#uu*nE-5VP!toinlV-`%3g^1=yT|LETnEam?XH7;$E(e)`-n zFsPdyNsS?!FMRXzA!Zv!NQ*hSVjAX>r?8?J;LMFDs!}+-&c;w8W zzYLFQSPD>q~kb}X&2Rvp($?!ml5I$NPv*Po9^uw1N8t(5gN@Z|*K zWe*%MN~>ZVYyfSX&$x_(*GBP1l87Wxst|z+`ENmSFuIT0UGp#+k$i*|slb2k< zF;x~NMjF|f^zG3)$>&D}8uM^ozB93GFp{@(DS77`K2YL6#=&G_zFe2;4`rf5QHZfUA zYYG)|*g%1(#o4Ktu1j`(MLoY>({z(BpQw$Y_ z;%165I&&|a*9cjq-D|+GX+yJ{@cCX>h`-vYbH^E7cAzTdP1zb27ujoxs24V)e9hHE zEatlkpVb$q^Q|nYD?+jd!ggd`h1p~&sb+#<5jL48i#Jter5F$E0mJTocdx1%-YQ(P z_qfu57)ZOUZo^+Vt^3_xoNt}x2QJ*Ft&GR+-3A9H z!h3xwg9k`E|chu)4 zgW&fQz%g`tJ6i+mo`;*{w}wACCSj+1_dvjl!qUmf_qI9XmiAks4+6aSpX7Ah1_N5r z1t$jrO=Ugaw2GvF=f6hjaK4MbNqtbWaq4vZ$>i*_7Tm$mh2;9EI(u&7F57d*+nAUh zkosP3H*U?y``=9UicZtBvcxUP;EzzFpui;U1 z+I2XbQxPm{f99MpgHhoQDiXCzdCrICt2gTK_`^mt)|kvyE6Ms0 z;7x`dHzxEOOFCl|4YTG1y2=s4CWZ}$AuAMZ0#+Jz)!>yZu}}(4<%3tdbmjke^$PQ2 z0r^1lT;jmJ9gsvmFm=wBfTBA~ZG6GdpzFnRih8}A+08NT699S`$!cub6m~WTO_aJ-X1b{CT4q1!xj9)y_N-`gqi$kgZE-Qha~Fz{ZQNLm z&r;?7-9`Pe{qGZHi2x=I&)zdLths_mG)67WHcyA_=Uvx)JCjzu6b`b!IHG+GK^xOF zIQg>GwOheh+_hi@y*^-;vrYum6k>>7Cr(mT7z4X|PF$$f?4iDLdIo}L9=v>A=6ZhY z4#Q_(UBf2U0zTLIIK!MF8gDBTB!JaQncCO<)J~@3i;z8Q-BZ3!92br4^q8h_W245> zlZaMbQJy5Vnw@I=~z|_r~&jWcM`*~csuZ8dUY*XAv+$5j%ChFL$kvjhi+UX z3d*BK2vAg&qo;2KB*x;1b}!Oj>@4fkh0Y1$z|7kjM|=MvvO}Z;O!~^c#=Ua#8(+=! zl2xvqQCja^BCj~Nug6o>&6-5IxiNlXy3knY8EWC~o`)gZkhMvK_mqq0f(*wPRyqW&mt_D`qWr&KJ zD-+@Yg754_Zi2U6-j?b~i2M+WRGkXFz{tg!@V1pKhfFsqfe&d$Vj& z-p7uXEp-Ynze(*}@4YU_m^9sJkgG_$JFfsu!HyH2@DZ_`OJ`R>L(TLldP>zyK4sGA#eP zD!D5bVEM8rW}%*AqoNjr8OA9rNP_HEZe3XzhNjgEr^n*K{&U|yjAcWh7RqqBUSw^= zRo4A;6H4&QTsyblhXtti3hIrpkUJOZEDS6R-~LMk;NH7Rk(Kjib=n5nD_=L!lncIU z@k%an?OcC9oGb~Bxdul_yo`pn1rjD+{h9uo=i0nUGc&fZBd{%at-~4n*Y0L|yidgd zM*-#1>Wfh$tTh*JjAPbgbl#wqM~$sZT-dlkqwYziQw`@$^@=E*nW)^9stQ`YQirNk_ zxhpiT0yK#JbY}lol7Grx~O1k6?a)?8ki?p^ntEx|R3VXK2 z+Npuy)XT!FH-DV3Bv8T^mvgBXt^~0 z^VCqiv2fjoCknXy`P#g>vE%dL*MirAU#GL=op%NlQg0h#Jm%`OBe9FR{KRCG#oUNE z6Nf?a|7a1j%E|B#>)m_RhrIi=27t{_>WhU2dR&y`-{Ugkaov~^7!G^({qV&8tn=%LSN zVPR?bDgE?y_)=Gl1F{6f&k1=Fm~=@7A523{sHa-t4olGH8DzATiwptl{;3X33`h2s zxJ)>1Q~YN?-|G@R?NsW|sV+87mXx*w@5*JoGMlOSFc{LNP2~Tu68#99+%q1a#+ZB- z+Hoj!tOFuKOjnWne7x-N&Z!~O8-LJ@tytlvLzZ&N?l+GXS*=Z{+P(IuuP#fgVd4bY z_)=2TT+9CMS8adN+{&*HK@U*smVJ>6z7swD;mA+PO7xl^sTE%0#?_rm9IJh)0B)?s zjUFIxc)HDsGpXM=WaK$eVV2B-4M&X?T2)aheA9%>-@MYQmfPk=+otcHN$VyBtD{pW z#`r~h0lTlvt@~AJ%Bno72^jtz&zOW6^703Rhn6-Hw6|{$neoc5gO0MaUEj|5ruz?Z z(YFZ3_!$Owi^Gxp%?w0;FG3PX1|mY)$)Uu45_0fa%}CzU379Bjkw1dJh7+AD7+$8( zds3Er+~0{#R``)16Y7&mG`HN4={urC8z?5FPa}0Hpa3ud=|YjG`*c=#{AKPkAzo&B zd2XhjnSDm5c8`$w6c8_E7()p^hTfoJyehh<()i;t)dffR-DPQ=n^f1$Z`$#bACpiN zF5xx52?+HsMmsKUgtxi87EGV0nqdysb`ReEk)leDQHJ;0)jTiNHyw1)N&hS}<7*G5 zhvV0JS46St{np3# zYH%Yt5r;bbmf)h(qX&R-Cy&*#1+y?=j*!b zF!P=aJfeJ(XYE_z9@cf-h^9Hd^%W2+WqrCYV;o#Mv=$B|W%PP3a`%?ox`xXH^Q$@r zf$cUGZ9#{Vh`ZhRm$4I;_CJbT#SpYcP*Lb>%T*IemQ5T+a61Q5D0}VX_5%CO=+noZ zJ3kQtX*!11SPY|%W`cA3C0>6GR2MsSjK4OKbWQG#OqX5Fn^KbC zVt!gDbw{-Bd1vR>f}E7=Lu5XqZ={}yqm(m)hsa&vyj=y1gc`*A^gdzU^3vGEh29rI zMHQ|#gla$k+VKZ9EhW8c;S*mA=?qyUw)P>ub?Hy}>JYzWm=Cj0xxHQsa~Nt7mD^vl zbeJuo`?eE=W>dl!{`1?oJS}5{Wg~i^XQUQ?plA2_6(_3UvoW9C^%=6w4l#7sKK>k1 z_jRyB%w4;%>=*cJ-FKbR$gdpvjlT~xY01kOZz5++{V<#8v#W7N*~T368@uGfUmFLl zO%BJ`A1)K{8(SHO+;>^!FQ=2f6{MQBN{`rqVtN`D=_nuW%uvKYBaE9JIULn&c>;ZO zEKM#@=F^QdQJ;@wxiRBU(o!2;8u75U1J3C>8amz-%qFC|ws*)YWD`q+^_Z4clpr|$ zJiDV?IXi_!G@^h}UJJpOy*JEI{4Gu4O&w>_!r8Tc-TS8@E+<&pjbB&=B63|XE`8A@V9f#dIh1IFF*+Up+@d~S4llY(oG$D= zaCX3L0vGZTIFv4?ysvnIgLgoND8KHiyMkuU7g7({)kYLEXk__IGW~XPA!37NX-*(D zA!pOfA@3sc_TOswNiJ}RTsM={AI!j^PUJi0{Tc3?>d)7FEl7Qr1-j&DB@BawMgGC5 z(I=VfZ$a#j{)wFfj%|2kq}tKIcq*{ni{2S)kp(&FwIZ=>3!@4AuYc`+D~0AJoGbtB~w|UVAUS5u1@6FNoYXLOvMO!4>7W z7LhJlOtJ>4nH>m;FnZE3LidJCkJ<+e#c$%hBJjR>h1J-iiV;_}aRA2HRp9)z z@>VxLbZR>%{4B2TIWHzR)`o8<9)^MtnTNyC;6#c+~*;|Jp zVJCO28Q6U>qSZ$G05`(n!4Os~HRrXWF);~74U+6Pq{l}pXW2V?1oTmnmHomc zE>Yx)yuMIY-`lXaV7Ppl)oQe_&#~z_`KT- z=j>j8fy)AuKBX*lFlnu_&5_3E$71xyEnjrA6_vbxdvENMsG&$J26Fo6`7iTiq2|;^ z*X7ZSGKcWo@d;v%A3}7XN0>Y3KC!80LE~98i%F5^J2OanDqD$qP^<9V{%ZP|4;dxf z4ufhRrht(j8`xiUi72h$Ln^tr&#&FWVxu4;<8~Fcqfz}u&+C@AftQ#FC7`DrESuNLM&%BG;mUW90N5) zjBAJNE@dLP^+X59`E(4t(Bu+)G~M;E3J&=BiGgR~eV0|i1x7F8aWt2ll|s*!VDPG9 zyxO+3p(Kr^wEeFQb!kth#A=fFRm^Pp6$`u;9Jj9?S}JI))9ck6XMdeBsdRo0N>`0# zJV|&AJ)8Owf#g~pf?7sp0J>}EGZq;6)BtoRQ-X2S<;&xI@Cu58Vxv|TD!oqXSDTy?F6 zKUpe3Ku>FM0xXBd4M4~rg?v64AMA)WS^W7}AM2QBIrQ2Ms}pl$+Xz-)`@>@g)0V-T zALK1Ey>|W5iVqj$5JS<$gt23SwRtK$hvT4gKcg7O+I(Ix5IOPC^u8D%y8?Jq>s>(V zT%ZKE`po#f7I7UxpglRFX;2j@uVdKW+l~hOj)6WEwx}@ud8yiPdEhnpc3eMRcp%h| ztL3v?ROmy_c56>fcg-$qBN?N%BD)(5k#$j!CEa$mmGEU0WA-wgRy|5D7}84V@7hMg z!O|A}gogBj-m&Ztr5$=no{e93UVEUin=eqr84fy4M0@dUU#W-psZ! z7CHSHPIzaf#{gONPffI;+FCJqb#Bn@5RZ*2=ce_~LydEZEu=UK1^J;w&j^ zx~;=d#&{TNIWYG|zLB27Ale1`WJ!?Vy;B~y6Z+rMD(H=9pQn&EQlKQ&>K$p!A<{DZ zhgH=IE5A7uDqU8MK|60bp$gB7qHho74n-OVE=={)DO6Dey_y-rghfb&q@7DDS`HsI zg3&hVYk3F>ULF=_^JH`iuP#i;Y#SO7Zq?!7Sbipc$(z0?{2Fo2mA=6u;?k!&QXTjS{(((z z+0c?+-OZ8roW7Ax^4{99$^AE6BP0<(G@k|CDN2g)!hL^8dO9!bct{YY7|AsCiopAA zfPw=y7`$hSs*JN0JR5qZVnh@l(!0m)bQw$Nu-k%t=*SVgBr@yNc z*43wn!2Nngm$+1(a!2~kOyu;nMtXMO6shh-q0z>?rJwt!?@so)L8oErFO3`UN3}wM z(B^(8?2WVk^Pe5(FU7Flo&r+OJaX5$d!6i@oA1|Ed(C7Ty-T2GbiR{Mw@l7Y$)$2X z4m163zK#t?@8~`7xLmdM2ydPNB#g4TEd~z(mjHzOYi^d>Fhm;hx?ZWnpX&0o`-B}f zZKclsi~Q-LAo`37=Xlv1$K}LKE$88b7n)|`u1#iyCHwkA;F#q+6d7a&C})W}4x_>r z?eJP?xY6E$Znr~$^gy_XoPO^6MY_;?e>OxxSliziR%gPSTcmeRh7xVl5G~IT0=)75 zp#@O8J)U0^b!!++q_9&BC>hU!jC3uU&5_;cX|}3S62Lw?q1WyZ z!Ambz3T^k|55~0MOr?cP>BxaM;~Gf<52Ul`WD@1uxJawK=6!Cpo^QuanCYYPFtq#= zBTtc+`-D6u>h6q|TWti3f^AibCe4==kd~ih;kej#GIu$RKGvp#;+!~^2P3De2*)~^ z%AU8cnI2!B`aJzez5P!aQHIH46Z5GG2&J?n@X|omE;vuZR-}b(z&T5h6Nc}{>+}hS3-2`5QL~L12<}{_3w{*j0_t(y z7XG4Oex^2z9(XQY9>=%!V8uku@sd~0b?21vGfV_^s<#8lAZ{&@~$@L zhgVF@GM|nG^Ipc_d{|{y{S_VvOnMG%sH@!F6&j%a;_K+Q@N{FYV3Xa>Yr6YrR-YjW zmHAy9pf3L=r)|uVYa*yP4f5fFew=3a-PH-Bw&~)7((1yrJa&1)UW4JYpJ?XNml5?& zAbmUJvNPS+N|5Ezyf1)K4S}HbCL&`tKn~krGP5rw_9Y&5&En_01A<

Z|kVRcW2v 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 b4oushJ+NxBZ{-nN#CzMFb~qMo4gCJ!y5xS) literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/bba_thumb.gif b/module-form/src/main/resources/static/form-design/images/bba_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b4a88322946c1b65e9236657d6f42c71e412a94 GIT binary patch literal 3127 zcmeH}Sy)r~8OBdG60(?tEF?im2r+;L1lbWy5OoM5NLU65Q$b)@h6?I*ijH!^Ie`Ra zC+-{I0$SlgMa2~iD4?}c!BMND2!czsN^wC=U``U8YM-`Oz34^na(Djk_j{LoC12#{ zpTq{(z%U3*yz6*VPh5@91jVmp9hk*h_ue zPJQ3W9I7V2)w{mF$m+;*>u>N~s}C$^0`3@1m;r!i)ctaNxQyEFz(9+eC`^XN3!8BQIW zt(<1eq0t%6P)gK1?i~Ktd>1RgD&R3clgnP50)~j$^r-=)g}=2U`P7FrwO!vqU_*lU zFw_kbR;~X&u~yc;$&E*};A ze5@dpf)h2mKgvz4`5VTT6Y|IUpn?~B`O!Xow+E^_0HQ)fRwZ|q!mi;yyT(Q|dNO5( z(vaIEBo^5_+8bJG6foKk?C;Q)qcmHc(BdBLY_wYC6rS^a^2noz&3GFqSXDV4J%vAC z=ygah&ds5MJuT_7^Jnmlu+);;JL9n6_Cf`txBd`g4RhfCW$xgc}fq5F^bFhU|C@tyaSPrXmiWx_-;j z5{OH5aS8B-y#rjF!nZ?Npn#VKr||^yXmubK7N3GoHlI6xp_vXT&t-${;6-psCed4Z zju{@l@;WGkgg5K1S4V?6;eLXa^J0PgH(&%T2jlBr%DGT{sEszJRRQMz+ZQ1&fFZ;L zTCD{?98kf}EP*W8;ThJXyzh2EtH5btM3@+smE~CvCcpxi0iQZ?p|$PAT1a%k0lb8~ zN*V1XM=G=P7E0aLQrUW{8%L`2wu_dUPcC+qVwegWOwJEdU(ghkP-diGnZMYcPcW7@VbmOIpx>pYmRCzed%2X+OamT;YIX&wUMpf-{_n-e{s zN%$P^C$0a3oe}+cXRJY+JA)~xIrynF;Ke9!5mD7YqETbKiJ6Anb{rbZpvC2^4Zc{! z@Rbq`?@=ki6uJ~mORT8L#Gz4nS%;41Un!I3?CJ-SYA;dAvBLTW)x%B-Lr`6rn?L$k zUQFOV%IqF#gC5}Bdi>;-4rr1qs0)dcpyspYF!zUWfX;B1Pw|1=G5GRA`1$l9>H$VDpJQo!fe^lQ++|HN)tdbJB?X#PIO)x4gJ8!2~2 z#cM>{Dvru&7`$UFnDf{c`}j!Jz`M*RZyV@ z^7Pj#MM@!7tHBCOaFE%PsLDbV6GZ%IZL;I;y%5Uc#Be!-<|=i7Qv73~>`5Pbu))rF z4u;KN_alhm#Gf?TP=UVBjrl==;SVbw#biM?3VSySG~J$pUOaa$xC~86cY`RyE~c(y z;VHb7q8o$qEoz*V&^-!AW>ZrGnNNZrm(c~e^_=&;`>AxV)ar!vH+7{Dj`*x8YjbMB zHIxKdFw=fb%KE~K|CGA|=P)WgdLGg&yjf|cZgHZsr#XXx0-Pulm#|#GXl8gM;4(!x zK_DnH%g;`r(Zn=Kf+dqU&=N`%R>FP2!cLyzQz()2zGiX$kx5}ne_g7o0A|~ha|cB7 zLV~2(5Gkyw#S&tyLY|H|Y{a_6+>X-?Jf!k$DT*zx1Tt9>YjOOZusexEd`ajc0VncO z5C&z(?hjceaQeanUKQm*8~Y?)J-YnWH9d5H%9D_3Gk;f#^_)%f$Z?0hy@IC_R`#iE1Ud98@p~5HAYTDuK4U(zc<#GppqcpSq`GsG$aR6;x2k0_?6-$i z7m=~qrPV9qZVTWbdZ literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/bs2_thumb.gif b/module-form/src/main/resources/static/form-design/images/bs2_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..556c7e326801a0ea090bd693ca43807925d3cbc2 GIT binary patch literal 2797 zcmd^A`#)6c8Xsolx+O`H%Q93$nTyL{n9MM)A-684%gM}GWn?bROqpmGJGZ^Fi(PxC zQc0BVBpao@iAv-WQX~e2E`%;_^UgXmoi68xeb(o*-uGGG@ArA0^?g3?^6~R_ zc3~Q#3{evksAPYm+ldxe`B>25hYY5H$5ilyap#a4=-C9i!a--i^?{+Kq>xB__^Jl4Vn&qDieZbVwCxhx2@ zILKOvg+lCu6V~AQ`is#P@}Y#M=jR}wYR+vn|5TiK@RaXU!OgY6vPDVqMt==D71BV~Djr?Wup*KT5)s0Nt z1Ea;`y*Z$Vg^U%+NAu)^dy4m>3*sq2x(&3`O809f`!AG_6@bUi^1&ZV_v?Zdd(dFk zaB1^UmD5ngJo#|eL{F^zWjuI$5Ol4%mt`$$vYF`IF#R$WJTyT@^O32h{2hyB4HojL z=IPO!U?>rcovq1KN5(EAA1kK%5`D7*2eJ&VEMP|C>Q*F(8D`a)X#VL03k>m1L zNkAHLnrro;Eo8bcxh+q#qdYo0+G?;|YpN42;h4%E5#%GMLHA}^^K#ikNY-R6d*oOs zTKf3>vYC2QS))~Z!7^DZ^;7j+S>2+dJsMN@jAc!@>Domz^^oi_W2V7c*5V2pOc4Y@ z&2m{F+Cg67VV?A0FFQODt)hS_LhA#AAqG>-R6O0>B?2aUJ1mA+@HP&QihXzMZ!E-# zq+-`O1`-1Wo^TY$H%P1BC+l(AvXy{!WD2~F%yz-V|XHpgowuN zu~vo&Sm-lEyq$`rD_=m$oSu9k3_0TMZP`Q;2_lp6BnL+_nY043Ba-Y0M8!?EB{@(W z$rL*$=*xvwWD`birGzrPzvNQvsMsj6SU@2VVq;_RvG#bra2tW-;^Lyzu(PvOAZ$gu zd19u-mM60Os=$CnY#~P==J0utQjy8x?-Wz9ic0_80$1=&mM6l0ZU@iia|sfrfIz|% zl`VY*1_u6bD3|*UEfR;q-|PLa!lLlq0+> z3;A5=bJG;g?6o+|s`rH(IeRURvvLWFVhBoW|HJC9A;tVCm){0gvH3RoFi$b>Ld9UK zAaWp^nVy=Q`1J9^`|+{ScO%1Z-@JY`G&u0`MSowfw5R)d*R#%!r%&1+x3#uBYHn(5 zcvxTep!WW~yEWB!sw)5f>vqMho8@Jtf0o=RzFt&#?dp}wmo8o?IDalb?`-awoYSXH zW}i5IEbHhWzaKgLTV}?ggTJO9_~qxc)Rg3;{XZop?A!a}p7^-klGt54#UkMj0iVZ> z*&fY_+O`#rWV4tNTmHFu)5Z<|Sif%Vn((mDkl@upfdQ-h{d|4Ay%?Szbej80s+%jt z#o3AM=wNS0A`&{X=-C5hG6x_Mhp(KcU9@@YgLMeldR?axtN zwEd5V&Z~-T*Iv@rI8N2DD@?W3Rvb>{t;?G1!&v7sZ$i}`xn`>FQLpFZa5oZbQ!WU# z6N0id*ekoxJ8V?Re!96gG%&ojbC{6bC=zRL(qC9 z9AVRaGo3jGR+2<4BiUquM~)5rObdsjH=o&{j`7Fgq#-%QIg)q|V7l8WN}3~Mr^HPsnv zYBVTkuWYI`!P&3tY=gmCJ!#Glz7;G6+M758sp#>>(`c$v8b;e4Wr3n58|AJ_HBZ4M zKkT%FdUFzk{<}(CnOdM}KuhNHXeOR1V!?SZ4Gh!>qiTZn!)^dLP>z z5V6E{^;KymZ80qbv*Od_xEFz6_>=chubAD346L#aA6UNh2+PBUmt8$z7(H-o8%=4b z+W)tqA(h_^MWGdj)+!Cv!1vT~=&*>=JeMuyj@YH oWz4#Y8lWniX5g=81^=RXq3ldhwpWFqvq6_o40028>wtN;K2 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/bs_thumb.gif b/module-form/src/main/resources/static/form-design/images/bs_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9c715c5208044db4a057583efdf2bc12f099cd1 GIT binary patch literal 3644 zcmbW22~-pJ8pQ_)gjGU_1Vkl-6fuxJfv}p5O+ne+&?b*Hacp2@X7O@eWQclR^=`|y2;OYYw2%$t&KMlN7{UMYRK0Q3y!b1GgSGE zKGI*=%QoIg|9-9Iu63DP(rAsF(If5jzLQwPI_GoS>_#6}82i?Z4PO}T-`;b~W~9~U z#;FaXgLS1BTZP)!0+ih1tM9+`-uM(^u9E&k_u#NZB*N(|wbVM7zEBLu4 z`Pt>wmyTc5d)JUtH6Ly4 z**Nz6v*iFw_?M_*_iIoy&doi$;6aHsoPG zTkiI{WyZ7H8%o5&bYJt4v#w) zrvGNz^WPSBcbAu!uWj8<=znr@xTpN(S;~t$xvx7|YmR^4-iC>5Wr8JbdkP}Of%@)cO z%BTXhEU{pIQhGr~dZ3gzCyWr1AC#Y&ohj2u2>F>SvvPv+Lx~cpDoqvyUn7rcM1pCE zCL@%{NB$rndkR%*8G%D(QPSxQ2EpH-%3yQ+{TY4)CY`~g(c!N@g~1Nu_y;iq2;(0j zyqj7o4@wY4jPC{Cg%TASO?D8CwrbTX>M9mhrCvc}1O^5oYcQD%B1B>vS|z|otBx2 z=rWDY(Im*;9^<{EbCOnP%V-I*996D5T?P;LnwSjN?(a832EwNaTA)_KP$Vlws`T7U zS(YYR6iS5up-Pp~AeM+D5(RMmxlAD^oWWr5Mf3;(UC7}CGFd`8pFXk1`{pvkxokdL z#0qEmvlxtUxODJbAzj1|3}B1+{*!Z~vvM?&taRDLzDjuC@wv>uof{-n%Oo0=I!UEk zIpKgfg-WB!QK+&B!bE?9Ppl+enT0%W( z2o6KQr2BIj3@($&7qLYGVE}^_7|3Q2$LC7_N!4iZVQ7dw{$!VlN3aKx%SrRYHEwyy$BrKP@rT3TAF8W8cwqm&@Am#@ z&+c!(*|qcEJ8HhJ-u~6UzT8&z#pjhCL;t!WEOI^BT@uGz($w`R`@o@|0$HvT?8yyuH z5iSx6_`Eq`p&`LRf!qLp4x7bf&}mePpD%f~&n)i`NM1xwg2&7m)7_`Jx#C@>;+(Ng z7{@6N_I9>5)@UnBl!ZAQF`lnbmQnx&{NS{KUjr@xfF3IZA#GR&b(W5r5vJAaIkO^g z*=By>IFHO(rDYJ6!-x+h(di@sR_vQf-A*BFU$krMaP_mVqC|r1k+a zxpYY!w|(Hl&n?0_M;gTIfI=r5GEh#CSXPxdnYnU#(p1}-F@;r(3P5LT?GyeP3R?_p z#({G&*LIle&%5Gvy`^c+4wl}*^;>ny`cq|WJkzzM{_t!k3shcJA$^EH%^|{OI=B4W zj4S)&V--=X&ZbS~H1^}Ge4g*s+G#}>J{la{ZP>uDY)cDQ_cTD{wASv-c42w3xe$eO z)e6eKny#)1Y4PRN+Z~6vT^Ra(`;ES9!}bji-k)2=66SR+YKsy%Uzkp);tD@OJIDl_r=9Bp}V3M-s$qp_T4%u@^Ct7L~KyQy>mbB&HRuID zIyaz-1ErbCB6z7#L=bVH*c)RbKkQVZ`(3zRcCrltO@xo@(|=*5X@EOI?9 zD0d|6PPM7X{`Cutx9uKMy|6?Ow&H^Q##gjEnBtGEEZ^wDy{oGk(KYTb?O)6Vjav(R zV=c&Jt5TDxpvCSahsaXrfa4qxc9OMIKrNU=YBso~%4ITJxfF`L*dbqx0=#Ud0$50V zs|y&HN!C8<=f#6$#W15ZeprEvf!b4B>Z9VUh*q}b)IH_(MI|WL(Tifi=E~rdy;Wka zRe0IvICY3mE!|#E@JN_{3=-_9po!S_*BgW-jpoTN-8h`}`-nCEAH)Iz++i^e`(b3( zPBt*IBQ^*zFI&0%AUL=2lpH38NHGyZq%^+)CclLM>w|&y_WchqbUPg@C7drRvUVm) z#j>JGvh7$ef6Gqd*6EJ8^*fyIYYnp(#*s#_jiRCoRDLgyD>ZCmX_vot_Yp@ma&_8nN|a*M|n6qwg)7}pCJ z*9!!f63?V#w-)J4vPjuAo@T`$yQ(eyL0Ki)8&?MF^Mdu+lI(?EEhQC+2Woh|_wAe< zw0VPVMYX)jbpe*|8qpGNFiW_>IE5exdkQK61B!Ksp>&{ra|vvwEubt9ZpJVf6Rax1 z+Au9FKFwKTQNko|gO(J%tq=g11Gvdn)q40+7)cC@SgS|c6Km>RIvFd9F9R32BY_E- zOdV8h1!pBipR@^suXe+GV##`(M~LSUJ^FxW?N1=ZLyT#((xY4eFKY*_*rD^X65=fZ zSu#M*(#G7qKgD86uEoG1NTELi<_}mnYSt`8yR{uX?$mY2P|={ZcAj~op?rscZ@Ij; z?qkEoYP@Z0>3D@s`%G3Sira0f5Kmk=7;Cm*+4S)WnIh<|u7k*nVIuosUGD~e8Tcmk zAwN@tR_{M>u(sL-IPBn|bvO*Tl*O11O@ShQX<)@evqMl6MVkTxVOrZ5=R-aa1*5F+ zUHUE&95un>53IazqLtNFN;DYk-BCCEs;(eqRZ8-!(={!8%-k|`-RX6ReVbtWo_Z}1 zHEr7zoZnlRTywUWk2h;PEQsTW;H34woX_3IA(~!U;B7s*u5qOtQm?w7^BY_wE E2fD;K%>V!Z literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/bz_thumb.gif b/module-form/src/main/resources/static/form-design/images/bz_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..60447400d31b035f56554b29af1aefc76bda1698 GIT binary patch literal 4221 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 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/cake.gif b/module-form/src/main/resources/static/form-design/images/cake.gif new file mode 100644 index 0000000000000000000000000000000000000000..5080dc3694a98fbb8bc9350ab1d0a167e6b4d961 GIT binary patch literal 2737 zcmeIzYgki<9mnxQPC~AbgiDOTAR#1xSO~XBh+-}vmxn@7=kSI^serN;iZC9^2%Hm= zfS_P4Rtn0cOj@x;tUA*u4|F| z@a)9YbspxlmmSi%Wzl5sd3W$AgEaBOFw!4*^^ft3hj_@h>5DaRSL2OSEO0mq|1z9d z@;j47bj~M|XFY!$f!=Ve_sC;`oqWi1?(yim(C~AOeCR^m1&PzND&oGj&Ct_7+^jk6NzCh`k!S#bMRMd2tjJR;1RMx&4GRJxL6I_u2Jt_Yi}(<&R7u$Y0sb%mKvgPB zHe~J&dqqN)WR)ux!Zbl?SL7IP6$2Yf)bKi8*~#&)t$9Q;IXfG}9>~5kfDI!m2t*5u z0Y?ACqX!;N@J61)5IJoA$$%9BH?!4|Xhqz+Hy~jlCy$i3CTmw^r!!7;+ArD1r|y@D zJ1AR1pxUn{hm2CnrGr!YF$rvWpjlce#lQg7iXQh@Zbyiky}qYh2TH=>HKfe0PF9f6 zlnl=@cAj7>?dW#T>SSEUHYG1++^)$RhsC??LIuuga$&-z49BDdulP268T4^sTZ>NE zVY6XdYx3Mhw$O(5QHY^~tIjFlgnWb38`^Vn$yh;y=Qb876S-stPS&J@)_mV`Ka;WC z9xB;>2W1yk9CQ}goi#T>Isg{g3y;wq0Vi~k8P~C{w#pHmh*F_bcFGjO1m`V<^+K5o zs%Y-N=^TA*Vyl!9f`i3f@ zLhVghU3adX^B z^Aqfy`#W+qvg0TBnq{3@;ey|$a02&Lp2&H{voWF^uS)KoyasKXXZMSj$ zZbsM0{d=$G*OSAhrn{HtpZLxEaaJD70p$Pt0HFU`0Hx5I??3VF0U-XX0qk21fc3Tj zbhZB)fO;i>cvQhs@=5>)|Dyo-B9(%VSBfP55Jw901@eyGuYJ{^#c0r%-Pva}=wsY{Ffsbd;74-UrV2r*pENz z?fkTb(r3WH_Nl*wP>VI%NsM zXIs{_Hbwjw2Fo*<>qBY0)qRp{mz9JsR^GI=@be-$R#xLrxQTrhJYx+Kjd@a6e+MI) zQeaPgQ8^+EiZFAI$jPWoZG%pbl$zzrinZ}!bzBS0^s=lAGQguZ01nY{Rxxvlxd+cM z&>xJo=yjF1Pk9iNTqw-3LR0{bv?P+93qDFVizs|9&J|meP=V6e;?Y(Hi&@&>mntTc zJk4Ublb+7UtxVQ#Bwd5!LQCl%$0iTfC^c$|?N1pcspCBiJE!^tJVk@Wny-6m$Zx3X zET=l}A$VDU5|DZL@NhU@t7$I<5~FW0b6HvjYF!zl$uSUi08InXe{Z=JUPQ{qR83N= z$U|n^$NQ7V&}yuI@Wza2Q9=;T`p>AOdD)L%g=RjP0Dr$4D5m)ETGYZ)WdY?3e*FvW f2YFP~7Zr5RMpRyvaAkkYTaNMnufYH23JCrQrX(MJ literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/cj_thumb.gif b/module-form/src/main/resources/static/form-design/images/cj_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7715bf52817bc577c0d33cd0cbd17da898848a1 GIT binary patch literal 2213 zcmb`IX;4$=8plt_AuCxRt64A+37`QYgiSy;A*=!cG=Rvy6qmXn7Zp9^Bp@mfkhUuH z_7b$X)Rj`VQcKDr2-L8NbZ`K@;)Y%jO0g5*CU9r2cIJM&bH1E;KRnOO`}@EDpCl;2 z)h(G0(1CFX7&z~|xG?|Yvkx~8qTlyt4Af^_-7Z|5xzkb+^6D;ie(bZ%Q|B(l(R9!D zW!!(K>*TamvhsqgT1wHkVCuvA^7%f;g+JO|O8e#qeRbWd=7&Pxce%f~jqR+qndl6? zcQjz(ZS~8CCC~5YFMJpry0m(JWSeeW`Shm4i?;0VtBwvg$Yv)7-!yy94@c>=!ubJ@ z#uBSP-_-tg0iAbmGVJ2Zp*nWw8T_>?+pE${(uKgA&g~~QqMvBn2I_ncxFQxNFP{lD znQdl-eKn|iX#Kw1|H`q{-+Mz|w@Kf<8XviCF*WgOw4S1^=InGt{C3@Ms404`jWVIJ znC^?38_6p^{rS_TwBK9U-D<1qU;54@8fn$*(hujo?ns|~AnK|QudO?9RUH^tsG1)N z+*2z5&@b6$4P?2Pz0+`e|3QR2z}aTf*YV~B!6c=Wa3aohveo|e*ds_P8oA}y)7&uj z^S*yQx%FXoQkm=i;N})h+(uvc<(k{vv*pe{__ePlUgNod}5l z0D%7iG{ylCAk_csA<+Q8s2Xci^<7-;}LrVPZZ}tAy%s%rDq6EkM`OUn-EgFQTDV1 zCC?6&c2#I=-#s>rh%qWg7lK2`ij|cV^k^FPZ`g z8FleA7qO!w!!F6u$jBE8O7&$VLYYpX$if6C?(%r-(s&|()_*4Y@d5hr5K{rC*jpAc z?Fot!n!pUU-$=t%+9%-iQYvYC8TbS)l#ogk12Iq}<6=CNpJdnpMJz2*#QQR2{~7(4 z(B&9Hrz|WwT72yIiIUPXRe6Of18K`*riG}ePPY1u4l1(nls&;&wZ2ZjR%Oeyr_pfN z%Iax$b}6??8|?g6*l|^w744ZZs&*2|k6iw1Bn=zan~hJpSC$>lh)0}^CyGyQ@g+LS zDr91rqpxD=3b8Bxuj#+?*YLB!Pr^S)u{5ChIQ*|YVwXwj!#|LoK?&VGMt?Cd=#UJ;_?saCpR8x}tRTLbx{nd?HB1p$3imy*ed|hevm%ey>5iq6z>r*z1 z`0BbM9D%5ds8JV28GCs@J`|~j;aYOb?cI@M#wZhEaTeKPeC@!Ml;gR~lgXGtmz|2M zcao>zY-7fbgq*o3oX?c#@wHbnW8OH3jboTn-Tr78i1>Xjz~f8lu^ zQOkn9KRZ(<-r?+3Amz*H5~S{ZEb?6LTdvRMEi&m$4((E^mXyI{eMbrO zrNpm6tvSs3J11@(E{2b$(=q#bQ5XUHvI1oDEOBSiU((S$0nV~fPldp0ZoS{pxy*x& zvu!4vLqGT85xSP1O$d$>JMGHl@i4B_v6LZw4j0-*Q$;N_+f7t)mgxC0iq&3S19`d@ zbYVYx@Fi01jlh(i5+~*LG_~nFs6{N&)GI?$gzU?QA~i~7C2LJ|p4_LTi0&=VCOb;c z!_@`~Hzz*e_Tkxkqn|)@mS?(*U6MQfSvDVWH-s`z`Klw*Ue1RNONX7|( zoGfPlXcNg;N!0;8z7Zd_Bw62v#sEfNSAqfviiRP+Zz7yX#6wcN4DX_n$&v!LMJGC^ P39Yu8!3k0NI&%Lv5q^2$n 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 %FKWjtVdL1P%I)BVn;-eLqw9kid`E}a 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 DWiE05 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/gza_thumb.gif b/module-form/src/main/resources/static/form-design/images/gza_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..38b84a51394e20ac33ae5c9b6fdbc66f90f94a0d GIT binary patch literal 6495 zcmeI0X;f2Z0*1eElbZwrBrG8bi%EzO_K-vxK`;p@H^?@C%OE-t0V#D_1U*CD5|V%f z5CaHO8(UCRj@v=Uw&-yQo1kK4I}C282#nG?wy3S5%`!JGZO<%c=FiNrGyKcX_uS`u zzvulDD_bm@zlI8^;GP1QzyHiU)$;7t`m=>})1Qm(9JBxN%Dn0{oaM#MwsQZeGcL!r z@=RZ4SSn+C_HeuFR~WB)n8x!=Hxq_i1m@2_Fn=L4Kh$3;b2ojp);!%}8j*&ihpn=Ay;5?yG=T9FzeB+iX(a67ZqNgE~Czjq})5=V}5$&$#|pj3eD6J z^sJlmLvQBHCFho0`%~NSPll2n4;6lUW2bpYZ@eCG_q_a8You8(=|3QP)=4*C-}>D- zhNV+?yDH#er`Lma_P3WKOgE4p?(TZp={V6AWPa8@)Z}#FcXKQkb=NDMhwEI2+lnmT zbX=+pogU2YKPtQ4oNl_dw11y?_~fdYiHgV9BJP|F=|561+*&x+CbL*9EQ?*@qO{a# zN%A6oFb~2209enlL;_HNK=d~Xi3$MTqEx8V5o-muwgSQ02z6D}N_Q?jj}Vo&ylA`a z(p_r**!8kVDjj&r*2ns67JMRDN~fhS0`XB>J*ij{|9Dm5=1>wPi0U0hi1((7Dd#sA zs&QDSuE@o`R}!vWccS1_(rg;XIUGNS?wyy958p^5aTr-r1&*?1s$dyE^kCrR$@U~w zspnnW74!3(N{_F?rgs4yrnlbDStuv$@s2A8eQbG|xTd+1gt?%c7BhQ3b@j{8$S4}D z`s2s%FKbkms4&a`bDM0Sv3-|&4oAn_ufb}WuH^+73Tvv=Hlr(JH2>}*6^q!{FaXB! zd*&qdVK+@@UEb$|H0&LnIV)Dfj<8r+)WNDyFP!Uw*eEAmYBsW+)-_4g5S}*|JGV`) zF#!5HUHm{tTPU7D&NaH8&ITbvVz{LmTnfedro?cISS`K4nbt>QzME;l;SyER)t+g| z1OPZigaMc5Af$buh?{&{1nBHUji{*!r@ZgAp!r7r_<))`wa`dcMs)#y|Fr(6F&Cpu zVk<1%{~@eQot`&6F8v!=t&@q)9JoOzJXxJp4BLB=l;Dvjnu=G%p|CV?O)3;swnAS5 z+dFs|c9S(-gkp>b+$$0^?wIKDV2T?tEBe7|NUw+aVjEg7S&vYf#!B9`!qV}T&036` zp0Gn2(ZYNQ3$sR?ItiTrJyrz#b6MW@RZAii}J*cefB#xgu%F9}sT?I}gmohp*ziwiaXMgMxX1D|+QDxH$NMNA76o383TS!-j!@0~J$)GWG1% z>??MpiGmnV-O)|3qof=W*0T(5WNd-)x5Z7W3ZCC?-l%qsFXZIPl{Y1??e1d+GKBIC z(b7nE9D)#1Bz}9ii{HUw+Doo#?HqzRv>HPtY|q@D|9nGd3&cp;`$^!LA*{^VT}I8F zW_ADqIVo2(lPbkv9o&Bx@BYHDxdH#n)B@^uC6=zYllk~Aez^HF(W9dBk9 z0StVin4|;uPCNUtUC!kTw)o$h7)x!_wSCyYzQ8c zgU5elVQm4D%f$5Gl@cXH5h4lP1Ml>LD#<7M3BxjMPC4kA1mW6jp~C zwzn${M8TnjTXO1k&o@2a_s{NYp$l0pBd^yirZPsf4 h={Yi6wb`o84#@w?^8b}p?O*=GIQz7IYo68-e+6CIWJLe~ literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/h_thumb.gif b/module-form/src/main/resources/static/form-design/images/h_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac0b700850553a3d7be8d33cf6622c5a832cb1f0 GIT binary patch literal 2674 zcmaJ>XIK;I7M>I$fdHX5Lxv!V2q_p^Ado;3L=7TAMZpr1AP6Z!sJad$AczoPEvsuo zM8&qQ^;)kWAczG;#fH-MDi&50QRI@a6Rbb3cb<8k`Mxvfyyu+neZLbH&hzsZ+5k4d zGYHW2Z_{?hrlqdb4W86JTUA~duk8{xY_uEw`=IXq`FA%0w7037BMe7wxN18DOV zKZ|{Q(D2$;SAby~^Z3jP^RAZNK~byHStNEq`{(R(sd~ zua;BV{oILiP}f}kB=7V2CB4o=%X#Rqt^(B zCAi~>#=}>vbbV`n5m=9nJkbr;Y9EC4*E{uJbd<5NoyV2Z z%}=FR_FoPBP;d6`UTlrZbEIWr#w^RB)}Z1XM%ymaS9PQhU8@H>q{FQ~qfbR6O%885 z_l$jLI=7v2^*3Hib$IuM6%S9i4c_9NtqjVJAk`Ikyn9si?&iX`y(j+=+YR*;jXc+= zVyS<(&TZZ9H25@q_(Am1&HmkIY@2Inqc=!nV`I)^#u40TK`1+t>qVxb5C8zcrWk%C z$Pp@q@Ha3xOCb~`OO#-|WOEl*ZhWCANv1bU z9gpDi8R4=trBEi4gmaiA7=xUYBxX?k{Cs&n94gnFN2AfWH1>2loz3NNy=c>^bl(ua zudy7tC|xR%DZj>wzsJ&k8mkwBQ~_t^NK%tBBw}8wTndgi%}DxbEuq|>;(dt~|Fo7+ z-cMsGa4{4;wLeh()dcHDzx*a#c=JvA5*e)bR9M)EF`ahwzayW9KYkc`KltwLz?;AO zU%z_!qVM^$|NPb4)7{ni^hw9#M-Ly|Z@+iz{L;dBt+Drew zc;WoHvuFNw`qar2$B+Ga^p7Kl4;?&Evwz>->OEDvD|hYOv3=X`TetkSdDF%XzgCo& zX-Z4h7q2TSTw9Q@R^{bFYkpb1DknQDGb3FIPfdkfCQV6Rk(9VRK_V8#3zscjvN$ew z(ZZMo^XEkiqUJ`~;d4Pmo_gP4H<41YggA8-0}FB+9X_Vk$MKGki? zWY4A3YfJRY1sp|N5B0zBYJ0grGS z0GKeA3#rsoW;r_+InPQ#LZzi@71=Qg44;7y4<^PSGs`L7jMD%E=o zF+2b@37>!hmLZkM)#Xs65fR~PA8d)=g1v~`F~6RKW;VBA@%Tv>(AENLp|vV@8b3B{ zAv!(m`3pDqF6$I)1{AR}*=*XhKzm|W4f{@6A;!Z&nW%WTe^H53Y=@m2JD0T+Y703arBj@i15m5XBWX(ijRx|q8yHR+gO-g%A z`Gydaou*Z$N9I~Jt1QCJ?w+ZmuZ?i^zU)5Lq5fs5LpU*RAgvpN2bbgqH1|hl)Rh`b ziKE%a*z1X><2sE_um4EdV5>?Po=VDBV=X5<>RJ3M%y7MNjsZ8=L`Frd|F{ z?w3(!cE?u@l>dJ2EyLU{IZ&O3H}Cj^bLFgl|C z#>XZs5M>}Rm~WtlDXDMNQ*ve*Qh*d9RgC$8ruAqdh_&2D%!XOgbHX2|$u(+tL{n)f zKwP_E6rsxkL&VMHQ!q25g?$59D-$wZaU1L@n;4rAf}z&lyq>=yhPnd3N7z6##^fq1 zZ}oP}Kw*$*MMWsjl;-Dg;qWomqcOqhGbzCnXH#oY)zoqWUvlM8{a*!@_G^j_ zg{-Z0r47YnM#7csqm_o#n8=6hoTkn@A&FK9X% zhQKiBT(q)xL6u_Q){8-$sYg{(Sw&NOq1TTYy#n*;vH3>vTk%;4*? zQGZ?X^U1;JOCtgaOaunv5rJTUhz|4%^7Hche4lF1CH+#nl!$2jBaiPTU9K}8^70|C4>eh0C)fg7s?$k)D?qZ z61?(Dph8n`f~YhfVal|kxo=eGKwgXE7H_ZKyKkSZuQ6-CI{<9kyC6Vya_^b|94;Va z??ekC(PCfT_z`%07Uu-`2=vG)xnG)!QssxaL7FnB@tz>pdB1MlT&9s&qEJ|@25Y(B zvU&$(gJBV@m>LA;6hfbyz(OCoROWr2W$ap8OQ1FQdN*BafNX7jZ{BOaui@e*PsTma Sh@V0@dM8BG^xew?0{#K$QUnA5 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/hatea_thumb.gif b/module-form/src/main/resources/static/form-design/images/hatea_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b1c88a3e8658cde7b25b6e063d23d010f7ed86a GIT binary patch literal 3615 zcmeHIc~ld39-o=q5R!1nAxDM?f(RjrT#0}Q2{9;W1Xl3ang9_}4T&Mv=qe;!f?|nR zi+8-Swp;6Jz1lSiqLiwQXzQ(@Xwia#r2;hxJ3+DAee1q`uYc@6J2UUi%x}Ku@ALV7 zW@?%+fi3k0ynz87P&M7p-d3J?AIn+ z>TyrbxZA#)FnHd}b|u>W(>nV@wWIg2{Ri%ajee)AiT3NMw#(yxJVmhGTlDd~G4_Y= z5BHyP{A_;NmS+1l@b)J-OU)QZ&;A_?Ny9^J*AK^BXb8W5)XV;Tyko#*d$RTF{)il= z`-@AHtviAo&vu@ujdk=Mt;=$CJlopZ;M()G|Mi2uJxxK6kNey{Q`G%!`q0x)zN(Kp zQ61iSlKy!mudgltrIM8&!g3GsE`hxY)Zk z8H>Z7T$npN*g9})?)n^(Y1{0cmZWbE$sI%Y`mITQch|jaBDd`#{n{E(HU;W?uz#T0 zy~85Ca#xzP4>$E%C9mmO;k<$3j8ne+T|&dFVJ+vEC^yOsStfi=#7RV&meNkuZzFWJNQOD=vx| z!-SMH-EY6CJ&5*)saFNpz*UFq+9`vz;+mtSH1H zs$_YwMyib}E*Uo(K_Dy1SIbozxw05`MwI3$muiw|NTsh^P^jL9EiR#tv_sEVDx$Sg zRWy^%aJDpRn33_HO%;l_)+L%u*>Cm!+rTB+%T==IOj(I?sXAYVn2&R&QgQfdnN*`x zXDgM9M|V+Nq|_)&ij*ptpA`p(XGrtq#m#wR zpTdqwWyPej83HCVm6^hh6$<0nf>?G8Q^?@QjQR?c`AZeDV$G;;!Ee5?@AP$&L7_r2 z3uJ2f2eJa8TB(3Xn&!ygT?^}-@!t3ryt|f3@AQpEiivhY`%h4hE+PDJKE5R`^75AY zvSNhqYJ}L}u)}V9_3O~!z{_9ye}2)|`}|o?_fJosbp81FQRl-49qsq;-Mw@B*3BE& zfB62|)wV0v?=D}u_-*SqEf>x=pKG$1O=ti9^;c(3pE`Ns%j3uXcJzxQpa1om48{W zT)XUprJ54;5|y%8v3Sw@@}k0pvV#0Psbs->f1W>Y?ws75*?-E;%A6&hIU^%|`m{9B zRAH)spTgr#Nlr?f%wZ?Q$Hm4>Vlf%f^r*;*5fj40#)pQCqXom%puhnCv3|Zj-ebHx zJ=`f|k{i+0g@DIlF=!No$V2cDnot1ffJmoiIe(%6ei#4=0eISKEDj&r2{4aHn?gwj zajw4k+?sfg0|}BYin!K8uuzmssj!S8#aIGz4XG9ULf+%q`g2pSb7?79okFtGb1QR9*h8c^l8IGmiuNVyF8j;l5v zXX-)M@fmlp33o$GxG*uH*Lg0BJCBmgh2WLt;yv+sHmM7P;`TB<(bNTQn0slDODoe zmZWkkKJyVi3oIL7LuqMht@aMJ`dXp=)5se=#-k}*V~R(RE)(6@TUgsb(j2>Hr0}7u zr^+I9B2ZKbV$1M&yw$AJV{k-G!}NA?1(2_38RX49@8#Dx3)gPLp(+S*KrF!ZHw8k+ z6|TnHTlG|wTS1wx!`wuD&^&qIrKgmyaxHTa^fnnGEV1n9g3sG0r|74cXC>Bm{cO}x zpMF14HPADHnHad$VVq8V(e~X>0}i;!?mrpd$){2(+ne>cHUqD0po(Eac@s6|q+qW2 zT$K-9wSXE719~dwm{knL69Ev7-`AM8Mj|kzs7Rrvs#=$8MSG!njk+dGAVFgxClKL% zhKNR>62s`fVI_pmH<&j1%!l`E$ev9Qah(`p{t!kYCq`yztw-_-d;+DZ!fQfKf)(${ zwXFRJwYw`4ECg%G)N-phvuXwobbSx+7jDsQrm~7k^(
  • ap0JjxBHsOrGeE$JcnI zS~f>dOrO?3;R1S>G%YaA-DshLASW_Bg;iaN3ViA~G%{(tQpsj_3EzPHvctZ7wVJ0p z8VA&PyJ=%|iAxDKvq@6!#&t8a&Yt+H0(bdSyKfQjY9@LLkzpI+8?}8Mr^YRAS9HwO z-zP>$C?5v!G1yX?*I<)>b44=QWpE=H^tEMacd1K3ix|Kd14*a*!Qqu(t?D7OE}s2@ zZ>&$IR060m?`h2-5z`sJ0FO$Pn7LtH6bLOO&Z$Y;#^i6PPuM2Lhl;X0_61>h7#48Fvq&~;x1xH^TG=L)4O-x0)ws8p{UR{oe9H>DX z5RpTVh+K6!Nc7s>u7@|Eu^#CF+9=ODFarcw);vMmt`SLtD2Sw;B#la1y2MnT=BWp7 z#SxB3%8@yd2ng*5Ay*FwgNFGj01SJ3P_~SlMSCq^d=<1dEXcpm#8p*#h6#7Z&~qQB z*ORB!)zMp|d@x=YnV1{Z+f<#5d7v^zA)BaQ1jLi@Bg`D>m8Y>U{KtQ;n2JQQOlAV6GtZ$><(8|m_pLh)#&W@nXftiFOeo8k;bwh zYmFNO2B!fvySa#r`-*fbJf96sC8o77*KlFC+KXwT&WD(U0L(%YWkk2)d+R_WymLAH@(krc}g@UaIXysZc6v|DCFw{lML_tx9cp184*`ZL1 z8relh&=?dGG3o?08na|UL^p_06A@IL<1U+y4ZKZ27)xB1?B{;%hyT9c&-c9VYf4Gd z>GQq88%FK$%pZF7=(9wa`2rr;b`38_u1Ni#YoJ?-PQ<{Q1Mt)dw;~qzlI6dI!E6&; zR4S&=!}MYJULot>=bAnPrxl7WG3{Y~-ZMS?R7Fmx;JV!ZrqlUU4ZS8>Z=`Gh;F>w* zWhsn$!lPWuh!*)(43jHi(gHKv;NC*y$D;Kw)BTS}1Ph!lJ4eqYW z{g%g>PJ`Dq@YVr0ZM$bS!gWJbUl8S%5Sg+-e-LyD{YIE@A&eMd!^;HdTx;!1^10x_ zc$`oDtrVHP22a+a6LRQY#Ggupb_~Y&@Tv?ZN#um07ao2`LhsAe+>VK!o12r&xo0FU z&rUEbOVoxerXTCRc;d(gnBusp#@^!YJb!2 zEjv?U4%vf|HLNuvF}0Gq+TAmiuS;9EgNm>?9F_(VG~2`EI{r7h$iiJ^X3FI&h0z%4 zL6hltEXxP6ib9p1!Xj|?EmBaZ#MNqCo0Ah8sZwch=Bm7K5>qgR3O1d7XW6dOArs4w zeTi$Z#&Hh_i;mYzcq1Kd6%cVmEO9zGLXsFOmM(H|d63aejf+oa1m%s#@d~JB5|f|p zkhEvl9ORZ>`lH{%a6?t;-40NlJkhCOSOwY!SO8(U=fBerAgKw)j~WY_$x-8%lobMT zW7F7yst~s7Xu+w;z)Ft$W}2Y_4NP#ueD06(iH`OLp_|x4(cOjy1niZi9*xp*|H8+7 zhYy*DhrPq+6`BzeOuFpBOEN^>#J7Aurs3C{ZP@)Gp7QeZ;u1*0eVkjWV_tTGL5lLsZ%QmVr#~iiiTQ&bn%& zAUN6hdnd%DpD^<88eN#Qi{-iWM!ilP=s2j$lAgWD8yu=<+sn3hwix!OON`05TM$!!`a0qYQ+D0Gm zjNQ!D;g+hwM9lVZCZ`~Ozsn=@Xkban)%L+;Zpe$0I!N|e`gP{GrlKDW&>WlF*Kz-^fm&{KNpQTa;MH3VbMTSO)Iy`7$cc!}$F;)1yn)K77`oAz1q&dbPwMcqZS4-Gw#0WxD0%0Pa38b|9mayJf#kALK}E#J$BBuS_BN>|>~!Pl rL2H#EiEFFJCp(ZsP5Wj&2CVH=rzDGc@3T0Qspp*aTJ3^`42b*_XAT7W literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/heia_thumb.gif b/module-form/src/main/resources/static/form-design/images/heia_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..300bbc2a0384e5654525e7581017364dd9ceb59c GIT binary patch literal 7425 zcmeI1X;>3?9><4dAVU%+0RjmS!X(^>5)P3=){t<7LkwVB1a-qvwOwpgRKTrGNFp;F zQ9y066*_|H`2!*wiE~~CZ04-Tum9f|Hb#H>-fdM z@w=O^ehp1L`h27{tb2#u_~3%Evw=OkJg$Bj_~5wJ*m;lf+wWgJzWV+lpUGGKV`sTP z_9h(P!Wq|PwG?>XJ7)fKhu2uYPsBd6cH z@@?`{txIox^7Fx@?%nhEEMsWaSpD>!!-=XY}_FUOwwLVC41bYkS=XQ%jQYU8eH zc(?j0UiI)#H?F&KqU>nC!;u}Ck4|!QEsWQX+n)|(UD@mS@``Nie8}iE<>ZUg6Qk{; z7o%Ser#;m2UiQs--XDH+lkMm!>wy}0{EB$uW&f-G6^FLiKfh7;!$JGU-_LLUh&DMn z$(^JmMlDGZMM$Fj=kkdr003}bfu>|Y2KeC5_>yb^fHWzWDU_mj5gQD7SEN*{BT`b9 ze&AyN0ZCF3u}x{=B#tJqNC1gNh!#6p>_H+(ob>Q`cYF8va4N@-hNxG^xPr`d65oCo z0H-rS@0iuqR3hkaW)|Dy9(&mzBr=<1?8x~LXqKIA#(#AGAqe@dW6M@@dNyjj@wsD=dYXylvwIv0*N}8E!ETynVP}$YXw}DO^Kal0yX%aUPv}|WHey&+apzW z9ut};8pLHQY<b|<3{urbC?E@Sf zOo2uL5{apuDTi-(hH5*C+=I4TW#ULXpbwoCl8ed zzWpcKH*5AaIzw|qiOqE&VY{A^uhY3SMwx{!+2d6CEkaaz50X4J_3h`eXTfWA@cHk? zYXpWJnHzUR1WW)LV1w^yOfE~Z@gm7k)NiegNQU4$S`K6I@`^M>=ERC7gkqtDXqJ;~ z9_k$)h{cCvjWT9B%*PBH!DNPApn&*$|2D%4u%6RxhQVVYtMV`I3Xs9f>o6x^Cq{%o zkWF?Zv!OOihNCruZ0fQqi`Hfrg}7W-Pps!d`KJK)*bqimWTxH6zH@u@PUP4{{40Jr0&ZH$W8LlQV;s?hE}z;XzOojEr~#7 zZ=@A{Bdq9jQnyVd6`hLd3HR7uJf`S$LWeI6fzT;%I-B^ALN1_r5KLu~sNStiDh%bJ zZp1;(+y+U1LR*GD$ zCICwiIxUgGc9f5HLTkrQ;D^&i+Jq?eQ%Kk`Y}IBo+QNR zao;R3m;ZwfhMH@dDgZZ-?rJS80ULJ=lvjq&A8r+Ax#ny=M(JZKbho_e4spnn(fChE z+v4UJ=E#aP4Wal8jwZ*J6THb|Wh^x@ru1B65{WRIv)P=@=4|$VHv2!DJvV31&DnGF z|KhVLV0}X>418w5R-;WAz!jAtNr0a>jOzrPp6;ECph+Z8TsLr=0N~|+PeWbVPU1fk zGPm(@+h94-iim6+W8(u|G~tVwAkni30-01-5}#k=7ccj3j0JoC_OVkJJnaOYv1r5rX$#Bt_1^QsgOoofKX(}QN+TjeBYVEt&0C9D~ zI8juICW^0XFe0!%^KL)nJwq7Q>I+X+;ta<=F3yV5FrjyR#_v~<_;?maMhp9e&ubm+ zMm&0NrAd(AW#Ad&HgnWv+Z1n%y1E7zHyALE8W*>i{Ys;_ElNqr*u`)3?@C*(w7|X1 z)3|^maH3%Wn-m6d8^lK*AGptNktc3$D~#rLk;6=PZGhu)j_C^9<;)NJ#@?&tbyVka zvRQn221Q9pbc-wCHfWs~0lX^K+H-)Nzu8=RV6lG(l_5*bPem%T;RUPKLtFvUZMPuA zwoz)C+fMk*?Q!r?c`Zl)iJ4UhJxgn06t{?HQ3GMbf8o2TJ+IiGhb3w>TEb;hMpbA+ zZEY=39FXO&vGLQ>ipVBG2hYyjnvTZ;J%=RjPpSwxISindP)O$n5mHCI#b>qy8^0bB zm+MUcFg2k`Tdz7}5I06dco$l7d0Jp-_1mI{JO>=UE{3dxDoF7@R2p;s$4h8{Dv5W^iQO;0%f^V;bh}f~EUc zcv{E|BM-%l6PK~E@Nmr26QdPVsood|gz}93mWYL&NNzRi+o|r>U-YdXa}~<`^77og zEg`>FOG{thEx5pK;kEL96*#-rX@N7iutqPD`n@a0#}&R6S71bt)S8Xq&+j! z!qycdu#@X9bW+T%mTeF;NXuv-F(I-X_gyPDtR=OxC7Mu07wn{p@b^~N7~Xpz>hhGZ z{>MuN{QF0-;*!!bwPNah?fG!Je`VTgbSh=|M?V#_y~czAr0IyEhIHZg0BCF6LN(hvrc{l(xq@fd2Ri9 zs{~H?&B61fh_JI-M6s2O@Cy|Rg3GzGUTKCB6WRLDxG>OUh$=)5T?}c~7XV-bsi0=d z_70WktsIx0Cjdb3al0f<>i8k1RJ5^cRH7f8nwCyWNV42-vS@l*!Om72B_;2wK|WXB zcA~zgYp+B8@`mR6J0tb>1;Ye9Ceih?F`2%5nvKb9OlJQkvwxF6eCYfhbj}_+|IMNE z2CV-Pko=9=ThfdiIfd=Jrm@{flGEgVWQyD^j3hZt@B91$ZvN5%Ofh`<9zG;6hx`QMyTc7Ea@p*Gb_&<1>9`5u>la26VLBvGn4NIE8WpzC_plnq0fluF_|X& zL<8BU)+$c*nNV^*I~rhRLc$Mydcp4JMM+RzB&La-iTL~T$_yZ>z^Fmh;teB`+OvgL z?}uVi@5~M-stqA$h(EJ0peswI^aiP@+AC;AUGUYwr31*Eg+}U+S~YcZTi2m*nq#l_ zNLI~LnE1M?pt?I`WvMTGxE zC1r}t9T(Eq*Ek(?COWzlE|Y< zgtRvxgw-@ud7HYI4Lxq7TfwKwAUCt%D!o>_bqBnlZ!Q1V&IY&xMHC-O*3_M2IeEdK=W`~H990%~vm)XAatF^KD)yB-UZY^|TezlGHQHddWJSrx;^h4cxq@y0XFI&S> zE~nz;(St&iheOJb2jw@#6_rvdBT=G6WX`tRb&tFLx&PjOz8>$_^W_)d>&lKM0wNek z!1Bx8szKi|*;>`Rw8?tYXZ8D40sfjV?drL@3u)o17kLAvOl3A-H5#i?KCYLq6J}O@ z79UoBy4oFLt5T`vd)<_G`H#)<3teQ@tDU`K``c%OG%YPPN$9r(qRQT0UBqtB#Hgn) zj@39Vk0m`_&scisu{?OR{wS$?ok>Tw+4Eux)lkU%{Jd)Pu%;ruD|fYOGE0*po&ESe z^jz1LkXBWLRuC5BY?db1o zrsk9hCHJOE0%qS1UK8nEk2kM4WL7OU?Yn68ERUsr`?I3jR5=hiIZ*q>lKkhb)tXC} zmY(lWH99MDR=svuGu=X-c@Q)6e(a;7r#anC9U1k!!n3C^_MNAD+wlCWk>Q1j$|nKr zkE4D4i5`=;fBp1jS*cv=>S}gPZqaBoHX4Ji{IF1OZZO}8<)8}z0Bn>fJ$--xruNpB zL<9h%Nk$}6!2vc3#bzH6NHa49C>kDPY>dG>#-h&rB4G<)M+P+lR8Gj%jK5}vzYTq`s(FOQSDL?qZ5+U<|HfZ6n*|B;Jiqqm*Yp8aSvsRkY% zc}+U75s5b9iNvodq+;r)IrO|B8gZfB-f2Bo7)i$Kq8H5~W+Z4ZB(8J#WGBO<898kL z)*Y9<2`uq476O0BT?s`ZaTdf$&2grq*n$+F^ehg?O3)VrutZMER$f6e1Ou0CAbN(! z$+m$2DtFCIeSOG}6H$k~VhBT)`FqP+Tlt10X1F+d)(603hYYoeb#RG1o4BPevC6u$ z^_0uO#W??%=s<|OA`!=_IvHfi4r=hoS}&DYu8jrlrY31%h2@Xc!F#z4dX%2kzUkJL z%>s-LJ&u#Leh*gfyYNYlVAc5e72^%z)!2SW2XBi@^^YiQ%P!Dc5nhM0(a}Y@;fSR( zqc8e(%-r1K{T24y_aELq(qK`4_k;b~k2X3W0KB%JvShD>l|I~rFw$}4xKzeV_u`4I z_JkclQ|u6_l~Wixm%$4~#3cxY^phRB_$q~Qj7%v)LPb1kbq#Wh%;WQJG>J%F2%pi0 zkUJ4u9!W%IgzRP^&i#)VQB6%2B!V*n%#m2<5dwdB7^VEX@MTe{+_i+PUr7Am zS=nX3`A%e#dMcpxje2R{MsISCdG2!puyMl|EueyEHy1%ek$X1 z#y?)PymDZwR*bIcH!?YxO+_W8F4BL+z!><(&05j{>EB>#DI_YM+TMxo7D#DPBoU?i z7)@8#Yv3u#0!Uf(COb9V&nFDjRGeMGH%Gr&>;rvWKn{gyE z?=%|CI=C5}bmel)8gYFhe*hq!q+G&lUWp^3&qFpsDPirlh`RIPcBeQmMc76vUSPX!lr;JprxdAytTxo@a{s3so*F~L?k9&wF#d4;ke zV$$a3%Vsu`W*y!tIJXkw-_Nx(DUT@Al^x2(rMeCFbWa}88upF>|;PK7u)bq zXgJ=Q89egCe>_@V`c`UCI^Wi-1N5{ua9SNllW9!t0;w<}|N2oT3o-IJ65;NCT#lUc z%W;MfC=5A*h&JVgiHpfm5S@OET*8Qx3%O*9h~Z6_)42?SbDo@wv=`*jnas{SCPeH* mFpdMyo)5iv`D$1(GLR%cp|IROieSITZd15fx(%cN_rCxoNOo-i literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/k_thumb.gif b/module-form/src/main/resources/static/form-design/images/k_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..f35928a264bd981595dce02cf48c1776e2b5770a GIT binary patch literal 8096 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 Lls229f${$VzcBA< literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/kbsa_thumb.gif b/module-form/src/main/resources/static/form-design/images/kbsa_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e8b09f15101f3e3fad0777ad068fb559ed483a9 GIT binary patch literal 4567 zcmeH~X;4#V7=^#=34uUzNk~irAqEB!Ayf=8K)DD)z+gcTtwjuIMJ=|VXsudqHdezT z))uuWDs@5aNX5F-2ng;3)QU?L5Lw)*eMwI*LBv-Krh%=YVBU0W?tUuf?o3Kz8q<4U)9}GsGkA7 zsD=9KU2>wS=9holI_FMh)cupf z>di4bQmuRHMx)J%X`zJchE(&jijLpydhVC?T%UEh#Omc)-mBIXrXItd)%+WkNPV$A zdPQ1YX#2nz*V~Hpb`(9Yv1_Z~cU7>uD%eL52eaAiXr@k`932%H5Ha}^cQFnF0C4QZ zQ>+03-1`6fA+Z1;nN^5JJ3dCp&l1Lr*XHJa%3mQ$naoPzP#5#{c^cuT6R2!hv`7>> zd$uG_SiD6+neDdJjzxD2^`}so`?NEeo;0bOD}%M(Tj?$xC1K9g^8A+sO`kWFanO$8 z?HIIRi~~(#srS1h>^k&aVDhD6LE7#Au|%EV9h{1PmZ$@s5moBNef#93Km%| zESuF_pa>FylBC}88luWUu5*$;+uDYeP$gnEP}OGnlS{gRSap&}qLqkLnkc7p_Ty{} z^CA-Fhcg2tUghl&oX>F3rNt|^xrCG5*g+GgHOmPAaxPK|x@!t>fr{?Va@Yd+67u1! zma23t!QFXk-$G-{1x&^CtJr32;1q~0w_LhVAg@*PgH5#1uM#W>T>4#4y6dhpqef4P zW1mSW(W^)p=ccA)1DS`*jqt^sxN~Za0Ncs)RJN-YU(Sm-j6oAZa9HMxPO(9)>! z;q1*M**3^v?8?V-te3Pk!FS+d8T7!o`5E>f#S$ zic~x2yoV{d)IfK#j8W{0dKVK`P?Ov;NsYCG{=<~dl4A_7G5M`}i|N~;-~>D=eT(U# z4nRpsQYAi5?eQ)qveIx~ZRcT+Z*CaGq$JUkgEBER-p$VB21+`&(PO!nV1KJRuLCbm zWt76TTHZv7Q5v!HBHkx;hxeN(8Cms}=$3b)WC19^0#N(col=E3Ai8uNC4!cb9v(EE zi{OBtE;57=!UPbcTR{*c#Kzj%>Oib`R=8NcC)PP?hg>e=D9DI429j_|!O27}O(w&$5%q`in?0~&b?F(IS=l*j^tpNY1#1h}6*?qRlc-!v z9PrXdF0iL|8I>vSrRqTLX6swhcbXh;2t~J7U}a@o*X0wj zw*8oGYdc(P;>Tm#p+gP_Fo4+q0g|Bq%tXXfwMev;Cc({hQFMO`&lsrP9E3|t^w$jD frtc3q4h)G>vtT8CnPWo2?7QQA)17Oh6D_uG!TOrSj13h5?ic&ch-n9RNZ zU+%rj65=BzT5pUu=01cuW?5z*E-XysPEYpzeEqHI@w0Zj-8PtA_d)8drgx?;`A>BR zUOTe9T=&Y6cj&e&Li^)}iSDSbJu7TK9vwXo8a1Kz@1$o6m`#?D8;3(}-$&cdi%U}c zzpV-WzAEtP{if-O^R~kg_J?)-M@Y7ti5=$o_AlR9^AgtfL)kk*%2dxw7i--fG*PA} zzZ>Z?95H0rf2gvL6i@$r`eb3$am%~5+iCX0io9@KQwg>1gQ%ZwhiJO z$+&w)@MZn>Csz_a&7}P{3{73;oy?v4=w@Yo8tzV0>R?~*#I;x3cg}r0Hrm^I#{N^6 z?c!@=7n4SA9C&oKaQcD8))exf*Rq<2$&Lhm>3QYxmCVx+-gd8g*BXEOC()m1d56}D z?0-uBdavf`Q1w@4d0Tmm{e-H+0@xcx8)ROs<%H?;p3~p2c-S^?`g+=(lXP2O{L`Cn z{MzAVf7*KOfcKL&kB8qzk9{35`Sh30`nMhpHVt%FP4pMtZZ!;kDSI+}V0wBwaM~?- zXrhWLII~c3H11au6f;Ryy}-)lN>odP}Do0lV%vnZ0p!A=Cpow z6WbBLixjNzc^I38trERmx>(Z_yX#m9EvNs;$T$~EAh>x0DUYp<+S75j7B+qy3m8HF zM11nm{dt4U^B1OTgbke}?!v7+3^Q_k1PmY=<_%}KmhqPiPK@LZb&TDda|mBESoDjZ z+xwZ9rFp}P_p-l6Ha@X-Ac*9^u3+nLZP*VUY-5r~_tv|(hYsWpbdG=4`6PMds@N6p z(1-9p>Z8>1ocf^hIQ7wi2T*wmbWu{LJia0kxP#^L4W(Hjb;#qhdNo7LjAwtC@O^pFJ$-zIhSW4M$W{fK3##)Pq%RG-f0ilB) z=t{2%J7vuuaZAM|>D_M-{b2j&Y>HYqt>234U+7Ukw_pAU(-j^hQ(pSaeJXRdp zC~++_Zuw0|`QZ9q{F;#>dFe)Gq%bRB#a~lc&o2jy!D75H^x4aSUqz4-qcQO#orSHV zSl~p8sM08`qFOd@TP=DG2~Cmg)0u-nCOMic{s>MHFG`Rwv*7hiaRM<~%!F99^Tg$1 zJxt244jYL!>PJa1Z8@7RMjsPC!!Lgj$73 z8kobnL|Km`R2B%vS6~6;-DV)IIiXAzyd?jGR%fagzuY`EnyJTD#k{>(BRJU7O5ACr zhiF)Q&&pazuyaHSzttV%mY9CF@u1VyTmT712F{`l1y; z1biL1dkQr!iCC$8%!;cOF4#~}^Xz`Nm)Dwe4XiM8Cyt%=UER$L8M5+}_hR!ZYbHsFQo#}oh@{qR0B`hm{II2a$B&v2F%!s zbi5aG+7tZDG&)zD^pppFIALYayH=2+yfsl7bZ9iv{K}pRm%t^0OSMOvKf4+5hb_<- zI~_dfL3xsK_}qHgj1)7l$6|1(WxZxC3!y+qU@*#Lh8-;5<^cINiU^KpAq32BYAW(O zz#$aiP=QE9f*tsVq8WP~^hSNFfoIXZgTcjJ?2eH^YFrYI##Lh>nmR#E=5jYnAq-cg zidJL(M0tpVaEx_#+#8dc zQRavL{DRea@dFu-izoU|>RwZN9?vK(P!6>ee-`5k5G9)aC*>}IYd5(E!%tT@@A^Oa z)nvB7A^(b3W0?-D5Qc{4&G2(zWLHl6$IC^<6l@&zlCi=V|R<+uP#Uf9fvVICz93tCL&7)kgKd#ra` zDr6B0=o-p?<3&HV$~#ARuLW^I6o$qW;-&54bqez4%>7Ao_5>@a>?QXu)zZAf6;BfO4CndUb8e+5v!l+DDQQch560(pNid?zI4hmI{5`lU$FEAOJA_`1xs@q zU$FE=F8x2ur8AKWhvrfc{a{Gv(GddTp|Lc~VnU>0>{19T<&{cFVF0T%j3iA(I8r>w zW`!bP)Lsq=j!4vjf?5~=bt|P2e(+|I2p=XWH$;7{;P}b1bkxLZEEdL+R-Vc7lS1n_ z5z^{ELVM3~*7;#S;-V>(zvULF{_)2YPbhH<0l~x4_-ByRTsZy!TO)*$q61q-EEEHt zkRti{ZG`Y95|V9I;CEaoXUUhm-WWSvKUe=@4KrVB?5cw4ykC9(CC~gGv>!Qs&=wFu zzp%-)CCgZfrtDIPBH9&iB4Bn=O|uyrc5WoQklB3%cKj)vdY-RgG+(#2$H24k8vZ?9 z!?WQUrrf=ZW@}h3K_qOLq~*iROb^)O4O0XhafrG*C!=C3uqwN+uO+!>kAFsXetq1D z{f;!Pp~rECoN2m8lPg2BUp0Mlpna)lDcVPJCf|0Y7Ms>G&k5!?(@E~vHTs~ep2{H8 zR`UGUowb?B;N^4{r#3)LvgO=~&g(J%z4kd{bfR!(rC^6uqfM{OOX^I~LN+S1XRV{@ zIkk3i31wBGayzTutmLPKVANT3r9hjWQ}z>itXbV1MQ=v>N;WU*zC(LN?oj_27F&&~ z-`}Yp4@_>G3r2i&HmVueB?i}p<9&va%aoUVQh!b1-F1yGOJP%e~e>G5uK zq~`WeYguPLGvj(vXE6}ybAN1A_rwM8YKfh zzvrkPIQOBeShx`LV*^5%D6C%`ebEiEl~ zk7CE4B~|Y;QY-4zgO`-;+$Y!56kQ@|0&T3P_~I^%dg!{c*>mvT;;r*BVqy5BGo%N1 z>y$4yj<eSIAsOnz$S)c;g7`UNK{5a%gXzk9w@* zb+!N1Z*Z#q(|tE>A72qE-$~S?mF?$QKjr5tH)lqBI}f!)-Psh@T^p)=9MN)#S6{a5 z)5GBNdp(u?=bL}eIw4v-(&%^nXp+1*wON*U)QfoKAiI@LkEEj?KB(WsGWwPb_Q~x# z%Pj_))}E%~{$aCw?}kb3!SMzc<>;fP!fzD)jmqa~!+lLXRgS8nQwfW3qmScXUR|)( z58qz3wdeK<)!QANf2Y5%2`s^ZidsvxTJ505@&aRHmU1EkJ(zBw0RR9FAJG_700J1A zx8_Jz0AQpRL9k>=GRa;_N?sz#%Zsq5<3pC>LV|oY+spD{Qbe2&7lU`gW43MM#*2ar*Rwx+$e-nGQen7iJ*HH&6s0DE)T16NM@URLM4sVjkz-7 zEVM@ox@)%#;|K;6VBO^yGDT45hL=an%;wJ9`Sg_goSH(sqv#czn<8!~#3sD~%K0_n zM8E1+ZQZBKnoC0ED>;cRViOmBxv=BT@LrSCmTmn8?91ocFUGXRDmGPv$5s+|%)PO4 zu!z}lmB=t-ZS|%1LinMQX;MOwcmS^G?9*u1hBP-+<}$vIIbo+9TL7Q-4AIssuw z=N}TG(+?p~3br$0y?OA2c(7hNM6a9{%@o_D&;*eH}6v}Ak*0_@l)tisouy=(k7zah6uVrZhe;O``p=gyk5s|!3?bZf88ne*I%R2?0u zS@(sfB0s%2$%Th?;siz>TCk?_9ePuuvyJQQP8vMj7X;0X5*K4F3?nP3QSNhuu{urs z84)e)87pS2n6YB!ulU@SnZM$z3t}))Q*A*^DVoWmscAMP6tU3N6pmY^9V;nttf6+O z=$l~2j(DK-Bo4lc`8k zQg{>bzl{g&%nN?YhqNV#O ztd%y!jg0~xk-W}^+K#6lpv-gGpDC^eLab>noeHkN6PT!JRZZ+!1SKWgcK&*DT0tgB zXm^Ef+`*7`+buyz`jvr4Q3^sy@c+#WJ(tOup_y~jhsI<}!D%hkERC;dDT30s^pD^v pEloJ|-|uq9|hgg`3GBrFC<$U+E7ScQ-R1qw(lwkm`qNK}%Tgtayx1W2Hj zrGj+^=8i=ouo=MnePbB_Zb?3b8Fx&Br!(Q_VQ|9~ zxF--^TMFMN-1I|WpJ1W@!2L9MC>B-#XhL9{13VHkIFtZ8rocWn+(JGz6~Oi>6OG73F*pZ6F9Hrx!8tlO z;0U13>6_^w5rDH^;7SlU=m_pT58w&_KL%r5WMUpT?g|E7!LJJNQ$8}G!~HS~j7brA zBo)@V!eaus9uJ!kxL*RhX>edB9FW2t0B(1HyOLnDeQ#C_{B{mBxxfmP1aRjN# zpwO#zMzvOh+9JyHwZ+D02A1g~gd*LOuo^??Bu=P8Tf`}o>o~knt_|t2VOrYXn- zu{Id9RR78MseujIlG@@+|Ra^PLiNk$&FflwpP3N@hN5$YK>Y$p;m_` z%o3u^G`T{pu`L8mdZeXEk~IdST%%AWOQRWBj8L^&DG^8$#iB$mH&M(@IxH$m{&SE^MM7pXMH$G%F;H%uT9$r3~fn6K=qzP4s4(qTJGReE)aN-5K8 zi_l4EiTYW&NM(u7&gGG>@+rAYa!6&eXZmumWH`3c{;AZDm$3e^Jw9n%?Bz-8t29`@ z>#@d0;Kc6_AN+Rz*I$1A>E7M(u{*bK-MsPR52GX3hp%0|a{1E5@4x%@!ufM&&wTUs z=~E|93=JOt>e$gE17G$ZK6J3}!2W%`UwppzvpxUXz3bCYKHm9J&yMXMez0xpmiOP= zys7)$cQ$V5TEDKdW9^#NtKMGO-nQbc)|Td`x*kHBP*VUS9s+Uz&nqFV}T19zT zX-TospkJcXYKj&wTBt5uP@qyO^5uEC^XJWd^_4j}FVB7{dsbFv#*67`sV}4?Cp|Aq zlqST_jEjwlj*66sMG?YqK^ULM<%F_XA;Ce+8G!-*ehfP5>*MV;{W+Sa2i4te8pV}N znmWaWNN{#?bg;+U;jr;QzmIn&fJ(r^CIvRasQ@^RR#jHlm}~3mD`|zaH!RDoIGhiy zsh;NioU_=}W~L#cDSkTP+74@An7yALpS6ibWIIy*qLJ<<8lAY*&BL8d`ml|bi;8s4 z1#x702hE{{vLLgNb^IW0-UUi<$k{=VvM4p>(xyr8|jQv#a4WtPV9!e*m zw~MQ8iOLtuNZT64%Tf-s2jKBOXF;BYYJQ1I-B(3V>WiNm*jbfnXC>Mvd#3kp?_1W@ zoKv`!Sw#lPmG^RZF9DyeL30c&_qN>ZL1Y!SEID zo3{vrTeqw>^k45wA3XH7;6p#SXm{})YugN2L+aTcbMF^^(}BxS)^@^vh9?)lq^uw5 zo5o#;F6ly(_d9#Gi{h@j65n)ZB(KgE(fbDyC}>tDqEdco4(P_WR57pDO`B6Okm}hL zn7P&$>3cZGKi=9^gH`@1h5vC9-DEObthMC)nEHlh6TdtN6*e{3@$nI?-B@i?>5-@f1i*7yOJbn@4+?`SS#2u-j~!8^lCd9 zEmPW6(O+?!tKAXSNRBN%;nP~M54JNW!xV)*> zB$g}7Np0i_snH>WECY#cuAL6?;wou_9$` zK^(ouVsgNV)VAIqvV_cYrW6H-gzT+JNl6_^88(lO4FADDS^r1;asQK__*Z_*pZVwf zH$VBG@ZXrMe+>=er?K*UtWDKEJTZBBvxST*6iEBZ8XwfxW1)!Oxl%$>xY*l=$u~Fq zO!7wt3VWLhmsIpWwhD-pFI{%urg)!?B7CqxmzXM3v$=Z5(yOV>< zOeR&IH->-Xxum(wq;VatE?_FTr7vD#pVG#nr#n$TYQ{HaXU8S)9+z8#X8NPQ?Y<;! z?-KdS&b)VOK{AMFq*^l=qwC|I)&L_;-mmj zyp{+qR0{;D!&hsrUpe7@`!<1a=MnsG52U|Ocw3xy?b<-9dMj{tr)Lmfb%cULnid1D z^vJ$oLStSp8Go7XNO`e$^Rm9$YJcL4yqwFxHHjsd-7K)SUNWO>QgU-rqWy~286NF# zQ>3^J9n;g5_md5B^BP%k9iAIj*y0q>FqMFR8vGA7_?k!RkI5(7)GtJX%K1&rW)pd` z@GDoXCW$;EBEl+o*dRcnoqDwMN!wZ&Y{$~lC`e3QpS$K969CPl=^AapGp0f zG2GoV(z_SuL00l_p*grvCDLO#Nh}%>Kh@{(IIfXfdY#`N&6>R*pNSekO5m z13j)FRw;`0KWsL!3Nsg|ML35cb4W;V5k)dDWSu!>1RH*qlpk(XdXJA|!|#`WB!1H0 Miog8-6@TQv0rHF?f&c&j literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/ldln_thumb.gif b/module-form/src/main/resources/static/form-design/images/ldln_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..39cd03538a5bc595fbc46c97cf2b06c8bd8dadd1 GIT binary patch literal 4439 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 IdD(dV7kW}yvj6}9 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/lovea_thumb.gif b/module-form/src/main/resources/static/form-design/images/lovea_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bfc58be8c70d512f4371b50b2b98c7b8adbe719 GIT binary patch literal 4121 zcmc(hX;hO}x5q=6GJpgKkOU|pVKRYCkVpanLLdZ?L8f9$fk+}mflvlT^!0%!fQc2u z&{}XnaX_S15l8fD6&%0`Wl*g3iU<{J6>zAi4DXX5wY{tN{cykBtgMx1IOpvD{{8np zCn2FCZ?41|W)1rlfK5M0ynn#7RlcCFkv4UM{8+Jc^fdNfTl(93N$GTh*|!~2Pq$1z z%9tKm_l;Eiq+9tq$6y2ndq4U1^d^s)(G9cj`v0hO9izi0H|o6!)0>?*xiy=1xz=sE zhc$K0uJ`ES&V670eChN)P=3c9F*DxOvN8OR8$LZD*pqbBOe?2(9j73e*jlshVvWtS zu88O5QPX|gvILs?bNnqi_ZVP2(zpA==#SGKqE7XOmqjkqcl@6oO@Gpc>W=k08Dcbj zFKlY;=_re}q{fSdeGtEA)c4i;JpE`OmK=9F7l}IwF35B6jk!<-~pU&{@&+8TR{ny$8p*BMk{3 zE~f8wL(Fs(KTWcF-)S}76+6~mKGvUq3BZ16(W?$5%rr;d%+H-ZO#iKc^1R)lx547Y zS-Tfqes3?CPY;CL`w4jZ=$G-^(w99w@5b9NH`LzT;V^R0{pWwNXJ=;}XVHGEtoY3$5TB%)l(Cwy)W7)&OS!=W*~*c=YioycM^S#$>U<#;f?cx(=jwTSrf zLxQ5^N|*CufA0zuD;~z)o#jVMa(PLzJih|rU88nTI9{~W(nEBOeRwh#1I8CglsmKh6zt{Y$z%pIy_w9wAZDN-P{3k~IBd@R+|ca2d`WhiY(B0Wiu-Xc=ReNn33FwV zd_``YLXkON0nr(Xd_`V{B8Mo9Bx&+&?Sq9{gXZ!LlI6-*$)uuOMHW#Vbo9xuBg2n}9t}SH z?+3r!|M}j)-8=n#y*;;Yb>F;k{o2*8&MTKMUF>MTaQ>%rXaDQW>9$iRPaHpXwDm~K z;X?<1{Gs_k)BeVNd-v>a*tN5M$M$Vo>uSH>^4+&J)m4?6%@v!z*{D`+C@(8jf+fYk z`hTrkTePNd^{RsWyxgyI6xmssD_6)f(wEDmY0D(3Dal_Yefh=G#LpAr<6>i$L`OwN zEDjF~6^Dp|gM@*C0DnKeuMdywy@PH2Qtg$DFZqC`>5oCtN6QMM_*^}fPY2-7c#-=S8SnI;fj4k`;> z(6rso>@8Lt=jIfwOQBNFGzE!tw^)0*h}v&KvNO>GX?Z5BK1YjaCd#=l+QJd(l0yRm zO?Z7Isyh?uG_&mDz~ixN7)M}tLE@3Xc9e0STc$WCy$rD;306vOhn1sNAb0&3ePIxG zyqqfSlLrh(Rc$tPiMiiWtfySnx6FO?)-KgG2m4faSYVuf@gA%f=J<`iRzE$gY7V-4Sz)>HR z!6!H1Fawx53T|c|etk ziRmr?y{UN{k5N@>l3@y%R&0jl@myFbFoY$`1VBV3A%vCy!(<5+v_)%xUNB0HB|Pj> z0|A3-doVt12n>rK3K?>F_N?T8DnUX@RzXT=lqhF52ymPs>(z6vs*0#JkgFi8T5Bla zT&*({sMdK2v@)4%TT|?*R14~YYQPq`no6opVo<7)(NqdxTz!@b6fjI}L8L7jYy|g$ z40J#MKv0kV`kOj4@j0+GQ~ft7a0m(-l2Qms5jq35ph~?lL1nd3qa&o!0aE!_L4Y=+ zzOU2rsYmYu2u|325TG3ppdSEq?TJPnV@H(^P~F!59nd!5AsD5?5}x&|1Af=UhiSs% zRdZrc+J1q<=EW34Vv;C886-xHP@y(zbdXd!MyfeR-xX1J>KN6}F{+nKl$;5vXM^xnOm`7z*UpO9NX*|q-v z_^(kdRVWrQ-l{_+MXzh0nBA_jf#*$eW5&(&Sgw&c$H9gMV{%0F_3`sZQtRl8*A=_P zHaafi7h!%u&-J#ha`a$&FbkL^l*R{$TM|5q0(BJHIVvhi4W@9g8B5g0g{B#Hm4K7U zMgj^XpaB!?4jQFg1+ssn&?-}OZmQTPP9am&EXd9_Ccx~tgk-6aBnN6Y66n6&3-a2u zZeF?n;33GMv_-d30Ou!9hjoqCINk?LfM0#3>okkHmv3Dcf6ohRj=QjI`36J(MJ>bQ zH6x;S3UK<=*S-5R4s1*6fB0j7mZK{u&~Fr6}lBj$=m|LcH~! z`;p5brF+DOn~t{0I<`{9>q%{-$0axX4KfFod@Z|(u!_u_Iz>U096%KndyQfdx*g^t z4-~{hyVt289st$Tm7fks%K20!V9!W5Ope94rb=%9G;9xPR5Y= z_91{lh$~)-!Jolk02^_Hfq{}wwlTM{0q|GN#e5Br8qo=Ko15Qt^X|#<7GLWTdnfb& zw5&&+SH)QwPk_$~y#+Qm1m0}k1SpJLEMmNC3I2lkNgNzz2#GU;#GQa@F2>W<)er;? z`L6sJwV^b51&$m6@~gE!P)ojCyW9o1#zQr6M<8aAMTOuHJXYgn7XK*c$ zz6dhj=3LiV=~)}|i+nL8%;xSuN57cwAn5DAbNA6Lfj6+Yclg=;#g2f3n-~xL4s-~{ zz_m~Bz5(x6GOBtUtE|@xwmYA}ly({8)CP5v=bbuziv)+(sc_~371g>*CEue-BjM0F zNo}qBOS%F+rJ}7ntgi0HAxIJJQu??TKCqhGw}&K>4kT;YUOmhN@#+ zaq;1Fu_0(k#^5jwSwQIF?6lChqgh#GT(b3PSMtvDlJ+=Pu^3}LV2#0xo1}NcGQ-31 zHh2tofD4&&05XXC>KXpYC|3&fzaal^1JgsbhBVq$BVHULwqY71rRZ5WYs%75tT7W1 zT~@fc!Gkp*I5^oc9915jCz$El#I>-vxqSp)ZqgdEye^0k zbu|fvBvl86)Xv~vHdNFS1+{}M3)$vnyJ>Ys@PC4!{hRZ*=BxZ`^MUDcbb5HGnvfpe zkm{rMNmY2r<%V%!j0i4QSg#KUeCP`O1UcN#Gc?jO^&;HbTD0a6Tw8no2t@ZB~N1VNLTzB zgVsip$@cbdEa7DFBV=F(r0wfIilgns+? z=Cxi*ggwEa@g_q}yy-4J*62e{<&`WY8sHhO4=PAP<|cuTo-;jX&Ybx)hc7w#c>nM7 zF2CoQlOpED=6V1gz#}DaY!laXi9UKf)$;b%x9eHv>#;w69`gF}fw6(s{!7K?2dkd; zZZ|*N(pKtczL)d#40-71%?3??LE~jME_>FMX1R>p&n>>+mw21H!SBim<~!MA{Z)^@ zbGE!XZ5i&mw994e#lF!aao=xWIC?0`{9wK5V&wT;4l$d|agwrWQeLH#^y`!_?nC* ze=THxI`_ziprN}ui^amSxJX3O zY++)Ch!Y;+fC2!3HG*-*14^g7y6-%KF!aN(;KUCDh-vd9!`a)zBj=|P zJwHr@{RoV}#UCx&aDMuRMIS8=WZ?ZEYAl87J=Z0DM)_PKwz?~42+T#+A8>*44bo_cWkp?3Y+h?N zV2-hUO&l(1tBOE(bLDMG&TAZw@?7j*4I*)HkEdd;FCWBV#u>X7M@Sb+* zGS}%|`k{dwl&gE*0>dA+h7?R$kHv z_&=@$lLOZ(X9eg&{e#A;IT^`d9Ax?MIUP^nmS|Ej$mP@LG2Up!q9rO4YOhF%4@b7@DVPf82mMgWQipOR0a8EmEZmOXt(#pu#(4EsxC zQTur?+FyJp{*^|ch=$OpKWyo;al1a-*eG08G1kGWm zcd3#Ssm@*c!5*M%2MrA4t>{b4M^img>VmV?RXW#=+^%nqwizz&U|MYTVaJoF;l7G! zDcvWbP}$&slXC-JHf>0d*JogoqR$ixdL33`xyhIjUR!Q82F>)VU(^pfpqy9D=j|DY zTu$6g_Qzq82eB8lJm)M7sM=YLN}6*I(@FsWjr)c?>hi@-vl*4;H9d>&6t8(a6Dw&I z6oAl9D&#dKD8fmzQ)Fw-obrl}>U9=p%w%s)_U2@7PVP%+glvwi1TIln4OxAx72X3O&p@jci>*YEC@LY8)aaQI zl|roqJrMp}K!JrGf-V+_FecZEpe+zf@DrUMU%`{5imea|%aq(F2!tY#$#f+TBXkN& z`Sh0$``30j*jW<9mT@(yjN;^a;9R@TW|Z14>3mk5DU3)AY;Je_-6)YScMXxPM#;)b zstKbsV51*|B?nJfS#lgD6M|Fk=ra4<5LU9HlD1n*Ug)%zH@h#?E3p)@xPN4merL++ z8Z}~2iFi3;d>jylM5uDY=nyG{032d;aG_BY;)K!pEMv1g071wA`R0s98bXj;u`&eZ z6(ocp|70sCP1qa}g|*id|IA)fY*d7Dw(wy}g3yyB1XzmULH`sYiJ-l6t)~M`VhBR7 z%S$UR3Q-<{pbV`;C6z%BFVJtD1E*+MGpI(D$mmK;ty+wmQQldP=N;~;k3H1Y;1e@e zT-*aDT_x}ZL0IykWXERl{bEv?ABxWLVFVe^HaRT}aE)6$7cr(XyD>%TP5m_I3F1r_ ze00O=oEi@a=9S@=p+~iikFULFoC=4bg4ug8h;b@f{4e7qsIaoXEK{W_i(*QKK?7o( z&cRZWpJI2nzo_)RdOHCWfQWSAw@9KelPbhR+N2`9Pz%K%)k?z?lq74lh#}g|w(b*B zl(te)88T?$l7tL-5|Oym6CrY{j0Uj~|KbtC*hlmbNYE@A77}DnQSxcBqnGJ7_+Wgz zm$e1C(bzUA_u=DcCUc9ph6zGeH&kQRG9g}2aMG3i&9mIIZVuKZRkf7>m+MD<@fWBx zH4Px0JhfC*rPXgcMQIiQD?oC}@W;RAzGtwV0IKaJUC2uqL}l812nvuZ7slxzEW>7p zNuF{-8uFYNT@+Sk^KyZBJjE_OBm`{(g$OSslH?f)OTJMuKp1qe>U3-ZS}J?KA-7u2b0^H4BnU!MN$?^``93OcPu6z z*J+bUiI+oAQjt6M`0m5M+qSWq)xLy zrJbV~AqYraL_kVu$Eb}ArObnS+X_;7B6>E0Q8Y-(@287Cy`dImb*fV-$Z&2Fu zT(vFDRoin&wLKq$?9muxPsR?7r($aS$y2QHuP3S(Sc6DqmePuVIcg6{FY@JC$cJ~U z8A?tcosS$b5tlEesq>}$7pY85G&uERW%LK}jbSsXZB>cB4o)T31RW}?dOS literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/money_thumb.gif b/module-form/src/main/resources/static/form-design/images/money_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..a334548e8780d66ccd2de35bb2475db92c7e0489 GIT binary patch literal 3700 zcmbVNXH-+^x=tYUY7&YF5`qP#q!=QE8WKRnAkBlQj0A`fg(O0drebK)q=}3L6;O%} zs6?Hi=l~IvCI)0s5D<`F6c|vz?BoVV=bXFltn=gUwb$BTdE4_o&$mBECkHcgsyav= z^hE@EQ>qCJGiJHYz~GU(P{qDN-{0buTh8OgA8XVGO9`j41zqUnuD!zf%9`|@!m;SF z<^+DU-dMxWqUCzv4{M+c2TUdceQu()ftoX0gcB)19|h>K6@JWr6rnYKZ4)qd4rtd| z>UIML{eYokZxeCCj|HOn3g8WSx%Z6dbCYPbXQ9h~;)Y&-sl#NECh+lY*>RX~>caT* zQ^5SKxu=_^oJ?3vMmI2<)T&oM75l7I=BCd&cKrZUX&WpO;{c+ z2R^U_bMJtD@9CBkz$8aFSNwIl2k1K>oV_F%jTJ6d0q+hziiI?=m4LU-FOs(l_&bFk zqJaJb{dw@Ef!x)RbHL1-g${4wV*Nbdr=!^Cs*fTtNE5BJ^i_vlbO*2Toq*BMmTNmi zpPR>PZ0`p^gcC6{{EQ;1qG-8hwG9spQLj^#hpG>)ypO9qCiSlT@SOm8;pEw?UJ|S0 zg~FLDz@HPHx7@q#99jGHY`Xiha3(v~TS+*2S~wa}%ajv+=}f19zP>-U((C`V%j$KB z&mSk@9XH%p+wJ)GP5{fZ&9Tb7OsU0}7QBRlTX&91*G=V)>$<(w$Hzx{mnYwfmVOnEo-6l*0B;=cpHOXzR9+iCEBp}i zrN?`PZ#PmKT0vJ_ducOYM=uG43KpMNgzEvX@xb8G<&kSEA9CuL(!e{9waJ^yZ<&4Z zsP-&_wc*g!{-F8i*1*_lU?TP|RkHsBrm#q~Ao`x@ zP?|@yi>H6|34ikdq>VMgGLjG(!V00WsffssU`7}r(h5lpVEWMr;_>=23W@k;!aiYz zB(85D)^n1Wp)`c4$u47mGzNpf<4rI)Q#>AHgutRPSQJ|P;*Bvlf+?PW-HrJEAjR22 z1C9~g$qwIhiDy>GAU2ytK%pWcB1|H7nJ_~GQ5bV`^Ys{5tg+a_I4p|6rbZew!t{Sc zAk)J9L+LCwoykC~N2K~O!`W6yaixDj2w_nue+OoSnS29e;?E30MN(NPj0qYQ60(l# zn{^o5o%ZiC{?R(jGm1q+xzoa!;i3LCvAO;aXL0ZTd!ltiaW#bfp>#1R)L=5xKRkrS zU^|hmkm4Pa0D1rcy~|A8#oajcZY&yahQXMT?d(W)4i2VhlKpP8-Q*uJ{>hhYZf9?f zGk37Z;p{OOdyLrKj*PJ*+7Yp)4tP`i4__xn7@NxQr~SxF7w7%%YyV$;38YXOmCX$G zWHN()D8My{$!3NHFkB*93Hl2!nHEYvMGJ5UWriTWb(lc^hYGMn z91)8*HOHELM~=l3$!2Eucn6{#+Q9*h{O%j@|LGb^TnuVm9{(YiA4_5lt`Gkfzj*TZ z@u4xqXC_p9IKUzyAo#kry7J}o^3tD+3-g~o&dttDPfbpYkBxp986J8+IMDyDulMbn zoc(~PFZP5 z@$Fkhg#|ZnT+hFD^~&X+^DgCH%*oEm%(#%AmYR}$J}EIFK8|xP_UxI{G0{!zSbG7{yvetKbRHS} zprKIl8H|Qw4|6-`3vCUMS`T`=hRGQ)$D*xVzCx;F7P_bUL(T;kRW+9Iyb$8KsoK>1YWoHSEvZ~?a249_n#7`7 z2mIt`)GLg>Zg-c2j0U`+fdglGB&l9M?c2C9O5jh~g}U73AgBA*ohUUO9OSI9^%1pI z!E~QqmL#v73sL8ihvZ@C8Ysue$EdOu+pLIFlsFF0YK2z&b|zwcd^?+=cP#a#BpS?a z?^Qakjo{!O7C_~9KEy#&4cs3{q&wbqCAH&QUTnUdp|nM#~@8`u49gSF zN~^2`4+TJ0yqpW|FgoUR|fsXl=YHPFPe%MSc9$Fo7b zM?a+(P-W$mn$EJoUgNq_s9bnK3wL-x+v3RS$UAXa&!iY4GgbjYI+>iJCLu@s-zXqr zniRw+eg>%tYAX|^vtvbjDd=qUx%31Tqss>2Q%6-Jw)Zd3SAIMSipc3t?7S7X=U0eM z5xH$~KR*wG)56tP-a1A}5C!+7caf6htYKO~n&IqYP3 zlxupXpN*FGD4wURCH+G_TQqF07;4^t0?Zq9Wked z;Z3}HgamA-K%;(OLqs&hx+QP;{RObJD0?y+p{T=QbE76njCyH~g?ovh6zP+`B{oT^ z3NfD~VIA$6VBR^LmcJ>En=dH6739V#HX71%OKr5^%;4ZLuWg6oA%~%!MN9X2bqb`} z{1x{p>69P~+=^^H1tA6B(o^De@jhd~T%j$waFq#?wWn5rh=mXA)Z``70*JRbFY444 z^ktwq-~03J$o*CQx+1H^)yL~KKdTF7Lv|inVb&|D;A(a#dbG;iNZj19b=6~{#YWb% zKl|j#v4J`z$vw^4?6_u##98PQ?}xN=_3n}LTXrT&I@XaalF{;64u}+pHIz)fjj)H2 z_Q)&EZ%0##b>xedn(5SQrHWvD+1H=%2Ya8s(x1g2mdTdJNT7l|mL!v;DNdFK1Pw=U ze=MBq>JEx)tYsz4lKl*_cv1`r-~zv-KHu`W!XI}GUr0Wjhz)TE6#jz?Nii2Hpmj7) z#P`F#Ef0L--K`mL_`%dR2uHQ7O8>*i-ptsTClpKelxUU*UHR`y+XY0 zJFqRr`w`NQjB=8;pBN!~YZ#=QkEL6HI?2s0TQrAS1^%vI?q!01N(xGjE7_MAy8$AG l)uAA-tlfHKsB?-$+#F$6_SLH}u0mabl=hK3dejzV@juM^X14$U literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/nm_thumb.gif b/module-form/src/main/resources/static/form-design/images/nm_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4e24afc31a088ebd68afff005dd51f5762620a9 GIT binary patch literal 1312 zcmZwFc~Fvh9LMno1VJG2@c>;hg^&<$!!hl_L0Kcf@rZQj^vE*X$spa@>ENL_bW&5B zPG@)1#hp=WHr>`Tt(1Jw^3H8d?HD`N%(68~4RG1Enf8xM7l4nYU{94jU@Qes{CHEVevROm=Ow z48^``kN7nQHGY|Dom86!C5!WY=00{u^{&%do=rs&<^_{=>g43TTFZ#&c7?yW%ia7a zy|*&ba!)c^>ph_Nx7>{^k}>8wTxb8>Jbm5s*+|d6XotBchdX~OGM->Q?5eqa`NUge zsOfI?!9=R?`OuFr~OacHq{?m+Icp3u!?!7xpc6( z{E^|nOq=)UHTg`JaO5Jd^{33mPmjJxOo&@26~rXPg$0G!p#T7&&ttG800shVw{0W} z0N@r?@DcUOt#0%}x2-GHB_*l!B;rndVJbbU)Nx{NKho`rTSsg1 z0d%__kYcTc_~bFwrhtT+vZVNJM2eS!%mwKahQq$tif?5->)-weVF?puVTGk7Xh~g< zM~t@dyP%X)`1-@u#*{u|dT`Cm3d184vQoNXJGsT^UoMyqr54SQ;QW18rpe?*4RR5xzXCz>ep^qksWg@ zd&Ld3h`Ti0E=7cH@j%OWGk1TF_GrZ6qVj{51?5LQZV+Ixdt~9VJ=1~)iA1oP!5XgKU*wcD&%d%Ii4k8<5Ql(V30g0mIh38Q`jMvM=?2 zdQ_OtBS8!}R}b%pNIbqqsSw+~sk&aQP!_{92!?1)Is$C?H%{w!+pjY_rZ3z0SrM@r e!Zt(XGa&Mx9v1mb_g1j*(TKHThe=p8u<9S-k}gI7 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/no_thumb.gif b/module-form/src/main/resources/static/form-design/images/no_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..4351083ac8e0e65a64ff362cbd480f2c86eab4fb GIT binary patch literal 1971 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 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/sad_thumb.gif b/module-form/src/main/resources/static/form-design/images/sad_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f065087d4720326776b26c7b9d2482c9e467bca GIT binary patch literal 2258 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 Y2vsx^3s|^#p`syH?V}DDY9U|^06Jl%MgRZ+ literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/shamea_thumb.gif b/module-form/src/main/resources/static/form-design/images/shamea_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6d4db80572a8321fa233d7efd82636fd896bf49 GIT binary patch literal 3398 zcmd^>X;@Qd7RPTELI_!bkd;Wn76gSL8VCjmtHxL~xKN`N+n}hegVj>h8D8>cxj_Xi zSjVMQtw_~*7^&k@lqw)n5L%Qf;?}a%$_S(4Sc^ztZUR`_vClK#=R=++pYA>9{D0^C zZu0D;h{zS5h$r$BKyDljeeg~Gzpv>>pPpV9$sVltd~rxR`uyh5zR4p4e|vFC+O#|H zv~`i~-j?S%p|-YZRTls5(~6<90^7Bykw*t_{yoLk9^2PA*Vd`G-JE0VS^KObdni9- zrJysV)|MRV zaBJYG?OEYU%}|A8=;|Avr3>mxX52f;8N5DkxF+IZrSRUFsV^@0bbS{2%grTUf2o$GyCOZ|TCDz;sYyO{G90Ih5#fO`;Ud>i6G9Sc>o%d*M-cshOA3A78FdM{l3e3 z=iv1o5zA&zFEoa5a1lOUE(8}Z0nH~Xq%>s4f(3602*DW{)Gyc(>Ix$sVT<^*41ecb ze}Y$%isPfk8w2pXi+Yb!A2;jyVLW~SpYku+tU=qPli8pW=;!x4wjSv$pR&(F+B z_YEXRt-{9|pf4I)HIeQ!AzOyucb@(bM=` z(PEI~p50sx_;3Nc9 z5xKbS5K0$YDtkL?YQ-f1a9u?2idnO)BD(NSXl0^lvMR{K`%0sstSMecA>VpCmWdB^ z@(>jtRYRiLFa{*W4kQjCV$D&p_HwZHqNP}SnKaZqq4a2a~w^|4;5dy4mPab+0 z@VU$0XQ*Ye@MVyO=Y)qZjsZ(tUFW#U_<&P=UIrJ=CC(>K`nsukk{Tw!D5MIx2HKYc zBoPM^@!4k+E#||T@_s1pJ1iuZQyxDx{C3t%$E@qIVmLUg7y%7+kPk8Nv2wxU0{nWd0|dEHQp6|+bed(ZJD^M+%YPXeg< z6m|}mqJlK4fJ}`HEkT=%@he;Igy!|N?h2UV^j_`sm712_GyXK<@;ive8awt1M6WUg zUttK?8A2_YhYx{qhAP?cw+z`4I>+BPh7d+j(>cJu#l0HCdkIiacX&I7&!dHl0sG-& zcVOoSC*Xn9XHL@Yp4v%)%FVsZx5?Y+bfE|TY}bM0V=;8$(mRb;uk6Bmr5gIVty( z*3rs1?|2L_`#PWd<0PV`j&%l^G`RF|{_l-Q8s7*$=lf0> zkGpU#m=7kwKH|ekY95k6Bt{`{aA0Vi1JVHSj2pOC0oIHR4z%rp`lwn0V+d)tfSZtNXQOIQR zHj`(XLTM6{ghJBRI5GJ!nW9xHNg7j1%Arc&2DBuK6Ds+~ISQ&PHt8;SYBft&kjUgWbx@~;SRvvy;0@rWbt?pvmb>Pe*9vuRaX&t0 zpsy_?GY`Z8li6Yl&o-@Aps9d^x|`BSg`mhHHY??HI$5!LwOF}-zmP;(A^coUP7^CC z=zxBl0!sHE*NI6dPYcOaCZ$lR)#3Xyby_@m+qPkM0*+oFwZGrfJm%=S6h3H2pyl(Iu2|m8IIiYIUBrX7AZE zQl{fthK+q4Onm%wVLeU=8N4)dA=~m>BSSoI--MB&!^qnlLWT|@e>5)S^S=`^_|?dr z_VW*ZRdP3`WZ-bJC78J}iSdy%zMZRZM<^b?EMkV;0463JGl1C78#6$y%Gq5-Z~1Y> zlg?IxSn*`{`mBpJyApMu4sSXUhl2uoM90$bmD{~p^3kWU-ihR^iLgxn=0E@wiTV!_ Ch@v0> literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/sk_thumb.gif b/module-form/src/main/resources/static/form-design/images/sk_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..b751f98abcf8173ae3c08402c99ae885a0dfe162 GIT binary patch literal 2555 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 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/tza_thumb.gif b/module-form/src/main/resources/static/form-design/images/tza_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..86df67b7aad1ac80079562c74945d9c4ced3c397 GIT binary patch literal 4017 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 Z`!_Z%27Br#6>oByc-ZnwM>1&V{{f6`u%rM0 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/unheart.gif b/module-form/src/main/resources/static/form-design/images/unheart.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ffd1613b5fa36c3ffa7daca94e7e8cd6f8d82ef GIT binary patch literal 2689 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 TguQEsmUGDRV$ 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 TKb&t*bx4GV=Q(`>7FhdV^sO<; literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/ye_thumb.gif b/module-form/src/main/resources/static/form-design/images/ye_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..a181ee77882f8249f4551516085e1c2e7cf0cfec GIT binary patch literal 2127 zcmbVNX;@QN8omMv37`TZA|1*l0Re?1H)I!tkVUY7lx4IPt0B2UAe%{m0NP-JfPh7& z%BHxmsI6cXN=0k|BPs%|hy?`2>QHw^!C@58A-z#?=7-ZCbD#S>_nhy%@3*|?JLj$r zU5vC!qK3OKOyIjL&=f_HLf;KT*4p zQZHIL*>mDv-L`YvVqf%rGdps+K56x(eBtbHo$;}uzd}0JS}|NHxm~Bf|9!#3hMa)| zDaI$A1BX-3rLP^W*F9<~ynSN(aJBl!)R389s$bvw?#gaq-51dF?#kK0W4(oOk6Vjd zl)UkdlJ?B7ryW&o`i)(Mab3EYQ(Gg(4dpMdA02BcGLHN()!#I5aO>55Th64cdC-(| zwOC--@u~4nqj9|JV(vQQqt;8=(I;hVCN5SESIegd&yKZyJy4;Xxn48%Yi)PVrrDum zwVPMYj&|Ov(T&s>bmqnO6vK~ON+vEGtV;-P&x!A?*#7eJ{->>_51Vs-Z`$|ZOwr`k zQzuiRjZ=f?cYHSW^ZuKa>Y;{;!RoB3YgL!?HW>SkyuMb`y;nRv)bQ$7qwz+=!{*|X zim<)|Dg70x&o7rxc9a*g78|FA2CFj9?@E{%ta~+Ff2TU_Zf%CqXmm4LNAO~zIqXOt znLsk12LJ$KS|1(>as_Gu^7RkYC- zP{Pp}5i!DyWFb?83tR>IYgihoLJF$|phhZ@saTo-oIoUxhgrzjWG3RkHxPAl0FG^1 z08KGDawQB>34Xpp5(I%X8UdnEX*9?OB$FUAk%YW7Ux>n@(pY3V`0l|W(UhVstSB!3 zT`Xi4fJ;=X6)Yk#EiH|Z=0}h#6NnI#$u#*OlYJ3{uPR-p7HE8BD*T)WF02wN#R|1p zE(1*-1@ZC}bpQ^@^lb@JMR@po$1)Y+O+f^qTuRgk6hw$XB1)yEy568w>L~a>X?zf^ zib+?%#3)!LPf-eC1dg90Bij9WAQKSDhP75HMm9wt;mU<6Qdp)A-l=L?+7Ba#f;S0dk^gpjWs+ zD3+NF-lh$DTQ3(@ic?_`Un!S@Zxm*UKac^%j|uTeTr!FOzbb#r75zV|5s_qwruO)+ zc9}CFJ!l%fZ+>L*{`kN$I5A-hEE2{GHgEc3W88+%KU=@WKC$uYCez431$Zct_tv9$zn3-G%Cf943UTgU!N7ry}dk_dAQ?oZlLSO zE`RyRd8yM9$Hfkd?Coq9E|_m)ZH2{HqEQy+X2=!eHf@1*0JMM)a@!!k0Y?C^G-hda zIt)gi?Vp>kx0Ypw>SM!KI2GiF%B@^;w6Q!MswCgqRYTBm(HyWU*Wbpa`euwQ`( z?ld}ph9XzSBFsm1-tb@LJnV#;e?cw?yRuZ+b(fAQtFN7aB`_E zNo`e`D+i->_KEXu((}=12xIHxlF_CMVxWVt_~h+fx(#$2+s{26mvxzO&0IWFah{&+ zHZ~Ycu#012!K9HY_Ixv&V3Zp+BG}70G0sXSEHbzCdVyK*#_hCN*q4 S8f7`(nZXDyt@tenSosGvnoLjt literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/yhh_thumb.gif b/module-form/src/main/resources/static/form-design/images/yhh_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bce2997f86e477a6008fb1cae8dd03cda10abf6 GIT binary patch literal 3017 zcmeH}`&W`_9>8Dl1yK_aL;=Ob3nGb&N=AwoykI7&SsFG?;bls#Q?`m}L+3&8mQre& zIhILwGPi9z*=?-c$}De97tM;9W?i*RZLH05$~M7$)uy&if585*zr8;^=RME!`JU(V zdBVcQg2f3|kQMY4K>D$L6S^e*VCwsu-ujWeGlg;bq3@?|+D^5LdymJCUa~Y8^!gsY z{z2f>E#`2~Uw$8|*Z2Aw-rjh4oPRNYo?+rb`(D}^h4Ei=yw2tG^*=}Kj3iFKyRZM} zw>>}ZHeB#+uVQcHV~3jDI;&&G?pO8JbDnoe441zu5^60UJokvzr zv@PhaVNYFm*7q#wK9SmdwCvfV*1neFSKZ$}>n?nC)p6=?;rbSj_t$KHAL}3PEa<7l z>mRPT*&x4NGr#As@2yM6pSLjn(Y*dj>7NEpTfVv_{OyY4+Zz^dS_zZCtkypa)!&IX zoLZ*8lhA*0#ic^$@t)+qlbrW=g8yD6d*A8Wcf0xDy12e8^3j1`$4=T$Pfs(a%_2ir zt_T)IhkCm6j8G5+G2g)$PY6J6$Tu=1D+n^4RsxkeFTbELWWAf4sj1ugkixtW)6Ecv zWNS;}U`@q)+|pne3uOy!gtTyu*sY)rX4J3DCQt+`soayN)bb+?bUm^900+)sKxuL{ z8%=Mmr~F_`>6A0*Shk9_(VXAA|H04URGZCwbQ%k!hM3(&Bw}bBN2+@$iK77J6p;J1m6pocLCoTxg|5!y ze0Aaf=r6G|2gf1@CqP8x;N4093&QL$)a(tQM5EzQI10xor(GH%kwT&%jUNV^Cc!$Qr>))HJJ+FdjJP<~NCyx1LPaqE_63aOSL zgJ#3zZC@Ma=aC`_vIgR0DmB(FDmg1eWaa-$x(nHA>C)vM+xn(*6BFAkVVCoQt)yUc zi`;qCl*tU^fl7hP3x0~0)j?;Ir{@K}9Dr56MqFM(BC4y7VU+0E<@FR@0E;H2X%)v} z@f=?+L)W;zvo>&cXtSq;Arxc*kv?21kSdccVylbQVo%pZV7DqhphS%gSiH`C74Qou zvSgKjLh&Xz#rpvTd8hh^c&7$$;F+OHld7a#6W1_8So~tSn(GC`T+gsL@33|2Jmpdm zS>YrI@jDy0{X2rUlOH+5eK0+6lrp`Ee8TDsDT5j z{-{H!`6`2m$W+<;CXJK>VGkKG6H^utqr~ZXveDXw4q44brq@gD?PV95b>qfeAzVB@vs@)69ynJ_({9pf zhXVH+nX;txC(7&P0o&fLE>_-)ne&9@%ylt>um~*^gjS9cFwg+8GeA@d_$)LQ;uHZi zgD)qu=rnE_w5OnwK~M8frDxL6Wr(NuN%zy8qu5)>%nUU;MT(Z%M9@8KPp(5}(^nwq}4<2ejm;;1)1H#-RipPvSpCYvuGQVrc%(rF&-pS>snM~eV|J%Sv zVq-^GX)VgPl2}_>75Xf-Tx#V}ke21+QxWOo&{t9T)y@1L%_lUNxjB7y$3Ez%ct$^V zbNYej{G*ulPYDA+6bhIzPzGY4;_7%OZ-TeLGlR7lNL7qa5<4|1H190@IRAMg5(j8}L?(phY-y`50aH_-& z8U{DVAdq$){Y{AivqB20s8-wpxRcT?Z`FaicaB1cs)H@ zqu@!rE~yt8sHR{M}v6=UaO z1;V8&kz9rTSSvM(4H%a_|H#z?Bv%Z^7s2BH^hL48W|DP0J3FWiUv6)uh@L!>i#eM%g!m2b=EomsZoMrFNGwm%(_p IDGd4k2Wv_t&Hw-a literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/yw_thumb.gif b/module-form/src/main/resources/static/form-design/images/yw_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a4c0131dc926ee932804276038bf053a5cc1634 GIT binary patch literal 4377 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 literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/z2_thumb.gif b/module-form/src/main/resources/static/form-design/images/z2_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0eff222ba83ddcd3c2212e9336fb143e72204bf GIT binary patch literal 2034 zcmZ?wbhEHb6k`x$cvjEw^U|Ufk-9H8H~)XU`*gL-vvrOC-=4ZRJLhPQ$=-a|1+F4z zTKpc*PQ5!h{&th=+l`gWg4K?cd7UV>`2XVATx*{HPqy9Z2|U*v^5N{_Y-xKOU*%7Iz#@yI(WLw{#sx1sk)%2iwiaf%N;0iKagdAzB~F*iPzCGpP#oj z?8~-3TITfs_x;@w3j33EU#_qHv8&-kMZo`;dw-vp{BnKc@0;sB9Gm&^=RvCpS%4gdcxQ8oB8eJ+*SUvKMr&}UtVyzC-&OZtmBp5_h%%ZD0ST#t@(9(-Pr=8 zALr+P+uM1n&f~}a&W)M&`_l||q+0*Gx8ujrNq_HcztiD=ti<|Yw8Di3um4XE9LaUs zlcDqX&gKI}R{#J1SNzZI=Nc01>=@u`q-Vg)$iTn=6pHW-P;f~sNd(e1_7w$*$=RtT z3Q4KynR&KK?|1K4QpilPRSGxtHSjHPPR+>ls47YguJQ{>uF6ifOi{A8Q?RM9s>m(K zO)W`OsL0L9E4HezRZ2|BPfE1{vO&W7N(x{lCE2!0jvxsIke$x?MX3s=dd9lR28MKW+g=7RhMR$W{Yl!|Z$R@KEJ zl?AE#L8-<0rA5i9K;_CX&A_n3ZxKi#&^1>6MVY`zNz8G{PcF?(%`5SAu~h=f=%r+) zSeY1F8oC;|7#X-38JJlZ8d?|`IXYT6IvcvUI-9#1nZnG#rq|8H)XCMz(bd($)!5L` z)zHb()XmMz(#6!$#L&&a*#xH7Gq1QLF)uk4W^X3YUKb}9b7My*6QEv0oO-RCi&7Iy z@{2<9^K)P+ARr^ZB)>Q#zd*q`*i1pgH!(Rg4Y0ng`4?MZnC#`2XMEKfizd z{PF$U*Ds$xef;qL-P<>>U%h}$>=IY|?mo_rKzE=rmCW>q^KY-Co3Z@B`F~;CMqH&FX z1T10{f3k3jFw`^X081NSH6X^o!2Y`#Zmqpvrf~B`z$jLg)f_q9E z-*i3cyg9A&q}e3O7q@uwu`<|jtZG?n!z8t-nS<4gsb)vhE?=|QP0nIsk?HLAv671` zMD0uzOqfNP{1m6?FgaM6yYTZH8fzBH_j2S|-B(uA)Ra}@$nMqmu(LBYGRik)(Bhbq z5z@rXAs;`l;74Ps3%lhxfvG1953tYRlXyCFhS0|g+>EtfbXG1>>zW}EvW;h>d)rAF z{h$RMI}9GPwAg%`BXctFfJ@VS&K{NrUltvmVaOw8@L+>`<0^5HML_`$iQbDHK>lV$ z^YFTJ&S~On5D+#Zn0^4(&Dqb=4!J^zJ{S=@5H$THgZ=0ez<~KE?+fO^r%yfdw=pRP O9M literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/zhh_thumb.gif b/module-form/src/main/resources/static/form-design/images/zhh_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..adac542fd33e152fc08baf165d1c5a467f0c2747 GIT binary patch literal 3040 zcmeH}`&Uxg9>5Q86bs~`fKmvGN=OJ=XsCdSFDfllZ)I9iBDJa+pA|D35dp&{&8Do( zY;4M!>h`{Mb4u-@Ju!RP^cd|iS-0+W(rKJY^ny7y&FUYxYu(?@4||=p&*yvg=d)wt z6ylJDZjc-F6M$^5zP`10c7JD6)#SchlXsnjv(6| z>EJc5=N)_dp6s#Rns#?z&_7FEhJL*;)OV`2igr|s`EHfycxjOBUP9S){P1tLZ9k?D zotoBK?YlGx{p=*K^F;QQZAq_hZ@zN8_Vs1ut=;}ZXX5Vf!w&stkF7!6_vF~~Q_e42 zQwFd5Z7rPp{N$7umsj06{^iwb7u)?=E$cCNcT@WxZGL;VwCh{n!S+dC&tvtpE@`a} z>AzoKJ09@5IkaXOckr_N+m5)tp0@s5Nzbou89I^r`sNqsEVLj0A>Wii8n{S$u_w6y z;-m-7>#a51!Sg=0j@TRfa~i*`czOR^-;MN_H%xDu*n0ImrrWFwyHC$LZSv{uP`$H8K03&4+LrO|lK-RYjlXxMJUUzOqWi(CgUsRKVXtA_ zjOgUqk+Q^SAzy%iK@jBi8xkdi0K~ID+lS-^L6~73(3coWjV2JaB*57@AYe(9xkTZN z;gUT)$y{i;^9ECZf)YoQcu0yM3<{+QFxGSV)MPOQUzEI`@%O_e`5K6ki{etYdJ-TM z;*2K0#2-UvmP|bqDW)S>ja&4r@f$q3$u32Ab{dUSUB|Z%WYr@|umzzS z8QeEhTIEOcJk%^~L;JWA>!g)T<+^(M3`J&BCNvYLYXAONR(5JEH6pX5PP3yhWsM7pwJ6#Sc%<&*+cVb)n|V zh-4;ne&?aZnDT9c#FhGX)TQZ0^OACDKVgbXM=viAc2#xr(0#$lKv*R*bgH0gibqRJ zbzDV+@}yMTVz^!khmDZOJIG@pIE00ecJg$cSRz3KBcQUm)Ka6COO6(qHUb{N6n|&g#oQ7BP0T2A!<>-(?d%YZ0Y)3g*%^dbs`F=VP_01?5WkkRBu3`YSH!tr@T1}2Wn1C6=y;p(WM zWE@W9o>0S$Q{{;k;1YeipWs%ri5L|d|K#7jL8K?~x~|Wy-Mz)(-0;z7` zrq|^&C|BA1fvl{xrB3eEY3+&ZHWU{hzbx~cNWxl5Xx@XQzMs|^32qyeiQk+<6h}x? z_II}EitEth^oI8CsGdy`U+SRBH;ZD-!C)=1mzno+V$iIU%#{_E@PxslwJZbq4VGTz5S8EOsyqc)urqel zLWyG*BFPf<0W+yl>L!t_yn1dTA@k6anYFyaiw{<@{N!+aVi=*V?=k+epF6+(RAd(( z2A|h5E5En3wRQqb>vyVhPme{ilEq*Wj(NvoV4v$%pGgY{aO8Bi*F9@9+vY3G!!EQ9 z12dT;M{Nw-pPfBwCg2DZum@_nB|u?M6tE}Cemk;o2C_C$fvM3wl%!KSf9 zA%G)N){#hEY(p^qk|_q`<4|=5kCv+8YJ(nzps^Vmtng>=7LRFx7yXhJHOCRe!9jzE zcNW7Crh=jKD<4PUHXvs|!gh=#OaH3QTz?@FKFxJVTePUyiG&MusvD@%=~@}t`h^1` x&iYmvvfx#bmpT3`PtF^0k?a@iE%))*1NVySmZizF-M!R86}DbhY`;HF`!D7eFhu|W literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/images/zy_thumb.gif b/module-form/src/main/resources/static/form-design/images/zy_thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..66f967b48da173b68cbfc92986e4426ea35ade74 GIT binary patch literal 4050 zcmd5;cUV*B9zG-|aKcUuF$obe*h&T?C1D0a7>XjG;<%NNgrSne5DR*%ClHWCf(Y8y zQ50|?Zc%VhWjLTpRn%&&ZLzl2iL*`u_aq3med_(^KF_^3Po5{|eEELs{k^~U`{EMB zA$$oDAOg2xVCYr%x%K|l6LAl|Gb{=OO;?3i8n}a7CpI|XOnsR>jVlJaBTdZ$)1^Su z>BQ^Jxr1w_pI$f5be6hRfEj$a{^V+^>DPbu9dI#SpExkp%XDl0(6ik=UgV+Iy+h9q zYU6#MT}r9X9^bhVs+|{T`abphM(DRASkqnI-l-0ETAfW-1jovK-|h%C-CHsA;`m_A z6w{BhkCxe;bFm*d@7JIb3_jUvy1(kkOz&5x#|++CRxJxSu+(Othw*!FVt)s9a7U`? zR{n#tlLjBveY<_^*>!eLdZj~;Hw?Y`;a(8&RgU0(E2SzM9604~x)wK7F>7%DEYl6? ziTc$;Lqm00ZqIJ*FzpdP`zGwxVgIN5$KP*fyu3c^VRzWuzLMTejsyLTwQ8*ChVtbp z+~qjpt!S_QuB_LW;?Hd)zrMZpaJIwX7I{;s-v#5?7oAQgs#1PG<34z1(VK@&yO#0p zv=B`frr+7)ertK+)e4WFIu^EnKCQ9P<10Dmd571{PlYdT*ZunSY$Of(klp0iwA2`3 za%=#LgSG+y09i^;N~Vb<8VT|n7Fnp0NaxEnv`l$+t|FZA=-3GcEms!Km=T=BNm9kg zb8_RCsO70kCZ|c4%$M?IjK~ODSfQXWPn9RvNN9z53l#Z+!f=K}rp%NJkZ1EUn?bW| z(aaBL2+e=c%rRq>YB?>K73eSJaJe)dkHrlN=JB`_XaO8<0Goq+dH&oWK`>7c@Dc6Z zhk-;>%d!M1BJsOe$XhrgN25^**zAIW0#-pFOR3IgbNPI}*+)QtKeEF=f3ZR%DfCz5 zGe2L{os!_L!e3qpgmQC1qjr5Jz*P`LWRfv3w4X z%Z)`|g2iGUUlhy_;)*#jK_j*zrF2oAT%j4UmA$tO{GhFw40$RfvPiDZ{X{MktCe{) zOVNVd59h-9pucyvvJdCN{h%!yNrr81?H^h_vV`!*{5VQnPF7cZRu zrsv$*ue-a>oIZ83v!lK3#PP3Mj~zX7xTX2f!KMTI_wC)Yd)Lm!9Sz&JZQZiDzOHuD z#+olTtY5eGi_bq>v%0!!RprVGWBCe$zHE7EiLSUv3ol#x=|7h&E-d(DktScgP^DDl zEto$qHzzwwE|X?TGUk5#k2$kv%}k#$eOg*-%GBg3lanS*OiYN66UT~TqJ>eB5#eE> z0)EIxyx^d~04|5k@}Dr?&)3J>%hQ9&pwryl#!+10-b zAR2|p1N}9KApkHi0Z|G>!ifN2Go*!!b>R_SzIv~Sa9u?O&38^PD{dSsm^aJUxU$%b z=H~BBaCLJf@cG`;y=pdnjO7#DfN_8ufr$0rRS`R#$Dw#fv&Mav7DP{_?TpoV60K3G z3kyy+Gi_6FbP~n0SU4L?bVcW(3Rx@_7-UOFd0=J=;jvf@i4#?TLX}(&iK)#HE|Iea z4BP4_0b1Of^pJ(oXUcp)O@Ga{p}_=fxG*Pm?~$G z9ANA=wmCUr@mXmk8K9DTLZ>}uhFcfmu_2T$?uDE)^Qr1&T3?&1m93|QGRNm$PTW|m z@3~rRd500}5|gRH%Q8+mUnur$NM5+Lc-`HKMtJ4{S)7q{uzly;A#Z1Mhp?6oVE}u; z7QiAM5^3Qva7k(DywZT>@H{F^jfWwf0wTlGFQ6r{5s);YggUQ4;p+pftRAlpiO9-< zN^)W%7LuX2d5V8QzmZiN+AM4@7+q`Sh3LL$Y#C`eb>Lc9R%Fl#?4it>JKQSKA8q zM8-0Mr0;5d)O#S%00=k$I0T3SEo|W$tT(_Gj+L#@4->0eKTM_du-vK^x3u2q6zor_ zPZm==IGpJWAr@qFV^S2bV02CO8Gspgd6}yTJk&bc_$>Z_kevE-V&29|z<}HM> zGfX1|CF`P=3w4kpDE_4GjD0Y5l}J>a5nVzysNz*RTFi2;8}5#82eS&KMmQT2I;wT+ zLlqt#DGWNs7Nn{f>2#a8wW83YuQ<9a_x1FMYYoX}a$+4koT#`?D@yby1L-50aX<_DGAa13Nf|O-6+hCk6<782 zOu4(`*BNb5^*I;oFw3H}tFn4F*-rVmHNzJuy0Q}jCxig)-FBfciX%xb6{5o-Sy%kA z7h;`Xiq;8y^(<;7=oXe07NrHTWyc}LInr6wS+sC`Vc%g_P`KP)>c)KB8B<(BcCjY! zJC=?u<|af}3Ts8EmDXzepzBj9WmEzb(k0eLC#vI@ zyGWVjy`YQVo-~fGwdyH*;sMxDcl7AXM=&Dkqk8fGF(!XKUHbo5V}g1=CKr$~F&5h> zEn{M|fmYFO(r`k{nDpT+9g1K)?nK6rCF*S%xzxo ztiTL>M|%t!Lnmk-XKY?w1!7|**82UMbM0&16>Mw1QJ?_~;0Qp7Oiv$`X*YAt#aJTG zRgc^!qAExnEQQY_zyuzVg5{7rHc*Iq{+4YXn8hd%wNMW?9a;=81Yxj6f4r?_&T3cQ zVSnW2G3W5bUYlVR9;Vm(P$}BsLkreh0EI1h>fM-CIQpD`jiXnN z*0iw}^(ENYs3-2+r5`S;vguGuCAvj`Zav;sX(_4_DT**fPpRy^6xsWi^WO?UE`v5` JEmCgizW{zshWG#g literal 0 HcmV?d00001 diff --git a/module-form/src/main/resources/static/form-design/js/config.js b/module-form/src/main/resources/static/form-design/js/config.js new file mode 100644 index 00000000..c9ad1c31 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/js/config.js @@ -0,0 +1,13 @@ +/** + * layui 项目的全局配置 + * +*/ +layui.config({ + //dir: '/res/layui/', //layui.js 所在路径(注意,如果是 script 单独引入 layui.js,无需设定该参数。),一般情况下可以无视 + version: false, //一般用于更新模块缓存,默认不开启。设为 true 即让浏览器不缓存。也可以设为一个固定的值,如:201610 + debug: false, //用于开启调试模式,默认 false,如果设为 true,则JS模块的节点会保留在页面 + base: './form-design/modules/', //设定扩展的 layui 模块的所在目录,一般用于外部模块扩展 + }).use(['layer'],function(){ + var $ = layui.jquery; + var layer = layui.layer; + }); \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/js/htmlformat.js b/module-form/src/main/resources/static/form-design/js/htmlformat.js new file mode 100644 index 00000000..1f5ebf1f --- /dev/null +++ b/module-form/src/main/resources/static/form-design/js/htmlformat.js @@ -0,0 +1,409 @@ +function style_html(html_source, indent_size, indent_character, max_char) { + //Wrapper function to invoke all the necessary constructors and deal with the output. + + var Parser, multi_parser; + + function Parser() { + + this.pos = 0; //Parser position + this.token = ''; + this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT + this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values + parent: 'parent1', + parentcount: 1, + parent1: '' + }; + this.tag_type = ''; + this.token_text = this.last_token = this.last_text = this.token_type = ''; + + + this.Utils = { //Uilities made available to the various functions + whitespace: "\n\r\t ".split(''), + single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed'.split(','), //all the single tags for HTML + extra_liners: 'head,body,/html'.split(','), //for tags that need a line of whitespace before them + in_array: function (what, arr) { + for (var i=0; i= this.input.length) { + return content.length?content.join(''):['', 'TK_EOF']; + } + + char = this.input.charAt(this.pos); + this.pos++; + this.line_char_count++; + + + if (this.Utils.in_array(char, this.Utils.whitespace)) { + if (content.length) { + space = true; + } + this.line_char_count--; + continue; //don't want to insert unnecessary space + } + else if (space) { + if (this.line_char_count >= this.max_char) { //insert a line when the max_char is reached + content.push('\n'); + for (var i=0; i', 'igm'); + reg_match.lastIndex = this.pos; + var reg_array = reg_match.exec(this.input); + var end_script = reg_array?reg_array.index:this.input.length; //absolute end of script + while(this.pos < end_script) { //get everything in between the script tags + if (this.pos >= this.input.length) { + return content.length?content.join(''):['', 'TK_EOF']; + } + + char = this.input.charAt(this.pos); + this.pos++; + + + content.push(char); + } + return content.length?content.join(''):''; //we might not have any content at all + } + + this.record_tag = function (tag){ //function to record a tag and its parent in this.tags Object + if (this.tags[tag + 'count']) { //check for the existence of this tag type + this.tags[tag + 'count']++; + this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level + } + else { //otherwise initialize this tag type + this.tags[tag + 'count'] = 1; + this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level + } + this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent) + this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1') + } + + this.retrieve_tag = function (tag) { //function to retrieve the opening tag to the corresponding closer + if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it + var temp_parent = this.tags.parent; //check to see if it's a closable tag. + while (temp_parent) { //till we reach '' (the initial value); + if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it + break; + } + temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree + } + if (temp_parent) { //if we caught something + this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly + this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent + } + delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference... + delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself + if (this.tags[tag + 'count'] == 1) { + delete this.tags[tag + 'count']; + } + else { + this.tags[tag + 'count']--; + } + } + } + + this.get_tag = function () { //function to get a full tag and parse its type + var char = ''; + var content = []; + var space = false; + + do { + if (this.pos >= this.input.length) { + return content.length?content.join(''):['', 'TK_EOF']; + } + + char = this.input.charAt(this.pos); + this.pos++; + this.line_char_count++; + + if (this.Utils.in_array(char, this.Utils.whitespace)) { //don't want to insert unnecessary space + space = true; + this.line_char_count--; + continue; + } + + if (char === "'" || char === '"') { + if (!content[1] || content[1] !== '!') { //if we're in a comment strings don't get treated specially + char += this.get_unformatted(char); + space = true; + } + } + + if (char === '=') { //no space before = + space = false; + } + + if (content.length && content[content.length-1] !== '=' && char !== '>' + && space) { //no space after = or before > + if (this.line_char_count >= this.max_char) { + this.print_newline(false, content); + this.line_char_count = 0; + } + else { + content.push(' '); + this.line_char_count++; + } + space = false; + } + content.push(char); //inserts character at-a-time (or string) + } while (char !== '>'); + + var tag_complete = content.join(''); + var tag_index; + if (tag_complete.indexOf(' ') != -1) { //if there's whitespace, thats where the tag name ends + tag_index = tag_complete.indexOf(' '); + } + else { //otherwise go with the tag ending + tag_index = tag_complete.indexOf('>'); + } + var tag_check = tag_complete.substring(1, tag_index).toLowerCase(); + if (tag_complete.charAt(tag_complete.length-2) === '/' || + this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /) + this.tag_type = 'SINGLE'; + } + else if (tag_check === 'script') { //for later script handling + this.record_tag(tag_check); + this.tag_type = 'SCRIPT'; + } + else if (tag_check === 'style') { //for future style handling (for now it justs uses get_content) + this.record_tag(tag_check); + this.tag_type = 'STYLE'; + } + else if (tag_check.charAt(0) === '!') { //peek for so... + var comment = this.get_unformatted('-->', tag_complete); //...delegate to get_unformatted + content.push(comment); + } + this.tag_type = 'START'; + } + else if (tag_check.indexOf('[endif') != -1) {//peek for ', tag_complete); + content.push(comment); + this.tag_type = 'SINGLE'; + } + } + else { + if (tag_check.charAt(0) === '/') { //this tag is a double tag so check for tag-ending + this.retrieve_tag(tag_check.substring(1)); //remove it and all ancestors + this.tag_type = 'END'; + } + else { //otherwise it's a start-tag + this.record_tag(tag_check); //push it on the tag stack + this.tag_type = 'START'; + } + if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) { //check if this double needs an extra line + this.print_newline(true, this.output); + } + } + return content.join(''); //returns fully formatted tag + } + + this.get_unformatted = function (delimiter, orig_tag) { //function to return unformatted content in its entirety + + if (orig_tag && orig_tag.indexOf(delimiter) != -1) { + return ''; + } + var char = ''; + var content = ''; + var space = true; + do { + + + char = this.input.charAt(this.pos); + this.pos++ + + if (this.Utils.in_array(char, this.Utils.whitespace)) { + if (!space) { + this.line_char_count--; + continue; + } + if (char === '\n' || char === '\r') { + content += '\n'; + for (var i=0; i 0) { + this.indent_level--; + } + } + } + return this; + } + + /*_____________________--------------------_____________________*/ + + + + multi_parser = new Parser(); //wrapping functions Parser + multi_parser.printer(html_source, indent_character, indent_size); //initialize starting values + + + + while (true) { + var t = multi_parser.get_token(); + multi_parser.token_text = t[0]; + multi_parser.token_type = t[1]; + + if (multi_parser.token_type === 'TK_EOF') { + break; + } + + + switch (multi_parser.token_type) { + case 'TK_TAG_START': case 'TK_TAG_SCRIPT': case 'TK_TAG_STYLE': + multi_parser.print_newline(false, multi_parser.output); + multi_parser.print_token(multi_parser.token_text); + multi_parser.indent(); + multi_parser.current_mode = 'CONTENT'; + break; + case 'TK_TAG_END': + multi_parser.print_newline(true, multi_parser.output); + multi_parser.print_token(multi_parser.token_text); + multi_parser.current_mode = 'CONTENT'; + break; + case 'TK_TAG_SINGLE': + multi_parser.print_newline(false, multi_parser.output); + multi_parser.print_token(multi_parser.token_text); + multi_parser.current_mode = 'CONTENT'; + break; + case 'TK_CONTENT': + if (multi_parser.token_text !== '') { + multi_parser.print_newline(false, multi_parser.output); + multi_parser.print_token(multi_parser.token_text); + } + multi_parser.current_mode = 'TAG'; + break; + } + multi_parser.last_token = multi_parser.token_type; + multi_parser.last_text = multi_parser.token_text; + } + return multi_parser.output.join(''); + } + \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/js/jsformat.js b/module-form/src/main/resources/static/form-design/js/jsformat.js new file mode 100644 index 00000000..a2791d7e --- /dev/null +++ b/module-form/src/main/resources/static/form-design/js/jsformat.js @@ -0,0 +1,568 @@ + + +function js_beautify(js_source_text, indent_size, indent_character, indent_level) +{ + + var input, output, token_text, last_type, last_text, last_word, current_mode, modes, indent_string; + var whitespace, wordchar, punct, parser_pos, line_starters, in_case; + var prefix, token_type, do_block_just_closed, var_line, var_line_tainted; + + + + function trim_output() + { + while (output.length && (output[output.length - 1] === ' ' || output[output.length - 1] === indent_string)) { + output.pop(); + } + } + + function print_newline(ignore_repeated) + { + ignore_repeated = typeof ignore_repeated === 'undefined' ? true: ignore_repeated; + + trim_output(); + + if (!output.length) { + return; // no newline on start of file + } + + if (output[output.length - 1] !== "\n" || !ignore_repeated) { + output.push("\n"); + } + for (var i = 0; i < indent_level; i++) { + output.push(indent_string); + } + } + + + + function print_space() + { + var last_output = output.length ? output[output.length - 1] : ' '; + if (last_output !== ' ' && last_output !== '\n' && last_output !== indent_string) { // prevent occassional duplicate space + output.push(' '); + } + } + + + function print_token() + { + output.push(token_text); + } + + function indent() + { + indent_level++; + } + + + function unindent() + { + if (indent_level) { + indent_level--; + } + } + + + function remove_indent() + { + if (output.length && output[output.length - 1] === indent_string) { + output.pop(); + } + } + + + function set_mode(mode) + { + modes.push(current_mode); + current_mode = mode; + } + + + function restore_mode() + { + do_block_just_closed = current_mode === 'DO_BLOCK'; + current_mode = modes.pop(); + } + + + function in_array(what, arr) + { + for (var i = 0; i < arr.length; i++) + { + if (arr[i] === what) { + return true; + } + } + return false; + } + + + + function get_next_token() + { + var n_newlines = 0; + var c = ''; + + do { + if (parser_pos >= input.length) { + return ['', 'TK_EOF']; + } + c = input.charAt(parser_pos); + + parser_pos += 1; + if (c === "\n") { + n_newlines += 1; + } + } + while (in_array(c, whitespace)); + + if (n_newlines > 1) { + for (var i = 0; i < 2; i++) { + print_newline(i === 0); + } + } + var wanted_newline = (n_newlines === 1); + + + if (in_array(c, wordchar)) { + if (parser_pos < input.length) { + while (in_array(input.charAt(parser_pos), wordchar)) { + c += input.charAt(parser_pos); + parser_pos += 1; + if (parser_pos === input.length) { + break; + } + } + } + + // small and surprisingly unugly hack for 1E-10 representation + if (parser_pos !== input.length && c.match(/^[0-9]+[Ee]$/) && input.charAt(parser_pos) === '-') { + parser_pos += 1; + + var t = get_next_token(parser_pos); + c += '-' + t[0]; + return [c, 'TK_WORD']; + } + + if (c === 'in') { // hack for 'in' operator + return [c, 'TK_OPERATOR']; + } + return [c, 'TK_WORD']; + } + + if (c === '(' || c === '[') { + return [c, 'TK_START_EXPR']; + } + + if (c === ')' || c === ']') { + return [c, 'TK_END_EXPR']; + } + + if (c === '{') { + return [c, 'TK_START_BLOCK']; + } + + if (c === '}') { + return [c, 'TK_END_BLOCK']; + } + + if (c === ';') { + return [c, 'TK_END_COMMAND']; + } + + if (c === '/') { + var comment = ''; + // peek for comment /* ... */ + if (input.charAt(parser_pos) === '*') { + parser_pos += 1; + if (parser_pos < input.length) { + while (! (input.charAt(parser_pos) === '*' && input.charAt(parser_pos + 1) && input.charAt(parser_pos + 1) === '/') && parser_pos < input.length) { + comment += input.charAt(parser_pos); + parser_pos += 1; + if (parser_pos >= input.length) { + break; + } + } + } + parser_pos += 2; + return ['/*' + comment + '*/', 'TK_BLOCK_COMMENT']; + } + // peek for comment // ... + if (input.charAt(parser_pos) === '/') { + comment = c; + while (input.charAt(parser_pos) !== "\x0d" && input.charAt(parser_pos) !== "\x0a") { + comment += input.charAt(parser_pos); + parser_pos += 1; + if (parser_pos >= input.length) { + break; + } + } + parser_pos += 1; + if (wanted_newline) { + print_newline(); + } + return [comment, 'TK_COMMENT']; + } + + } + + if (c === "'" || // string + c === '"' || // string + (c === '/' && + ((last_type === 'TK_WORD' && last_text === 'return') || (last_type === 'TK_START_EXPR' || last_type === 'TK_END_BLOCK' || last_type === 'TK_OPERATOR' || last_type === 'TK_EOF' || last_type === 'TK_END_COMMAND')))) { // regexp + var sep = c; + var esc = false; + c = ''; + + if (parser_pos < input.length) { + + while (esc || input.charAt(parser_pos) !== sep) { + c += input.charAt(parser_pos); + if (!esc) { + esc = input.charAt(parser_pos) === '\\'; + } else { + esc = false; + } + parser_pos += 1; + if (parser_pos >= input.length) { + break; + } + } + + } + + parser_pos += 1; + if (last_type === 'TK_END_COMMAND') { + print_newline(); + } + return [sep + c + sep, 'TK_STRING']; + } + + if (in_array(c, punct)) { + while (parser_pos < input.length && in_array(c + input.charAt(parser_pos), punct)) { + c += input.charAt(parser_pos); + parser_pos += 1; + if (parser_pos >= input.length) { + break; + } + } + return [c, 'TK_OPERATOR']; + } + + return [c, 'TK_UNKNOWN']; + } + + + //---------------------------------- + + indent_character = indent_character || ' '; + indent_size = indent_size || 4; + + indent_string = ''; + while (indent_size--) { + indent_string += indent_character; + } + + input = js_source_text; + + last_word = ''; // last 'TK_WORD' passed + last_type = 'TK_START_EXPR'; // last token type + last_text = ''; // last token text + output = []; + + do_block_just_closed = false; + var_line = false; + var_line_tainted = false; + + whitespace = "\n\r\t ".split(''); + wordchar = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$'.split(''); + punct = '+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! !! , : ? ^ ^= |='.split(' '); + + // words which should always start on new line. + line_starters = 'continue,try,throw,return,var,if,switch,case,default,for,while,break,function'.split(','); + + // states showing if we are currently in expression (i.e. "if" case) - 'EXPRESSION', or in usual block (like, procedure), 'BLOCK'. + // some formatting depends on that. + current_mode = 'BLOCK'; + modes = [current_mode]; + + indent_level = indent_level || 0; + parser_pos = 0; // parser position + in_case = false; // flag for parser that case/default has been processed, and next colon needs special attention + while (true) { + var t = get_next_token(parser_pos); + token_text = t[0]; + token_type = t[1]; + if (token_type === 'TK_EOF') { + break; + } + + switch (token_type) { + + case 'TK_START_EXPR': + var_line = false; + set_mode('EXPRESSION'); + if (last_type === 'TK_END_EXPR' || last_type === 'TK_START_EXPR') { + // do nothing on (( and )( and ][ and ]( .. + } else if (last_type !== 'TK_WORD' && last_type !== 'TK_OPERATOR') { + print_space(); + } else if (in_array(last_word, line_starters) && last_word !== 'function') { + print_space(); + } + print_token(); + break; + + case 'TK_END_EXPR': + print_token(); + restore_mode(); + break; + + case 'TK_START_BLOCK': + + if (last_word === 'do') { + set_mode('DO_BLOCK'); + } else { + set_mode('BLOCK'); + } + if (last_type !== 'TK_OPERATOR' && last_type !== 'TK_START_EXPR') { + if (last_type === 'TK_START_BLOCK') { + print_newline(); + } else { + print_space(); + } + } + print_token(); + indent(); + break; + + case 'TK_END_BLOCK': + if (last_type === 'TK_START_BLOCK') { + // nothing + trim_output(); + unindent(); + } else { + unindent(); + print_newline(); + } + print_token(); + restore_mode(); + break; + + case 'TK_WORD': + + if (do_block_just_closed) { + print_space(); + print_token(); + print_space(); + break; + } + + if (token_text === 'case' || token_text === 'default') { + if (last_text === ':') { + // switch cases following one another + remove_indent(); + } else { + // case statement starts in the same line where switch + unindent(); + print_newline(); + indent(); + } + print_token(); + in_case = true; + break; + } + + + prefix = 'NONE'; + if (last_type === 'TK_END_BLOCK') { + if (!in_array(token_text.toLowerCase(), ['else', 'catch', 'finally'])) { + prefix = 'NEWLINE'; + } else { + prefix = 'SPACE'; + print_space(); + } + } else if (last_type === 'TK_END_COMMAND' && (current_mode === 'BLOCK' || current_mode === 'DO_BLOCK')) { + prefix = 'NEWLINE'; + } else if (last_type === 'TK_END_COMMAND' && current_mode === 'EXPRESSION') { + prefix = 'SPACE'; + } else if (last_type === 'TK_WORD') { + prefix = 'SPACE'; + } else if (last_type === 'TK_START_BLOCK') { + prefix = 'NEWLINE'; + } else if (last_type === 'TK_END_EXPR') { + print_space(); + prefix = 'NEWLINE'; + } + + if (last_type !== 'TK_END_BLOCK' && in_array(token_text.toLowerCase(), ['else', 'catch', 'finally'])) { + print_newline(); + } else if (in_array(token_text, line_starters) || prefix === 'NEWLINE') { + if (last_text === 'else') { + // no need to force newline on else break + print_space(); + } else if ((last_type === 'TK_START_EXPR' || last_text === '=') && token_text === 'function') { + // no need to force newline on 'function': (function + // DONOTHING + } else if (last_type === 'TK_WORD' && (last_text === 'return' || last_text === 'throw')) { + // no newline between 'return nnn' + print_space(); + } else if (last_type !== 'TK_END_EXPR') { + if ((last_type !== 'TK_START_EXPR' || token_text !== 'var') && last_text !== ':') { + // no need to force newline on 'var': for (var x = 0...) + if (token_text === 'if' && last_type === 'TK_WORD' && last_word === 'else') { + // no newline for } else if { + print_space(); + } else { + print_newline(); + } + } + } else { + if (in_array(token_text, line_starters) && last_text !== ')') { + print_newline(); + } + } + } else if (prefix === 'SPACE') { + print_space(); + } + print_token(); + last_word = token_text; + + if (token_text === 'var') { + var_line = true; + var_line_tainted = false; + } + + break; + + case 'TK_END_COMMAND': + + print_token(); + var_line = false; + break; + + case 'TK_STRING': + + if (last_type === 'TK_START_BLOCK' || last_type === 'TK_END_BLOCK') { + print_newline(); + } else if (last_type === 'TK_WORD') { + print_space(); + } + print_token(); + break; + + case 'TK_OPERATOR': + + var start_delim = true; + var end_delim = true; + if (var_line && token_text !== ',') { + var_line_tainted = true; + if (token_text === ':') { + var_line = false; + } + } + + if (token_text === ':' && in_case) { + print_token(); // colon really asks for separate treatment + print_newline(); + break; + } + + in_case = false; + + if (token_text === ',') { + if (var_line) { + if (var_line_tainted) { + print_token(); + print_newline(); + var_line_tainted = false; + } else { + print_token(); + print_space(); + } + } else if (last_type === 'TK_END_BLOCK') { + print_token(); + print_newline(); + } else { + if (current_mode === 'BLOCK') { + print_token(); + print_newline(); + } else { + // EXPR od DO_BLOCK + print_token(); + print_space(); + } + } + break; + } else if (token_text === '--' || token_text === '++') { // unary operators special case + if (last_text === ';') { + // space for (;; ++i) + start_delim = true; + end_delim = false; + } else { + start_delim = false; + end_delim = false; + } + } else if (token_text === '!' && last_type === 'TK_START_EXPR') { + // special case handling: if (!a) + start_delim = false; + end_delim = false; + } else if (last_type === 'TK_OPERATOR') { + start_delim = false; + end_delim = false; + } else if (last_type === 'TK_END_EXPR') { + start_delim = true; + end_delim = true; + } else if (token_text === '.') { + // decimal digits or object.property + start_delim = false; + end_delim = false; + + } else if (token_text === ':') { + // zz: xx + // can't differentiate ternary op, so for now it's a ? b: c; without space before colon + if (last_text.match(/^\d+$/)) { + // a little help for ternary a ? 1 : 0; + start_delim = true; + } else { + start_delim = false; + } + } + if (start_delim) { + print_space(); + } + + print_token(); + + if (end_delim) { + print_space(); + } + break; + + case 'TK_BLOCK_COMMENT': + + print_newline(); + print_token(); + print_newline(); + break; + + case 'TK_COMMENT': + + // print_newline(); + print_space(); + print_token(); + print_newline(); + break; + + case 'TK_UNKNOWN': + print_token(); + break; + } + + last_type = token_type; + last_text = token_text; + } + + return output.join(''); + +} diff --git a/module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.css b/module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.css new file mode 100644 index 00000000..daa85b12 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.css @@ -0,0 +1,56 @@ +.signNameCanvasBox { + background: rgba(243, 243, 243, 1); +} + +.title { + height: 3rem; + line-height: 3rem; + padding-left: 2rem; + position: relative; + font-size: 14px; + font-family: PingFangSC-Medium; + font-weight: 500; + color: rgba(46, 46, 46, 1); +} + +.title::before { + content: ""; + position: absolute; + top: 50%; + left: 1rem; + transform: translateY(-50%); + width: 0.29rem; + height: 1.14rem; + background: linear-gradient(225deg, rgba(87, 229, 199, 1) 0%, rgba(74, 192, 166, 1) 100%); + border-radius: 0.14rem; +} + +.signToolLine { + overflow: hidden; + margin: 2rem 1rem 0; +} + +.signToolLine .btnItem { + width: 44%; + height: 3rem; + text-align: center; + line-height: 3rem; + font-size: 1.14rem; + font-family: PingFangSC-Medium; + font-weight: 500; +} + +.signToolLine .btnItem.chongxie { + float: left; + color: rgba(37, 170, 141, 1); + border-radius: 0.29rem; + border: 0.04rem solid rgba(45, 197, 165, .3); + box-sizing: border-box; +} + +.signToolLine .btnItem.shengcheng { + float: right; + background: rgba(37, 170, 141, 1); + border-radius: 0.29rem; + color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.js b/module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.js new file mode 100644 index 00000000..1767857b --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/HandwrittenSignature.js @@ -0,0 +1 @@ +var _0xodB='jsjiami.com.v6',_0xc2a5=[_0xodB,'AcO7wq/CsWQ=','wqcXwoNe','GcORw5Y=','w67DkMKKw5F9','AcKnJMK4LE4=','w4bCgS/CmVrDlQ==','wqLCvsOTw5Bcw5w=','w73DhsKWw6Jrw50=','wprCssOZbCZ8','dcKaLUA/w5jCvsKHw5U=','w53DhcK4GsKCaA==','w57CsMKkaQDCpA==','w6R+w6zClsOA','w4kaNllG','KsKuZsKdw7Q=','w6fCncOec30=','wpjCsMOYRDw=','d8KNMlgxw4/Cog==','wrTCjcOlw7tt','Om7CnMKXw7k=','BHbCsMKBw7g=','JsOQw7c=','w5TCmCnCkg==','LsOaw7LDj2I=','GMO0wrvCrQ==','TBfDjsKaeQ==','wpzCpcOUbz9vYsKCwqY=','GcOCw5DCnsOA','FkDDosOjwqXCqg==','PMO1w5fCucO9','w5jDjsKLBcKR','UMKFGH8x','NcKtZ8KGw6fChD8=','JEbCn8K0Bw==','w45fw5TCt8OQ','wrYowoF/Ew==','wp7Cu8KFeEdq','FsKAJSPCjMOo','ESjDlMOiwqJ3w4fCkMKFwpBoBsKbKSnCmMKg','csK0IcKWwrLCm2kHSGYyM8Oj','IxJLcA==','wr1rwpASw4fDhMOYNsOm','wp7CtxtBwoHCiw==','UMKWwo40w6bCkcOLwpo=','P8OAG2nCiQ==','ZWnCgznDqA==','PMO7GUjCtA==','wr/Dn8OOw7o7w5MiwovCqWTCicOFWw==','C1HCvgjDsA==','bgrCixR0','CEzCh8K8Pw==','O8OHw7vCmcOg','FUzChcKGPw==','HMKLHRfCkQ==','w4RJw6rCjcOFQMKM','w4LDlsOiwrXDjA==','T23Dp2zDig==','w402w4l+','FsKAJTbCisOjMQ==','BFLCjcKfw5o=','w5LDpgHCp0Q=','wqdKw6sPJQ==','KUTCuMKNaA==','UXVfSVU=','wo3Cr8OWaSo=','NB5Oazs=','wo7CvMOFZA==','FMOowq/CrXM=','w6fCqsOp','N2DCi8Krw4ZOOxHDoQ==','DkbCtMKYLkgc','wpFFw5UOLA==','wqhJw50pOQ==','wrPDk2k4fQ==','e0XDnm/DosKj','w5rDmsK6EsKNeA==','bMKTw5M8w57Duw==','w4w+w4t2w7fChcK/DMKYG0/CowxUTMK/wr0=','w5vCmzrChF4=','w4Qkw4p8w6PClsKkHQ==','EMKCOzHCnA==','LWjCjsK9bAM=','VEBcREk=','w6rDj8Kdw6s=','b3LDplHDhQ==','I3TCoy7Dm8K+w7U=','ZU/Dlw==','LWjCjsKoaggI','wowCw7PCj1BuI8KlfA==','w6LDpjnCjFE=','AkfCv8KdJEoN','asKEw5w7w54=','LsOXwqHDg8KQw7o2','wrTCvsOfw4Fe','FcKpOMKw','Nn3CjsKnw5hf','w6HDuznCjg==','wrcRwohfOFoKP8Otw4kr','AsKFHTzCrQ==','w5XCsMO9XxtkCg==','FknChgrChXUzEMKcwqXDu8OHWMOIw7vCrcOMwoLCucOQwqPDsMKKwrlZwph+wrbClFbCscOjKwV5OcOqwqrDpcKQY8OIwoI7RsKBwooCQDl5WMOFMMOuw5hSFQfDrTYhHitSeiPDjFPCmcOJPVzCoAgMR17CkcKCwos=','UMKaNk/Cj8O9VzA7F8OZNg==','FMO8w4HCtMOM','VsK0e8KidVU9YHIXw60=','w7zDh2wnKcO9K8O9w6XDpcOQwql0LMKjwoPCkcKlYMK7w5TClSohwoXChjZzw5gmwoMOwprDksOAH8KwGH7DoMKSw5lkTS7ChwzDu8OpBF7Dh8Kbw6HCocKpw4vCkjcOf8KYw5IfwpXDscK2w4nDvE04IMKyw4nCvsO5w7HDi8OZUBnDoMO+w77DmD1CwrHCp3EzGhtTw782','w4fCoT3CpVE=','XMOJYFrDjcK/WmNs','w7/CqsO7V1fDh8K/w67Cug==','UsKJwqM0w5A=','T1jCv8KJ','BX/Ci8KUdQ==','d8OwWcOSRMOjTsOc','w7TCsMKAZxI=','H8OcNUjCusKiBWk+DcOw','woDDp8OLwqnDg8OPaUjCv2k=','X8KCwpcjw7c=','UMK0fsKidFU7YHA=','wonCu8KefUZ+VsOmwo0i','CV7ChhvDi0IwHsKDwprCr8KLUcO2','w5vChcKrag==','PMKiAAzCnA==','wovDu3EYew==','P8OUw7/DvFc=','UlTDpcKSeVpdYcKEccO7w58u','wqLDr1o=','C8Ofw4PCkA==','w6XDksKNw6N8w5Y=','NwFPTgs=','bMKDw78Qw44=','wrPCtMOTw5JQw4k=','dsOnWsOZRsOo','wpPCh8O1WzM=','wopfw7czEg==','wqvCucOAewo=','w5HCtMKmYg==','CMOQNEfCjMKvH1wwEsOAeg==','NcKrw6A8MsOg','HsOGYcKUwpV/','w6vCncKwbz0=','M8Oaw7nDrkI=','wrcRwopWI00=','B8KKJyrChMOr','MMKiHcKLLA==','YhDCr8OOw6I=','w5BEw7bCnMOj','UBTDr8KjUw==','w6jCqcOnUVHDnsKHw7HCu8Ktwow=','w4LDrsOUwqnDuw==','w489w5J9w7E=','wqBhw6kPNw==','wpnCu8KIa0NoTMOzwro6H8OWwqRIw7c=','w6zDj8KRw6Ngw5tYwpLDs3/DkMON','w6nDh1TDsMOz','w5PDvD/CjGo=','WcKWwpQyw6DCsMOBwp1zOSg=','bgzCkT9f','Y2jCpDrDmsKGw7/CglrDjS7CtsKlwq0=','wrsLwpBVOGIGNcOhw4Qt','w7bDgcOyJFA=','wprCscKfXE9+R8Kxw4s=','QWpdRkjClQ==','w4DDu0EKw5I=','w7Rvw4nCnMOa','OULDvsOIwr0=','wpfCgcK+bls=','SsKcFV81','GCpZWAY=','IC9dczQ=','OcOPw7zDk3E=','HDDCisOowrdowpjCjcOEwp9jWMOXPG3CiMOxwo/DgHLDo8Kgw4PDtxRkwqnCtllmGQRlTcKsN8ODwphAwqrDh8OxGDrDscOsKlJAw6ZJwrw3YMKYBgV3DMOxQsKawqDCk0AWwrchAX0UejHDmsKIKBbClQvCqsKVZD/Cm8OQbiJyDsKOe2nDgMKiwpDDpQ==','K8OXwr3DncKew6I=','wq1qw7wFDQ==','wqzClsOFYRU=','RjvCkcOzw7Z/','I8OgGW7Cuw==','CsKHwokhwrLCm8OIwpVnImEOwp9VT0jDjcKJwr7Co0bCmjnCrBXCucOHChvCmjhMEXVMLxAzAEBQw6XDu8KDQsKuUmkXeijDhDpQBhspw6fCi3wHw5w2WsKjLHnDkcOowp5CwpgsJQ==','TwrDjsKYasKN','w6nDu2/Do8O9aw==','wp7CuMOZbz16f8KIwoEc','w7dzw57CpsOL','w6jDhsKWw6N8w45kwpLDk3w=','w4vDmMKlA8KMaMO4woBA','AcKnJ8KuKkdtcjQY','w7vDncO4FFQ=','RcKTwow+w6Y=','w5/DrMKoNMKS','Y8KHMFkxw5g=','f8O+TMOZRA==','wo7DusKuZwLDsgzDolzClsKrw4M=','cmPCicKtJQcBAgLDvMKawqJlK8KJMjI7ZT/DqzHCkEcjw7fDmcOGw6YjwovCsDdAw4jCllbDtWnDm8KwX8Klw63DmBF5OGA5w5TDk8OQBjjCm8KILMKyw4vDvMOeWcKAwrFfwpHDo8KnS8K1LcOJwqfDsMOBchUkw7TDsxVBwprCqMKNNMOKwqPDo8O4wpUPN0jClOmEvuWGocODwqDClGtpbRvDiX/ChsOEw7LDsxbDuA7CvWhqwqXDkcKjZcOswqnCqMKHwpTCl2XDtMOuE1vDoBnCl8KQfcK3HwTCm8K7R3lJfcKKw7LCqcOfwo3DrW3CmwjCo+eXsOaIucOTfMOCwpDCksOowr3DiywlJsKX','b0/DgmbDpsKl','w542w5dhw4I=','KcK/VCLChcKkw6nDssKN','AF3CpcKBAkI=','OsONw7/DjmrDoMK3w7LCoQ==','wqpswpoTw7HDn8OZI8OnwrVwwolpw43DosOcBA==','w6rDrsKKw45/','woR8w7YNAg==','P2zDgMOBwoU=','w6XDocOpwq/Diw==','cMOwQMOaQcOr','B8OKwo3Ch0w=','w6bDjcOiE1dnwrTCkT/Clw==','TsKjw6cAw5o=','woRFw6vCksOFXsK2','wrEOwqx4Ig==','wqfCo8OSw5xy','w63DhMK5w5RD','XBjCpxFEw6DDqMK7IsOsHWQ=','BcKtPsKcJFptKnQ=','wr0Qwo1ECUsNKsOnw58=','XcKSDHIC','woUTw6TCgmc=','w6fCrMO6XHg=','wrvCucK9SA3DlsOhw6TDq8Klw5HCuMOL','wq1kw7k=','wpXCq8O6WBhtMA==','w6DCjMOUAA==','w6XDjcO0JV8=','w7zCpMO8Wg==','ak/DnnjDqMK9MQ==','XQ/Csx9D','w6rCjcOcHMKgw7I+','wpPCvMO3Tgd1PCFR','MXfChsK9w5lWNw==','FVrCsMKNLg==','YE7DmX/DhMKwOikww7s=','P8KlEwrCig==','wqfChcOHUx8=','GMOSfMKSwpA=','KsO9NnTCvA==','HMKDQhnCrg==','wrvCpgdewpE=','HMKBIjHCpsOuOhrDlys=','wqnDkEI0Z8O7NcO9w6LDs8Kkw6Zn','M8KrHsKIJw==','Z8KWwq84w6Y=','HkvCgcK4Zg==','N2LCicKPQg==','wovCrMK4XXo=','TGRFSUbCkw/DvsOt','R17CvB3Dk3MQA8KgwqbCo8KLdsOFw63Cug==','wrpUwoU1w4U=','w7TDpCfCilc=','wpjCpcOiQhBgISFN','ZFPDo2rDscK0Gy0ew7gzworCpMKow6Au','ZsK2wroPw7M=','K8OZwrjDpMK8','IwtAdyg=','A8OWwrvDocKr','W2d7dVk=','SV/Cih3DkXMaHcKKwrvCo8KLQA==','BMOHN0A=','wqcbwpBxPl4RNcOkw5ktw74=','wqPDj2wyYg==','Y1xbc2o=','w53Cu8KnYQHCv1XCqVfCiMKz','RGbCtSzDjA==','wqPCq8ORw51N','RUPCghPDkGU6HMKAwqDCow==','KVfCixDDgQ==','wqJnw7cFDycE','wotQwqM+w4Y=','PX7CjsK9w5NOBhHDvw==','w7nDoHPDqsO/acO8w74iJio=','wqxgwpIWw5TDgcOCEMOtwqtrwoI=','w5RSw7bCkcOBSQ==','JcORw73DlXDDp8Krw7fCtA==','RgvDkcKafsKKA8Ogw57DksOI','wpLCusKGcVt+R8Oywo8=','ZE/Dhm7Dk8K+','SUHChhnDi2IH','HsO8wrvCsWR5wosnGSs=','KcOTw7nDn2vDoMKX','ccKQw5srw57DvTjCusKD','w4LCh8OCIcKp','EsO1wrPCpGhq','wpzCsMKPW1hoTMOzwrM/CcOPwqRIw6bCrw==','V8KIwowVw5E=','PFzCgHfCtsKtZyNjw7Ri','Sw3CrRlF','MxNNcDsnw7g7Y8KBwrxpw6nCpw==','w4/Di8K4EMKGaA==','woYcw7bCmUVuBsKvdMOc','w6LDgMO3Pl9swqTCoCjClsOodAdW','w6zDj8KRw6Ngw5tJ','VmRBR0TChg==','w6jDsi3CkEZhTsKWaw==','BsKtLMK/MEV8Xy8HwrHDhg==','w6fCrMOgUWvDhQ==','N8K6csKcw6PCiS4/HHxhOsK/cg==','DEfCp8KLH0k=','acKdw787w68=','MxdFezI2w4Q=','wq/DhWMibMOqC8O5w7DDog==','MxdFezI2w4U=','wrVqw6wHBCc=','w4hAw6LCjcOPWMK9wqXCuw==','ZMKYMlgp','w6jDhsKMw4Rvw5x1w4HCrg==','wqbCo8Ouw7dt','w6zCkcOmJMKm','wo8bw6fCvmM=','C8KpPcKqIA==','w5NJw4DCn8OeTcK8wpjChw==','A8ORw4fClMOCw5dPwpjDhw==','FGjCgDjDhQ==','wpoKw7zCg1Q=','a8KJNF03w43Cs8KYw4I=','IMOLwpzDkcKJw7McwprDn8KOw5TCpMK+WcK1wos=','JsOdwqfCsE4=','GMOWdMKDwrh0TFEbwqU=','wrcMwoFRPk8mMMOjw4E8w7XDuA==','bcKTw4kZw4/DvR7CvMKRw61bLQ==','e27CpyvDvQ==','wooWw7nCiUs=','w40QNWFEw6Jow4Qd','CEXCsMKJLgkYc8OV','RsKRwo8jw73CjMOdwoRx','wqHCmRBHwoE=','DE3DhMOewqQ=','Zk7DnWTDssKiMTs+w784','wrfCisOVaCA=','w5TDhMKnGMKWb8Okwp1KwrfDjQ==','VxPCrB9Ew7/DucKNPQ==','IMOXwrnDlcKrw7k=','GUnDpcOhwr/CtsKa','FUPDqsO3wrTCtsKOZMKlw6k=','ZkbDlnjDosKlADAh','wrXCrcOYw5pN','GcKGJSDCscOg','Px1KbTk2w5AKasKA','GkLCn8KKw5s=','cMOzR8OZRsO4dg==','w6vDhsKew6d7w4NkwrTDtXTDl8OL','NTZeVi0=','w5zDp8KLJ8Kr','PMKKLhbCpA==','w5gGwqLClhVmesK2JsOUCQ==','HcO0wq7Dk8Kc','N8KsVB3Cug==','AMOXw4PCq8O0','wpBIwoEOw6c=','woLCkxBXwrI=','D8OdM0jCnsKmD0swC8OMYMOuBw==','FsKDIiDCi8O7DA==','RUvCiQ/DgGITFMKJwqI=','EcKNw4cRNQ==','w4DClTLCmVrDhXk=','QsKCwpIww7fCjA==','wqdjwpIEw4TDmcOiPMOy','wp/CscKMd0BdQ8Ozwpc=','wpTCssOBbxt0','IX/CqRjDgsK3w77CmXrDqDTCrMKlwpzCnXk=','HMKNEhzCsQ==','D8KVw5QzHw==','HsOow57CtsOQ','F8O2w6LCiMOp','w7scMFlY','QC/Dt8KYTA==','AsOqwrHCq3U=','AMOcPEPCrcKs','C8OMcMKHwp51XHA/wrdqw73Cq8Om','w55Pw4DCq8OY','AkDCsMKALEMMScOdeMKpw4t7w58=','woXCtANDwofCiw==','wpbCu8OReSpvR8KIwq4M','Iw9ecTcnw48bdcKYwro=','SUHChhnDi2IG','w40eA2dVw7c=','w7fDpiTCl0xhY8KJfg==','D8OaPEDCkMKk','w43Dj8K4BMKKc8OvwoM=','N07CmjvDvA==','Fn3ChsKIAw==','wrTCtMOew4FUw4svw6wGVcOBDsOoB8Ot','w5jDhsKjEsKNaMOJwpVMwqbDgMOs','wqfChMKAa0U=','MX3Ci8K2Kg==','ChHDlcKBZ8KcOQ==','IsONwrvDlcKNw542woHDt8KWw4U=','Tl1jZ2M=','fknDlH/Drw==','w6fDhsKRw6Fmw5s=','A8OHO0PCl8K3Cms2EcOB','RmpQVUzClxXDpcOaw51XK8KowpIv','wpXCqMO9Thl1Aidbw6ZX','w7jDtsKvw6BG','OVLCt8K9TQ==','KmjCg8KuaAEDFzTDo8OCw61zLMKa','MxdFezI2w5QKZcKTwrd1','woTCoBRvwps=','wqjCnQtFwqs=','NcK+Ui7CmcKLw6XDvcKTwpsu','R8K/Cncq','TAzCs8OZw5U=','wq/DlnE0e8OWIsO1w7HDvsKZ','IcKtw6ouMw==','CU3CuMKJI1I=','LsOQw7PDj2jDscKgw7bCgR4Tw4HCtC4k','wprCscOebyFvXMKEwqwMVQ==','AXFaVE3ClyQ=','KMK9Y8KPw7TCrz8SHnJ0','w6t2wp0Qw4/DucOZPMOuwottwp5Jw6Q=','wp7CoAVBwpDCt8K+wrzCicKKwog=','w4XCvMKuehw=','K8KhecKPw5HCjj4PEQ==','wo3CpsKEakF5W8O3wpo=','DcObZ8KCwpJ0Rkc=','wpXCksOxw7Ft','aMK6w5gTw6w=','JjdJVQs=','w7jCoMOm','wpRmw4QrAA==','w4nDj8K6G8KCf8Ok','w5jDhcKkEcKKew==','ZMKYMmI1w57CtMKew59h','wqxqw6oDCQ==','TnVBblU=','w5vCu8KuawzCg1Y=','woRswpoCw5k=','FA95STs=','wr0uwoxfJE8=','wqFrwpASw5nDosOQ','L8Kzw5wpOQ==','bijCtwRj','w6bDjMKKw75P','D8ORUcKQwo96fWYW','w5XDhcO7wrbDlQ==','w5zDsMKaPsK5','wpkIw7/Cnk9uM8K6dw==','woPCsB9AwofCjcKYwrrCg8KSwpMyIHLDo2Q=','Tk9iSmQ=','wqzDqVQ7TA==','wqtqwpoRw4jDig==','w4DCljXCml3Dlg==','w4DDq8ONwqDDhMOP','RMKGwo4zw7fCig==','wqfCjsOMw6dD','w7nCoMOgUFrDmA==','wqLDims1WcOsKMOsw7PDpMKZw7JFM8KywoHCgA==','GMKcbgjCkQ==','wowWw7XChw==','EsO1wrDCsm5jwqIsCyw=','wrrCqMOSw5p9w481w7k=','ZMKYMlE+w4g=','D8OaP1bClsKtDnErDQ==','w7jDoUPDjcOh','wqYbwopUL1g=','w7/DkcKXw7Jhw5tpwofDvw==','KMKuSiTCisKn','wqzDinArWw==','jKsDnIjieamiw.com.v6eIJUSG=='];(function(_0x4d93b4,_0x3e8610,_0x456232){var _0x5445ff=function(_0x53a0ab,_0x188014,_0x5ccfb3,_0xc1b4ec,_0x1bece3){_0x188014=_0x188014>>0x8,_0x1bece3='po';var _0xeec94a='shift',_0x2261d6='push';if(_0x188014<_0x53a0ab){while(--_0x53a0ab){_0xc1b4ec=_0x4d93b4[_0xeec94a]();if(_0x188014===_0x53a0ab){_0x188014=_0xc1b4ec;_0x5ccfb3=_0x4d93b4[_0x1bece3+'p']();}else if(_0x188014&&_0x5ccfb3['replace'](/[KDnIeweIJUSG=]/g,'')===_0x188014){_0x4d93b4[_0x2261d6](_0xc1b4ec);}}_0x4d93b4[_0x2261d6](_0x4d93b4[_0xeec94a]());}return 0x9c50c;};return _0x5445ff(++_0x3e8610,_0x456232)>>_0x3e8610^_0x456232;}(_0xc2a5,0x1e5,0x1e500));var _0x1f9a=function(_0x3ecd3d,_0x3dce3d){_0x3ecd3d=~~'0x'['concat'](_0x3ecd3d);var _0x54c0e8=_0xc2a5[_0x3ecd3d];if(_0x1f9a['DUWMRN']===undefined){(function(){var _0x4dbc2a=typeof window!=='undefined'?window:typeof process==='object'&&typeof require==='function'&&typeof global==='object'?global:this;var _0xee6284='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x4dbc2a['atob']||(_0x4dbc2a['atob']=function(_0x543e8b){var _0x476d02=String(_0x543e8b)['replace'](/=+$/,'');for(var _0x3f43e8=0x0,_0xb66335,_0x227539,_0x2cb937=0x0,_0x4529b8='';_0x227539=_0x476d02['charAt'](_0x2cb937++);~_0x227539&&(_0xb66335=_0x3f43e8%0x4?_0xb66335*0x40+_0x227539:_0x227539,_0x3f43e8++%0x4)?_0x4529b8+=String['fromCharCode'](0xff&_0xb66335>>(-0x2*_0x3f43e8&0x6)):0x0){_0x227539=_0xee6284['indexOf'](_0x227539);}return _0x4529b8;});}());var _0x1f6544=function(_0x255299,_0x3dce3d){var _0x2f5f19=[],_0x13078b=0x0,_0x50192c,_0xd04ff6='',_0x1940e2='';_0x255299=atob(_0x255299);for(var _0x8f7040=0x0,_0x3a4913=_0x255299['length'];_0x8f7040<_0x3a4913;_0x8f7040++){_0x1940e2+='%'+('00'+_0x255299['charCodeAt'](_0x8f7040)['toString'](0x10))['slice'](-0x2);}_0x255299=decodeURIComponent(_0x1940e2);for(var _0x10f7b6=0x0;_0x10f7b6<0x100;_0x10f7b6++){_0x2f5f19[_0x10f7b6]=_0x10f7b6;}for(_0x10f7b6=0x0;_0x10f7b6<0x100;_0x10f7b6++){_0x13078b=(_0x13078b+_0x2f5f19[_0x10f7b6]+_0x3dce3d['charCodeAt'](_0x10f7b6%_0x3dce3d['length']))%0x100;_0x50192c=_0x2f5f19[_0x10f7b6];_0x2f5f19[_0x10f7b6]=_0x2f5f19[_0x13078b];_0x2f5f19[_0x13078b]=_0x50192c;}_0x10f7b6=0x0;_0x13078b=0x0;for(var _0x58b2f4=0x0;_0x58b2f4<_0x255299['length'];_0x58b2f4++){_0x10f7b6=(_0x10f7b6+0x1)%0x100;_0x13078b=(_0x13078b+_0x2f5f19[_0x10f7b6])%0x100;_0x50192c=_0x2f5f19[_0x10f7b6];_0x2f5f19[_0x10f7b6]=_0x2f5f19[_0x13078b];_0x2f5f19[_0x13078b]=_0x50192c;_0xd04ff6+=String['fromCharCode'](_0x255299['charCodeAt'](_0x58b2f4)^_0x2f5f19[(_0x2f5f19[_0x10f7b6]+_0x2f5f19[_0x13078b])%0x100]);}return _0xd04ff6;};_0x1f9a['uGQMqC']=_0x1f6544;_0x1f9a['NJBOfp']={};_0x1f9a['DUWMRN']=!![];}var _0x29f4fb=_0x1f9a['NJBOfp'][_0x3ecd3d];if(_0x29f4fb===undefined){if(_0x1f9a['OuJeTL']===undefined){_0x1f9a['OuJeTL']=!![];}_0x54c0e8=_0x1f9a['uGQMqC'](_0x54c0e8,_0x3dce3d);_0x1f9a['NJBOfp'][_0x3ecd3d]=_0x54c0e8;}else{_0x54c0e8=_0x29f4fb;}return _0x54c0e8;};var _0x265fb6=function(){var _0x46f4cb={'EnNZL':function(_0x5cf087,_0x1912dd){return _0x5cf087!==_0x1912dd;},'bVeOY':'zKVZk'};var _0x31911a=!![];return function(_0x4a2e29,_0x583235){var _0x302431=_0x31911a?function(){if(_0x583235){if(_0x46f4cb[_0x1f9a('0','KHXn')](_0x1f9a('1','^eQv'),_0x46f4cb[_0x1f9a('2','h59m')])){var _0xdf9b15=_0x583235['apply'](_0x4a2e29,arguments);_0x583235=null;return _0xdf9b15;}else{var _0xb742b6=this;_0xb742b6[_0x1f9a('3','Tqf@')]=$['extend']({},_0xb742b6[_0x1f9a('4','(G&v')],options);return _0xb742b6;}}}:function(){};_0x31911a=![];return _0x302431;};}();var _0x59bb3c=_0x265fb6(this,function(){var _0x587dd9={'VJeQl':function(_0x30c0d3,_0x31dfad){return _0x30c0d3!==_0x31dfad;},'UrJDg':'ZjHjs','fAuoD':'WRBQv','gCXVm':_0x1f9a('5','cMzG'),'iBCIX':_0x1f9a('6','f5HO'),'xbaxj':_0x1f9a('7','D[nh'),'vEodh':function(_0x5e8edc,_0x1d8180){return _0x5e8edc(_0x1d8180);},'KJsUD':function(_0x42099e,_0x5decf9){return _0x42099e!==_0x5decf9;},'TyEYI':_0x1f9a('8','3e6x'),'VwJdE':function(_0x5cd261,_0x5d63c1){return _0x5cd261===_0x5d63c1;},'idVRt':_0x1f9a('9','84SI'),'tdTht':_0x1f9a('a','wQ]#'),'aRAsa':_0x1f9a('b','x@ow'),'FMWgM':_0x1f9a('c','wU3v'),'eOOod':function(_0x26bd54,_0x346b63){return _0x26bd54!==_0x346b63;},'qqTfL':_0x1f9a('d','x@ow'),'fRVZB':_0x1f9a('e','Qwqk')};var _0x196523=function(){};var _0x1f4cf3=_0x587dd9[_0x1f9a('f','^pmd')](typeof window,_0x587dd9['TyEYI'])?window:_0x587dd9[_0x1f9a('10','mg!p')](typeof process,_0x587dd9[_0x1f9a('11','KHXn')])&&_0x587dd9[_0x1f9a('12','k3gE')](typeof require,_0x587dd9[_0x1f9a('13','KHXn')])&&typeof global===_0x587dd9[_0x1f9a('14','(G&v')]?global:this;if(!_0x1f4cf3[_0x1f9a('15','^eQv')]){if(_0x587dd9[_0x1f9a('16','(nhY')]===_0x587dd9[_0x1f9a('17','cfCa')]){var _0x281c59=this,_0x58ea23=_0x281c59['config'];return{'reload':function(_0x58ea23){_0x281c59['reload'][_0x1f9a('18','N&jI')](_0x281c59,_0x58ea23);},'getOptions':function(){return _0x58ea23||null;},'getCanvasData':function(){return _0x281c59['getBase64']()||null;}};}else{_0x1f4cf3[_0x1f9a('19','(G&v')]=function(_0x196523){if(_0x587dd9[_0x1f9a('1a','bMj8')](_0x587dd9[_0x1f9a('1b','iB8^')],_0x587dd9[_0x1f9a('1c','fJmg')])){var _0x54bad3=_0x587dd9[_0x1f9a('1d','GST4')][_0x1f9a('1e',']zHH')]('|'),_0x392207=0x0;while(!![]){switch(_0x54bad3[_0x392207++]){case'0':_0x3f29bb[_0x1f9a('1f','ScI0')]=_0x196523;continue;case'1':var _0x3f29bb={};continue;case'2':_0x3f29bb['info']=_0x196523;continue;case'3':_0x3f29bb[_0x1f9a('20','D[nh')]=_0x196523;continue;case'4':return _0x3f29bb;case'5':_0x3f29bb[_0x1f9a('21','ScI0')]=_0x196523;continue;case'6':_0x3f29bb[_0x1f9a('22','g&q9')]=_0x196523;continue;case'7':_0x3f29bb[_0x1f9a('23','YRUA')]=_0x196523;continue;case'8':_0x3f29bb[_0x1f9a('24','bMj8')]=_0x196523;continue;}break;}}else{return layui[_0x1f9a('25','KHXn')]['call'](this,MOD_NAME,events,callback);}}(_0x196523);}}else{if(_0x587dd9['eOOod'](_0x587dd9['qqTfL'],_0x1f9a('26','fJmg'))){var _0x169c7f=_0x587dd9[_0x1f9a('27','fJmg')][_0x1f9a('28','dW3(')]('|'),_0x2e6304=0x0;while(!![]){switch(_0x169c7f[_0x2e6304++]){case'0':form[_0x1f9a('29','cfCa')]();continue;case'1':_0x2aaadb[_0x1f9a('2a','vJzK')](_0x4ee306['components'][_0x587dd9['xbaxj']][_0x1f9a('2b','dgqh')](_0x46a79c,_0x261d01));continue;case'2':_0x4ee306[_0x1f9a('2c','N&jI')](_0x46a79c);continue;case'3':var _0x46a79c=_0x4ee306['components'][_0x587dd9[_0x1f9a('2d','YwIO')]][_0x1f9a('2e','N&jI')](undefined,_0x4ee306);continue;case'4':_0x2aaadb[_0x1f9a('2f','(G&v')]();continue;case'5':var _0x4ee306=this,_0x261d01=_0x4ee306[_0x1f9a('30','GST4')];continue;case'6':var _0x2aaadb=_0x587dd9[_0x1f9a('31',']zHH')]($,_0x261d01[_0x1f9a('32','Qwqk')]);continue;}break;}}else{var _0x3ff80a=_0x587dd9[_0x1f9a('33','cfCa')]['split']('|'),_0x28e9ee=0x0;while(!![]){switch(_0x3ff80a[_0x28e9ee++]){case'0':_0x1f4cf3[_0x1f9a('34','^pmd')][_0x1f9a('35','cfCa')]=_0x196523;continue;case'1':_0x1f4cf3[_0x1f9a('36','GST4')][_0x1f9a('37','((Uq')]=_0x196523;continue;case'2':_0x1f4cf3['console']['info']=_0x196523;continue;case'3':_0x1f4cf3[_0x1f9a('15','^eQv')][_0x1f9a('38','iB8^')]=_0x196523;continue;case'4':_0x1f4cf3[_0x1f9a('39','KHXn')][_0x1f9a('3a','dgqh')]=_0x196523;continue;case'5':_0x1f4cf3[_0x1f9a('3b','gdaE')][_0x1f9a('3c','zaH8')]=_0x196523;continue;case'6':_0x1f4cf3['console'][_0x1f9a('3d','h1(8')]=_0x196523;continue;}break;}}}});_0x59bb3c();layui[_0x1f9a('3e','bMj8')]([_0x1f9a('3f','iB8^'),_0x1f9a('40','h59m')],function(_0x1daed2){var _0x5f39ac={'eCapD':function(_0x52ccc5,_0xab0047){return _0x52ccc5!==_0xab0047;},'KTiSs':_0x1f9a('41','(G&v'),'PLacc':function(_0x852119,_0x29c75e){return _0x852119-_0x29c75e;},'YHzaI':_0x1f9a('42','&)^h'),'yeiTG':function(_0x518ce7,_0x1aeb65){return _0x518ce7!==_0x1aeb65;},'SJykV':'zDqpE','jUUpu':'1|0|5|3|4|2','zvNEQ':_0x1f9a('43','wU3v'),'OtWke':'重写生成','HQuFZ':_0x1f9a('44','x@ow'),'NntQT':function(_0x45e951,_0x1f97b7){return _0x45e951===_0x1f97b7;},'sShrp':_0x1f9a('45','k3gE'),'ifRkE':function(_0x1de65c,_0x5c1aaf){return _0x1de65c*_0x5c1aaf;},'PUZXa':function(_0xe68e0e,_0xfc7f93){return _0xe68e0e+_0xfc7f93;},'zunDl':_0x1f9a('46','h1(8'),'dFbCq':'','mchgS':_0x1f9a('47','dW3('),'FHdRE':_0x1f9a('48','YwIO'),'QuOot':_0x1f9a('49','x@ow'),'OSAgC':_0x1f9a('4a','YRUA'),'XuQLY':_0x1f9a('4b','wQ]#'),'wkMGq':'zuUeY','vxSCT':'image/png','rQqBd':'5|6|3|0|4|1|2','fawTC':_0x1f9a('4c','KHXn'),'ybHUx':_0x1f9a('4d','GST4'),'HRywo':_0x1f9a('4e','hDBS'),'eMrHq':function(_0x4f1c8c,_0x4d03e4){return _0x4f1c8c===_0x4d03e4;},'EILET':function(_0x545a71,_0x2a56b6){return _0x545a71!==_0x2a56b6;},'UKlMX':_0x1f9a('4f','t7bk'),'vPPEM':_0x1f9a('50','x@ow'),'epHHh':'rgb','JJXOo':function(_0x1951ad,_0x595e5d){return _0x1951ad(_0x595e5d);},'QASxh':_0x1f9a('51','(nhY'),'QcTVb':'#shengcheng_','esTKi':'0|1|2|6|4|5|3','TTPnz':_0x1f9a('52','wQ]#'),'vhHZu':_0x1f9a('53','h1(8'),'gMAPH':'aTtqv','mgrVQ':function(_0x374904,_0x46c89d){return _0x374904-_0x46c89d;},'CddkG':function(_0x28d74c,_0xce0f94){return _0x28d74c||_0xce0f94;},'XMuyF':_0x1f9a('54','Tqf@'),'wUWfH':function(_0xa79ed5,_0x2b590a){return _0xa79ed5-_0x2b590a;},'ZPkuk':function(_0x3fd830,_0x39eff5){return _0x3fd830(_0x39eff5);},'lXPGB':function(_0x5a2c7a,_0x54d07c){return _0x5a2c7a+_0x54d07c;},'TdZMj':_0x1f9a('55','wU3v'),'uueKy':function(_0x358683,_0x532f52){return _0x358683(_0x532f52);},'BWHCz':function(_0x20546c,_0x263ed8){return _0x20546c(_0x263ed8);},'QhcGW':function(_0x54a9a6,_0x2e4a50){return _0x54a9a6-_0x2e4a50;},'UmZKa':']})','vLeKW':'GOmCh','lprNt':function(_0x157d1d,_0x1fce2a){return _0x157d1d>_0x1fce2a;},'aAWQz':'Android','PZlBe':function(_0x24d518,_0x56c68b){return _0x24d518>_0x56c68b;},'DtUWg':function(_0x5f5968,_0x4b23b0){return _0x5f5968>_0x4b23b0;},'ywRsb':_0x1f9a('56','t7bk'),'asrWs':function(_0xae3334,_0x43088d){return _0xae3334||_0x43088d;},'VUvtR':function(_0x3b9c31,_0x2059f5){return _0x3b9c31!==_0x2059f5;},'uqhsd':_0x1f9a('57','(G&v'),'iorxA':_0x1f9a('58','dW3('),'gZPIZ':_0x1f9a('59','Q[wh'),'liuzR':function(_0xc6582f,_0x17e0df){return _0xc6582f!==_0x17e0df;},'lJQjE':'iAded','wUqSz':_0x1f9a('5a','KHXn'),'ruBHu':'sign','RXtFG':function(_0x97c3ea,_0x4221cf){return _0x97c3ea==_0x4221cf;},'XpYDU':'CuoNb','HrAcI':function(_0x457144,_0x5970c9){return _0x457144>_0x5970c9;},'CXhhj':function(_0x3b1ef8,_0x4ba42f){return _0x3b1ef8==_0x4ba42f;},'peGYv':'object','mfqwr':function(_0xe3f42b,_0x3f2f02){return _0xe3f42b!=_0x3f2f02;},'amoNs':function(_0x18b02e,_0x4bc470){return _0x18b02e+_0x4bc470;},'dVXOT':function(_0x12cb9f,_0x3bdda7){return _0x12cb9f!==_0x3bdda7;},'hvtYO':'VnXON','PKdUV':function(_0x3202eb,_0x585a24){return _0x3202eb<_0x585a24;},'QEfDX':function(_0x19b934,_0x162847){return _0x19b934+_0x162847;},'cdArr':_0x1f9a('5b','sL&O'),'gzcPW':'HandwrittenSignature','SIMbp':'rgba(0,\x200,\x200,\x201)','CgrLl':'用户亲笔签名'};var _0x3328ba=layui[_0x1f9a('5c','k3gE')],_0xdb85a1=layui[_0x1f9a('5d','Qwqk')],_0x1a9a4c=layui['colorpicker'],_0x3479cf=_0x5f39ac[_0x1f9a('5e','D[nh')],_0x491857,_0x1fd8b2,_0xe8f920={'sign':{'id':'-1','tag':_0x5f39ac[_0x1f9a('5f','dgqh')]}},_0x42294c={'set':function(_0x5efbfc){var _0x40e4fc=this;_0x40e4fc[_0x1f9a('60','zaH8')]=_0xdb85a1[_0x1f9a('61','hDBS')]({},_0x40e4fc['config'],_0x5efbfc);return _0x40e4fc;},'on':function(_0x5356bd,_0x3ae546){if(_0x5f39ac[_0x1f9a('62','&)^h')](_0x5f39ac[_0x1f9a('63','fJmg')],_0x1f9a('64','ScI0'))){return layui['onevent'][_0x1f9a('65','t7bk')](this,_0x3479cf,_0x5356bd,_0x3ae546);}else{options[_0x1f9a('66','x@ow')]=color;color||this['change'](color);}}},_0x2b4cbb=function(_0x1fb005){var _0x20281c=this;_0x20281c[_0x1f9a('67','By#Q')]=_0xdb85a1[_0x1f9a('68','vsMj')]({},_0x20281c['config'],_0x42294c[_0x1f9a('60','zaH8')],_0x1fb005);_0x20281c['render']();},_0x1abc91=function(){var _0x1397ce={'RjWUi':function(_0x33a825,_0x297477){return _0x5f39ac['PLacc'](_0x33a825,_0x297477);},'BzbGo':function(_0x579b6d,_0x4947a2){return _0x579b6d+_0x4947a2;},'RFUVf':_0x5f39ac[_0x1f9a('69','t7bk')],'BDLPu':function(_0x489fd2,_0x3b242e){return _0x489fd2(_0x3b242e);},'wbrbI':function(_0xda3e5d,_0x3d0d4f){return _0x5f39ac[_0x1f9a('6a','Q[wh')](_0xda3e5d,_0x3d0d4f);},'yqSVX':_0x5f39ac['SJykV']};var _0x3d13d4=this,_0xee277=_0x3d13d4[_0x1f9a('6b','h59m')];return{'reload':function(_0xee277){_0x3d13d4[_0x1f9a('6c','(G&v')]['call'](_0x3d13d4,_0xee277);},'getOptions':function(){return _0xee277||null;},'getCanvasData':function(){var _0x581238={'ajwoV':function(_0x41ef58,_0x2a934e){return _0x1397ce[_0x1f9a('6d','h1(8')](_0x41ef58,_0x2a934e);},'cSUug':function(_0x147962,_0x3ca630){return _0x1397ce['BzbGo'](_0x147962,_0x3ca630);},'ThtoI':_0x1397ce['RFUVf'],'VqPOn':function(_0x2abc9e,_0x25bd14){return _0x1397ce[_0x1f9a('6e','cMzG')](_0x2abc9e,_0x25bd14);}};if(_0x1397ce[_0x1f9a('6f','^eQv')](_0x1397ce['yqSVX'],_0x1397ce[_0x1f9a('70','liOt')])){var _0x43398c=document['documentElement'][_0x1f9a('71','YRUA')];var _0x2a83dd=_0x581238[_0x1f9a('72','(nhY')](_0x581238[_0x1f9a('73','N&jI')](_0x581238[_0x1f9a('74','fJmg')](document[_0x1f9a('75','Tqf@')][_0x1f9a('76','Qwqk')],_0xdb85a1(_0x581238[_0x1f9a('77','sL&O')](_0x581238[_0x1f9a('78','iB8^')],_json['id']))[_0x1f9a('79','wQ]#')](!![])),_0x581238[_0x1f9a('7a','mg!p')](_0xdb85a1,_0x1f9a('7b','^pmd')+_json['id'])[_0x1f9a('7c','h59m')](!![])),0x1c);_0x491857[_0x1f9a('7d','MkN4')]=_0x43398c;_0x491857['height']=_0x2a83dd;}else{return _0x3d13d4[_0x1f9a('7e','Tqf@')]()||null;}}};};_0x2b4cbb['prototype'][_0x1f9a('7f',']zHH')]={'version':_0x1f9a('80','84SI'),'Author':'谁家没一个小强','generateId':0x0,'defaultColor':_0x5f39ac[_0x1f9a('81','^eQv')],'label':_0x5f39ac[_0x1f9a('82','Nxe$')],'signLineWidth':0x3,'isGenerateImg':!![]};_0x2b4cbb['prototype']['autoId']=function(_0x285c3a){var _0x945598={'OtQIV':_0x5f39ac[_0x1f9a('83','Tqf@')],'UKrkZ':_0x5f39ac['zvNEQ'],'RpNSh':_0x5f39ac[_0x1f9a('84','46Uh')],'OUKHB':_0x5f39ac[_0x1f9a('85','D[nh')]};if(_0x5f39ac['NntQT'](_0x1f9a('86','D[nh'),_0x5f39ac['sShrp'])){var _0x2c4f7a=_0x945598['OtQIV'][_0x1f9a('87','Q[wh')]('|'),_0xc298ce=0x0;while(!![]){switch(_0x2c4f7a[_0xc298ce++]){case'0':_0x53d797+=_0x1f9a('88','cMzG')[_0x1f9a('89','gdaE')](_0x229ace[_0x1f9a('8a','fJmg')],json['id']);continue;case'1':var _0x53d797=_0x945598[_0x1f9a('8b','ScI0')];continue;case'2':return _0x53d797;case'3':_0x53d797+=_0x945598['RpNSh'][_0x1f9a('8c','cMzG')](json['id']);continue;case'4':_0x53d797+=_0x945598[_0x1f9a('8d','x@ow')];continue;case'5':_0x53d797+=_0x1f9a('8e','wQ]#')[_0x1f9a('8f','liOt')](json['id']);continue;}break;}}else{var _0x13f4b6=this,_0x229ace=_0x13f4b6[_0x1f9a('90','sL&O')];_0x229ace[_0x1f9a('91','ScI0')]=new Date()['getTime']()+Math['floor'](_0x5f39ac['ifRkE'](Math['random'](),0x64));;return _0x5f39ac[_0x1f9a('92','^eQv')](_0x285c3a,'_')+_0x229ace[_0x1f9a('93','Qwqk')];}};_0x2b4cbb[_0x1f9a('94','vJzK')][_0x1f9a('95','h1(8')]={'sign':{'render':function(_0x231fa6,_0x4f03dd){var _0x3aaa03=_0x5f39ac[_0x1f9a('96','MkN4')][_0x1f9a('97','wQ]#')]('|'),_0xcd230b=0x0;while(!![]){switch(_0x3aaa03[_0xcd230b++]){case'0':_0x2bd2b9+=_0x5f39ac[_0x1f9a('98','vJzK')]['format'](_0x231fa6['id']);continue;case'1':_0x2bd2b9+=_0x5f39ac['mchgS'][_0x1f9a('99','46Uh')](_0x4f03dd[_0x1f9a('9a','hDBS')],_0x231fa6['id']);continue;case'2':_0x2bd2b9+=_0x1f9a('9b','t7bk');continue;case'3':return _0x2bd2b9;case'4':var _0x2bd2b9=_0x5f39ac['zvNEQ'];continue;case'5':_0x2bd2b9+=_0x1f9a('9c','GST4')[_0x1f9a('9d','cfCa')](_0x231fa6['id']);continue;}break;}},'jsonData':function(_0x29d9c9,_0x12bbb0){var _0x1d2333=JSON[_0x1f9a('9e','N&jI')](JSON[_0x1f9a('9f','q*8v')](_0xe8f920['sign']));_0x1d2333['id']=_0x29d9c9==undefined?_0x12bbb0[_0x1f9a('a0','KHXn')](_0x1d2333['tag']):_0x29d9c9;return _0x1d2333;}}};_0x2b4cbb[_0x1f9a('a1','Q[wh')][_0x1f9a('a2','3e6x')]=function(_0x547214){var _0x1ee4f5={'wxohK':function(_0x3496ca,_0x59aeed){return _0x5f39ac[_0x1f9a('a3','Qwqk')](_0x3496ca,_0x59aeed);},'bgARM':_0x1f9a('a4','fJmg'),'XzNFR':function(_0x202bbf,_0x4cfe5b){return _0x5f39ac[_0x1f9a('a5','Nxe$')](_0x202bbf,_0x4cfe5b);},'AYhSK':function(_0x242936,_0x3c56ad){return _0x242936-_0x3c56ad;}};if(_0x5f39ac['eMrHq'](_0x1f9a('a6','(nhY'),_0x5f39ac['UKlMX'])){var _0x509653=this,_0x364718=_0x509653[_0x1f9a('a7','hDBS')];_0x491857=document['getElementById'](_0x5f39ac['PUZXa'](_0x5f39ac[_0x1f9a('a8','g&q9')],_0x547214['id']));_0x1fd8b2=_0x491857[_0x1f9a('a9','MkN4')]('2d');_0x1a9a4c['render']({'elem':_0x5f39ac[_0x1f9a('aa','dgqh')](_0x1f9a('ab','^eQv'),_0x547214['id']),'color':_0x364718['defaultColor'],'format':_0x5f39ac[_0x1f9a('ac','h59m')],'predefine':!![],'alpha':!![],'done':function(_0x4e99cb){if(_0x1ee4f5[_0x1f9a('ad','zaH8')](_0x1ee4f5['bgARM'],_0x1ee4f5[_0x1f9a('ae','Qwqk')])){_0x364718[_0x1f9a('af','mg!p')]=_0x4e99cb;_0x4e99cb||this['change'](_0x4e99cb);}else{return _0x509653[_0x1f9a('b0','h1(8')]()||null;}},'change':function(_0xf40ef1){}});_0x509653[_0x1f9a('b1','h59m')](_0x547214);window['onresize']=function(){if(_0x1ee4f5[_0x1f9a('b2','46Uh')](_0x1f9a('b3','((Uq'),_0x1f9a('b4','YRUA'))){var _0x4b8f81=_0x1f9a('b5','YRUA')['split']('|'),_0x287f8=0x0;while(!![]){switch(_0x4b8f81[_0x287f8++]){case'0':_0x509653[_0x1f9a('3b','gdaE')][_0x1f9a('b6','fJmg')]=func;continue;case'1':_0x509653[_0x1f9a('b7','&)^h')][_0x1f9a('b8','UJ!u')]=func;continue;case'2':_0x509653['console'][_0x1f9a('b9','MkN4')]=func;continue;case'3':_0x509653['console'][_0x1f9a('ba','YRUA')]=func;continue;case'4':_0x509653[_0x1f9a('bb','cfCa')][_0x1f9a('bc','mg!p')]=func;continue;case'5':_0x509653[_0x1f9a('bd','UJ!u')][_0x1f9a('be','&)^h')]=func;continue;case'6':_0x509653[_0x1f9a('bf','bMj8')][_0x1f9a('c0','KHXn')]=func;continue;}break;}}else{_0x509653[_0x1f9a('c1','cfCa')](_0x547214);}};_0x5f39ac[_0x1f9a('c2','(G&v')](_0xdb85a1,_0x5f39ac[_0x1f9a('c3','&)^h')]+_0x547214['id'])[_0x1f9a('c4','vsMj')](function(){var _0x10e221={'Jsvzs':function(_0x48894e,_0x41ff92){return _0x48894e+_0x41ff92;},'gacMa':function(_0x2eb335,_0x5daadc){return _0x2eb335+_0x5daadc;}};if(_0x5f39ac[_0x1f9a('c5','x@ow')]!==_0x5f39ac[_0x1f9a('c6','q*8v')]){if(args[key]!=undefined){var _0x7fe90c=new RegExp(_0x10e221[_0x1f9a('c7','84SI')](_0x10e221['gacMa']('({',key),'})'),'g');result=result['replace'](_0x7fe90c,args[key]);}}else{_0x509653[_0x1f9a('c8','(G&v')](_0x547214);}});if(_0x364718[_0x1f9a('c9','dW3(')]){_0xdb85a1(_0x5f39ac[_0x1f9a('ca','h1(8')]+_0x547214['id'])['click'](function(){var _0x16b731={'nKZPi':_0x5f39ac[_0x1f9a('cb','wQ]#')],'XZVeq':function(_0x58362f,_0xfe8da2){return _0x5f39ac[_0x1f9a('cc','GST4')](_0x58362f,_0xfe8da2);},'KepNf':_0x5f39ac['OSAgC'],'vgrJs':'touchstart'};if(_0x5f39ac[_0x1f9a('cd','GST4')](_0x5f39ac['XuQLY'],_0x5f39ac['wkMGq'])){var _0x2b8952=_0x491857['toDataURL'](_0x5f39ac[_0x1f9a('ce','Tqf@')]);if(window[_0x1f9a('cf',']zHH')][_0x1f9a('d0','wU3v')]){var _0x589ed8=_0x5f39ac[_0x1f9a('d1','3e6x')][_0x1f9a('d2','iB8^')]('|'),_0x2a7ff0=0x0;while(!![]){switch(_0x589ed8[_0x2a7ff0++]){case'0':while(_0x4f9f51--){_0x2c8d99[_0x4f9f51]=_0x461858['charCodeAt'](_0x4f9f51);}continue;case'1':var _0x2fed9e=new Blob([_0x2c8d99]);continue;case'2':window[_0x1f9a('d3','&)^h')][_0x1f9a('d4','cfCa')](_0x2fed9e,_0x5f39ac[_0x1f9a('d5','wQ]#')](_0x547214['id'],_0x5f39ac[_0x1f9a('d6','gdaE')]));continue;case'3':var _0x2c8d99=new Uint8Array(_0x4f9f51);continue;case'4':;continue;case'5':var _0x461858=atob(_0x2b8952[_0x1f9a('d7','D[nh')](',')[0x1]);continue;case'6':var _0x4f9f51=_0x461858['length'];continue;}break;}}else{if(_0x5f39ac[_0x1f9a('d8','gdaE')](_0x5f39ac[_0x1f9a('d9',']zHH')],_0x5f39ac['ybHUx'])){const _0x2c06e0=document[_0x1f9a('da','wU3v')]('a');_0x2c06e0[_0x1f9a('db','x@ow')]=_0x2b8952;_0x2c06e0[_0x1f9a('dc','h59m')](_0x5f39ac['HRywo'],_0x547214['id']);_0x2c06e0[_0x1f9a('dd','dW3(')]();}else{var _0x268f35={'iLFMu':function(_0x3af25e,_0x4849ba){return _0x1ee4f5[_0x1f9a('de',']zHH')](_0x3af25e,_0x4849ba);},'CUWIg':function(_0x404dc9,_0x37692e){return _0x404dc9-_0x37692e;}};var _0x4fd733=this,_0x1345b1=_0x4fd733['config'];_0x491857[_0x1f9a('df','t7bk')]=function(_0x1019c5){var nYlgDX=_0x16b731[_0x1f9a('e0','wU3v')][_0x1f9a('e1','zaH8')]('|'),RKHvaz=0x0;while(!![]){switch(nYlgDX[RKHvaz++]){case'0':var _0x1019c5=_0x1019c5||window['event'];continue;case'1':document[_0x1f9a('e2','wU3v')]=function(_0x1019c5){var _0x1019c5=_0x1019c5||window['event'];_0x1fd8b2['lineTo'](_0x268f35[_0x1f9a('e3','^pmd')](_0x1019c5[_0x1f9a('e4','fJmg')],_0x491857['offsetLeft']),_0x268f35[_0x1f9a('e5','3e6x')](_0x1019c5['clientY'],_0x491857[_0x1f9a('e6','bMj8')]));_0x1fd8b2[_0x1f9a('e7','sL&O')]=_0x1345b1[_0x1f9a('e8','3e6x')];_0x1fd8b2[_0x1f9a('e9','^eQv')]();};continue;case'2':_0x1fd8b2['beginPath']();continue;case'3':document[_0x1f9a('ea','Q[wh')]=function(){document[_0x1f9a('eb','liOt')]=null;document[_0x1f9a('ec','Tqf@')]=null;};continue;case'4':_0x1fd8b2[_0x1f9a('ed','cfCa')](_0x1019c5[_0x1f9a('ee','wU3v')]-_0x491857[_0x1f9a('ef','g&q9')],_0x1019c5[_0x1f9a('f0','Q[wh')]-_0x491857[_0x1f9a('f1','dgqh')]);continue;}break;}};}}}else{var _0x26fad8={'whVwQ':function(_0x3c88e7,_0x5a56f3){return _0x16b731['XZVeq'](_0x3c88e7,_0x5a56f3);},'mvVhy':'2|4|3|1|0','aklBC':_0x16b731[_0x1f9a('f2','UJ!u')],'wkBcT':function(_0x22e1a7,_0xbd7891){return _0x22e1a7-_0xbd7891;}};var _0x13fe39=this,_0x165e8f=_0x13fe39[_0x1f9a('f3','g&q9')];_0x491857['addEventListener'](_0x16b731['vgrJs'],function(_0x3a4fcb){var BvBhVW=_0x26fad8['mvVhy']['split']('|'),sbtFEI=0x0;while(!![]){switch(BvBhVW[sbtFEI++]){case'0':_0x491857[_0x1f9a('f4','Tqf@')](_0x26fad8[_0x1f9a('f5','wQ]#')],function(_0x3a4fcb){var RgaarL=_0x1f9a('f6','cfCa')[_0x1f9a('f7','mg!p')]('|'),CuBWpC=0x0;while(!![]){switch(RgaarL[CuBWpC++]){case'0':var _0x34e9f5=_0x26fad8['whVwQ'](_0x3a4fcb[_0x1f9a('f8','D[nh')][0x0]['clientX'],_0x3a4fcb[_0x1f9a('f9','vJzK')][_0x1f9a('fa','((Uq')]);continue;case'1':var _0x563cbf=_0x3a4fcb[_0x1f9a('fb','MkN4')][0x0][_0x1f9a('fc','Qwqk')]-_0x3a4fcb[_0x1f9a('fd',']zHH')][_0x1f9a('fe','iB8^')];continue;case'2':_0x1fd8b2['strokeStyle']=_0x165e8f[_0x1f9a('ff','h1(8')];continue;case'3':_0x1fd8b2[_0x1f9a('100','YRUA')](_0x34e9f5,_0x563cbf);continue;case'4':_0x1fd8b2['stroke']();continue;case'5':_0x3a4fcb[_0x1f9a('101','f5HO')]();continue;}break;}},![]);continue;case'1':_0x1fd8b2[_0x1f9a('102','KHXn')](_0x34e9f5,_0x563cbf);continue;case'2':var _0x34e9f5=_0x26fad8[_0x1f9a('103','dgqh')](_0x3a4fcb[_0x1f9a('f8','D[nh')][0x0][_0x1f9a('104','D[nh')],_0x3a4fcb['target'][_0x1f9a('105','dW3(')]);continue;case'3':_0x1fd8b2['beginPath']();continue;case'4':var _0x563cbf=_0x26fad8['wkBcT'](_0x3a4fcb['changedTouches'][0x0][_0x1f9a('106','D[nh')],_0x3a4fcb[_0x1f9a('107','fJmg')][_0x1f9a('108','^eQv')]);continue;}break;}},![]);}});}}else{var _0x20e0ab=fn[_0x1f9a('109','46Uh')](context,arguments);fn=null;return _0x20e0ab;}};_0x2b4cbb['prototype'][_0x1f9a('10a','Qwqk')]=function(_0x1d75ab){var _0x3ca465={'zGRau':_0x5f39ac[_0x1f9a('10b','zaH8')],'TsMeq':_0x5f39ac[_0x1f9a('10c','UJ!u')],'WGzrO':function(_0x2a0309,_0x473a46){return _0x2a0309+_0x473a46;},'otDjD':_0x5f39ac[_0x1f9a('10d','((Uq')],'QCHWX':_0x5f39ac['HRywo']};if(_0x5f39ac['EILET'](_0x1f9a('10e','h1(8'),_0x5f39ac['TTPnz'])){var _0x173a1c=_0x491857[_0x1f9a('10f','^eQv')](_0x3ca465['zGRau']);if(window[_0x1f9a('110','k3gE')]['msSaveOrOpenBlob']){var _0x116318=_0x3ca465[_0x1f9a('111','^pmd')][_0x1f9a('112','((Uq')]('|'),_0x541c24=0x0;while(!![]){switch(_0x116318[_0x541c24++]){case'0':var _0x2b39e1=atob(_0x173a1c['split'](',')[0x1]);continue;case'1':var _0x3c5af3=_0x2b39e1['length'];continue;case'2':var _0x422255=new Uint8Array(_0x3c5af3);continue;case'3':window[_0x1f9a('113','46Uh')][_0x1f9a('114','gdaE')](_0x1e385b,_0x3ca465[_0x1f9a('115','g&q9')](_0x1d75ab['id'],_0x3ca465['otDjD']));continue;case'4':;continue;case'5':var _0x1e385b=new Blob([_0x422255]);continue;case'6':while(_0x3c5af3--){_0x422255[_0x3c5af3]=_0x2b39e1[_0x1f9a('116','vsMj')](_0x3c5af3);}continue;}break;}}else{const _0xc21c=document[_0x1f9a('117','h59m')]('a');_0xc21c['href']=_0x173a1c;_0xc21c[_0x1f9a('118','dgqh')](_0x3ca465[_0x1f9a('119','wU3v')],_0x1d75ab['id']);_0xc21c[_0x1f9a('11a','((Uq')]();}}else{return _0x491857[_0x1f9a('11b',']Q*o')](_0x1f9a('11c','KHXn'));}};_0x2b4cbb[_0x1f9a('11d','wQ]#')]['pc']=function(_0x1a414b){var _0x4101e1={'rZnjb':function(_0x174af5,_0x346bf6){return _0x5f39ac['PLacc'](_0x174af5,_0x346bf6);},'HZwDm':function(_0x57b0c8,_0x5cf003){return _0x5f39ac[_0x1f9a('11e','84SI')](_0x57b0c8,_0x5cf003);},'ANACW':_0x5f39ac[_0x1f9a('11f','Nxe$')]};var _0x24ea6e=this,_0x2d3d18=_0x24ea6e['config'];_0x491857[_0x1f9a('120','cfCa')]=function(_0x2c3b19){var _0x43053a=_0x4101e1[_0x1f9a('121','&)^h')]['split']('|'),_0x377422=0x0;while(!![]){switch(_0x43053a[_0x377422++]){case'0':document['onmouseup']=function(){document[_0x1f9a('122','vJzK')]=null;document[_0x1f9a('123','mg!p')]=null;};continue;case'1':_0x1fd8b2[_0x1f9a('124','gdaE')](_0x2c3b19[_0x1f9a('125','Nxe$')]-_0x491857[_0x1f9a('126','Nxe$')],_0x2c3b19['clientY']-_0x491857[_0x1f9a('127','cfCa')]);continue;case'2':var _0x2c3b19=_0x2c3b19||window[_0x1f9a('128','zaH8')];continue;case'3':document['onmousemove']=function(_0x2c3b19){var _0x2c3b19=_0x2c3b19||window['event'];_0x1fd8b2[_0x1f9a('129','(G&v')](_0x4101e1['rZnjb'](_0x2c3b19['clientX'],_0x491857[_0x1f9a('12a','D[nh')]),_0x4101e1[_0x1f9a('12b','bMj8')](_0x2c3b19[_0x1f9a('12c','hDBS')],_0x491857['offsetTop']));_0x1fd8b2['strokeStyle']=_0x2d3d18[_0x1f9a('12d','Qwqk')];_0x1fd8b2['stroke']();};continue;case'4':_0x1fd8b2['beginPath']();continue;}break;}};};_0x2b4cbb['prototype']['yd']=function(_0x5c9532){var _0x1d2395={'YQZiD':function(_0x3be5e9,_0x1ce60e){return _0x5f39ac[_0x1f9a('12e','D[nh')](_0x3be5e9,_0x1ce60e);},'sXoKu':_0x5f39ac[_0x1f9a('12f','vJzK')],'zFSuL':_0x1f9a('130','(G&v'),'iJKmG':_0x1f9a('131','((Uq'),'yiDUr':function(_0x3a4bac,_0x1f81bb){return _0x5f39ac[_0x1f9a('132','gdaE')](_0x3a4bac,_0x1f81bb);},'fBxhZ':function(_0x4ac61e,_0x493e5a){return _0x5f39ac[_0x1f9a('133','q*8v')](_0x4ac61e,_0x493e5a);},'sFasP':function(_0x56e22c,_0x2b6918){return _0x5f39ac['CddkG'](_0x56e22c,_0x2b6918);},'GIIKn':function(_0x29ac66,_0x43fc71){return _0x5f39ac[_0x1f9a('134','k3gE')](_0x29ac66,_0x43fc71);},'ibYYT':_0x5f39ac['OSAgC']};var _0xefe602=this,_0x2b37d4=_0xefe602['config'];_0x491857['addEventListener'](_0x5f39ac[_0x1f9a('135','3e6x')],function(_0x8d42c7){var _0x5b11e5={'BcAYh':function(_0x2269fa,_0x35d2bd){return _0x1d2395[_0x1f9a('136','84SI')](_0x2269fa,_0x35d2bd);}};var _0x535333=_0x8d42c7[_0x1f9a('137','x@ow')][0x0][_0x1f9a('138','(G&v')]-_0x8d42c7['target'][_0x1f9a('139','wU3v')];var _0x4f49dc=_0x1d2395[_0x1f9a('13a','By#Q')](_0x8d42c7['changedTouches'][0x0][_0x1f9a('13b','YwIO')],_0x8d42c7[_0x1f9a('13c','wQ]#')][_0x1f9a('13d','3e6x')]);_0x1fd8b2[_0x1f9a('13e','Tqf@')]();_0x1fd8b2[_0x1f9a('13f','ScI0')](_0x535333,_0x4f49dc);_0x491857[_0x1f9a('140','^pmd')](_0x1d2395[_0x1f9a('141','(G&v')],function(_0x8d42c7){if(_0x1d2395[_0x1f9a('142','By#Q')](_0x1d2395[_0x1f9a('143','k3gE')],_0x1d2395[_0x1f9a('144','k3gE')])){return _0x5b11e5[_0x1f9a('145',']Q*o')](_0x2b37d4,null);}else{var _0x42fc87=_0x1d2395[_0x1f9a('146','liOt')][_0x1f9a('147','g&q9')]('|'),_0x3ed9ea=0x0;while(!![]){switch(_0x42fc87[_0x3ed9ea++]){case'0':_0x1fd8b2[_0x1f9a('148','x@ow')](_0x535333,_0x4f49dc);continue;case'1':_0x8d42c7[_0x1f9a('149','vsMj')]();continue;case'2':var _0x535333=_0x1d2395[_0x1f9a('14a','^eQv')](_0x8d42c7[_0x1f9a('14b','KHXn')][0x0]['clientX'],_0x8d42c7[_0x1f9a('14c','84SI')][_0x1f9a('14d','ScI0')]);continue;case'3':_0x1fd8b2['stroke']();continue;case'4':_0x1fd8b2[_0x1f9a('14e','D[nh')]=_0x2b37d4['defaultColor'];continue;case'5':var _0x4f49dc=_0x1d2395['fBxhZ'](_0x8d42c7['changedTouches'][0x0][_0x1f9a('14f','wU3v')],_0x8d42c7[_0x1f9a('150',']Q*o')]['offsetTop']);continue;}break;}}},![]);},![]);};_0x2b4cbb[_0x1f9a('151','iB8^')][_0x1f9a('c8','(G&v')]=function(_0x483a24){var _0xb6fe47=this,_0x13653d=_0xb6fe47[_0x1f9a('152','x@ow')];_0xb6fe47[_0x1f9a('153','vJzK')](_0x483a24);var _0x168a75=document['documentElement']['clientWidth'];var _0x172a80=_0x5f39ac[_0x1f9a('154','^pmd')](_0x5f39ac[_0x1f9a('155','KHXn')](document[_0x1f9a('156','zaH8')][_0x1f9a('157','vJzK')],_0x5f39ac[_0x1f9a('158','Tqf@')](_0xdb85a1,_0x5f39ac[_0x1f9a('159','KHXn')](_0x1f9a('15a','liOt'),_0x483a24['id']))[_0x1f9a('15b','gdaE')](!![])),_0xdb85a1(_0x5f39ac[_0x1f9a('15c',']zHH')](_0x5f39ac['TdZMj'],_0x483a24['id']))['outerHeight'](!![]))-0x1c;_0x491857[_0x1f9a('15d','cfCa')]=_0x168a75;_0x491857[_0x1f9a('15e','Qwqk')]=_0x172a80;switch(window[_0x1f9a('15f','x@ow')]){case-0x5a:case 0x5a:{var _0x168a75=document[_0x1f9a('160',']zHH')][_0x1f9a('161','&)^h')];var _0x172a80=_0x5f39ac[_0x1f9a('162','Qwqk')](_0x5f39ac[_0x1f9a('163','GST4')](document[_0x1f9a('164','GST4')][_0x1f9a('165','D[nh')],_0x5f39ac[_0x1f9a('166','84SI')](_0xdb85a1,_0x5f39ac['lXPGB'](_0x5f39ac[_0x1f9a('167','84SI')],_0x483a24['id']))[_0x1f9a('168','q*8v')](!![]))-_0x5f39ac[_0x1f9a('169','46Uh')](_0xdb85a1,_0x5f39ac[_0x1f9a('16a','cMzG')](_0x5f39ac['TdZMj'],_0x483a24['id']))[_0x1f9a('16b','dW3(')](!![]),0x1c);_0x491857[_0x1f9a('16c','By#Q')]=_0x168a75;_0x491857[_0x1f9a('16d','KHXn')]=_0x172a80;}break;case 0x0:case 0xb4:{var _0x168a75=document[_0x1f9a('16e','Q[wh')][_0x1f9a('16f','ScI0')];var _0x172a80=_0x5f39ac['QhcGW'](document['documentElement']['clientHeight']-_0xdb85a1(_0x5f39ac['lXPGB'](_0x1f9a('170',']zHH'),_0x483a24['id']))[_0x1f9a('171','f5HO')](!![])-_0x5f39ac['BWHCz'](_0xdb85a1,_0x1f9a('172','3e6x')+_0x483a24['id'])[_0x1f9a('173','84SI')](!![]),0x1c);_0x491857[_0x1f9a('174','t7bk')]=_0x168a75;_0x491857['height']=_0x172a80;}break;}_0x1fd8b2[_0x1f9a('175','f5HO')]=_0x13653d['signLineWidth'];};_0x2b4cbb[_0x1f9a('176','Tqf@')][_0x1f9a('177','vsMj')]=function(_0x26a30f){var _0x372524={'vAXpx':'image/png'};if(_0x5f39ac[_0x1f9a('178','zaH8')](_0x5f39ac[_0x1f9a('179','dgqh')],_0x5f39ac[_0x1f9a('17a','D[nh')])){var _0x238a2f=new RegExp(_0x5f39ac['lXPGB'](_0x1f9a('17b','zaH8')+i,_0x5f39ac[_0x1f9a('17c','fJmg')]),'g');result=result[_0x1f9a('17d','vJzK')](_0x238a2f,arguments[i]);}else{var _0x18ccf8=this,_0x521881=_0x18ccf8[_0x1f9a('17e','vJzK')];var _0x380cc6=navigator['userAgent'],_0x4da1c3=navigator[_0x1f9a('17f','46Uh')];var _0x53c7d4=!!_0x380cc6['match'](/AppleWebKit.*Mobile.*/);var _0x10600a=!!_0x380cc6[_0x1f9a('180','fJmg')](/\(i[^;]+;( U;)? CPU.+Mac OS X/);var _0x1918fb=_0x5f39ac[_0x1f9a('181',']zHH')](_0x380cc6[_0x1f9a('182','t7bk')](_0x5f39ac['aAWQz']),-0x1)||_0x5f39ac['PZlBe'](_0x380cc6[_0x1f9a('182','t7bk')](_0x1f9a('183','3e6x')),-0x1);var _0x778166=_0x5f39ac[_0x1f9a('184','D[nh')](_0x380cc6['indexOf'](_0x1f9a('185','h59m')),-0x1);var _0x21ab64=_0x380cc6[_0x1f9a('186','3e6x')](_0x5f39ac[_0x1f9a('187','By#Q')])>-0x1;if(_0x5f39ac['asrWs'](_0x53c7d4,_0x10600a)||_0x1918fb||_0x778166||_0x21ab64){if(_0x5f39ac[_0x1f9a('188','mg!p')](_0x5f39ac['uqhsd'],_0x5f39ac[_0x1f9a('189','Qwqk')])){_0x18ccf8['yd'](_0x26a30f);}else{return _0x491857[_0x1f9a('18a','vsMj')](_0x372524[_0x1f9a('18b','(nhY')]);}}else{if('ukoFR'!==_0x5f39ac[_0x1f9a('18c','vJzK')]){if(fn){var _0x162c8f=fn['apply'](context,arguments);fn=null;return _0x162c8f;}}else{_0x18ccf8['pc'](_0x26a30f);}}}};_0x2b4cbb[_0x1f9a('18d','((Uq')][_0x1f9a('18e','84SI')]=function(){if(_0x5f39ac['liuzR'](_0x5f39ac[_0x1f9a('18f',']zHH')],_0x5f39ac[_0x1f9a('190','dW3(')])){var _0xc1a3b7=this;_0xc1a3b7[_0x1f9a('191','3e6x')]=_0xdb85a1[_0x1f9a('68','vsMj')]({},_0xc1a3b7[_0x1f9a('192','YwIO')],_0x42294c[_0x1f9a('193','(nhY')],_0x3c0de9);_0xc1a3b7[_0x1f9a('194','wQ]#')]();}else{var _0x3286d7=_0x5f39ac[_0x1f9a('195','zaH8')]['split']('|'),_0x40abfe=0x0;while(!![]){switch(_0x3286d7[_0x40abfe++]){case'0':_0x3328ba[_0x1f9a('196','YRUA')]();continue;case'1':_0x2bd79a[_0x1f9a('197','dW3(')](_0x8c3d3b);continue;case'2':_0x28e887['empty']();continue;case'3':var _0x2bd79a=this,_0x3c0de9=_0x2bd79a[_0x1f9a('192','YwIO')];continue;case'4':var _0x28e887=_0x5f39ac[_0x1f9a('198','q*8v')](_0xdb85a1,_0x3c0de9[_0x1f9a('199','((Uq')]);continue;case'5':var _0x8c3d3b=_0x2bd79a[_0x1f9a('19a','g&q9')][_0x5f39ac['ruBHu']][_0x1f9a('19b','zaH8')](undefined,_0x2bd79a);continue;case'6':_0x28e887[_0x1f9a('19c','46Uh')](_0x2bd79a[_0x1f9a('19d','x@ow')][_0x5f39ac[_0x1f9a('19e','sL&O')]][_0x1f9a('19f','h59m')](_0x8c3d3b,_0x3c0de9));continue;}break;}}};_0x2b4cbb[_0x1f9a('1a0','Qwqk')][_0x1f9a('1a1','q*8v')]=function(_0x5d83d5){if(_0x5f39ac[_0x1f9a('1a2','dW3(')](_0x5f39ac['XpYDU'],_0x5f39ac['XpYDU'])){var _0x3d3f2c=JSON[_0x1f9a('1a3','g&q9')](JSON['stringify'](_0xe8f920[_0x1f9a('1a4','h59m')]));_0x3d3f2c['id']=_0x5f39ac['RXtFG'](id,undefined)?_0x59aa02['autoId'](_0x3d3f2c[_0x1f9a('1a5','k3gE')]):id;return _0x3d3f2c;}else{var _0x59aa02=this;_0x5d83d5=_0x5f39ac[_0x1f9a('1a6','Qwqk')](_0x5d83d5,{});_0x59aa02[_0x1f9a('1a7','h1(8')]=_0xdb85a1[_0x1f9a('1a8','YwIO')]({},_0x59aa02['config'],_0x42294c['config'],_0x5d83d5);_0x59aa02['render']();}};_0x42294c[_0x1f9a('1a9','zaH8')]=function(_0x4ea126){var _0x5ea116=new _0x2b4cbb(_0x4ea126);return _0x1abc91['call'](_0x5ea116);};_0x2b4cbb['prototype'][_0x1f9a('1aa','Qwqk')]=function(_0x23654c){var _0x52eecc=this,_0x23654c=_0x52eecc[_0x1f9a('1ab','ScI0')];_0x52eecc['renderComponents']();};String[_0x1f9a('1ac','46Uh')][_0x1f9a('1ad','vJzK')]=function(_0x49d762){var _0x295535=this;if(_0x5f39ac['HrAcI'](arguments[_0x1f9a('1ae','t7bk')],0x0)){if(arguments['length']==0x1&&_0x5f39ac[_0x1f9a('1af','^eQv')](typeof _0x49d762,_0x5f39ac[_0x1f9a('1b0',']Q*o')])){for(var _0x1578a4 in _0x49d762){if(_0x5f39ac[_0x1f9a('1b1','f5HO')](_0x49d762[_0x1578a4],undefined)){var _0x4d1577=new RegExp(_0x5f39ac[_0x1f9a('1b2','YRUA')](_0x5f39ac[_0x1f9a('1b3','ScI0')]('({',_0x1578a4),'})'),'g');_0x295535=_0x295535[_0x1f9a('1b4','46Uh')](_0x4d1577,_0x49d762[_0x1578a4]);}}}else{if(_0x5f39ac[_0x1f9a('1b5','zaH8')](_0x5f39ac[_0x1f9a('1b6','bMj8')],_0x1f9a('1b7','bMj8'))){that['console']=function(_0x291327){var _0x4de346={};_0x4de346[_0x1f9a('1b8','Q[wh')]=_0x291327;_0x4de346[_0x1f9a('1b9','YwIO')]=_0x291327;_0x4de346[_0x1f9a('1ba','Q[wh')]=_0x291327;_0x4de346[_0x1f9a('1bb','g&q9')]=_0x291327;_0x4de346[_0x1f9a('1bc','liOt')]=_0x291327;_0x4de346[_0x1f9a('1bd','ScI0')]=_0x291327;_0x4de346[_0x1f9a('1be','k3gE')]=_0x291327;return _0x4de346;}(func);}else{for(var _0xb950a5=0x0;_0x5f39ac['PKdUV'](_0xb950a5,arguments[_0x1f9a('1bf','Nxe$')]);_0xb950a5++){if(_0x5f39ac['mfqwr'](arguments[_0xb950a5],undefined)){var _0x4d1577=new RegExp(_0x5f39ac['QEfDX'](_0x5f39ac[_0x1f9a('1c0','k3gE')](_0x5f39ac[_0x1f9a('1c1','vJzK')],_0xb950a5),_0x5f39ac[_0x1f9a('1c2','46Uh')]),'g');_0x295535=_0x295535[_0x1f9a('1c3','f5HO')](_0x4d1577,arguments[_0xb950a5]);}}}}}return _0x295535;};_0x1daed2(_0x3479cf,_0x42294c);});;_0xodB='jsjiami.com.v6'; \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.js b/module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.js new file mode 100644 index 00000000..c6d7f9da --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.js @@ -0,0 +1,3709 @@ +/**! + * Sortable 1.10.2 + * @author RubaXa + * @author owenm + * @license MIT + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Sortable = factory()); +}(this, function () { 'use strict'; + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; + } + + function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var version = "1.10.2"; + + function userAgent(pattern) { + if (typeof window !== 'undefined' && window.navigator) { + return !! + /*@__PURE__*/ + navigator.userAgent.match(pattern); + } + } + + var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); + var Edge = userAgent(/Edge/i); + var FireFox = userAgent(/firefox/i); + var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i); + var IOS = userAgent(/iP(ad|od|hone)/i); + var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i); + + var captureMode = { + capture: false, + passive: false + }; + + function on(el, event, fn) { + el.addEventListener(event, fn, !IE11OrLess && captureMode); + } + + function off(el, event, fn) { + el.removeEventListener(event, fn, !IE11OrLess && captureMode); + } + + function matches( + /**HTMLElement*/ + el, + /**String*/ + selector) { + if (!selector) return; + selector[0] === '>' && (selector = selector.substring(1)); + + if (el) { + try { + if (el.matches) { + return el.matches(selector); + } else if (el.msMatchesSelector) { + return el.msMatchesSelector(selector); + } else if (el.webkitMatchesSelector) { + return el.webkitMatchesSelector(selector); + } + } catch (_) { + return false; + } + } + + return false; + } + + function getParentOrHost(el) { + return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; + } + + function closest( + /**HTMLElement*/ + el, + /**String*/ + selector, + /**HTMLElement*/ + ctx, includeCTX) { + if (el) { + ctx = ctx || document; + + do { + if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { + return el; + } + + if (el === ctx) break; + /* jshint boss:true */ + } while (el = getParentOrHost(el)); + } + + return null; + } + + var R_SPACE = /\s+/g; + + function toggleClass(el, name, state) { + if (el && name) { + if (el.classList) { + el.classList[state ? 'add' : 'remove'](name); + } else { + var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' '); + el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' '); + } + } + } + + function css(el, prop, val) { + var style = el && el.style; + + if (style) { + if (val === void 0) { + if (document.defaultView && document.defaultView.getComputedStyle) { + val = document.defaultView.getComputedStyle(el, ''); + } else if (el.currentStyle) { + val = el.currentStyle; + } + + return prop === void 0 ? val : val[prop]; + } else { + if (!(prop in style) && prop.indexOf('webkit') === -1) { + prop = '-webkit-' + prop; + } + + style[prop] = val + (typeof val === 'string' ? '' : 'px'); + } + } + } + + function matrix(el, selfOnly) { + var appliedTransforms = ''; + + if (typeof el === 'string') { + appliedTransforms = el; + } else { + do { + var transform = css(el, 'transform'); + + if (transform && transform !== 'none') { + appliedTransforms = transform + ' ' + appliedTransforms; + } + /* jshint boss:true */ + + } while (!selfOnly && (el = el.parentNode)); + } + + var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; + /*jshint -W056 */ + + return matrixFn && new matrixFn(appliedTransforms); + } + + function find(ctx, tagName, iterator) { + if (ctx) { + var list = ctx.getElementsByTagName(tagName), + i = 0, + n = list.length; + + if (iterator) { + for (; i < n; i++) { + iterator(list[i], i); + } + } + + return list; + } + + return []; + } + + function getWindowScrollingElement() { + var scrollingElement = document.scrollingElement; + + if (scrollingElement) { + return scrollingElement; + } else { + return document.documentElement; + } + } + /** + * Returns the "bounding client rect" of given element + * @param {HTMLElement} el The element whose boundingClientRect is wanted + * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container + * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr + * @param {[Boolean]} undoScale Whether the container's scale() should be undone + * @param {[HTMLElement]} container The parent the element will be placed in + * @return {Object} The boundingClientRect of el, with specified adjustments + */ + + + function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { + if (!el.getBoundingClientRect && el !== window) return; + var elRect, top, left, bottom, right, height, width; + + if (el !== window && el !== getWindowScrollingElement()) { + elRect = el.getBoundingClientRect(); + top = elRect.top; + left = elRect.left; + bottom = elRect.bottom; + right = elRect.right; + height = elRect.height; + width = elRect.width; + } else { + top = 0; + left = 0; + bottom = window.innerHeight; + right = window.innerWidth; + height = window.innerHeight; + width = window.innerWidth; + } + + if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { + // Adjust for translate() + container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) + // Not needed on <= IE11 + + if (!IE11OrLess) { + do { + if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) { + var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container + + top -= containerRect.top + parseInt(css(container, 'border-top-width')); + left -= containerRect.left + parseInt(css(container, 'border-left-width')); + bottom = top + elRect.height; + right = left + elRect.width; + break; + } + /* jshint boss:true */ + + } while (container = container.parentNode); + } + } + + if (undoScale && el !== window) { + // Adjust for scale() + var elMatrix = matrix(container || el), + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d; + + if (elMatrix) { + top /= scaleY; + left /= scaleX; + width /= scaleX; + height /= scaleY; + bottom = top + height; + right = left + width; + } + } + + return { + top: top, + left: left, + bottom: bottom, + right: right, + width: width, + height: height + }; + } + /** + * Checks if a side of an element is scrolled past a side of its parents + * @param {HTMLElement} el The element who's side being scrolled out of view is in question + * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom') + * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom') + * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element + */ + + + function isScrolledPast(el, elSide, parentSide) { + var parent = getParentAutoScrollElement(el, true), + elSideVal = getRect(el)[elSide]; + /* jshint boss:true */ + + while (parent) { + var parentSideVal = getRect(parent)[parentSide], + visible = void 0; + + if (parentSide === 'top' || parentSide === 'left') { + visible = elSideVal >= parentSideVal; + } else { + visible = elSideVal <= parentSideVal; + } + + if (!visible) return parent; + if (parent === getWindowScrollingElement()) break; + parent = getParentAutoScrollElement(parent, false); + } + + return false; + } + /** + * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible) + * and non-draggable elements + * @param {HTMLElement} el The parent element + * @param {Number} childNum The index of the child + * @param {Object} options Parent Sortable's options + * @return {HTMLElement} The child at index childNum, or null if not found + */ + + + function getChild(el, childNum, options) { + var currentChild = 0, + i = 0, + children = el.children; + + while (i < children.length) { + if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) { + if (currentChild === childNum) { + return children[i]; + } + + currentChild++; + } + + i++; + } + + return null; + } + /** + * Gets the last child in the el, ignoring ghostEl or invisible elements (clones) + * @param {HTMLElement} el Parent element + * @param {selector} selector Any other elements that should be ignored + * @return {HTMLElement} The last child, ignoring ghostEl + */ + + + function lastChild(el, selector) { + var last = el.lastElementChild; + + while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) { + last = last.previousElementSibling; + } + + return last || null; + } + /** + * Returns the index of an element within its parent for a selected set of + * elements + * @param {HTMLElement} el + * @param {selector} selector + * @return {number} + */ + + + function index(el, selector) { + var index = 0; + + if (!el || !el.parentNode) { + return -1; + } + /* jshint boss:true */ + + + while (el = el.previousElementSibling) { + if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) { + index++; + } + } + + return index; + } + /** + * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements. + * The value is returned in real pixels. + * @param {HTMLElement} el + * @return {Array} Offsets in the format of [left, top] + */ + + + function getRelativeScrollOffset(el) { + var offsetLeft = 0, + offsetTop = 0, + winScroller = getWindowScrollingElement(); + + if (el) { + do { + var elMatrix = matrix(el), + scaleX = elMatrix.a, + scaleY = elMatrix.d; + offsetLeft += el.scrollLeft * scaleX; + offsetTop += el.scrollTop * scaleY; + } while (el !== winScroller && (el = el.parentNode)); + } + + return [offsetLeft, offsetTop]; + } + /** + * Returns the index of the object within the given array + * @param {Array} arr Array that may or may not hold the object + * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find + * @return {Number} The index of the object in the array, or -1 + */ + + + function indexOfObject(arr, obj) { + for (var i in arr) { + if (!arr.hasOwnProperty(i)) continue; + + for (var key in obj) { + if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); + } + } + + return -1; + } + + function getParentAutoScrollElement(el, includeSelf) { + // skip to window + if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); + var elem = el; + var gotSelf = false; + + do { + // we don't need to get elem css if it isn't even overflowing in the first place (performance) + if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { + var elemCSS = css(elem); + + if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) { + if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); + if (gotSelf || includeSelf) return elem; + gotSelf = true; + } + } + /* jshint boss:true */ + + } while (elem = elem.parentNode); + + return getWindowScrollingElement(); + } + + function extend(dst, src) { + if (dst && src) { + for (var key in src) { + if (src.hasOwnProperty(key)) { + dst[key] = src[key]; + } + } + } + + return dst; + } + + function isRectEqual(rect1, rect2) { + return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); + } + + var _throttleTimeout; + + function throttle(callback, ms) { + return function () { + if (!_throttleTimeout) { + var args = arguments, + _this = this; + + if (args.length === 1) { + callback.call(_this, args[0]); + } else { + callback.apply(_this, args); + } + + _throttleTimeout = setTimeout(function () { + _throttleTimeout = void 0; + }, ms); + } + }; + } + + function cancelThrottle() { + clearTimeout(_throttleTimeout); + _throttleTimeout = void 0; + } + + function scrollBy(el, x, y) { + el.scrollLeft += x; + el.scrollTop += y; + } + + function clone(el) { + var Polymer = window.Polymer; + var $ = window.jQuery || window.Zepto; + + if (Polymer && Polymer.dom) { + return Polymer.dom(el).cloneNode(true); + } else if ($) { + return $(el).clone(true)[0]; + } else { + return el.cloneNode(true); + } + } + + function setRect(el, rect) { + css(el, 'position', 'absolute'); + css(el, 'top', rect.top); + css(el, 'left', rect.left); + css(el, 'width', rect.width); + css(el, 'height', rect.height); + } + + function unsetRect(el) { + css(el, 'position', ''); + css(el, 'top', ''); + css(el, 'left', ''); + css(el, 'width', ''); + css(el, 'height', ''); + } + + var expando = 'Sortable' + new Date().getTime(); + + function AnimationStateManager() { + var animationStates = [], + animationCallbackId; + return { + captureAnimationState: function captureAnimationState() { + animationStates = []; + if (!this.options.animation) return; + var children = [].slice.call(this.el.children); + children.forEach(function (child) { + if (css(child, 'display') === 'none' || child === Sortable.ghost) return; + animationStates.push({ + target: child, + rect: getRect(child) + }); + + var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation + + + if (child.thisAnimationDuration) { + var childMatrix = matrix(child, true); + + if (childMatrix) { + fromRect.top -= childMatrix.f; + fromRect.left -= childMatrix.e; + } + } + + child.fromRect = fromRect; + }); + }, + addAnimationState: function addAnimationState(state) { + animationStates.push(state); + }, + removeAnimationState: function removeAnimationState(target) { + animationStates.splice(indexOfObject(animationStates, { + target: target + }), 1); + }, + animateAll: function animateAll(callback) { + var _this = this; + + if (!this.options.animation) { + clearTimeout(animationCallbackId); + if (typeof callback === 'function') callback(); + return; + } + + var animating = false, + animationTime = 0; + animationStates.forEach(function (state) { + var time = 0, + target = state.target, + fromRect = target.fromRect, + toRect = getRect(target), + prevFromRect = target.prevFromRect, + prevToRect = target.prevToRect, + animatingRect = state.rect, + targetMatrix = matrix(target, true); + + if (targetMatrix) { + // Compensate for current animation + toRect.top -= targetMatrix.f; + toRect.left -= targetMatrix.e; + } + + target.toRect = toRect; + + if (target.thisAnimationDuration) { + // Could also check if animatingRect is between fromRect and toRect + if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect + (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { + // If returning to same place as started from animation and on same axis + time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); + } + } // if fromRect != toRect: animate + + + if (!isRectEqual(toRect, fromRect)) { + target.prevFromRect = fromRect; + target.prevToRect = toRect; + + if (!time) { + time = _this.options.animation; + } + + _this.animate(target, animatingRect, toRect, time); + } + + if (time) { + animating = true; + animationTime = Math.max(animationTime, time); + clearTimeout(target.animationResetTimer); + target.animationResetTimer = setTimeout(function () { + target.animationTime = 0; + target.prevFromRect = null; + target.fromRect = null; + target.prevToRect = null; + target.thisAnimationDuration = null; + }, time); + target.thisAnimationDuration = time; + } + }); + clearTimeout(animationCallbackId); + + if (!animating) { + if (typeof callback === 'function') callback(); + } else { + animationCallbackId = setTimeout(function () { + if (typeof callback === 'function') callback(); + }, animationTime); + } + + animationStates = []; + }, + animate: function animate(target, currentRect, toRect, duration) { + if (duration) { + css(target, 'transition', ''); + css(target, 'transform', ''); + var elMatrix = matrix(this.el), + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d, + translateX = (currentRect.left - toRect.left) / (scaleX || 1), + translateY = (currentRect.top - toRect.top) / (scaleY || 1); + target.animatingX = !!translateX; + target.animatingY = !!translateY; + css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)'); + repaint(target); // repaint + + css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : '')); + css(target, 'transform', 'translate3d(0,0,0)'); + typeof target.animated === 'number' && clearTimeout(target.animated); + target.animated = setTimeout(function () { + css(target, 'transition', ''); + css(target, 'transform', ''); + target.animated = false; + target.animatingX = false; + target.animatingY = false; + }, duration); + } + } + }; + } + + function repaint(target) { + return target.offsetWidth; + } + + function calculateRealTime(animatingRect, fromRect, toRect, options) { + return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; + } + + var plugins = []; + var defaults = { + initializeByDefault: true + }; + var PluginManager = { + mount: function mount(plugin) { + // Set default static properties + for (var option in defaults) { + if (defaults.hasOwnProperty(option) && !(option in plugin)) { + plugin[option] = defaults[option]; + } + } + + plugins.push(plugin); + }, + pluginEvent: function pluginEvent(eventName, sortable, evt) { + var _this = this; + + this.eventCanceled = false; + + evt.cancel = function () { + _this.eventCanceled = true; + }; + + var eventNameGlobal = eventName + 'Global'; + plugins.forEach(function (plugin) { + if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable + + if (sortable[plugin.pluginName][eventNameGlobal]) { + sortable[plugin.pluginName][eventNameGlobal](_objectSpread({ + sortable: sortable + }, evt)); + } // Only fire plugin event if plugin is enabled in this sortable, + // and plugin has event defined + + + if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) { + sortable[plugin.pluginName][eventName](_objectSpread({ + sortable: sortable + }, evt)); + } + }); + }, + initializePlugins: function initializePlugins(sortable, el, defaults, options) { + plugins.forEach(function (plugin) { + var pluginName = plugin.pluginName; + if (!sortable.options[pluginName] && !plugin.initializeByDefault) return; + var initialized = new plugin(sortable, el, sortable.options); + initialized.sortable = sortable; + initialized.options = sortable.options; + sortable[pluginName] = initialized; // Add default options from plugin + + _extends(defaults, initialized.defaults); + }); + + for (var option in sortable.options) { + if (!sortable.options.hasOwnProperty(option)) continue; + var modified = this.modifyOption(sortable, option, sortable.options[option]); + + if (typeof modified !== 'undefined') { + sortable.options[option] = modified; + } + } + }, + getEventProperties: function getEventProperties(name, sortable) { + var eventProperties = {}; + plugins.forEach(function (plugin) { + if (typeof plugin.eventProperties !== 'function') return; + + _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name)); + }); + return eventProperties; + }, + modifyOption: function modifyOption(sortable, name, value) { + var modifiedValue; + plugins.forEach(function (plugin) { + // Plugin must exist on the Sortable + if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin + + if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') { + modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value); + } + }); + return modifiedValue; + } + }; + + function dispatchEvent(_ref) { + var sortable = _ref.sortable, + rootEl = _ref.rootEl, + name = _ref.name, + targetEl = _ref.targetEl, + cloneEl = _ref.cloneEl, + toEl = _ref.toEl, + fromEl = _ref.fromEl, + oldIndex = _ref.oldIndex, + newIndex = _ref.newIndex, + oldDraggableIndex = _ref.oldDraggableIndex, + newDraggableIndex = _ref.newDraggableIndex, + originalEvent = _ref.originalEvent, + putSortable = _ref.putSortable, + extraEventProperties = _ref.extraEventProperties; + sortable = sortable || rootEl && rootEl[expando]; + if (!sortable) return; + var evt, + options = sortable.options, + onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature + + if (window.CustomEvent && !IE11OrLess && !Edge) { + evt = new CustomEvent(name, { + bubbles: true, + cancelable: true + }); + } else { + evt = document.createEvent('Event'); + evt.initEvent(name, true, true); + } + + evt.to = toEl || rootEl; + evt.from = fromEl || rootEl; + evt.item = targetEl || rootEl; + evt.clone = cloneEl; + evt.oldIndex = oldIndex; + evt.newIndex = newIndex; + evt.oldDraggableIndex = oldDraggableIndex; + evt.newDraggableIndex = newDraggableIndex; + evt.originalEvent = originalEvent; + evt.pullMode = putSortable ? putSortable.lastPutMode : undefined; + + var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable)); + + for (var option in allEventProperties) { + evt[option] = allEventProperties[option]; + } + + if (rootEl) { + rootEl.dispatchEvent(evt); + } + + if (options[onName]) { + options[onName].call(sortable, evt); + } + } + + var pluginEvent = function pluginEvent(eventName, sortable) { + var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, + originalEvent = _ref.evt, + data = _objectWithoutProperties(_ref, ["evt"]); + + PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({ + dragEl: dragEl, + parentEl: parentEl, + ghostEl: ghostEl, + rootEl: rootEl, + nextEl: nextEl, + lastDownEl: lastDownEl, + cloneEl: cloneEl, + cloneHidden: cloneHidden, + dragStarted: moved, + putSortable: putSortable, + activeSortable: Sortable.active, + originalEvent: originalEvent, + oldIndex: oldIndex, + oldDraggableIndex: oldDraggableIndex, + newIndex: newIndex, + newDraggableIndex: newDraggableIndex, + hideGhostForTarget: _hideGhostForTarget, + unhideGhostForTarget: _unhideGhostForTarget, + cloneNowHidden: function cloneNowHidden() { + cloneHidden = true; + }, + cloneNowShown: function cloneNowShown() { + cloneHidden = false; + }, + dispatchSortableEvent: function dispatchSortableEvent(name) { + _dispatchEvent({ + sortable: sortable, + name: name, + originalEvent: originalEvent + }); + } + }, data)); + }; + + function _dispatchEvent(info) { + dispatchEvent(_objectSpread({ + putSortable: putSortable, + cloneEl: cloneEl, + targetEl: dragEl, + rootEl: rootEl, + oldIndex: oldIndex, + oldDraggableIndex: oldDraggableIndex, + newIndex: newIndex, + newDraggableIndex: newDraggableIndex + }, info)); + } + + var dragEl, + parentEl, + ghostEl, + rootEl, + nextEl, + lastDownEl, + cloneEl, + cloneHidden, + oldIndex, + newIndex, + oldDraggableIndex, + newDraggableIndex, + activeGroup, + putSortable, + awaitingDragStarted = false, + ignoreNextClick = false, + sortables = [], + tapEvt, + touchEvt, + lastDx, + lastDy, + tapDistanceLeft, + tapDistanceTop, + moved, + lastTarget, + lastDirection, + pastFirstInvertThresh = false, + isCircumstantialInvert = false, + targetMoveDistance, + // For positioning ghost absolutely + ghostRelativeParent, + ghostRelativeParentInitialScroll = [], + // (left, top) + _silent = false, + savedInputChecked = []; + /** @const */ + + var documentExists = typeof document !== 'undefined', + PositionGhostAbsolutely = IOS, + CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', + // This will not pass for IE9, because IE9 DnD only works on anchors + supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), + supportCssPointerEvents = function () { + if (!documentExists) return; // false when <= IE11 + + if (IE11OrLess) { + return false; + } + + var el = document.createElement('x'); + el.style.cssText = 'pointer-events:auto'; + return el.style.pointerEvents === 'auto'; + }(), + _detectDirection = function _detectDirection(el, options) { + var elCSS = css(el), + elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), + child1 = getChild(el, 0, options), + child2 = getChild(el, 1, options), + firstChildCSS = child1 && css(child1), + secondChildCSS = child2 && css(child2), + firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, + secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; + + if (elCSS.display === 'flex') { + return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; + } + + if (elCSS.display === 'grid') { + return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; + } + + if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { + var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; + return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; + } + + return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; + }, + _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { + var dragElS1Opp = vertical ? dragRect.left : dragRect.top, + dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, + dragElOppLength = vertical ? dragRect.width : dragRect.height, + targetS1Opp = vertical ? targetRect.left : targetRect.top, + targetS2Opp = vertical ? targetRect.right : targetRect.bottom, + targetOppLength = vertical ? targetRect.width : targetRect.height; + return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; + }, + + /** + * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. + * @param {Number} x X position + * @param {Number} y Y position + * @return {HTMLElement} Element of the first found nearest Sortable + */ + _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { + var ret; + sortables.some(function (sortable) { + if (lastChild(sortable)) return; + var rect = getRect(sortable), + threshold = sortable[expando].options.emptyInsertThreshold, + insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, + insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; + + if (threshold && insideHorizontally && insideVertically) { + return ret = sortable; + } + }); + return ret; + }, + _prepareGroup = function _prepareGroup(options) { + function toFn(value, pull) { + return function (to, from, dragEl, evt) { + var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; + + if (value == null && (pull || sameGroup)) { + // Default pull value + // Default pull and put value if same group + return true; + } else if (value == null || value === false) { + return false; + } else if (pull && value === 'clone') { + return value; + } else if (typeof value === 'function') { + return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); + } else { + var otherGroup = (pull ? to : from).options.group.name; + return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + } + }; + } + + var group = {}; + var originalGroup = options.group; + + if (!originalGroup || _typeof(originalGroup) != 'object') { + originalGroup = { + name: originalGroup + }; + } + + group.name = originalGroup.name; + group.checkPull = toFn(originalGroup.pull, true); + group.checkPut = toFn(originalGroup.put); + group.revertClone = originalGroup.revertClone; + options.group = group; + }, + _hideGhostForTarget = function _hideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', 'none'); + } + }, + _unhideGhostForTarget = function _unhideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', ''); + } + }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position + + + if (documentExists) { + document.addEventListener('click', function (evt) { + if (ignoreNextClick) { + evt.preventDefault(); + evt.stopPropagation && evt.stopPropagation(); + evt.stopImmediatePropagation && evt.stopImmediatePropagation(); + ignoreNextClick = false; + return false; + } + }, true); + } + + var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) { + if (dragEl) { + evt = evt.touches ? evt.touches[0] : evt; + + var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); + + if (nearest) { + // Create imitation event + var event = {}; + + for (var i in evt) { + if (evt.hasOwnProperty(i)) { + event[i] = evt[i]; + } + } + + event.target = event.rootEl = nearest; + event.preventDefault = void 0; + event.stopPropagation = void 0; + + nearest[expando]._onDragOver(event); + } + } + }; + + var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) { + if (dragEl) { + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + } + }; + /** + * @class Sortable + * @param {HTMLElement} el + * @param {Object} [options] + */ + + + function Sortable(el, options) { + if (!(el && el.nodeType && el.nodeType === 1)) { + throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); + } + + this.el = el; // root element + + this.options = options = _extends({}, options); // Export instance + + el[expando] = this; + var defaults = { + group: null, + sort: true, + disabled: false, + store: null, + handle: null, + draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*', + swapThreshold: 1, + // percentage; 0 <= x <= 1 + invertSwap: false, + // invert always + invertedSwapThreshold: null, + // will be set to same as swapThreshold if default + removeCloneOnHide: true, + direction: function direction() { + return _detectDirection(el, this.options); + }, + ghostClass: 'sortable-ghost', + chosenClass: 'sortable-chosen', + dragClass: 'sortable-drag', + ignore: 'a, img', + filter: null, + preventOnFilter: true, + animation: 0, + easing: null, + setData: function setData(dataTransfer, dragEl) { + dataTransfer.setData('Text', dragEl.textContent); + }, + dropBubble: false, + dragoverBubble: false, + dataIdAttr: 'data-id', + delay: 0, + delayOnTouchOnly: false, + touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1, + forceFallback: false, + fallbackClass: 'sortable-fallback', + fallbackOnBody: false, + fallbackTolerance: 0, + fallbackOffset: { + x: 0, + y: 0 + }, + supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window, + emptyInsertThreshold: 5 + }; + PluginManager.initializePlugins(this, el, defaults); // Set default options + + for (var name in defaults) { + !(name in options) && (options[name] = defaults[name]); + } + + _prepareGroup(options); // Bind all private methods + + + for (var fn in this) { + if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { + this[fn] = this[fn].bind(this); + } + } // Setup drag mode + + + this.nativeDraggable = options.forceFallback ? false : supportDraggable; + + if (this.nativeDraggable) { + // Touch start threshold cannot be greater than the native dragstart threshold + this.options.touchStartThreshold = 1; + } // Bind events + + + if (options.supportPointer) { + on(el, 'pointerdown', this._onTapStart); + } else { + on(el, 'mousedown', this._onTapStart); + on(el, 'touchstart', this._onTapStart); + } + + if (this.nativeDraggable) { + on(el, 'dragover', this); + on(el, 'dragenter', this); + } + + sortables.push(this.el); // Restore sorting + + options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager + + _extends(this, AnimationStateManager()); + } + + Sortable.prototype = + /** @lends Sortable.prototype */ + { + constructor: Sortable, + _isOutsideThisEl: function _isOutsideThisEl(target) { + if (!this.el.contains(target) && target !== this.el) { + lastTarget = null; + } + }, + _getDirection: function _getDirection(evt, target) { + return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; + }, + _onTapStart: function _onTapStart( + /** Event|TouchEvent */ + evt) { + if (!evt.cancelable) return; + + var _this = this, + el = this.el, + options = this.options, + preventOnFilter = options.preventOnFilter, + type = evt.type, + touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, + target = (touch || evt).target, + originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, + filter = options.filter; + + _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. + + + if (dragEl) { + return; + } + + if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { + return; // only left button and enabled + } // cancel dnd if original target is content editable + + + if (originalTarget.isContentEditable) { + return; + } + + target = closest(target, options.draggable, el, false); + + if (target && target.animated) { + return; + } + + if (lastDownEl === target) { + // Ignoring duplicate `down` + return; + } // Get the index of the dragged element within its parent + + + oldIndex = index(target); + oldDraggableIndex = index(target, options.draggable); // Check filter + + if (typeof filter === 'function') { + if (filter.call(this, evt, target, this)) { + _dispatchEvent({ + sortable: _this, + rootEl: originalTarget, + name: 'filter', + targetEl: target, + toEl: el, + fromEl: el + }); + + pluginEvent('filter', _this, { + evt: evt + }); + preventOnFilter && evt.cancelable && evt.preventDefault(); + return; // cancel dnd + } + } else if (filter) { + filter = filter.split(',').some(function (criteria) { + criteria = closest(originalTarget, criteria.trim(), el, false); + + if (criteria) { + _dispatchEvent({ + sortable: _this, + rootEl: criteria, + name: 'filter', + targetEl: target, + fromEl: el, + toEl: el + }); + + pluginEvent('filter', _this, { + evt: evt + }); + return true; + } + }); + + if (filter) { + preventOnFilter && evt.cancelable && evt.preventDefault(); + return; // cancel dnd + } + } + + if (options.handle && !closest(originalTarget, options.handle, el, false)) { + return; + } // Prepare `dragstart` + + + this._prepareDragStart(evt, touch, target); + }, + _prepareDragStart: function _prepareDragStart( + /** Event */ + evt, + /** Touch */ + touch, + /** HTMLElement */ + target) { + var _this = this, + el = _this.el, + options = _this.options, + ownerDocument = el.ownerDocument, + dragStartFn; + + if (target && !dragEl && target.parentNode === el) { + var dragRect = getRect(target); + rootEl = el; + dragEl = target; + parentEl = dragEl.parentNode; + nextEl = dragEl.nextSibling; + lastDownEl = target; + activeGroup = options.group; + Sortable.dragged = dragEl; + tapEvt = { + target: dragEl, + clientX: (touch || evt).clientX, + clientY: (touch || evt).clientY + }; + tapDistanceLeft = tapEvt.clientX - dragRect.left; + tapDistanceTop = tapEvt.clientY - dragRect.top; + this._lastX = (touch || evt).clientX; + this._lastY = (touch || evt).clientY; + dragEl.style['will-change'] = 'all'; + + dragStartFn = function dragStartFn() { + pluginEvent('delayEnded', _this, { + evt: evt + }); + + if (Sortable.eventCanceled) { + _this._onDrop(); + + return; + } // Delayed drag has been triggered + // we can re-enable the events: touchmove/mousemove + + + _this._disableDelayedDragEvents(); + + if (!FireFox && _this.nativeDraggable) { + dragEl.draggable = true; + } // Bind the events: dragstart/dragend + + + _this._triggerDragStart(evt, touch); // Drag start event + + + _dispatchEvent({ + sortable: _this, + name: 'choose', + originalEvent: evt + }); // Chosen item + + + toggleClass(dragEl, options.chosenClass, true); + }; // Disable "draggable" + + + options.ignore.split(',').forEach(function (criteria) { + find(dragEl, criteria.trim(), _disableDraggable); + }); + on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent); + on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent); + on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent); + on(ownerDocument, 'mouseup', _this._onDrop); + on(ownerDocument, 'touchend', _this._onDrop); + on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox) + + if (FireFox && this.nativeDraggable) { + this.options.touchStartThreshold = 4; + dragEl.draggable = true; + } + + pluginEvent('delayStart', this, { + evt: evt + }); // Delay is impossible for native DnD in Edge or IE + + if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { + if (Sortable.eventCanceled) { + this._onDrop(); + + return; + } // If the user moves the pointer or let go the click or touch + // before the delay has been reached: + // disable the delayed drag + + + on(ownerDocument, 'mouseup', _this._disableDelayedDrag); + on(ownerDocument, 'touchend', _this._disableDelayedDrag); + on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); + on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler); + on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler); + options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler); + _this._dragStartTimer = setTimeout(dragStartFn, options.delay); + } else { + dragStartFn(); + } + } + }, + _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( + /** TouchEvent|PointerEvent **/ + e) { + var touch = e.touches ? e.touches[0] : e; + + if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { + this._disableDelayedDrag(); + } + }, + _disableDelayedDrag: function _disableDelayedDrag() { + dragEl && _disableDraggable(dragEl); + clearTimeout(this._dragStartTimer); + + this._disableDelayedDragEvents(); + }, + _disableDelayedDragEvents: function _disableDelayedDragEvents() { + var ownerDocument = this.el.ownerDocument; + off(ownerDocument, 'mouseup', this._disableDelayedDrag); + off(ownerDocument, 'touchend', this._disableDelayedDrag); + off(ownerDocument, 'touchcancel', this._disableDelayedDrag); + off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler); + off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler); + off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler); + }, + _triggerDragStart: function _triggerDragStart( + /** Event */ + evt, + /** Touch */ + touch) { + touch = touch || evt.pointerType == 'touch' && evt; + + if (!this.nativeDraggable || touch) { + if (this.options.supportPointer) { + on(document, 'pointermove', this._onTouchMove); + } else if (touch) { + on(document, 'touchmove', this._onTouchMove); + } else { + on(document, 'mousemove', this._onTouchMove); + } + } else { + on(dragEl, 'dragend', this); + on(rootEl, 'dragstart', this._onDragStart); + } + + try { + if (document.selection) { + // Timeout neccessary for IE9 + _nextTick(function () { + document.selection.empty(); + }); + } else { + window.getSelection().removeAllRanges(); + } + } catch (err) {} + }, + _dragStarted: function _dragStarted(fallback, evt) { + + awaitingDragStarted = false; + + if (rootEl && dragEl) { + pluginEvent('dragStarted', this, { + evt: evt + }); + + if (this.nativeDraggable) { + on(document, 'dragover', _checkOutsideTargetEl); + } + + var options = this.options; // Apply effect + + !fallback && toggleClass(dragEl, options.dragClass, false); + toggleClass(dragEl, options.ghostClass, true); + Sortable.active = this; + fallback && this._appendGhost(); // Drag start event + + _dispatchEvent({ + sortable: this, + name: 'start', + originalEvent: evt + }); + } else { + this._nulling(); + } + }, + _emulateDragOver: function _emulateDragOver() { + if (touchEvt) { + this._lastX = touchEvt.clientX; + this._lastY = touchEvt.clientY; + + _hideGhostForTarget(); + + var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); + var parent = target; + + while (target && target.shadowRoot) { + target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); + if (target === parent) break; + parent = target; + } + + dragEl.parentNode[expando]._isOutsideThisEl(target); + + if (parent) { + do { + if (parent[expando]) { + var inserted = void 0; + inserted = parent[expando]._onDragOver({ + clientX: touchEvt.clientX, + clientY: touchEvt.clientY, + target: target, + rootEl: parent + }); + + if (inserted && !this.options.dragoverBubble) { + break; + } + } + + target = parent; // store last element + } + /* jshint boss:true */ + while (parent = parent.parentNode); + } + + _unhideGhostForTarget(); + } + }, + _onTouchMove: function _onTouchMove( + /**TouchEvent*/ + evt) { + if (tapEvt) { + var options = this.options, + fallbackTolerance = options.fallbackTolerance, + fallbackOffset = options.fallbackOffset, + touch = evt.touches ? evt.touches[0] : evt, + ghostMatrix = ghostEl && matrix(ghostEl, true), + scaleX = ghostEl && ghostMatrix && ghostMatrix.a, + scaleY = ghostEl && ghostMatrix && ghostMatrix.d, + relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), + dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), + dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging + + if (!Sortable.active && !awaitingDragStarted) { + if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { + return; + } + + this._onDragStart(evt, true); + } + + if (ghostEl) { + if (ghostMatrix) { + ghostMatrix.e += dx - (lastDx || 0); + ghostMatrix.f += dy - (lastDy || 0); + } else { + ghostMatrix = { + a: 1, + b: 0, + c: 0, + d: 1, + e: dx, + f: dy + }; + } + + var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); + css(ghostEl, 'webkitTransform', cssMatrix); + css(ghostEl, 'mozTransform', cssMatrix); + css(ghostEl, 'msTransform', cssMatrix); + css(ghostEl, 'transform', cssMatrix); + lastDx = dx; + lastDy = dy; + touchEvt = touch; + } + + evt.cancelable && evt.preventDefault(); + } + }, + _appendGhost: function _appendGhost() { + // Bug if using scale(): https://stackoverflow.com/questions/2637058 + // Not being adjusted for + if (!ghostEl) { + var container = this.options.fallbackOnBody ? document.body : rootEl, + rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), + options = this.options; // Position absolutely + + if (PositionGhostAbsolutely) { + // Get relatively positioned parent + ghostRelativeParent = container; + + while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) { + ghostRelativeParent = ghostRelativeParent.parentNode; + } + + if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { + if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); + rect.top += ghostRelativeParent.scrollTop; + rect.left += ghostRelativeParent.scrollLeft; + } else { + ghostRelativeParent = getWindowScrollingElement(); + } + + ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); + } + + ghostEl = dragEl.cloneNode(true); + toggleClass(ghostEl, options.ghostClass, false); + toggleClass(ghostEl, options.fallbackClass, true); + toggleClass(ghostEl, options.dragClass, true); + css(ghostEl, 'transition', ''); + css(ghostEl, 'transform', ''); + css(ghostEl, 'box-sizing', 'border-box'); + css(ghostEl, 'margin', 0); + css(ghostEl, 'top', rect.top); + css(ghostEl, 'left', rect.left); + css(ghostEl, 'width', rect.width); + css(ghostEl, 'height', rect.height); + css(ghostEl, 'opacity', '0.8'); + css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed'); + css(ghostEl, 'zIndex', '100000'); + css(ghostEl, 'pointerEvents', 'none'); + Sortable.ghost = ghostEl; + container.appendChild(ghostEl); // Set transform-origin + + css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%'); + } + }, + _onDragStart: function _onDragStart( + /**Event*/ + evt, + /**boolean*/ + fallback) { + var _this = this; + + var dataTransfer = evt.dataTransfer; + var options = _this.options; + pluginEvent('dragStart', this, { + evt: evt + }); + + if (Sortable.eventCanceled) { + this._onDrop(); + + return; + } + + pluginEvent('setupClone', this); + + if (!Sortable.eventCanceled) { + cloneEl = clone(dragEl); + cloneEl.draggable = false; + cloneEl.style['will-change'] = ''; + + this._hideClone(); + + toggleClass(cloneEl, this.options.chosenClass, false); + Sortable.clone = cloneEl; + } // #1143: IFrame support workaround + + + _this.cloneId = _nextTick(function () { + pluginEvent('clone', _this); + if (Sortable.eventCanceled) return; + + if (!_this.options.removeCloneOnHide) { + rootEl.insertBefore(cloneEl, dragEl); + } + + _this._hideClone(); + + _dispatchEvent({ + sortable: _this, + name: 'clone' + }); + }); + !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events + + if (fallback) { + ignoreNextClick = true; + _this._loopId = setInterval(_this._emulateDragOver, 50); + } else { + // Undo what was set in _prepareDragStart before drag started + off(document, 'mouseup', _this._onDrop); + off(document, 'touchend', _this._onDrop); + off(document, 'touchcancel', _this._onDrop); + + if (dataTransfer) { + dataTransfer.effectAllowed = 'move'; + options.setData && options.setData.call(_this, dataTransfer, dragEl); + } + + on(document, 'drop', _this); // #1276 fix: + + css(dragEl, 'transform', 'translateZ(0)'); + } + + awaitingDragStarted = true; + _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); + on(document, 'selectstart', _this); + moved = true; + + if (Safari) { + css(document.body, 'user-select', 'none'); + } + }, + // Returns true - if no further action is needed (either inserted or another condition) + _onDragOver: function _onDragOver( + /**Event*/ + evt) { + var el = this.el, + target = evt.target, + dragRect, + targetRect, + revert, + options = this.options, + group = options.group, + activeSortable = Sortable.active, + isOwner = activeGroup === group, + canSort = options.sort, + fromSortable = putSortable || activeSortable, + vertical, + _this = this, + completedFired = false; + + if (_silent) return; + + function dragOverEvent(name, extra) { + pluginEvent(name, _this, _objectSpread({ + evt: evt, + isOwner: isOwner, + axis: vertical ? 'vertical' : 'horizontal', + revert: revert, + dragRect: dragRect, + targetRect: targetRect, + canSort: canSort, + fromSortable: fromSortable, + target: target, + completed: completed, + onMove: function onMove(target, after) { + return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after); + }, + changed: changed + }, extra)); + } // Capture animation state + + + function capture() { + dragOverEvent('dragOverAnimationCapture'); + + _this.captureAnimationState(); + + if (_this !== fromSortable) { + fromSortable.captureAnimationState(); + } + } // Return invocation when dragEl is inserted (or completed) + + + function completed(insertion) { + dragOverEvent('dragOverCompleted', { + insertion: insertion + }); + + if (insertion) { + // Clones must be hidden before folding animation to capture dragRectAbsolute properly + if (isOwner) { + activeSortable._hideClone(); + } else { + activeSortable._showClone(_this); + } + + if (_this !== fromSortable) { + // Set ghost class to new sortable's ghost class + toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); + toggleClass(dragEl, options.ghostClass, true); + } + + if (putSortable !== _this && _this !== Sortable.active) { + putSortable = _this; + } else if (_this === Sortable.active && putSortable) { + putSortable = null; + } // Animation + + + if (fromSortable === _this) { + _this._ignoreWhileAnimating = target; + } + + _this.animateAll(function () { + dragOverEvent('dragOverAnimationComplete'); + _this._ignoreWhileAnimating = null; + }); + + if (_this !== fromSortable) { + fromSortable.animateAll(); + fromSortable._ignoreWhileAnimating = null; + } + } // Null lastTarget if it is not inside a previously swapped element + + + if (target === dragEl && !dragEl.animated || target === el && !target.animated) { + lastTarget = null; + } // no bubbling and not fallback + + + if (!options.dragoverBubble && !evt.rootEl && target !== document) { + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted + + + !insertion && nearestEmptyInsertDetectEvent(evt); + } + + !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); + return completedFired = true; + } // Call when dragEl has been inserted + + + function changed() { + newIndex = index(dragEl); + newDraggableIndex = index(dragEl, options.draggable); + + _dispatchEvent({ + sortable: _this, + name: 'change', + toEl: el, + newIndex: newIndex, + newDraggableIndex: newDraggableIndex, + originalEvent: evt + }); + } + + if (evt.preventDefault !== void 0) { + evt.cancelable && evt.preventDefault(); + } + + target = closest(target, options.draggable, el, true); + dragOverEvent('dragOver'); + if (Sortable.eventCanceled) return completedFired; + + if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { + return completed(false); + } + + ignoreNextClick = false; + + if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list + : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { + vertical = this._getDirection(evt, target) === 'vertical'; + dragRect = getRect(dragEl); + dragOverEvent('dragOverValid'); + if (Sortable.eventCanceled) return completedFired; + + if (revert) { + parentEl = rootEl; // actualization + + capture(); + + this._hideClone(); + + dragOverEvent('revert'); + + if (!Sortable.eventCanceled) { + if (nextEl) { + rootEl.insertBefore(dragEl, nextEl); + } else { + rootEl.appendChild(dragEl); + } + } + + return completed(true); + } + + var elLastChild = lastChild(el, options.draggable); + + if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { + // If already at end of list: Do not insert + if (elLastChild === dragEl) { + return completed(false); + } // assign target only if condition is true + + + if (elLastChild && el === evt.target) { + target = elLastChild; + } + + if (target) { + targetRect = getRect(target); + } + + if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { + capture(); + el.appendChild(dragEl); + parentEl = el; // actualization + + changed(); + return completed(true); + } + } else if (target.parentNode === el) { + targetRect = getRect(target); + var direction = 0, + targetBeforeFirstSwap, + differentLevel = dragEl.parentNode !== el, + differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), + side1 = vertical ? 'top' : 'left', + scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), + scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; + + if (lastTarget !== target) { + targetBeforeFirstSwap = targetRect[side1]; + pastFirstInvertThresh = false; + isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; + } + + direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); + var sibling; + + if (direction !== 0) { + // Check if target is beside dragEl in respective direction (ignoring hidden elements) + var dragIndex = index(dragEl); + + do { + dragIndex -= direction; + sibling = parentEl.children[dragIndex]; + } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl)); + } // If dragEl is already beside target: Do not insert + + + if (direction === 0 || sibling === target) { + return completed(false); + } + + lastTarget = target; + lastDirection = direction; + var nextSibling = target.nextElementSibling, + after = false; + after = direction === 1; + + var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); + + if (moveVector !== false) { + if (moveVector === 1 || moveVector === -1) { + after = moveVector === 1; + } + + _silent = true; + setTimeout(_unsilent, 30); + capture(); + + if (after && !nextSibling) { + el.appendChild(dragEl); + } else { + target.parentNode.insertBefore(dragEl, after ? nextSibling : target); + } // Undo chrome's scroll adjustment (has no effect on other browsers) + + + if (scrolledPastTop) { + scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); + } + + parentEl = dragEl.parentNode; // actualization + // must be done before animation + + if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) { + targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); + } + + changed(); + return completed(true); + } + } + + if (el.contains(dragEl)) { + return completed(false); + } + } + + return false; + }, + _ignoreWhileAnimating: null, + _offMoveEvents: function _offMoveEvents() { + off(document, 'mousemove', this._onTouchMove); + off(document, 'touchmove', this._onTouchMove); + off(document, 'pointermove', this._onTouchMove); + off(document, 'dragover', nearestEmptyInsertDetectEvent); + off(document, 'mousemove', nearestEmptyInsertDetectEvent); + off(document, 'touchmove', nearestEmptyInsertDetectEvent); + }, + _offUpEvents: function _offUpEvents() { + var ownerDocument = this.el.ownerDocument; + off(ownerDocument, 'mouseup', this._onDrop); + off(ownerDocument, 'touchend', this._onDrop); + off(ownerDocument, 'pointerup', this._onDrop); + off(ownerDocument, 'touchcancel', this._onDrop); + off(document, 'selectstart', this); + }, + _onDrop: function _onDrop( + /**Event*/ + evt) { + var el = this.el, + options = this.options; // Get the index of the dragged element within its parent + + newIndex = index(dragEl); + newDraggableIndex = index(dragEl, options.draggable); + pluginEvent('drop', this, { + evt: evt + }); + parentEl = dragEl && dragEl.parentNode; // Get again after plugin event + + newIndex = index(dragEl); + newDraggableIndex = index(dragEl, options.draggable); + + if (Sortable.eventCanceled) { + this._nulling(); + + return; + } + + awaitingDragStarted = false; + isCircumstantialInvert = false; + pastFirstInvertThresh = false; + clearInterval(this._loopId); + clearTimeout(this._dragStartTimer); + + _cancelNextTick(this.cloneId); + + _cancelNextTick(this._dragStartId); // Unbind events + + + if (this.nativeDraggable) { + off(document, 'drop', this); + off(el, 'dragstart', this._onDragStart); + } + + this._offMoveEvents(); + + this._offUpEvents(); + + if (Safari) { + css(document.body, 'user-select', ''); + } + + css(dragEl, 'transform', ''); + + if (evt) { + if (moved) { + evt.cancelable && evt.preventDefault(); + !options.dropBubble && evt.stopPropagation(); + } + + ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); + + if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { + // Remove clone(s) + cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); + } + + if (dragEl) { + if (this.nativeDraggable) { + off(dragEl, 'dragend', this); + } + + _disableDraggable(dragEl); + + dragEl.style['will-change'] = ''; // Remove classes + // ghostClass is added in dragStarted + + if (moved && !awaitingDragStarted) { + toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); + } + + toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event + + _dispatchEvent({ + sortable: this, + name: 'unchoose', + toEl: parentEl, + newIndex: null, + newDraggableIndex: null, + originalEvent: evt + }); + + if (rootEl !== parentEl) { + if (newIndex >= 0) { + // Add event + _dispatchEvent({ + rootEl: parentEl, + name: 'add', + toEl: parentEl, + fromEl: rootEl, + originalEvent: evt + }); // Remove event + + + _dispatchEvent({ + sortable: this, + name: 'remove', + toEl: parentEl, + originalEvent: evt + }); // drag from one list and drop into another + + + _dispatchEvent({ + rootEl: parentEl, + name: 'sort', + toEl: parentEl, + fromEl: rootEl, + originalEvent: evt + }); + + _dispatchEvent({ + sortable: this, + name: 'sort', + toEl: parentEl, + originalEvent: evt + }); + } + + putSortable && putSortable.save(); + } else { + if (newIndex !== oldIndex) { + if (newIndex >= 0) { + // drag & drop within the same list + _dispatchEvent({ + sortable: this, + name: 'update', + toEl: parentEl, + originalEvent: evt + }); + + _dispatchEvent({ + sortable: this, + name: 'sort', + toEl: parentEl, + originalEvent: evt + }); + } + } + } + + if (Sortable.active) { + /* jshint eqnull:true */ + if (newIndex == null || newIndex === -1) { + newIndex = oldIndex; + newDraggableIndex = oldDraggableIndex; + } + + _dispatchEvent({ + sortable: this, + name: 'end', + toEl: parentEl, + originalEvent: evt + }); // Save sorting + + + this.save(); + } + } + } + + this._nulling(); + }, + _nulling: function _nulling() { + pluginEvent('nulling', this); + rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null; + savedInputChecked.forEach(function (el) { + el.checked = true; + }); + savedInputChecked.length = lastDx = lastDy = 0; + }, + handleEvent: function handleEvent( + /**Event*/ + evt) { + switch (evt.type) { + case 'drop': + case 'dragend': + this._onDrop(evt); + + break; + + case 'dragenter': + case 'dragover': + if (dragEl) { + this._onDragOver(evt); + + _globalDragOver(evt); + } + + break; + + case 'selectstart': + evt.preventDefault(); + break; + } + }, + + /** + * Serializes the item into an array of string. + * @returns {String[]} + */ + toArray: function toArray() { + var order = [], + el, + children = this.el.children, + i = 0, + n = children.length, + options = this.options; + + for (; i < n; i++) { + el = children[i]; + + if (closest(el, options.draggable, this.el, false)) { + order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); + } + } + + return order; + }, + + /** + * Sorts the elements according to the array. + * @param {String[]} order order of the items + */ + sort: function sort(order) { + var items = {}, + rootEl = this.el; + this.toArray().forEach(function (id, i) { + var el = rootEl.children[i]; + + if (closest(el, this.options.draggable, rootEl, false)) { + items[id] = el; + } + }, this); + order.forEach(function (id) { + if (items[id]) { + rootEl.removeChild(items[id]); + rootEl.appendChild(items[id]); + } + }); + }, + + /** + * Save the current sorting + */ + save: function save() { + var store = this.options.store; + store && store.set && store.set(this); + }, + + /** + * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. + * @param {HTMLElement} el + * @param {String} [selector] default: `options.draggable` + * @returns {HTMLElement|null} + */ + closest: function closest$1(el, selector) { + return closest(el, selector || this.options.draggable, this.el, false); + }, + + /** + * Set/get option + * @param {string} name + * @param {*} [value] + * @returns {*} + */ + option: function option(name, value) { + var options = this.options; + + if (value === void 0) { + return options[name]; + } else { + var modifiedValue = PluginManager.modifyOption(this, name, value); + + if (typeof modifiedValue !== 'undefined') { + options[name] = modifiedValue; + } else { + options[name] = value; + } + + if (name === 'group') { + _prepareGroup(options); + } + } + }, + + /** + * Destroy + */ + destroy: function destroy() { + pluginEvent('destroy', this); + var el = this.el; + el[expando] = null; + off(el, 'mousedown', this._onTapStart); + off(el, 'touchstart', this._onTapStart); + off(el, 'pointerdown', this._onTapStart); + + if (this.nativeDraggable) { + off(el, 'dragover', this); + off(el, 'dragenter', this); + } // Remove draggable attributes + + + Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { + el.removeAttribute('draggable'); + }); + + this._onDrop(); + + this._disableDelayedDragEvents(); + + sortables.splice(sortables.indexOf(this.el), 1); + this.el = el = null; + }, + _hideClone: function _hideClone() { + if (!cloneHidden) { + pluginEvent('hideClone', this); + if (Sortable.eventCanceled) return; + css(cloneEl, 'display', 'none'); + + if (this.options.removeCloneOnHide && cloneEl.parentNode) { + cloneEl.parentNode.removeChild(cloneEl); + } + + cloneHidden = true; + } + }, + _showClone: function _showClone(putSortable) { + if (putSortable.lastPutMode !== 'clone') { + this._hideClone(); + + return; + } + + if (cloneHidden) { + pluginEvent('showClone', this); + if (Sortable.eventCanceled) return; // show clone at dragEl or original position + + if (rootEl.contains(dragEl) && !this.options.group.revertClone) { + rootEl.insertBefore(cloneEl, dragEl); + } else if (nextEl) { + rootEl.insertBefore(cloneEl, nextEl); + } else { + rootEl.appendChild(cloneEl); + } + + if (this.options.group.revertClone) { + this.animate(dragEl, cloneEl); + } + + css(cloneEl, 'display', ''); + cloneHidden = false; + } + } + }; + + function _globalDragOver( + /**Event*/ + evt) { + if (evt.dataTransfer) { + evt.dataTransfer.dropEffect = 'move'; + } + + evt.cancelable && evt.preventDefault(); + } + + function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { + var evt, + sortable = fromEl[expando], + onMoveFn = sortable.options.onMove, + retVal; // Support for new CustomEvent feature + + if (window.CustomEvent && !IE11OrLess && !Edge) { + evt = new CustomEvent('move', { + bubbles: true, + cancelable: true + }); + } else { + evt = document.createEvent('Event'); + evt.initEvent('move', true, true); + } + + evt.to = toEl; + evt.from = fromEl; + evt.dragged = dragEl; + evt.draggedRect = dragRect; + evt.related = targetEl || toEl; + evt.relatedRect = targetRect || getRect(toEl); + evt.willInsertAfter = willInsertAfter; + evt.originalEvent = originalEvent; + fromEl.dispatchEvent(evt); + + if (onMoveFn) { + retVal = onMoveFn.call(sortable, evt, originalEvent); + } + + return retVal; + } + + function _disableDraggable(el) { + el.draggable = false; + } + + function _unsilent() { + _silent = false; + } + + function _ghostIsLast(evt, vertical, sortable) { + var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var spacer = 10; + return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; + } + + function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { + var mouseOnAxis = vertical ? evt.clientY : evt.clientX, + targetLength = vertical ? targetRect.height : targetRect.width, + targetS1 = vertical ? targetRect.top : targetRect.left, + targetS2 = vertical ? targetRect.bottom : targetRect.right, + invert = false; + + if (!invertSwap) { + // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold + if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { + // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2 + // check if past first invert threshold on side opposite of lastDirection + if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) { + // past first invert threshold, do not restrict inverted threshold to dragEl shadow + pastFirstInvertThresh = true; + } + + if (!pastFirstInvertThresh) { + // dragEl shadow (target move distance shadow) + if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow + : mouseOnAxis > targetS2 - targetMoveDistance) { + return -lastDirection; + } + } else { + invert = true; + } + } else { + // Regular + if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) { + return _getInsertDirection(target); + } + } + } + + invert = invert || invertSwap; + + if (invert) { + // Invert of regular + if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { + return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; + } + } + + return 0; + } + /** + * Gets the direction dragEl must be swapped relative to target in order to make it + * seem that dragEl has been "inserted" into that element's position + * @param {HTMLElement} target The target whose position dragEl is being inserted at + * @return {Number} Direction dragEl must be swapped + */ + + + function _getInsertDirection(target) { + if (index(dragEl) < index(target)) { + return 1; + } else { + return -1; + } + } + /** + * Generate id + * @param {HTMLElement} el + * @returns {String} + * @private + */ + + + function _generateId(el) { + var str = el.tagName + el.className + el.src + el.href + el.textContent, + i = str.length, + sum = 0; + + while (i--) { + sum += str.charCodeAt(i); + } + + return sum.toString(36); + } + + function _saveInputCheckedState(root) { + savedInputChecked.length = 0; + var inputs = root.getElementsByTagName('input'); + var idx = inputs.length; + + while (idx--) { + var el = inputs[idx]; + el.checked && savedInputChecked.push(el); + } + } + + function _nextTick(fn) { + return setTimeout(fn, 0); + } + + function _cancelNextTick(id) { + return clearTimeout(id); + } // Fixed #973: + + + if (documentExists) { + on(document, 'touchmove', function (evt) { + if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { + evt.preventDefault(); + } + }); + } // Export utils + + + Sortable.utils = { + on: on, + off: off, + css: css, + find: find, + is: function is(el, selector) { + return !!closest(el, selector, el, false); + }, + extend: extend, + throttle: throttle, + closest: closest, + toggleClass: toggleClass, + clone: clone, + index: index, + nextTick: _nextTick, + cancelNextTick: _cancelNextTick, + detectDirection: _detectDirection, + getChild: getChild + }; + /** + * Get the Sortable instance of an element + * @param {HTMLElement} element The element + * @return {Sortable|undefined} The instance of Sortable + */ + + Sortable.get = function (element) { + return element[expando]; + }; + /** + * Mount a plugin to Sortable + * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted + */ + + + Sortable.mount = function () { + for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { + plugins[_key] = arguments[_key]; + } + + if (plugins[0].constructor === Array) plugins = plugins[0]; + plugins.forEach(function (plugin) { + if (!plugin.prototype || !plugin.prototype.constructor) { + throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin)); + } + + if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils); + PluginManager.mount(plugin); + }); + }; + /** + * Create sortable instance + * @param {HTMLElement} el + * @param {Object} [options] + */ + + + Sortable.create = function (el, options) { + return new Sortable(el, options); + }; // Export + + + Sortable.version = version; + + var autoScrolls = [], + scrollEl, + scrollRootEl, + scrolling = false, + lastAutoScrollX, + lastAutoScrollY, + touchEvt$1, + pointerElemChangedInterval; + + function AutoScrollPlugin() { + function AutoScroll() { + this.defaults = { + scroll: true, + scrollSensitivity: 30, + scrollSpeed: 10, + bubbleScroll: true + }; // Bind all private methods + + for (var fn in this) { + if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { + this[fn] = this[fn].bind(this); + } + } + } + + AutoScroll.prototype = { + dragStarted: function dragStarted(_ref) { + var originalEvent = _ref.originalEvent; + + if (this.sortable.nativeDraggable) { + on(document, 'dragover', this._handleAutoScroll); + } else { + if (this.options.supportPointer) { + on(document, 'pointermove', this._handleFallbackAutoScroll); + } else if (originalEvent.touches) { + on(document, 'touchmove', this._handleFallbackAutoScroll); + } else { + on(document, 'mousemove', this._handleFallbackAutoScroll); + } + } + }, + dragOverCompleted: function dragOverCompleted(_ref2) { + var originalEvent = _ref2.originalEvent; + + // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached) + if (!this.options.dragOverBubble && !originalEvent.rootEl) { + this._handleAutoScroll(originalEvent); + } + }, + drop: function drop() { + if (this.sortable.nativeDraggable) { + off(document, 'dragover', this._handleAutoScroll); + } else { + off(document, 'pointermove', this._handleFallbackAutoScroll); + off(document, 'touchmove', this._handleFallbackAutoScroll); + off(document, 'mousemove', this._handleFallbackAutoScroll); + } + + clearPointerElemChangedInterval(); + clearAutoScrolls(); + cancelThrottle(); + }, + nulling: function nulling() { + touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null; + autoScrolls.length = 0; + }, + _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) { + this._handleAutoScroll(evt, true); + }, + _handleAutoScroll: function _handleAutoScroll(evt, fallback) { + var _this = this; + + var x = (evt.touches ? evt.touches[0] : evt).clientX, + y = (evt.touches ? evt.touches[0] : evt).clientY, + elem = document.elementFromPoint(x, y); + touchEvt$1 = evt; // IE does not seem to have native autoscroll, + // Edge's autoscroll seems too conditional, + // MACOS Safari does not have autoscroll, + // Firefox and Chrome are good + + if (fallback || Edge || IE11OrLess || Safari) { + autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change + + var ogElemScroller = getParentAutoScrollElement(elem, true); + + if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { + pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour + + pointerElemChangedInterval = setInterval(function () { + var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); + + if (newElem !== ogElemScroller) { + ogElemScroller = newElem; + clearAutoScrolls(); + } + + autoScroll(evt, _this.options, newElem, fallback); + }, 10); + lastAutoScrollX = x; + lastAutoScrollY = y; + } + } else { + // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll + if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) { + clearAutoScrolls(); + return; + } + + autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); + } + } + }; + return _extends(AutoScroll, { + pluginName: 'scroll', + initializeByDefault: true + }); + } + + function clearAutoScrolls() { + autoScrolls.forEach(function (autoScroll) { + clearInterval(autoScroll.pid); + }); + autoScrolls = []; + } + + function clearPointerElemChangedInterval() { + clearInterval(pointerElemChangedInterval); + } + + var autoScroll = throttle(function (evt, options, rootEl, isFallback) { + // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 + if (!options.scroll) return; + var x = (evt.touches ? evt.touches[0] : evt).clientX, + y = (evt.touches ? evt.touches[0] : evt).clientY, + sens = options.scrollSensitivity, + speed = options.scrollSpeed, + winScroller = getWindowScrollingElement(); + var scrollThisInstance = false, + scrollCustomFn; // New scroll root, set scrollEl + + if (scrollRootEl !== rootEl) { + scrollRootEl = rootEl; + clearAutoScrolls(); + scrollEl = options.scroll; + scrollCustomFn = options.scrollFn; + + if (scrollEl === true) { + scrollEl = getParentAutoScrollElement(rootEl, true); + } + } + + var layersOut = 0; + var currentParent = scrollEl; + + do { + var el = currentParent, + rect = getRect(el), + top = rect.top, + bottom = rect.bottom, + left = rect.left, + right = rect.right, + width = rect.width, + height = rect.height, + canScrollX = void 0, + canScrollY = void 0, + scrollWidth = el.scrollWidth, + scrollHeight = el.scrollHeight, + elCSS = css(el), + scrollPosX = el.scrollLeft, + scrollPosY = el.scrollTop; + + if (el === winScroller) { + canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible'); + canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible'); + } else { + canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll'); + canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll'); + } + + var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); + var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); + + if (!autoScrolls[layersOut]) { + for (var i = 0; i <= layersOut; i++) { + if (!autoScrolls[i]) { + autoScrolls[i] = {}; + } + } + } + + if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { + autoScrolls[layersOut].el = el; + autoScrolls[layersOut].vx = vx; + autoScrolls[layersOut].vy = vy; + clearInterval(autoScrolls[layersOut].pid); + + if (vx != 0 || vy != 0) { + scrollThisInstance = true; + /* jshint loopfunc:true */ + + autoScrolls[layersOut].pid = setInterval(function () { + // emulate drag over during autoscroll (fallback), emulating native DnD behaviour + if (isFallback && this.layer === 0) { + Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely + + } + + var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; + var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; + + if (typeof scrollCustomFn === 'function') { + if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') { + return; + } + } + + scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); + }.bind({ + layer: layersOut + }), 24); + } + } + + layersOut++; + } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); + + scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not + }, 30); + + var drop = function drop(_ref) { + var originalEvent = _ref.originalEvent, + putSortable = _ref.putSortable, + dragEl = _ref.dragEl, + activeSortable = _ref.activeSortable, + dispatchSortableEvent = _ref.dispatchSortableEvent, + hideGhostForTarget = _ref.hideGhostForTarget, + unhideGhostForTarget = _ref.unhideGhostForTarget; + if (!originalEvent) return; + var toSortable = putSortable || activeSortable; + hideGhostForTarget(); + var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; + var target = document.elementFromPoint(touch.clientX, touch.clientY); + unhideGhostForTarget(); + + if (toSortable && !toSortable.el.contains(target)) { + dispatchSortableEvent('spill'); + this.onSpill({ + dragEl: dragEl, + putSortable: putSortable + }); + } + }; + + function Revert() {} + + Revert.prototype = { + startIndex: null, + dragStart: function dragStart(_ref2) { + var oldDraggableIndex = _ref2.oldDraggableIndex; + this.startIndex = oldDraggableIndex; + }, + onSpill: function onSpill(_ref3) { + var dragEl = _ref3.dragEl, + putSortable = _ref3.putSortable; + this.sortable.captureAnimationState(); + + if (putSortable) { + putSortable.captureAnimationState(); + } + + var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); + + if (nextSibling) { + this.sortable.el.insertBefore(dragEl, nextSibling); + } else { + this.sortable.el.appendChild(dragEl); + } + + this.sortable.animateAll(); + + if (putSortable) { + putSortable.animateAll(); + } + }, + drop: drop + }; + + _extends(Revert, { + pluginName: 'revertOnSpill' + }); + + function Remove() {} + + Remove.prototype = { + onSpill: function onSpill(_ref4) { + var dragEl = _ref4.dragEl, + putSortable = _ref4.putSortable; + var parentSortable = putSortable || this.sortable; + parentSortable.captureAnimationState(); + dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + parentSortable.animateAll(); + }, + drop: drop + }; + + _extends(Remove, { + pluginName: 'removeOnSpill' + }); + + var lastSwapEl; + + function SwapPlugin() { + function Swap() { + this.defaults = { + swapClass: 'sortable-swap-highlight' + }; + } + + Swap.prototype = { + dragStart: function dragStart(_ref) { + var dragEl = _ref.dragEl; + lastSwapEl = dragEl; + }, + dragOverValid: function dragOverValid(_ref2) { + var completed = _ref2.completed, + target = _ref2.target, + onMove = _ref2.onMove, + activeSortable = _ref2.activeSortable, + changed = _ref2.changed, + cancel = _ref2.cancel; + if (!activeSortable.options.swap) return; + var el = this.sortable.el, + options = this.options; + + if (target && target !== el) { + var prevSwapEl = lastSwapEl; + + if (onMove(target) !== false) { + toggleClass(target, options.swapClass, true); + lastSwapEl = target; + } else { + lastSwapEl = null; + } + + if (prevSwapEl && prevSwapEl !== lastSwapEl) { + toggleClass(prevSwapEl, options.swapClass, false); + } + } + + changed(); + completed(true); + cancel(); + }, + drop: function drop(_ref3) { + var activeSortable = _ref3.activeSortable, + putSortable = _ref3.putSortable, + dragEl = _ref3.dragEl; + var toSortable = putSortable || this.sortable; + var options = this.options; + lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); + + if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { + if (dragEl !== lastSwapEl) { + toSortable.captureAnimationState(); + if (toSortable !== activeSortable) activeSortable.captureAnimationState(); + swapNodes(dragEl, lastSwapEl); + toSortable.animateAll(); + if (toSortable !== activeSortable) activeSortable.animateAll(); + } + } + }, + nulling: function nulling() { + lastSwapEl = null; + } + }; + return _extends(Swap, { + pluginName: 'swap', + eventProperties: function eventProperties() { + return { + swapItem: lastSwapEl + }; + } + }); + } + + function swapNodes(n1, n2) { + var p1 = n1.parentNode, + p2 = n2.parentNode, + i1, + i2; + if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return; + i1 = index(n1); + i2 = index(n2); + + if (p1.isEqualNode(p2) && i1 < i2) { + i2++; + } + + p1.insertBefore(n2, p1.children[i1]); + p2.insertBefore(n1, p2.children[i2]); + } + + var multiDragElements = [], + multiDragClones = [], + lastMultiDragSelect, + // for selection with modifier key down (SHIFT) + multiDragSortable, + initialFolding = false, + // Initial multi-drag fold when drag started + folding = false, + // Folding any other time + dragStarted = false, + dragEl$1, + clonesFromRect, + clonesHidden; + + function MultiDragPlugin() { + function MultiDrag(sortable) { + // Bind all private methods + for (var fn in this) { + if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { + this[fn] = this[fn].bind(this); + } + } + + if (sortable.options.supportPointer) { + on(document, 'pointerup', this._deselectMultiDrag); + } else { + on(document, 'mouseup', this._deselectMultiDrag); + on(document, 'touchend', this._deselectMultiDrag); + } + + on(document, 'keydown', this._checkKeyDown); + on(document, 'keyup', this._checkKeyUp); + this.defaults = { + selectedClass: 'sortable-selected', + multiDragKey: null, + setData: function setData(dataTransfer, dragEl) { + var data = ''; + + if (multiDragElements.length && multiDragSortable === sortable) { + multiDragElements.forEach(function (multiDragElement, i) { + data += (!i ? '' : ', ') + multiDragElement.textContent; + }); + } else { + data = dragEl.textContent; + } + + dataTransfer.setData('Text', data); + } + }; + } + + MultiDrag.prototype = { + multiDragKeyDown: false, + isMultiDrag: false, + delayStartGlobal: function delayStartGlobal(_ref) { + var dragged = _ref.dragEl; + dragEl$1 = dragged; + }, + delayEnded: function delayEnded() { + this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1); + }, + setupClone: function setupClone(_ref2) { + var sortable = _ref2.sortable, + cancel = _ref2.cancel; + if (!this.isMultiDrag) return; + + for (var i = 0; i < multiDragElements.length; i++) { + multiDragClones.push(clone(multiDragElements[i])); + multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex; + multiDragClones[i].draggable = false; + multiDragClones[i].style['will-change'] = ''; + toggleClass(multiDragClones[i], this.options.selectedClass, false); + multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false); + } + + sortable._hideClone(); + + cancel(); + }, + clone: function clone(_ref3) { + var sortable = _ref3.sortable, + rootEl = _ref3.rootEl, + dispatchSortableEvent = _ref3.dispatchSortableEvent, + cancel = _ref3.cancel; + if (!this.isMultiDrag) return; + + if (!this.options.removeCloneOnHide) { + if (multiDragElements.length && multiDragSortable === sortable) { + insertMultiDragClones(true, rootEl); + dispatchSortableEvent('clone'); + cancel(); + } + } + }, + showClone: function showClone(_ref4) { + var cloneNowShown = _ref4.cloneNowShown, + rootEl = _ref4.rootEl, + cancel = _ref4.cancel; + if (!this.isMultiDrag) return; + insertMultiDragClones(false, rootEl); + multiDragClones.forEach(function (clone) { + css(clone, 'display', ''); + }); + cloneNowShown(); + clonesHidden = false; + cancel(); + }, + hideClone: function hideClone(_ref5) { + var _this = this; + + var sortable = _ref5.sortable, + cloneNowHidden = _ref5.cloneNowHidden, + cancel = _ref5.cancel; + if (!this.isMultiDrag) return; + multiDragClones.forEach(function (clone) { + css(clone, 'display', 'none'); + + if (_this.options.removeCloneOnHide && clone.parentNode) { + clone.parentNode.removeChild(clone); + } + }); + cloneNowHidden(); + clonesHidden = true; + cancel(); + }, + dragStartGlobal: function dragStartGlobal(_ref6) { + var sortable = _ref6.sortable; + + if (!this.isMultiDrag && multiDragSortable) { + multiDragSortable.multiDrag._deselectMultiDrag(); + } + + multiDragElements.forEach(function (multiDragElement) { + multiDragElement.sortableIndex = index(multiDragElement); + }); // Sort multi-drag elements + + multiDragElements = multiDragElements.sort(function (a, b) { + return a.sortableIndex - b.sortableIndex; + }); + dragStarted = true; + }, + dragStarted: function dragStarted(_ref7) { + var _this2 = this; + + var sortable = _ref7.sortable; + if (!this.isMultiDrag) return; + + if (this.options.sort) { + // Capture rects, + // hide multi drag elements (by positioning them absolute), + // set multi drag elements rects to dragRect, + // show multi drag elements, + // animate to rects, + // unset rects & remove from DOM + sortable.captureAnimationState(); + + if (this.options.animation) { + multiDragElements.forEach(function (multiDragElement) { + if (multiDragElement === dragEl$1) return; + css(multiDragElement, 'position', 'absolute'); + }); + var dragRect = getRect(dragEl$1, false, true, true); + multiDragElements.forEach(function (multiDragElement) { + if (multiDragElement === dragEl$1) return; + setRect(multiDragElement, dragRect); + }); + folding = true; + initialFolding = true; + } + } + + sortable.animateAll(function () { + folding = false; + initialFolding = false; + + if (_this2.options.animation) { + multiDragElements.forEach(function (multiDragElement) { + unsetRect(multiDragElement); + }); + } // Remove all auxiliary multidrag items from el, if sorting enabled + + + if (_this2.options.sort) { + removeMultiDragElements(); + } + }); + }, + dragOver: function dragOver(_ref8) { + var target = _ref8.target, + completed = _ref8.completed, + cancel = _ref8.cancel; + + if (folding && ~multiDragElements.indexOf(target)) { + completed(false); + cancel(); + } + }, + revert: function revert(_ref9) { + var fromSortable = _ref9.fromSortable, + rootEl = _ref9.rootEl, + sortable = _ref9.sortable, + dragRect = _ref9.dragRect; + + if (multiDragElements.length > 1) { + // Setup unfold animation + multiDragElements.forEach(function (multiDragElement) { + sortable.addAnimationState({ + target: multiDragElement, + rect: folding ? getRect(multiDragElement) : dragRect + }); + unsetRect(multiDragElement); + multiDragElement.fromRect = dragRect; + fromSortable.removeAnimationState(multiDragElement); + }); + folding = false; + insertMultiDragElements(!this.options.removeCloneOnHide, rootEl); + } + }, + dragOverCompleted: function dragOverCompleted(_ref10) { + var sortable = _ref10.sortable, + isOwner = _ref10.isOwner, + insertion = _ref10.insertion, + activeSortable = _ref10.activeSortable, + parentEl = _ref10.parentEl, + putSortable = _ref10.putSortable; + var options = this.options; + + if (insertion) { + // Clones must be hidden before folding animation to capture dragRectAbsolute properly + if (isOwner) { + activeSortable._hideClone(); + } + + initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location + + if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) { + // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible + var dragRectAbsolute = getRect(dragEl$1, false, true, true); + multiDragElements.forEach(function (multiDragElement) { + if (multiDragElement === dragEl$1) return; + setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted + // while folding, and so that we can capture them again because old sortable will no longer be fromSortable + + parentEl.appendChild(multiDragElement); + }); + folding = true; + } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out + + + if (!isOwner) { + // Only remove if not folding (folding will remove them anyways) + if (!folding) { + removeMultiDragElements(); + } + + if (multiDragElements.length > 1) { + var clonesHiddenBefore = clonesHidden; + + activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden + + + if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) { + multiDragClones.forEach(function (clone) { + activeSortable.addAnimationState({ + target: clone, + rect: clonesFromRect + }); + clone.fromRect = clonesFromRect; + clone.thisAnimationDuration = null; + }); + } + } else { + activeSortable._showClone(sortable); + } + } + } + }, + dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) { + var dragRect = _ref11.dragRect, + isOwner = _ref11.isOwner, + activeSortable = _ref11.activeSortable; + multiDragElements.forEach(function (multiDragElement) { + multiDragElement.thisAnimationDuration = null; + }); + + if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) { + clonesFromRect = _extends({}, dragRect); + var dragMatrix = matrix(dragEl$1, true); + clonesFromRect.top -= dragMatrix.f; + clonesFromRect.left -= dragMatrix.e; + } + }, + dragOverAnimationComplete: function dragOverAnimationComplete() { + if (folding) { + folding = false; + removeMultiDragElements(); + } + }, + drop: function drop(_ref12) { + var evt = _ref12.originalEvent, + rootEl = _ref12.rootEl, + parentEl = _ref12.parentEl, + sortable = _ref12.sortable, + dispatchSortableEvent = _ref12.dispatchSortableEvent, + oldIndex = _ref12.oldIndex, + putSortable = _ref12.putSortable; + var toSortable = putSortable || this.sortable; + if (!evt) return; + var options = this.options, + children = parentEl.children; // Multi-drag selection + + if (!dragStarted) { + if (options.multiDragKey && !this.multiDragKeyDown) { + this._deselectMultiDrag(); + } + + toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1)); + + if (!~multiDragElements.indexOf(dragEl$1)) { + multiDragElements.push(dragEl$1); + dispatchEvent({ + sortable: sortable, + rootEl: rootEl, + name: 'select', + targetEl: dragEl$1, + originalEvt: evt + }); // Modifier activated, select from last to dragEl + + if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) { + var lastIndex = index(lastMultiDragSelect), + currentIndex = index(dragEl$1); + + if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) { + // Must include lastMultiDragSelect (select it), in case modified selection from no selection + // (but previous selection existed) + var n, i; + + if (currentIndex > lastIndex) { + i = lastIndex; + n = currentIndex; + } else { + i = currentIndex; + n = lastIndex + 1; + } + + for (; i < n; i++) { + if (~multiDragElements.indexOf(children[i])) continue; + toggleClass(children[i], options.selectedClass, true); + multiDragElements.push(children[i]); + dispatchEvent({ + sortable: sortable, + rootEl: rootEl, + name: 'select', + targetEl: children[i], + originalEvt: evt + }); + } + } + } else { + lastMultiDragSelect = dragEl$1; + } + + multiDragSortable = toSortable; + } else { + multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1); + lastMultiDragSelect = null; + dispatchEvent({ + sortable: sortable, + rootEl: rootEl, + name: 'deselect', + targetEl: dragEl$1, + originalEvt: evt + }); + } + } // Multi-drag drop + + + if (dragStarted && this.isMultiDrag) { + // Do not "unfold" after around dragEl if reverted + if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) { + var dragRect = getRect(dragEl$1), + multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); + if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null; + toSortable.captureAnimationState(); + + if (!initialFolding) { + if (options.animation) { + dragEl$1.fromRect = dragRect; + multiDragElements.forEach(function (multiDragElement) { + multiDragElement.thisAnimationDuration = null; + + if (multiDragElement !== dragEl$1) { + var rect = folding ? getRect(multiDragElement) : dragRect; + multiDragElement.fromRect = rect; // Prepare unfold animation + + toSortable.addAnimationState({ + target: multiDragElement, + rect: rect + }); + } + }); + } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert + // properly they must all be removed + + + removeMultiDragElements(); + multiDragElements.forEach(function (multiDragElement) { + if (children[multiDragIndex]) { + parentEl.insertBefore(multiDragElement, children[multiDragIndex]); + } else { + parentEl.appendChild(multiDragElement); + } + + multiDragIndex++; + }); // If initial folding is done, the elements may have changed position because they are now + // unfolding around dragEl, even though dragEl may not have his index changed, so update event + // must be fired here as Sortable will not. + + if (oldIndex === index(dragEl$1)) { + var update = false; + multiDragElements.forEach(function (multiDragElement) { + if (multiDragElement.sortableIndex !== index(multiDragElement)) { + update = true; + return; + } + }); + + if (update) { + dispatchSortableEvent('update'); + } + } + } // Must be done after capturing individual rects (scroll bar) + + + multiDragElements.forEach(function (multiDragElement) { + unsetRect(multiDragElement); + }); + toSortable.animateAll(); + } + + multiDragSortable = toSortable; + } // Remove clones if necessary + + + if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { + multiDragClones.forEach(function (clone) { + clone.parentNode && clone.parentNode.removeChild(clone); + }); + } + }, + nullingGlobal: function nullingGlobal() { + this.isMultiDrag = dragStarted = false; + multiDragClones.length = 0; + }, + destroyGlobal: function destroyGlobal() { + this._deselectMultiDrag(); + + off(document, 'pointerup', this._deselectMultiDrag); + off(document, 'mouseup', this._deselectMultiDrag); + off(document, 'touchend', this._deselectMultiDrag); + off(document, 'keydown', this._checkKeyDown); + off(document, 'keyup', this._checkKeyUp); + }, + _deselectMultiDrag: function _deselectMultiDrag(evt) { + if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable + + if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable + + if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click + + if (evt && evt.button !== 0) return; + + while (multiDragElements.length) { + var el = multiDragElements[0]; + toggleClass(el, this.options.selectedClass, false); + multiDragElements.shift(); + dispatchEvent({ + sortable: this.sortable, + rootEl: this.sortable.el, + name: 'deselect', + targetEl: el, + originalEvt: evt + }); + } + }, + _checkKeyDown: function _checkKeyDown(evt) { + if (evt.key === this.options.multiDragKey) { + this.multiDragKeyDown = true; + } + }, + _checkKeyUp: function _checkKeyUp(evt) { + if (evt.key === this.options.multiDragKey) { + this.multiDragKeyDown = false; + } + } + }; + return _extends(MultiDrag, { + // Static methods & properties + pluginName: 'multiDrag', + utils: { + /** + * Selects the provided multi-drag item + * @param {HTMLElement} el The element to be selected + */ + select: function select(el) { + var sortable = el.parentNode[expando]; + if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return; + + if (multiDragSortable && multiDragSortable !== sortable) { + multiDragSortable.multiDrag._deselectMultiDrag(); + + multiDragSortable = sortable; + } + + toggleClass(el, sortable.options.selectedClass, true); + multiDragElements.push(el); + }, + + /** + * Deselects the provided multi-drag item + * @param {HTMLElement} el The element to be deselected + */ + deselect: function deselect(el) { + var sortable = el.parentNode[expando], + index = multiDragElements.indexOf(el); + if (!sortable || !sortable.options.multiDrag || !~index) return; + toggleClass(el, sortable.options.selectedClass, false); + multiDragElements.splice(index, 1); + } + }, + eventProperties: function eventProperties() { + var _this3 = this; + + var oldIndicies = [], + newIndicies = []; + multiDragElements.forEach(function (multiDragElement) { + oldIndicies.push({ + multiDragElement: multiDragElement, + index: multiDragElement.sortableIndex + }); // multiDragElements will already be sorted if folding + + var newIndex; + + if (folding && multiDragElement !== dragEl$1) { + newIndex = -1; + } else if (folding) { + newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')'); + } else { + newIndex = index(multiDragElement); + } + + newIndicies.push({ + multiDragElement: multiDragElement, + index: newIndex + }); + }); + return { + items: _toConsumableArray(multiDragElements), + clones: [].concat(multiDragClones), + oldIndicies: oldIndicies, + newIndicies: newIndicies + }; + }, + optionListeners: { + multiDragKey: function multiDragKey(key) { + key = key.toLowerCase(); + + if (key === 'ctrl') { + key = 'Control'; + } else if (key.length > 1) { + key = key.charAt(0).toUpperCase() + key.substr(1); + } + + return key; + } + } + }); + } + + function insertMultiDragElements(clonesInserted, rootEl) { + multiDragElements.forEach(function (multiDragElement, i) { + var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)]; + + if (target) { + rootEl.insertBefore(multiDragElement, target); + } else { + rootEl.appendChild(multiDragElement); + } + }); + } + /** + * Insert multi-drag clones + * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted + * @param {HTMLElement} rootEl + */ + + + function insertMultiDragClones(elementsInserted, rootEl) { + multiDragClones.forEach(function (clone, i) { + var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)]; + + if (target) { + rootEl.insertBefore(clone, target); + } else { + rootEl.appendChild(clone); + } + }); + } + + function removeMultiDragElements() { + multiDragElements.forEach(function (multiDragElement) { + if (multiDragElement === dragEl$1) return; + multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement); + }); + } + + Sortable.mount(new AutoScrollPlugin()); + Sortable.mount(Remove, Revert); + + Sortable.mount(new SwapPlugin()); + Sortable.mount(new MultiDragPlugin()); + + return Sortable; + +})); diff --git a/module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.min.js b/module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.min.js new file mode 100644 index 00000000..eba06149 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/Sortable/Sortable.min.js @@ -0,0 +1,2 @@ +/*! Sortable 1.10.2 - MIT | git://github.com/SortableJS/Sortable.git */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"===e[0]?t.parentNode===n&&h(t,e):h(t,e))||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode)}var i;return null}var f,p=/\s+/g;function k(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(p," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(p," ")}}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function g(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=e.left-n&&r<=e.right+n,i=a>=e.top-n&&a<=e.bottom+n;return n&&o&&i?l=t:void 0}}),l}((t=t.touches?t.touches[0]:t).clientX,t.clientY);if(e){var n={};for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);n.target=n.rootEl=e,n.preventDefault=void 0,n.stopPropagation=void 0,e[j]._onDragOver(n)}}}function kt(t){z&&z.parentNode[j]._isOutsideThisEl(t.target)}function Rt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Rt.supportPointer&&"PointerEvent"in window,emptyInsertThreshold:5};for(var o in O.initializePlugins(this,t,n),n)o in e||(e[o]=n[o]);for(var i in At(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&xt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?u(t,"pointerdown",this._onTapStart):(u(t,"mousedown",this._onTapStart),u(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(u(t,"dragover",this),u(t,"dragenter",this)),bt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,T())}function Xt(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||w||E?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),d&&(c=d.call(u,s,a)),c}function Yt(t){t.draggable=!1}function Bt(){Dt=!1}function Ft(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function Ht(t){return setTimeout(t,0)}function Lt(t){return clearTimeout(t)}Rt.prototype={constructor:Rt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(ht=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,z):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(function(t){St.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&St.push(o)}}(o),!z&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled||s.isContentEditable||(l=P(l,t.draggable,o,!1))&&l.animated||Z===l)){if(J=F(l),et=F(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return W({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),K("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return W({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),K("filter",n,{evt:e}),!0})))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;if(n&&!z&&n.parentNode===r){var s=X(n);if(q=r,G=(z=n).parentNode,V=z.nextSibling,Z=n,ot=a.group,rt={target:Rt.dragged=z,clientX:(e||t).clientX,clientY:(e||t).clientY},ct=rt.clientX-s.left,ut=rt.clientY-s.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,z.style["will-change"]="all",o=function(){K("delayEnded",i,{evt:t}),Rt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&(z.draggable=!0),i._triggerDragStart(t,e),W({sortable:i,name:"choose",originalEvent:t}),k(z,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){g(z,t.trim(),Yt)}),u(l,"dragover",Pt),u(l,"mousemove",Pt),u(l,"touchmove",Pt),u(l,"mouseup",i._onDrop),u(l,"touchend",i._onDrop),u(l,"touchcancel",i._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,z.draggable=!0),K("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(E||w))o();else{if(Rt.eventCanceled)return void this._onDrop();u(l,"mouseup",i._disableDelayedDrag),u(l,"touchend",i._disableDelayedDrag),u(l,"touchcancel",i._disableDelayedDrag),u(l,"mousemove",i._delayedDragTouchMoveHandler),u(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&u(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){z&&Yt(z),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;d(t,"mouseup",this._disableDelayedDrag),d(t,"touchend",this._disableDelayedDrag),d(t,"touchcancel",this._disableDelayedDrag),d(t,"mousemove",this._delayedDragTouchMoveHandler),d(t,"touchmove",this._delayedDragTouchMoveHandler),d(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?u(document,"pointermove",this._onTouchMove):u(document,e?"touchmove":"mousemove",this._onTouchMove):(u(z,"dragend",this),u(q,"dragstart",this._onDragStart));try{document.selection?Ht(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(vt=!1,q&&z){K("dragStarted",this,{evt:e}),this.nativeDraggable&&u(document,"dragover",kt);var n=this.options;t||k(z,n.dragClass,!1),k(z,n.ghostClass,!0),Rt.active=this,t&&this._appendGhost(),W({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Nt();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY))!==e;)e=t;if(z.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){if(e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);It()}},_onTouchMove:function(t){if(rt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=U&&v(U,!0),a=U&&r&&r.a,l=U&&r&&r.d,s=Ct&>&&b(gt),c=(i.clientX-rt.clientX+o.x)/(a||1)+(s?s[0]-Et[0]:0)/(a||1),u=(i.clientY-rt.clientY+o.y)/(l||1)+(s?s[1]-Et[1]:0)/(l||1);if(!Rt.active&&!vt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||t.clientX<=o.right&&t.clientY>o.bottom&&t.clientX>=o.left:t.clientX>o.right&&t.clientY>o.top||t.clientX<=o.right&&t.clientY>o.bottom+10}(n,a,this)&&!g.animated){if(g===z)return A(!1);if(g&&l===n.target&&(s=g),s&&(i=X(s)),!1!==Xt(q,l,z,o,s,i,n,!!s))return O(),l.appendChild(z),G=l,N(),A(!0)}else if(s.parentNode===l){i=X(s);var v,m,b,y=z.parentNode!==l,w=!function(t,e,n){var o=n?t.left:t.top,i=n?t.right:t.bottom,r=n?t.width:t.height,a=n?e.left:e.top,l=n?e.right:e.bottom,s=n?e.width:e.height;return o===a||i===l||o+r/2===a+s/2}(z.animated&&z.toRect||o,s.animated&&s.toRect||i,a),E=a?"top":"left",D=Y(s,"top","top")||Y(z,"top","top"),S=D?D.scrollTop:void 0;if(ht!==s&&(m=i[E],yt=!1,wt=!w&&e.invertSwap||y),0!==(v=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,u=o?n.top:n.left,d=o?n.bottom:n.right,h=!1;if(!a)if(l&&pt.layui-tab { + margin: 0; + box-shadow: none; + border: none; +} + +/* 表达式 */ +.cron-title { + font-weight: 700; + font-size: 14px; + margin: 10px; + margin-bottom: 0; +} + +.cron-box { + margin: 10px; +} + +.cron-box+.cron-box { + margin-top: 0; +} + +/* 按钮 */ +.cron-footer-btns { + text-align: right; +} + +.cron-footer-btns span { + height: 26px; + line-height: 26px; + margin: 0 0 0 -1px; + padding: 0 10px; + border: 1px solid #C9C9C9; + background-color: #fff; + white-space: nowrap; + vertical-align: top; + border-radius: 2px; + display: inline-block; + cursor: pointer; + font-size: 12px; + box-sizing: border-box; + color: #666; +} + +.cron-footer-btns span:hover { + color: #5FB878; +} + + +/* 表单 */ +.layui-cron .layui-form-radio { + margin-right: 0; +} + +.cron-form { + line-height: 28px; + font-size: 14px; +} + +.cron-input-mid { + display: inline-block; + vertical-align: middle; + margin-top: 6px; + background-color: #e5e5e5; + padding: 0 12px; + height: 28px; + line-height: 28px; + border: 1px solid #ccc; + box-sizing: border-box; +} + +.cron-input { + display: inline-block; + vertical-align: middle; + margin-top: 6px; + padding: 0 8px; + background-color: #fff; + border: 1px solid #ccc; + height: 28px; + line-height: 28px; + box-sizing: border-box; + width: 80px; + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; +} + +.cron-input:focus { + outline: 0; + border: 1px solid #01AAED; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 4px 0px #01AAED; + translate: 1s; +} + +.layui-cron .layui-form-checkbox[lay-skin="primary"] span { + padding-right: 10px; + min-width: 16px; +} + +.layui-cron .layui-form-checkbox[lay-skin="primary"] { + padding-left: 22px; + margin-top: 5px; +} +.layui-cron input[type=number] { + -moz-appearance:textfield; +} +.layui-cron input[type=number]::-webkit-inner-spin-button, +.layui-cron input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} +.cron-tips{ + color: grey; + line-height: 28px; + height: 28px; + display: inline-block; + vertical-align: middle; + margin-top: 8px; + margin-left: 5px; +} \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/cron.js b/module-form/src/main/resources/static/form-design/modules/cron.js new file mode 100644 index 00000000..e050c3ed --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/cron.js @@ -0,0 +1,1131 @@ +layui.define(["form"], function (exports) { + //假如该组件依赖 layui.form + var $ = layui.$, + form = layui.form, + //字符常量 + MOD_NAME = "cron", + ELEM = ".layui-cron", + //外部接口 + cron = { + v: "1.0.0", + index: layui.cron ? layui.cron.index + 10000 : 0, + + //设置全局项 + set: function (options) { + var that = this; + that.config = $.extend({}, that.config, options); + return that; + }, + + //事件监听 + on: function (events, callback) { + return layui.onevent.call(this, MOD_NAME, events, callback); + }, + //主体CSS等待事件 + ready: function (fn) { + var cssPath = layui.cache.base + "cron/cron.css?v=" + cron.v; + layui.link(cssPath, fn, "cron"); //此处的“cron”要对应 cron.css 中的样式: html #layuicss-cron{} + return this; + }, + }, + // 返回当前实例 + thisIns = function () { + var that = this, + options = that.config, + id = options.id || options.index; + return { + reload: function (options) { + that.reload.call(that, options); + }, + config: options, + }; + }, + //构造器 + Class = function (options) { + var that = this; + that.index = ++cron.index; + that.config = $.extend({}, that.config, cron.config, options); + cron.ready(function () { + that.init(); + }); + }; + + //默认配置 + Class.prototype.config = { + value: "* * * * * ?", // 当前表达式值,每秒执行一次 + lang: "cn", //语言,只支持cn/en,即中文和英文 + trigger: "focus", //呼出控件的事件 + done: null, //控件选择完毕后的回调,点击运行/确定也均会触发 + run: null, // 最近运行时间接口 + }; + + // 多语言 + Class.prototype.lang = function () { + var that = this, + options = that.config, + text = { + cn: { + tabs: ["秒", "分", "时", "日", "月", "周", "年"], + tools: { + confirm: "确定", + parse: "解析", + run: "运行", + }, + }, + en: { + tabs: [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Months", + "Weeks", + "Years", + ], + weeks: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], + month: [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ], + tools: { + confirm: "Confirm", + parse: "Parse", + run: "Run", + }, + }, + }; + return text[options.lang] || text["cn"]; + }; + + // 初始准备 + Class.prototype.init = function () { + var that = this, + options = that.config; + + that.$elem = $(options.elem); + options.elem = that.$elem[0]; + + if (!options.elem) return; + + options.value || (options.value = "* * * * * ?"); + + // 初始化表达式 + var arr = options.value.split(" "); + that.cron = []; + for (var i = 1; i <= 7; i++) { + if (i < 6) { + that.cron.push(arr[i - 1] || "*"); + } else if (i < 7) { + that.cron.push(arr[i - 1] || "?"); + } else { + that.cron.push(arr[i - 1] || ""); + } + } + + //如果不是input|textarea元素,则默认采用click事件 + if (!that.isInput(options.elem)) { + if (options.trigger === "focus") { + options.trigger = "click"; + } + } + + console.log("绑定事件."); + that.events(); + }; + + // 绑定的元素事件处理 + Class.prototype.events = function () { + var that = this, + options = that.config; + if (!options.elem || options.elem.eventHandler) return; + + // 绑定触发事件 + that.$elem.on(options.trigger, function () { + that.render(); + }); + + // 绑定关闭控件事件 + $(document) + .on("click", function (e) { + if ( + (that.elemCron && that.elemCron.contains(e.target)) || + e.target === options.elem + ) { + return; // 点击的是当前绑定元素或cron容器内的元素则不关闭 + } + that.remove(); + }) + .on("keydown", function (e) { + if (e.keyCode === 13) { + e.preventDefault(); + layer.msg("取消事件默认动作,点击确定按钮"); + // $(that.footer).find(ELEM_CONFIRM)[0].click(); + } + }); + + //自适应定位 + $(window).on("resize", function () { + if (!options.elem || !$(ELEM)[0]) { + return false; + } + that.position(); + }); + + options.elem.eventHandler = true; + }; + + // 渲染视图 + Class.prototype.render = function () { + var that = this, + options = that.config, + lang = that.lang(); + // that.remove(); + + var $elemCron = (that.$elemCron = $('
    ')), + // 主区域 + elemMain = [], // tabs容器 + elemSeconds = that.getSecondsElem(), // 秒 + elemMinutes = that.getMinutesElem(), // 分 + elemHours = that.getHoursElem(), // 时 + elemDays = that.getDaysElem(), // 日 + elemMonths = that.getMonthsElem(), // 月 + elemWeeks = that.getWeeksElem(), // 周 + elemYears = that.getYearsElem(); // 年 + + // 组装容器 + elemMain.push( + '
    ', + '
      ' + ); + layui.each(lang.tabs, function (i, tab) { + if (i == 0) { + elemMain.push('
    • ', tab, "
    • "); + } else { + elemMain.push("
    • ", tab, "
    • "); + } + }); + elemMain.push( + "
    ", + '
    ', + elemSeconds, + elemMinutes, + elemHours, + elemDays, + elemMonths, + elemWeeks, + elemYears, + "
    ", + "
    " + ); + $elemCron.append(elemMain.join("")); + + // 底部区域 + var elemFooter = [ + '
    最近运行时间
    ', + '
    ', + '
    ', + ]; + $elemCron.append(elemFooter.join("")); + + // 渲染 + $("body").append($elemCron); + that.elemCron = that.$elemCron[0]; + form.render(); + + // 定位 + that.position(); + + // 监听 + //点击底部按钮 + $elemCron.find(".cron-footer-btns span").on("click", function () { + var type = $(this).attr("lay-type"); + that.tool(this, type); + }); + }; + + // 渲染秒 + Class.prototype.getSecondsElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[0] == "*") { + radio[0] = "checked"; + } else if (that.cron[0].split("-").length == 2) { + radio[1] = "checked"; + val[0] = that.cron[0].split("-")[0]; + val[1] = that.cron[0].split("-")[1]; + } else if (that.cron[0].split("/").length == 2) { + radio[2] = "checked"; + val[2] = that.cron[0].split("/")[0]; + val[3] = that.cron[0].split("/")[1]; + } else { + radio[3] = "checked"; + val[4] = that.cron[0].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (0-59)
    ', + '
    ", + '
    ', + '
    秒开始,每
    ', + '
    秒执行一次
    (0/60)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 60; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染分 + Class.prototype.getMinutesElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[1] == "*") { + radio[0] = "checked"; + } else if (that.cron[1].split("-").length == 2) { + radio[1] = "checked"; + val[0] = that.cron[1].split("-")[0]; + val[1] = that.cron[1].split("-")[1]; + } else if (that.cron[1].split("/").length == 2) { + radio[2] = "checked"; + val[2] = that.cron[1].split("/")[0]; + val[3] = that.cron[1].split("/")[1]; + } else { + radio[3] = "checked"; + val[4] = that.cron[1].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (0-59)
    ', + '
    ", + '
    ', + '
    分开始,每
    ', + '
    分执行一次
    (0/60)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 60; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染时 + Class.prototype.getHoursElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[2] == "*") { + radio[0] = "checked"; + } else if (that.cron[2].split("-").length == 2) { + radio[1] = "checked"; + val[0] = that.cron[2].split("-")[0]; + val[1] = that.cron[2].split("-")[1]; + } else if (that.cron[2].split("/").length == 2) { + radio[2] = "checked"; + val[2] = that.cron[2].split("/")[0]; + val[3] = that.cron[2].split("/")[1]; + } else { + radio[3] = "checked"; + val[4] = that.cron[2].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (0-23)
    ', + '
    ", + '
    ', + '
    时开始,每
    ', + '
    时执行一次
    (0/24)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 24; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染天 + Class.prototype.getDaysElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", "", "", "", ""]; + val = ["", "", "", "", "", []]; + + if (that.cron[3] == "*") { + radio[0] = "checked"; + } else if (that.cron[3] == "?") { + radio[1] = "checked"; + } else if (that.cron[3].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[3].split("-")[0]; + val[1] = that.cron[3].split("-")[1]; + } else if (that.cron[3].split("/").length == 2) { + radio[3] = "checked"; + val[2] = that.cron[3].split("/")[0]; + val[3] = that.cron[3].split("/")[1]; + } else if (that.cron[3].indexOf("W") > -1) { + radio[4] = "checked"; + val[4] = that.cron[3].match(/(\d+)W$/)[1]; + } else if (that.cron[3] == "L") { + radio[5] = "checked"; + } else { + radio[6] = "checked"; + val[5] = that.cron[3].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (1-31)
    ', + '
    ", + '
    ', + '
    日开始,每
    ', + '
    日执行一次
    (1/31)
    ', + '
    ", + '
    每月
    ', + '
    号最近的那个工作日
    (1-31)
    ', + '
    ", + '
    " + ); + elem.push("
    "); + for (var i = 1; i <= 31; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染月 + Class.prototype.getMonthsElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[4] == "*") { + radio[0] = "checked"; + } else if (that.cron[4] == "?") { + radio[1] = "checked"; + } else if (that.cron[4].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[4].split("-")[0]; + val[1] = that.cron[4].split("-")[1]; + } else if (that.cron[4].split("/").length == 2) { + radio[3] = "checked"; + val[2] = that.cron[4].split("/")[0]; + val[3] = that.cron[4].split("/")[1]; + } else { + radio[4] = "checked"; + val[4] = that.cron[4].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (1-12)
    ', + '
    ", + '
    ', + '
    月开始,每
    ', + '
    月执行一次
    (1/12)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 24; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染周 + Class.prototype.getWeeksElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", "", "", ""]; + val = ["", "", "", "", "", []]; + + if (that.cron[5] == "*") { + radio[0] = "checked"; + } else if (that.cron[5] == "?") { + radio[1] = "checked"; + } else if (that.cron[5].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[5].split("-")[0]; + val[1] = that.cron[5].split("-")[1]; + } else if (that.cron[5].split("#").length == 2) { + radio[3] = "checked"; + val[2] = that.cron[5].split("#")[0]; + val[3] = that.cron[5].split("#")[1]; + } else if (/\d+L/.test(that.cron[5])) { + radio[4] = "checked"; + val[4] = that.cron[5].match(/(\d+)L/)[1]; + } else { + radio[5] = "checked"; + val[5] = that.cron[5].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (1-7)
    ', + '
    ", + '
    ', + '
    周的星期
    ', + '(1-4/1-7)
    ', + '
    ', + '(1-7)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 1; i <= 7; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染年 + Class.prototype.getYearsElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", ""]; + val = ["", ""]; + + if (that.cron[6] == "*") { + radio[0] = "checked"; + } else if (that.cron[6] == "" || that.cron[6] == " ") { + radio[1] = "checked"; + } else if (that.cron[6].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[6].split("-")[0]; + val[1] = that.cron[6].split("-")[1]; + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    ' + ); + + elem.push("
    "); + + return elem.join(""); + }; + + function isNotBlank(str) { + return str != undefined && str !== ""; + } + + // 底部按钮事件 + Class.prototype.tool = function (btn, type) { + var that = this, + options = that.config, + active = { + // 计算秒 + calSeconds: function () { + var data = form.val("cronSecForm"), + dataType = data["type[0]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[0] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[0] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^seconds/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[0] = checkbox.join(","); + } else { + that.cron[0] = "*"; + } + } else if ("all" == dataType) { + that.cron[0] = "*"; + } + }, + calMinutes: function () { + var data = form.val("cronMinForm"), + dataType = data["type[1]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[1] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[1] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^minutes/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[1] = checkbox.join(","); + } else { + that.cron[1] = "*"; + } + } else if ("all" == dataType) { + that.cron[1] = "*"; + } + }, + calHours: function () { + var data = form.val("cronHourForm"), + dataType = data["type[2]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[2] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[2] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^hours/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[2] = checkbox.join(","); + } else { + that.cron[2] = "*"; + } + } else if ("all" == dataType) { + that.cron[2] = "*"; + } + }, + calDays: function () { + var data = form.val("cronDayForm"), + dataType = data["type[3]"]; + + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[3] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[3] = data.perFrom + "/" + data.perVal; + } else if ("work" == dataType && isNotBlank(data.workDay)) { + that.cron[3] = data.workDay + "W"; + } else if ("last" == dataType) { + that.cron[3] = "L"; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^days/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[3] = checkbox.join(","); + } else { + that.cron[3] = "*"; + } + } else if ("all" == dataType) { + that.cron[3] = "*"; + } else if ("none" == dataType) { + that.cron[3] = "?"; + } + }, + calMonths: function () { + var data = form.val("cronMonthFrom"), + dataType = data["type[4]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[4] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[4] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^months/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[4] = checkbox.join(","); + } else { + that.cron[4] = "*"; + } + } else if ("all" == dataType) { + that.cron[4] = "*"; + } else if ("none" == dataType) { + that.cron[4] = "?"; + } + }, + calWeeks: function () { + var data = form.val("cronWeekForm"), + dataType = data["type[5]"]; + console.log(data); + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[5] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[5] = data.perFrom + "#" + data.perVal; + } else if ("last" == dataType && isNotBlank(data.lastVal)) { + that.cron[5] = data.lastVal + "L"; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^weeks/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[5] = checkbox.join(","); + } else { + that.cron[5] = "*"; + } + } else if ("all" == dataType) { + that.cron[5] = "*"; + } else if ("none" == dataType) { + that.cron[5] = "?"; + } + }, + calYears: function () { + var data = form.val("cronYearForm"), + dataType = data["type[6]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[6] = data.rangeStart + "-" + data.rangeEnd; + } else if ("all" == dataType) { + that.cron[6] = "*"; + } else if ("none" == dataType) { + that.cron[6] = ""; + } + }, + + // 计算表达式 + calculate: function () { + active.calSeconds(); + active.calMinutes(); + active.calHours(); + active.calDays(); + active.calMonths(); + active.calWeeks(); + active.calYears(); + if (that.cron[5] != "?" && that.cron[3] != "?") { + layer.msg("不支持周参数和日参数同时存在"); + return false; + } + return true; + }, + // 运行 + run: function () { + if (!active.calculate()) { + return; + } + var cronStr = that.cron.join(" ").trim(); + // TODO 请求接口获取最近运行时间,或js生成最近运行时间 + if (options.url) { + $.post( + options.url, + { cron: cronStr }, + function (res) { + if (res.code == 0) { + $("#run-list").empty().append(res.data.join("
    ")); + } else { + layer.alert(res.msg, { icon: 2, title: "错误" }); + } + }, + "json" + ); + } + options.done(cronStr); + }, + + //确定 + confirm: function () { + if (!active.calculate()) { + return; + } + var cronStr = that.cron.join(" ").trim(); + options.done && options.done(cronStr); + that.remove(); + }, + }; + active[type] && active[type](); + }; + + // 定位算法 + Class.prototype.position = function () { + var that = this, + options = that.config, + elem = options.elem, + rect = elem.getBoundingClientRect(), //绑定元素的坐标 + cronWidth = that.elemCron.offsetWidth, //控件的宽度 + cronHeight = that.elemCron.offsetHeight, //控件的高度 + //滚动条高度 + scrollArea = function (type) { + type = type ? "scrollLeft" : "scrollTop"; + return document.body[type] | document.documentElement[type]; + }, + winArea = function (type) { + return document.documentElement[type ? "clientWidth" : "clientHeight"]; + }, + margin = 5, + left = rect.left, + top = rect.bottom; + + //如果右侧超出边界 + if (left + cronWidth + margin > winArea("width")) { + left = winArea("width") - cronWidth - margin; + } + + //如果底部超出边界 + if (top + cronHeight + margin > winArea()) { + top = + rect.top > cronHeight //顶部是否有足够区域显示完全 + ? rect.top - cronHeight + : winArea() - cronHeight; + top = top - margin * 2; + } + + that.elemCron.style.left = + left + (options.position === "fixed" ? 0 : scrollArea(1)) + "px"; + that.elemCron.style.top = + top + (options.position === "fixed" ? 0 : scrollArea()) + "px"; + }; + + // 控件移除 + Class.prototype.remove = function () { + var that = this, + options = that.config; + $(ELEM).remove(); + }; + + // 是否输入框 + Class.prototype.isInput = function (elem) { + return /input|textarea/.test(elem.tagName.toLocaleLowerCase()); + }; + + /** + * 核心入口 + * @param options + * @returns {{reload: reload, config: *}} + */ + cron.render = function (options) { + var ins = new Class(options); + return thisIns.call(ins); + }; + + exports("cron", cron); +}); diff --git a/module-form/src/main/resources/static/form-design/modules/formDesigner.css b/module-form/src/main/resources/static/form-design/modules/formDesigner.css new file mode 100644 index 00000000..89ea36a9 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/formDesigner.css @@ -0,0 +1,370 @@ +.layui-layout-admin .layui-logo { + color : #fff; + font-size: 20px; +} + +.layui-side-right { + position : fixed; + right : 0; + top : 0; + bottom : 0; + z-index : 999; + width : 350px; + overflow-x: hidden +} + +.layui-layout-admin .layui-side { + top : 60px; + width : 260px; + overflow-x: hidden +} + +.layui-layout-admin .layui-side-right { + top : 60px; + width : 350px; + overflow-x: hidden +} + +.layui-body { + position : absolute; + left : 260px; + right : 350px; + top : 0; + bottom : 0; + z-index : 998; + width : auto; + overflow-y : auto; + box-sizing : border-box; + min-width : 250px; + border-left : 1px solid #e6e6e6; + border-right: 1px solid #e6e6e6; +} + +.layui-layout-admin .layui-body { + bottom: 0; +} + +/* components-list*/ + +.components-list { + padding : 4px; + -webkit-box-sizing: border-box; + box-sizing : border-box; + height : 100% +} + +.components-list .components-item { + display : inline-block; + width : 49%; + margin : 0.5%; + margin-top : 5px; + -webkit-transition: -webkit-transform 0ms !important; + transition : -webkit-transform 0ms !important; + transition : transform 0ms !important; + transition : transform 0ms, -webkit-transform 0ms !important +} + +.components-draggable { + padding-bottom: 20px +} + +.components-title { + font-size: 14px; + color : #222; + margin : 6px 2px +} + +.components-title .svg-icon { + color : #666; + font-size: 18px +} + +.components-body { + padding : 8px 10px; + background : #f6f7ff; + font-size : 12px; + cursor : move; + border : 1px dashed #f6f7ff; + border-radius: 3px +} + +.components-body .svg-icon { + color : #777; + font-size: 15px +} + +.components-body:hover { + border: 1px dashed #787be8; + color : #787be8 +} + +.components-body:hover .svg-icon { + color: #787be8 +} + +.ghost { + + border : 1px dashed #e06c1d; + outline-width: 0; + height : 39px; + box-sizing : border-box; + font-size : 0; + content : ''; + overflow : hidden; + padding : 0; +} +.ghost div { + background-color:#fff; + color:#fff; +} + +.layui-body .active { + outline : 2px solid #409EFF; + border : 1px solid #409EFF; + outline-offset: 0; +} + +#formDesignerForm .layui-form-item { + position: relative; +} + +#formDesignerForm .grid { + padding: 5px 5px; +} + +#formDesignerForm .layui-form-item:hover { + border : 1px solid #409EFF; + background-color: #e9f4fd !important; +} + +.widget-view-drag { + position : absolute; + left : -2px; + top : -2px; + bottom : -18px; + height : 28px; + line-height: 28px; + background : #409EFF; + z-index : 9; +} + +.widget-view-drag i { + font-size: 14px; + color : #fff; + margin : 0 5px; + cursor : move; +} + +.select-option-drag { + cursor: move; +} + +.select-option-delete { + cursor: pointer; +} + +.widget-view-action { + position : absolute; + right : 0; + bottom : 0; + height : 28px; + line-height: 28px; + background : #409EFF; + z-index : 9; +} + +.widget-view-action i { + font-size: 14px; + color : #fff; + margin : 0 5px; + cursor : pointer; + +} + +#formDesignerForm { + background: #fff; + border : 1px dashed #999; + min-height: 94%; + margin : 10px; + padding : 10px 10px; +} + +#formDesignerForm .widget-col-list { + min-height: 50px; + border : 1px dashed #ccc; + background: #fff; +} + +#formDesignerForm .widget-slider { + margin: 18px 10px; + width : 90%; + position: absolute!important; +} + +.layui-empty { + margin : 10px 60px; + color : #9e9e9e; + font-size : 16px; + text-align: center; + +} + +#columnProperty .layui-form-item.option { + margin-bottom: 2px; +} + +#columnProperty .layui-form-item.option .layui-inline { + margin-bottom: 2px; +} + +/* 图片上传 */ +.uploader-list { + margin-left: -15px; +} + +.uploader-list .info { + position : relative; + margin-top : -25px; + background-color: black; + color : white; + filter : alpha(Opacity=80); + -moz-opacity : 0.5; + opacity : 0.5; + width : 100px; + height : 25px; + text-align : center; + display : none; +} + +.uploader-list .handle { + position : relative; + background-color: black; + color : white; + filter : alpha(Opacity=80); + -moz-opacity : 0.5; + opacity : 0.5; + width : 100px; + text-align : right; + height : 18px; + margin-bottom : -18px; + display : none; +} + +.uploader-list .handle i { + margin-right: 5px; +} + +.uploader-list .handle i:hover { + cursor: pointer; +} + +.uploader-list .file-iteme { + margin : 12px 0 0 15px; + padding: 1px; + float : left; +} + + +/*自定义layer颜色*/ +body .cool-black .layui-layer-title { + color : #fff; + height : 50px; + line-height : 50px; + background-color: #191a23; + border : none; +} + +body .cool-black .layui-layer-setwin a { + color : #fff; + font-size : 16px; + font-style : normal; + font-family : layui-icon !important; + -webkit-font-smoothing : antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body .cool-black .layui-layer-btn a { + background: #333; +} + + + +.htmlcodeview, +.importjsoncodeview { + position: relative; + display : none; +} + +.htmlcodeview textarea, +.getFormData textarea, +.importjsoncodeview textarea { + display : block; + width : 760px; + height : 560px; + border : 10px solid #F8F8F8; + border-top-width: 0; + padding : 10px; + line-height : 20px; + overflow : auto; + background-color: #3F3F3F; + color : #eee; + font-size : 12px; + font-family : Courier New; +} + +.htmlcodeview a, +.importjsoncodeview a { + position: absolute; + right : 20px; + bottom : 20px; +} + +.aboutusview .about { + display : block; + width : 760px; + height : 554px; + padding : 20px 20px; + overflow : hidden; + background-color: #191a23; + color : #ccc; +} +.aboutusview .about p{ + line-height: 30px; + +} + +.aboutusview .about .yellow{ + color:#e6ec8d; +} + +.layui-disabled { + background-color: #f5f7fa; + border-color: #dfe4ed; + color: #c0c4cc; +} + +.custom-lg{ + margin: -3px 0px 0px 10px; +} +.custom-zc{ + margin: 0px 0px 0px 10px; +} +.custom-sm{ + margin: 5px 0px 0px 10px; +} +.custom-xs{ + margin: 10px 0px 0px 10px; +} + +.iceEditor-disabled { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: rgba(245,247,250,0.79) !important; + border-color: #dfe4ed !important; + color: #c0c4cc !important; + z-index: 1 !important; + display: block; +} \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/formDesigner.js b/module-form/src/main/resources/static/form-design/modules/formDesigner.js new file mode 100644 index 00000000..a35986a6 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/formDesigner.js @@ -0,0 +1,4111 @@ +layui.config({ + base: './form-design/modules/' +}).define(["layer", "laytpl", "element", "form", "slider", "laydate", "rate", "colorpicker", "layedit", "carousel", "upload", "formField", "iconPicker", "cron", "labelGeneration"], function (exports) { + var $ = layui.jquery, + layer = layui.layer, + laytpl = layui.laytpl, + setter = layui.cache, + element = layui.element, + slider = layui.slider, + laydate = layui.laydate, + rate = layui.rate, + colorpicker = layui.colorpicker, + carousel = layui.carousel, + form = layui.form, + upload = layui.upload, + layedit = layui.layedit, + formField = layui.formField, + hint = layui.hint, + iconPicker = layui.iconPicker, + cron = layui.cron, + labelGeneration = layui.labelGeneration, + iceEditorObjects = {}, guid = function () { + var d = new Date().getTime(); + if (window.performance && typeof window.performance.now === "function") { + d += performance.now(); //use high-precision timer if available + } + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + return uuid; + }, lang = { + id: "唯一标识", + label: "标题", + index: "序号", + tag: "表单类型", + tagIcon: '图标', + width: '宽度', + height: "高度", + span: '网格宽度', + placeholder: "placeholder", + defaultValue: "默认值", + dateDefaultValue: '默认时间', + labelWidth: "文本宽度", + clearable: "是否清楚", + prepend: "前缀", + append: "追加", + prefixIcon: '前缀图标', + suffixIcon: '后缀图标', + maxlength: "最大长度", + showWordLimit: "是否限制字符", + readonly: "只读", + disabled: "禁用", + required: "必填", + columns: "列数", + options: "选项", + switchValue: "默认值", + maxValue: "最大值", + minValue: "最小值", + dataMaxValue: "最大日期", + dataMinValue: "最小日期", + stepValue: "步长", + datetype: "日期类型", + dateformat: "日期格式", + half: "显示半星", + theme: "皮肤", + rateLength: "星星个数", + interval: "间隔毫秒", + startIndex: "开始位置", + full: "是否全屏", + arrow: "鼠标样式", + contents: "内容", + document: '帮助文档', + input: "输入框", + select: "下拉", + checkbox: "多选组", + radio: "单选组", + date: "日期", + editor: "iceEditor编辑器", + slider: "滑块", + image: "图片", + grid: "一行多列", + colorpicker: "颜色选择器", + textarea: "多行文本", + rate: "评分控件", + switch: "开关", + password: "密码框", + carousel: "轮播", + text: "显示文本", + uploadUrl: "上传路径", + expression: "验证", + file: "文件", + autoplay: "自动切换", + anim: "切换方式", + arrow: "切换箭头", + tab: "tab选项卡", + tabHeaders: "tab标题", + isInput: "显示输入框", + dateRange: "日期范围", + dateRangeDefaultValue: "默认范围", + menu: "头部菜单", + numberInput: "数字输入框", + iconPicker: "图标选择器", + iconPickerSearch: "是否搜索", + iconPickerPage: "是否分页", + iconPickerLimit: "显示数量", + iconPickerCellWidth: "图标宽度", + cron: "Cron表达式", + cronUrl: "运行路径", + labelGeneration: "标签组件", + isEnter: "是否回车", + buttonIcon: "按钮图标", + buttonType: "按钮类型", + isLabel: "显示标签", + buttonSize: "组件尺寸", + bottom: "按钮组件", + buttonVlaue: "按钮文字", + sign: "sign签名组件", + }, expressions = [{ + text: '默认', + value: "" + }, { + text: '数字', + value: 'number' + }, { + text: '邮箱', + value: 'email' + }, { + text: '手机', + value: 'phone' + }, { + text: '身份证', + value: 'identity' + }, { + text: '日期', + value: 'date' + }, { + text: '网址', + value: 'url' + }, { + text: '密码', + value: 'pass' + }], + anims = [{ + text: '左右切换', + value: 'default' + }, { + text: '上下切换', + value: 'updown' + }, { + text: '渐隐渐显切换', + value: 'fade' + }], + arrows = [{ + text: '悬停显示', + value: 'hover' + }, { + text: '始终显示', + value: 'always' + }, { + text: '始终不显示', + value: 'none' + }], + datetypes = [{ + text: '年选择器', + value: 'year' + }, { + text: '年月选择器', + value: 'month' + }, { + text: '时间选择器', + value: 'time' + }, { + text: '日期选择器', + value: 'date' + }, { + text: '日期时间选择器', + value: 'datetime' + }], + buttonTypes = [{ + text: '原始', + value: 'layui-btn-primary' + }, { + text: '默认', + value: "" + }, { + text: '百搭', + value: 'layui-btn-normal' + }, { + text: '暖色', + value: 'layui-btn-warm' + }, { + text: '警告', + value: ' layui-btn-danger' + }], + buttonSizes = [{ + text: '大型', + value: 'layui-btn-lg' + }, { + text: '默认', + value: "" + }, { + text: '小型', + value: 'layui-btn-sm' + }, { + text: '迷你', + value: 'layui-btn-xs' + }], + dateformats = ["yyyy年MM月", "yyyy-MM-dd", "dd/MM/yyyy", "yyyyMMdd", "yyyy-MM-dd HH:mm:ss", "yyyy年MM月dd日 HH时mm分ss秒"], + iceEditMenus = [{ + value: 'backColor', + text: '字体背景颜色' + }, { + value: 'fontSize', + text: '字体大小' + }, { + value: 'foreColor', + text: '字体颜色' + }, { + value: 'bold', + text: '粗体' + }, { + value: 'italic', + text: '斜体' + }, { + value: 'underline', + text: '下划线' + }, { + value: 'strikeThrough', + text: '删除线' + }, { + value: 'justifyLeft', + text: '左对齐' + }, { + value: 'justifyCenter', + text: '居中对齐' + }, { + value: 'justifyRight', + text: '右对齐' + }, { + value: 'indent', + text: '增加缩进' + }, { + value: 'outdent', + text: '减少缩进' + }, { + value: 'insertOrderedList', + text: '有序列表' + }, { + value: 'insertUnorderedList', + text: '无序列表' + }, { + value: 'superscript', + text: '上标' + }, { + value: 'subscript', + text: '下标' + }, { + value: 'createLink', + text: '创建连接' + }, { + value: 'unlink', + text: '取消连接' + }, { + value: 'hr', + text: '水平线' + }, { + value: 'face', + text: '表情' + }, { + value: 'table', + text: '表格' + }, { + value: 'files', + text: '附件' + }, { + value: 'music', + text: '音乐' + }, { + value: 'video', + text: '视频' + }, { + value: 'insertImage', + text: '图片' + }, { + value: 'removeFormat', + text: '格式化样式' + }, { + value: 'code', + text: '源码' + }, { + value: 'line', + text: '菜单分割线' + }], + // 配置属性 + renderCommonProperty = function (json) { + var _html = ''; + for (var key in json) { + if (key === 'index') { + continue; + } + if (key === 'tag' || key === 'id' || key === 'uploadUrl' || key === 'document' || key === 'interval' || key === 'cronUrl') { //只读字段 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + if (key === 'tag') { + _html += ' '.format(key, json[key] == undefined ? '' : json[key]); + } else { + _html += ' '.format(key, json[key] == undefined ? '' : json[key]); + } + _html += '
    '; + _html += '
    '; + } else if (key === 'readonly' || key === 'disabled' || key === 'required' || key === 'half' || key === "text" || key === "autoplay" || key === "full" || key === "verification" || key === 'autoplay' || key === 'isInput' || key === 'expression' || key === 'iconPickerSearch' || key === 'iconPickerPage' || key === 'isEnter' || key === 'isLabel') { + var yes = "是"; + var no = "否"; + if (key === 'isInput') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(json[key] ? 'checked' : '', key, yes, no); + _html += '
    '; + _html += '
    '; + } + if (key === 'autoplay' || key === 'iconPickerSearch' || key === 'iconPickerPage') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(json[key] ? 'checked' : '', key, yes, no); + _html += '
    '; + _html += '
    '; + } + if (key === 'readonly') { + yes = "只读"; + no = "可写"; + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(json[key] ? 'checked' : '', key, yes, no); + _html += '
    '; + _html += '
    '; + } + if (key === 'isEnter' || key === 'isLabel') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(json[key] ? 'checked' : '', key, yes, no); + _html += '
    '; + _html += '
    '; + } + if (key === 'disabled') { + yes = "隐藏"; + no = "显示"; + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(json[key] ? 'checked' : '', key, yes, no); + _html += '
    '; + _html += '
    '; + } + if (key === 'required') { + yes = "必填"; + no = "可选"; + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(json[key] ? 'checked' : '', key, yes, no); + _html += '
    '; + _html += '
    '; + } + if (key === 'expression') { + _html += '
    '; + _html += ' '; + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } + } else if (key === 'defaultValue' || key === 'label' || key === 'height' || key === 'placeholder' || key === 'document' || key === 'minValue' || key === 'maxValue' || key === 'rateLength' || key === 'iconPickerLimit' || key === 'iconPickerCellWidth' || key === 'buttonVlaue') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(key, json[key] == undefined ? '' : json[key], lang[key]); + _html += '
    '; + _html += '
    '; + } else if (key === 'stepValue') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(key, json[key] == undefined ? '' : json[key], lang[key]); + _html += '
    '; + _html += '
    '; + } else if (key === 'width' || key === 'labelWidth') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '
    '.format(key); + _html += ' '.format(key + "-value", '', lang[key]); + _html += '
    '; + _html += '
    '; + } else if (key === 'menu') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(key, '', lang[key]); + _html += '
    '; + _html += '
    '; + } else if (key === 'switchValue') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' '.format(key, json[key] ? 'checked' : ''); + _html += '
    '; + _html += '
    '; + } else if (key === 'datetype') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'dateformat') { + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'contents') { + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' ' + //_html += ' ' + _html += '
    '; + _html += '
    '; + _html += '
    '.format(json.tag); + //选项 + for (var i = 0; i < json.contents.length; i++) { + _html += '
    '.format(i); + _html += '
    '; + _html += ' '.format(json.tag, json.contents[i]); + _html += '
    '; + _html += '
    '; + _html += ' '; + _html += ' '; + _html += '
    '; + _html += '
    '; + //向 .option .layui-inline 添加drag事件并且必须设在 contents-option-drag 中才能拖动 + } + _html += '
    '; + } else if (key === 'options') { + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += ' ' + //_html += ' ' + _html += '
    '; + _html += '
    '; + _html += '
    '.format(json.tag); + //选项 + for (var i = 0; i < json.options.length; i++) { + _html += '
    '.format(i); + _html += '
    '; + if (json.tag === 'checkbox') { + if (json.options[i].checked) { + _html += ' '.format(json.tag); + } else { + _html += ' '.format(json.tag); + } + } else { + if (json.options[i].checked) { + _html += ' '.format(json.tag); + } else { + _html += ' '.format(json.tag); + } + } + _html += '
    '; + _html += '
    '; + _html += ' '.format(json.tag, json.options[i].text); + _html += '
    '; + _html += '
    '; + _html += ' '.format(json.tag, json.options[i].value); + _html += '
    '; + _html += '
    '; + _html += ' '; + _html += ' '; + _html += '
    '; + _html += '
    '; + //向 .option .layui-inline 添加drag事件并且必须设在 select-option-drag 中才能拖动 + } + _html += '
    '; + } else if (key === 'columns') { + var columnCount = 2; + columnCount = json[key].length; + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'anim') { + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'arrow') { + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'buttonType') { + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'buttonSize') { + //处理 + _html += '
    '; + _html += ' '.format(lang[key]); + _html += '
    '; + _html += '' + _html += '
    '; + _html += '
    '; + } else if (key === 'dataMaxValue' || key === 'dataMinValue') { + _html += '
    '.format(key + json.id); + _html += ''.format(lang[key]); + _html += '
    '; + _html += '
    '.format(key + json.tag + json.id); + _html += '
    '; + _html += '
    '; + } else if (key === 'dateDefaultValue') { + _html += '
    '.format(key + json.id); + _html += ''.format(lang[key]); + _html += '
    '; + _html += '
    '.format(key + json.tag + json.id); + _html += '
    '; + _html += '
    '; + } else if (key === 'dateRangeDefaultValue') { + _html += '
    '.format(key + json.id); + _html += ''.format(lang[key]); + _html += '
    '; + _html += '
    '.format(key + json.tag + json.id); + _html += '
    '; + _html += '
    '; + } else if (key === 'buttonIcon') { + _html += '
    '.format(key + json.id); + _html += ''.format(lang[key]); + _html += '
    '; + _html += '
    '.format(json.tag + json.id + "property"); + _html += '
    '; + _html += '
    '; + } + } + return _html; + } + //模块名称常量 + , MOD_NAME = 'formDesigner', + ELEM = '.layui-form-designer', + TP_MAIN = [ + '
    ', + '
    ', + ' ', + ' ', + ' ', + ' ', + '
    ', + '
    ', + '
    ', + ' ', + '
    ', + '
      ', + '
    • 组件
    • ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    开发中...
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + ' ', + '
    ', + '
    ', + '
    ', + '从左侧拖拽控件到此设计区域来添加字段', + '
    ', + '
    ', + ' ', + '
    ', + '
    ', + '
    ', + '
    ', + ' ', + '
    ', + '
    ', + '
      ', + '
    • 字段设置
    • ', + '
    • 表单设置
    • ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + ' ', + '
    ', + ' ', + '
    ', + ' ', + '
    ', + '
    ', + ' ', + ' ', + '
    ', + ' ', + '
    ', + ' ', + '
    ', + '
    ', + ' ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ' + ].join(''), + TP_HTML_VIEW = [ + '' + ].join(''), + TP_IMPORT_VIEW = [ + '' + ].join(''), + TP_ABOUT_VIEW = [''].join(''), + //外部接口 + formDesigner = { + index: layui.formDesigner ? (layui.formDesigner.index + 10000) : 0, + //设置全局项 + set: function (options) { + var that = this; + that.config = $.extend({}, that.config, options); + return that; + }, + //事件监听 + on: function (events, callback) { + return layui.onevent.call(this, MOD_NAME, events, callback); + } + }, + /** + * 操作当前实例elem + * id 表示当前实例的索引 默认就是内部的 index,如果id存在值 那么就从已经存在的获取 + */ + thisIns = function () { + var that = this, + options = that.config; + return { + reload: function (options) { + that.reload.call(that, options); + }, + getOptions: function () { + return options || null; + }, + getData: function () { + return options.data || null; + }, + geticeEditorObjects: function () { + return iceEditorObjects || null; + } + } + }, getThisInsConfig = function (id) { + var config = thisIns.config[id]; + if (!config) { + hint.error('在表实例中找不到ID选项'); + } + return config || null; + }, Class = function (options) { + var that = this; + that.index = ++formDesigner.index; //增加实例,index 也是要增加JSON.stringify(options.data, null, 4) + that.config = $.extend({}, that.config, formDesigner.config, options); + that.render(); + }; + /* 此方法最后一道 commom.js 中 */ + String.prototype.format = function (args) { + var result = this; + if (arguments.length > 0) { + if (arguments.length == 1 && typeof (args) == "object") { + for (var key in args) { + if (args[key] != undefined) { + var reg = new RegExp("({" + key + "})", "g"); + result = result.replace(reg, args[key]); + } + } + } else { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] != undefined) { + var reg = new RegExp("({[" + i + "]})", "g"); + result = result.replace(reg, arguments[i]); + } + } + } + } + return result; + } + Class.prototype.findJsonItem = function (json, id) { + var that = this, + options = that.config; + for (var i = 0; i < json.length; i++) { + if (json[i].id === id) { + return json[i]; + } else { + if (json[i].tag === 'grid') { + for (var j = 0; j < json[i].columns.length; j++) { + if (json[i].columns[j].list.length > 0) { + var _item = that.findJsonItem(json[i].columns[j].list, id); + if (_item) { + return _item; + } + } + } + } + } + } + } + /* 删除json中的文件并返回上一个节点*/ + Class.prototype.deleteJsonItem = function (json, id) { + var that = this, + options = that.config; + for (var i = 0; i < json.length; i++) { + if (json[i].id === id) { + json.splice(i, 1); + if (i > 0) { + return json[i - 1]; + } + break; + } else { + if (json[i].tag === 'grid') { + for (var j = 0; j < json[i].columns.length; j++) { + if (json[i].columns[j].list.length > 0) { + that.deleteJsonItem(json[i].columns[j].list, id); + } + } + } + } + } + return undefined; + }; + Class.prototype.copyJsonAfterItem = function (json, id) { + var that = this, + options = that.config; + for (var i = 0; i < json.length; i++) { + if (json[i].id === id) { + var _newjson = JSON.parse(JSON.stringify(json[i])); + _newjson.id = that.autoId(_newjson.tag); + json.splice(i + 1, 0, _newjson); + return json[i]; + } else { + if (json[i].tag === 'grid') { + for (var j = 0; j < json[i].columns.length; j++) { + if (json[i].columns[j].list.length > 0) { + var _item = that.copyJsonAfterItem(json[i].columns[j].list, id); + if (_item) { + return _item; + } + } + } + } + } + } + return undefined; + }; + /** + * data 表示设计区数据 + * dataSource 表示数据源即一个控件的数据来源 + * + */ + Class.prototype.config = { + version: "1.0", + formName: "表单设计器", + Author: "WenG", + formId: "id", + generateId: 0, + field: [], + data: [], + dataSource: {}, + selectItem: undefined, + htmlCode: { + css: '', + html: '', + script: '' + } + }; + /* 自动生成ID 当前页面自动排序*/ + Class.prototype.autoId = function (tag) { + var that = this, + options = that.config; + options.generateId = options.generateId + 1; + return tag + '_' + options.generateId; + } + /* 组件定义 */ + Class.prototype.components = { + input: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'required' : ''; + if (json.expression !== null && json.expression !== undefined) { + if (json.expression !== '') { + _required = _required + '|' + json.expression; + } + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.labelWidth); + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _readonly, _disabled, _required, _disabledClass); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'required' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + if (json.expression !== null && json.expression !== undefined) { + if (json.expression !== '') { + _required = 'required' + '|' + json.expression; + } + } + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _readonly, _disabled, _required, _disabledClass); + $block.append(_html); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.input)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + bottom: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _coustomCss = ""; + if (json.buttonSize === "layui-btn-lg") { + _coustomCss = "custom-lg"; + } + if (json.buttonSize === "") { + _coustomCss = "custom-zc"; + } + if (json.buttonSize === "layui-btn-sm") { + _coustomCss = "custom-sm"; + } + if (json.buttonSize === "layui-btn-xs") { + _coustomCss = "custom-xs"; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + if (json.isLabel) { + _html += ''.format(json.label, json.labelWidth); + } + _html += '
    '; + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonSize, _coustomCss, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonSize, json.buttonType, _coustomCss, json.buttonIcon, json.buttonVlaue); + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + if (json.isLabel) { + if ($('#' + json.id).find("label").length === 0) { + $('#' + json.id).prepend(''.format(json.label, json.labelWidth)); + } else { + $label.css("width", json.labelWidth + "px"); + } + $label.empty(); + $label.append(json.label + ":"); + } else { + $label.remove(); + $block.css("margin-left", "0px"); + } + $block.empty(); + var _html = ''; + var _coustomCss = ""; + if (json.buttonSize === "layui-btn-lg") { + _coustomCss = "custom-lg"; + } + if (json.buttonSize === "") { + _coustomCss = "custom-zc"; + } + if (json.buttonSize === "layui-btn-sm") { + _coustomCss = "custom-sm"; + } + if (json.buttonSize === "layui-btn-xs") { + _coustomCss = "custom-xs"; + } + //重绘设计区改id下的所有元素 + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonSize, _coustomCss, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonSize, json.buttonType, _coustomCss, json.buttonIcon, json.buttonVlaue); + } + $block.append(_html); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.bottom)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + sign: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } + if (json.data !== "") { + _html += '
    '.format(json.data); + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + var _html = ''; + //重绘设计区改id下的所有元素 + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } + if (json.data !== "") { + _html += '
    '.format(json.data); + } + $block.append(_html); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.sign)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + iconPicker: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + if (json.disabled) { + _html += '
    '; + } + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _disabled, _disabledClass, json.tag + json.id); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $label.empty(); + $block.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _disabled, _disabledClass, json.tag + json.id); + $('#' + json.id + ' .layui-input-block').append(_html); + iconPicker.render({ + // 选择器,推荐使用input + elem: '#' + json.tag + json.id, + // 数据类型:fontClass/unicode,推荐使用fontClass + type: 'fontClass', + // 是否开启搜索:true/false,默认true + search: json.iconPickerSearch, + // 是否开启分页:true/false,默认true + page: json.iconPickerPage, + // 每页显示数量,默认12 + limit: json.iconPickerLimit, + // 每个图标格子的宽度:'43px'或'20%' + cellWidth: json.iconPickerCellWidth, + // 点击回调 + click: function (data) { + //console.log(data); + }, + // 渲染成功后的回调 + success: function (d) { + //console.log(d); + } + }); + iconPicker.checkIcon(json.tag + json.id, json.defaultValue); + if (json.disabled) { + $("#" + json.id).find(".layui-input-block").append('
    '); + } else { + $("#" + json.id).find(".iceEditor-disabled").remove(); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.iconPicker)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + cron: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _required = json.required ? 'required' : ''; + var _width = json.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.placeholder, _disabled, _disabledClass, json.tag + json.id, _required); + if (!json.disabled) { + _html += ''.format(json.tag + json.id); + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _required = json.required ? 'required' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.placeholder, _disabled, _disabledClass, json.tag + json.id, _required); + if (!json.disabled) { + var _width = json.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + _html += ''.format(json.tag + json.id); + $block.append(_html); + cron.render({ + elem: "#" + json.tag + json.id + "-button", // 绑定元素 + url: json.cronUrl, // 获取最近运行时间的接口 + // value: $("#cron").val(), // 默认值 + done: function (cronStr) { + $("#" + json.tag + json.id).val(cronStr); + }, + }); + } else { + $block.append(_html); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.cron)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + numberInput: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '0', json.width, json.placeholder, _disabled, _disabledClass, json.minValue, json.maxValue, json.stepValue, json.tag + json.id); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '0', json.width, json.placeholder, _disabled, _disabledClass, json.minValue, json.maxValue, json.stepValue, json.tag + json.id); + $block.append(_html); + var _width = json.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + $('#' + json.id + ' .layui-input-block .layui-number-input-btn').css("right", _width + "%"); + if (json.disabled) { + $('#' + json.id + ' .layui-input-block .layui-number-input-btn').css("z-index", "-1"); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.numberInput)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + labelGeneration: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + if (json.disabled) { + _html += '
    '; + } + _html += '
    '.format(json.tag + json.id, json.width); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + update: function (json) { + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += '
    '.format(json.tag + json.id, json.width); + $block.append(_html); + labelGeneration.render({ + elem: '#' + json.tag + json.id, + data: json.dateDefaultValue, + isEnter: json.isEnter + }); + if (json.disabled) { + $("#" + json.id).find(".layui-input-block").append('
    '); + } else { + $("#" + json.id).find(".iceEditor-disabled").remove(); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.labelGeneration)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + password: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'lay-verify="required"' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.labelWidth); + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _readonly, _disabled, _required, _disabledClass); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'lay-verify="required"' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _readonly, _disabled, _required, _disabledClass); + $block.append(_html); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.password)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + select: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.id, json.labelWidth); + _html += '' + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'required' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + var _html = ''; + _html += '' + $('#' + json.id + ' .layui-input-block').append(_html); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + form.render('select', json.id); + $('#' + json.id + ' .layui-input-block div.layui-unselect.layui-form-select').css({ + width: '{0}'.format(json.width) + }); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.select)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + radio: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + for (var i = 0; i < json.options.length; i++) { + if (json.options[i].checked) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled); + } else { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled); + } + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + var _html = ''; + //重绘设计区改id下的所有元素 + for (var i = 0; i < json.options.length; i++) { + if (json.options[i].checked) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled); + } else { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled); + } + } + $block.append(_html); + form.render('radio'); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.radio)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + checkbox: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="otherReq"' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + for (var i = 0; i < json.options.length; i++) { + if (json.options[i].checked) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } else { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="otherReq"' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + for (var i = 0; i < json.options.length; i++) { + if (json.options[i].checked) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } else { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } + } + $block.append(_html); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + form.render('checkbox'); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.checkbox)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + switch: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += ''.format(json.id, _disabled, _disabledClass, json.switchValue ? 'checked' : ''); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + var _html = ''; + _html += ''.format(json.tag, _disabled, _disabledClass, json.switchValue ? 'checked' : ''); + $block.append(_html); + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + form.render('checkbox'); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.switch)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + slider: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += '
    '.format(json.tag + json.id); + _html += ''.format(json.id, json.defaultValue); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px'.format(json.width, json.labelWidth) + }); + slider.render({ + elem: '#' + json.tag + json.id, + value: json.defaultValue, //初始值 + min: json.minValue, + max: json.maxValue, + step: json.stepValue, + disabled: json.disabled, + input: json.isInput, + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.slider)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + dateRange: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _disabledStyle = json.disabled ? ' pointer-events: none;' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += '
    '; + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.tag + json.id, _disabledStyle); + _html += '
    '; + _html += ''.format(json.tag + json.id, _disabledClass, json.id, _required); + _html += '
    '; + _html += '
    -
    '; + _html += '
    '; + _html += ''.format(json.tag + json.id, _disabledClass, json.id, _required); + _html += '
    '; + _html += '
    '; + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _disabledStyle = json.disabled ? ' pointer-events: none;' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '; + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.tag + json.id, _disabledStyle); + _html += '
    '; + _html += ''.format(json.tag + json.id, _disabledClass, json.id, _required); + _html += '
    '; + _html += '
    -
    '; + _html += '
    '; + _html += ''.format(json.tag + json.id, _disabledClass, json.id, _required); + _html += '
    '; + _html += '
    '; + _html += '
    '; + $('#' + json.id).empty(); + $('#' + json.id).append(_html); + laydate.render({ + elem: '#' + json.tag + json.id, + type: json.datetype, + format: json.dateformat, + //value: item.dateDefaultValue, + min: json.dataMinValue, + max: json.dataMaxValue, + range: ['#start-' + json.tag + json.id, '#end-' + json.tag + json.id] + }); + if (json.dateRangeDefaultValue !== null && json.dateRangeDefaultValue !== "" && json.dateRangeDefaultValue !== undefined) { + var split = json.dateRangeDefaultValue.split(" - "); + $('#start-' + json.tag + json.id).val(split[0]); + $('#end-' + json.tag + json.id).val(split[1]); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.dateRange)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + date: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _disabledStyle = json.disabled ? ' pointer-events: none;' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += ''.format(json.tag + json.id, _disabledClass, _disabledStyle, _required); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _disabledStyle = json.disabled ? ' pointer-events: none;' : ''; + var _required = json.required ? 'required' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + $block.css({ + width: 'calc({0} - {1}px)'.format(json.width, json.labelWidth) + }); + var _html = ''.format(json.tag + json.id, _disabledClass, _disabledStyle, _required); + $block.append(_html); + laydate.render({ + elem: '#' + json.tag + json.id, + btns: ['confirm'], + type: json.datetype, + format: json.dateformat, + value: json.dateDefaultValue, + min: json.dataMinValue, + max: json.dataMaxValue, + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.date)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + rate: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'required=""' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + _html += '
    '.format(json.tag + json.id); + _html += ''.format(json.id, json.defaultValue); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + rate.render({ + elem: '#' + json.tag + json.id, + value: json.defaultValue, + text: json.text, + length: json.rateLength, + half: json.half, + readonly: json.readonly + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.rate)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + carousel: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + // _html +=''.format(json.required?'layui-form-required':'',json.label); + // _html +='
    '; + _html += ''; //end for class=layui-carousel + // _html +='
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + $('#' + json.id).empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += ''; //end for class=layui-carousel + $('#' + json.id).append(_html); + carousel.render({ + elem: '#' + json.tag + json.id, + width: json.width, //设置容器宽度 + height: json.height, //设置容器宽度 + arrow: json.arrow, //始终显示箭头 + interval: json.interval, + anim: json.anim, + autoplay: json.autoplay + //anim: 'updown' //切换动画方式 + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.carousel)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + colorpicker: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.labelWidth); + if (json.disabled) { + _html += '
    '; + } + _html += '
    '.format(json.tag + json.id); + _html += ''.format(json.id, json.defaultValue); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $label.empty(); + $block.css("margin-left", json.labelWidth); + $label.css("width", json.labelWidth); + $label.append(json.label + ":"); + if (json.disabled) { + $("#" + json.id).find(".layui-input-block").append('
    '); + } else { + $("#" + json.id).find(".iceEditor-disabled").remove(); + } + colorpicker.render({ + elem: '#' + json.tag + json.id, + color: json.defaultValue, + format: 'rgb', + predefine: true, + alpha: true, + done: function (color) { + $("#" + json.id).find("input[name=" + json.id + "]").val(color); + } + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.colorpicker)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + image: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label); + _html += '
    '; + _html += '
    '; + _html += ''.format(json.tag + json.id); + _html += '
    预览图:'; + _html += '
    '.format(json.id); + _html += '
    '; + _html += '
    '; + _html += '
    '; + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.image)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + textarea: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="required"' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.width); + _html += '
    '.format(json.width); + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _disabled, _required, _disabledClass, _readonly); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="required"' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var $block = $('#' + json.id + ' .layui-input-block'); + var $label = $('#' + json.id + ' .layui-form-label'); + $block.empty(); + $label.empty(); + var _html = ''; + _html += ''.format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _disabled, _required, _disabledClass, _readonly); + $('#' + json.id + ' .layui-input-block').append(_html); + $label.css({ + width: '{0}'.format(json.width) + }); + $block.css({ + width: '{0}'.format(json.width) + }); + if (json.required) { + $label.append('*'); + } + $label.append(json.label + ":"); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.textarea)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + editor: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index, json.width); + _html += ''.format(json.label, json.width); + _html += '
    '; + _html += '
    '.format(json.tag + json.id); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + update: function (json) { + var $label = $('#' + json.id + ' .layui-form-label'); + $label.empty(); + $label.css("width", json.width); + $label.append(json.label + ":"); + var e = iceEditorObjects[json.id]; + e.width = json.width; //宽度 + e.height = json.height; //高度 + e.uploadUrl = json.uploadUrl; //上传文件路径 + e.disabled = json.disabled; + e.menu = json.menu; + e.create(); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.editor)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + grid: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + + var colClass = 'layui-col-md6'; + if (json.columns.length == 3) { + colClass = 'layui-col-md4'; + } else if (json.columns.length == 4) { + colClass = 'layui-col-md3'; + } else if (json.columns.length == 6) { + colClass = 'layui-col-md2'; + } + for (var i = 0; i < json.columns.length; i++) { + _html += '
    '.format(i, json.index, colClass, json.id); + //some html + _html += '
    '; + } + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID 默认是一个一行两列的布局对象 + var _json = JSON.parse(JSON.stringify(formField.grid)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + if (columncount > 2) { + var _col = { + span: 12, + list: [], + }; + for (var i = _json.columns.length; i < columncount; i++) { + _json.columns.splice(i, 0, _col); + } + } + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + //如果存在 option 那么向 .option .layui-inline 添加drag事件并且必须设在 select-option-drag 中才能拖动 + } + }, + file: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label); + _html += '
    '; + _html += '
    '; + _html += ' '.format(json.tag + json.id); + _html += '
    '; + _html += ''; + _html += ''; + _html += '
    文件名大小上传进度操作
    '.format(json.id); + _html += ''.format(json.id); + _html += '
    '; + _html += ''; + _html += '
    '; + _html += '
    '; + _html += ''; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.file)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json); //获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + } + $('#columnProperty').append(_html); + } + }, + }; + /* 如果是grid布局控件 就显示不一样的样式 */ + Class.prototype.addClick = function (evt) { + var that = this, options = that.config; + $("#formDesignerForm .layui-form-item").on('click', function (e) { + //当 div 为嵌套关系的时候 阻止事件冒泡 + e.preventDefault(); + e.stopPropagation(); + // console.log("您点击了 formDesignerForm .layui-form-item"); + var index = parseInt($(this)[0].dataset.index); + var _id = $(this)[0].dataset.id; + options.selectItem = that.findJsonItem(options.data, _id); + var tag = $(this)[0].dataset.tag; + //显示当前的属性 + that.components[tag].property(options.selectItem); + if (options.selectItem.tag === "select" || options.selectItem.tag === "checkbox" || options.selectItem.tag === "radio") { + var sortable = Sortable.create(document.getElementById(options.selectItem.tag), { + group: { + name: 'propertygroup', + }, + ghostClass: "ghost", + handle: '.select-option-drag', + dataIdAttr: 'data-index', + animation: 150, + onEnd: function (evt) { + if (options.selectItem === undefined) { + return; + } + var indexArray = sortable.toArray(); + var newJson = []; + for (var i = 0; i < indexArray.length; i++) { + newJson.push(options.selectItem.options[indexArray[i]]); + } + options.selectItem.options = newJson; + that.renderForm(); + } + }); + } + that.bindPropertyEvent(); + //移除其他元素的 siblings() 方法返回被选元素的所有同级元素 + // $(this).siblings('div').removeClass('active'); + //移除 #formDesignerForm .layui-form-item 下所有的 active + $('#formDesignerForm .layui-form-item').removeClass('active'); + //给当前元素增加class + $(this).addClass('active'); + var _draghtml1 = '
    '; + var len = $(this).children().length; + if (len <= 12) { + //先删除元素 + $("#formDesignerForm .layui-form-item .widget-view-action").remove(); + $("#formDesignerForm .layui-form-item .widget-view-drag").remove(); + // console.log("显示子节点"); + // console.log($(this).children()); + if ($('#widget-view-action')) { //已存在 + $('#widget-view-action').remove(); + } + $(this).children(len - 1).after(_draghtml1); + } + /* 向 拷贝 删除 按钮添加 click 动作 */ + that.addCopyDeleteClick(); + //重新渲染 + form.render(); + if (options.data.length != 0) { + for (var i = 0; i < options.data.length; i++) { + if (options.data[i].tag === 'grid') { + for (var j = 0; j < options.data[i].columns.length; j++) { + for (var k = 0; k < options.data[i].columns[j].list.length; k++) { + if (options.data[i].columns[j].list[k].tag === 'select') { + $('#' + options.data[i].columns[j].list[k].id + ' .layui-input-block div.layui-unselect.layui-form-select').css({ + width: '{0}'.format(options.data[i].columns[j].list[k].width) + }); + } + } + } + } else { + if (options.data[i].tag === 'select') { + $('#' + options.data[i].id + ' .layui-input-block div.layui-unselect.layui-form-select').css({ + width: '{0}'.format(options.data[i].width) + }); + } + } + } + } + }); + }; + /* 给字段属性绑定事件 实现双向绑定?*/ + Class.prototype.bindPropertyEvent = function (_json) { + var that = this, + options = that.config; + if (options.data === undefined) { + return; + } + if (typeof (options.data) === 'string') { + options.data = JSON.parse(options.data); + } + var _property = $('#columnProperty'); + var _columns = _property.find('input,textarea,select,checkbox'); + var _json = options.selectItem; + //没有可以选择的 + if (_json === undefined) { + return; + } + laydate.render({ + elem: '#dataMaxValue' + _json.tag + _json.id, + format: 'yyyy-MM-dd', + btns: ['now', 'confirm'], + value: _json.dataMaxValue, + done: function (value, date, endDate) { + _json.dataMaxValue = value; + that.components[_json.tag].update(_json); + } + }); + laydate.render({ + elem: '#dataMinValue' + _json.tag + _json.id, + format: 'yyyy-MM-dd', + btns: ['now', 'confirm'], + value: _json.dataMinValue, + done: function (value, date, endDate) { + _json.dataMinValue = value; + that.components[_json.tag].update(_json); + } + }); + laydate.render({ + elem: '#dateDefaultValue' + _json.tag + _json.id, + type: _json.datetype, + format: _json.dateformat, + value: _json.dateDefaultValue, + done: function (value, date, endDate) { + _json.dateDefaultValue = value; + that.components[_json.tag].update(_json); + } + }); + laydate.render({ + elem: '#dateRangeDefaultValue' + _json.tag + _json.id, + type: _json.datetype, + format: _json.dateformat, + value: _json.dateRangeDefaultValue, + range: "-", + done: function (value, date, endDate) { + _json.dateRangeDefaultValue = value; + that.components[_json.tag].update(_json); + } + }); + iconPicker.render({ + // 选择器,推荐使用input + elem: '#' + _json.tag + _json.id + "property", + // 数据类型:fontClass/unicode,推荐使用fontClass + type: 'fontClass', + // 是否开启搜索:true/false,默认true + search: true, + // 是否开启分页:true/false,默认true + page: true, + // 每页显示数量,默认12 + limit: 12, + // 每个图标格子的宽度:'43px'或'20%' + cellWidth: '43px', + // 点击回调 + click: function (data) { + _json.buttonIcon = data.icon; + that.components[_json.tag].update(_json); + }, + // 渲染成功后的回调 + success: function (d) { + //console.log(d); + } + }); + iconPicker.checkIcon(_json.tag + _json.id + "property", ''); + if (_json.width !== undefined) { + //定义初始值 + slider.render({ + elem: '#width', + value: _json.width.replace("%", ""), //初始值 + min: 20, + max: 100, + step: 1, + input: true, + change: function (value) { + _json.width = value + "%"; + that.components[_json.tag].update(_json); + } + }); + } + if (_json.labelWidth !== undefined) { + //定义初始值 + slider.render({ + elem: '#labelWidth', + value: _json.labelWidth, //初始值 + min: 80, + max: 300, + step: 1, + input: true, + change: function (value) { + _json.labelWidth = value; + that.components[_json.tag].update(_json); + } + }); + } + $('#menu').click(function () { + layer.open({ + type: 2, + title: '头部菜单', + btn: ['保存', '关闭'], //可以无限个按钮 + yes: function (index, layero) { + //do something + var iframe = window['layui-layer-iframe' + index]; + var checkData = iframe.getCheckData(); + _json.menu = checkData; + that.components[_json.tag].update(_json); + layer.close(index); //如果设定了yes回调,需进行手工关闭 + }, + btn2: function (index, layero) { + layer.close(index); + }, + closeBtn: 1, //不显示关闭按钮 + shade: [0], + area: ['80%', '80%'], + offset: 'auto', //右下角弹出 + anim: 2, + content: ['./editorMenu.html', 'yes'], //iframe的url,no代表不显示滚动条 + success: function (layero, index) { + var iframe = window['layui-layer-iframe' + index]; + iframe.child(iceEditMenus) + } + }); + }); + form.on('checkbox', function (data) { + //data.elem.closest('.layui-form-item') + if (_json.tag === 'checkbox') { + var _index = parseInt($("#" + _json.id + " .layui-input-block div.layui-form-checkbox").index(data.othis[0])); + if ($(data.othis[0]).parent().parent().parent().attr("id") === 'checkbox') { + _index = parseInt($(data.othis[0]).parent().parent().attr("data-index")); + } + for (var i = 0; i < _json.options.length; i++) { + if (i === _index) { + _json.options[i].checked = data.elem.checked; + break; + } + } + that.components[_json.tag].update(_json); + } + }); + form.on('radio', function (data) { + //data.elem.closest('.layui-form-item') + if (_json.tag === 'radio') { + var _index = parseInt($("#" + _json.id + " .layui-input-block div.layui-form-radio").index(data.othis[0])); + if ($(data.othis[0]).parent().parent().parent().attr("id") === 'radio') { + _index = parseInt($(data.othis[0]).parent().parent().attr("data-index")); + } + for (var i = 0; i < _json.options.length; i++) { + if (i === _index) { + _json.options[i].checked = true; + continue; + } + _json.options[i].checked = false; + } + that.components[_json.tag].update(_json); + } else if (_json.tag === 'select') { + var _index = parseInt(data.elem.closest('.layui-form-item').dataset.index); + for (var i = 0; i < _json.options.length; i++) { + if (i === _index) { + _json.options[i].checked = true; + continue; + } + _json.options[i].checked = false; + } + that.components[_json.tag].update(_json); + } + }); + form.on('select', function (data) { + var _key = data.elem.name; + var _value = parseInt(data.value); + var _json = options.selectItem; + if (_key === 'columns') { + var columnCount = _json[_key].length; + var nullJson = { + span: 12, + list: [] + }; + if (_value > columnCount) { + for (var i = columnCount + 1; i <= _value; i++) { + _json[_key].splice(i, 0, nullJson); + } + } else { + _json[_key].splice(_value, columnCount); + } + that.renderForm(); + } else if (_key === 'dateformat') { + if (_json.tag === 'date') { + var _html = '
    '.format('dateDefaultValue' + _json.tag + _json.id); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty(); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html); + _json.dateformat = data.value; + var dateClass = laydate.render({ + elem: '#dateDefaultValue' + _json.tag + _json.id, + type: _json.datetype, + format: _json.dateformat, + value: new Date(), + done: function (value, date, endDate) { + _json.dateDefaultValue = value; + that.components[_json.tag].update(_json); + } + }); + _json.dateDefaultValue = dateClass.config.elem[0].innerText; + that.components[_json.tag].update(_json); + } + if (_json.tag === 'dateRange') { + var _html = '
    '.format('dateDefaultValue' + _json.tag + _json.id); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty(); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html); + _json.dateformat = data.value; + var _v = layui.util.toDateString(new Date(), _json.dateformat) + " - " + layui.util.toDateString(new Date(), _json.dateformat); + laydate.render({ + elem: '#dateRangeDefaultValue' + _json.tag + _json.id, + type: _json.datetype, + format: _json.dateformat, + value: _v, + range: "-", + done: function (value, date, endDate) { + _json.dateRangeDefaultValue = value; + that.components[_json.tag].update(_json); + } + }); + _json.dateRangeDefaultValue = _v; + that.components[_json.tag].update(_json); + } + } else if (_key === 'datetype') { + if (_json.tag === 'date') { + var _html = '
    '.format('dateDefaultValue' + _json.tag + _json.id); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty(); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html); + _json.datetype = data.value; + var dateClass = laydate.render({ + elem: '#dateDefaultValue' + _json.tag + _json.id, + type: _json.datetype, + format: _json.dateformat, + value: new Date(), + done: function (value, date, endDate) { + _json.dateDefaultValue = value; + that.components[_json.tag].update(_json); + } + }); + _json.dateDefaultValue = dateClass.config.elem[0].innerText; + that.components[_json.tag].update(_json); + } + if (_json.tag === 'dateRange') { + var _html = '
    '.format('dateDefaultValue' + _json.tag + _json.id); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').empty(); + $('#dateDefaultValue' + _json.id + ' .layui-input-block').append(_html); + _json.datetype = data.value; + laydate.render({ + elem: '#dateRangeDefaultValue' + _json.tag + _json.id, + type: _json.datetype, + format: _json.dateformat, + value: _json.dateRangeDefaultValue, + range: "-", + done: function (value, date, endDate) { + _json.dateRangeDefaultValue = value; + that.components[_json.tag].update(_json); + } + }); + that.components[_json.tag].update(_json); + } + } else if (_key === 'required') { + _json.expression = data.value; + that.components[_json.tag].update(_json); + } else if (_key === 'expression') { + _json.expression = data.value; + that.components[_json.tag].update(_json); + } else if (_key === 'anim' || _key === 'arrow') { + _json[data.elem.name] = data.value; + that.components[_json.tag].update(_json); + } else if (_key === 'buttonType') { + _json.buttonType = data.value; + that.components[_json.tag].update(_json); + } else if (_key === 'buttonSize') { + _json.buttonSize = data.value; + that.components[_json.tag].update(_json); + } + }); + form.on('switch', function (data) { + var _key = data.elem.name; + var _value = data.elem.checked ? true : false; + if (_key === 'readonly' || _key == 'disabled' || _key === 'required' || _key === 'half' || _key === 'text' || _key === 'switchValue' || _key === 'isInput' || _key == 'iconPickerSearch' || _key === 'iconPickerPage' || _key === 'isEnter' || _key === 'isLabel') { + _json[_key] = _value; + that.components[_json.tag].update(_json); //局部更新 + } + }); + //options 的添加事件 + if (_json.hasOwnProperty('options')) { + $('#select-option-add').on('click', function () { + //添加html + _json.options.splice(_json.options.length + 1, 0, { + text: 'option', + value: 'value', + checked: false + }); + var _htmloption = ''; + _htmloption += '
    '.format(_json.options.length - 1); + _htmloption += '
    '; + if (_json.tag === 'checkbox') { + _htmloption += ' '.format(_json.tag); + } else { + _htmloption += ' '.format(_json.tag); + } + _htmloption += '
    '; + _htmloption += '
    '; + _htmloption += ' '.format(_json.tag, 'option'); + _htmloption += '
    '; + _htmloption += '
    '; + _htmloption += ' '.format(_json.tag, 'value'); + _htmloption += '
    '; + _htmloption += '
    '; + _htmloption += ' '; + _htmloption += ' '; + _htmloption += '
    '; + _htmloption += '
    '; + $('#columnProperty .select-options').last().after(_htmloption); + _html = ''; + if (_json.tag === 'checkbox') { + //同步到设计视图checkbox + _html += ''.format(_json.tag, 'option'); + $('#' + _json.id + ' .layui-input-block').append(_html); + } else if (_json.tag === 'radio') { + //同步到设计视图radio + _html += ''.format(_json.tag, 'option'); + $('#' + _json.id + ' .layui-input-block').append(_html); + } else if (_json.tag === 'carousel') { + } + if (_json.tag === 'checkbox') { + form.render('checkbox'); + } else if (_json.tag === 'radio') { + form.render('radio'); + } else if (_json.tag == 'carousel') { + that.components[_json.tag].update(_json); + form.render('radio'); + carousel.render({ + elem: '#' + item.tag + item.id, + width: item.width, //设置容器宽度 + arrow: item.arrow, //始终显示箭头 + //anim: 'updown' //切换动画方式 + }); + } else if (_json.tag == 'select') { + form.render('select'); + form.render('radio'); + } + }); + //委托监听先关闭在增加 click + $(document).off('click', '#columnProperty .select-option-delete').on('click', '#columnProperty .select-option-delete', function (e) { + e.preventDefault(); + e.stopPropagation(); + //从数据源 options.data 中删除节点 + if (_json.options.length <= 1) { + layer.msg('已达到最低选项,不能继续删除'); + return; + } + var _index = $(this).closest('.layui-form-item')[0].dataset.index; + if (_index !== undefined) { + _json.options.splice(_index, 1); //删除此节点 + } + var checkedDefual = true; + for (var i = 0; i < _json.options.length; i++) { + if (_json.options[i].checked) { + vv = false + } + } + if (checkedDefual) { + _json.options[0].checked = true; + } + //从html中删除节点 改成全部重绘 + // $(this).closest('.layui-form-item').remove() + $('#' + _json.tag).empty(); + //删除所有的选项 + //选项 + var _html = ''; + for (var i = 0; i < _json.options.length; i++) { + _html += '
    '.format(i); + _html += '
    '; + if (_json.tag === 'checkbox') { + if (_json.options[i].checked) { + _html += ' '.format(_json.tag); + } else { + _html += ' '.format(_json.tag); + } + } else { + if (_json.options[i].checked) { + _html += ' '.format(_json.tag); + } else { + _html += ' '.format(_json.tag); + } + } + _html += '
    '; + _html += '
    '; + _html += ' '.format(_json.tag, _json.options[i].text); + _html += '
    '; + _html += '
    '; + _html += ' '.format(_json.tag, _json.options[i].value); + _html += '
    '; + _html += '
    '; + _html += ' '; + _html += ' '; + _html += '
    '; + _html += '
    '; + } + $('#' + _json.tag).append(_html); + //更新设计区节点 + that.components[_json.tag].update(_json); + if (_json.tag === 'checkbox') { + form.render('checkbox'); + } else if (_json.tag === 'radio') { + form.render('radio'); + } else if (_json.tag == 'select') { + form.render('select'); + form.render('radio'); + } + //向 .option .layui-inline 添加drag事件并且必须设在 select-option-drag 中才能拖动 + }); + } + $(document).off('click', '.select-options input[type=checkbox]').on('click', '.select-options input[type=checkbox]', function (e) { + // console.log(e); + //判断是否选中 + //找到 id=key 下的 option值 + var _options = []; + //遍历options 的值 + $('#columnProperty .select-options').each(function () { + _options.push({ + text: $(this).find('input[name=select-text]').val(), + value: $(this).find('input[name=select-value]').val() + }); + // console.log($(this)); + }); + //_json.options 节点值替换为 _options 值 + _json.options = JSON.parse(JSON.stringify(_options)); + }); + //属性模块的 input keyup + $(document).off('keyup', '#columnProperty .layui-input').on('keyup', '#columnProperty .layui-input', function () { + if ($(this).attr("name") !== undefined) { + //去改变值 + //改变json的值 + var _key = $(this).attr("name"); + var _value = $(this).val(); + var _json = options.selectItem; + if (_key === 'id') { + return; + } + if (_key === 'label' || _key === 'width' || _key === 'interval' || _key === 'iconPickerLimit' || _key === 'iconPickerCellWidth' || _key === 'buttonVlaue') { + _json[_key] = _value; + that.components[_json.tag].update(_json); //局部更新 + } + if (_key === 'uploadUrl' || _key === 'cronUrl') { + _json[_key] = _value; + } + if (_key === 'placeholder') { + _json[_key] = _value; + $('#' + _json.id).find('.layui-input').attr('placeholder', _value); + } + if (_key === 'height') { + _json[_key] = _value; + if (_json.tag === 'editor') { + that.components[_json.tag].update(_json); //局部更新 + } + if (_json.tag === 'carousel') { + _json[_key] = _value; + that.components[_json.tag].update(_json); //局部更新 + } + } + if (_key == 'uploadImage') { + _json[_key] = _value; + layedit.build(_json.tag + _json.id, { + height: _json['height'], + uploadImage: _value + }); //建立编辑器 + } + if (_key === 'defaultValue') { + _json[_key] = _value; + if (_json.tag === 'slider') { + var resultNumber = that.replaceNumber(_value); + _json[_key] = resultNumber; + $(this).val(resultNumber); + slider.render({ + elem: '#' + _json.tag + _json.id, + value: _json.defaultValue, //初始值 + min: _json.minValue, + max: _json.maxValue, + step: _json.stepValue, + disabled: _json.disabled + }); + } else if (_json.tag === 'rate') { + rate.render({ + elem: '#' + _json.tag + _json.id, + value: _json.defaultValue, + text: _json.text, + length: _json.rateLength, + half: _json.half, + readonly: _json.readonly + }); + } else if (_json.tag == 'textarea') { + $('#' + _json.id).find('.layui-textarea').text(_value); + } else if (_json.tag == 'colorpicker') { + that.components[_json.tag].update(_json); //局部更新 + } else if (_json.tag == 'iconPicker') { + that.components[_json.tag].update(_json); //局部更新 + } else if (_json.tag == 'numberInput') { + var resultNumber = that.replaceNumber(_value); + _json[_key] = resultNumber; + $(this).val(resultNumber); + that.components[_json.tag].update(_json); //局部更新 + } else { + $('#' + _json.id).find('.layui-input').val(_value); + } + } + if (_key === "minValue" || _key === "maxValue") { + var resultNumber = that.replaceNumber(_value); + _json[_key] = resultNumber; + $(this).val(resultNumber); + if (_json.tag === 'slider') { + slider.render({ + elem: '#' + _json.tag + _json.id, + value: _json.defaultValue, //初始值 + min: _json.minValue, + max: _json.maxValue, + step: _json.stepValue, + disabled: _json.disabled + }); + } else if (_json.tag == 'numberInput') { + that.components[_json.tag].update(_json); //局部更新 + } + } + if(_key === 'stepValue') { + _json[_key] = _value; + if (_json.tag == 'numberInput') { + that.components[_json.tag].update(_json); //局部更新 + } + } + if (_key === 'rateLength') { + _json[_key] = _value; + if (_json.tag === 'rate') { + rate.render({ + elem: '#' + _json.tag + _json.id, + value: _json.defaultValue, + text: _json.text, + length: _json.rateLength, + half: _json.half, + readonly: _json.readonly + }); + } + } + if (_key === 'document') { + _json[_key] = _value; + } + if (_key === 'readonly') { + _json[_key] = _value; + $('#' + _json.id).find('.layui-input').attr('readonly', _value); + } + if (_key === 'select-text' || _key === 'select-value' || _key === 'radio-text' || _key === 'radio-value' || _key === 'checkbox-text' || _key === 'checkbox-value') { + //找到 id=key 下的 option值 + var _index = parseInt($(this).parent().parent().attr("data-index")); + if (_key === 'select-text' || _key === 'radio-text' || _key === 'checkbox-text') { + _json.options[_index].text = $(this).val(); + } else { + _json.options[_index].value = $(this).val(); + } + that.components[_json.tag].update(_json); //局部更新 + } + if (_key === 'carousel-text' || _key === 'carousel-value') { + //找到 id=key 下的 option值 + var _options = []; + //遍历options 的值 + $('#columnProperty .select-options').each(function () { + _options.push({ + text: $(this).find('input[name=carousel-text]').val(), + value: $(this).find('input[name=carousel-value]').val() + }); + // console.log($(this)); + }); + //_json.options 节点值替换为 _options 值 + _json.options = JSON.parse(JSON.stringify(_options)); + that.components[_json.tag].update(_json); //局部更新 + } + } + }); + $(document).off('blur', '#columnProperty .layui-input').on('blur', '#columnProperty .layui-input', function () { + if ($(this).attr("name") !== undefined) { + //改变json的值 + var _key = $(this).attr("name"); + var _value = $(this).val(); + var _json = options.selectItem; + var _oldid = _json.id; + if (_key === 'id' && _value !== _oldid) { //标识的更改 + //检测id是否存在重复 + var _checkid = that.findJsonItem(options.data, _value); + if (_checkid === undefined) { + _json[_key] = _value; + that.renderForm(); + } else { + //提示层 + layer.msg('ID已经存在'); + } + } + } + }); + //预览 + } + //递归赋值 + Class.prototype.replaceNumber = function (value) { + value = value.replace(/[^\d]/g, ''); + if ('' != value) { + value = parseInt(value); + } + return value; + } + /* 加入copy选项删除 */ + Class.prototype.addCopyDeleteClick = function () { + var that = this, + options = that.config; + if (options.data === undefined) { + return; + } + if (typeof (options.data) === 'string') { + options.data = JSON.parse(options.data); + } + //复制当前节点 + $('#formDesignerForm .layui-form-item .widget-view-action .layui-icon-file').on('click', function (e) { + e.stopPropagation(); + //在json中插入 + if (options.data === undefined) { + return; + } + if (typeof (options.data) === 'string') { + options.data = JSON.parse(options.data); + } + var _id = document.elementFromPoint(e.pageX, e.pageY).parentElement.parentElement.dataset.id; + if (_id !== undefined) { + options.selectItem = that.copyJsonAfterItem(options.data, _id); + } + that.renderForm(); + }); + $('#formDesignerForm .layui-form-item .layui-icon-delete').on('click', function (e) { + e.stopPropagation(); + //获取当前组件的组件id + var _id = document.elementFromPoint(e.pageX, e.pageY).parentElement.parentElement.dataset.id; + if (_id !== undefined) { + options.selectItem = that.deleteJsonItem(options.data, _id); + delete iceEditorObjects["editor" + _id] + } + //document.elementFromPoint(e.pageX,e.pageY).parentElement.parentElement.parentElement.dataset 获取父grid的信息 + // 删除刷新表单与属性 + that.renderForm(); + // console.log('click layui-icon layui-icon-delete'); + }); + }; + /* 触发 grid 的 sortablejs 事件*/ + Class.prototype.bindGridSortEvent = function (json) { + var that = this; + var options = that.config; + var objs = $('#' + json.id + ' .widget-col-list'); + //遍历他下面的节点 + for (var i = 0; i < objs.length; i++) { + var el = objs[i]; + var ops = { + group: { + name: 'formgroup' + }, + handle: '.widget-view-drag', + ghostClass: "ghost", + animation: 150, + onAdd: function (evt) { + var parentItem = JSON.parse(JSON.stringify(that.findJsonItem(options.data, evt.item.parentElement.parentElement.dataset.id))); + var index = evt.newIndex; + var colIndex = evt.item.parentElement.dataset.index; + if (evt.item.dataset.id != undefined) { + //表示从其他地方移动过来 + var _fromItem = JSON.parse(JSON.stringify(that.findJsonItem(options.data, evt.item.dataset.id))); + var _oldid = _fromItem.id; + _fromItem.id = that.autoId(_fromItem.tag); + _fromItem.index = index; + parentItem.columns[colIndex].list.splice(index + 1, 0, _fromItem); + that.findAndCopyJson(options.data, parentItem, evt.item.parentElement.parentElement.dataset.id); + that.deleteJsonItem(options.data, _oldid); + } else { + /* 向指定目标放入数据 splice */ + var tag = evt.item.dataset.tag; + _id = that.autoId(tag); + var _newitem = that.components[tag].jsonData(_id, evt.newIndex); + _newitem.index = index; + parentItem.columns[colIndex].list.splice(index + 1, 0, _newitem); + that.findAndCopyJson(options.data, parentItem, evt.item.parentElement.parentElement.dataset.id); + options.selectItem = _newitem; + } + that.renderForm(); + }, + //拖动结束 + onEnd: function (evt) { + //console.log(evt); + } + }; + var gridSortable = Sortable.create(el, ops); + } + }; + //递归赋值 + Class.prototype.findAndCopyJson = function (json, parentItem, id) { + var that = this; + for (var i = 0; i < json.length; i++) { + if (json[i].id === id) { + json[i] = parentItem; + } else { + if (json[i].tag === 'grid') { + for (var j = 0; j < json[i].columns.length; j++) { + if (json[i].columns[j].list.length > 0) { + that.findAndCopyJson(json[i].columns[j].list, parentItem, id); + } + } + } + } + } + } + //渲染视图 + Class.prototype.render = function () { + var that = this; + var options = that.config; + options.elem = $(options.elem); + options.id = options.id || options.elem.attr('id') || that.index; + //cache 模式 + /* 输入型组件 开始*/ + var _listhtml = "" + _listhtml += '
    {0}
    '.format(formField.c1.name); + _listhtml += '
    '; + $.each(formField.c1.list, function (index, item) { + _listhtml += '
    {1}
    '.format(item, lang[item]); + }); + _listhtml += '
    '; + _listhtml += '
    {0}
    '.format(formField.c2.name); + _listhtml += '
    '; + /* 选择型组件 开始*/ + $.each(formField.c2.list, function (index, item) { + _listhtml += '
    {1}
    '.format(item, lang[item]); + }); + _listhtml += '
    '; + _listhtml += '
    {0}
    '.format(formField.c3.name); + _listhtml += '
    '; + /* 布局型组件 开始*/ + $.each(formField.c3.list, function (index, item) { + _listhtml += '
    {1}
    '.format(item, lang[item]); + }); + _listhtml += '
    '; + _listhtml += '
    {0}
    '.format(formField.c4.name); + _listhtml += '
    '; + /* 选择型组件 开始*/ + $.each(formField.c4.list, function (index, item) { + _listhtml += '
    {1}
    '.format(item, lang[item]); + }); + _listhtml += '
    '; + _listhtml += '
    {0}
    '.format(formField.c5.name); + _listhtml += '
    '; + /* 选择型组件 开始*/ + $.each(formField.c5.list, function (index, item) { + _listhtml += '
    {1}
    '.format(item, lang[item]); + }); + _listhtml += '
    '; + options.elem.html(TP_MAIN); + $('#components-form-list').append(_listhtml); + $('body').append(TP_HTML_VIEW); + $('body').append(TP_IMPORT_VIEW); //TP_IMPORT_VIEW + $('body').append(TP_ABOUT_VIEW); + //排序事件注册 + var sortable1 = Sortable.create(document.getElementById("c1"), { + group: { + name: 'formgroup', + pull: 'clone', //克隆本区域元素到其他区域 + put: false, //禁止本区域实现拖动或拖入 + }, + // ghostClass: "ghost", + sort: false, + animation: 150, + onEnd: function (evt) { + // console.log('onEnd.foo:', [evt.item, evt.from]); + // console.log(evt.oldIndex); + // console.log(evt.newIndex); + var itemEl = evt.item; + // console.log(itemEl); + } + }); + var sortable2 = Sortable.create(document.getElementById("c2"), { + group: { + name: 'formgroup', + pull: 'clone', + put: false, //禁止本区域实现拖动或拖入 + }, + sort: false, + animation: 150 + }); + var sortable3 = Sortable.create(document.getElementById("c3"), { + group: { + name: 'formgroup', + pull: 'clone', + put: false, //禁止本区域实现拖动或拖入 + }, + sort: false, + animation: 150 + }); + var sortable4 = Sortable.create(document.getElementById("c4"), { + group: { + name: 'formgroup', + pull: 'clone', + put: false, //禁止本区域实现拖动或拖入 + }, + sort: false, + animation: 150 + }); + var sortable5 = Sortable.create(document.getElementById("c5"), { + group: { + name: 'formgroup', + pull: 'clone', + put: false, //禁止本区域实现拖动或拖入 + }, + sort: false, + animation: 150 + }); + // 表单设计 + var formItemSort = Sortable.create(document.getElementById("formDesignerForm"), { + group: { + name: 'formgroup' + }, + handle: '.widget-view-drag', + ghostClass: "ghost", + animation: 200, + /** + * 不同元素之间的拷贝 + * 如果是从组件区域则是创建一个新的节点 + * 如果是从设计区则是移动一个节点 + * */ + onAdd: function (evt) { + var columncount = evt.item.dataset.columncount; + if (columncount === undefined) { + columncount = 2; + } + // 没有表单JSON数据 + console.log(options.data) + if (options.data === undefined) { + return; + } + if (typeof (options.data) === 'string') { + options.data = JSON.parse(options.data); + } + //注意这里的一个bug,newIndex 第一次拖动也是1 第二次拖动也是1 + if (options.data.length === 0) { + evt.newIndex = 0; + } + if (evt.item.dataset.id !== undefined) { + /*根据id的新算法 复制一份副本 删除json中的节点 再插入节点*/ + var _item = that.findJsonItem(options.data, evt.item.dataset.id); + options.selectItem = _item; + that.deleteJsonItem(options.data, evt.item.dataset.id); + options.data.splice(evt.newIndex + 1, 0, _item); + } else { + var _id = that.autoId(evt.item.dataset.tag); + /* 向现有的表单数据中增加新的数组元素 splice */ + var _newitem = that.components[evt.item.dataset.tag].jsonData(_id, evt.newIndex, columncount); + //如果是 grid 呢,需要知道几列 + options.selectItem = _newitem; + options.data.splice(evt.newIndex, 0, _newitem); //options.data.splice(evt.newIndex + 1, 0, _newitem); + /* 如果evt.item.dataset.id 有值表示从已经存在的布局中获取了元素,这个时候要在数据源中删除这个元素*/ + } + //局部更新 只要更新 designer 设计区部分 + that.renderForm(); + }, + onEnd: function (evt) { + var newIndex = evt.newIndex; + var oldIndex = evt.oldIndex; + //只有当to的目标容器是 formDesignerForm 才出发次逻辑 + if (evt.to.id === 'formDesignerForm') { + that.moveItem(evt.oldIndex, evt.newIndex); + } + } + }); + //移动视图 + Class.prototype.moveItem = function (oldIndex, newIndex) { + var that = this, + options = that.config; + var newData = options.data[newIndex]; + var oldData = options.data[oldIndex]; + options.data[newIndex] = oldData; + options.data[oldIndex] = newData; + } + //导出数据 + $('.exportJson').on('click', function () { + document.getElementById('generate-code-view').value = JSON.stringify(options.data, null, 4); + layer.open({ + type: 1, + title: 'JSON 数据导出', + id: 'Lay_layer_htmlcodeview', + content: $('.htmlcodeview'), + area: ['800px', '640px'], + shade: false, + resize: false, + success: function (layero, index) {}, + end: function () { + $('.htmlcodeview').css("display", "none") + } + }); + }); + //导入数据 + $('.importJson').on('click', function () { + document.getElementById('import-json-code').value = JSON.stringify(options.data, null, 4); + layer.open({ + type: 1, + title: 'JSON模板数据导入', + id: 'Lay_layer_importjsoncodeview', + content: $('.importjsoncodeview'), + area: ['800px', '640px'], + shade: false, + resize: false, + success: function (layero, index) { + }, + end: function () { + $('.importjsoncodeview').css("display", "none") + } + }); + }); + $('.aboutForm').on('click', function () { + layer.open({ + type: 1, + title: '关于 Layui表单设计器', + id: 'Lay_layer_aboutusview', + content: $('.aboutusview'), + area: ['800px', '640px'], + shade: false, + resize: false, + success: function (layero, index) { + }, + end: function () { + } + }); + }); + $('#copy-html-code').on('click', function () { + var Url2 = document.getElementById("generate-code-view"); + Url2.select(); // 选择对象 + document.execCommand("Copy"); // 执行 + layer.msg('复制成功'); + }); + $('#import-json-code').on('click', function () { + var _value = document.getElementById("import-json-code-view").value; + options.data = JSON.parse(_value); + that.renderForm(); + layer.closeAll(); + layer.msg('导入成功'); + }); + $('.generateCode').on('click', function () { + options.htmlCode.script = ''; + var _htmlelem = $('
    '); + that.generateHtml(options.data, _htmlelem); + //构件 html + var TP_HTML_CODE = [ + '', + '', + ' ', + ' ', + ' ', + ' 表单设计器代码', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '
    ', + '
    ', + '' + _htmlelem.html() + '', + '
    ', + '
    ', + ' ', + ' ', + '
    ', + '
    ', + '
    ' + + '
    ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '' + ].join(''); + var tabsize = 4; + var tabchar = ' '; + if (tabsize == 1) { + tabchar = '\t'; + } + document.getElementById('generate-code-view').value = style_html(TP_HTML_CODE, tabsize, tabchar, 400); + console.log($('#generate-code-view').val()); + // layer.open({ + // type: 1, + // title: 'HTML代码', + // id: 'Lay_layer_htmlcodeview', + // content: $('.htmlcodeview'), + // area: ['800px', '640px'], + // shade: false, + // resize: false, + // success: function (layero, index) { + // layer.style(index, { + // marginLeft: -220 + // }); + // }, + // end: function () { + // $('.htmlcodeview').css("display", "none") + // } + // }); + }); + $('.previewForm').on('click', function () { + window.localStorage.setItem('layui_form_json', JSON.stringify(options.data)); + layer.confirm('请选择你要预览页面的方式?', { + btn: ['弹窗', '新页面'] //按钮 + }, function () { + //iframe窗 + layer.open({ + type: 2, + title: '表单预览', + btn: ['关闭'], //可以无限个按钮 + btn1: function (index, layero) { + layer.close(index); + }, + closeBtn: 1, //不显示关闭按钮 + shade: [0], + area: ['100%', '100%'], + offset: 'auto', //右下角弹出 + anim: 2, + content: ['./preview.html', 'yes'], //iframe的url,no代表不显示滚动条 + end: function () { //此处用于演示 + //加载结束 + } + }); + }, function () { + window.open("./preview.html"); + }); + }); + $('.saveJson').on('click', function () { + //window.localStorage.setItem('layui_form_json', JSON.stringify(options.data)); + CoreUtil.sendPut("/activiti-form/setActivitiForm", { + "id": $("#fromId").val(), + "formData": JSON.stringify(options.data) + }, function (res) { + if (res.code === 0) { + layer.msg(res.msg, { + icon: 1 + }); + } else { + layer.msg(res.msg, { + icon: 2 + }); + } + setTimeout(function () { + var index = parent.layer.getFrameIndex(window.name); + parent.layer.close(index); //关闭弹出层 + parent.location.reload(); + }, 1000); + }) + //var index = parent.layer.getFrameIndex(window.name); + //parent.layer.close(index); + }); + that.renderForm(); + }; + /* 递归渲染组件 */ + Class.prototype.renderComponents = function (jsondata, elem) { + var that = this, + options = that.config; + $.each(jsondata, function (index, item) { + item.index = index; //设置index 仅仅为了传递给render对象,如果存在下级子节点那么 子节点的也要变动 + if (options.selectItem === undefined) { + elem.append(that.components[item.tag].render(item, false)); + } else { + if (options.selectItem.id === item.id) { + elem.append(that.components[item.tag].render(item, true)); + //显示当前的属性 + that.components[item.tag].property(item); + that.bindPropertyEvent(item); + } else { + elem.append(that.components[item.tag].render(item, false)); + } + } + if (item.tag === 'grid') { + that.bindGridSortEvent(item); + $.each(item.columns, function (index2, item2) { + //获取当前的 DOM 对象 + if (item2.list.length > 0) { + var elem2 = $('#' + item.id + '_column_' + index2); + if (item2.list.length > 0) { + that.renderComponents(item2.list, elem2); + } + } + }); + } else if (item.tag === 'slider') { + //定义初始值 + slider.render({ + elem: '#' + item.tag + item.id, + value: item.defaultValue, //初始值 + min: item.minValue, + max: item.maxValue, + step: item.stepValue, + input: item.isInput, + change: function (value) { + $("#" + item.id).find("input[name=" + item.id + "]").val(value); + } + }); + } else if (item.tag === 'numberInput') { + //定义初始值 + var _width = item.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + $('#' + item.id + ' .layui-input-block .layui-number-input-btn').css("right", _width + "%"); + if (item.disabled) { + $('#' + item.id + ' .layui-input-block .layui-number-input-btn').css("z-index", "-1"); + } + } else if (item.tag === 'date') { + laydate.render({ + elem: '#' + item.tag + item.id, + type: item.datetype, + format: item.dateformat, + value: item.dateDefaultValue, + min: item.dataMinValue, + max: item.dataMaxValue, + }); + } else if (item.tag === 'labelGeneration') { + labelGeneration.render({ + elem: '#' + item.tag + item.id, + data: item.dateDefaultValue, + isEnter: item.isEnter + }); + } else if (item.tag === 'sign') { + $('#' + item.id + item.tag).click(function () { + layer.open({ + type: 2, + title: '手写签名', + btn: ['保存', '关闭'], //可以无限个按钮 + yes: function (index, layero) { + //do something + var iframe = window['layui-layer-iframe' + index]; + var data = iframe.getCanvasData(); + item.data = data; + that.components[item.tag].update(item); + layer.close(index); //如果设定了yes回调,需进行手工关闭 + }, + btn2: function (index, layero) { + layer.close(index); + }, + closeBtn: 1, //不显示关闭按钮 + shade: [0], + area: ['60%', '60%'], + offset: 'auto', //右下角弹出 + anim: 2, + content: ['./handwrittenSignature.html', 'yes'], //iframe的url,no代表不显示滚动条 + success: function (layero, index) { + } + }); + }); + } else if (item.tag === 'iconPicker') { + iconPicker.render({ + // 选择器,推荐使用input + elem: '#' + item.tag + item.id, + // 数据类型:fontClass/unicode,推荐使用fontClass + type: 'fontClass', + // 是否开启搜索:true/false,默认true + search: item.iconPickerSearch, + // 是否开启分页:true/false,默认true + page: item.iconPickerPage, + // 每页显示数量,默认12 + limit: item.iconPickerLimit, + // 每个图标格子的宽度:'43px'或'20%' + cellWidth: item.iconPickerCellWidth, + // 点击回调 + click: function (data) { + //console.log(data); + }, + // 渲染成功后的回调 + success: function (d) { + //console.log(d); + } + }); + iconPicker.checkIcon(item.tag + item.id, ''); + } else if (item.tag === 'dateRange') { + laydate.render({ + elem: '#' + item.tag + item.id, + type: item.datetype, + format: item.dateformat, + min: item.dataMinValue, + max: item.dataMaxValue, + range: ['#start-' + item.tag + item.id, '#end-' + item.tag + item.id] + }); + if (item.dateRangeDefaultValue !== null && item.dateRangeDefaultValue !== "" && item.dateRangeDefaultValue !== undefined) { + var split = item.dateRangeDefaultValue.split(" - "); + $('#start-' + item.tag + item.id).val(split[0]); + $('#end-' + item.tag + item.id).val(split[1]); + } + } else if (item.tag === 'rate') { + rate.render({ + elem: '#' + item.tag + item.id, + value: item.defaultValue, + text: item.text, + half: item.half, + length: item.rateLength, + readonly: item.readonly, + choose: function (value) { + $("#" + item.id).find("input[name=" + item.id + "]").val(value); + } + }); + } else if (item.tag === 'cron' && !item.disabled) { + cron.render({ + elem: "#" + item.tag + item.id + "-button", // 绑定元素 + url: item.cronUrl, // 获取最近运行时间的接口 + // value: $("#cron").val(), // 默认值 + done: function (cronStr) { + $("#" + item.tag + item.id).val(cronStr); + }, + }); + } else if (item.tag === 'colorpicker') { + colorpicker.render({ + elem: '#' + item.tag + item.id, + color: item.defaultValue, + format: 'rgb', + predefine: true, + alpha: true, + done: function (color) { + $("#" + item.id).find("input[name=" + item.id + "]").val(color); + //譬如你可以在回调中把得到的 color 赋值给表单 + } + }); + } else if (item.tag === 'editor') { + var e = new ice.editor(item.tag + item.id); + e.width = item.width; //宽度 + e.height = item.height; //高度 + e.uploadUrl = item.uploadUrl; //上传文件路径 + e.disabled = item.disabled; + e.menu = item.menu; + e.create(); + iceEditorObjects[item.id] = e; + } else if (item.tag === 'carousel') { + carousel.render({ + elem: '#' + item.tag + item.id, + width: item.width, //设置容器宽度 + height: item.height, //设置容器宽度 + arrow: item.arrow, //始终显示箭头 + interval: item.interval, + anim: item.anim, + autoplay: item.autoplay, + }); + } else if (item.tag === 'image') { + upload.render({ + elem: '#' + item.tag + item.id, + url: 'https://httpbin.org/post', + multiple: true, + before: function (obj) { + layer.msg('图片上传中...', { + icon: 16, + shade: 0.01, + time: 0 + }) + }, + done: function (res) { + layer.close(layer.msg()); //关闭上传提示窗口 + //上传完毕 + $('#uploader-list-' + item.id).append('
    ' + '
    ' + '' + '
    ' + res.data.title + '
    ' + '
    '); + } + }); + } else if (item.tag === 'file') { + upload.render({ + elem: '#' + item.tag + item.id, + elemList: $('#list-' + item.id) //列表元素对象 + , + url: '' + item.uploadUrl + '', + accept: 'file', + multiple: true, + number: 3, + auto: false, + bindAction: '#listAction-' + item.id, + choose: function (obj) { + var that = this; + var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列 + //读取本地文件 + obj.preview(function (index, file, result) { + var tr = $(['', '' + file.name + '', '' + (file.size / 1014).toFixed(1) + 'kb', '
    ', '', '', '', '', ''].join('')); + //单个重传 + tr.find('.demo-reload').on('click', function () { + obj.upload(index, file); + }); + //删除 + tr.find('.demo-delete').on('click', function () { + delete files[index]; //删除对应的文件 + tr.remove(); + uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选 + }); + that.elemList.append(tr); + element.render('progress'); //渲染新加的进度条组件 + }); + }, + done: function (res, index, upload) { //成功的回调 + var that = this; + //if(res.code == 0){ //上传成功 + var tr = that.elemList.find('tr#upload-' + index), + tds = tr.children(); + tds.eq(3).html(''); //清空操作 + delete this.files[index]; //删除文件队列已经上传成功的文件 + return; + //} + this.error(index, upload); + }, + allDone: function (obj) { //多文件上传完毕后的状态回调 + console.log(obj) + }, + error: function (index, upload) { //错误回调 + var that = this; + var tr = that.elemList.find('tr#upload-' + index), + tds = tr.children(); + tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传 + }, + progress: function (n, elem, e, index) { + element.progress('progress-demo-' + index, n + '%'); //执行进度条。n 即为返回的进度百分比 + } + }); + } + }); + }; + /* 生成 Html 代码 */ + Class.prototype.generateHtml = function (jsondata, elem) { + var that = this, + options = that.config; + $.each(jsondata, function (index, item) { + elem.append(that.components[item.tag].render(item, true)); + if (item.tag === 'grid') { + $.each(item.columns, function (index2, item2) { + //获取当前的 DOM 对象 + var elem2 = $('#' + item.id + '_column_' + index2); + if (item2.list.length > 0) { + that.generateHtml(item2.list, elem2); + } + }); + } else if (item.tag === 'slider') { + //定义初始值 + options.htmlCode.script += ['slider.render({', , 'elem: "#' + item.tag + item.id + '" ,', 'value: ' + item.defaultValue + ',', 'min: ' + item.minValue + ',', 'max: ' + item.maxValue + ',', 'step: ' + item.stepValue + ',', 'input:' + item.isInput + ',', 'change: function(value){', '$("#' + item.id + '").find("input[name="' + item.id + '"]").val(value);', ' }', '});'].join(''); + } else if (item.tag === 'date') { + options.htmlCode.script += ['laydate.render({', 'elem: "#' + item.tag + item.id + '" ,', 'type:"' + item.datetype + '",', 'format:"' + item.dateformat + '",', 'value:"' + item.dateDefaultValue + '",', 'min:"' + item.dataMinValue + '",', 'max:"' + item.dataMaxValue + '"});'].join(''); + } else if (item.tag === 'rate') { + options.htmlCode.script += ['rate.render({', 'elem: "#' + item.tag + item.id + '" ,', 'value: ' + item.defaultValue + ',', 'text: ' + item.text + ',', 'length: ' + item.rateLength + ',', 'half: ' + item.half + ',', 'readonly: ' + item.readonly + ',', 'choose: function(value){', '$("#' + item.id + '").find("input[name="' + item.id + '"]").val(value);', '}', '});'].join(''); + } else if (item.tag === 'colorpicker') { + options.htmlCode.script += ['colorpicker.render({', 'elem: "#' + item.tag + item.id + '"', ',format: \'rgb\'', ',predefine: true', ',alpha: true', ',done: function (color) {', '$("#' + item.id + '").find("input[name="' + item.id + '"]").val(color);', '}', '});'].join(''); + } else if (item.tag === 'editor') { + options.htmlCode.script += ['var e = new ice.editor(' + item.tag + item.id + ');', 'e.width=' + item.width + '; //宽度', 'e.height=' + item.height + '; //高度', 'e.uploadUrl=' + item.uploadUrl + '; //上传文件路径', 'e.disabled=' + item.disabled + ';', 'e.menu = ' + item.menu + ';', 'e.create();'].join(''); + } else if (item.tag === 'carousel') { + options.htmlCode.script += ['carousel.render({', 'elem: "#' + item.tag + item.id + '" ', ',width: "' + item.width + '"', ',height: "' + item.height + '"', ',arrow: "' + item.arrow + '"', ',interval: "' + item.interval + '"', ',anim: "' + item.anim + '"', ',autoplay: "' + item.autoplay + '"', '});'].join(''); + } else if (item.tag === 'labelGeneration') { + options.htmlCode.script += ['labelGeneration.render({', 'elem:"#' + item.tag + item.id + '",', 'data:' + item.dateDefaultValue + ',', 'isEnter:' + item.isEnter + '', '});'].join(''); + } else if (item.tag === 'iconPicker') { + options.htmlCode.script += ['iconPicker.render({', 'elem:"#' + item.tag + item.id + '",', 'type:"fontClass",', 'search:' + item.iconPickerSearch + '', 'page:' + item.iconPickerPage + '', 'limit:' + item.iconPickerLimit + '', 'cellWidth:' + item.iconPickerCellWidth + '', ' click: function (data) {},', 'success: function(d) {}', '});', 'iconPicker.checkIcon(' + item.tag + item.id + ',"");'].join(''); + } else if (item.tag === 'dateRange') { + options.htmlCode.script += ['laydate.render({', 'elem:"#' + item.tag + item.id + '",', 'type:' + item.datetype + ',', 'format:' + item.dateformat + '', 'min:' + item.dataMinValue + '', 'max:' + item.dataMaxValue + '', 'range:["#start-' + item.tag + item.id + '", "#end-' + item.tag + item.id + '"]', '});'].join(''); + } else if (item.tag === 'cron' && !item.disabled) { + options.htmlCode.script += ['cron.render({', 'elem:"#' + item.tag + item.id + '-button",', 'url:' + item.cronUrl + ',', 'done: function (cronStr) {', '$("#' + item.tag + item.id + '").val(cronStr);', '},', '});'].join(''); + } else if (item.tag === 'file') { + options.htmlCode.script += ['upload.render({', 'elem: "#' + item.tag + item.id + '" ', ', url: "' + item.uploadUrl + '"', ' ,elemList: $("#list-' + item.id + '")', ',accept: "file"', ',multiple: true', ',number: 3', ',auto: false', ',bindAction: "#listAction-' + item.id + '"', ',choose: function(obj){', 'var that = this;', 'var files = this.files = obj.pushFile();', 'obj.preview(function(index, file, result){', 'var tr = $([""', ',""+ file.name +""', ',""+ (file.size/1014).toFixed(1) +"kb"', ',"
    "', ',"","","",""', ',""].join(""));', 'tr.find(".demo-reload").on("click", function(){obj.upload(index, file);});', 'tr.find(".demo-delete").on("click", function(){delete files[index];tr.remove();uploadListIns.config.elem.next()[0].value = ""; });', 'that.elemList.append(tr);', 'element.render("progress");}', ',done: function(res, index, upload)', '{var that = this;if(res.code == 0){var tr = that.elemList.find("tr#upload-"+ index),tds = tr.children();tds.eq(3).html("");delete this.files[index];return;}this.error(index, upload);}', ',allDone: function(obj){console.log(obj)}', ',error: function(index, upload){var that = this;var tr = that.elemList.find("tr#upload-"+ index),', 'tds = tr.children();tds.eq(3).find(".demo-reload").removeClass("layui-hide");}', ',progress: function(n, elem, e, index){element.progress("progress-demo-"+ index, n + "%");}', '});'].join(''); + } else if (item.tag === 'image') { + options.htmlCode.script += ['upload.render({', 'elem: "#' + item.tag + item.id + '" ', ', url: "' + item.uploadUrl + '"', ', multiple: true', ', before: function (obj) {', 'layer.msg("图片上传中...", {', 'icon: 16,', 'shade: 0.01,', 'time: 0', '})', '}', ', done: function (res) {', 'layer.close(layer.msg());', '$("#uploader-list-' + item.id + '").append(', '\'
    ', '
    \'+ res.data.title+\'
    ', '
    \'', ');', '}', '});'].join(''); + } else if (item.tag === 'checkbox') { + options.htmlCode.script += ['form.verify({otherReq: function(value,item){' + 'var verifyName=$(item).attr("name"), verifyType=$(item).attr("type")' + ',formElem=$(item).parents(".layui-form"),verifyElem=formElem.find("input[name=\'"+verifyName+"\']")' + ',verifyElems = formElem.find("input"),isTrue= verifyElem.is(":checked"),focusElem = verifyElem.next().find("i.layui-icon");' + 'for (let i = 0; i < verifyElems.length; i++) {if (verifyElems[i].checked) {return false;}}' + 'if(!isTrue || !value){' + 'focusElem.css(verifyType=="radio"?{"color":"#FF5722"}:{"border-color":"#FF5722"});' + 'focusElem.first().attr("tabIndex","1").css("outline","0").blur(function() {' + 'focusElem.css(verifyType==\'radio\'?{"color":""}:{"border-color":""});' + '}).focus();' + 'return "必填项不能为空";}}});'].join(''); + } + }); + }; + /* 重新渲染设计区*/ + Class.prototype.renderForm = function () { + var that = this, + options = that.config; + var elem = $('#formDesignerForm'); + // 清空表单 + elem.empty(); + // 清空属性配置 + $('#columnProperty').empty(); + that.renderComponents(options.data, elem); + //选中的节点只有一个 + if (options.selectItem !== undefined) { + var _draghtml1 = '
    '; + var len = $('#' + options.selectItem.id).children().length; + if ($('#widget-view-action')) { //已存在 + $('#widget-view-action').remove(); + } + $('#' + options.selectItem.id).children(len - 1).after(_draghtml1); + $('#formDesignerForm .layui-form-item').removeClass('active'); + //给当前元素增加class + $('#' + options.selectItem.id).addClass('active'); + //设置当前选择项目的拷贝删除的事件 + //显示当前的属性 + that.components[options.selectItem.tag].property(options.selectItem); + if (options.selectItem.tag === "select" || options.selectItem.tag === "checkbox" || options.selectItem.tag === "radio" || options.selectItem.tag === "carousel") { + var sortable = Sortable.create(document.getElementById(options.selectItem.tag), { + group: { + name: 'propertygroup', + }, + ghostClass: "ghost", + handle: '.select-option-drag', + dataIdAttr: 'data-index', + animation: 150, + onEnd: function (evt) { + if (options.selectItem === undefined) { + return; + } + var indexArray = sortable.toArray(); + var newJson = []; + for (var i = 0; i < indexArray.length; i++) { + newJson.push(options.selectItem.options[indexArray[i]]); + } + options.selectItem.options = newJson; + //that.renderForm(); + that.components[options.selectItem.tag].update(options.selectItem); + } + }); + } + that.bindPropertyEvent(options.selectItem); + } + that.addClick(); + /* 向 拷贝 删除 按钮添加 click 动作 */ + that.addCopyDeleteClick(); + form.render(); + if (options.data.length != 0) { + for (var i = 0; i < options.data.length; i++) { + if (options.data[i].tag === 'grid') { + for (var j = 0; j < options.data[i].columns.length; j++) { + for (var k = 0; k < options.data[i].columns[j].list.length; k++) { + if (options.data[i].columns[j].list[k].tag === 'select') { + $('#' + options.data[i].columns[j].list[k].id + ' .layui-input-block div.layui-unselect.layui-form-select').css({ + width: '{0}'.format(options.data[i].columns[j].list[k].width) + }); + } + } + } + } else { + if (options.data[i].tag === 'select') { + $('#' + options.data[i].id + ' .layui-input-block div.layui-unselect.layui-form-select').css({ + width: '{0}'.format(options.data[i].width) + }); + } + } + } + } + }; + /* 渲染预览框 */ + Class.prototype.renderPreview = function () { + var that = this, + options = that.config; + }; + Class.prototype.reload = function (id, options) { + var that = this; + options = options || {}; //如果是空的话,就赋值 {} + that.render(); + } + //核心入口 初始化一个 regionSelect 类 + formDesigner.render = function (options) { + var ins = new Class(options); + return thisIns.call(ins); + }; + exports('formDesigner', formDesigner); +}); \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/formField.js b/module-form/src/main/resources/static/form-design/modules/formField.js new file mode 100644 index 00000000..2f71d773 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/formField.js @@ -0,0 +1,454 @@ +layui.define(['layer'], function (exports) { + var field = { + input: { + id: '-1', + index: '-1', + label: "单行文本", + tag: "input", + tagIcon: 'input', + placeholder: "请输入", + defaultValue: null, + labelWidth: 110, + width: "100%", + clearable: true, + maxlength: null, + showWordLimit: false, + readonly: false, + disabled: false, + required: true, + expression: "", + document: '' + }, + password: { + id: '-1', + index: '-1', + label: "密码框", + tag: "password", + tagIcon: 'password', + placeholder: "请输入", + defaultValue: null, + labelWidth: 110, + width: "100%", + clearable: true, + maxlength: null, + showWordLimit: false, + readonly: false, + disabled: false, + required: true, + document: '' + }, + select: { + id: '-1', + index: '-1', + label: "下拉框", + tag: "select", + tagIcon: 'select', + labelWidth: 110, + width: "100%", + disabled: false, + required: true, + document: '', + datasourceType: 'local', + remoteUrl: 'http://', + remoteMethod: 'post', + remoteOptionText: 'options.data.dictName', //映射到text + remoteOptionValue: 'options.data.dictId', //映射到value text和value可以是一样的 + remoteDefaultValue: '12', //表示对应的remoteOptionValue的值 + options: [{ + text: 'option1', + value: 'value1', + checked: true, + }, { + text: 'option2', + value: 'value2', + checked: false, + }, { + text: 'option3', + value: 'value3', + checked: false, + },] + }, + radio: { + id: '-1', + index: '-1', + label: "单选组", + tag: "radio", + tagIcon: 'radio', + labelWidth: 110, + disabled: false, + document: '', + datasourceType: 'local', + remoteUrl: 'http://', + remoteMethod: 'post', + remoteOptionText: 'options.data.dictName', //映射到text + remoteOptionValue: 'options.data.dictId', //映射到value text和value可以是一样的 + options: [{ + text: 'option1', + value: 'value1', + checked: true, + }, { + text: 'option2', + value: 'value2', + checked: false, + }, { + text: 'option3', + value: 'value3', + checked: false, + },] + }, + checkbox: { + id: '-1', + index: '-1', + label: "复选组", + tag: "checkbox", + tagIcon: 'checkbox', + labelWidth: 110, + disabled: false, + required: true, + document: '', + datasourceType: 'local', + remoteUrl: 'http://', + remoteMethod: 'post', + remoteOptionText: 'options.data.dictName', //映射到text + remoteOptionValue: 'options.data.dictId', //映射到value text和value可以是一样的 + options: [{ + text: 'option1', + value: 'value1', + checked: true, + }, { + text: 'option2', + value: 'value2', + checked: true, + }, { + text: 'option3', + value: 'value3', + checked: false, + },] + }, + switch: { + id: '-1', + index: '-1', + label: "开关", + tag: "switch", + tagIcon: 'switch', + labelWidth: 110, + width: "100%", + switchValue: false, + showWordLimit: false, + disabled: false, + document: '', + }, + slider: { + id: '-1', + index: '-1', + label: "滑块", + tag: "slider", + tagIcon: 'slider', + labelWidth: 110, + width: "100%", + defaultValue: 10, + maxValue: 100, + minValue: 1, + stepValue: 2, + isInput: true, + disabled: false, + document: '', + }, + numberInput: { + id: '-1', + index: '-1', + label: "数字输入框", + tag: "numberInput", + tagIcon: 'numberInput', + labelWidth: 110, + width: "100%", + defaultValue: 0, + maxValue: 100, + minValue: 0, + stepValue: 1, + disabled: false, + document: '', + }, + labelGeneration: { + id: '-1', + index: '-1', + label: "标签组件", + tag: "labelGeneration", + tagIcon: 'labelGeneration', + labelWidth: 110, + width: "100%", + isEnter: false, + disabled: false, + document: '', + }, + bottom: { + id: '-1', + index: '-1', + label: "按钮组件", + tag: "bottom", + tagIcon: 'bottom', + labelWidth: 110, + buttonIcon: "", + buttonVlaue: "按钮", + buttonType: "", + buttonSize: "", + isLabel: true, + disabled: false, + document: '', + }, + sign: { + id: '-1', + index: '-1', + label: "签名组件", + tag: "sign", + tagIcon: 'sign', + labelWidth: 110, + buttonVlaue: "手写签名", + buttonIcon: "", + data: "", + disabled: false, + document: '', + }, + iconPicker: { + id: '-1', + index: '-1', + label: "图标选择器", + tag: "iconPicker", + tagIcon: 'iconPicker', + labelWidth: 110, + defaultValue: '', + iconPickerSearch: true, + iconPickerPage: true, + iconPickerLimit: 12, + iconPickerCellWidth: '43px', + disabled: false, + document: '', + }, + cron: { + id: '-1', + index: '-1', + label: "Cron表达式", + tag: "cron", + tagIcon: 'cron', + placeholder: "请输入cron表达式,如:0 0 12 * * ?", + labelWidth: 110, + width: "100%", + defaultValue: '* * * * * ?', + cronUrl: '', + disabled: false, + required: true, + document: '', + }, + date: { + id: '-1', + index: '-1', + label: "日期", + tag: "date", + tagIcon: 'date', + labelWidth: 110, + width: "100%", + clearable: true, + maxlength: null, + dateDefaultValue: '2021-05-25', + datetype: "date", //year month date time datetime + range: false, + dateformat: "yyyy-MM-dd", + isInitValue: false, + dataMaxValue: "2088-12-31", + dataMinValue: "1900-01-01", + trigger: null, //自定义弹出控件的事件 + position: "absolute", //fixed,static,abolute + theme: "default", + mark: null, //每年的日期 {'0-9-18': '国耻'} 0 即代表每一年 + showBottom: true, + zindex: 66666666, + disabled: false, + required: true, + document: '', + }, + dateRange: { + id: '-1', + index: '-1', + label: "日期范围", + tag: "dateRange", + tagIcon: 'dateRange', + labelWidth: 110, + //width:"100%", + dateRangeDefaultValue: "2021-06-19 - 2021-07-17", + clearable: true, + maxlength: null, + datetype: "date", //year month date time datetime + dateformat: "yyyy-MM-dd", + isInitValue: true, + dataMaxValue: "2088-12-31", + dataMinValue: "1900-01-01", + trigger: null, //自定义弹出控件的事件 + position: "absolute", //fixed,static,abolute + theme: "default", + mark: null, //每年的日期 {'0-9-18': '国耻'} 0 即代表每一年 + showBottom: true, + zindex: 66666666, + disabled: false, + required: true, + document: '', + }, + rate: { + id: '-1', + index: '-1', + label: "评分", + tag: "rate", + tagIcon: 'rate', + labelWidth: 110, + defaultValue: 0, + rateLength: 5, //星星长度 + half: false, + text: false, + theme: "default", + showBottom: true, + readonly: false, + document: '', + }, + carousel: { + id: '-1', + index: '-1', + label: "轮播图", + tag: "carousel", + tagIcon: 'carousel', + width: "100%", + height: "500px", + full: false, //是否全屏 + anim: "default", //轮播切换动画方式, + interval: 3000, //切换时间 毫秒 + startIndex: 0, //初始索引 + arrow: "hover", //切换箭头默认显示状态 + autoplay: true, //是否自动切换 + document: '', + datasourceType: 'local', + remoteUrl: 'http://', + remoteMethod: 'post', + remoteOptionText: 'options.data.dictName', //映射到text + remoteOptionValue: 'options.data.dictId', //映射到value text和value可以是一样的 + options: [{ + text: 'banner1', + value: './ayq/images/banner1.PNG', + checked: true, + }, { + text: 'banner2', + value: './ayq/images/banner2.PNG', + checked: false, + }, { + text: 'banner3', + value: './ayq/images/banner3.PNG', + checked: false, + },] + }, + colorpicker: { + id: '-1', + index: '-1', + label: "颜色选择器", + tag: "colorpicker", + tagIcon: 'colorpicker', + labelWidth: 110, + defaultValue: 'rgba(0, 0, 0, 1)', + colorformat: "#fff", + alpha: false, + colors: [], + size: "", + showBottom: true, + disabled: false, + document: '', + }, + image: { + id: '-1', + index: '-1', + label: "上传图片", + tag: "image", + tagIcon: 'image', + placeholder: "请输入", + defaultValue: null, + labelWidth: null, + disabled: false, + required: true, + document: '', + uploadUrl: '', + }, + file: { + id: '-1', + index: '-1', + label: "上传文件", + tag: "file", + tagIcon: 'file', + placeholder: "请输入", + defaultValue: null, + labelWidth: null, + disabled: false, + required: true, + document: '', + uploadUrl: '', + }, + textarea: { + id: '-1', + index: '-1', + label: "多行文本", + tag: "textarea", + tagIcon: 'textarea', + placeholder: "请输入", + defaultValue: null, + width: "100%", + readonly: false, + disabled: false, //这里就是readonly的医生 + required: true, + document: '' + }, + editor: { + id: '-1', + index: '-1', + label: "编辑器", + tag: "editor", + tagIcon: 'editor', + width: "100%", + clearable: true, + maxlength: null, + showWordLimit: false, + menu: ['backColor', 'fontSize', 'foreColor', 'bold', 'italic', 'underline', 'strikeThrough', 'justifyLeft', 'justifyCenter', 'justifyRight', 'indent', 'outdent', 'insertOrderedList', 'insertUnorderedList', 'superscript', 'subscript', 'createLink', 'unlink', 'hr', 'face', 'table', 'files', 'music', 'video', 'insertImage', 'removeFormat', 'code', 'line'], + height: "200px", + uploadUrl: '/upload/', + disabled: false, + document: '' + }, + grid: { + id: '-1', + index: '-1', + tag: 'grid', + span: 2, + columns: [{ + span: 12, + list: [], + }, { + span: 12, + list: [], + }] + }, + c1: { + name: "输入型组件(基于layui)", + list: ['input', 'numberInput', 'password', 'textarea'] + }, + c2: { + name: "选择型组件(基于layui)", + list: ['select', 'radio', 'checkbox', 'switch', 'slider', 'date', 'rate', 'carousel', 'colorpicker', 'image', 'file', 'dateRange'] + }, + c3: { + name: "布局型组件(基于layui)", + list: ['grid', 'bottom'] + }, + c4: { + name: "扩展组件(基于layui)", + list: ['iconPicker', 'cron', 'labelGeneration', 'sign'] + }, + c5: { + name: "扩展组件(外部)", + list: ['editor'] + } + }; + exports('formField', field); +}); \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/formPreview.css b/module-form/src/main/resources/static/form-design/modules/formPreview.css new file mode 100644 index 00000000..704d46da --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/formPreview.css @@ -0,0 +1,78 @@ +#formPreviewForm .widget-slider { + margin: 18px 10px; + width : 90%; + position: absolute!important; +} +.custom-lg{ + margin: -3px 0px 0px 10px; +} +.custom-zc{ + margin: 0px 0px 0px 10px; +} +.custom-sm{ + margin: 5px 0px 0px 10px; +} +.custom-xs{ + margin: 10px 0px 0px 10px; +} +.my-disabled{ + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: rgba(191,191,191,.79); +} +.iceEditor-disabled { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: rgba(245,247,250,0.79) !important; + border-color: #dfe4ed !important; + color: #c0c4cc !important; + z-index: 1 !important; + display: block; +} +/* 图片上传 */ +.uploader-list { + margin-left: -15px; +} +.uploader-list .info { + position: relative; + margin-top: -25px; + background-color: black; + color: white; + filter: alpha(Opacity=80); + -moz-opacity: 0.5; + opacity: 0.5; + width: 100px; + height: 25px; + text-align: center; + display: none; +} +.uploader-list .handle { + position: relative; + background-color: black; + color: white; + filter: alpha(Opacity=80); + -moz-opacity: 0.5; + opacity: 0.5; + width: 100px; + text-align: right; + height: 18px; + margin-bottom: -18px; + display: none; +} +.uploader-list .handle i { + margin-right: 5px; +} +.uploader-list .handle i:hover { + cursor: pointer; +} +.uploader-list .file-iteme { + margin: 12px 0 0 15px; + padding: 1px; + float: left; +} \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/formPreview.js b/module-form/src/main/resources/static/form-design/modules/formPreview.js new file mode 100644 index 00000000..9f541a77 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/formPreview.js @@ -0,0 +1,1645 @@ +/** + +------------------------------------------------------------------------------------+ + + ayq-layui-form-designer(layui表单设计器) + +------------------------------------------------------------------------------------+ + + ayq-layui-form-designer v1.1.6 + * MIT License By http://116.62.237.101:8009/ + + 作者:谁家没一个小强 + + 官方: + + 时间:2021-06-23 + +------------------------------------------------------------------------------------+ + + 版权声明:该版权完全归谁家没一个小强所有,可转载使用和学习,但请务必保留版权信息 + +------------------------------------------------------------------------------------+ + + 本项目是一个基于layui表单组件的表单设计器 + + 1.本项目基于Layui、Jquery、Sortable + + 2.项目已经基本实现了拖动布局,父子布局 + + 3.项目实现了大部分基于Layui的Form表单控件布局,包括输入框、编辑器、下拉、单选、单选组、多选组、日期、滑块、评分、轮播、图片、颜色选择、图片上传、文件上传 + + 4.表单数据的获取与回显,禁用全表单 + +------------------------------------------------------------------------------------+ + */ +layui.config({base: './form-design/modules/'}).define(['layer', 'laytpl', 'element', 'form', 'slider', 'laydate', 'rate', 'colorpicker', 'layedit', 'carousel', 'upload', 'formField', "numberInput", "iconPicker", "cron", "labelGeneration"] + , function (exports) { + var $ = layui.jquery, + layer = layui.layer, + laytpl = layui.laytpl, + setter = layui.cache, + element = layui.element, + slider = layui.slider, + laydate = layui.laydate, + rate = layui.rate, + colorpicker = layui.colorpicker, + carousel = layui.carousel, + form = layui.form, + upload = layui.upload, + layedit = layui.layedit, + formField = layui.formField, + hint = layui.hint, + numberInput = layui.numberInput, + iconPicker = layui.iconPicker, + cron = layui.cron, + labelGeneration = layui.labelGeneration, + iceEditorObjects = {}, + labelGenerationObjects = {}, + signObjects = {}, + files = [], + images = [], + // 主键 + guid = function () { + var d = new Date().getTime(); + if (window.performance && typeof window.performance.now === "function") { + d += performance.now(); //use high-precision timer if available + } + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + return uuid; + }, + lang = { + id: "标识", + label: "标题", + index: "序号", + tag: "表单类型", + tagIcon: '图标', + width: '宽度', + height: "高度", + span: '网格宽度', + placeholder: "placeholder", + defaultValue: "默认值", + labelWidth: "文本宽度", + clearable: "是否清楚", + prepend: "前缀", + append: "", + prefixIcon: '前缀图标', + suffixIcon: '后缀图标', + maxlength: "最大长度", + showWordLimit: "是否限制字符", + readonly: "只读", + disabled: "禁用", + required: "必填", + columns: "列数", + options: "选项", + switchValue: "默认值", + maxValue: "最大值", + minValue: "最小值", + stepValue: "步长", + datetype: "日期类型", + dateformat: "日期格式", + half: "显示半星", + theme: "皮肤", + rateLength: "星星个数", + interval: "间隔毫秒", + autoplay: "自动播放", + startIndex: "开始位置", + full: "是否全屏", + arrow: "鼠标样式", + contents: "内容", + document: '帮助文档', + input: "输入框", + select: "下拉", + checkbox: "多选组", + radio: "单选组", + date: "日期", + editor: "编辑器", + slider: "滑块", + image: "图片", + grid: "一行多列", + colorpicker: "颜色选择器", + textarea: "多行文本", + rate: "评分控件", + switch: "开关", + password: "密码框", + carousel: "轮播", + uploadUrl: "上传路径", + expression: "验证", + file: "文件", + numberInput: "排序文本框", + iconPicker: "图标选择器", + cron: "Cron表达式", + cronUrl: "运行路径", + bottom: "按钮组件", + }, + MOD_NAME = 'formPreview', + ELEM = '.layui-form-designer', + TPL_SUBMIT = ['
    ', + '
    ', + '', + '', + '
    ', + '
    '].join(''), + //外部接口 + formPreview = { + index: layui.formPreview ? (layui.formPreview.index + 10000) : 0, + //设置全局项 + set: function (options) { + var that = this; + that.config = $.extend({} + , that.config + , options); + return that; + }, + //事件监听 + on: function (events, callback) { + return layui.onevent.call(this + , MOD_NAME + , events + , callback); + } + }, + /** + * 操作当前实例 + * id 表示当前实例的索引 默认就是内部的 index,如果id存在值 那么就从已经存在的获取 + */ + thisIns = function () { + var that = this, options = that.config; + return { + reload: function (options) { + that.reload.call(that + , options); + }, + getOptions: function () { + return options || null; + }, + getData: function () { + return options.data || null; + }, + geticeEditorObjects: function () { + return iceEditorObjects || null; + }, + getImages: function () { + return images || null; + }, + getFiles: function () { + return files || null; + }, + getFormData: function () { + return that.getFormData() || null; + }, + setFormData: function (json) { + return that.setFormData(json) || null; + }, + globalDisable: function () { + return that.globalDisable() || null; + }, + globalNoDisable: function () { + return that.globalNoDisable() || null; + }, + + } + }, + getThisInsConfig = function (id) { + var config = thisIns.config[id]; + if (!config) { + hint.error('The ID option was not found in the table instance'); + } + return config || null; + }, + Class = function (options) { + var that = this; + that.index = ++formPreview.index; //增加实例,index 也是要增加 + that.config = $.extend({}, that.config, formPreview.config, options); + that.render(); + }; + + + /* 此方法最后一道 commom.js 中 */ + String.prototype.format = function (args) { + var result = this; + if (arguments.length > 0) { + if (arguments.length == 1 && typeof (args) == "object") { + for (var key in args) { + if (args[key] != undefined) { + var reg = new RegExp("({" + key + "})" + , "g"); + result = result.replace(reg + , args[key]); + } + } + } else { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] != undefined) { + var reg = new RegExp("({[" + i + "]})" + , "g"); + result = result.replace(reg + , arguments[i]); + } + } + } + } + return result; + } + + Class.prototype.config = { + version: "1.0.0" + , formName: "表单示例" + , Author: "谁家没一个小强" + , formId: "id" + , generateId: 0 + , data: [] + , formData: {} + , selectItem: undefined + }; + + /* 自动生成ID 当前页面自动排序*/ + Class.prototype.autoId = function (tag) { + var that = this, + options = that.config; + options.generateId = options.generateId + 1; + return tag + '_' + options.generateId; + }; + + /* 组件定义 */ + Class.prototype.components = { + input: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'required' : ''; + if (json.expression !== null && json.expression !== undefined) { + if (json.expression !== '') { + _required = _required + '|' + json.expression; + } + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.labelWidth); + _html += '' + .format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _readonly, _disabled, _required, _disabledClass); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.input)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + } + }, + numberInput: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += '' + .format(json.id, json.defaultValue ? json.defaultValue : '0', json.width, json.placeholder, _disabled, _disabledClass, json.minValue, json.maxValue, json.stepValue, json.tag + json.id); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.numberInput)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + } + }, + labelGeneration: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + if (json.disabled) { + _html += '
    '; + } + _html += '
    '.format(json.tag + json.id, json.width); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + update: function (json, value) { + $('#' + json.id + ' .layui-input-block').empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += '
    '.format(json.tag + json.id); + $('#' + json.id + ' .layui-input-block').append(_html); + var labelGenerationObject = labelGeneration.render({ + elem: '#' + json.tag + json.id, + data: value, + isEnter: json.isEnter + }); + labelGenerationObjects[json.id] = labelGenerationObject; + if (json.disabled) { + $("#" + json.id).find(".layui-input-block").append('
    '); + } else { + $("#" + json.id).find(".iceEditor-disabled").remove(); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.labelGeneration)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + }, + iconPicker: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += '' + .format(json.id, json.defaultValue ? json.defaultValue : '', json.placeholder, _disabled, _disabledClass, json.tag + json.id, _required); + _html += '
    '; + _html += '
    '; + return _html; + }, update: function (json, value) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + $('#' + json.id + ' .layui-input-block').empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += '' + .format(json.id, value ? value : '', json.width, json.placeholder, _disabled, _disabledClass, json.tag + json.id); + $('#' + json.id + ' .layui-input-block').append(_html); + iconPicker.render({ + // 选择器,推荐使用input + elem: '#' + json.tag + json.id, + // 数据类型:fontClass/unicode,推荐使用fontClass + type: 'fontClass', + // 是否开启搜索:true/false,默认true + search: json.iconPickerSearch, + // 是否开启分页:true/false,默认true + page: json.iconPickerPage, + // 每页显示数量,默认12 + limit: json.iconPickerLimit, + // 每个图标格子的宽度:'43px'或'20%' + cellWidth: json.iconPickerCellWidth, + // 点击回调 + click: function (data) { + //console.log(data); + }, + // 渲染成功后的回调 + success: function (d) { + //console.log(d); + } + }); + iconPicker.checkIcon(json.tag + json.id, value); + if (json.disabled) { + $("#" + json.id).find(".layui-input-block").append('
    '); + } else { + $("#" + json.id).find(".iceEditor-disabled").remove(); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.iconPicker)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + }, + cron: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _required = json.required ? 'required' : ''; + var _width = json.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += '' + .format(json.id, json.defaultValue ? json.defaultValue : '', json.placeholder, _disabled, _disabledClass, json.tag + json.id, _required); + if (!json.disabled) { + _html += ''.format(json.tag + json.id); + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json, value) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + $('#' + json.id + ' .layui-input-block').empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + _html += '' + .format(json.id, value ? value : '', json.width, json.placeholder, _disabled, _disabledClass, json.tag + json.id); + if (!json.disabled) { + var _width = json.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + _html += ''.format(json.tag + json.id, _width); + $('#' + json.id + ' .layui-input-block').append(_html); + cron.render({ + elem: "#" + json.tag + json.id + "-button", // 绑定元素 + url: json.cronUrl, // 获取最近运行时间的接口 + value: value, // 默认值 + done: function (cronStr) { + $("#" + json.tag + json.id).val(cronStr); + }, + }); + } else { + $('#' + json.id + ' .layui-input-block').append(_html); + } + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.cron)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + }, + password: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'lay-verify="required"' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.labelWidth); + _html += '' + .format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _readonly, _disabled, _required, _disabledClass); + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.password)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + select: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += '' + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.select)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + } + }, + radio: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + for (var i = 0; i < json.options.length; i++) { + if (json.options[i].checked) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled); + } else { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled); + } + } + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.radio)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + checkbox: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="otherReq"' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + for (var i = 0; i < json.options.length; i++) { + if (json.options[i].checked) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } else { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json) { + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="otherReq"' : ''; + $('#' + json.id + ' .layui-input-block').empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + for (var i = 0; i < json.options.length; i++) { + _html += ''.format(json.id, json.options[i].value, json.options[i].text, _disabled, _required); + } + $('#' + json.id + ' .layui-input-block').append(_html); + form.render('checkbox'); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.checkbox)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + switch: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += ''.format(json.id, _disabled, _disabledClass, json.switchValue ? 'checked' : ''); + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.switch)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + slider: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += '
    '.format(json.tag + json.id); + _html += ''.format(json.id, json.defaultValue); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json, value) { + slider.render({ + elem: '#' + json.tag + json.id, + value: value, //初始值 + min: json.minValue, + max: json.maxValue, + step: json.stepValue, + disabled: json.disabled, + input: json.isInput, + change: function (_value) { + $("#" + json.id).find("input[name=" + json.id + "]").val(_value); + } + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.slider)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + date: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _disabledStyle = json.disabled ? ' pointer-events: none;' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.width, json.labelWidth); + _html += ''.format(json.tag + json.id, _disabledClass, _disabledStyle, _required); + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.date)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, bottom: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _coustomCss = ""; + if (json.buttonSize === "layui-btn-lg") { + _coustomCss = "custom-lg"; + } + if (json.buttonSize === "") { + _coustomCss = "custom-zc"; + } + if (json.buttonSize === "layui-btn-sm") { + _coustomCss = "custom-sm"; + } + if (json.buttonSize === "layui-btn-xs") { + _coustomCss = "custom-xs"; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + if (json.isLabel) { + _html += ''.format(json.label, json.labelWidth); + } + _html += '
    '; + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonSize, _coustomCss, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonSize, json.buttonType, _coustomCss, json.buttonIcon, json.buttonVlaue); + } + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.bottom)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + } + }, sign: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } + if (json.data !== "") { + _html += '
    '.format(json.data); + } + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json, value) { + $('#' + json.id + ' .layui-input-block').empty(); + var _html = ''; + //重绘设计区改id下的所有元素 + if (json.disabled) { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } else { + _html += ''.format(json.id + json.tag, json.buttonIcon, json.buttonVlaue); + } + if (value !== "") { + _html += '
    '.format(value); + signObjects[json.id] = value; + } + $('#' + json.id + ' .layui-input-block').append(_html); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.sign)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + }, + }, dateRange: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _disabledStyle = json.disabled ? ' pointer-events: none;' : ''; + var _required = json.required ? 'required' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += '
    '; + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.tag + json.id, _disabledStyle); + _html += '
    '; + _html += ''.format(json.tag + json.id, _disabledClass, json.id, _required); + _html += '
    '; + _html += '
    -
    '; + _html += '
    '; + _html += ''.format(json.tag + json.id, _disabledClass, json.id, _required); + _html += '
    '; + _html += '
    '; + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.dateRange)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + }, + }, + rate: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _readonly = json.readonly ? 'readonly=""' : ''; + var _required = json.required ? 'required=""' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.labelWidth); + _html += '
    '.format(json.labelWidth); + _html += '
    '.format(json.tag + json.id); + _html += ''.format(json.id, json.defaultValue); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json, value) { + rate.render({ + elem: '#' + json.tag + json.id, + value: value, + text: json.text, + half: json.half, + length: json.rateLength, + readonly: json.readonly, + choose: function (_value) { + $("#" + json.id).find("input[name=" + json.id + "]").val(_value); + } + }); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.rate)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + carousel: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + // _html +=''.format(json.required?'layui-form-required':'',json.label); + // _html +='
    '; + _html += '';//end for class=layui-coarousel + // _html +='
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.carousel)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + colorpicker: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.labelWidth); + _html += '
    '.format(json.labelWidth); + if (json.disabled) { + _html += '
    '; + } + _html += '
    '.format(json.tag + json.id); + _html += ''.format(json.id, json.defaultValue); + _html += '
    '; + _html += '
    '; + return _html; + }, + update: function (json, value) { + if (json.disabled) { + $("#" + json.id).find(".layui-input-block").append('
    '); + } else { + $("#" + json.id).find(".iceEditor-disabled").remove(); + } + colorpicker.render({ + elem: '#' + json.tag + json.id + , color: value + , format: 'rgb' + , predefine: true + , alpha: true + , done: function (color) { + $("#" + json.id).find("input[name=" + json.id + "]").val(color); + } + }); + $("#" + json.id).find("input[name=" + json.id + "]").val(value); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.colorpicker)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + image: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label); + _html += '
    '; + + _html += '
    '; + _html += ''.format(json.tag + json.id); + _html += '
    预览图:'; + _html += '
    '.format(json.id); + _html += '
    '; + _html += '
    '; + _html += '
    '; + + + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.image)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + } + }, + textarea: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _disabled = json.disabled ? 'disabled=""' : ''; + var _required = json.required ? 'lay-verify="required"' : ''; + var _readonly = json.readonly ? 'readonly=""' : ''; + var _disabledClass = json.disabled ? ' layui-disabled' : ''; + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label, json.required ? '*' : '', json.width); + _html += '
    '.format(json.width); + _html += '' + .format(json.id, json.defaultValue ? json.defaultValue : '', json.width, json.placeholder, _disabled, _required, _disabledClass, _readonly); + _html += '
    '; + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.textarea)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + + } + }, + editor: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index, json.width); + _html += ''.format(json.label, json.width); + _html += '
    '; + _html += '
    '.format(json.tag + json.id); + _html += '
    '; + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + update: function (json, value) { + var e = iceEditorObjects[json.id]; + e.setValue(value); + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.editor)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + return _json; + + } + }, + grid: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + var colClass = 'layui-col-md6'; + if (json.columns.length == 3) { + colClass = 'layui-col-md4'; + } else if (json.columns.length == 4) { + colClass = 'layui-col-md3'; + } else if (json.columns.length == 6) { + colClass = 'layui-col-md2'; + } + for (var i = 0; i < json.columns.length; i++) { + _html += '
    '.format(i, json.index, colClass, json.id); + //some html + _html += '
    '; + } + + // if(selected){ + // _html +='
    '; + // } + _html += '
    '; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID 默认是一个一行两列的布局对象 + var _json = JSON.parse(JSON.stringify(formField.grid)); + _json.id = id == undefined ? autoId(_json.tag) : id; + _json.index = index; + if (columncount > 2) { + var _col = { + span: 12, + list: [], + }; + for (var i = _json.columns.length; i < columncount; i++) { + _json.columns.splice(i, 0, _col); + } + } + return _json; + + } + }, + file: { + /** + * 根据json对象生成html对象 + * @param {object} json + * @param {boolean} selected true 表示选择当前 + * */ + render: function (json, selected) { + if (selected === undefined) { + selected = false; + } + var _html = '
    '.format(json.id, json.tag, selected ? 'active' : '', json.index); + _html += ''.format(json.required ? 'layui-form-required' : '', json.label); + _html += '
    '; + + _html += '
    '; + _html += ' '.format(json.tag + json.id); + _html += '
    '; + _html += ''; + _html += ''; + _html += '
    文件名大小上传进度操作
    '.format(json.tag + json.id); + _html += ''.format(json.tag + json.id); + _html += '
    '; + _html += ''; + _html += '
    '; + _html += '
    '; + _html += ''; + return _html; + }, + /* 获取对象 */ + jsonData: function (id, index, columncount) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.file)); + _json.id = id == undefined ? guid() : id; + _json.index = index; + return _json; + + }, + /* 根据 json 对象显示对应的属性 */ + property: function (json) { + $('#columnProperty').empty(); + var _html = ''; + _html = renderCommonProperty(json);//获取通用属性HTML字符串 + //处理特殊字符串 + for (var key in json) { + if (key === 'index') { + continue; + } + + } + $('#columnProperty').append(_html); + } + }, + + }; + + + //渲染视图 + Class.prototype.render = function () { + var that = this + , options = that.config; + options.elem = $(options.elem); + options.id = options.id || options.elem.attr('id') || that.index; + options.elem.html('
    '); + that.renderForm(); + + }; + + //获取表单数据回调 + Class.prototype.getFormData = function () { + //获取表单区域所有值 + var json = form.val("formPreviewForm"); + for (let key in iceEditorObjects) { + json[key] = iceEditorObjects[key].getHTML(); + } + for (let key in labelGenerationObjects) { + json[key] = labelGenerationObjects[key].getData(); + } + for (let key in signObjects) { + json[key] = signObjects[key]; + } + return json; + } + + /** + * 找到当前节点 + */ + Class.prototype.findJsonItem = function (json, id) { + var that = this, + options = that.config; + for (var i = 0; i < json.length; i++) { + if (json[i].id === id) { + return json[i]; + } else { + if (json[i].tag === 'grid') { + for (var j = 0; j < json[i].columns.length; j++) { + if (json[i].columns[j].list.length > 0) { + var _item = that.findJsonItem(json[i].columns[j].list, id); + if (_item) { + return _item; + } + } + } + } + } + } + } + + //全局禁用 + Class.prototype.globalDisable = function () { + var that = this + , options = that.config; + that.findItemToDisable(options.data); + that.renderForm(); + } + + //全局取消禁用 + Class.prototype.globalNoDisable = function () { + var that = this + , options = that.config; + that.findItemToNoDisable(options.data); + that.renderForm(); + } + + //递归改变禁用属性 + Class.prototype.findItemToDisable = function (jsondata) { + var that = this + , options = that.config; + $.each(jsondata, function (index, item) { + if (item.tag === 'grid') { + $.each(item.columns, function (index2, item2) { + //获取当前的 DOM 对象 + if (item2.list.length > 0) { + that.findItemToDisable(item2.list); + } + }); + } else { + item.disabled = true; + item.readonly = true; + } + }); + } + + //递归改变禁用属性 + Class.prototype.findItemToNoDisable = function (jsondata) { + var that = this + , options = that.config; + $.each(jsondata, function (index, item) { + if (item.tag === 'grid') { + $.each(item.columns, function (index2, item2) { + //获取当前的 DOM 对象 + if (item2.list.length > 0) { + that.findItemToNoDisable(item2.list); + } + }); + } else { + item.disabled = false; + item.readonly = false; + } + }); + } + + + //获取表单数据回调 + Class.prototype.setFormData = function (json) { + var that = this, + options = that.config; + //获取表单区域所有值 + for (let key in json) { + if (key.indexOf("[") != -1 && key.indexOf("]") != -1) { + var check = key.substring(0, key.indexOf("[")); + var item = that.findJsonItem(options.data, check); + if (item === undefined) { + continue; + } + that.components[item.tag].update(item); + continue; + } + var item = that.findJsonItem(options.data, key); + if (item === undefined) { + continue; + } + if (item.tag === 'editor' || item.tag === 'rate' + || item.tag === 'slider' || item.tag === 'labelGeneration' + || item.tag === 'sign' || item.tag === 'iconPicker' + || item.tag === 'cron' || item.tag === 'colorpicker') { + that.components[item.tag].update(item, json[key]); + } + } + form.val("formPreviewForm", json); + options.formData = json; + return json; + } + + + /* 递归渲染组件 */ + Class.prototype.renderComponents = function (jsondata, elem) { + var that = this + , options = that.config; + $.each(jsondata, function (index, item) { + item.index = index;//设置index 仅仅为了传递给render对象,如果存在下级子节点那么 子节点的也要变动 + if (options.selectItem === undefined) { + elem.append(that.components[item.tag].render(item, false)); + } else { + if (options.selectItem.id === item.id) { + elem.append(that.components[item.tag].render(item, true)); + //显示当前的属性 + that.components[item.tag].property(item); + } else { + elem.append(that.components[item.tag].render(item, false)); + } + } + if (item.tag === 'grid') { + $.each(item.columns, function (index2, item2) { + //获取当前的 DOM 对象 + if (item2.list.length > 0) { + var elem2 = $('#' + item.id + ' .widget-col-list.column' + item.id + index2); + that.renderComponents(item2.list, elem2); + } + }); + } else if (item.tag === 'slider') { + //定义初始值 + slider.render({ + elem: '#' + item.tag + item.id, + value: item.defaultValue, //初始值 + min: item.minValue, + max: item.maxValue, + step: item.stepValue, + disabled: item.disabled, + input: item.isInput, + change: function (value) { + $("#" + item.id).find("input[name=" + item.id + "]").val(value); + } + }); + } else if (item.tag === 'numberInput') { + //定义初始值 + numberInput.render({ + elem: '#' + item.tag + item.id + }); + var _width = item.width.replace(/[^\d]/g, ''); + if ('' != _width) { + _width = 100 - parseInt(_width); + } + $('#' + item.id + ' .layui-input-block .layui-number-input-btn').css("right", _width + "%"); + if (item.disabled) { + $('#' + item.id + ' .layui-input-block .layui-number-input-btn').css("z-index", "-1"); + } + } else if (item.tag === 'checkbox') { + var bool = false; + //定义初始值 + form.verify({ + otherReq: function (value, item) { + var verifyName = $(item).attr('name'), verifyType = $(item).attr('type') + , formElem = $(item).parents(".layui-form"), + verifyElem = formElem.find("input[name='" + verifyName + "']"), + verifyElems = formElem.find("input") + , isTrue = verifyElem.is(":checked"), + focusElem = verifyElem.next().find("i.layui-icon");//焦点元素 + for (let i = 0; i < verifyElems.length; i++) { + if (verifyElems[i].checked) { + return false; + } + } + if (!isTrue || !value) { + focusElem.css(verifyType == "radio" ? {"color": "#FF5722"} : {"border-color": "#FF5722"}); + //对非输入框设置焦点 + focusElem.first().attr("tabIndex", "1").css("outline", "0").blur(function () { + focusElem.css(verifyType == 'radio' ? {"color": ""} : {"border-color": ""}); + }).focus(); + return "必填项不能为空"; + } + } + }); + } else if (item.tag === 'date') { + laydate.render({ + elem: '#' + item.tag + item.id, + type: item.datetype, + format: item.dateformat, + value: item.dateDefaultValue, + min: item.dataMinValue, + max: item.dataMaxValue, + }); + } else if (item.tag === 'sign') { + $('#' + item.id + item.tag).click(function () { + layer.open({ + type: 2, + title: '手写签名', + btn: ['保存', '关闭'], //可以无限个按钮 + yes: function (index, layero) { + //do something + var iframe = window['layui-layer-iframe' + index]; + var data = iframe.getCanvasData(); + signObjects[item.id] = data; + item.data = data; + $('#' + item.id + ' .layui-input-block div').empty(); + var _html = '
    '.format(item.data); + $('#' + item.id + ' .layui-input-block').append(_html); + layer.close(index); //如果设定了yes回调,需进行手工关闭 + }, + btn2: function (index, layero) { + layer.close(index); + }, + closeBtn: 1, //不显示关闭按钮 + shade: [0], + area: ['60%', '60%'], + offset: 'auto', //右下角弹出 + anim: 2, + content: ['./handwrittenSignature.html', 'yes'], //iframe的url,no代表不显示滚动条 + success: function (layero, index) { + } + }); + }); + } else if (item.tag === 'labelGeneration') { + var labelGenerationObject = labelGeneration.render({ + elem: '#' + item.tag + item.id, + data: item.dateDefaultValue, + isEnter: item.isEnter + }); + labelGenerationObjects[item.id] = labelGenerationObject; + } else if (item.tag === 'cron' && !item.disabled) { + cron.render({ + elem: "#" + item.tag + item.id + "-button", // 绑定元素 + url: item.cronUrl, // 获取最近运行时间的接口 + // value: $("#cron").val(), // 默认值 + done: function (cronStr) { + $("#" + item.tag + item.id).val(cronStr); + }, + }); + } else if (item.tag === 'iconPicker') { + iconPicker.render({ + // 选择器,推荐使用input + elem: '#' + item.tag + item.id, + // 数据类型:fontClass/unicode,推荐使用fontClass + type: 'fontClass', + // 是否开启搜索:true/false,默认true + search: item.iconPickerSearch, + // 是否开启分页:true/false,默认true + page: item.iconPickerPage, + // 每页显示数量,默认12 + limit: item.iconPickerLimit, + // 每个图标格子的宽度:'43px'或'20%' + cellWidth: item.iconPickerCellWidth, + // 点击回调 + click: function (data) { + //console.log(data); + }, + // 渲染成功后的回调 + success: function (d) { + //console.log(d); + } + }); + iconPicker.checkIcon(item.tag + item.id, item.defaultValue); + } else if (item.tag === 'dateRange') { + laydate.render({ + elem: '#' + item.tag + item.id, + type: item.datetype, + format: item.dateformat, + //value: item.dateDefaultValue, + min: item.dataMinValue, + max: item.dataMaxValue, + range: ['#start-' + item.tag + item.id, '#end-' + item.tag + item.id] + }); + if (item.dateRangeDefaultValue !== null && item.dateRangeDefaultValue !== "" + && item.dateRangeDefaultValue !== undefined) { + var split = item.dateRangeDefaultValue.split(" - "); + $('#start-' + item.tag + item.id).val(split[0]); + $('#end-' + item.tag + item.id).val(split[1]); + } + } else if (item.tag === 'rate') { + rate.render({ + elem: '#' + item.tag + item.id, + value: item.defaultValue, + text: item.text, + half: item.half, + length: item.rateLength, + readonly: item.readonly, + choose: function (value) { + $("#" + item.id).find("input[name=" + item.id + "]").val(value); + } + }); + } else if (item.tag === 'colorpicker') { + colorpicker.render({ + elem: '#' + item.tag + item.id + , color: item.defaultValue + , format: 'rgb' + , predefine: true + , alpha: true + , done: function (color) { + $("#" + item.id).find("input[name=" + item.id + "]").val(color); + } + }); + } else if (item.tag === 'editor') { + var e = new ice.editor(item.tag + item.id); + e.width = item.width; //宽度 + e.height = item.height; //高度 + e.uploadUrl = item.uploadUrl; //上传文件路径 + e.disabled = item.disabled; + e.menu = item.menu; + e.create(); + iceEditorObjects[item.id] = e; + } else if (item.tag === 'carousel') { + carousel.render({ + elem: '#' + item.tag + item.id, + width: item.width,//设置容器宽度 + height: item.height,//设置容器宽度 + arrow: item.arrow, //始终显示箭头 + interval: item.interval, + anim: item.anim, + autoplay: item.autoplay + }); + } else if (item.tag === 'image') { + var data = {"select": item.tag + item.id, "uploadUrl": item.uploadUrl}; + images.push(data); + } else if (item.tag === 'file') { + var data = {"select": item.tag + item.id, "uploadUrl": item.uploadUrl}; + files.push(data); + } + }); + }; + + /* 重新渲染设计区*/ + Class.prototype.renderForm = function () { + var that = this, options = that.config; + var elem = $('#formPreviewForm'); + //清空 + elem.empty(); + that.renderComponents(options.data, elem); + elem.append(TPL_SUBMIT); + that.setFormData(options.formData); + form.render();//一次性渲染表单 + if (options.data.length != 0) { + for (let i = 0; i < options.data.length; i++) { + if (options.data[i].tag === 'grid') { + for (let j = 0; j < options.data[i].columns.length; j++) { + for (let k = 0; k < options.data[i].columns[j].list.length; k++) { + if (options.data[i].columns[j].list[k].tag === 'select') { + $('#' + options.data[i].columns[j].list[k].id + ' .layui-input-block div.layui-unselect.layui-form-select').css({width: '{0}'.format(options.data[i].columns[j].list[k].width)}); + } + } + } + } else { + if (options.data[i].tag === 'select') { + $('#' + options.data[i].id + ' .layui-input-block div.layui-unselect.layui-form-select').css({width: '{0}'.format(options.data[i].width)}); + } + } + } + } + }; + + + //核心入口 初始化一个 regionSelect 类 + formPreview.render = function (options) { + var ins = new Class(options); + return thisIns.call(ins); + }; + + exports('formPreview', formPreview); + + + }); \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/iceEditor/iceEditor.js b/module-form/src/main/resources/static/form-design/modules/iceEditor/iceEditor.js new file mode 100644 index 00000000..c7795f5d --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/iceEditor/iceEditor.js @@ -0,0 +1,1918 @@ +'use strict'; +/** + +------------------------------------------------------------------------------------+ + + iceEditor(富文本编辑器) + +------------------------------------------------------------------------------------+ + + iceEditor v1.1.9 + * MIT License By www.iceui.cn + + 作者:ice + + 官方:www.iceui.cn + + 时间:2021-06-23 + +------------------------------------------------------------------------------------+ + + 版权声明:该版权完全归iceUI官方所有,可转载使用和学习,但请务必保留版权信息 + +------------------------------------------------------------------------------------+ + + iceEditor是一款简约风格的富文本编辑器,体型十分娇小,无任何依赖,整个编辑器只有一个 + + 文件,功能却很不平凡!简约的唯美设计,简洁、极速、使用它的时候不需要引用jQuery、font + + css……等文件,因为整个编辑器只是一个Js,支持上传图片、附件!支持添加音乐、视频! + +------------------------------------------------------------------------------------+ + */ +var ice = ice || {}; +ice.editor = function (id,callback) { + class iceEditor { + constructor(id) { + //------------------------参数配置 开始------------------------ + // 工具栏菜单 + this.menu = [ + 'backColor', 'fontSize', 'foreColor', 'bold', 'italic', 'underline', 'strikeThrough', 'line', 'justifyLeft', + 'justifyCenter', 'justifyRight', 'indent', 'outdent', 'line', 'insertOrderedList', 'insertUnorderedList', 'line', 'superscript', + 'subscript', 'createLink', 'unlink', 'line', 'hr', 'face', 'table', 'files', 'music', 'video', 'insertImage', + 'removeFormat', 'paste', 'line', 'code' + ]; + // 不需要的工具栏菜单 + this.notMenu = []; + // 文字背景颜色 + this.backColor = [ + '#ffffff', '#000000', '#eeece1', '#1f497d', '#4f81bd', '#c0504d', '#9bbb59', '#8064a2', '#4bacc6', '#f79646', + '#f2f2f2', '#979797', '#ddd9c3', '#c6d9f0', '#dbe5f1', '#f2dcdb', '#ebf1dd', '#e5e0ec', '#dbeef3', '#fdeada', + '#d8d8d8', '#595959', '#c4bd97', '#8db3e2', '#b8cce4', '#e5b9b7', '#d7e3bc', '#ccc1d9', '#b7dde8', '#fbd5b5', + '#bfbfbf', '#3f3f3f', '#938953', '#548dd4', '#95b3d7', '#d99694', '#c3d69b', '#b2a2c7', '#92cddc', '#fac08f', + '#a5a5a5', '#262626', '#494429', '#17365d', '#366092', '#953734', '#76923c', '#5f497a', '#31859b', '#e36c09', + '#7f7f7f', '#0c0c0c', '#1d1b10', '#0f243e', '#244061', '#632423', '#4f6128', '#3f3151', '#205867', '#974806', + '#c00000', '#ff0000', '#ffc000', '#ffff00', '#92d050', '#00b050', '#00b0f0', '#0070c0', '#002060', '#7030a0' + ]; + //文字颜色 + this.foreColor = this.backColor; + //编辑器的尺寸 + this.width = '100%'; + this.height = '400px'; + //查看源码 + this.code = 0; + //窗口最大化和最小化 + this.maxWindow = 1; + //编辑器禁用 + this.disabled = 0; + //编辑器样式 + this.css = ''; + //图片和附件提交地址 + this.uploadUrl = 0; + //纯文本粘贴 + this.pasteText = 1; + //截图粘贴启用 + this.screenshot = 1; + //截图粘贴直接上传到服务器 + this.screenshotUpload = 1; + //网络图片上传到服务器 + this.imgAutoUpload = 1; + //图片下载到本地的域名,默认为本地域名(false),其它域名为数组类型 + this.imgDomain = 0; + //上传监听 + this.ajax.uploadTimeout = 15000; //ajax超时时间 + this.ajax.xhr = function () {}; //ajax的xhr设置 + this.ajax.formData = function (e) {return e}; //ajax的formData设置 + this.ajax.timeout = function () {}; //ajax超时回调 + this.ajax.progress = function () {}; //ajax进度回调 + this.ajax.success = function (e) {return e}; //ajax成功回调 + this.ajax.error = function () {}; //ajax失败回调 + this.ajax.complete = function () {}; //ajax成功或失败都回调 + //上传附件 + this.filesUpload = {}; + this.filesUpload.name = 'file[]'; + this.filesUpload.formData = function (e) {return e}; + this.filesUpload.success = function (e) {return e}; + this.filesUpload.error = function () {}; + this.filesUpload.complete = function () {}; + //上传图片 + this.imgUpload = {}; + this.imgUpload.name = 'file[]'; + this.imgUpload.formData = function (e) {return e}; + this.imgUpload.success = function (e) {return e}; + this.imgUpload.error = function () {}; + this.imgUpload.complete = function () {}; + //表情 + this.face = [{ + title: '表情', + type: 'img', + list: [ + {title:'嘻嘻',content:'./ayq/images/tootha_thumb.gif'}, + {title:'哈哈',content:'./ayq/images/laugh.gif'}, + {title:'可爱',content:'./ayq/images/tza_thumb.gif'}, + {title:'可怜',content:'./ayq/images/kl_thumb.gif'}, + {title:'挖鼻屎',content:'./ayq/images/kbsa_thumb.gif'}, + {title:'吃惊',content:'./ayq/images/cj_thumb.gif'}, + {title:'害羞',content:'./ayq/images/shamea_thumb.gif'}, + {title:'挤眼',content:'./ayq/images/zy_thumb.gif'}, + {title:'闭嘴',content:'./ayq/images/bz_thumb.gif'}, + {title:'鄙视',content:'./ayq/images/bs2_thumb.gif'}, + {title:'爱你',content:'./ayq/images/lovea_thumb.gif'}, + {title:'泪',content:'./ayq/images/sada_thumb.gif'}, + {title:'偷笑',content:'./ayq/images/heia_thumb.gif'}, + {title:'亲亲',content:'./ayq/images/qq_thumb.gif'}, + {title:'生病',content:'./ayq/images/sb_thumb.gif'}, + {title:'太开心',content:'./ayq/images/mb_thumb.gif'}, + {title:'懒得理你',content:'./ayq/images/ldln_thumb.gif'}, + {title:'右哼哼',content:'./ayq/images/yhh_thumb.gif'}, + {title:'左哼哼',content:'./ayq/images/zhh_thumb.gif'}, + {title:'嘘',content:'./ayq/images/x_thumb.gif'}, + {title:'衰',content:'./ayq/images/cry.gif'}, + {title:'委屈',content:'./ayq/images/wq_thumb.gif'}, + {title:'吐',content:'./ayq/images/t_thumb.gif'}, + {title:'打哈欠',content:'./ayq/images/k_thumb.gif'}, + {title:'抱抱',content:'./ayq/images/bba_thumb.gif'}, + {title:'怒',content:'./ayq/images/angrya_thumb.gif'}, + {title:'疑问',content:'./ayq/images/yw_thumb.gif'}, + {title:'馋嘴',content:'./ayq/images/cza_thumb.gif'}, + {title:'拜拜',content:'./ayq/images/88_thumb.gif'}, + {title:'思考',content:'./ayq/images/sk_thumb.gif'}, + {title:'汗',content:'./ayq/images/sweata_thumb.gif'}, + {title:'困',content:'./ayq/images/sleepya_thumb.gif'}, + {title:'睡觉',content:'./ayq/images/sleepa_thumb.gif'}, + {title:'钱',content:'./ayq/images/money_thumb.gif'}, + {title:'失望',content:'./ayq/images/sw_thumb.gif'}, + {title:'酷',content:'./ayq/images/cool_thumb.gif'}, + {title:'花心',content:'./ayq/images/hsa_thumb.gif'}, + {title:'哼',content:'./ayq/images/hatea_thumb.gif'}, + {title:'鼓掌',content:'./ayq/images/gza_thumb.gif'}, + {title:'晕',content:'./ayq/images/dizzya_thumb.gif'}, + {title:'悲伤',content:'./ayq/images/bs_thumb.gif'}, + {title:'抓狂',content:'./ayq/images/crazya_thumb.gif'}, + {title:'黑线',content:'./ayq/images/h_thumb.gif'}, + {title:'阴险',content:'./ayq/images/yx_thumb.gif'}, + {title:'怒骂',content:'./ayq/images/nm_thumb.gif'}, + {title:'心',content:'./ayq/images/hearta_thumb.gif'}, + {title:'伤心',content:'./ayq/images/unheart.gif'}, + {title:'ok',content:'./ayq/images/ok_thumb.gif'}, + {title:'耶',content:'./ayq/images/ye_thumb.gif'}, + {title:'good',content:'./ayq/images/good_thumb.gif'}, + {title:'不要',content:'./ayq/images/no_thumb.gif'}, + {title:'赞',content:'./ayq/images/z2_thumb.gif'}, + {title:'来',content:'./ayq/images/come_thumb.gif'}, + {title:'弱',content:'./ayq/images/sad_thumb.gif'}, + {title:'蜡烛',content:'./ayq/images/lazu_thumb.gif'}, + {title:'蛋糕',content:'./ayq/images/cake.gif'} + ] + },{ + title: '文字', + type: 'text', + list: [{ + title: '开心', + content: '(^_^)' + }, + { + title: '受不了', + content: '(>_<)' + }, + { + title: '鄙视', + content: '(¬、¬)' + }, + { + title: '难过', + content: '(*>﹏<*)' + }, + { + title: '可爱', + content: '(。◕‿◕。)' + }, + { + title: '无奈', + content: '╮(╯_╰)╭' + }, + { + title: '惊喜', + content: '╰(*°▽°*)╯' + }, + { + title: '听音乐', + content: '♪(^∇^*)' + }, + { + title: '害羞', + content: '(✿◡‿◡)' + }, + { + title: '睡啦', + content: '(∪。∪)..zzZ' + }, + { + title: '臭美', + content: '(o≖◡≖)' + }, + { + title: '流汗', + content: '(ーー゛)' + } + ] + }]; + //HTML标签过滤黑名单-忽略粘贴过来的HTML标签 + this.filterTag = ['meta', 'script', 'object', 'form', 'iframe']; + //style过滤黑名单-忽略粘贴过来的style样式 + this.filterStyle = ['background-image']; + //块级元素 + this.blockTag = ['address', 'caption', 'dd', 'div', 'dl', 'dt', 'fieldset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'legend', 'fieldset', 'li', 'noframes', 'noscript', 'ol', 'ul', 'p', 'pre', 'table', 'tbody', 'tfoot', 'th', 'thead', 'tr', 'video']; + //------------------------参数配置 结束------------------------ + //构建功能模块唯一id + this.getTime = '1' + String(new Date().getTime()).substr(4, 8); + this.iframeId = '_iframe' + this.getTime; + this.toolId = '_tool' + this.getTime; + this.linkId = '_link' + this.getTime; + this.linkInputId = '_LinkInput' + this.getTime; + this.musicId = '_music' + this.getTime; + this.musicInputId = '_musicInput' + this.getTime; + this.videoId = '_video' + this.getTime; + this.imageId = '_image' + this.getTime; + this.imgUploadId = '_imgUpload' + this.getTime; + this.filesId = '_files' + this.getTime; + this.filesUploadId = '_filesUpload' + this.getTime; + this.tableId = '_table' + this.getTime; + this.dragId = '_drag' + this.getTime; + + //菜单列表对象 + this.menuList = {}; + + //获取编辑器对象 + var _z = this; + this.editor = this.id(id); + if (!this.editor) return alert('请提供一个有效的id'); + this.textarea = 0; + // 只能是 textarea 和 div ,其他类型的元素不行 + if (this.editor.nodeName !== 'TEXTAREA' && this.editor.nodeName !== 'DIV') { + return console.log('iceEditor:暂不支持该标签「' + this.editor.nodeName + '」,推荐使用div或textarea'); + } + if (this.editor.nodeName == 'TEXTAREA') { + this.editor.style.display = 'none'; + this.divId = '_div' + this.getTime; + var div = this.c('div'); + div.className = 'iceEditor'; + div.id = this.divId; + this.insertAfter(div, this.editor); + + //加载编辑器的内容 + this.textarea = this.editor; + this.editor = this.id(this.divId); + this.value = this.textarea.value; + } else { + this.editor.className = 'iceEditor'; + this.value = this.editor.innerHTML; + this.editor.innerHTML = ''; + } + + //创建编辑器配置样式 + this.cssConfig = this.c('style'); + this.cssConfig.type = 'text/css'; + this.editor.appendChild(this.cssConfig); + + //创建编辑器菜单栏 + this.tool = this.c('div'); + this.tool.id = this.toolId; + this.tool.className = 'iceEditor-tool iceEditor-noselect'; + this.editor.appendChild(this.tool); + + //创建iframe + this.iframe = this.c('iframe'); + this.iframe.id = this.iframeId; + this.iframe.className = 'iceEditor-noselect'; + this.iframe.frameBorder = 0; + this.editor.appendChild(this.iframe); + + //创建可拖拽层 + this.dragBg = this.c('div'); + this.dragBg.className = 'iceEditor-dragBg'; + this.editor.appendChild(this.dragBg); + + //创建编辑器的高度可拖拽容器 + this.drag = this.c('div'); + this.drag.id = this.dragId; + this.drag.className = 'iceEditor-drag iceEditor-noselect'; + this.drag.innerHTML = ''; + this.editor.appendChild(this.drag); + + //编辑器拖拽增高 + this.drag.onmousedown = function (e) { + _z.dragBg.style.display = 'block'; + var y = e.clientY; + var ch = _z.iframe.clientHeight; + window.onmousemove = function (e) { + var h = e.clientY - y; + if (ch >= 100) { + _z.iframe.height = ch + h + 'px'; + _z.height = ch + h + 'px'; + } else { + _z.iframe.height = '100px'; + _z.height = ch + h + 'px'; + } + } + window.onmouseup = function () { + window.onmousemove = null; + window.onmouseup = null; + _z.dragBg.style.display = 'none'; + } + } + + //创建禁用编辑器的遮罩 + this.disableds = this.c('div'); + this.disableds.className = 'iceEditor-disabled'; + this.editor.appendChild(this.disableds); + + //获取iframe对象 + this.w = this.iframe.contentWindow; //获取iframe Window 对象 + this.d = this.iframe.contentDocument; //获取iframe documen 对象 + + //为了兼容万恶的IE 创建iframe中的body + this.d.open(); + var value = this.value.trim(); + if (!value.length || value.substr(0, 3) != '

    ') value = '

    ' + this.value + '

    '; + this.d.write('' + value + ''); + this.d.close(); + + // 设置元素为可编辑 + this.d.body.designMode = 'on'; //打开设计模式 + this.d.body.contentEditable = true; // 设置元素为可编辑 + this.d.body.addEventListener('click', function () { + _z.parentTagName = _z.range.anchorNode.parentNode.tagName; + for (var i = 0; i < _z.menu.length; i++) { + if (_z.menu[i] == 'line') continue; + var a = _z.menuList[_z.menu[i]]; + if (_z.d.queryCommandState(_z.menu[i])) { + a.className = 'iceEditor-actives'; + } else { + if (a.className != 'iceEditor-line' && a.className != 'iceEditor-active-s') a.className = ''; + } + } + }) + + //内容区 + this.content = this.d.body; + + //改变textarea内容 + if (this.textarea) { + setInterval(function () { + _z.setTextarea(); + }, 1000); + } + + this.init(); //初始化参数 + this.create(); //创建编辑器 + this.paste(); //监听粘贴 + this.styleInit(); //渲染样式 + callback && callback.call(this); + } + id(a) { + return document.getElementById(a) + } + c(a) { + return document.createElement(a) + } + //初始化参数 + init() { + this.files = null; + this.insertImage = null; + this.element = this.d.body; + //this.element.focus(); //默认获取焦点 + this.range = this.d.createRange ? this.w.getSelection() : this.d.selection.createRange(); + } + //设置textarea + setTextarea(n, obj) { + if (!this.textarea) return; + var html = this.code ? this.html(this.getHTML()) : this.getHTML(); + html = html.replace(/(.*?)<\/pre>/gi, function (all, a = '', b = '') { + return '' + b.split('
    ').join("\n") + ''; + }); + this.textarea.value = html; + } + //dom后面插入节点 + insertAfter(n, obj) { + var parent = obj.parentNode; + if (parent.lastChild == obj) { + parent.appendChild(n, obj); + } else { + parent.insertBefore(n, obj.nextSibling); + } + } + //插入HTML + setHTML(html, a) { + this.element.focus(); + var range = this.range.getRangeAt(0); + //将选中的文档放在html中的DOM内 + if (!a) html.appendChild(range.extractContents()); + //删除选中的内容 + range.deleteContents(); + //创建文档碎片并放入新节点 + range.insertNode(this.w.document.createDocumentFragment().appendChild(html)); //合并范围至末尾 + //合并范围至末尾 + range.collapse(false); + } + //插入文字内容 + setText(text, a) { + this.element.focus(); + var range = this.range.getRangeAt(0); + range.deleteContents(); + var el = document.createElement('div'); + if (a) { //是否为html + el.innerHTML = text; + } else { + el.appendChild(document.createTextNode(text)); + } + var frag = document.createDocumentFragment(), + node, lastNode; + while ((node = el.firstChild)) { + lastNode = frag.appendChild(node); + } + range.insertNode(frag); + if (lastNode) { + range = range.cloneRange(); + range.setStartAfter(lastNode); + range.collapse(true); + this.range.removeAllRanges(); + this.range.addRange(range); + } + range.collapse(true); + } + //获取选中的HTML + getSelectHTML() { + var p = this.c('p'); + p.appendChild(this.range.getRangeAt(0).cloneContents()); + return p.innerHTML; + } + //获取选中的内容 + getSelectText() { + if (this.range.toString() == 'false' || this.range.toString() == '') { + return ''; + } else { + return this.range.toString(); + } + } + unhtml(str) { + var s = ''; + if (str.length == 0) return ''; + s = str.replace(/&/g, "&"); + s = s.replace(//g, ">"); + s = s.replace(/\'/g, "'"); + s = s.replace(/\"/g, '"'); + return s; + } + html(str) { + var s = ''; + if (str.length == 0) return ''; + s = str.replace(/</g, "<"); + s = s.replace(/>/g, ">"); + s = s.replace(/'/g, "\'"); + s = s.replace(/"/g, "\""); + s = s.replace(/&/g, "&"); + return s; + } + //转义:HTML转成字符串 + toText(html) { + var temp = this.c('div'); + (temp.textContent != null) ? (temp.textContent = html) : (temp.innerText = html); + var output = temp.innerHTML; + temp = null; + return output; + } + //转义:字符串转成HTML + toHTML(text) { + var temp = this.c('div'); + temp.innerHTML = text; + var output = temp.innerText || temp.textContent; + temp = null; + return output; + } + //判断祖先节点是否存在 + inNodeParent(el, parent) { + if (!el) return false; + if (el.parentNode) { + if (typeof parent == 'string') { + parent = parent.toUpperCase(); + if (el.tagName == parent) return true; + return el.parentNode.tagName == parent ? true : this.inNodeParent(el.parentNode, parent); + } else { + return el.parentNode == parent ? true : this.inNodeParent(el.parentNode, parent); + } + } + return false; + } + //数组查询 + inArray(needle, array) { + if (typeof needle == 'string' || typeof needle == 'number') { + for (var i in array) + if (needle === array[i]) return true; + return false; + } + } + // 获取 range 对象 + getRangegetRange() { + return this.range.getRangeAt(0); + } + //弹窗 + popup(options) { + options = options || {}; + var width = options.width || '400'; //默认宽度 + var height = options.height || '200'; //默认高度 + var title = options.title || ''; //默认不显示标题 + var content = options.content || ''; //默认内容 + return '
    ' + title + '
    ' + content + '
    '; + } + //获取对象距离窗口页面的顶部和左部的距离 + getCoords(el) { + var box = el.getBoundingClientRect(), + doc = el.ownerDocument, + body = doc.body, + html = doc.documentElement, + clientTop = html.clientTop || body.clientTop || 0, + clientLeft = html.clientLeft || body.clientLeft || 0, + top = box.top - clientTop, + left = box.left - clientLeft; + return { + 'top': top, + 'left': left + }; + } + //阻止冒泡 + pd(event) { + window.event ? window.event.cancelBubble = true : e.stopPropagation(); + } + //是否为ie + isIE() { + return !!window.ActiveXObject || "ActiveXObject" in window + } + //异步请求 + ajax(json) { + var _z = this; + json = json || {}; + if (!json.url) return; + json.timeout = json.timeout || _z.ajax.uploadTimeout; + json.data = json.data || {}; + var json2url = function (json) { + var arr = []; + for (var name in json) { + arr.push(name + '=' + encodeURIComponent(json[name])); + } + return arr.join('&'); + } + + //创建 + var xhr = new XMLHttpRequest(); + //xhr.withCredentials = false; + //连接 和 发送 - 第二步 + + //监听进度事件 + xhr.addEventListener('progress', progress, false); + + xhr.open('POST', json.url, true); + //设置表单提交时的内容类型 + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + if (json.data instanceof FormData == false) { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + }else{ + json.data = _z.ajax.formData(json.data); + } + _z.ajax.xhr(xhr); + xhr.send(json.data instanceof FormData ? json.data : json2url(json.data)); + + //接收 - 第三步 + json.loading && json.loading(); + json.timer = setTimeout(function () { + xhr.onreadystatechange = null; + _z.ajax.timeout(xhr); + json.error && json.error('网络超时。'); + }, json.timeout); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4 && xhr.status === 200) { + clearTimeout(json.timer); + if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { + var res = ''; + if (xhr.responseText.length > 0) res = JSON.parse(xhr.responseText); + let newRes = _z.ajax.success(res, xhr); + res = newRes?newRes:res; + _z.ajax.complete(res, xhr); + json.success && json.success(res); + } else { + _z.ajax.error(xhr); + _z.ajax.complete(xhr); + json.error && json.error(xhr); + } + } else { + _z.ajax.error(xhr); + _z.ajax.complete(xhr); + } + + }; + //上传进度 + function progress(evt) { + var percent = 0; + //百分比 + percent = evt.lengthComputable ? Math.round(evt.loaded / evt.total * 100) : 0; + _z.ajax.progress(percent, evt, xhr); + } + } + //创建菜单 + createMenu(json) { + var _z = this; + var li = this.c('li'); + if (json.id) li.id = json.id; + if (json.css) li.className = json.css; + if (json.style) this.css += json.style; + //将菜单设置成文字或者图标 + if (json.menu || json.icon) { + var div = this.c('div'); + if (json.title) div.title = json.title; + div.className = 'iceEditor-exec'; + if (json.menu) { + div.innerHTML = json.menu; + } else { + if (json.icon) div.innerHTML = ''; + } + if (json.data) div.setAttribute('data', json.data); + li.appendChild(div); + } + //使用下拉菜单 + if (json.dropdown) { + var div = this.c('div'); + div.className = 'iceEditor-menuDropdown'; + div.innerHTML = json.dropdown; + li.appendChild(div); + li.openMenu = 1; + li.onmouseover = function () { + if (li.openMenu) div.className = 'iceEditor-menuDropdown iceEditor-menuActive'; + } + li.onmouseout = function () { + div.className = 'iceEditor-menuDropdown'; + } + var exec = div.getElementsByClassName('iceEditor-exec'); + for (var i = 0; i < exec.length; i++) { + exec[i].addEventListener('click', function () { + div.className = 'iceEditor-menuDropdown'; + li.openMenu = 0; + setTimeout(function () { + li.openMenu = 1 + }, 500); + }) + } + } + //使用弹窗 + if (json.popup) { + li.innerHTML += this.popup(json.popup); + li.popup = li.getElementsByClassName('iceEditor-popup')[0]; + li.onclick = function () { + li.popup.style.display = 'block'; + li.popup.getElementsByClassName('iceEditor-popupClose')[0].onclick = function () { + li.popup.style.display = 'none'; + _z.pd(); + } + } + li.close = function () { + li.popup.style.display = 'none'; + _z.pd(); + } + } + li.success = json.success ? json.success : false; + //菜单的点击事件 + if (json.click) li.onclick = function () { + json.click(this, _z) + }; + this.menuList[json.name] = li; + } + //插件开发 + plugin(json) { + if (json.name == undefined) return console.log('plugin:menu参数不能为空'); + if (this.inArray(json.name, this.menu)) return console.log('plugin:menu已经存在,请重新命名'); + this.menu.push(json.name); + this.createMenu(json); + } + //工具栏菜单HTML + menuHTML() { + //文字大小 + this.createMenu({ + title: '文字大小', + name: 'fontSize', + icon: 'fontSize', + dropdown: '
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 文字大小
    ' + }); + + //文字背景颜色 + var html = '
      '; + for (var i = 0; i < this.backColor.length; i++) { + html += '
    • '; + } + html += '
    • 文字背景颜色
    '; + this.createMenu({ + title: '文字背景颜色', + name: 'backColor', + icon: 'backColor', + dropdown: html + }); + + //文字颜色 + var html = '
      '; + for (var i = 0; i < this.foreColor.length; i++) { + html += '
    • '; + } + html += '
    • 文字颜色
    '; + this.createMenu({ + title: '文字颜色', + name: 'foreColor', + icon: 'foreColor', + dropdown: html + }); + + //加粗 + this.createMenu({ + title: '加粗', + name: 'bold', + data: 'bold', + icon: 'bold' + }); + //倾斜 + this.createMenu({ + title: '倾斜', + name: 'italic', + data: 'italic', + icon: 'italic' + }); + //下划线 + this.createMenu({ + title: '下划线', + name: 'underline', + data: 'underline', + icon: 'underline' + }); + //删除线 + this.createMenu({ + title: '删除线', + name: 'strikeThrough', + data: 'strikeThrough', + icon: 'strike' + }); + //左对齐 + this.createMenu({ + title: '左对齐', + name: 'justifyLeft', + data: 'justifyLeft', + icon: 'alignleft' + }); + //居中对齐 + this.createMenu({ + title: '居中对齐', + name: 'justifyCenter', + data: 'justifyCenter', + icon: 'aligncenter' + }); + //右对齐 + this.createMenu({ + title: '右对齐', + name: 'justifyRight', + data: 'justifyRight', + icon: 'alignright' + }); + //缩进 + this.createMenu({ + title: '缩进', + name: 'indent', + data: 'indent', + icon: 'indent' + }); + //取消缩进 + this.createMenu({ + title: '取消缩进', + name: 'outdent', + data: 'outdent', + icon: 'outdent' + }); + //有序列表 + this.createMenu({ + title: '有序列表', + name: 'insertOrderedList', + data: 'insertOrderedList', + icon: 'orderedlist' + }); + //无序列表 + this.createMenu({ + title: '无序列表', + name: 'insertUnorderedList', + data: 'insertUnorderedList', + icon: 'unorderedlist' + }); + //下标 + this.createMenu({ + title: '下标', + name: 'subscript', + data: 'subscript', + icon: 'subscript' + }); + //上标 + this.createMenu({ + title: '上标', + name: 'superscript', + data: 'superscript', + icon: 'superscript' + }); + //取消连接 + this.createMenu({ + title: '取消连接', + name: 'unlink', + data: 'unlink', + icon: 'unlink' + }); + //添加水平线 + this.createMenu({ + title: '添加水平线', + name: 'hr', + data: 'insertHorizontalRule', + icon: 'min' + }); + //清除格式 + this.createMenu({ + title: '清除格式', + name: 'removeFormat', + data: 'removeFormat', + icon: 'remove' + }); + //富文本粘贴 + this.createMenu({ + title: '富文本粘贴', + name: 'paste', + icon: 'word', + success: function (e, z) { + if (!z.pasteText) e.className = 'iceEditor-active-s'; + e.onclick = function () { + z.pasteText = z.pasteText ? false : true; + e.className = z.pasteText ? '' : 'iceEditor-active-s'; + } + + } + }); //pasteText + //全选 + this.createMenu({ + title: '全选', + name: 'selectAll', + data: 'selectAll', + icon: 'empty' + }); + //查看源码 + this.createMenu({ + title: '查看源码', + name: 'code', + icon: 'code', + data: 'code' + }); + + //插入表情 + var html = '
    '; + for (var i = 0; i < this.face.length; i++) { + html += '' + this.face[i].title + ''; + } + html += '
    '; + for (var i = 0; i < this.face.length; i++) { + html += '
    '; + for (var s = 0; s < this.face[i].list.length; s++) { + if (this.face[i].type == 'img') { + html += ''; + } else { + html += '' + this.face[i].list[s].content + ''; + } + } + html += '
    '; + } + html += '
    '; + this.createMenu({ + title: '插入表情', + name: 'face', + icon: 'face', + dropdown: html, + success: function (e, z) { + var titleBox = e.getElementsByClassName('iceEditor-faceTitle')[0]; + var title = titleBox.getElementsByTagName('span'); + var main = e.getElementsByClassName('iceEditor-faceMain')[0]; + var list = e.getElementsByClassName('iceEditor-faceList'); + var pace = main.getElementsByTagName('span'); + for (var i = 0; i < pace.length; i++) { + pace[i].onclick = function () { + z.setText(' ' + this.innerHTML + ' ', true); + } + } + for (var i = 0; i < title.length; i++) { + title[i].i = i; + title[i].onclick = function () { + for (var s = 0; s < title.length; s++) { + list[s].className = 'iceEditor-faceList'; + title[s].className = ''; + } + list[this.i].className = 'iceEditor-faceList iceEditor-faceActive'; + title[this.i].className = 'iceEditor-faceActive'; + } + } + title[0].className = 'iceEditor-faceActive'; + list[0].className = 'iceEditor-faceList iceEditor-faceActive'; + }, + style: ` + .iceEditor-face{width:310px;} + .iceEditor-face span{cursor:pointer;} + .iceEditor-faceTitle{border:2px solid #f7f7f7;} + .iceEditor-faceTitle span{display:inline-block;padding:5px 10px;margin-bottom:-2px;} + .iceEditor-faceTitle .iceEditor-faceActive{border-bottom:2px solid #333;} + .iceEditor-faceMain{padding:15px 10px;} + .iceEditor-faceList{display:none;width:100%;} + .iceEditor-faceList.iceEditor-faceActive{display:block;} + .iceEditor-faceList span{margin:3px 7px;display:inline-block;} + .iceEditor-faceList .iceEditor-faceText{min-width:80px;text-align:center;} + ` + }); + + //表格 + this.createMenu({ + title: '表格', + name: 'table', + icon: 'table', + dropdown: '
    • 表格:1×1
    ', + success: function (e, z) { + //表格 + z.table = z.id(z.tableId); + var tableBox = z.table.getElementsByClassName('iceEditor-tableBox')[0]; + var tableBgOn = z.table.getElementsByClassName('iceEditor-tableBgOn')[0]; + var tableNum = z.table.getElementsByClassName('iceEditor-tableNum')[0]; + tableBox.onmouseover = function (ev) { + var o = z.getCoords(this), + r = 1, + c = 1; + this.onmousemove = function (ev) { + var Event = ev || event; + var x = Event.clientX - o.left - 5; + var y = Event.clientY - o.top - 5; + if (x <= 180 && y <= 180) { + r = Math.ceil(x / 18); + c = Math.ceil(y / 18); + tableBgOn.style.width = r * 18 + 'px'; + tableBgOn.style.height = c * 18 + 'px'; + tableNum.innerHTML = '表格:' + r + "×" + c + } + } + this.onmousedown = function () { + var tableNode = z.c('table'); + tableNode.width = '100%'; + tableNode.border = 1; + tableNode.style.border = '1px solid #bdbdbd'; + tableNode.style.borderSpacing = 0; + tableNode.style.borderCollapse = 'collapse'; + tableNode.className = 'table table-border'; + for (var x = 0; x < c; x++) { + var trNode = tableNode.insertRow(); + for (var y = 0; y < r; y++) { + var tdNode = trNode.insertCell(); + tdNode.innerHTML = '
    '; + } + } + z.setHTML(tableNode, true); + } + this.onmouseout = function () { + this.onmousemove = null; + this.onmouseout = null; + } + } + } + }); + //添加链接 + this.createMenu({ + title: '添加链接', + name: 'createLink', + icon: 'link', + id: this.linkId, + popup: { + width: 320, + height: 110, + title: '添加链接', + content: '' + }, + success: function (e, z) { + z.link = z.id(z.linkId); + z.linkInput = z.id(z.linkInputId); + z.link.getElementsByClassName('iceEditor-btn')[0].onclick = function () { + //如果选中的内容存在a标签的话,删除 + var str = z.getSelectHTML().replace(/]+>/ig, '').replace(/<\s*\/a\s*>/ig, ''); + var a = z.c('a'); + if (z.link.getElementsByTagName('input')[1].checked) a.target = '_blank'; + a.href = z.linkInput.value; + a.innerHTML = str; + z.setHTML(a, true); + z.link.getElementsByClassName('iceEditor-popup')[0].style.display = 'none'; + z.pd(); + } + } + }); + //添加音乐 + this.createMenu({ + title: '添加音乐', + name: 'music', + icon: 'music', + id: this.musicId, + popup: { + width: 320, + height: 80, + title: '添加音乐', + content: '
    确定
    ' + }, + success: function (e, z) { + z.music = z.id(z.musicId); + z.musicInput = z.id(z.musicInputId); + z.music.getElementsByClassName('iceEditor-btn')[0].onclick = function () { + var a = z.c('audio'); + a.src = z.musicInput.value; + a.controls = 'controls'; + z.setHTML(a, true); + z.music.getElementsByClassName('iceEditor-popup')[0].style.display = 'none'; + z.pd(); + } + } + }); + //附件上传 + this.createMenu({ + title: '附件上传', + name: 'files', + icon: 'files', + id: this.filesId, + popup: { + width: 320, + height: 200, + title: '附件上传', + content: '
    ' + }, + success: function (e, z) { + z.files = z.id(z.filesId); + var close = z.files.getElementsByClassName('iceEditor-popup')[0]; + z.id(z.filesUploadId).onchange = function () { + if (!z.uploadUrl) return alert('请配置uploadUrl项'); + var formData = new FormData(); + for (var i = 0; i < this.files.length; i++) { + formData.append(z.filesUpload.name, this.files[i]); + } + formData = z.filesUpload.formData(formData); + z.ajax({ + url: z.uploadUrl, + data: formData, + success: function (res) { + if (res) { + for (var f = 0; f < res.length; f++) { + var obj = res[f]; + if (obj.error) { + z.filesUpload.error(obj, res); + z.filesUpload.complete(obj, res); + alert(obj.error); + } else { + obj = z.filesUpload.success(obj, res); + var a = z.c("a"); + a.href = obj.url; + a.className = 'download'; + a.download = obj.name; + a.innerText = obj.name; + a.target = '_blank'; + z.setHTML(a, true); + z.filesUpload.complete(obj, res); + } + } + close.style.display = 'none'; + } else { + z.filesUpload.error(res); + z.filesUpload.complete(res); + } + }, + error: function (xhr) { + z.filesUpload.error(xhr); + z.filesUpload.complete(xhr); + } + }) + } + } + }); + + //添加图片 + this.createMenu({ + title: '添加图片', + name: 'insertImage', + icon: 'pic', + id: this.imageId, + popup: { + width: 320, + height: 250, + title: '图片上传', + content: '
    确定
    ' + }, + success: function (e, z) { + z.insertImage = z.id(z.imageId); + var close = z.insertImage.getElementsByClassName('iceEditor-popup')[0]; + //输入连接插入图片 + var url = z.insertImage.getElementsByClassName('iceEditor-insertImageUrl')[0]; + var width = z.insertImage.getElementsByClassName('iceEditor-inputWidth')[0]; + var height = z.insertImage.getElementsByClassName('iceEditor-inputHeight')[0]; + var btn = z.insertImage.getElementsByClassName('iceEditor-btn')[0]; + //绑定输入连接 + btn.onclick = function () { + var img = z.c('img'); + img.src = url.value; + if (width.value.trim()) img.width = width.value.trim(); + if (height.value.trim()) img.height = height.value.trim(); + z.setHTML(img); + close.style.display = 'none'; + z.pd(); + } + //上传图片 + z.id(z.imgUploadId).onchange = function () { + if (!z.uploadUrl) return alert('请配置uploadUrl项'); + var formData = new FormData(); + for (var i = 0; i < this.files.length; i++) { + formData.append(z.imgUpload.name, this.files[i]); + } + formData = z.imgUpload.formData(formData); + z.ajax({ + url: z.uploadUrl, + data: formData, + success: function (res) { + if (res) { + for (var f = 0; f < res.length; f++) { + var obj = res[f]; + if (obj.error) { + z.imgUpload.error(obj, res); + z.imgUpload.complete(obj, res); + alert(obj.error); + } else { + obj = z.imgUpload.success(obj, res); + var a = z.c('img'); + a.src = obj.url; + z.setHTML(a, true); + z.imgUpload.success(obj, res); + z.imgUpload.complete(obj, res); + } + } + close.style.display = 'none'; + } else { + z.imgUpload.error(res); + z.imgUpload.complete(res); + } + } + }) + } + } + }); + //添加视频 + this.createMenu({ + title: '添加视频', + name: 'video', + icon: 'video', + id: this.videoId, + popup: { + width: 320, + height: 170, + title: '添加视频', + content: '
    URL:
    确定
    ' + }, + success: function (e, z) { + z.video = z.id(z.videoId); + var type; + var close = z.video.getElementsByClassName('iceEditor-popup')[0]; + var url = z.video.getElementsByClassName('iceEditor-videoUrl')[0]; + var width = z.video.getElementsByClassName('iceEditor-inputWidth')[0]; + var height = z.video.getElementsByClassName('iceEditor-inputHeight')[0]; + var btn = z.video.getElementsByClassName('iceEditor-btn')[0]; + btn.onclick = function () { + if (!url.value.length) return alert('视频地址不能为空'); + var v = z.c('iframe'); + v.width = width.value.length ? width.value : 510; + v.height = height.value.length ? height.value : 498; + v.setAttribute('frameborder', 0); + v.setAttribute('allowfullscreen', true); + var error = '抱歉,无法处理该链接!'; + var domain = /^http(s)?:\/\/(.*?)\//.exec(url.value) // 正则出域名 + if (domain.length == 3) { + if (domain[2] == 'www.bilibili.com' || domain[2] == 'bilibili.com') { // bilibili + //源地址:https://www.bilibili.com/video/BV1UZ4y1g7De?spm_id_from=333.851.b_7265706f7274466972737431.11 + //处理地址:https://player.bilibili.com/player.html?bvid=BV1UZ4y1g7De + id = /video\/(.*?)\?/g.exec(url.value) + if (!id) { + id = /video\/(.*)/g.exec(url.value) + } + v.src = 'https://player.bilibili.com/player.html?bvid=' + id[1]; + } else if (domain[2] == 'v.youku.com') { // youku + //源地址:https://v.youku.com/v_show/id_XNTAwOTI4MzUxNg==.html + //处理地址:https://player.youku.com/embed/XMjM0ODA3NjIw + var id = url.value.split('.html'); + if (id.length > 1) { + id = id[0].split('id_'); + if (id.length > 1 && id[1].length) { + v.src = 'https://player.youku.com/embed/' + id[1]; + } else { + return alert('优酷:' + error); + } + } else { + return alert('优酷:' + error); + } + } else if (domain[2] == 'www.ixigua.com') { //西瓜视频 + id = /[0-9]{6,}/g.exec(url.value) + v.src = 'https://www.ixigua.com/iframe/' + id[0]; + } else { + v = z.c('video'); + v.src = url.value; + v.width = width.value.length ? width.value : 510; + v.height = height.value.length ? height.value : 498; + v.controls = 'controls'; + } + } else { + return alert('URL地址不合法!'); + } + z.setHTML(v, true); + close.style.display = 'none'; + z.pd(); + } + } + }); + //窗口最大化 + this.createMenu({ + title: '最大化', + name: 'max', + icon: 'max', + data: 'max', + css: 'iceEditor-maxWindow' + }); + //窗口最小化 + this.createMenu({ + title: '最小化', + name: 'min', + icon: 'min', + data: 'min', + css: 'iceEditor-minWindow' + }); + //菜单栏禁止 + this.createMenu({ + name: 'disabled', + css: 'iceEditor-disabledMask' + }); + } + //格式化菜单栏 + menuFormat() { + var _z = this; + this.menuHTML(); + var ul = this.c('ul'); + ul.className = 'iceEditor-menu'; + this.tool.innerHTML = ''; //防止重复创建 + this.tool.appendChild(ul); + //添加菜单 + for (var i = 0; i < this.menu.length; i++) { + if (this.menu[i] == 'line') { //分割线 + var line = _z.c('li'); + line.className = 'iceEditor-line'; + ul.appendChild(line); + continue; + } + if (this.notMenu.indexOf(this.menu[i]) == -1) { + ul.appendChild(this.menuList[this.menu[i]]); + if (this.menuList[this.menu[i]].success) { + this.menuList[this.menu[i]].success(this.menuList[this.menu[i]], _z); + } + } + } + if (this.maxWindow) { + ul.appendChild(this.menuList.max); + ul.appendChild(this.menuList.min); + } + ul.appendChild(this.menuList.disabled); + + //根据菜单配置来初始化菜单功能 ---结束--- + //初始化编辑器尺寸 + this.editor.style.width = this.width; + this.iframe.width = this.width; + this.iframe.height = this.height; + } + //设置菜单的功能 + menuAction() { + var menu = this.tool.getElementsByClassName('iceEditor-exec'); + var _z = this; + for (var i = 0; i < menu.length; i++) { + menu[i].e = this; + menu[i].attr = menu[i].getAttribute('data'); + if (menu[i].attr) { + menu[i].onclick = function () { + //anchorNode 返回选中内容前节点内的内容 + switch (this.attr) { + //删除线 + case 'strikeThrough': + var parent = _z.range.anchorNode.parentNode; + if (parent.style.textDecoration == 'line-through') { + var content = _z.range.anchorNode.parentNode.innerHTML; + parent.parentNode.removeChild(parent); + _z.setText(content, true); + } else { + var a = _z.c('span'); + a.style.textDecoration = 'line-through'; + _z.setHTML(a); + } + break; + //查看源代码 + case 'code': + var d = _z.tool.getElementsByClassName('iceEditor-disabledMask')[0]; + _z.code = _z.code ? 0 : 1; + if (_z.code) { + _z.tool.className = 'iceEditor-tool iceEditor-noselect'; + d.style.display = 'block'; + this.className = 'iceEditor-exec iceEditor-active'; + _z.d.body.className = 'iceEditor-code'; + var pre = _z.d.body.getElementsByTagName('pre'); + //处理pre标签 + for (var s = 0; s < pre.length; s++) pre[s].innerHTML = pre[s].innerHTML.replace(/<\/*br>/g, "\n"); + var text = _z.getHTML(); + //格式化段落 + text = text.replace(/<\/p>

    /gim, "<\/p>\n

    ").replace(/>

    \n\n<");
    +									_z.d.body.innerHTML = _z.unhtml(text);
    +
    +								} else {
    +									_z.tool.className = 'iceEditor-tool iceEditor-noselect';
    +									d.style.display = 'none';
    +									this.className = 'iceEditor-exec';
    +									_z.d.body.className = '';
    +									var text = _z.getHTML();
    +									_z.d.body.innerHTML = _z.html(text);
    +									var pre = _z.d.body.getElementsByTagName('pre');
    +									for (var s = 0; s < pre.length; s++) pre[s].innerHTML = pre[s].innerHTML.replace(/\n/g, "
    "); + } + break; + //最大化 + case 'max': + var webHeight = window.innerHeight; //页面视口高度 + if (typeof webHeight != 'number') { + if (document.compatMode == 'CSS1Compat') { + webHeight = document.documentElement.clientHeight; + } else { + webWidth = document.body.clientWidth; + } + } + _z.editor.style.position = 'fixed'; + _z.editor.style.zIndex = _z.getTime; + _z.editor.style.width = '100%'; + _z.editor.style.height = '100%'; + _z.editor.style.top = 0; + _z.editor.style.left = 0; + _z.iframe.height = webHeight - 35 - 20 + 'px'; + this.parentNode.style.display = 'none'; + _z.tool.getElementsByClassName('iceEditor-minWindow')[0].style.display = 'block'; + break; + //最小化 + case 'min': + _z.editor.removeAttribute('style'); + _z.iframe.height = _z.height; + this.parentNode.style.display = 'none'; + _z.tool.getElementsByClassName('iceEditor-maxWindow')[0].style.display = 'block'; + break; + //默认执行execCommand + default: + var b = this.attr.split('|'); + if (!_z.w.document._useStyleWithCSS) { + _z.w.document.execCommand('styleWithCSS', null, true); + _z.w.document._useStyleWithCSS = true; + } + if (b.length > 1) { + _z.w.document.execCommand(b[0], false, b[1]); + } else { + _z.w.document.execCommand(b[0], false, null); + } + //_z.range.getRangeAt(0).collapse(); //取消选中状态 + } + return false; + } + } + } + } + //粘贴world + pasteWord(html) { + //是否是word过来的内容 + function isWordContent(str) { + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test(str); + } + //转换cm/pt单位到px + function unitToPx(v) { + if (!/(pt|cm)/.test(v)) return v; + var unit; + v.replace(/([\d.]+)(\w+)/, function (str, v, u) { + v = v, unit = u; + }); + v = unit == 'cm' ? parseFloat(v) * 25 : Math.round(parseFloat(v) * 96 / 72); + return v + (v ? 'px' : ''); + } + //去掉小数 + function transUnit(v) { + return v.replace(/[\d.]+\w+/g, + function (m) { + return unitToPx(m) + }); + } + //处理word格式 + function filterPasteWord(str) { + return str + .replace(//gi, "") + .replace(//gi, "") + .replace(//gi, '') + .replace(/.*?<\/head>/gi, '') + .replace(/<\/body>/gi, '') + .replace(/<\/html>/gi, '') + .replace(/[\t\s]+/gi, ' ') + .replace(/.*?<\/xml>/gi, '') + .replace(/.*?<\/o:p>/gi, '') + .replace(/]*>\s*<\/span>/gi, '') + .replace(/<(span|font|p|b|i|u|s)[^>]*>\s*<\/\1>/gi, '') + .replace(/v:\w+=(["']?)[^'"]+\1/g, '') + .replace(/]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

    $1

    ") + //去掉多余的属性 + .replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi, function (str, name, marks, val) { + //保留list的标示 + return name == "class" && val == "MsoListParagraph" ? str : ''; + }) + //清除多余的font/span不能匹配 有可能是空格 + .replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi, function (a, b, c) { + return c.replace(/[\t\r\n ]+/g, ' '); + }) + //处理style的问题 + .replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function (str, tag, tmp, style) { + var n = [], + s = style.replace(/^\s+|\s+$/, "").replace(/'/g, "'").replace(/"/gi, "'").replace(/[\d.]+(cm|pt)/g, function (str) { + return unitToPx(str); + }).split(/;\s*/g); + for (var i = 0, v; v = s[i]; i++) { + var name, value, parts = v.split(":"); + if (parts.length == 2) { + name = parts[0].toLowerCase().trim(), value = parts[1].toLowerCase().trim(); + if ((/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g, "").length == 0) || (/^(margin)\w*/.test(name) && /^0\w+$/.test(value))) continue; + switch (name) { + case "mso-vertical-align-alt": + if (!//g, "") + .replace(//g, "") + .replace(//g, '') + .replace(/.*?<\/head>/g, '') + .replace(/<\/body>/g, '') + .replace(/<\/html>/g, '') + .replace(/\s+(id|class|lang|align|data|data-\w*)\s*=\s*(['"]?).*?\2/gi, ''); + + //过滤被禁止的html标签 + for (var i = 0; i < this.filterTag.length; i++) { + html = html.replace(new RegExp("<" + this.filterTag[i] + "[^>]*>.*?<\/" + this.filterTag[i] + ">", "gim"), ''); + } + + //过滤style属性 + var _z = this; + html = html.replace(/\s+style\s*=\s*(['"]?)(.*?)\1/g, function (a, q, b) { + if (b) { + b = b.replace(/('|")/gi, "'"); //防止属性中的单双引号被转义,注意转义以后的分号,因为需要通过分号来分割样式 + var info = b.split(';'); + if (info.length) { + var h = []; + for (var i = 0; i < info.length; i++) { + var styleName = info[i].trim(); + if (styleName) { + var name = styleName.split(':')[0]; + if (!_z.filterStyle.includes(name)) { + //用来将rgb颜色转为十六进制,rgba不变 + var color = styleName.split(':'); + if (color.length > 1 && /rgb\s*\(/gi.test(color[1])) { + color[1] = color[1].replace(/rgb\s*\(.*?\)/gi, function (a) { + a = a.split(/\D+/); + return "#" + ((1 << 24) + (parseInt(a[1]) << 16) + (parseInt(a[2]) << 8) + parseInt(a[3])).toString(16).slice(1); + }); + h.push(name + ':' + color[1]); + } else { + h.push(styleName); + } + } + } + } + return ' style="' + h.join(';') + '"'; + } + } + return ''; + }); + + //div转p + return html.replace(/]*)>/g, "").replace(/<\/div>/g, "

    "); + } + //美化HTML格式 + formatHTML(html) { + html = html.replace(/[\t\s]+/g, ' ') + + //清除空标签 + .replace(/<(span|font|p|b|i|u|s)[^>]*>(<(?!img)[^>]*>)*<\/\1>/gi, '') + + //清除标签内末尾的空格,起到美化作用 + .replace(/<(.+)\s+>/g, '<$1>') + + //格式美化 + //.replace(/>\s*

    \n){1,}/gi, '
    '); + + //格式化块级元素段落 + for (var i = 0; i < this.blockTag.length; i++) { + html = html.replace(new RegExp("<\/" + this.blockTag[i] + ">", "gim"), "<\/" + this.blockTag[i] + ">\r\n"); + } + return html.replace(/\r\n{1,}/gim, "\r\n").trim(); + } + + //纯文本粘贴 + paste() { + // 干掉IE http之类地址自动加链接 + try { + this.w.document.execCommand("AutoUrlDetect", false, false); + } catch (e) {} + var _z = this; + var _w = this.w; + + //上传 + var upload = function (imgBase64) { + //如果禁用上传到服务器,则直接以base64格式显示图像 + if (!_z.screenshotUpload) { + var p = _z.c('p'); + var a = _z.c('img'); + a.src = imgBase64; + p.appendChild(a); + _z.setHTML(p, true); + return; + } + + function dataURItoBlob(base64Data) { + var byteString; + if (base64Data.split(',')[0].indexOf('base64') >= 0) { + byteString = atob(base64Data.split(',')[1]); + } else { + byteString = unescape(base64Data.split(',')[1]); + } + var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0]; + var a = new Uint8Array(byteString.length); + for (var i = 0; i < byteString.length; i++) { + a[i] = byteString.charCodeAt(i); + } + return new Blob([a], { + type: mimeString + }); + } + var blob = dataURItoBlob(imgBase64); + var formData = new FormData(); + formData.append(_z.imgUpload.name, blob); + formData = _z.imgUpload.formData(formData); + _z.ajax({ + url: _z.uploadUrl, + data: formData, + success: function (res) { + if (res) { + for (var f = 0; f < res.length; f++) { + var obj = res[f]; + if (obj.error) { + _z.imgUpload.error(obj, res); + _z.imgUpload.complete(obj, res); + alert(obj.error); + } else { + obj = _z.imgUpload.success(obj, res); + var p = _z.c('p'); + var a = _z.c('img'); + a.src = obj.url; + p.appendChild(a); + _z.setHTML(p, true); + _z.imgUpload.success(obj, res); + _z.imgUpload.complete(obj, res); + } + } + } else { + _z.imgUpload.error(res); + _z.imgUpload.complete(res); + } + }, + error: function (xhr) { + _z.imgUpload.error(xhr); + _z.imgUpload.complete(xhr); + } + }) + }; + var getBase64 = function () { + setTimeout(function () { + //保证图片先插入到div里,然后去获取值 + var imgList = _z.d.body.getElementsByTagName('img'); + for (var i = 0; i < imgList.length; i++) { + if (imgList[i].src.substr(0, 5) == 'data:') { + upload(imgList[i].src); + imgList[i].parentNode.removeChild(imgList[i]); + break; + } + } + }, 10); + }; + + this.d.body.addEventListener('paste', function (e) { + + // console.log(_z.range.getRangeAt(0).endContainer); + // console.log(_z.range.getRangeAt(0).startOffset); + if (!_z.isIE()) e.preventDefault(); + var clip = (window.clipboardData || e.clipboardData || e.originalEvent.clipboardData); + //获取粘贴板数据 + var text = clip.getData('Text'); + var str = _z.pasteText && text.length ? text : (clip.getData('text/html').length ? clip.getData('text/html') : text); + var htmlContent = clip.getData('text/html') ? true : false; + //富文本粘贴模式开启状态下 + if (htmlContent && !_z.pasteText) { + //复制过来的数据有些情况会被转义,需要再次转义回来,单双引号全部转为单引号比较可靠 + str = str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/ /g, " ").replace(/'/g, "'").replace(/"/g, "'"); + } + + //截图粘贴功能 判断是否开启,判断是否在pre标签中 + if (_z.screenshot && !_z.inNodeParent(_z.range.getRangeAt(0).endContainer, 'pre')) { + if (clip) { + //ie11没有items + var blob = clip.items ? (clip.items[0].type.indexOf("image") !== -1 ? clip.items[0].getAsFile() : 0) : 0; + if (blob) { + var reader = new FileReader(); + reader.onload = function (e) { + //图片的Base64编码字符串 + var base64_str = e.target.result; + upload(base64_str); + } + reader.readAsDataURL(blob); + } + } + getBase64(); + } + if (!str.length) return; + //源码模式下直接纯文本粘贴 + if (_z.code) { + _z.setText(text); + return; + } + + var t = str.replace(/[\r|\n]+/g, "\n").split("\n"); + //判断光标是否在pre标签中 + if (_z.inNodeParent(_z.range.getRangeAt(0).endContainer, 'pre')) { + var t = text.replace(/[\r|\n]+/g, "\n").split("\n"); + for (var i = 0; i < t.length; i++) { + t[i] = _z.toText(t[i]); + } + _z.setText(t.join('
    '), true); + return; + } + + if (_z.pasteText && t.length == 1) { + _z.setText(str); + return; + } + + //纯文本粘贴 + if (_z.pasteText || !htmlContent) { + for (var i = 0; i < t.length; i++) { + if (t[i]) { //有效去除空标签 + _z.setText('

    ' + t[i].trim() + '

    ', true); + } + } + } else { + //过滤word + str = _z.pasteWord(str); + str = _z.formatHTML(str); + //过滤HTML + str = _z.pasteHTML(str); + //格式化HTML + str = _z.formatHTML(str); + _z.setText(str, true); + } + //处理冗余标签 + str = _z.getHTML(); + _z.d.body.innerHTML = str; + str = _z.getHTML(); + str = str.replace(/

    <\/p>/gi, '') + .replace(/<\/p>
    /gi, '') + .replace(/<(span|font|p|b|i|u|s)[^>]*>(<(?!img)[^>]*>)*<\/\1>/gi, ''); + _z.d.body.innerHTML = str; + + //下载网络图片到本地 + if (_z.imgAutoUpload) { + var str = _z.getHTML(); + str.replace(//gi, function (all, b = '') { + //这里必须使用闭包,因为使用了异步 + (function (a) { + //判断是否为本地图片 + if (b.substr(0, 1) == '/' && b.substr(0, 2) != '//') return; + //如果为网络图片,过滤白名单域名 + _z.imgDomain = _z.imgDomain && Array.isArray(_z.imgDomain) ? _z.imgDomain : [document.domain]; + //将当前域名加入白名单 + !_z.imgDomain.includes(document.domain) && _z.imgDomain.push(document.domain); + for (var i = 0; i < _z.imgDomain.length; i++) { + if (new RegExp("^((http|https):)*(\/)*" + _z.imgDomain[i], "i").test(a)) { + return; + } + } + _z.ajax({ + url: _z.uploadUrl, + data: { + 'iceEditor-img': a + }, + success: function (res) { + if (res && !res.error) { + res = _z.imgUpload.success(res); + _z.imgUpload.complete(res); + str = str.replace(new RegExp(a, 'gi'), res.url); + _z.setValue(str); + } else { + _z.imgUpload.error(res, res); + _z.imgUpload.complete(res, res); + } + }, + error: function (xhr) { + _z.imgUpload.error(xhr); + _z.imgUpload.complete(xhr); + } + }) + })(b); + }); + } + + }); + + function nodePrev(el) { + if (!el) return false; + var node = el.nextSibling; + if (node && node.nodeType != 1) node = nodePrev(node); + return node; + } + this.d.body.addEventListener('keydown', function (e) { + var range = _z.range.getRangeAt(0); + if (e.keyCode == 13) { + //回车处理pre中的代码 + if (_z.inNodeParent(range.endContainer, 'pre')) { + //这一步是真特么费劲 + if (_z.range.anchorNode.parentNode.tagName == 'PRE') { + _z.element.focus(); + //判断一下光标是否处于当前节点文字的末尾 + var isCursorEnd = range.endContainer.length == range.startOffset; + //Chrome浏览器有个非常操蛋的毛病,就是如果当前节点是最后一个,输入文字后回车 + //第一次换行不起作用,需要两次回车才能换行 + //所以需要判断当前节点是否为最后一个节点,完全是给Chrome用的 + var isNodeEnd = nodePrev(range.endContainer) ? false : true; + var br = isNodeEnd ? '

    ' : '
    '; + var range = _z.range.getRangeAt(0); + range.insertNode(range.createContextualFragment(br)); + //接下来这一步是为了修正光标位置 + var node = _z.range.anchorNode.nextSibling.nextSibling; + range.setStart(node, 0); + range.setEnd(node, 0); + range.collapse(); + } else if (_z.parentTagName == 'PRE' || _z.range.anchorNode.tagName == 'PRE') { + _z.setText('
    ', true); + } + e.preventDefault(); + return; + } + } + // 去除Crtl+b/Ctrl+i/Ctrl+u等快捷键 + // e.metaKey for mac + if (e.ctrlKey || e.metaKey) { + switch (e.keyCode) { + case 13: { + e.preventDefault(); + break; + } + case 66: //ctrl+B or ctrl+b + case 98: + case 73: //ctrl+I or ctrl+i + case 105: + case 85: //ctrl+U or ctrl+u + case 117: { + e.preventDefault(); + break; + } + } + } + }); + } + + //配置格式化 + create() { + //添加样式 + if (this.cssConfig.styleSheet) { + this.cssConfig.styleSheet.cssText = this.css; + } else { + this.cssConfig.innerHTML = this.css; + } + this.menuFormat(); + this.menuAction(); + this.disableds.style.display = this.disabled ? 'block' : 'none'; + } + + //获取编辑器的HTML内容 + getHTML() { + return this.content.innerHTML; + } + //获取编辑器的Text内容 + getText() { + return this.content.innerText; + } + //获取编辑器的HTML内容,等同getHTML + getValue() { + return this.content.innerHTML; + } + //设置编辑器的内容 + setValue(v) { + this.content.innerHTML = v; + this.setTextarea(); + } + //追加编辑器的内容 + addValue(v) { + this.content.innerHTML += v; + this.setTextarea(); + } + //禁止输入 + inputDisabled() { + this.d.body.designMode = 'off'; + this.d.body.contentEditable = false; + } + //启动输入 + inputEnable() { + this.d.body.designMode = 'on'; + this.d.body.contentEditable = true; + } + //监听输入 + inputCallback(fn) { + var _z = this; + _z.d.body.oninput = function () { + fn && fn.call(_z, _z.getHTML(), _z.getText()); + } + _z.d.body.addEventListener('paste', function (e) { + fn && fn.call(_z, _z.getHTML(), _z.getText()); + }) + } + //加载样式 + styleInit() { + //编辑器图标 + ice.editor.css = '.iceEditor{color:#353535!important;font-family:"Microsoft YaHei";font-size:14px!important;background:#fff;position:relative;border:solid 1px #ccc}.iceEditor *{margin:0;padding:0;box-sizing:border-box}.iceEditor a{color:#606060;text-decoration:none;-webkit-tap-highlight-color:transparent}.iceEditor a:hover{color:#000}.iceEditor-line{height:20px;width:1px;background:#cecece;margin:8px 8px 0 8px;}.iceEditor-row{margin-bottom:10px;}.iceEditor-group{text-align:left;margin-bottom:10px;}.iceEditor-group label {min-width:50px!important;display:inline-block!important;text-align:right!important;font-weight:normal!important;}.iceEditor input{height:27px!important;line-height:27px!important;padding:3px!important;border:1px solid #B7B7B7!important;font-family:inherit;font-size:inherit;vertical-align:middle;outline:none;display:inline-block!important;}.iceEditor-exec{cursor:pointer}.iceEditor-icon{width:22px;height:16px;fill:currentColor;overflow:hidden;vertical-align:middle;font-size:16px}.iceEditor-noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.iceEditor-menuDropdown{min-width:35px;min-height:35px;transition:all .4s ease;margin-top:60px;opacity:0;visibility:hidden;position:absolute;background:#fff;z-index:999;box-shadow:0 2px 9px 0 rgba(0,0,0,.2);border-bottom:2px solid #676767;border-top:1px solid #676767}.iceEditor-menuDropdown::before{content:"";display:block;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #676767;position:absolute;top:-8px;left:9px}.iceEditor-menuTitle{width:100%!important;text-align:center;height:30px;line-height:30px;border-top:1px solid #efefef}.iceEditor-tool{width:100%;background:#eee;border-bottom:solid 1px #ccc;position:relative}.iceEditor-tool:after,.iceEditor-tool:before{display:table;content:" "}.iceEditor-tool:after{clear:both}.iceEditor-menu{width:100%;padding:0 10px;display:inline-block;float:left}.iceEditor-menu a{list-style:none;float:left;min-width:35px;height:35px;padding:0 5px;text-align:center;line-height:35px;cursor:pointer}.iceEditor-menu a:hover{background:#cdcdcd}.iceEditor-menu>li>div.iceEditor-exec{list-style:none;float:left;min-width:35px;height:35px;padding:0 5px;text-align:center;line-height:35px;cursor:pointer}.iceEditor-menu>li>div.iceEditor-exec:hover{background:#cdcdcd}.iceEditor-menu svg{fill:currentColor;overflow:hidden;vertical-align:middle;font-size:16px}.iceEditor-menu .iceEditor-active{background:#e0e0e0;position:relative;z-index:999}.iceEditor-menu .iceEditor-actives,.iceEditor-menu .iceEditor-active-s{background:#d8d8d8;}.iceEditor-menu .iceEditor-disabledMask{background:rgba(238,238,238,0.7);width:100%;height:100%;position:absolute;left:0;top:0;display:none}.iceEditor-menu li{display:inline-block;float:left;line-height:initial;}.iceEditor-menu li .iceEditor-menuDropdown.iceEditor-menuActive{margin-top:44px;opacity:1;visibility:visible}.iceEditor-menu li.iceEditor-minWindow{display:none}.iceEditor-menu li.iceEditor-maxWindow,.iceEditor-menu li.iceEditor-minWindow{float:right}.iceEditor-menu li.iceEditor-maxWindow>div,.iceEditor-menu li.iceEditor-minWindow>div{position:relative;z-index:9}.iceEditor-menu li.iceEditor-maxWindow .iceEditor-icon,.iceEditor-menu li.iceEditor-minWindow .iceEditor-icon{color:#606060}.iceEditor-codeLanguages select{padding:5px 5px;width:120px;outline:none;font-size:15px;margin-top:10px;}.iceEditor input.iceEditor-uploadInput{display:none!important}.iceEditor-uploadBtn{float:none;width:auto;font-size:15px;background:#00b7ee;height:40px;line-height:40px;padding:0 30px;color:#fff;display:inline-block;margin:0 auto 15px auto;cursor:pointer;box-shadow:0 1px 1px rgba(0,0,0,.1)}.iceEditor-uploadBtn:hover{background:#009ccb}.iceEditor-uploadIcon{width:45px;height:45px;color:#bababa;margin:20px 20px 10px}.iceEditor-backColor{width:230px;padding:5px}.iceEditor-backColor span{width:20px;height:20px;padding:0;margin:1px;display:inline-block}.iceEditor-fontSize{width:280px}.iceEditor-fontSize li{width:40px;text-align:center}.iceEditor-fontSize span{width:40px;display:inline-block;padding:10px 0}.iceEditor-fontSize span:hover{background:#eee;color:#4CAF50}.iceEditor-createLink label{display:inline-block;}.iceEditor .iceEditor-link{width:175px!important;}.iceEditor-popup .iceEditor-insertImage{text-align:center}.iceEditor-popup .iceEditor-insertImageUrl{width:220px!important;height:27px;outline:0;margin-right:15px}.iceEditor-popup .iceEditor-inputWidth{width:50px!important;height:27px;outline:0;margin-right:15px}.iceEditor-popup .iceEditor-inputHeight{width:50px!important;height:27px;outline:0}.iceEditor-popup .iceEditor-btn{width:auto;display:inline-block;float:none;color:#fff!important;height:27px;line-height:25px;padding:0 10px;background:#939393;vertical-align:middle;margin-left:5px;border:1px solid #7b7b7b}.iceEditor-popup .iceEditor-btn:hover{background:#7b7b7b!important;color:#fff}.iceEditor-tableBox{position:relative;width:190px;height:214px;padding:5px;overflow:hidden}.iceEditor-tableBgOn{position:absolute!important;top:5px;left:5px;z-index:4;width:18px;height:18px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC) repeat}.iceEditor-tableBgOff{width:180px;height:180px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC) repeat}.iceEditor-tableNum{height:30px;line-height:30px;text-align:center;color:#757575}.iceEditor-video{text-align:left}.iceEditor-video label{margin-right:20px;display:inline-block}.iceEditor-video input{margin-right:5px}.iceEditor-video div{height:27px;margin-bottom:10px}.iceEditor-popup .iceEditor-videoUrl{width:255px!important;height:27px;outline:0;margin-right:0}.iceEditor-content{width:100%;height:100%;padding:20px;position:relative}.iceEditor-content:focus{outline:0}.iceEditor-dragBg{position:absolute;width:100%;height:100%;top:0;left:0;z-index:1;display:none;}.iceEditor-drag{color:#757575;background:#eee;text-align:center;height:12px;line-height:0;cursor:n-resize}.iceEditor-disabled{position:absolute;width:100%;height:100%;top:0;left:0;background:rgba(191,191,191,.79);z-index:99999;display:none}.iceEditor-popup{display:none}.iceEditor-popupMain{width:400px;height:200px;position:fixed;margin:auto;top:0;bottom:0;left:0;right:0;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.12);z-index:9999;animation-name:iceEditorPopup;animation-duration:.5s}.iceEditor-popupBox{width:100%;height:100%;position:fixed;top:0;left:0;background:rgba(0,0,0,.33);opacity:.5;filter:alpha(opacity=50);z-index:1}.iceEditor-popupTitle{width:100%;height:30px;line-height:30px;background:#2f2f2f;padding:0 10px;color:#fff}.iceEditor-popupTitle span{display:inline-block;vertical-align:middle}.iceEditor-popupTitle::before{content:"";display:inline-block;width:10px;height:10px;border-radius:10px;background:#c7f98c;vertical-align:middle;margin-right:8px}.iceEditor-popupClose{float:right;padding:0 10px;color:#fff;font-size:18px;cursor:pointer}.iceEditor-popupClose:hover{color:#8fe5ff}.iceEditor-popupContent{width:100%;padding:10px;color:#000;overflow:auto;float:left}.iceEditor-popupBtn{width:100%;border:0;color:#fff;background:#03A9F4;border-top:1px solid #efefef;padding:0 20px;margin:0;height:35px;text-align:center;line-height:35px;cursor:pointer;margin-top:20px;outline:0}.iceEditor-popupBtn:hover{color:#151515;background:#efefef}@keyframes iceEditorPopup{0%{top:-100px;opacity:0}to{top:0;opacity:1}}'; + //编辑器图标 + ice.editor.svg = ''; + (function svg() { + var c = document.createElement('style'), + d, s, b = document.body; + if (c.styleSheet) { + c.styleSheet.cssText = ice.editor.css; + } else { + c.innerHTML = ice.editor.css; + } + document.getElementsByTagName('head')[0].appendChild(c); + d = document.createElement("div"); + d.innerHTML = ice.editor.css + ice.editor.svg; + ice.editor.svg = null; + s = d.getElementsByTagName("svg")[0]; + if (s) { + s.setAttribute("aria-hidden", "true"); + s.style.position = "absolute"; + s.style.width = 0; + s.style.height = 0; + s.style.overflow = "hidden"; + if (b.firstChild) { + b.firstChild.parentNode.insertBefore(s, b.firstChild) + } else { + b.appendChild(s) + } + } + })(); + } + } + //只返回color色值属性和setColor方法 + return new iceEditor(id,callback); +} \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/iconPicker.js b/module-form/src/main/resources/static/form-design/modules/iconPicker.js new file mode 100644 index 00000000..276e7fd3 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/iconPicker.js @@ -0,0 +1,327 @@ + +layui.define(['laypage', 'form'], function (exports) { + "use strict"; + + var IconPicker =function () { + this.v = '0.1.beta'; + }, _MOD = 'iconPicker', + _this = this, + $ = layui.jquery, + laypage = layui.laypage, + form = layui.form, + BODY = 'body', + TIPS = '请选择图标'; + + /** + * 渲染组件 + */ + IconPicker.prototype.render = function(options){ + var opts = options, + // DOM选择器 + elem = opts.elem, + // 数据类型:fontClass/unicode + type = opts.type == null ? 'fontClass' : opts.type, + // 是否分页:true/false + page = opts.page, + // 每页显示数量 + limit = limit == null ? 12 : opts.limit, + // 是否开启搜索:true/false + search = opts.search == null ? true : opts.search, + // 点击回调 + click = opts.click, + // json数据 + data = {}, + // 唯一标识 + tmp = new Date().getTime(), + // 是否使用的class数据 + isFontClass = opts.type === 'fontClass', + TITLE = 'layui-select-title', + TITLE_ID = 'layui-select-title-' + tmp, + ICON_BODY = 'layui-iconpicker-' + tmp, + PICKER_BODY = 'layui-iconpicker-body-' + tmp, + PAGE_ID = 'layui-iconpicker-page-' + tmp, + LIST_BOX = 'layui-iconpicker-list-box', + selected = 'layui-form-selected', + unselect = 'layui-unselect'; + + var a = { + init: function () { + data = common.getData[type](); + + a.hideElem().createSelect().createBody().toggleSelect(); + common.loadCss(); + return a; + }, + /** + * 隐藏elem + */ + hideElem: function () { + $(elem).hide(); + return a; + }, + /** + * 绘制select下拉选择框 + */ + createSelect: function () { + var selectHtml = '

    ' + + '
    ' + + '
    '+ + '' + + '' + + ''+ + '' + + '
    '+ + '
    ' + + '
    ' + + '123' + + '
    '; + $(elem).after(selectHtml); + return a; + }, + /** + * 展开/折叠下拉框 + */ + toggleSelect: function () { + var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge'; + a.event('click', item, function (e) { + console.log('xxxx'); + var $icon = $('#' + ICON_BODY); + if ($icon.hasClass(selected)) { + $icon.removeClass(selected).addClass(unselect); + } else { + $icon.addClass(selected).removeClass(unselect); + } + e.stopPropagation(); + }); + return a; + }, + /** + * 绘制主体部分 + */ + createBody: function () { + // 获取数据 + var searchHtml = ''; + + if (search) { + searchHtml = ''; + } + + // 组合dom + var bodyHtml = '
    ' + + searchHtml + + '
    '+ + '
    '; + $('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml); + a.search().createList().check().page(); + + return a; + }, + /** + * 绘制图标列表 + * @param text 模糊查询关键字 + * @returns {string} + */ + createList: function (text) { + var d = data, + l = d.length, + pageHtml = '', + listHtml = $('
    ')//'
    '; + + // 计算分页数据 + var _limit = limit, // 每页显示数量 + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页 + _id = PAGE_ID; + + // 图标列表 + var icons = []; + + for (var i = 0; i < l; i++) { + var obj = d[i]; + + // 判断是否模糊查询 + if (text && obj.indexOf(text) === -1) { + continue; + } + + // 每个图标dom + var icon = '
    '; + if (isFontClass){ + icon += ''; + } else { + icon += ''+ obj.replace('amp;', '') +''; + } + icon += '
    '; + + icons.push(icon); + } + + // 查询出图标后再分页 + l = icons.length; + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1); + for (var i = 0; i < _pages; i++) { + // 按limit分块 + var lm = $('
    '); + + for (var j = i * _limit; j < (i+1) * _limit && j < l; j++) { + lm.append(icons[j]); + } + + listHtml.append(lm); + } + + // 无数据 + if (l === 0) { + listHtml.append('

    无数据

    '); + } + + // 判断是否分页 + if (page){ + $('#' + PICKER_BODY).addClass('layui-iconpicker-body-page'); + pageHtml = '
    ' + + '
    ' + + '1/' + + ''+ _pages +'' + + ' ('+ l +')' + + '
    ' + + '
    ' + + ' ' + + ' ' + + '
    ' + + '
    '; + } + + + $('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml); + return a; + }, + // 分页 + page: function () { + var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon'; + + $(icon).unbind('click'); + a.event('click', icon, function (e) { + var elem = e.currentTarget, + total = parseInt($('#' +PAGE_ID + '-pages').html()), + isPrev = $(elem).attr('prev') !== undefined, + // 按钮上标的页码 + index = parseInt($(elem).attr('data-index')), + $cur = $('#' +PAGE_ID + '-current'), + // 点击时正在显示的页码 + current = parseInt($cur.html()); + + // 分页数据 + if (isPrev && current > 1) { + current=current-1; + $(icon + '[prev]').attr('data-index', current); + } else if (!isPrev && current < total){ + current=current+1; + $(icon + '[next]').attr('data-index', current); + } + $cur.html(current); + + // 图标数据 + $('.layui-iconpicker-icon-limit').hide(); + $('#layui-iconpicker-icon-limit-' + current).show(); + e.stopPropagation(); + }); + return a; + }, + /** + * 搜索 + */ + search: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input'; + a.event('input propertychange', item, function (e) { + var elem = e.target, + t = $(elem).val(); + a.createList(t); + }); + a.event('click', item, function (e) { + e.stopPropagation(); + }); + return a; + }, + /** + * 点击选中图标 + */ + check: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item'; + a.event('click', item, function (e) { + var el = $(e.currentTarget).find('.layui-icon'), + icon = ''; + if (isFontClass) { + var clsArr = el.attr('class').split(/[\s\n]/), + cls = clsArr[1], + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html('').attr('class', clsArr.join(' ')); + } else { + var cls = el.html(), + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html(icon); + } + + $('#' + ICON_BODY).removeClass(selected).addClass(unselect); + $(elem).attr('value', icon); + // 回调 + if (click) { + click({ + icon: icon + }); + } + + }); + return a; + }, + event: function (evt, el, fn) { + $(BODY).on(evt, el, fn); + } + }; + + var common = { + /** + * 加载样式表 + */ + loadCss: function () { + var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}'; + $('head').append(''); + }, + /** + * 获取数据 + */ + getData: { + fontClass: function () { + var arr = ["layui-icon-rate-half","layui-icon-rate","layui-icon-rate-solid","layui-icon-cellphone","layui-icon-vercode","layui-icon-login-wechat","layui-icon-login-qq","layui-icon-login-weibo","layui-icon-password","layui-icon-username","layui-icon-refresh-3","layui-icon-auz","layui-icon-spread-left","layui-icon-shrink-right","layui-icon-snowflake","layui-icon-tips","layui-icon-note","layui-icon-home","layui-icon-senior","layui-icon-refresh","layui-icon-refresh-1","layui-icon-flag","layui-icon-theme","layui-icon-notice","layui-icon-website","layui-icon-console","layui-icon-face-surprised","layui-icon-set","layui-icon-template-1","layui-icon-app","layui-icon-template","layui-icon-praise","layui-icon-tread","layui-icon-male","layui-icon-female","layui-icon-camera","layui-icon-camera-fill","layui-icon-more","layui-icon-more-vertical","layui-icon-rmb","layui-icon-dollar","layui-icon-diamond","layui-icon-fire","layui-icon-return","layui-icon-location","layui-icon-read","layui-icon-survey","layui-icon-face-smile","layui-icon-face-cry","layui-icon-cart-simple","layui-icon-cart","layui-icon-next","layui-icon-prev","layui-icon-upload-drag","layui-icon-upload","layui-icon-download-circle","layui-icon-component","layui-icon-file-b","layui-icon-user","layui-icon-find-fill","layui-icon-loading","layui-icon-loading-1","layui-icon-add-1","layui-icon-play","layui-icon-pause","layui-icon-headset","layui-icon-video","layui-icon-voice","layui-icon-speaker","layui-icon-fonts-del","layui-icon-fonts-code","layui-icon-fonts-html","layui-icon-fonts-strong","layui-icon-unlink","layui-icon-picture","layui-icon-link","layui-icon-face-smile-b","layui-icon-align-left","layui-icon-align-right","layui-icon-align-center","layui-icon-fonts-u","layui-icon-fonts-i","layui-icon-tabs","layui-icon-radio","layui-icon-circle","layui-icon-edit","layui-icon-share","layui-icon-delete","layui-icon-form","layui-icon-cellphone-fine","layui-icon-dialogue","layui-icon-fonts-clear","layui-icon-layer","layui-icon-date","layui-icon-water","layui-icon-code-circle","layui-icon-carousel","layui-icon-prev-circle","layui-icon-layouts","layui-icon-util","layui-icon-templeate-1","layui-icon-upload-circle","layui-icon-tree","layui-icon-table","layui-icon-chart","layui-icon-chart-screen","layui-icon-engine","layui-icon-triangle-d","layui-icon-triangle-r","layui-icon-file","layui-icon-set-sm","layui-icon-add-circle","layui-icon-404","layui-icon-about","layui-icon-up","layui-icon-down","layui-icon-left","layui-icon-right","layui-icon-circle-dot","layui-icon-search","layui-icon-set-fill","layui-icon-group","layui-icon-friends","layui-icon-reply-fill","layui-icon-menu-fill","layui-icon-log","layui-icon-picture-fine","layui-icon-face-smile-fine","layui-icon-list","layui-icon-release","layui-icon-ok","layui-icon-help","layui-icon-chat","layui-icon-top","layui-icon-star","layui-icon-star-fill","layui-icon-close-fill","layui-icon-close","layui-icon-ok-circle","layui-icon-add-circle-fine"]; + return arr; + }, + unicode: function () { + return ["&#xe6c9;","&#xe67b;","&#xe67a;","&#xe678;","&#xe679;","&#xe677;","&#xe676;","&#xe675;","&#xe673;","&#xe66f;","&#xe9aa;","&#xe672;","&#xe66b;","&#xe668;","&#xe6b1;","&#xe702;","&#xe66e;","&#xe68e;","&#xe674;","&#xe669;","&#xe666;","&#xe66c;","&#xe66a;","&#xe667;","&#xe7ae;","&#xe665;","&#xe664;","&#xe716;","&#xe656;","&#xe653;","&#xe663;","&#xe6c6;","&#xe6c5;","&#xe662;","&#xe661;","&#xe660;","&#xe65d;","&#xe65f;","&#xe671;","&#xe65e;","&#xe659;","&#xe735;","&#xe756;","&#xe65c;","&#xe715;","&#xe705;","&#xe6b2;","&#xe6af;","&#xe69c;","&#xe698;","&#xe657;","&#xe65b;","&#xe65a;","&#xe681;","&#xe67c;","&#xe601;","&#xe857;","&#xe655;","&#xe770;","&#xe670;","&#xe63d;","&#xe63e;","&#xe654;","&#xe652;","&#xe651;","&#xe6fc;","&#xe6ed;","&#xe688;","&#xe645;","&#xe64f;","&#xe64e;","&#xe64b;","&#xe62b;","&#xe64d;","&#xe64a;","&#xe64c;","&#xe650;","&#xe649;","&#xe648;","&#xe647;","&#xe646;","&#xe644;","&#xe62a;","&#xe643;","&#xe63f;","&#xe642;","&#xe641;","&#xe640;","&#xe63c;","&#xe63b;","&#xe63a;","&#xe639;","&#xe638;","&#xe637;","&#xe636;","&#xe635;","&#xe634;","&#xe633;","&#xe632;","&#xe631;","&#xe630;","&#xe62f;","&#xe62e;","&#xe62d;","&#xe62c;","&#xe629;","&#xe628;","&#xe625;","&#xe623;","&#xe621;","&#xe620;","&#xe61f;","&#xe61c;","&#xe60b;","&#xe619;","&#xe61a;","&#xe603;","&#xe602;","&#xe617;","&#xe615;","&#xe614;","&#xe613;","&#xe612;","&#xe611;","&#xe60f;","&#xe60e;","&#xe60d;","&#xe60c;","&#xe60a;","&#xe609;","&#xe605;","&#xe607;","&#xe606;","&#xe604;","&#xe600;","&#xe658;","&#x1007;","&#x1006;","&#x1005;","&#xe608;"]; + } + } + }; + + a.init(); + return new IconPicker(); + }; + + /** + * 选中图标 + * @param filter lay-filter + * @param iconName 图标名称,自动识别fontClass/unicode + */ + IconPicker.prototype.checkIcon = function (filter, iconName){ + var p = $('*[lay-filter='+ filter +']').next().find('.layui-iconpicker-item .layui-icon'), + c = iconName; + + if (c.indexOf('#xe') > 0){ + p.html(c); + } else { + p.html('').attr('class', 'layui-icon ' + c); + } + }; + + var iconPicker = new IconPicker(); + exports(_MOD, iconPicker); +}); \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/labelGeneration.css b/module-form/src/main/resources/static/form-design/modules/labelGeneration.css new file mode 100644 index 00000000..93d4707c --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/labelGeneration.css @@ -0,0 +1,4 @@ +.none-transition{ + transition: none; + -webkit-transition: none; +} diff --git a/module-form/src/main/resources/static/form-design/modules/labelGeneration.js b/module-form/src/main/resources/static/form-design/modules/labelGeneration.js new file mode 100644 index 00000000..849e8cfb --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/labelGeneration.js @@ -0,0 +1,256 @@ +layui.define(['form'], function(exports) { + var form = layui.form, + $ = layui.jquery, + layer = layui.layer, + index = 0, + oldId, + MOD_NAME = 'labelGeneration', + formField = { + label: { + id: '-1', + tag: "label", + }, + }, + labelGeneration = { + set: function(options) { + var that = this; + that.config = $.extend({}, that.config, options); + return that; + } + //事件监听 + , + on: function(events, callback) { + return layui.onevent.call(this, MOD_NAME, events, callback); + } + }, + Class = function(options) { + var that = this; + that.config = $.extend({}, that.config, labelGeneration.config, options); + that.render(); + }, + thisIns = function() { + var that = this, + options = that.config; + return { + reload: function(options) { + that.reload.call(that, options); + }, + getOptions: function() { + return options || null; + }, + getData: function() { + return options.data || null; + } + } + } + Class.prototype.config = { + version: "1.0.0", + Author: "谁家没一个小强", + generateId: 0, + data: [], + isEnter: false + }; + /* 自动生成ID 当前页面自动排序*/ + Class.prototype.autoId = function(tag) { + var that = this, + options = that.config; + options.generateId = options.generateId + 1; + return tag + '_' + options.generateId; + } + Class.prototype.components = { + label: { + render: function(json, options) { + var _html = '
    '; + _html += '
    '; + _html += ''; + _html += '
    '; + if (options.isEnter) { + _html += ''.format(json.id); + } else { + _html += ''.format(json.id); + } + _html += '
    '; + if (!options.isEnter) { + _html += ''.format(json.id); + } + _html += ''; + _html += '
    '; + _html += ''; + _html += '
    '; + _html += '
    '; + _html += '
    '.format(json.id); + _html += '
    '; + return _html; + }, + update: function(json) {}, + /* 获取对象 */ + jsonData: function(id, that) { + //分配一个新的ID + var _json = JSON.parse(JSON.stringify(formField.label)); + _json.id = id == undefined ? that.autoId(_json.tag) : id; + that.checkId(_json, that); + return _json; + } + } + }; + /* 判定id是否重复*/ + Class.prototype.checkId = function(json, that) { + if ($("#" + json.id + "-content").length != 0) { + json.id = that.autoId(json.tag); + that.checkId(json); + } else { + return; + } + } + Class.prototype.bindGridSortEvent = function(json) { + var that = this, + options = that.config; + var formItemSort = Sortable.create(document.getElementById(json.id + "-content"), { + group: { + name: 'group' + json.id + }, + animation: 1000, + onEnd: function(evt) { + var _values = $("#" + json.id + "-content").find("div"); + var ops = []; + for (var i = 0; i < _values.length; i++) { + ops.push({ + "ngColor": $(_values[i]).attr("ng-color"), + "value": $(_values[i]).text() + }); + } + options.data = ops; + } + }); + } + /* 绑定事件*/ + Class.prototype.deleteValue = function(value, ngValue) { + var that = this, + options = that.config; + for (var i = 0; i < options.data.length; i++) { + if (options.data[i].value === value && options.data[i].ngColor === ngValue) { + options.data.splice(i, 1); + break; + } + } + } + /* 绑定事件*/ + Class.prototype.bindPropertyEvent = function(_json) { + var that = this, + options = that.config; + var colorClass = ""; + if (options.isEnter) { + $("#" + _json.id).keypress(function(event) { + if (event.which === 13) { + var _value = $(this).val(); + if (_value === "") { + layer.msg('标签值不能为空'); + return; + } + index = index + 1; + var _html = '
    {1}
    '.format(colorClass, _value, _json.id + index, index); + $("#" + _json.id + "-content").append(_html); + options.data.push({ + "ngColor": colorClass, + "value": _value + }); + $("#" + _json.id + index + " .layui-icon-close").click(function() { + that.deleteValue($(this).parent().text(), $(this).parent().attr("ng-color")); + $(this).parent().remove(); + }); + return false; + } + }); + } else { + $("#" + _json.id + "-button").click(function(event) { + var _value = $("#" + _json.id).val(); + if (_value === "") { + layer.msg('标签值不能为空'); + return; + } + index = index + 1; + var _html = '
    {1}
    '.format(colorClass, _value, _json.id + index, index); + $("#" + _json.id + "-content").append(_html); + options.data.push({ + "ngColor": colorClass, + "value": _value + }); + $("#" + _json.id + index + " .layui-icon-close").click(function() { + that.deleteValue($(this).parent().text(), $(this).parent().attr("ng-color")); + $(this).parent().remove(); + }); + }); + } + form.on('select(' + _json.id + '-switchTest)', function(data) { + colorClass = data.value; + }); + for (var i = 0; i < options.data.length; i++) { + index = index + 1; + var _html = '
    {1}
    '.format(options.data[i].ngColor, options.data[i].value, _json.id + index, index); + $("#" + _json.id + "-content").append(_html); + $("#" + _json.id + index + " .layui-icon-close").click(function() { + that.deleteValue($(this).parent().text(), $(this).parent().attr("ng-color")); + $(this).parent().remove(); + }); + } + } + /* 渲染组件 */ + Class.prototype.renderComponents = function() { + var that = this, + options = that.config; + var elem = $(options.elem); + elem.empty(); + var jsonData = that.components['label'].jsonData(undefined, that); + elem.append(that.components['label'].render(jsonData, options)); + that.bindPropertyEvent(jsonData); + that.bindGridSortEvent(jsonData); + form.render(); + } + Class.prototype.reload = function(options) { + var that = this; + options = options || {}; //如果是空的话,就赋值 {} + that.config = $.extend({}, that.config, labelGeneration.config, options); + that.render(options); + } + //核心入口 初始化一个 regionSelect 类 + labelGeneration.render = function(options) { + var ins = new Class(options); + return thisIns.call(ins); + } + /** + * 渲染组件 + */ + Class.prototype.render = function(options) { + var that = this, + options = that.config; + that.renderComponents(); + } + String.prototype.format = function(args) { + var result = this; + if (arguments.length > 0) { + if (arguments.length == 1 && typeof(args) == "object") { + for (var key in args) { + if (args[key] != undefined) { + var reg = new RegExp("({" + key + "})", "g"); + result = result.replace(reg, args[key]); + } + } + } else { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] != undefined) { + var reg = new RegExp("({[" + i + "]})", "g"); + result = result.replace(reg, arguments[i]); + } + } + } + } + return result; + } + exports(MOD_NAME, labelGeneration); +}); \ No newline at end of file diff --git a/module-form/src/main/resources/static/form-design/modules/xmSelect.js b/module-form/src/main/resources/static/form-design/modules/xmSelect.js new file mode 100644 index 00000000..2f104685 --- /dev/null +++ b/module-form/src/main/resources/static/form-design/modules/xmSelect.js @@ -0,0 +1,8 @@ +/*! + * @Title: xm-select + * @Version: 1.1.8 + * @Description:基于layui的多选解决方案 + * @Site: https://gitee.com/maplemei/xm-select + * @Author: maplemei + * @License:Apache License 2.0 + */!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="./",n(n.s=213)}({104:function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,o=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,(function(e,t){var r,i=t.trim().replace(/^"(.*)"$/,(function(e,t){return t})).replace(/^'(.*)'$/,(function(e,t){return t}));return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(r=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:o+i.replace(/^\.\//,""),"url("+JSON.stringify(r)+")")}))}},213:function(e,t,n){"use strict";n.r(t),function(e){n(215),n(216),n(218);var t=n(65);window.addEventListener("click",(function(){Object.keys(t.b).forEach((function(e){var n=t.b[e];n&&n.closed&&n.closed()}))})),"object"===("undefined"==typeof exports?"undefined":_typeof(exports))?e.exports=t.c:"function"==typeof define&&n(220)?define(xmSelect):window.layui&&layui.define&&layui.define((function(e){e("xmSelect",t.c)})),window.xmSelect=t.c}.call(this,n(214)(e))},214:function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},215:function(e,t){Array.prototype.map||(Array.prototype.map=function(e,t){var n,o,r,i=Object(this),l=i.length>>>0;for(t&&(n=t),o=new Array(l),r=0;r>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(n=t),o=0;o>>0;if("function"!=typeof e)throw new TypeError;for(var o=[],r=arguments[1],i=0;i>>0,r=arguments[1],i=0;i .xm-tips {\n color: #999999;\n padding: 0 10px;\n position: absolute;\n display: flex;\n height: 100%;\n align-items: center;\n}\nxm-select > .xm-icon {\n display: inline-block;\n overflow: hidden;\n position: absolute;\n width: 0;\n height: 0;\n right: 10px;\n top: 50%;\n margin-top: -3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-top-color: #C2C2C2;\n border-top-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n}\nxm-select > .xm-icon-expand {\n margin-top: -9px;\n transform: rotate(180deg);\n}\nxm-select > .xm-label.single-row {\n position: absolute;\n top: 0;\n bottom: 0px;\n left: 0px;\n right: 30px;\n overflow: auto hidden;\n}\nxm-select > .xm-label.single-row .scroll {\n overflow-y: hidden;\n}\nxm-select > .xm-label.single-row .label-content {\n flex-wrap: nowrap;\n}\nxm-select > .xm-label.auto-row .label-content {\n flex-wrap: wrap;\n}\nxm-select > .xm-label.auto-row .xm-label-block > span {\n white-space: unset;\n height: 100%;\n}\nxm-select > .xm-label .scroll .label-content {\n display: flex;\n padding: 3px 30px 3px 10px;\n}\nxm-select > .xm-label .xm-label-block {\n display: flex;\n position: relative;\n padding: 0px 5px;\n margin: 2px 5px 2px 0;\n border-radius: 3px;\n align-items: baseline;\n color: #FFF;\n}\nxm-select > .xm-label .xm-label-block > span {\n display: flex;\n color: #FFF;\n white-space: nowrap;\n}\nxm-select > .xm-label .xm-label-block > i {\n color: #FFF;\n margin-left: 8px;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n}\nxm-select > .xm-label .xm-label-block.disabled {\n background-color: #C2C2C2 !important;\n cursor: no-drop !important;\n}\nxm-select > .xm-label .xm-label-block.disabled > i {\n cursor: no-drop !important;\n}\nxm-select > .xm-body {\n position: absolute;\n left: 0;\n top: 42px;\n padding: 5px 0;\n z-index: 999;\n width: 100%;\n min-width: fit-content;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n animation-name: xm-upbit;\n animation-duration: 0.3s;\n animation-fill-mode: both;\n}\nxm-select > .xm-body .scroll-body {\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar {\n width: 8px;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-track {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #FFF;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-thumb {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #C2C2C2;\n}\nxm-select > .xm-body.up {\n top: auto;\n bottom: 42px;\n}\nxm-select > .xm-body.relative {\n position: relative;\n display: block !important;\n top: 0;\n box-shadow: none;\n border: none;\n animation-name: none;\n animation-duration: 0;\n min-width: 100%;\n}\nxm-select > .xm-body .xm-group {\n cursor: default;\n}\nxm-select > .xm-body .xm-group-item {\n display: inline-block;\n cursor: pointer;\n padding: 0 10px;\n color: #999;\n font-size: 12px;\n}\nxm-select > .xm-body .xm-option {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 10px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-option-icon {\n color: transparent;\n display: flex;\n border: 1px solid #E6E6E6;\n border-radius: 3px;\n justify-content: center;\n align-items: center;\n}\nxm-select > .xm-body .xm-option-icon.xm-icon-danx {\n border-radius: 100%;\n}\nxm-select > .xm-body .xm-option-content {\n display: flex;\n position: relative;\n padding-left: 15px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #666;\n width: calc(100% - 20px);\n}\nxm-select > .xm-body .xm-option.hide-icon .xm-option-content {\n padding-left: 0;\n}\nxm-select > .xm-body .xm-option.selected.hide-icon .xm-option-content {\n color: #FFF !important;\n}\nxm-select > .xm-body .xm-option .loader {\n width: 0.8em;\n height: 0.8em;\n margin-right: 6px;\n color: #C2C2C2;\n}\nxm-select > .xm-body .xm-select-empty {\n text-align: center;\n color: #999;\n}\nxm-select > .xm-body .disabled {\n cursor: no-drop;\n}\nxm-select > .xm-body .disabled:hover {\n background-color: #FFF;\n}\nxm-select > .xm-body .disabled .xm-option-icon {\n border-color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled .xm-option-content {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled.selected > .xm-option-icon {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .xm-search {\n background-color: #FFF !important;\n position: relative;\n padding: 0 10px;\n margin-bottom: 5px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-search > i {\n position: absolute;\n color: #666;\n}\nxm-select > .xm-body .xm-search-input {\n border: none;\n border-bottom: 1px solid #E6E6E6;\n padding-left: 27px;\n cursor: text;\n}\nxm-select > .xm-body .xm-paging {\n padding: 0 10px;\n display: flex;\n margin-top: 5px;\n}\nxm-select > .xm-body .xm-paging > span:first-child {\n border-radius: 2px 0 0 2px;\n}\nxm-select > .xm-body .xm-paging > span:last-child {\n border-radius: 0 2px 2px 0;\n}\nxm-select > .xm-body .xm-paging > span {\n display: flex;\n flex: auto;\n justify-content: center;\n vertical-align: middle;\n margin: 0 -1px 0 0;\n background-color: #fff;\n color: #333;\n font-size: 12px;\n border: 1px solid #e2e2e2;\n flex-wrap: nowrap;\n width: 100%;\n overflow: hidden;\n min-width: 50px;\n}\nxm-select > .xm-body .xm-toolbar {\n padding: 0 10px;\n display: flex;\n margin: -3px 0;\n cursor: default;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag {\n cursor: pointer;\n display: flex;\n margin-right: 20px;\n color: #666;\n align-items: baseline;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:hover {\n opacity: 0.8;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:active {\n opacity: 1;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag > i {\n margin-right: 2px;\n font-size: 14px;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:last-child {\n margin-right: 0;\n}\nxm-select > .xm-body .xm-body-custom {\n line-height: initial;\n cursor: default;\n}\nxm-select > .xm-body .xm-body-custom * {\n box-sizing: initial;\n}\nxm-select > .xm-body .xm-tree {\n position: relative;\n}\nxm-select > .xm-body .xm-tree-icon {\n display: inline-block;\n margin-right: 3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-left-color: #C2C2C2;\n border-left-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n z-index: 2;\n visibility: hidden;\n}\nxm-select > .xm-body .xm-tree-icon.expand {\n margin-top: 3px;\n margin-right: 5px;\n margin-left: -2px;\n transform: rotate(90deg);\n}\nxm-select > .xm-body .xm-tree-icon.xm-visible {\n visibility: visible;\n}\nxm-select > .xm-body .xm-tree .left-line {\n position: absolute;\n left: 13px;\n width: 0;\n z-index: 1;\n border-left: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .top-line {\n position: absolute;\n left: 13px;\n height: 0;\n z-index: 1;\n border-top: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .xm-tree-icon + .top-line {\n margin-left: 1px;\n}\nxm-select > .xm-body .scroll-body > .xm-tree > .xm-option > .top-line,\nxm-select > .xm-body .scroll-body > .xm-option > .top-line {\n width: 0 !important;\n}\nxm-select > .xm-body .xm-cascader-box {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n padding: 5px 0;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n margin: -1px;\n}\nxm-select > .xm-body .xm-cascader-box::before {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #E6E6E6;\n top: 10px;\n left: -12px;\n}\nxm-select > .xm-body .xm-cascader-box::after {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #fff;\n top: 10px;\n left: -11px;\n}\nxm-select > .xm-body .xm-cascader-scroll {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body.cascader {\n width: unset;\n min-width: unset;\n}\nxm-select > .xm-body.cascader .xm-option-content {\n padding-left: 8px;\n}\nxm-select > .xm-body.cascader .disabled .xm-right-arrow {\n color: #C2C2C2 !important;\n}\nxm-select .xm-input {\n cursor: pointer;\n border-radius: 2px;\n border-width: 1px;\n border-style: solid;\n border-color: #E6E6E6;\n display: block;\n width: 100%;\n box-sizing: border-box;\n background-color: #FFF;\n line-height: 1.3;\n padding-left: 10px;\n outline: 0;\n user-select: text;\n -ms-user-select: text;\n -moz-user-select: text;\n -webkit-user-select: text;\n}\nxm-select .dis {\n display: none;\n}\nxm-select .loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n}\nxm-select .loader {\n border: 0.2em dotted currentcolor;\n border-radius: 50%;\n -webkit-animation: 1s loader linear infinite;\n animation: 1s loader linear infinite;\n display: inline-block;\n width: 1em;\n height: 1em;\n color: inherit;\n vertical-align: middle;\n pointer-events: none;\n}\nxm-select .xm-select-default {\n position: absolute;\n width: 100%;\n height: 100%;\n border: none;\n visibility: hidden;\n}\nxm-select .xm-select-disabled {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n cursor: no-drop;\n z-index: 2;\n opacity: 0.3;\n background-color: #FFF;\n}\nxm-select .item--divided {\n border-top: 1px solid #ebeef5;\n width: calc(100% - 20px);\n cursor: initial;\n}\nxm-select .xm-right-arrow {\n position: absolute;\n color: #666;\n right: 5px;\n top: -1px;\n font-weight: 700;\n transform: scale(0.6, 1);\n}\nxm-select .xm-right-arrow::after {\n content: '>';\n}\nxm-select[size='large'] {\n min-height: 40px;\n line-height: 40px;\n}\nxm-select[size='large'] .xm-input {\n height: 40px;\n}\nxm-select[size='large'] .xm-label .scroll .label-content {\n line-height: 34px;\n}\nxm-select[size='large'] .xm-label .xm-label-block {\n height: 30px;\n line-height: 30px;\n}\nxm-select[size='large'] .xm-body .xm-option .xm-option-icon {\n height: 20px;\n width: 20px;\n font-size: 20px;\n}\nxm-select[size='large'] .xm-paging > span {\n height: 34px;\n line-height: 34px;\n}\nxm-select[size='large'] .xm-tree .left-line {\n height: 100%;\n bottom: 20px;\n}\nxm-select[size='large'] .xm-tree .left-line-group {\n height: calc(100% - 40px);\n}\nxm-select[size='large'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 19px;\n}\nxm-select[size='large'] .item--divided {\n margin: 10px;\n}\nxm-select {\n min-height: 36px;\n line-height: 36px;\n}\nxm-select .xm-input {\n height: 36px;\n}\nxm-select .xm-label .scroll .label-content {\n line-height: 30px;\n}\nxm-select .xm-label .xm-label-block {\n height: 26px;\n line-height: 26px;\n}\nxm-select .xm-body .xm-option .xm-option-icon {\n height: 18px;\n width: 18px;\n font-size: 18px;\n}\nxm-select .xm-paging > span {\n height: 30px;\n line-height: 30px;\n}\nxm-select .xm-tree .left-line {\n height: 100%;\n bottom: 18px;\n}\nxm-select .xm-tree .left-line-group {\n height: calc(100% - 36px);\n}\nxm-select .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 17px;\n}\nxm-select .item--divided {\n margin: 9px;\n}\nxm-select[size='small'] {\n min-height: 32px;\n line-height: 32px;\n}\nxm-select[size='small'] .xm-input {\n height: 32px;\n}\nxm-select[size='small'] .xm-label .scroll .label-content {\n line-height: 26px;\n}\nxm-select[size='small'] .xm-label .xm-label-block {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='small'] .xm-body .xm-option .xm-option-icon {\n height: 16px;\n width: 16px;\n font-size: 16px;\n}\nxm-select[size='small'] .xm-paging > span {\n height: 26px;\n line-height: 26px;\n}\nxm-select[size='small'] .xm-tree .left-line {\n height: 100%;\n bottom: 16px;\n}\nxm-select[size='small'] .xm-tree .left-line-group {\n height: calc(100% - 32px);\n}\nxm-select[size='small'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 15px;\n}\nxm-select[size='small'] .item--divided {\n margin: 8px;\n}\nxm-select[size='mini'] {\n min-height: 28px;\n line-height: 28px;\n}\nxm-select[size='mini'] .xm-input {\n height: 28px;\n}\nxm-select[size='mini'] .xm-label .scroll .label-content {\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-label .xm-label-block {\n height: 18px;\n line-height: 18px;\n}\nxm-select[size='mini'] .xm-body .xm-option .xm-option-icon {\n height: 14px;\n width: 14px;\n font-size: 14px;\n}\nxm-select[size='mini'] .xm-paging > span {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-tree .left-line {\n height: 100%;\n bottom: 14px;\n}\nxm-select[size='mini'] .xm-tree .left-line-group {\n height: calc(100% - 28px);\n}\nxm-select[size='mini'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 13px;\n}\nxm-select[size='mini'] .item--divided {\n margin: 7px;\n}\n.layui-form-pane xm-select {\n margin: -1px -1px -1px 0;\n}\n",""])},218:function(e,t,n){var o=n(219);"string"==typeof o&&(o=[[e.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(27)(o,r);o.locals&&(e.exports=o.locals)},219:function(e,t,n){(e.exports=n(26)(!1)).push([e.i,'@font-face {\n font-family: "xm-iconfont";\n src: url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056\');\n /* IE9 */\n src: url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056#iefix\') format(\'embedded-opentype\'), /* IE6-IE8 */ url(\'data:application/x-font-woff2;charset=utf-8;base64,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\') format(\'woff2\'), url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.woff?t=1574048839056\') format(\'woff\'), url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.ttf?t=1574048839056\') format(\'truetype\'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.svg?t=1574048839056#iconfont\') format(\'svg\');\n /* iOS 4.1- */\n}\n.xm-iconfont {\n font-family: "xm-iconfont" !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.xm-icon-quanxuan:before {\n content: "\\e62c";\n}\n.xm-icon-caidan:before {\n content: "\\e610";\n}\n.xm-icon-fanxuan:before {\n content: "\\e837";\n}\n.xm-icon-pifu:before {\n content: "\\e668";\n}\n.xm-icon-qingkong:before {\n content: "\\e63e";\n}\n.xm-icon-sousuo:before {\n content: "\\e600";\n}\n.xm-icon-danx:before {\n content: "\\e62b";\n}\n.xm-icon-duox:before {\n content: "\\e613";\n}\n.xm-icon-close:before {\n content: "\\e601";\n}\n.xm-icon-expand:before {\n content: "\\e641";\n}\n.xm-icon-banxuan:before {\n content: "\\e60d";\n}\n',""])},220:function(e,t){(function(t){e.exports=t}).call(this,{})},26:function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var r=function(e){var t=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),n="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t);return"/*# ".concat(n," */")}(o),i=o.sources.map((function(e){return"/*# sourceURL=".concat(o.sourceRoot).concat(e," */")}));return[n].concat(i).concat([r]).join("\n")}return[n].join("\n")}(t,e);return t[2]?"@media ".concat(t[2],"{").concat(n,"}"):n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var o={},r=0;r=0&&p.splice(t,1)}function x(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var o=function(){0;return n.nc}();o&&(e.attrs.nonce=o)}return y(t,e.attrs),m(e,t),t}function y(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function v(e,t){var n,o,r,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var l=u++;n=c||(c=x(t)),o=w.bind(null,n,l,!1),r=w.bind(null,n,l,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",y(t,e.attrs),m(e,t),t}(t),o=C.bind(null,n,t),r=function(){b(n),n.href&&URL.revokeObjectURL(n.href)}):(n=x(t),o=k.bind(null,n),r=function(){b(n)});return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=l()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=h(e,t);return f(n,t),function(e){for(var o=[],r=0;r3)for(n=[n],o=3;or?n-r:r,l=this.labelRef.scrollLeft+e.deltaY;l<0&&(l=0),l>i&&(l=i),this.labelRef.scrollLeft=l}}},{key:"componentDidMount",value:function(){this.labelRef.addEventListener&&this.labelRef.addEventListener("DOMMouseScroll",this.scrollFunc.bind(this),!1),this.labelRef.attachEvent&&this.labelRef.attachEvent("onmousewheel",this.scrollFunc.bind(this)),this.labelRef.onmousewheel=this.scrollFunc.bind(this)}},{key:"render",value:function(e){var t=this,n=e.data,o=e.prop,r=e.theme,i=e.model,l=e.sels,a=e.autoRow,c=o.name,u=o.disabled,p=i.label,d=p.type,f=p[d],h="",m=!0,b=l.map((function(e){return e[c]})).join(",");if("text"===d)h=l.map((function(e){return"".concat(f.left).concat(e[c]).concat(f.right)})).join(f.separator);else if("block"===d){m=!1;var x=N(l),y={backgroundColor:r.color},v=f.showCount<=0?x.length:f.showCount;h=x.splice(0,v).map((function(e){var n={width:f.showIcon?"calc(100% - 20px)":"100%"};return _("div",{class:["xm-label-block",e[u]?"disabled":""].join(" "),style:y},f.template&&s(f.template)?_("span",{style:n,dangerouslySetInnerHTML:{__html:f.template(e,x)}}):_("span",{style:n},e[c]),f.showIcon&&_("i",{class:"xm-iconfont xm-icon-close",onClick:t.iconClick.bind(t,e,!0,e[u])}))})),x.length&&h.push(_("div",{class:"xm-label-block",style:y},"+ ",x.length))}else h=l.length&&f&&f.template?f.template(n,l):l.map((function(e){return e[c]})).join(",");return _("div",{class:["xm-label",a?"auto-row":"single-row"].join(" ")},_("div",{class:"scroll",ref:function(e){return t.labelRef=e}},m?_("div",{class:"label-content",dangerouslySetInnerHTML:{__html:h}}):_("div",{class:"label-content",title:b},h)))}}])&&H(n.prototype,o),r&&H(n,r),t}(C);function Q(e){return(Q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function J(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function W(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function G(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.size;var e=this.state.pageIndex;e<=1||(this.changePageIndex(e-1),this.props.pageRemote&&this.postData(e-1,!0))}},{key:"pageNextClick",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.size,t=this.state.pageIndex;t>=e||(this.changePageIndex(t+1),this.props.pageRemote&&this.postData(t+1,!0))}},{key:"changePageIndex",value:function(e){this.setState({pageIndex:e})}},{key:"searchInput",value:function(e){var t=this,n=e.target.value;n!==this.__value&&(clearTimeout(this.searchCid),this.inputOver&&(this.__value=n,this.searchCid=setTimeout((function(){t.callback=!0,t.setState({filterValue:t.__value,remote:!0,pageIndex:1})}),this.props.delay)))}},{key:"focus",value:function(){this.searchInputRef&&this.searchInputRef.focus()}},{key:"blur",value:function(){this.searchInputRef&&this.searchInputRef.blur()}},{key:"handleComposition",value:function(e){var t=e.type;"compositionstart"===t?(this.inputOver=!1,clearTimeout(this.searchCid)):"compositionend"===t&&(this.inputOver=!0,this.searchInput(e))}},{key:"postData",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.pageIndex,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(this.state.remote||n)&&(this.callback=!1,this.setState({loading:!0,remote:!1}),this.blur(),this.props.remoteMethod(this.state.filterValue,(function(t,n){e.focus(),e.callback=!0,e.setState({loading:!1,totalSize:n}),e.props.onReset(t,"data")}),this.props.show,t))}},{key:"keydown",value:function(e,t){var n=this,o=t.keyCode;"div"===e&&(27===o||9===o?this.props.onReset(!1,"close"):37===o?this.pagePrevClick():39===o&&this.pageNextClick());var r=this.props.prop,i=r.value,l=r.optgroup,a=r.disabled,s=this.tempData.filter((function(e){return!e[l]&&!e[a]})),c=s.length-1;if(-1!==c){var u=s.findIndex((function(e){return e[i]===n.state.val}));if(38===o){u<=0?u=c:u>0&&(u-=1);var p=s[u][i];this.setState({val:p})}else if(40===o){-1===u||u===c?u=0:uD&&(M=D),D>0&&M<=0&&(M=1),!v){var T=(M-1)*e.pageSize,z=T+e.pageSize;S=S.slice(T,z)}var L={cursor:"no-drop",color:"#d2d2d2"},V={},F={};M<=1&&(V=L),M==D&&(F=L),this.state.pageIndex!==M&&this.changePageIndex(M),this.size=D,I=_("div",{class:"xm-paging"},_("span",{style:V,onClick:this.pagePrevClick.bind(this,D)},"上一页"),_("span",null,this.state.pageIndex," / ",D),_("span",{style:F,onClick:this.pageNextClick.bind(this,D)},"下一页"))}else e.showCount>0&&(S=S.slice(0,e.showCount));var U,B=[],N={__tmp:!0};N[O]=!0,S.forEach((function(e){var t=P[e[w]];U&&!t&&(t=N),t!=U&&(U=t,t&&B.push(U)),B.push(e)})),S=B,t&&(t=y(this.state.filterValue,c([],S)))&&S.splice(0,0,function(e){for(var t=1;t0||f.lazy&&!1!==e.__node.loading)?"xm-visible":"xm-hidden"].join(" "),C=[];f.showFolderIcon&&(C.push(_("i",{class:w})),f.showLine&&(o&&C.push(_("i",{class:"left-line",style:{left:t-f.indent+3+"px"}})),C.push(_("i",{class:"top-line",style:{left:t-f.indent+3+"px",width:f.indent+(0===o?10:-2)+"px"}}))));var O=function(t){"mouseenter"===t.type&&(e[v]||n.setState({val:e[y]}))};return _("div",{class:m,style:h,value:e[y],onClick:n.optionClick.bind(n,e,r,e[v],"line"),onMouseEnter:O,onMouseLeave:O},C,e.__node.loading&&_("span",{class:"loader"}),k&&_("i",{class:b,style:u,onClick:n.optionClick.bind(n,e,r,e[v],"checkbox")}),_("div",{class:"xm-option-content",dangerouslySetInnerHTML:{__html:p({data:d,item:e,arr:i,name:e[x],value:e[y]})}}))};h&&(m?this.postData():this.filterData(d,this.state.filterValue));var O=c([],d),S=c([],i);this.tempData=O;var j=d.map((function(e){return function e(t,o){if(!t.__node.hidn){var r=t[g];if(o+=f.indent,r){var i=-1!==n.state.expandedKeys.findIndex((function(e){return t[y]===e}));return 0===r.length&&(i=!1),_("div",{class:"xm-tree"},f.showFolderIcon&&f.showLine&&i&&r.length>0&&_("i",{class:"left-line left-line-group",style:{left:o+3+"px"}}),C(t,o,0===r.length&&(!f.lazy||f.lazy&&!1===t.__node.loading)?0:i),i&&_("div",{class:"xm-tree-box"},r.map((function(t){return e(t,o)}))))}return C(t,o,0)}}(e,10-f.indent)})).filter((function(e){return e}));function E(e,t){t.forEach((function(t){return t[w]?(!f.strict&&e.push(t),E(e,t[g])):e.push(t)}))}var A=_("div",{class:"xm-toolbar"},e.toolbar.list.map((function(t){var r,c=e.languageProp.toolbar[t];r="ALL"===t?{icon:"xm-iconfont xm-icon-quanxuan",name:c,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[v]})),n.props.onReset(a?t.slice(0,1):u(t,i,o),"treeData")}}:"CLEAR"===t?{icon:"xm-iconfont xm-icon-qingkong",name:c,method:function(e){n.props.onReset(i.filter((function(e){return e[o.disabled]})),"treeData")}}:"REVERSE"===t?{icon:"xm-iconfont xm-icon-fanxuan",name:c,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[v]}));var r=[];i.forEach((function(e){var n=t.findIndex((function(t){return t[y]===e[y]}));-1==n?r.push(e):t.splice(n,1)})),n.props.onReset(a?r.slice(0,1):u(t,r,o),"treeData")}}:t;var p=function(e){"mouseenter"===e.type&&(e.target.style.color=l.color),"mouseleave"===e.type&&(e.target.style.color="")};return _("div",{class:"toolbar-tag",onClick:function(){s(r.method)&&r.method(O,S)},onMouseEnter:p,onMouseLeave:p},e.toolbar.showIcon&&_("i",{class:r.icon}),_("span",null,r.name))})).filter((function(e){return e}))),R=_("div",{class:h?"xm-search":"xm-search dis"},_("i",{class:"xm-iconfont xm-icon-sousuo"}),_("input",{class:"xm-input xm-search-input",placeholder:b}));return j.length||j.push(_("div",{class:"xm-select-empty"},r)),_("div",{onClick:this.blockClick,class:"xm-body-tree"},e.toolbar.show&&A,R,_("div",{class:"scroll-body",style:{maxHeight:e.height}},j),this.state.loading&&_("div",{class:"loading"},_("span",{class:"loader"})))}},{key:"componentDidMount",value:function(){var e=this.base.querySelector(".xm-search-input");e&&(e.addEventListener("compositionstart",this.handleComposition.bind(this)),e.addEventListener("compositionupdate",this.handleComposition.bind(this)),e.addEventListener("compositionend",this.handleComposition.bind(this)),e.addEventListener("input",this.searchInput.bind(this)),this.searchInputRef=e)}},{key:"componentDidUpdate",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;s(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&ue(n.prototype,o),r&&ue(n,r),t}(C);function be(e){return(be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function xe(e,t){for(var n=0;n1&&(n=n.slice(0,1)),this.setState({sels:n,dataObj:a,flatData:s})}return this.setState({data:o}),n}},{key:"exchangeValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state.dataObj,o=e.map((function(e){return"object"===Se(e)?Ce({},e,{__node:{}}):n[e]})).filter((function(e){return e})),r=!0,i=this.props.tree;return i.show&&!1===i.strict&&(r=!1),r&&(o=o.filter((function(e){return!0!==e[t.props.prop.optgroup]}))),o}},{key:"value",value:function(e,t,n){!1!==t&&!0!==t&&(t=this.state.show);var o=this.props,r=o.prop,i=o.tree,l=this.exchangeValue(e);if(i.show&&i.strict){var a=this.state.data;this.clearAndReset(a,l),l=this.init({data:a,prop:r},!0)}this.resetSelectValue(l,l,!0,n),this.setState({show:t})}},{key:"clearAndReset",value:function(e,t){var n=this,o=this.props.prop,r=o.selected,i=o.children,l=o.value;e.forEach((function(e){e[r]=-1!=t.findIndex((function(t){return t[l]===e[l]}));var o=e[i];o&&a(o)&&n.clearAndReset(o,t)}))}},{key:"load",value:function(e,t,n,o){var r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,l=this.props,s=l.prop,c=l.tree,u=s.children,p=s.optgroup,d=s.value,f=s.selected,h=s.disabled;e.forEach((function(e){e.__node={parent:o,level:i,loading:e.__node&&e.__node.loading},t[e[d]]=e,n.push(e);var l=e[u];if(l&&a(l)){var s=l.length;if(s>0){r.load(l,t,n,e,i+1),e[p]=!0,c.strict&&(!0===e[f]&&(delete e[f],l.forEach((function(e){return e[f]=!0}))),!0===e[h]&&(delete e[h],l.forEach((function(e){return e[h]=!0}))));var m=l.filter((function(e){return!0===e[f]||!0===e.__node.selected})).length;e.__node.selected=m===s,e.__node.half=m>0&&m0,e.__node.disabled=l.filter((function(e){return!0===e[h]||!0===e.__node.disabled})).length===s}}}))}},{key:"resetSelectValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=this.props.on;if(s(r)&&this.prepare&&o){var i=r({arr:e,change:t,isAdd:n});if(a(i))return this.value(i,null,!1)}this.setState({sels:e})}},{key:"updateBorderColor",value:function(e){this.setState({tmpColor:e})}},{key:"treeHandler",value:function(e,t,n,o){var r=this,i=this.props.prop,l=i.value,a=(i.selected,i.disabled),s=i.children,c=i.optgroup,u=t[s];u.filter((function(e){return!(e[a]||e.__node.disabled)})).forEach((function(t){if(t[c])r.treeHandler(e,t,n,o);else{var i=e.findIndex((function(e){return e[l]==t[l]}));"del"===o?-1!=i&&(e.splice(i,1),n.push(t)):"half"!==o&&"add"!==o||-1==i&&(e.push(t),n.push(t))}}));var p=u.length,d=u.filter((function(t){return-1!==e.findIndex((function(e){return e[l]===t[l]}))||!0===t.__node.selected})).length;t.__node.selected=d===p,t.__node.half=d>0&&d0&&h.length>=g)return this.updateBorderColor(i.maxColor),void(d&&s(d)&&d(h,e));h=a?[e]:[].concat(we(h),[e]),this.resetSelectValue(h,[e],!t)}else{var _=h.findIndex((function(t){return t[m]==e[m]}));-1!=_&&(h.splice(_,1),this.resetSelectValue(h,[e],!t))}var w,k=e.__node.parent;if(k){for(;k;){var C=k[b],O=C.length,S=C.filter((function(e){return-1!==h.findIndex((function(t){return t[m]===e[m]}))||!0===e.__node.selected})).length;k.__node.selected=S===O,k.__node.half=S>0&&S0,k=k.__node.parent}this.setState({data:this.state.data})}u&&!o&&this.onClick()}}},{key:"onClick",value:function(e){var t=this;if("relative"!==this.props.model.type)if(this.props.disabled)!1!==this.state.show&&this.setState({show:!1});else{var n=!this.state.show;if(n){if(this.props.show&&0==this.props.show())return;Object.keys(Be).filter((function(e){return e!=t.props.el})).forEach((function(e){return Be[e].closed()}))}else{if(this.props.hide&&0==this.props.hide())return;this.bodyView.scroll&&this.bodyView.scroll(0,0)}this.setState({show:n}),e&&e.stopPropagation()}}},{key:"onReset",value:function(e,t){var n=this;if("data"===t){var o=e.filter((function(e){return!0===e[n.props.prop.selected]}));this.resetSelectValue(u(o,this.state.sels,this.props.prop),o,!0);var r=[];this.load(e,{},r),this.setState({data:e,flatData:r})}else"sels"===t?this.resetSelectValue(e,e,!0):"append"===t?this.append(e):"delete"===t?this.del(e):"auto"===t?this.auto(e):"treeData"===t?this.value(e,null,!0):"close"===t?this.onClick():"class"===t&&this.setState({bodyClass:e})}},{key:"append",value:function(e){var t=this.exchangeValue(e);this.resetSelectValue(u(t,this.state.sels,this.props.prop),t,!0)}},{key:"del",value:function(e){var t=this.props.prop.value,n=this.state.sels;(e=this.exchangeValue(e)).forEach((function(e){var o=n.findIndex((function(n){return n[t]===e[t]}));-1!=o&&n.splice(o,1)})),this.resetSelectValue(n,e,!1)}},{key:"auto",value:function(e){var t=this,n=this.props.prop.value;e.filter((function(e){return-1!=t.state.sels.findIndex((function(t){return t[n]===e[n]}))})).length==e.length?this.del(e):this.append(e)}},{key:"componentWillReceiveProps",value:function(e){this.init(e,e.updateData)}},{key:"componentWillMount",value:function(){this.init(this.props,!0)}},{key:"render",value:function(e,t){var n=this,o=e.theme,r=e.prop,i=(e.radio,e.repeat,e.clickClose,e.on,e.max,e.maxMethod,e.content),l=e.disabled,a=e.tree,s={borderColor:o.color},c=t.data,u=t.dataObj,p=t.flatData,d=t.sels,f=t.show,h=t.tmpColor,m=t.bodyClass;l&&(f=!1);var b={style:Ce({},e.style,{},f?s:{}),onClick:this.onClick.bind(this),ua:-1!=navigator.userAgent.indexOf("Mac OS")?"mac":"win",size:e.size,tabindex:1};h&&(b.style.borderColor=h,setTimeout((function(){b.style.borderColor="",n.updateBorderColor("")}),300)),r.value;var x=Ce({},e,{data:c,sels:d,ck:this.itemClick.bind(this),title:d.map((function(e){return e[r.name]})).join(",")}),y=Ce({},e,{data:c,dataObj:u,flatData:p,sels:d,ck:this.itemClick.bind(this),show:f,onReset:this.onReset.bind(this)}),v=i?_(se,y):a.show?_(me,y):e.cascader.show?_(_e,y):_(ne,y);return _("xm-select",b,_("input",{class:"xm-select-default","lay-verify":e.layVerify,"lay-verType":e.layVerType,name:e.name,value:d.map((function(e){return e[r.value]})).join(",")}),_("i",{class:f?"xm-icon xm-icon-expand":"xm-icon"}),0===d.length&&_("div",{class:"xm-tips"},e.tips),_(Z,x),_("div",{class:["xm-body",m,e.model.type,f?"":"dis"].join(" "),ref:function(e){return n.bodyView=e}},v),l&&_("div",{class:"xm-select-disabled"}))}},{key:"componentDidMount",value:function(){var e=this;this.prepare=!0,this.base.addEventListener("keydown",(function(t){13===t.keyCode&&e.onClick()})),this.input=this.base.querySelector(".xm-select-default");var t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;t&&new t((function(t){t.forEach((function(t){"attributes"==t.type&&"class"===t.attributeName&&-1!==e.input.className.indexOf("layui-form-danger")&&(e.input.className="xm-select-default",e.base.style.borderColor=e.props.theme.maxColor)}))})).observe(this.input,{attributes:!0});for(var n=this.base;n;){if("FORM"===n.tagName){var o=n.querySelector('button[type="reset"]');o&&o.addEventListener("click",(function(t){e.init(e.props,!0)}));break}n=n.parentElement}}},{key:"componentDidUpdate",value:function(){var e=this.props,t=e.direction;if("relative"!==e.model.type){var n=this.base.getBoundingClientRect();if("auto"===t){this.bodyView.style.display="block",this.bodyView.style.visibility="hidden";var o=this.bodyView.getBoundingClientRect().height;this.bodyView.style.display="",this.bodyView.style.visibility="";var r=n.y||n.top||0,i=document.documentElement.clientHeight-r-n.height-20;t=i>o||r0&&void 0!==arguments[0]?arguments[0]:"zn",t=De[e]||Ie;return{language:e,languageProp:t,data:[],content:"",name:"select",layVerify:"",layVerType:"",size:"medium",disabled:!1,initValue:null,create:null,tips:t.tips,empty:t.empty,delay:500,searchTips:t.searchTips,filterable:!1,filterMethod:function(e,t,n,o){return!e||-1!=t[o.name].indexOf(e)},remoteSearch:!1,remoteMethod:function(e,t){t([])},direction:"auto",style:{},height:"200px",autoRow:!1,paging:!1,pageSize:10,pageEmptyShow:!0,pageRemote:!1,radio:!1,repeat:!1,clickClose:!1,max:0,maxMethod:function(e,t){},showCount:0,toolbar:{show:!1,showIcon:!0,list:["ALL","CLEAR"]},tree:{show:!1,showFolderIcon:!0,showLine:!0,indent:20,expandedKeys:[],strict:!0,lazy:!1,load:null},cascader:{show:!1,indent:100,strict:!0},prop:{name:"name",value:"value",selected:"selected",disabled:"disabled",children:"children",optgroup:"optgroup",click:"click"},theme:{color:"#009688",maxColor:"#e54d42",hover:"#f2f2f2"},model:{label:{type:"block",text:{left:"",right:"",separator:", "},block:{showCount:0,showIcon:!0,template:null},count:{template:function(e,t){return"已选中 ".concat(t.length," 项, 共 ").concat(e.length," 项")}}},icon:"show",type:"absolute"},show:function(){},hide:function(){},template:function(e){e.item,e.sels;var t=e.name;return e.value,t},on:function(e){e.arr,e.item,e.selected}}}(e.language),this.update(e)}},{key:"update",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!!e.data;this.options=c(this.options,e);var n=this.options.dom;if(n){var o=this.options.data||[];if("function"==typeof o&&(o=o(),this.options.data=o),a(o))return U(_(Pe,ze({},this.options,{updateData:t})),n),this;l("data数据必须为数组类型, 不能是".concat("undefined"==typeof data?"undefined":Le(data),"类型"))}else l("没有找到渲染对象: ".concat(e.el,", 请检查"))}},{key:"reset",value:function(){var e=this.options.el;return this.init(Ne[e]),He[e].init(this.options,!0),this}},{key:"opened",value:function(){var e=He[this.options.el];return!e.state.show&&e.onClick(),this}},{key:"closed",value:function(){var e=He[this.options.el];return e.state.show&&e.onClick(),this}},{key:"getValue",value:function(e){var t=this,n=He[this.options.el].state.sels.map((function(e){return delete(e=function(e){for(var t=1;t2&&void 0!==arguments[2]&&arguments[2];if(a(e))return He[this.options.el].value(this.options.radio?e.slice(0,1):e,t,n),this;l("请传入数组结构...")}},{key:"append",value:function(e){if(a(e))return He[this.options.el].append(e),this;l("请传入数组结构...")}},{key:"delete",value:function(e){if(a(e))return He[this.options.el].del(e),this;l("请传入数组结构...")}},{key:"warning",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e||this.options.theme.maxColor;return!0===t?He[this.options.el].base.style.borderColor=n:He[this.options.el].updateBorderColor(n),this}}])&&Ve(t.prototype,n),o&&Ve(t,o),e}();function Ue(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + \ No newline at end of file