diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..28dccd4 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/house_lease.iml b/.idea/house_lease.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/.idea/house_lease.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..2d9362f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1cd6847 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/161914 b/161914 new file mode 100644 index 0000000..7f8c609 --- /dev/null +++ b/161914 @@ -0,0 +1,50 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAeC5vEn9 +SINTfMNBSQmUZTAAAAGAAAAAEAAAIXAAAAB3NzaC1yc2EAAAADAQABAAACAQDtk5Pp1MJJ +jawtWDrOXwykKmD7AiEpZMjJ/h9aW0oOH+y/xWX095+5m90vLcKQTMApT0Ev4tgcFh/HJB +fL6btZRys3K64RtBm0zuAtKXzguupFiNZcthATiPGyQAmEbzyLHBB4dMfjWrkl6CMiW+yE +aC30GOOVHcOEQHZZ6oeP93O+kNJnhjxZqLWV7qyMHWez1jT+I5XRBOP4oS1lEfRDUjI4v4 +gDsDp/dlwO1vbOQsKysbxqT/fDJ0jvz3PEK8xWG7BpnJD6FH41l3NOK9+sFoF5DF4rY+I4 ++oimVZuP27f9EtDi30/Rk0av+VGJ4TlBtLWyIVK548K20e0svADqiMn0IjTHC6iBW6Stf6 +ze6VZf4Xk4oBhl2qXKNPaSo19Iru7FYeMJ03EVX5d+vFXHlBOpVqGkeiudHzewQPdb5bdt +cVR4A21nvALDBvh1867QxOyhI+Du95bFfzUZpZbhui3c2Go9ZtI9MejTEPL0Yf68UpNM/b +6q1jKGRsTbj/sHu5osd0fMawgTtQMVBbMPoz/96XjOaf+KwiCLQDmb8Jv5ZjuiE1tHMbTT +XhvXL2ke1jMzgY1fVGVPPyie+x7h1LVTikMTM2vnVNF7tFz7lC/7GH5Q1S5LEDMpNL3FCL +RDjmpA0J1tTGdp8FBNEIcZuqa0nlo7joSLTK88e87EqwAAB1C/PZQr9HF16Bo1vd6LgKKw +rXFlMC1yPPLv/hEBPicfholkxSDpohkFvzDZZ0A/cYqMMVZBfnr5uZ7gm5jfx3ry38Hcy3 +jhQ4W6JANCESHuL9e4DvVes+IYaHCgQeTpVQfRliQSurLrop5mvlFY350yhUBfK4QQWud5 +GbzJihKKyP029UnsRP8PjKWqdKMtURY0Gyl/9tQ3oGBonUE0i9hqkw3xUwL52Hf/OPnzTR +LToKBQTSStmCBSl774h8Gxuc6TcUsaUNnnPU5I/9Mrgofdns6lr0a0EjjQGzzBH4m+9sUx +OvwrOCMHZzkctTE5/RU20M19YuXEow1hg2LRe5YDrrFOjHbjj+Gt1ycEPclDehiBfg0dYq +o1DsSQMJ48JlVEQas2qjVjzgY1DVkbRA6juFdUnJ/J0Eu20QFExxJJX/3Pg7sRs3YS1hm9 +mmSuu/LP4iD9BedoizK9aisenc4iyq3+Kuy7p4INo5s2vKdTi7Hn+5p+NwdP8uwK0UYXqi +/lij7x618TFQTgndgL7CMJS/mF3FD2skfVA+0+L5uEql4KoXfwYbXeHgIZs9OP5UBceTPd +zKo7jzdj6PxhO3RfIyKshwBHphdUTe7WmUBrHzoJKl0lC5ZucIeiOjZBoucKHcCYywyIJb +zOmFclthjHk1qyBaNjgSXdKCORinmE+q1HRKomWP0hP3zJ+OHjBv9u4k0Cw1uhhFwi8V2c +ZbMnZhs7CL066MMP7/6kE1908IWwDVQt/ctitSrpsNrRl00+HOwuR1pEh19nzysad3xdyL +sCJoW7sqAieAR/gRT0esH2S8AivUUxYnzRHN8un+lG/K3TMR88mqKQ73lN4lFpm2uMEEBp +viMxeCjJUMMGrx4CnziRPQF+9eLjunuBI+T/jy1ru5HsDX12FE4L9nPZfKMCxPAFcXRe8+ +LGnzzvxMYOwRTzIgRSRxWQMmaTfncJRoQcCUfGsOxrFWoKCkP4TEsxZRJa5hYDt+7APcYO +/Hw1WtJEJz4/w/dEBCr+AxF5atVoNjZskJSVKSwzpcVC3MJD5gebnLW0x3TBO5ixBXiL80 +VlKoA7i9UnLQqHjJsYR0nwhS9sEXlZgelJ6zJSJ8q2Wzx3oqE9FxAofI1qha0pm3rSxuWp +fZXJVPx6MTCK2JthO3OAbK0qcYLdhUoKsVfa6QW64kG/rBexfDHFQbH8K6qDmYhoru2IVC +F42CSJfq8oUAOAxsUL/iT3ZpeezKXsfr43qZWQURrQWo37fSTg7eNm+ynDb9LA4JmmX7+Y +eRF8I0hHgFxoIJGMhtZYpxzxKwf3hUsWb6ABEhKaaU2EDpiCKIT7cNW1HGoFk1Dyodkrzg +e3tUTchQ5S45ENAFR/PAj/8NTwCDVH5vsKpUfizBgsQDngTotxdIMwoLRXQDeW11wkWpRf +u50Un4QKGNSFmSRsiz+HjIlIoxVciBcwgJ1781OatFy5GgVWUXyzI49k6Sa7NDUQy+nCic +3z4GV9kvYWO+Pv9oxt3tWll3xe0iq6zKsTItUt0ms1kIsZcBjAnrTcFDu7KMZHu0JA/W5P +5cQpIDboQ/hKzy1XTdx4bH7LxR+cXDNp9oVt5E0nnB5NvdhACPaNatIv+gwlB0pPwJ2EaD +KB45iLjoMEX/6XFVVa2Dlep01mo8hj9w9ENqi3fg3erzo3Wgz8VnKR5xS4+daCJhb9P6Mu +VtzkIt+8ixH54qBotweP5up0CNn+6gPtFdfV/Y5mdh8omrpRPpgACU45NemLduVJFNA5Ej +uT6T8mKQ58DlL48IdJUcPe+zTriCq2ln9mHXBf+yZZZGaVRi9isKwuYr4anpuCiehHe3cO +zgQufTIiTgpcCTmoZFws7rRjQwAeH4ykaNBfIbR+RfZxq0CHluOPBVDmAY5kYUTJT4CW9D +cLqk2F+d0rZMaBTz+giybzy3tIEn94Vq89E0o7U61RNvuKNGCLKpkY/rXuTGAZZUBon6tv +8FVj8Y+puEdaRy14oZIEEcvWjfwmMApvtrjuQ0czOZCgGmSN1SSshyAhNZCvR57N42lXKq +yg+7aTWdYp3TwYE+ciIEpRCZGBF2n4Qt9AnazL8xqXP62lFE7riG1hQvoQMXOh6WErtK4x +tmPZMXmSHpiRbhRIMs1qBunz0w7cDUcizIt6IqXk+vMYArMRMWakrl239lVxpag7Gzl+yQ +zZPfOa+iEbBHYzt5sBX7i+ETMP/qjXsn7DJu4pxak7nmpoHvcXgpTXOBHOsmJFxk1EE4Tp +txQz8Px7U+BeHpWxcai/83Kvt3OivL5IIltPI7CvqlKJpNWZFNBfhSjTtVLLlh71i1WD+U +StXnOcVf1Xf7Tbrll6+BeM4+w511et1vFEGSOyqw8XV75vMsmTjL5NqLH3ufutQ6HX6cLg +9hecHwkCbA0cleNhN1RB7aS0Lf0f6kkopeG2f3SilXuHmgsfhkLh6K5yZLyjqk4G4d/V4A +BK0Df2ueXfubC+lTf2R4VjCIM= +-----END OPENSSH PRIVATE KEY----- diff --git a/161914.pub b/161914.pub new file mode 100644 index 0000000..76eb8dd --- /dev/null +++ b/161914.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDtk5Pp1MJJjawtWDrOXwykKmD7AiEpZMjJ/h9aW0oOH+y/xWX095+5m90vLcKQTMApT0Ev4tgcFh/HJBfL6btZRys3K64RtBm0zuAtKXzguupFiNZcthATiPGyQAmEbzyLHBB4dMfjWrkl6CMiW+yEaC30GOOVHcOEQHZZ6oeP93O+kNJnhjxZqLWV7qyMHWez1jT+I5XRBOP4oS1lEfRDUjI4v4gDsDp/dlwO1vbOQsKysbxqT/fDJ0jvz3PEK8xWG7BpnJD6FH41l3NOK9+sFoF5DF4rY+I4+oimVZuP27f9EtDi30/Rk0av+VGJ4TlBtLWyIVK548K20e0svADqiMn0IjTHC6iBW6Stf6ze6VZf4Xk4oBhl2qXKNPaSo19Iru7FYeMJ03EVX5d+vFXHlBOpVqGkeiudHzewQPdb5bdtcVR4A21nvALDBvh1867QxOyhI+Du95bFfzUZpZbhui3c2Go9ZtI9MejTEPL0Yf68UpNM/b6q1jKGRsTbj/sHu5osd0fMawgTtQMVBbMPoz/96XjOaf+KwiCLQDmb8Jv5ZjuiE1tHMbTTXhvXL2ke1jMzgY1fVGVPPyie+x7h1LVTikMTM2vnVNF7tFz7lC/7GH5Q1S5LEDMpNL3FCLRDjmpA0J1tTGdp8FBNEIcZuqa0nlo7joSLTK88e87Eqw== 1634482602@qq.com diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000..59499bc --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/houselease.iml b/houselease.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/houselease.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bc349f3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + com.jlwl + + t020 + 0.0.1-SNAPSHOT + springboot-schema + 房屋租赁系统 + + + 1.8 + 1.2.8 + 3.1.1 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + 8.0.32 + + + org.apache.shiro + shiro-spring + 1.3.2 + + + com.baomidou + mybatis-plus + 2.3 + + + com.baomidou + mybatisplus-spring-boot-starter + 1.0.5 + + + com.google.protobuf + protobuf-java + 3.10.0 + + + + org.apache.commons + commons-lang3 + 3.0 + + + + javax.validation + validation-api + 2.0.1.Final + + + + commons-io + commons-io + 2.5 + + + + + cn.hutool + hutool-all + 4.0.12 + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + com.baidu.aip + java-sdk + 4.4.1 + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/SpringbootSchemaApplication.java b/src/main/java/com/SpringbootSchemaApplication.java new file mode 100644 index 0000000..e020617 --- /dev/null +++ b/src/main/java/com/SpringbootSchemaApplication.java @@ -0,0 +1,33 @@ +package com; + +// 导入 MyBatis 的 MapperScan 注解,用于扫描 DAO 层接口 +import org.mybatis.spring.annotation.MapperScan; +// 导入 Spring Boot 的核心注解,用于启动应用程序 +import org.springframework.boot.SpringApplication; +// 导入 Spring Boot 的自动配置注解,启用自动配置功能 +import org.springframework.boot.autoconfigure.SpringBootApplication; +// 导入 SpringApplicationBuilder,用于构建 Spring Boot 应用程序 +import org.springframework.boot.builder.SpringApplicationBuilder; +// 导入 SpringBootServletInitializer,用于支持将应用部署到外部 Servlet 容器 +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +// 标记该类为 Spring Boot 的主应用程序类 +// 启用组件扫描和自动配置功能 +@SpringBootApplication +// 使用 @MapperScan 指定 MyBatis 的 DAO 接口所在的包路径 +@MapperScan(basePackages = {"com.dao"}) +public class SpringbootSchemaApplication extends SpringBootServletInitializer { + + // 主方法,应用程序的入口点 + public static void main(String[] args) { + // 启动 Spring Boot 应用程序 + SpringApplication.run(SpringbootSchemaApplication.class, args); + } + + // 重写 configure 方法,支持将应用部署到外部 Servlet 容器 + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) { + // 指定 Spring Boot 应用程序的主类 + return applicationBuilder.sources(SpringbootSchemaApplication.class); + } +} diff --git a/src/main/java/com/annotation/APPLoginUser.java b/src/main/java/com/annotation/APPLoginUser.java new file mode 100644 index 0000000..f660eba --- /dev/null +++ b/src/main/java/com/annotation/APPLoginUser.java @@ -0,0 +1,17 @@ +package com.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 登录用户信息 + */ +// 该注解用于标识方法参数,表示该参数应注入当前登录的用户对象 +@Target(ElementType.PARAMETER) // 限定该注解只能标注在方法参数上 +@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时保留,可通过反射读取 +public @interface APPLoginUser { + // 这是一个标记注解,不需要定义额外属性 + // 框架处理器会根据该注解自动注入当前认证用户 +} diff --git a/src/main/java/com/annotation/IgnoreAuth.java b/src/main/java/com/annotation/IgnoreAuth.java new file mode 100644 index 0000000..1015dd7 --- /dev/null +++ b/src/main/java/com/annotation/IgnoreAuth.java @@ -0,0 +1,15 @@ +package com.annotation; + +import java.lang.annotation.*; + +/** + * 忽略Token验证 + */ +// 忽略认证的标记注解,标注该注解的方法将跳过权限/登录校验 +@Target(ElementType.METHOD) // 限定该注解只能标注在方法上 +@Retention(RetentionPolicy.RUNTIME) // 注解在运行时保留,可通过反射读取 +@Documented // 表明该注解应当被包含在Javadoc中 +public @interface IgnoreAuth { + // 标记注解不包含任何属性 + // 仅需标注在方法上即可使该方法跳过认证流程 +} diff --git a/src/main/java/com/annotation/LoginUser.java b/src/main/java/com/annotation/LoginUser.java new file mode 100644 index 0000000..c8f482e --- /dev/null +++ b/src/main/java/com/annotation/LoginUser.java @@ -0,0 +1,17 @@ +package com.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 登录用户信息 + */ +// 用户认证参数注解,用于自动注入当前登录用户信息 +@Target(ElementType.PARAMETER) // 限定该注解只能标注在方法参数上 +@Retention(RetentionPolicy.RUNTIME) // 注解在运行时保留,可通过反射机制获取 +public @interface LoginUser { + // 标记型注解,不包含任何配置属性 + // 框架会自动将当前登录用户对象注入到被注解的参数 +} diff --git a/src/main/java/com/config/InterceptorConfig.java b/src/main/java/com/config/InterceptorConfig.java new file mode 100644 index 0000000..acf85fa --- /dev/null +++ b/src/main/java/com/config/InterceptorConfig.java @@ -0,0 +1,54 @@ +package com.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +import com.interceptor.AuthorizationInterceptor; + +// 拦截器配置类,用于配置Spring MVC的拦截器和静态资源处理 +@Configuration // 标识这是一个Spring配置类 +public class InterceptorConfig extends WebMvcConfigurationSupport { + + /** + * 创建并返回授权拦截器Bean + * @return 授权拦截器实例 + */ + @Bean + public AuthorizationInterceptor getAuthorizationInterceptor() { + return new AuthorizationInterceptor(); // 实例化自定义的授权拦截器 + } + + /** + * 添加拦截器配置 + * @param registry 拦截器注册器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册授权拦截器并配置拦截路径 + registry.addInterceptor(getAuthorizationInterceptor()) + .addPathPatterns("/**") // 拦截所有请求路径 + .excludePathPatterns("/static/**"); // 排除静态资源路径 + super.addInterceptors(registry); // 调用父类方法保持默认拦截器配置 + } + + /** + * 重写静态资源处理配置 + * 注意:继承WebMvcConfigurationSupport会覆盖默认静态资源配置,需要手动添加 + * @param registry 资源处理器注册器 + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + // 配置静态资源映射 + registry.addResourceHandler("/**") // 匹配所有URL路径 + // 添加静态资源位置(按优先级排序) + .addResourceLocations("classpath:/resources/") // 类路径下的resources目录 + .addResourceLocations("classpath:/static/") // 类路径下的static目录 + .addResourceLocations("classpath:/admin/") // 类路径下的admin目录 + .addResourceLocations("classpath:/front/") // 类路径下的front目录 + .addResourceLocations("classpath:/public/"); // 类路径下的public目录 + super.addResourceHandlers(registry); // 调用父类方法保持默认资源处理配置 + } +} diff --git a/src/main/java/com/config/MybatisPlusConfig.java b/src/main/java/com/config/MybatisPlusConfig.java new file mode 100644 index 0000000..ec2e84b --- /dev/null +++ b/src/main/java/com/config/MybatisPlusConfig.java @@ -0,0 +1,24 @@ + +package com.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baomidou.mybatisplus.mapper.MetaObjectHandler; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; + +/** + * mybatis-plus配置 + */ +@Configuration +public class MybatisPlusConfig { + + /** + * 分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + +} diff --git a/src/main/java/com/controller/CommonController.java b/src/main/java/com/controller/CommonController.java new file mode 100644 index 0000000..961e848 --- /dev/null +++ b/src/main/java/com/controller/CommonController.java @@ -0,0 +1,359 @@ +package com.controller; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ResourceUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.annotation.IgnoreAuth; +import com.baidu.aip.face.AipFace; +import com.baidu.aip.face.MatchRequest; +import com.baidu.aip.util.Base64Util; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.entity.ConfigEntity; +import com.service.CommonService; +import com.service.ConfigService; +import com.utils.BaiduUtil; +import com.utils.FileUtil; +import com.utils.R; + +/** + * 通用接口 + */ +@RestController // 声明为RESTful控制器,自动将返回对象转为JSON +public class CommonController{ + + // 注入通用服务组件,用于处理通用业务逻辑 + @Autowired + private CommonService commonService; + + // 注入配置服务组件,用于获取系统配置信息 + @Autowired + private ConfigService configService; + + // 百度AI人脸识别客户端(静态变量保证全局唯一) + private static AipFace client = null; + + // 百度地图API访问密钥(静态变量保证全局唯一) + private static String BAIDU_DITU_AK = null; + + /** + * 经纬度定位接口 + * @param lng 经度坐标 + * @param lat 纬度坐标 + * @return 标准化响应结果 + */ + @RequestMapping("/location") + public R location(String lng,String lat) { + // 首次使用时初始化百度地图AK + if(BAIDU_DITU_AK==null) { + // 从数据库配置表查询AK值 + BAIDU_DITU_AK = configService.selectOne( + new EntityWrapper().eq("name", "baidu_ditu_ak") + ).getValue(); + // AK未配置时返回错误提示 + if(BAIDU_DITU_AK==null) { + return R.error("请在配置管理中正确配置baidu_ditu_ak"); + } + } + // 调用百度工具类获取地理位置信息 + Map map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat); + // 返回标准化成功响应 + return R.ok().put("data", map); + } + + /** + * 人脸比对接口 + * @param face1 第一张人脸图片文件名 + * @param face2 第二张人脸图片文件名 + * @return 包含比对结果的响应 + */ + @RequestMapping("/matchFace") + public R matchFace(String face1, String face2) { + // 初始化百度AI客户端 + if(client==null) { + // 从数据库获取API认证信息 + String APIKey = configService.selectOne( + new EntityWrapper().eq("name", "APIKey") + ).getValue(); + String SecretKey = configService.selectOne( + new EntityWrapper().eq("name", "SecretKey") + ).getValue(); + + // 获取访问令牌 + String token = BaiduUtil.getAuth(APIKey, SecretKey); + // 认证失败处理 + if(token==null) { + return R.error("请在配置管理中正确配置APIKey和SecretKey"); + } + // 创建客户端实例并设置超时参数 + client = new AipFace(null, APIKey, SecretKey); + client.setConnectionTimeoutInMillis(2000); // 2秒连接超时 + client.setSocketTimeoutInMillis(60000); // 60秒读写超时 + } + + JSONObject res = null; + try { + // 构建图片文件完整路径 + File file1 = new File( + ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face1 + ); + File file2 = new File( + ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face2 + ); + + // 将图片文件转为Base64编码 + String img1 = Base64Util.encode(FileUtil.FileToByte(file1)); + String img2 = Base64Util.encode(FileUtil.FileToByte(file2)); + + // 创建比对请求对象 + MatchRequest req1 = new MatchRequest(img1, "BASE64"); + MatchRequest req2 = new MatchRequest(img2, "BASE64"); + // 添加请求到列表 + ArrayList requests = new ArrayList(); + requests.add(req1); + requests.add(req2); + + // 执行人脸比对并获取结果 + res = client.match(requests); + System.out.println(res.get("result")); // 调试输出结果 + } catch (FileNotFoundException e) { + e.printStackTrace(); + return R.error("文件不存在"); // 文件不存在异常处理 + } catch (IOException e) { + e.printStackTrace(); + } + // 返回标准化结果 + return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString())); + } + + /** + * 获取数据表字段选项列表(联动接口) + * @param tableName 表名称 + * @param columnName 字段名称 + * @param level 层级参数(可选) + * @param parent 父级参数(可选) + * @return 包含选项列表的响应 + */ + @IgnoreAuth // 跳过权限验证 + @RequestMapping("/option/{tableName}/{columnName}") + public R getOption( + @PathVariable("tableName") String tableName, + @PathVariable("columnName") String columnName, + String level, + String parent + ) { + // 构建查询参数Map + Map params = new HashMap(); + params.put("table", tableName); // 设置表名参数 + params.put("column", columnName); // 设置字段名参数 + + // 处理可选参数 + if(StringUtils.isNotBlank(level)) { + params.put("level", level); // 设置层级参数 + } + if(StringUtils.isNotBlank(parent)) { + params.put("parent", parent); // 设置父级参数 + } + + // 调用服务获取数据 + List data = commonService.getOption(params); + // 返回标准化响应 + return R.ok().put("data", data); + } + + /** + * 根据字段值查询单条记录 + * @param tableName 表名称 + * @param columnName 字段名称 + * @param columnValue 字段值 + * @return 包含查询结果的响应 + */ + @IgnoreAuth // 跳过权限验证 + @RequestMapping("/follow/{tableName}/{columnName}") + public R getFollowByOption( + @PathVariable("tableName") String tableName, + @PathVariable("columnName") String columnName, + @RequestParam String columnValue + ) { + // 构建查询参数Map + Map params = new HashMap(); + params.put("table", tableName); // 设置表名参数 + params.put("column", columnName); // 设置字段名参数 + params.put("columnValue", columnValue); // 设置字段值参数 + + // 调用服务获取单条记录 + Map result = commonService.getFollowByOption(params); + // 返回标准化响应 + return R.ok().put("data", result); + } + + /** + * 审核状态修改接口 + * @param tableName 表名称 + * @param map 包含审核参数的Map + * @return 操作结果响应 + */ + @RequestMapping("/sh/{tableName}") + public R sh( + @PathVariable("tableName") String tableName, + @RequestBody Map map + ) { + map.put("table", tableName); // 将表名添加到参数Map + commonService.sh(map); // 调用审核服务 + return R.ok(); // 返回成功响应 + } + + /** + * 获取提醒记录数接口 + * @param tableName 表名称 + * @param columnName 字段名称 + * @param type 提醒类型(1:数字 2:日期) + * @param map 包含提醒参数的Map + * @return 包含记录数的响应 + */ + @IgnoreAuth // 跳过权限验证 + @RequestMapping("/remind/{tableName}/{columnName}/{type}") + public R remindCount( + @PathVariable("tableName") String tableName, + @PathVariable("columnName") String columnName, + @PathVariable("type") String type, + @RequestParam Map map + ) { + // 设置基础参数 + map.put("table", tableName); // 表名参数 + map.put("column", columnName); // 字段名参数 + map.put("type", type); // 类型参数 + + // 日期类型特殊处理 + if(type.equals("2")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 日期格式化 + Calendar c = Calendar.getInstance(); // 日历实例 + Date remindStartDate = null; // 提醒开始日期 + Date remindEndDate = null; // 提醒结束日期 + + // 处理提醒开始日期 + if(map.get("remindstart")!=null) { + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH,remindStart); // 计算开始日期 + remindStartDate = c.getTime(); + map.put("remindstart", sdf.format(remindStartDate)); // 格式化日期 + } + + // 处理提醒结束日期 + if(map.get("remindend")!=null) { + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH,remindEnd); // 计算结束日期 + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); // 格式化日期 + } + } + + // 调用服务获取提醒记录数 + int count = commonService.remindCount(map); + // 返回标准化响应 + return R.ok().put("count", count); + } + + /** + * 单列求和统计接口 + * @param tableName 表名称 + * @param columnName 字段名称 + * @return 包含统计结果的响应 + */ + @IgnoreAuth // 跳过权限验证 + @RequestMapping("/cal/{tableName}/{columnName}") + public R cal( + @PathVariable("tableName") String tableName, + @PathVariable("columnName") String columnName + ) { + // 构建查询参数 + Map params = new HashMap(); + params.put("table", tableName); // 表名参数 + params.put("column", columnName); // 字段名参数 + + // 调用服务获取计算结果 + Map result = commonService.selectCal(params); + // 返回标准化响应 + return R.ok().put("data", result); + } + + /** + * 分组统计接口 + * @param tableName 表名称 + * @param columnName 分组字段名称 + * @return 包含分组结果的响应 + */ + @IgnoreAuth // 跳过权限验证 + @RequestMapping("/group/{tableName}/{columnName}") + public R group( + @PathVariable("tableName") String tableName, + @PathVariable("columnName") String columnName + ) { + // 构建查询参数 + Map params = new HashMap(); + params.put("table", tableName); // 表名参数 + params.put("column", columnName); // 分组字段参数 + + // 调用服务获取分组结果 + List> result = commonService.selectGroup(params); + // 返回标准化响应 + return R.ok().put("data", result); + } + + /** + * 按值统计接口(用于图表数据) + * @param tableName 表名称 + * @param yColumnName 纵轴字段 + * @param xColumnName 横轴字段 + * @return 包含统计结果的响应 + */ + @IgnoreAuth // 跳过权限验证 + @RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}") + public R value( + @PathVariable("tableName") String tableName, + @PathVariable("yColumnName") String yColumnName, + @PathVariable("xColumnName") String xColumnName + ) { + // 构建查询参数 + Map params = new HashMap(); + params.put("table", tableName); // 表名参数 + params.put("xColumn", xColumnName); // 横轴字段参数 + params.put("yColumn", yColumnName); // 纵轴字段参数 + + // 调用服务获取统计结果 + List> result = commonService.selectValue(params); + + // 格式化日期类型数据 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + for(Map m : result) { + for(String k : m.keySet()) { + if(m.get(k) instanceof Date) { + m.put(k, sdf.format((Date)m.get(k))); // 日期转为字符串 + } + } + } + + // 返回标准化响应 + return R.ok().put("data", result); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/ConfigController.java b/src/main/java/com/controller/ConfigController.java new file mode 100644 index 0000000..80f505e --- /dev/null +++ b/src/main/java/com/controller/ConfigController.java @@ -0,0 +1,148 @@ + +package com.controller; + + +import java.util.Arrays; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.annotation.IgnoreAuth; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.entity.ConfigEntity; +import com.service.ConfigService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.ValidatorUtils; + +/** + * 登录相关 + */ +// 定义该请求映射路径为 "config" +@RequestMapping("config") +// 声明这是一个 RESTful 风格的控制器 +@RestController +public class ConfigController{ + + // 自动注入 ConfigService 实例 + @Autowired + private ConfigService configService; + + /** + * 列表 + */ + // 处理 "/page" 路径的请求 + @RequestMapping("/page") + // 处理分页列表请求的方法,接收参数和配置实体 + public R page(@RequestParam Map params,ConfigEntity config){ + // 创建一个 ConfigEntity 的查询条件包装器 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层方法进行分页查询 + PageUtils page = configService.queryPage(params); + // 返回成功响应,并将分页数据放入响应体 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 处理 "/list" 路径的请求,且该请求无需认证 + @IgnoreAuth + @RequestMapping("/list") + // 处理列表请求的方法,接收参数和配置实体 + public R list(@RequestParam Map params,ConfigEntity config){ + // 创建一个 ConfigEntity 的查询条件包装器 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层方法进行分页查询 + PageUtils page = configService.queryPage(params); + // 返回成功响应,并将分页数据放入响应体 + return R.ok().put("data", page); + } + + /** + * 信息 + */ + // 处理 "/info/{id}" 路径的请求,接收路径参数 id + @RequestMapping("/info/{id}") + // 根据 id 获取配置信息的方法 + public R info(@PathVariable("id") String id){ + // 调用服务层方法根据 id 查询配置实体 + ConfigEntity config = configService.selectById(id); + // 返回成功响应,并将配置信息放入响应体 + return R.ok().put("data", config); + } + + /** + * 详情 + */ + // 处理 "/detail/{id}" 路径的请求,且该请求无需认证 + @IgnoreAuth + @RequestMapping("/detail/{id}") + // 根据 id 获取配置详情的方法 + public R detail(@PathVariable("id") String id){ + // 调用服务层方法根据 id 查询配置实体 + ConfigEntity config = configService.selectById(id); + // 返回成功响应,并将配置信息放入响应体 + return R.ok().put("data", config); + } + + /** + * 根据name获取信息 + */ + // 处理 "/info" 路径的请求,接收请求参数 name + @RequestMapping("/info") + // 根据名称获取配置信息的方法 + public R infoByName(@RequestParam String name){ + // 调用服务层方法根据名称查询配置实体 + ConfigEntity config = configService.selectOne(new EntityWrapper().eq("name", "faceFile")); + // 返回成功响应,并将配置信息放入响应体 + return R.ok().put("data", config); + } + + /** + * 保存 + */ + // 处理 "/save" 路径的 POST 请求 + @PostMapping("/save") + // 保存配置信息的方法,接收请求体中的配置实体 + public R save(@RequestBody ConfigEntity config){ +// ValidatorUtils.validateEntity(config); + // 调用服务层方法插入配置实体 + configService.insert(config); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 处理 "/update" 路径的请求 + @RequestMapping("/update") + // 更新配置信息的方法,接收请求体中的配置实体 + public R update(@RequestBody ConfigEntity config){ +// ValidatorUtils.validateEntity(config); + // 调用服务层方法根据 id 更新配置实体 + configService.updateById(config);//全部更新 + // 返回成功响应 + return R.ok(); + } + + /** + * 删除 + */ + // 处理 "/delete" 路径的请求 + @RequestMapping("/delete") + // 删除配置信息的方法,接收请求体中的 id 数组 + public R delete(@RequestBody Long[] ids){ + // 调用服务层方法批量删除配置实体 + configService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/DiscussfangwuxinxiController.java b/src/main/java/com/controller/DiscussfangwuxinxiController.java new file mode 100644 index 0000000..eee49c6 --- /dev/null +++ b/src/main/java/com/controller/DiscussfangwuxinxiController.java @@ -0,0 +1,274 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.DiscussfangwuxinxiEntity; +import com.entity.view.DiscussfangwuxinxiView; + +import com.service.DiscussfangwuxinxiService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 房屋信息评论表 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 数据 +@RestController +// 映射该控制器处理的请求路径前缀为 /discussfangwuxinxi +@RequestMapping("/discussfangwuxinxi") +public class DiscussfangwuxinxiController { + // 自动注入 DiscussfangwuxinxiService 服务实例,用于调用业务逻辑方法 + @Autowired + private DiscussfangwuxinxiService discussfangwuxinxiService; + + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,通常用于获取后端的分页列表数据 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, DiscussfangwuxinxiEntity discussfangwuxinxi, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = discussfangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussfangwuxinxi), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 标记该请求无需进行身份验证 + @IgnoreAuth + // 映射处理 /list 路径的请求,通常用于获取前端的列表数据 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, DiscussfangwuxinxiEntity discussfangwuxinxi, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = discussfangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussfangwuxinxi), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取列表数据 + @RequestMapping("/lists") + // 处理列表请求的方法,接收实体对象 + public R list(DiscussfangwuxinxiEntity discussfangwuxinxi) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(discussfangwuxinxi, "discussfangwuxinxi")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", discussfangwuxinxiService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询单个对象 + @RequestMapping("/query") + // 处理查询请求的方法,接收实体对象 + public R query(DiscussfangwuxinxiEntity discussfangwuxinxi) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(discussfangwuxinxi, "discussfangwuxinxi")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + DiscussfangwuxinxiView discussfangwuxinxiView = discussfangwuxinxiService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询房屋信息评论表成功").put("data", discussfangwuxinxiView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的详细信息 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取实体对象 + DiscussfangwuxinxiEntity discussfangwuxinxi = discussfangwuxinxiService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", discussfangwuxinxi); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的详细信息 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取实体对象 + DiscussfangwuxinxiEntity discussfangwuxinxi = discussfangwuxinxiService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", discussfangwuxinxi); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的 POST 请求,用于保存新的实体对象 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的实体对象和 HttpServletRequest 对象 + public R save(@RequestBody DiscussfangwuxinxiEntity discussfangwuxinxi, HttpServletRequest request) { + // 为实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + discussfangwuxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discussfangwuxinxi); + // 调用服务层的 insert 方法,将实体对象插入数据库 + discussfangwuxinxiService.insert(discussfangwuxinxi); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于前端保存新的实体对象 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的实体对象和 HttpServletRequest 对象 + public R add(@RequestBody DiscussfangwuxinxiEntity discussfangwuxinxi, HttpServletRequest request) { + // 为实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + discussfangwuxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discussfangwuxinxi); + // 调用服务层的 insert 方法,将实体对象插入数据库 + discussfangwuxinxiService.insert(discussfangwuxinxi); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新实体对象 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的实体对象和 HttpServletRequest 对象 + public R update(@RequestBody DiscussfangwuxinxiEntity discussfangwuxinxi, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discussfangwuxinxi); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + discussfangwuxinxiService.updateById(discussfangwuxinxi); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于批量删除实体对象 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + discussfangwuxinxiService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为 2,表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = discussfangwuxinxiService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/DiscusswoyaodangfangzhuController.java b/src/main/java/com/controller/DiscusswoyaodangfangzhuController.java new file mode 100644 index 0000000..7a5c345 --- /dev/null +++ b/src/main/java/com/controller/DiscusswoyaodangfangzhuController.java @@ -0,0 +1,273 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.DiscusswoyaodangfangzhuEntity; +import com.entity.view.DiscusswoyaodangfangzhuView; + +import com.service.DiscusswoyaodangfangzhuService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 我要当房主评论表 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 数据 +@RestController +// 映射该控制器处理的请求路径前缀为 /discusswoyaodangfangzhu +@RequestMapping("/discusswoyaodangfangzhu") +public class DiscusswoyaodangfangzhuController { + // 自动注入 DiscusswoyaodangfangzhuService 服务实例,用于调用业务逻辑方法 + @Autowired + private DiscusswoyaodangfangzhuService discusswoyaodangfangzhuService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的分页列表数据 + @RequestMapping("/page") + // 处理分页列表请求的方法,接收请求参数、实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = discusswoyaodangfangzhuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discusswoyaodangfangzhu), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 标记该请求无需进行身份验证 + @IgnoreAuth + // 映射处理 /list 路径的请求,用于获取前端的列表数据 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = discusswoyaodangfangzhuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discusswoyaodangfangzhu), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取列表数据 + @RequestMapping("/lists") + // 处理列表请求的方法,接收实体对象 + public R list(DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(discusswoyaodangfangzhu, "discusswoyaodangfangzhu")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", discusswoyaodangfangzhuService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询单个对象 + @RequestMapping("/query") + // 处理查询请求的方法,接收实体对象 + public R query(DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(discusswoyaodangfangzhu, "discusswoyaodangfangzhu")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + DiscusswoyaodangfangzhuView discusswoyaodangfangzhuView = discusswoyaodangfangzhuService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询我要当房主评论表成功").put("data", discusswoyaodangfangzhuView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的详细信息 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取实体对象 + DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu = discusswoyaodangfangzhuService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", discusswoyaodangfangzhu); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的详细信息 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取实体对象 + DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu = discusswoyaodangfangzhuService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", discusswoyaodangfangzhu); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的 POST 请求,用于保存新的实体对象 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的实体对象和 HttpServletRequest 对象 + public R save(@RequestBody DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu, HttpServletRequest request) { + // 为实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + discusswoyaodangfangzhu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discusswoyaodangfangzhu); + // 调用服务层的 insert 方法,将实体对象插入数据库 + discusswoyaodangfangzhuService.insert(discusswoyaodangfangzhu); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于前端保存新的实体对象 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的实体对象和 HttpServletRequest 对象 + public R add(@RequestBody DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu, HttpServletRequest request) { + // 为实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + discusswoyaodangfangzhu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discusswoyaodangfangzhu); + // 调用服务层的 insert 方法,将实体对象插入数据库 + discusswoyaodangfangzhuService.insert(discusswoyaodangfangzhu); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新实体对象 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的实体对象和 HttpServletRequest 对象 + public R update(@RequestBody DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhu, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discusswoyaodangfangzhu); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + discusswoyaodangfangzhuService.updateById(discusswoyaodangfangzhu); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于批量删除实体对象 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + discusswoyaodangfangzhuService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为 2,表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = discusswoyaodangfangzhuService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/FangwubaoxiuController.java b/src/main/java/com/controller/FangwubaoxiuController.java new file mode 100644 index 0000000..4f98876 --- /dev/null +++ b/src/main/java/com/controller/FangwubaoxiuController.java @@ -0,0 +1,292 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.FangwubaoxiuEntity; +import com.entity.view.FangwubaoxiuView; + +import com.service.FangwubaoxiuService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 房屋报修 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 +@RestController +// 该控制器处理的所有请求路径都以 /fangwubaoxiu 开头 +@RequestMapping("/fangwubaoxiu") +public class FangwubaoxiuController { + // 自动注入 FangwubaoxiuService 服务类的实例,用于调用业务逻辑方法 + @Autowired + private FangwubaoxiuService fangwubaoxiuService; + + /** + * 后端列表 + */ + // 处理 /page 路径的请求,通常用于获取后端的分页数据列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、房屋报修实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, FangwubaoxiuEntity fangwubaoxiu, HttpServletRequest request) { + // 从请求的会话中获取 tableName 属性值,并转换为字符串 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果 tableName 为 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 将当前会话中的用户名设置为房屋报修实体的房主账号 + fangwubaoxiu.setFangzhuzhanghao((String) request.getSession().getAttribute("username")); + } + // 如果 tableName 为 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 将当前会话中的用户名设置为房屋报修实体的用户名 + fangwubaoxiu.setYonghuming((String) request.getSession().getAttribute("username")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwubaoxiuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwubaoxiu), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 处理 /list 路径的请求,通常用于获取前端的列表数据 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、房屋报修实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, FangwubaoxiuEntity fangwubaoxiu, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwubaoxiuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwubaoxiu), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 处理 /lists 路径的请求,用于获取列表数据 + @RequestMapping("/lists") + // 处理列表请求的方法,接收房屋报修实体对象 + public R list(FangwubaoxiuEntity fangwubaoxiu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwubaoxiu, "fangwubaoxiu")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", fangwubaoxiuService.selectListView(ew)); + } + + /** + * 查询 + */ + // 处理 /query 路径的请求,用于查询单个房屋报修信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收房屋报修实体对象 + public R query(FangwubaoxiuEntity fangwubaoxiu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwubaoxiu, "fangwubaoxiu")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + FangwubaoxiuView fangwubaoxiuView = fangwubaoxiuService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询房屋报修成功").put("data", fangwubaoxiuView); + } + + /** + * 后端详情 + */ + // 处理 /info/{id} 路径的请求,用于获取指定 ID 的房屋报修详细信息 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋报修实体对象 + FangwubaoxiuEntity fangwubaoxiu = fangwubaoxiuService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwubaoxiu); + } + + /** + * 前端详情 + */ + // 处理 /detail/{id} 路径的请求,用于获取指定 ID 的房屋报修详细信息 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋报修实体对象 + FangwubaoxiuEntity fangwubaoxiu = fangwubaoxiuService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwubaoxiu); + } + + /** + * 后端保存 + */ + // 处理 /save 路径的 POST 请求,用于保存新的房屋报修信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的房屋报修实体对象和 HttpServletRequest 对象 + public R save(@RequestBody FangwubaoxiuEntity fangwubaoxiu, HttpServletRequest request) { + // 为房屋报修实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwubaoxiu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwubaoxiu); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwubaoxiuService.insert(fangwubaoxiu); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 处理 /add 路径的请求,用于前端保存新的房屋报修信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的房屋报修实体对象和 HttpServletRequest 对象 + public R add(@RequestBody FangwubaoxiuEntity fangwubaoxiu, HttpServletRequest request) { + // 为房屋报修实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwubaoxiu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwubaoxiu); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwubaoxiuService.insert(fangwubaoxiu); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 处理 /update 路径的请求,用于更新房屋报修信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的房屋报修实体对象和 HttpServletRequest 对象 + public R update(@RequestBody FangwubaoxiuEntity fangwubaoxiu, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwubaoxiu); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + fangwubaoxiuService.updateById(fangwubaoxiu); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 处理 /delete 路径的请求,用于批量删除房屋报修信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + fangwubaoxiuService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + // 如果类型为 "2",表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + // 创建一个 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 从请求的会话中获取 tableName 属性值,并转换为字符串 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果 tableName 为 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 设置查询条件,要求房主账号等于当前会话中的用户名 + wrapper.eq("fangzhuzhanghao", (String) request.getSession().getAttribute("username")); + } + // 如果 tableName 为 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 设置查询条件,要求用户名等于当前会话中的用户名 + wrapper.eq("yonghuming", (String) request.getSession().getAttribute("username")); + } + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = fangwubaoxiuService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/FangwuleixingController.java b/src/main/java/com/controller/FangwuleixingController.java new file mode 100644 index 0000000..b7f8a3b --- /dev/null +++ b/src/main/java/com/controller/FangwuleixingController.java @@ -0,0 +1,268 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.FangwuleixingEntity; +import com.entity.view.FangwuleixingView; + +import com.service.FangwuleixingService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 房屋类型 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式响应 +@RestController +// 映射该控制器处理的请求路径前缀为 /fangwuleixing +@RequestMapping("/fangwuleixing") +public class FangwuleixingController { + // 自动注入 FangwuleixingService 服务实例,用于调用业务逻辑方法 + @Autowired + private FangwuleixingService fangwuleixingService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的房屋类型分页列表数据 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、房屋类型实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, FangwuleixingEntity fangwuleixing, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwuleixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuleixing), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端的房屋类型列表数据 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、房屋类型实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, FangwuleixingEntity fangwuleixing, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwuleixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuleixing), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取房屋类型列表数据 + @RequestMapping("/lists") + // 处理列表请求的方法,接收房屋类型实体对象 + public R list(FangwuleixingEntity fangwuleixing) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwuleixing, "fangwuleixing")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", fangwuleixingService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询单个房屋类型信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收房屋类型实体对象 + public R query(FangwuleixingEntity fangwuleixing) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwuleixing, "fangwuleixing")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + FangwuleixingView fangwuleixingView = fangwuleixingService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询房屋类型成功").put("data", fangwuleixingView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的房屋类型详细信息 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋类型实体对象 + FangwuleixingEntity fangwuleixing = fangwuleixingService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwuleixing); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的房屋类型详细信息 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋类型实体对象 + FangwuleixingEntity fangwuleixing = fangwuleixingService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwuleixing); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的 POST 请求,用于保存新的房屋类型信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的房屋类型实体对象和 HttpServletRequest 对象 + public R save(@RequestBody FangwuleixingEntity fangwuleixing, HttpServletRequest request) { + // 为房屋类型实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwuleixing.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwuleixing); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwuleixingService.insert(fangwuleixing); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于前端保存新的房屋类型信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的房屋类型实体对象和 HttpServletRequest 对象 + public R add(@RequestBody FangwuleixingEntity fangwuleixing, HttpServletRequest request) { + // 为房屋类型实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwuleixing.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwuleixing); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwuleixingService.insert(fangwuleixing); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新房屋类型信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的房屋类型实体对象和 HttpServletRequest 对象 + public R update(@RequestBody FangwuleixingEntity fangwuleixing, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwuleixing); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + fangwuleixingService.updateById(fangwuleixing); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于批量删除房屋类型信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + fangwuleixingService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + // 如果类型为 "2",表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + // 创建一个 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = fangwuleixingService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/FangwupingjiaController.java b/src/main/java/com/controller/FangwupingjiaController.java new file mode 100644 index 0000000..48470ed --- /dev/null +++ b/src/main/java/com/controller/FangwupingjiaController.java @@ -0,0 +1,292 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.FangwupingjiaEntity; +import com.entity.view.FangwupingjiaView; + +import com.service.FangwupingjiaService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 房屋评价 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 标记该类为 RESTful 控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 该控制器处理的请求路径前缀为 /fangwupingjia +@RequestMapping("/fangwupingjia") +public class FangwupingjiaController { + // 自动注入 FangwupingjiaService 服务实例,用于调用业务逻辑方法 + @Autowired + private FangwupingjiaService fangwupingjiaService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端房屋评价的分页列表数据 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、房屋评价实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, FangwupingjiaEntity fangwupingjia, HttpServletRequest request) { + // 从请求会话中获取 tableName 属性值并转换为字符串 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果 tableName 为 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 将会话中的用户名设置为房屋评价实体的房主账号 + fangwupingjia.setFangzhuzhanghao((String) request.getSession().getAttribute("username")); + } + // 如果 tableName 为 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 将会话中的用户名设置为房屋评价实体的用户名 + fangwupingjia.setYonghuming((String) request.getSession().getAttribute("username")); + } + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwupingjiaService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwupingjia), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端房屋评价的列表数据 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、房屋评价实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, FangwupingjiaEntity fangwupingjia, HttpServletRequest request) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwupingjiaService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwupingjia), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取房屋评价列表数据 + @RequestMapping("/lists") + // 处理列表请求的方法,接收房屋评价实体对象 + public R list(FangwupingjiaEntity fangwupingjia) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwupingjia, "fangwupingjia")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", fangwupingjiaService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询单个房屋评价信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收房屋评价实体对象 + public R query(FangwupingjiaEntity fangwupingjia) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwupingjia, "fangwupingjia")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + FangwupingjiaView fangwupingjiaView = fangwupingjiaService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询房屋评价成功").put("data", fangwupingjiaView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的房屋评价详细信息 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋评价实体对象 + FangwupingjiaEntity fangwupingjia = fangwupingjiaService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwupingjia); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的房屋评价详细信息 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋评价实体对象 + FangwupingjiaEntity fangwupingjia = fangwupingjiaService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwupingjia); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的 POST 请求,用于保存新的房屋评价信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的房屋评价实体对象和 HttpServletRequest 对象 + public R save(@RequestBody FangwupingjiaEntity fangwupingjia, HttpServletRequest request) { + // 为房屋评价实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwupingjia.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwupingjia); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwupingjiaService.insert(fangwupingjia); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于前端保存新的房屋评价信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的房屋评价实体对象和 HttpServletRequest 对象 + public R add(@RequestBody FangwupingjiaEntity fangwupingjia, HttpServletRequest request) { + // 为房屋评价实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwupingjia.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwupingjia); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwupingjiaService.insert(fangwupingjia); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新房屋评价信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的房屋评价实体对象和 HttpServletRequest 对象 + public R update(@RequestBody FangwupingjiaEntity fangwupingjia, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwupingjia); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + fangwupingjiaService.updateById(fangwupingjia); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于批量删除房屋评价信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + fangwupingjiaService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + // 如果类型为 "2",表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + // 创建 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 从请求会话中获取 tableName 属性值并转换为字符串 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果 tableName 为 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 设置查询条件,要求房主账号等于会话中的用户名 + wrapper.eq("fangzhuzhanghao", (String) request.getSession().getAttribute("username")); + } + // 如果 tableName 为 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 设置查询条件,要求用户名等于会话中的用户名 + wrapper.eq("yonghuming", (String) request.getSession().getAttribute("username")); + } + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = fangwupingjiaService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/FangwuxinxiController.java b/src/main/java/com/controller/FangwuxinxiController.java new file mode 100644 index 0000000..8e52f95 --- /dev/null +++ b/src/main/java/com/controller/FangwuxinxiController.java @@ -0,0 +1,286 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.FangwuxinxiEntity; +import com.entity.view.FangwuxinxiView; + +import com.service.FangwuxinxiService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 房屋信息 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 映射该控制器处理的请求路径前缀为 /fangwuxinxi +@RequestMapping("/fangwuxinxi") +public class FangwuxinxiController { + // 自动注入 FangwuxinxiService 服务类的实例,用于调用相关业务逻辑方法 + @Autowired + private FangwuxinxiService fangwuxinxiService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的房屋信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、房屋信息实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, FangwuxinxiEntity fangwuxinxi, HttpServletRequest request) { + // 从请求的会话中获取 tableName 属性值并转换为字符串 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果 tableName 为 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 将当前会话中的用户名设置为房屋信息实体的房主账号 + fangwuxinxi.setFangzhuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuxinxi), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /list 路径的请求,用于获取前端的房屋信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、房屋信息实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, FangwuxinxiEntity fangwuxinxi, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuxinxi), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取房屋信息列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收房屋信息实体对象 + public R list(FangwuxinxiEntity fangwuxinxi) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwuxinxi, "fangwuxinxi")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", fangwuxinxiService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询单个房屋信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收房屋信息实体对象 + public R query(FangwuxinxiEntity fangwuxinxi) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangwuxinxi, "fangwuxinxi")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + FangwuxinxiView fangwuxinxiView = fangwuxinxiService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询房屋信息成功").put("data", fangwuxinxiView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的房屋信息详细内容 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋信息实体对象 + FangwuxinxiEntity fangwuxinxi = fangwuxinxiService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwuxinxi); + } + + /** + * 前端详情 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的房屋信息详细内容 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房屋信息实体对象 + FangwuxinxiEntity fangwuxinxi = fangwuxinxiService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangwuxinxi); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的 POST 请求,用于保存新的房屋信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的房屋信息实体对象和 HttpServletRequest 对象 + public R save(@RequestBody FangwuxinxiEntity fangwuxinxi, HttpServletRequest request) { + // 为房屋信息实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwuxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwuxinxi); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwuxinxiService.insert(fangwuxinxi); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于前端保存新的房屋信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的房屋信息实体对象和 HttpServletRequest 对象 + public R add(@RequestBody FangwuxinxiEntity fangwuxinxi, HttpServletRequest request) { + // 为房屋信息实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangwuxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwuxinxi); + // 调用服务层的 insert 方法,将实体对象插入数据库 + fangwuxinxiService.insert(fangwuxinxi); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新房屋信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的房屋信息实体对象和 HttpServletRequest 对象 + public R update(@RequestBody FangwuxinxiEntity fangwuxinxi, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangwuxinxi); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + fangwuxinxiService.updateById(fangwuxinxi); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于批量删除房屋信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + fangwuxinxiService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + // 如果类型为 "2",表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + // 创建一个 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 从请求的会话中获取 tableName 属性值并转换为字符串 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果 tableName 为 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 设置查询条件,要求房主账号等于当前会话中的用户名 + wrapper.eq("fangzhuzhanghao", (String) request.getSession().getAttribute("username")); + } + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = fangwuxinxiService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/FangzhuController.java b/src/main/java/com/controller/FangzhuController.java new file mode 100644 index 0000000..84ab193 --- /dev/null +++ b/src/main/java/com/controller/FangzhuController.java @@ -0,0 +1,391 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.FangzhuEntity; +import com.entity.view.FangzhuView; + +import com.service.FangzhuService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 房主 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 映射该控制器处理的请求路径前缀为 /fangzhu +@RequestMapping("/fangzhu") +public class FangzhuController { + // 自动注入 FangzhuService 服务实例,用于调用与房主相关的业务逻辑方法 + @Autowired + private FangzhuService fangzhuService; + // 自动注入 TokenService 服务实例,用于生成和管理令牌 + @Autowired + private TokenService tokenService; + + /** + * 登录 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /login 路径的请求,用于房主登录 + @RequestMapping(value = "/login") + // 处理登录请求的方法,接收用户名、密码、验证码和 HttpServletRequest 对象 + public R login(String username, String password, String captcha, HttpServletRequest request) { + // 根据用户名查询房主实体对象 + FangzhuEntity user = fangzhuService.selectOne(new EntityWrapper().eq("fangzhuzhanghao", username)); + // 如果用户不存在或者密码不匹配 + if (user == null || !user.getMima().equals(password)) { + // 返回错误响应,提示账号或密码不正确 + return R.error("账号或密码不正确"); + } + // 生成令牌,包含用户 ID、用户名、用户类型和用户角色信息 + String token = tokenService.generateToken(user.getId(), username, "fangzhu", "房主"); + // 返回成功响应,并将令牌放入响应的 token 字段中 + return R.ok().put("token", token); + } + + /** + * 注册 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /register 路径的请求,用于房主注册 + @RequestMapping("/register") + // 处理注册请求的方法,接收请求体中的房主实体对象 + public R register(@RequestBody FangzhuEntity fangzhu) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangzhu); + // 根据用户名查询房主实体对象 + FangzhuEntity user = fangzhuService.selectOne(new EntityWrapper().eq("fangzhuzhanghao", fangzhu.getFangzhuzhanghao())); + // 如果用户已存在 + if (user != null) { + // 返回错误响应,提示注册用户已存在 + return R.error("注册用户已存在"); + } + // 生成一个唯一的用户 ID,使用当前时间戳 + Long uId = new Date().getTime(); + // 设置房主实体对象的 ID + fangzhu.setId(uId); + // 调用服务层的 insert 方法,将房主实体对象插入数据库 + fangzhuService.insert(fangzhu); + // 返回成功响应 + return R.ok(); + } + + /** + * 退出 + */ + // 映射处理 /logout 路径的请求,用于房主退出登录 + @RequestMapping("/logout") + // 处理退出请求的方法,接收 HttpServletRequest 对象 + public R logout(HttpServletRequest request) { + // 使当前会话失效 + request.getSession().invalidate(); + // 返回成功响应,提示退出成功 + return R.ok("退出成功"); + } + + /** + * 获取用户的 session 用户信息 + */ + // 映射处理 /session 路径的请求,用于获取当前会话中的房主信息 + @RequestMapping("/session") + // 处理获取会话信息请求的方法,接收 HttpServletRequest 对象 + public R getCurrUser(HttpServletRequest request) { + // 从会话中获取用户 ID + Long id = (Long) request.getSession().getAttribute("userId"); + // 根据用户 ID 查询房主实体对象 + FangzhuEntity user = fangzhuService.selectById(id); + // 返回成功响应,并将房主实体对象放入响应的 data 字段中 + return R.ok().put("data", user); + } + + /** + * 密码重置 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /resetPass 路径的请求,用于重置房主密码 + @RequestMapping(value = "/resetPass") + // 处理密码重置请求的方法,接收用户名和 HttpServletRequest 对象 + public R resetPass(String username, HttpServletRequest request) { + // 根据用户名查询房主实体对象 + FangzhuEntity user = fangzhuService.selectOne(new EntityWrapper().eq("fangzhuzhanghao", username)); + // 如果用户不存在 + if (user == null) { + // 返回错误响应,提示账号不存在 + return R.error("账号不存在"); + } + // 将用户密码重置为 123456 + user.setMima("123456"); + // 调用服务层的 updateById 方法,更新用户信息 + fangzhuService.updateById(user); + // 返回成功响应,提示密码已重置为 123456 + return R.ok("密码已重置为:123456"); + } + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的房主页列表数据 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、房主实体对象和 HttpServletRequest 对象 + public R page(@RequestParam Map params, FangzhuEntity fangzhu, HttpServletRequest request) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangzhuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangzhu), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端的房主列表数据 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、房主实体对象和 HttpServletRequest 对象 + public R list(@RequestParam Map params, FangzhuEntity fangzhu, HttpServletRequest request) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用服务层的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = fangzhuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangzhu), params), params)); + // 返回一个成功响应对象 R,并将分页数据放入响应的 data 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取房主列表数据 + @RequestMapping("/lists") + // 处理列表请求的方法,接收房主实体对象 + public R list(FangzhuEntity fangzhu) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangzhu, "fangzhu")); + // 调用服务层的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", fangzhuService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询单个房主信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收房主实体对象 + public R query(FangzhuEntity fangzhu) { + // 创建 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(fangzhu, "fangzhu")); + // 调用服务层的 selectView 方法,根据查询条件获取单个视图对象 + FangzhuView fangzhuView = fangzhuService.selectView(ew); + // 返回一个成功响应对象 R,并设置提示信息和查询结果到响应中 + return R.ok("查询房主成功").put("data", fangzhuView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的房主详细信息 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房主实体对象 + FangzhuEntity fangzhu = fangzhuService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangzhu); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的房主详细信息 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用服务层的 selectById 方法,根据 ID 获取房主实体对象 + FangzhuEntity fangzhu = fangzhuService.selectById(id); + // 返回一个成功响应对象 R,并将实体对象放入响应的 data 字段中 + return R.ok().put("data", fangzhu); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的 POST 请求,用于保存新的房主信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的房主实体对象和 HttpServletRequest 对象 + public R save(@RequestBody FangzhuEntity fangzhu, HttpServletRequest request) { + // 为房主实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangzhu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangzhu); + // 根据用户名查询房主实体对象 + FangzhuEntity user = fangzhuService.selectOne(new EntityWrapper().eq("fangzhuzhanghao", fangzhu.getFangzhuzhanghao())); + // 如果用户已存在 + if (user != null) { + // 返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 重新设置房主实体对象的 ID 为当前时间戳 + fangzhu.setId(new Date().getTime()); + // 调用服务层的 insert 方法,将房主实体对象插入数据库 + fangzhuService.insert(fangzhu); + // 返回成功响应 + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于前端保存新的房主信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的房主实体对象和 HttpServletRequest 对象 + public R add(@RequestBody FangzhuEntity fangzhu, HttpServletRequest request) { + // 为房主实体对象生成一个唯一的 ID,由当前时间戳加上一个随机数组成 + fangzhu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangzhu); + // 根据用户名查询房主实体对象 + FangzhuEntity user = fangzhuService.selectOne(new EntityWrapper().eq("fangzhuzhanghao", fangzhu.getFangzhuzhanghao())); + // 如果用户已存在 + if (user != null) { + // 返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 重新设置房主实体对象的 ID 为当前时间戳 + fangzhu.setId(new Date().getTime()); + // 调用服务层的 insert 方法,将房主实体对象插入数据库 + fangzhuService.insert(fangzhu); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新房主信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的房主实体对象和 HttpServletRequest 对象 + public R update(@RequestBody FangzhuEntity fangzhu, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(fangzhu); + // 调用服务层的 updateById 方法,根据 ID 更新实体对象的所有字段 + fangzhuService.updateById(fangzhu); + // 返回成功响应 + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于批量删除房主信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务层的 deleteBatchIds 方法,根据 ID 数组批量删除实体对象 + fangzhuService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计提醒数量 + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,以及请求参数 map 和 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型添加到请求参数 map 中 + map.put("column", columnName); + map.put("type", type); + // 如果类型为 "2",表示需要处理提醒日期范围 + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前日期的 Calendar 实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 将提醒开始日期的偏移量转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期添加到请求参数 map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 将提醒结束日期的偏移量转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束日期的偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期添加到请求参数 map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + // 创建 MyBatis-Plus 的 Wrapper 对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始日期 + if (map.get("remindstart") != null) { + // 设置查询条件,要求列值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束日期 + if (map.get("remindend") != null) { + // 设置查询条件,要求列值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 调用服务层的 selectCount 方法,根据查询条件统计符合条件的记录数量 + int count = fangzhuService.selectCount(wrapper); + // 返回一个成功响应对象 R,并将统计数量放入响应的 count 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/FileController.java b/src/main/java/com/controller/FileController.java new file mode 100644 index 0000000..6b10c17 --- /dev/null +++ b/src/main/java/com/controller/FileController.java @@ -0,0 +1,155 @@ +package com.controller; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.UUID; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.ResourceUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.annotation.IgnoreAuth; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.entity.ConfigEntity; +import com.entity.EIException; +import com.service.ConfigService; +import com.utils.R; + +/** + * 上传文件映射表 + */ +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 映射该控制器处理的请求路径前缀为 "file" +@RequestMapping("file") +// 抑制编译器的泛型类型检查警告 +@SuppressWarnings({"unchecked", "rawtypes"}) +public class FileController { + // 自动注入 ConfigService 服务实例,用于操作配置相关的数据 + @Autowired + private ConfigService configService; + + /** + * 上传文件 + */ + // 映射处理 /upload 路径的请求,用于文件上传 + @RequestMapping("/upload") + // 处理文件上传请求的方法,接收上传的文件和类型参数,可能会抛出异常 + public R upload(@RequestParam("file") MultipartFile file, String type) throws Exception { + // 检查上传的文件是否为空 + if (file.isEmpty()) { + // 若为空,抛出异常提示上传文件不能为空 + throw new EIException("上传文件不能为空"); + } + // 获取文件扩展名 + String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1); + // 获取 classpath 下 static 目录的路径 + File path = new File(ResourceUtils.getURL("classpath:static").getPath()); + // 检查该路径对应的目录是否存在 + if (!path.exists()) { + // 若不存在,将路径设置为空字符串对应的文件对象 + path = new File(""); + } + // 构建上传文件的目录对象 + File upload = new File(path.getAbsolutePath(), "/upload/"); + // 检查上传目录是否存在 + if (!upload.exists()) { + // 若不存在,创建该目录及其父目录 + upload.mkdirs(); + } + // 生成新的文件名,由当前时间戳和文件扩展名组成 + String fileName = new Date().getTime() + "." + fileExt; + // 构建目标文件对象 + File dest = new File(upload.getAbsolutePath() + "/" + fileName); + // 将上传的文件传输到目标文件 + file.transferTo(dest); + // 检查类型参数是否不为空且等于 "1" + if (StringUtils.isNotBlank(type) && type.equals("1")) { + // 根据配置名称查询配置实体对象 + ConfigEntity configEntity = configService.selectOne(new EntityWrapper().eq("name", "faceFile")); + // 若配置实体对象不存在 + if (configEntity == null) { + // 创建新的配置实体对象 + configEntity = new ConfigEntity(); + // 设置配置名称 + configEntity.setName("faceFile"); + // 设置配置值为新生成的文件名 + configEntity.setValue(fileName); + } else { + // 若配置实体对象存在,更新配置值为新生成的文件名 + configEntity.setValue(fileName); + } + // 插入或更新配置实体对象 + configService.insertOrUpdate(configEntity); + } + // 返回成功响应,并将文件名放入响应的 file 字段中 + return R.ok().put("file", fileName); + } + + /** + * 下载文件 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /download 路径的请求,用于文件下载 + @RequestMapping("/download") + // 处理文件下载请求的方法,接收文件名参数,返回包含文件字节数组的响应实体 + public ResponseEntity download(@RequestParam String fileName) { + try { + // 获取 classpath 下 static 目录的路径 + File path = new File(ResourceUtils.getURL("classpath:static").getPath()); + // 检查该路径对应的目录是否存在 + if (!path.exists()) { + // 若不存在,将路径设置为空字符串对应的文件对象 + path = new File(""); + } + // 构建上传文件的目录对象 + File upload = new File(path.getAbsolutePath(), "/upload/"); + // 检查上传目录是否存在 + if (!upload.exists()) { + // 若不存在,创建该目录及其父目录 + upload.mkdirs(); + } + // 构建要下载的文件对象 + File file = new File(upload.getAbsolutePath() + "/" + fileName); + // 检查文件是否存在 + if (file.exists()) { + // 注释掉的代码用于检查用户是否有读取该文件的权限 + /*if(!fileService.canRead(file, SessionManager.getSessionUser())){ + getResponse().sendError(403); + }*/ + // 创建 HTTP 响应头对象 + HttpHeaders headers = new HttpHeaders(); + // 设置响应内容类型为二进制流 + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + // 设置响应内容的处理方式为附件下载,并指定文件名 + headers.setContentDispositionFormData("attachment", fileName); + // 将文件内容读取为字节数组,并封装在响应实体中返回,状态码为 201 Created + return new ResponseEntity(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); + } + } catch (IOException e) { + // 捕获并打印异常堆栈信息 + e.printStackTrace(); + } + // 若出现异常或文件不存在,返回状态码为 500 Internal Server Error 的响应实体 + return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); + } +} diff --git a/src/main/java/com/controller/HetongxinxiController.java b/src/main/java/com/controller/HetongxinxiController.java new file mode 100644 index 0000000..88af466 --- /dev/null +++ b/src/main/java/com/controller/HetongxinxiController.java @@ -0,0 +1,298 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.HetongxinxiEntity; +import com.entity.view.HetongxinxiView; + +import com.service.HetongxinxiService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 合同信息 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /hetongxinxi +@RequestMapping("/hetongxinxi") +public class HetongxinxiController { + // 自动注入 HetongxinxiService 服务类的实例,以便在本控制器中调用其业务方法 + @Autowired + private HetongxinxiService hetongxinxiService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的合同信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、合同信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, HetongxinxiEntity hetongxinxi, HttpServletRequest request) { + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 将当前会话中名为 "username" 的属性值(用户名)设置到合同信息实体的 yonghuming 字段中 + hetongxinxi.setYonghuming((String) request.getSession().getAttribute("username")); + } + // 如果获取到的 tableName 等于 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 将当前会话中名为 "username" 的属性值(用户名)设置到合同信息实体的 fangzhuzhanghao 字段中 + hetongxinxi.setFangzhuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 HetongxinxiService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = hetongxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, hetongxinxi), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端的合同信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、合同信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, HetongxinxiEntity hetongxinxi, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 HetongxinxiService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = hetongxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, hetongxinxi), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取合同信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收合同信息实体对象 + public R list(HetongxinxiEntity hetongxinxi) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(hetongxinxi, "hetongxinxi")); + // 调用 HetongxinxiService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", hetongxinxiService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询合同信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收合同信息实体对象 + public R query(HetongxinxiEntity hetongxinxi) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(hetongxinxi, "hetongxinxi")); + // 调用 HetongxinxiService 的 selectView 方法,根据查询条件获取合同信息视图对象 + HetongxinxiView hetongxinxiView = hetongxinxiService.selectView(ew); + // 返回一个成功的响应对象 R,附带查询成功的提示信息,并将查询到的数据放置在响应的 "data" 字段中 + return R.ok("查询合同信息成功").put("data", hetongxinxiView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的合同信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用 HetongxinxiService 的 selectById 方法,根据 ID 获取合同信息实体对象 + HetongxinxiEntity hetongxinxi = hetongxinxiService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的合同信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", hetongxinxi); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的合同信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用 HetongxinxiService 的 selectById 方法,根据 ID 获取合同信息实体对象 + HetongxinxiEntity hetongxinxi = hetongxinxiService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的合同信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", hetongxinxi); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的请求,用于在后端保存合同信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的合同信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody HetongxinxiEntity hetongxinxi, HttpServletRequest request) { + // 为合同信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + hetongxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(hetongxinxi); + // 调用 HetongxinxiService 的 insert 方法,将合同信息实体对象插入数据库 + hetongxinxiService.insert(hetongxinxi); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于在前端保存合同信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的合同信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody HetongxinxiEntity hetongxinxi, HttpServletRequest request) { + // 为合同信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + hetongxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(hetongxinxi); + // 调用 HetongxinxiService 的 insert 方法,将合同信息实体对象插入数据库 + hetongxinxiService.insert(hetongxinxi); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新合同信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的合同信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody HetongxinxiEntity hetongxinxi, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(hetongxinxi); + // 调用 HetongxinxiService 的 updateById 方法,根据 ID 更新合同信息实体对象的所有字段 + hetongxinxiService.updateById(hetongxinxi); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于删除合同信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 HetongxinxiService 的 deleteBatchIds 方法,根据 ID 数组批量删除合同信息实体对象 + hetongxinxiService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计符合特定条件的合同信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 设置查询条件,要求查询结果中 yonghuming 字段的值等于当前会话中名为 "username" 的属性值(用户名) + wrapper.eq("yonghuming", (String) request.getSession().getAttribute("username")); + } + // 如果获取到的 tableName 等于 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 设置查询条件,要求查询结果中 fangzhuzhanghao 字段的值等于当前会话中名为 "username" 的属性值(用户名) + wrapper.eq("fangzhuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用 HetongxinxiService 的 selectCount 方法,根据构建的查询条件统计符合条件的记录数量 + int count = hetongxinxiService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/MessagesController.java b/src/main/java/com/controller/MessagesController.java new file mode 100644 index 0000000..2e8553d --- /dev/null +++ b/src/main/java/com/controller/MessagesController.java @@ -0,0 +1,285 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.MessagesEntity; +import com.entity.view.MessagesView; + +import com.service.MessagesService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 留言板 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /messages +@RequestMapping("/messages") +public class MessagesController { + // 自动注入 MessagesService 服务类的实例,以便在本控制器中调用其业务方法 + @Autowired + private MessagesService messagesService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的留言板信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、留言板信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, MessagesEntity messages, HttpServletRequest request) { + // 如果当前会话中的角色属性值不是 "管理员" + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 将当前会话中的用户 ID 属性值设置到留言板信息实体的 userid 字段中 + messages.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 MessagesService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端的留言板信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、留言板信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, MessagesEntity messages, HttpServletRequest request) { + // 如果当前会话中的角色属性值不是 "管理员" + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 将当前会话中的用户 ID 属性值设置到留言板信息实体的 userid 字段中 + messages.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 MessagesService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取留言板信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收留言板信息实体对象 + public R list(MessagesEntity messages) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(messages, "messages")); + // 调用 MessagesService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", messagesService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询留言板信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收留言板信息实体对象 + public R query(MessagesEntity messages) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(messages, "messages")); + // 调用 MessagesService 的 selectView 方法,根据查询条件获取留言板信息视图对象 + MessagesView messagesView = messagesService.selectView(ew); + // 返回一个成功的响应对象 R,附带查询成功的提示信息,并将查询到的数据放置在响应的 "data" 字段中 + return R.ok("查询留言板成功").put("data", messagesView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的留言板信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用 MessagesService 的 selectById 方法,根据 ID 获取留言板信息实体对象 + MessagesEntity messages = messagesService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的留言板信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", messages); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的留言板信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用 MessagesService 的 selectById 方法,根据 ID 获取留言板信息实体对象 + MessagesEntity messages = messagesService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的留言板信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", messages); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的请求,用于在后端保存留言板信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的留言板信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody MessagesEntity messages, HttpServletRequest request) { + // 为留言板信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + messages.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(messages); + // 调用 MessagesService 的 insert 方法,将留言板信息实体对象插入数据库 + messagesService.insert(messages); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于在前端保存留言板信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的留言板信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody MessagesEntity messages, HttpServletRequest request) { + // 为留言板信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + messages.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(messages); + // 将当前会话中的用户 ID 属性值设置到留言板信息实体的 userid 字段中 + messages.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用 MessagesService 的 insert 方法,将留言板信息实体对象插入数据库 + messagesService.insert(messages); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新留言板信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的留言板信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody MessagesEntity messages, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(messages); + // 调用 MessagesService 的 updateById 方法,根据 ID 更新留言板信息实体对象的所有字段 + messagesService.updateById(messages); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于删除留言板信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 MessagesService 的 deleteBatchIds 方法,根据 ID 数组批量删除留言板信息实体对象 + messagesService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计符合特定条件的留言板信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用 MessagesService 的 selectCount 方法,根据构建的查询条件统计符合条件的记录数量 + int count = messagesService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/NewsController.java b/src/main/java/com/controller/NewsController.java new file mode 100644 index 0000000..bb43d98 --- /dev/null +++ b/src/main/java/com/controller/NewsController.java @@ -0,0 +1,277 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.NewsEntity; +import com.entity.view.NewsView; + +import com.service.NewsService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 公告信息 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /news +@RequestMapping("/news") +public class NewsController { + // 自动注入 NewsService 服务类的实例,以便在本控制器中调用其业务方法 + @Autowired + private NewsService newsService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的公告信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、公告信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, NewsEntity news, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 NewsService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /list 路径的请求,用于获取前端的公告信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、公告信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, NewsEntity news, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 NewsService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取公告信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收公告信息实体对象 + public R list(NewsEntity news) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(news, "news")); + // 调用 NewsService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", newsService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询公告信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收公告信息实体对象 + public R query(NewsEntity news) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(news, "news")); + // 调用 NewsService 的 selectView 方法,根据查询条件获取公告信息视图对象 + NewsView newsView = newsService.selectView(ew); + // 返回一个成功的响应对象 R,附带查询成功的提示信息,并将查询到的数据放置在响应的 "data" 字段中 + return R.ok("查询公告信息成功").put("data", newsView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的公告信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用 NewsService 的 selectById 方法,根据 ID 获取公告信息实体对象 + NewsEntity news = newsService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的公告信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", news); + } + + /** + * 前端详情 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的公告信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用 NewsService 的 selectById 方法,根据 ID 获取公告信息实体对象 + NewsEntity news = newsService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的公告信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", news); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的请求,用于在后端保存公告信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的公告信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody NewsEntity news, HttpServletRequest request) { + // 为公告信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + news.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(news); + // 调用 NewsService 的 insert 方法,将公告信息实体对象插入数据库 + newsService.insert(news); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于在前端保存公告信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的公告信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody NewsEntity news, HttpServletRequest request) { + // 为公告信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + news.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(news); + // 调用 NewsService 的 insert 方法,将公告信息实体对象插入数据库 + newsService.insert(news); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新公告信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的公告信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody NewsEntity news, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(news); + // 调用 NewsService 的 updateById 方法,根据 ID 更新公告信息实体对象的所有字段 + newsService.updateById(news); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于删除公告信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 NewsService 的 deleteBatchIds 方法,根据 ID 数组批量删除公告信息实体对象 + newsService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计符合特定条件的公告信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用 NewsService 的 selectCount 方法,根据构建的查询条件统计符合条件的记录数量 + int count = newsService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/StoreupController.java b/src/main/java/com/controller/StoreupController.java new file mode 100644 index 0000000..bc38eeb --- /dev/null +++ b/src/main/java/com/controller/StoreupController.java @@ -0,0 +1,292 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.StoreupEntity; +import com.entity.view.StoreupView; + +import com.service.StoreupService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 收藏表 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /storeup +@RequestMapping("/storeup") +public class StoreupController { + // 自动注入 StoreupService 服务类的实例,以便在本控制器中调用其业务方法 + @Autowired + private StoreupService storeupService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的收藏信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、收藏信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, StoreupEntity storeup, HttpServletRequest request) { + // 如果当前会话中的角色属性值不是 "管理员" + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 将当前会话中的用户 ID 属性值设置到收藏信息实体的 userid 字段中 + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 StoreupService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端的收藏信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、收藏信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, StoreupEntity storeup, HttpServletRequest request) { + // 如果当前会话中的角色属性值不是 "管理员" + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 将当前会话中的用户 ID 属性值设置到收藏信息实体的 userid 字段中 + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 StoreupService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取收藏信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收收藏信息实体对象 + public R list(StoreupEntity storeup) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(storeup, "storeup")); + // 调用 StoreupService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", storeupService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询收藏信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收收藏信息实体对象 + public R query(StoreupEntity storeup) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(storeup, "storeup")); + // 调用 StoreupService 的 selectView 方法,根据查询条件获取收藏信息视图对象 + StoreupView storeupView = storeupService.selectView(ew); + // 返回一个成功的响应对象 R,附带查询成功的提示信息,并将查询到的数据放置在响应的 "data" 字段中 + return R.ok("查询收藏表成功").put("data", storeupView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的收藏信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用 StoreupService 的 selectById 方法,根据 ID 获取收藏信息实体对象 + StoreupEntity storeup = storeupService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的收藏信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", storeup); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的收藏信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用 StoreupService 的 selectById 方法,根据 ID 获取收藏信息实体对象 + StoreupEntity storeup = storeupService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的收藏信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", storeup); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的请求,用于在后端保存收藏信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的收藏信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody StoreupEntity storeup, HttpServletRequest request) { + // 为收藏信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + storeup.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(storeup); + // 将当前会话中的用户 ID 属性值设置到收藏信息实体的 userid 字段中 + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用 StoreupService 的 insert 方法,将收藏信息实体对象插入数据库 + storeupService.insert(storeup); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于在前端保存收藏信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的收藏信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody StoreupEntity storeup, HttpServletRequest request) { + // 为收藏信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + storeup.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(storeup); + // 将当前会话中的用户 ID 属性值设置到收藏信息实体的 userid 字段中 + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用 StoreupService 的 insert 方法,将收藏信息实体对象插入数据库 + storeupService.insert(storeup); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新收藏信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的收藏信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody StoreupEntity storeup, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(storeup); + // 调用 StoreupService 的 updateById 方法,根据 ID 更新收藏信息实体对象的所有字段 + storeupService.updateById(storeup); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于删除收藏信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 StoreupService 的 deleteBatchIds 方法,根据 ID 数组批量删除收藏信息实体对象 + storeupService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计符合特定条件的收藏信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 如果当前会话中的角色属性值不是 "管理员" + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置查询条件,要求查询结果中 userid 字段的值等于当前会话中的用户 ID 属性值 + wrapper.eq("userid", (Long) request.getSession().getAttribute("userId")); + } + + // 调用 StoreupService 的 selectCount 方法,根据构建的查询条件统计符合条件的记录数量 + int count = storeupService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/UserController.java b/src/main/java/com/controller/UserController.java new file mode 100644 index 0000000..cdbc8cf --- /dev/null +++ b/src/main/java/com/controller/UserController.java @@ -0,0 +1,238 @@ + +package com.controller; + + +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.annotation.IgnoreAuth; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.entity.TokenEntity; +import com.entity.UserEntity; +import com.service.TokenService; +import com.service.UserService; +import com.utils.CommonUtil; +import com.utils.MPUtil; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.ValidatorUtils; + +/** + * 登录相关 + */ +// 映射请求路径前缀为 "users",即该控制器处理的请求 URL 都以 "users" 开头 +@RequestMapping("users") +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +public class UserController { + + // 自动注入 UserService 服务类的实例,以便在本控制器中调用其业务方法来处理用户相关业务逻辑 + @Autowired + private UserService userService; + + // 自动注入 TokenService 服务类的实例,用于生成和管理用户的令牌 + @Autowired + private TokenService tokenService; + + /** + * 登录 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 HTTP POST 请求,请求路径为 "/login" + @PostMapping(value = "/login") + // 处理用户登录请求的方法,接收用户名、密码、验证码和 HttpServletRequest 对象 + public R login(String username, String password, String captcha, HttpServletRequest request) { + // 根据用户名从数据库中查询用户信息 + UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username)); + // 如果用户不存在或者密码不匹配 + if (user == null || !user.getPassword().equals(password)) { + // 返回错误响应,提示账号或密码不正确 + return R.error("账号或密码不正确"); + } + // 调用 TokenService 生成用户令牌,包含用户 ID、用户名、用户类型和角色信息 + String token = tokenService.generateToken(user.getId(), username, "users", user.getRole()); + // 返回成功响应,并将生成的令牌放入响应数据中 + return R.ok().put("token", token); + } + + /** + * 注册 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 HTTP POST 请求,请求路径为 "/register" + @PostMapping(value = "/register") + // 处理用户注册请求的方法,接收请求体中的用户实体对象 + public R register(@RequestBody UserEntity user) { + // 注释掉的代码用于验证实体对象的合法性 + // ValidatorUtils.validateEntity(user); + // 检查数据库中是否已存在相同用户名的用户 + if (userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) != null) { + // 如果存在,返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 将用户信息插入数据库 + userService.insert(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 退出 + */ + // 映射处理 HTTP GET 请求,请求路径为 "logout" + @GetMapping(value = "logout") + // 处理用户退出登录请求的方法,接收 HttpServletRequest 对象 + public R logout(HttpServletRequest request) { + // 使当前用户的会话失效 + request.getSession().invalidate(); + // 返回成功响应,并附带退出成功的提示信息 + return R.ok("退出成功"); + } + + /** + * 密码重置 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理请求路径为 "/resetPass" 的请求 + @RequestMapping(value = "/resetPass") + // 处理用户密码重置请求的方法,接收用户名和 HttpServletRequest 对象 + public R resetPass(String username, HttpServletRequest request) { + // 根据用户名从数据库中查询用户信息 + UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username)); + // 如果用户不存在 + if (user == null) { + // 返回错误响应,提示账号不存在 + return R.error("账号不存在"); + } + // 将用户密码重置为 "123456" + user.setPassword("123456"); + // 更新用户信息到数据库 + userService.update(user, null); + // 返回成功响应,并附带密码重置成功的提示信息 + return R.ok("密码已重置为:123456"); + } + + /** + * 列表 + */ + // 映射处理请求路径为 "/page" 的请求,用于获取用户信息的分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数和用户实体对象 + public R page(@RequestParam Map params, UserEntity user) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 UserService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理请求路径为 "/list" 的请求,用于获取用户信息的列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收用户实体对象 + public R list(UserEntity user) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(user, "user")); + // 调用 UserService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", userService.selectListView(ew)); + } + + /** + * 信息 + */ + // 映射处理请求路径为 "/info/{id}" 的请求,用于获取指定 ID 的用户信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") String id) { + // 调用 UserService 的 selectById 方法,根据 ID 获取用户信息实体对象 + UserEntity user = userService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的用户信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", user); + } + + /** + * 获取用户的session用户信息 + */ + // 映射处理请求路径为 "/session" 的请求,用于获取当前会话中的用户信息 + @RequestMapping("/session") + // 处理获取会话用户信息请求的方法,接收 HttpServletRequest 对象 + public R getCurrUser(HttpServletRequest request) { + // 从当前会话中获取用户 ID + Long id = (Long) request.getSession().getAttribute("userId"); + // 调用 UserService 的 selectById 方法,根据 ID 获取用户信息实体对象 + UserEntity user = userService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的用户信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", user); + } + + /** + * 保存 + */ + // 映射处理 HTTP POST 请求,请求路径为 "/save",用于保存用户信息 + @PostMapping("/save") + // 处理保存请求的方法,接收请求体中的用户实体对象 + public R save(@RequestBody UserEntity user) { + // 注释掉的代码用于验证实体对象的合法性 + // ValidatorUtils.validateEntity(user); + // 检查数据库中是否已存在相同用户名的用户 + if (userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) != null) { + // 如果存在,返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 将用户信息插入数据库 + userService.insert(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理请求路径为 "/update" 的请求,用于更新用户信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的用户实体对象 + public R update(@RequestBody UserEntity user) { + // 注释掉的代码用于验证实体对象的合法性 + // ValidatorUtils.validateEntity(user); + // 调用 UserService 的 updateById 方法,根据 ID 更新用户信息实体对象的所有字段 + userService.updateById(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理请求路径为 "/delete" 的请求,用于删除用户信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 UserService 的 deleteBatchIds 方法,根据 ID 数组批量删除用户信息实体对象 + userService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } +} diff --git a/src/main/java/com/controller/WeixiuchuliController.java b/src/main/java/com/controller/WeixiuchuliController.java new file mode 100644 index 0000000..981b4e2 --- /dev/null +++ b/src/main/java/com/controller/WeixiuchuliController.java @@ -0,0 +1,298 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.WeixiuchuliEntity; +import com.entity.view.WeixiuchuliView; + +import com.service.WeixiuchuliService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 维修处理 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /weixiuchuli +@RequestMapping("/weixiuchuli") +public class WeixiuchuliController { + // 自动注入 WeixiuchuliService 服务类的实例,以便在本控制器中调用其业务方法 + @Autowired + private WeixiuchuliService weixiuchuliService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的维修处理信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、维修处理信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, WeixiuchuliEntity weixiuchuli, HttpServletRequest request) { + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 将当前会话中名为 "username" 的属性值(房主账号)设置到维修处理信息实体的 fangzhuzhanghao 字段中 + weixiuchuli.setFangzhuzhanghao((String) request.getSession().getAttribute("username")); + } + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 将当前会话中名为 "username" 的属性值(用户名)设置到维修处理信息实体的 yonghuming 字段中 + weixiuchuli.setYonghuming((String) request.getSession().getAttribute("username")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 WeixiuchuliService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = weixiuchuliService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, weixiuchuli), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 /list 路径的请求,用于获取前端的维修处理信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、维修处理信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, WeixiuchuliEntity weixiuchuli, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 WeixiuchuliService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = weixiuchuliService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, weixiuchuli), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取维修处理信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收维修处理信息实体对象 + public R list(WeixiuchuliEntity weixiuchuli) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(weixiuchuli, "weixiuchuli")); + // 调用 WeixiuchuliService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", weixiuchuliService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询维修处理信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收维修处理信息实体对象 + public R query(WeixiuchuliEntity weixiuchuli) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + //使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(weixiuchuli, "weixiuchuli")); + // 调用 WeixiuchuliService 的 selectView 方法,根据查询条件获取维修处理信息视图对象 + WeixiuchuliView weixiuchuliView = weixiuchuliService.selectView(ew); + // 返回一个成功的响应对象 R,附带查询成功的提示信息,并将查询到的数据放置在响应的 "data" 字段中 + return R.ok("查询维修处理成功").put("data", weixiuchuliView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的维修处理信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用 WeixiuchuliService 的 selectById 方法,根据 ID 获取维修处理信息实体对象 + WeixiuchuliEntity weixiuchuli = weixiuchuliService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的维修处理信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", weixiuchuli); + } + + /** + * 前端详情 + */ + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的维修处理信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用 WeixiuchuliService 的 selectById 方法,根据 ID 获取维修处理信息实体对象 + WeixiuchuliEntity weixiuchuli = weixiuchuliService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的维修处理信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", weixiuchuli); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的请求,用于在后端保存维修处理信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的维修处理信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody WeixiuchuliEntity weixiuchuli, HttpServletRequest request) { + // 为维修处理信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + weixiuchuli.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(weixiuchuli); + // 调用 WeixiuchuliService 的 insert 方法,将维修处理信息实体对象插入数据库 + weixiuchuliService.insert(weixiuchuli); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于在前端保存维修处理信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的维修处理信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody WeixiuchuliEntity weixiuchuli, HttpServletRequest request) { + // 为维修处理信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + weixiuchuli.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(weixiuchuli); + // 调用 WeixiuchuliService 的 insert 方法,将维修处理信息实体对象插入数据库 + weixiuchuliService.insert(weixiuchuli); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新维修处理信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的维修处理信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody WeixiuchuliEntity weixiuchuli, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(weixiuchuli); + // 调用 WeixiuchuliService 的 updateById 方法,根据 ID 更新维修处理信息实体对象的所有字段 + weixiuchuliService.updateById(weixiuchuli); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于删除维修处理信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 WeixiuchuliService 的 deleteBatchIds 方法,根据 ID 数组批量删除维修处理信息实体对象 + weixiuchuliService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计符合特定条件的维修处理信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 设置查询条件,要求查询结果中 fangzhuzhanghao 字段的值等于当前会话中名为 "username" 的属性值(房主账号) + wrapper.eq("fangzhuzhanghao", (String) request.getSession().getAttribute("username")); + } + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 设置查询条件,要求查询结果中 yonghuming 字段的值等于当前会话中名为 "username" 的属性值(用户名) + wrapper.eq("yonghuming", (String) request.getSession().getAttribute("username")); + } + + // 调用 WeixiuchuliService 的 selectCount 方法,根据构建的查询条件统计符合条件的记录数量 + int count = weixiuchuliService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/WoyaodangfangzhuController.java b/src/main/java/com/controller/WoyaodangfangzhuController.java new file mode 100644 index 0000000..664de67 --- /dev/null +++ b/src/main/java/com/controller/WoyaodangfangzhuController.java @@ -0,0 +1,292 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.WoyaodangfangzhuEntity; +import com.entity.view.WoyaodangfangzhuView; + +import com.service.WoyaodangfangzhuService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 我要当房主 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /woyaodangfangzhu +@RequestMapping("/woyaodangfangzhu") +public class WoyaodangfangzhuController { + // 自动注入 WoyaodangfangzhuService 服务类的实例,以便在本控制器中调用其业务方法 + @Autowired + private WoyaodangfangzhuService woyaodangfangzhuService; + + /** + * 后端列表 + */ + // 映射处理 /page 路径的请求,用于获取后端的“我要当房主”信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、“我要当房主”信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, WoyaodangfangzhuEntity woyaodangfangzhu, HttpServletRequest request) { + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 将当前会话中名为 "username" 的属性值(用户名)设置到“我要当房主”信息实体的 yonghuming 字段中 + woyaodangfangzhu.setYonghuming((String) request.getSession().getAttribute("username")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 WoyaodangfangzhuService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = woyaodangfangzhuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, woyaodangfangzhu), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /list 路径的请求,用于获取前端的“我要当房主”信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、“我要当房主”信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, WoyaodangfangzhuEntity woyaodangfangzhu, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 WoyaodangfangzhuService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = woyaodangfangzhuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, woyaodangfangzhu), params), params)); + // 返回一个成功的响应对象 R,并将分页数据放置在响应的 "data" 字段中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 /lists 路径的请求,用于获取“我要当房主”信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收“我要当房主”信息实体对象 + public R list(WoyaodangfangzhuEntity woyaodangfangzhu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(woyaodangfangzhu, "woyaodangfangzhu")); + // 调用 WoyaodangfangzhuService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", woyaodangfangzhuService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 /query 路径的请求,用于查询“我要当房主”信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收“我要当房主”信息实体对象 + public R query(WoyaodangfangzhuEntity woyaodangfangzhu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(woyaodangfangzhu, "woyaodangfangzhu")); + // 调用 WoyaodangfangzhuService 的 selectView 方法,根据查询条件获取“我要当房主”信息视图对象 + WoyaodangfangzhuView woyaodangfangzhuView = woyaodangfangzhuService.selectView(ew); + // 返回一个成功的响应对象 R,附带查询成功的提示信息,并将查询到的数据放置在响应的 "data" 字段中 + return R.ok("查询我要当房主成功").put("data", woyaodangfangzhuView); + } + + /** + * 后端详情 + */ + // 映射处理 /info/{id} 路径的请求,用于获取指定 ID 的“我要当房主”信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 调用 WoyaodangfangzhuService 的 selectById 方法,根据 ID 获取“我要当房主”信息实体对象 + WoyaodangfangzhuEntity woyaodangfangzhu = woyaodangfangzhuService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的“我要当房主”信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", woyaodangfangzhu); + } + + /** + * 前端详情 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 /detail/{id} 路径的请求,用于获取指定 ID 的“我要当房主”信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 调用 WoyaodangfangzhuService 的 selectById 方法,根据 ID 获取“我要当房主”信息实体对象 + WoyaodangfangzhuEntity woyaodangfangzhu = woyaodangfangzhuService.selectById(id); + // 返回一个成功的响应对象 R,并将获取到的“我要当房主”信息实体对象放置在响应的 "data" 字段中 + return R.ok().put("data", woyaodangfangzhu); + } + + /** + * 后端保存 + */ + // 映射处理 /save 路径的请求,用于在后端保存“我要当房主”信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的“我要当房主”信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody WoyaodangfangzhuEntity woyaodangfangzhu, HttpServletRequest request) { + // 为“我要当房主”信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + woyaodangfangzhu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(woyaodangfangzhu); + // 调用 WoyaodangfangzhuService 的 insert 方法,将“我要当房主”信息实体对象插入数据库 + woyaodangfangzhuService.insert(woyaodangfangzhu); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 /add 路径的请求,用于在前端保存“我要当房主”信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的“我要当房主”信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody WoyaodangfangzhuEntity woyaodangfangzhu, HttpServletRequest request) { + // 为“我要当房主”信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + woyaodangfangzhu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(woyaodangfangzhu); + // 调用 WoyaodangfangzhuService 的 insert 方法,将“我要当房主”信息实体对象插入数据库 + woyaodangfangzhuService.insert(woyaodangfangzhu); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 /update 路径的请求,用于更新“我要当房主”信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的“我要当房主”信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody WoyaodangfangzhuEntity woyaodangfangzhu, HttpServletRequest request) { + // 注释掉的代码用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(woyaodangfangzhu); + // 调用 WoyaodangfangzhuService 的 updateById 方法,根据 ID 更新“我要当房主”信息实体对象的所有字段 + woyaodangfangzhuService.updateById(woyaodangfangzhu); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 /delete 路径的请求,用于删除“我要当房主”信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用 WoyaodangfangzhuService 的 deleteBatchIds 方法,根据 ID 数组批量删除“我要当房主”信息实体对象 + woyaodangfangzhuService.deleteBatchIds(Arrays.asList(ids)); + // 返回一个成功的响应对象 R + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 /remind/{columnName}/{type} 路径的请求,用于统计符合特定条件的“我要当房主”信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 设置查询条件,要求查询结果中 columnName 对应的字段值小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 设置查询条件,要求查询结果中 yonghuming 字段的值等于当前会话中名为 "username" 的属性值(用户名) + wrapper.eq("yonghuming", (String) request.getSession().getAttribute("username")); + } + + // 调用 WoyaodangfangzhuService 的 selectCount 方法,根据构建的查询条件统计符合条件的记录数量 + int count = woyaodangfangzhuService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/YonghuController.java b/src/main/java/com/controller/YonghuController.java new file mode 100644 index 0000000..f87ec5c --- /dev/null +++ b/src/main/java/com/controller/YonghuController.java @@ -0,0 +1,394 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.YonghuEntity; +import com.entity.view.YonghuView; + +import com.service.YonghuService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 用户 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 "/yonghu",后续该控制器处理的请求都以这个路径为基础 +@RequestMapping("/yonghu") +public class YonghuController { + // 自动注入 YonghuService 服务类的实例,以便在本控制器中调用其方法处理用户相关业务逻辑 + @Autowired + private YonghuService yonghuService; + // 自动注入 TokenService 服务类的实例,用于生成和管理用户的令牌 + @Autowired + private TokenService tokenService; + + /** + * 登录 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 HTTP 请求,路径为 "/login",处理用户登录操作 + @RequestMapping(value = "/login") + // 处理用户登录请求的方法,接收用户名、密码、验证码和 HttpServletRequest 对象 + public R login(String username, String password, String captcha, HttpServletRequest request) { + // 根据传入的用户名(yonghuming 字段)从数据库中查询用户实体对象 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuming", username)); + // 如果查询到的用户为空,或者用户输入的密码与数据库中存储的密码(mima 字段)不匹配 + if (user == null || !user.getMima().equals(password)) { + // 返回错误响应,提示账号或密码不正确 + return R.error("账号或密码不正确"); + } + // 调用 TokenService 的 generateToken 方法生成用户令牌,传入用户 ID、用户名、用户类型("yonghu")和角色("用户") + String token = tokenService.generateToken(user.getId(), username, "yonghu", "用户"); + // 返回成功响应,并将生成的令牌放入响应数据中(键为 "token") + return R.ok().put("token", token); + } + + /** + * 注册 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 HTTP 请求,路径为 "/register",处理用户注册操作 + @RequestMapping("/register") + // 处理用户注册请求的方法,接收请求体中的用户实体对象 + public R register(@RequestBody YonghuEntity yonghu) { + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yonghu); + // 根据传入的用户实体对象中的用户名(yonghuming 字段)查询数据库中是否已存在该用户 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuming", yonghu.getYonghuming())); + // 如果查询到用户已存在 + if (user != null) { + // 返回错误响应,提示注册用户已存在 + return R.error("注册用户已存在"); + } + // 生成一个以当前时间戳为值的用户 ID + Long uId = new Date().getTime(); + // 将生成的用户 ID 设置到用户实体对象中 + yonghu.setId(uId); + // 将用户实体对象插入到数据库中 + yonghuService.insert(yonghu); + // 返回成功响应 + return R.ok(); + } + + /** + * 退出 + */ + // 映射处理 HTTP 请求,路径为 "/logout",处理用户退出登录操作 + @RequestMapping("/logout") + // 处理用户退出登录请求的方法,接收 HttpServletRequest 对象 + public R logout(HttpServletRequest request) { + // 使当前用户的会话失效,即注销用户会话 + request.getSession().invalidate(); + // 返回成功响应,并附带退出成功的提示信息 + return R.ok("退出成功"); + } + + /** + * 获取用户的 session 用户信息 + */ + // 映射处理 HTTP 请求,路径为 "/session",用于获取当前会话中的用户信息 + @RequestMapping("/session") + // 处理获取会话用户信息请求的方法,接收 HttpServletRequest 对象 + public R getCurrUser(HttpServletRequest request) { + // 从当前会话中获取用户 ID(假设存储在 "userId" 属性中) + Long id = (Long) request.getSession().getAttribute("userId"); + // 根据获取到的用户 ID 从数据库中查询用户实体对象 + YonghuEntity user = yonghuService.selectById(id); + // 返回成功响应,并将查询到的用户实体对象放入响应数据中(键为 "data") + return R.ok().put("data", user); + } + + /** + * 密码重置 + */ + // @IgnoreAuth 注解表示该接口不需要进行身份验证 + @IgnoreAuth + // 映射处理 HTTP 请求,路径为 "/resetPass",处理用户密码重置操作 + @RequestMapping(value = "/resetPass") + // 处理用户密码重置请求的方法,接收用户名和 HttpServletRequest 对象 + public R resetPass(String username, HttpServletRequest request) { + // 根据传入的用户名(yonghuming 字段)从数据库中查询用户实体对象 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuming", username)); + // 如果查询到的用户为空 + if (user == null) { + // 返回错误响应,提示账号不存在 + return R.error("账号不存在"); + } + // 将用户的密码(mima 字段)重置为 "123456" + user.setMima("123456"); + // 根据用户 ID 更新数据库中的用户信息(只更新密码字段) + yonghuService.updateById(user); + // 返回成功响应,并附带密码已重置的提示信息 + return R.ok("密码已重置为:123456"); + } + + /** + * 后端列表 + */ + // 映射处理 HTTP 请求,路径为 "/page",用于获取后端的用户信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、用户实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, YonghuEntity yonghu, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 YonghuService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params)); + // 返回成功响应,并将分页数据放入响应数据中(键为 "data") + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 HTTP 请求,路径为 "/list",用于获取前端的用户信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、用户实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, YonghuEntity yonghu, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 YonghuService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params)); + // 返回成功响应,并将分页数据放入响应数据中(键为 "data") + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 HTTP 请求,路径为 "/lists",用于获取用户信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收用户实体对象 + public R list(YonghuEntity yonghu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(yonghu, "yonghu")); + // 调用 YonghuService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", yonghuService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 HTTP 请求,路径为 "/query",用于查询用户信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收用户实体对象 + public R query(YonghuEntity yonghu) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(yonghu, "yonghu")); + // 调用 YonghuService 的 selectView 方法,根据查询条件获取用户信息视图对象 + YonghuView yonghuView = yonghuService.selectView(ew); + // 返回成功响应,附带查询成功的提示信息,并将查询到的数据放入响应数据中(键为 "data") + return R.ok("查询用户成功").put("data", yonghuView); + } + + /** + * 后端详情 + */ + // 映射处理 HTTP 请求,路径为 "/info/{id}",用于获取指定 ID 的用户信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 根据传入的用户 ID 从数据库中查询用户实体对象 + YonghuEntity yonghu = yonghuService.selectById(id); + // 返回成功响应,并将查询到的用户实体对象放入响应数据中(键为 "data") + return R.ok().put("data", yonghu); + } + + /** + * 前端详情 + */ + // 映射处理 HTTP 请求,路径为 "/detail/{id}",用于获取指定 ID 的用户信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 根据传入的用户 ID 从数据库中查询用户实体对象 + YonghuEntity yonghu = yonghuService.selectById(id); + // 返回成功响应,并将查询到的用户实体对象放入响应数据中(键为 "data") + return R.ok().put("data", yonghu); + } + + /** + * 后端保存 + */ + // 映射处理 HTTP 请求,路径为 "/save",用于在后端保存用户信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的用户实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request) { + // 为用户实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + yonghu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yonghu); + // 根据传入的用户实体对象中的用户名(yonghuming 字段)查询数据库中是否已存在该用户 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuming", yonghu.getYonghuming())); + // 如果查询到用户已存在 + if (user != null) { + // 返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 重新设置用户 ID 为当前时间戳 + yonghu.setId(new Date().getTime()); + // 将用户实体对象插入到数据库中 + yonghuService.insert(yonghu); + // 返回成功响应 + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 HTTP 请求,路径为 "/add",用于在前端保存用户信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的用户实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request) { + // 为用户实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + yonghu.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yonghu); + // 根据传入的用户实体对象中的用户名(yonghuming 字段)查询数据库中是否已存在该用户 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuming", yonghu.getYonghuming())); + // 如果查询到用户已存在 + if (user != null) { + // 返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 重新设置用户 ID 为当前时间戳 + yonghu.setId(new Date().getTime()); + // 将用户实体对象插入到数据库中 + yonghuService.insert(yonghu); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 HTTP 请求,路径为 "/update",用于更新用户信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的用户实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request) { + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yonghu); + // 根据用户 ID 更新数据库中的用户实体对象(更新所有字段) + yonghuService.updateById(yonghu); + // 返回成功响应 + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 HTTP 请求,路径为 "/delete",用于删除用户信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 根据传入的 ID 数组批量删除数据库中的用户实体对象 + yonghuService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 HTTP 请求,路径为 "/remind/{columnName}/{type}",用于统计符合特定条件的用户信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 将日历实例 c 的时间设置为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上,按照提醒结束的天数偏移量,增加相应的天数 + c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 获取增加天数后的日期,即提醒结束日期 + remindEndDate = c.getTime(); + // 将提醒结束日期按照 "yyyy-MM-dd" 的格式进行格式化,并将格式化后的日期重新放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } +// 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + if(map.get("remindstart")!=null) { + // 如果请求参数 map 中存在键为 "remindstart" 的值, + // 则在查询条件中设置 columnName 字段的值要大于等于提醒开始日期(remindstart) + wrapper.ge(columnName, map.get("remindstart")); + } + if(map.get("remindend")!=null) { + // 如果请求参数 map 中存在键为 "remindend" 的值, + // 则在查询条件中设置 columnName 字段的值要小于等于提醒结束日期(remindend) + wrapper.le(columnName, map.get("remindend")); + } + // 调用 YonghuService 的 selectCount 方法,根据构建的查询条件(wrapper)统计符合条件的记录数量 + int count = yonghuService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计得到的数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/controller/YuyuekanfangController.java b/src/main/java/com/controller/YuyuekanfangController.java new file mode 100644 index 0000000..1da33d1 --- /dev/null +++ b/src/main/java/com/controller/YuyuekanfangController.java @@ -0,0 +1,298 @@ +package com.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import com.utils.ValidatorUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.annotation.IgnoreAuth; + +import com.entity.YuyuekanfangEntity; +import com.entity.view.YuyuekanfangView; + +import com.service.YuyuekanfangService; +import com.service.TokenService; +import com.utils.PageUtils; +import com.utils.R; +import com.utils.MD5Util; +import com.utils.MPUtil; +import com.utils.CommonUtil; + + +/** + * 预约看房 + * 后端接口 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 声明该类为一个 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的响应 +@RestController +// 为该控制器映射请求路径前缀为 /yuyuekanfang,后续该控制器处理的请求都以这个路径为基础 +@RequestMapping("/yuyuekanfang") +public class YuyuekanfangController { + // 自动注入 YuyuekanfangService 服务类的实例,以便在本控制器中调用其方法处理预约看房相关业务逻辑 + @Autowired + private YuyuekanfangService yuyuekanfangService; + + /** + * 后端列表 + */ + // 映射处理 HTTP 请求,路径为 /page,用于获取后端的预约看房信息分页列表 + @RequestMapping("/page") + // 处理分页请求的方法,接收请求参数、预约看房信息实体对象以及 HttpServletRequest 对象 + public R page(@RequestParam Map params, YuyuekanfangEntity yuyuekanfang, HttpServletRequest request) { + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 将当前会话中名为 "username" 的属性值(用户名)设置到预约看房信息实体的 yonghuming 字段中 + yuyuekanfang.setYonghuming((String) request.getSession().getAttribute("username")); + } + // 如果获取到的 tableName 等于 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 将当前会话中名为 "username" 的属性值(房主账号)设置到预约看房信息实体的 fangzhuzhanghao 字段中 + yuyuekanfang.setFangzhuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 YuyuekanfangService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = yuyuekanfangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yuyuekanfang), params), params)); + // 返回成功响应,并将分页数据放入响应数据中(键为 "data") + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 映射处理 HTTP 请求,路径为 /list,用于获取前端的预约看房信息列表 + @RequestMapping("/list") + // 处理列表请求的方法,接收请求参数、预约看房信息实体对象以及 HttpServletRequest 对象 + public R list(@RequestParam Map params, YuyuekanfangEntity yuyuekanfang, HttpServletRequest request) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用 YuyuekanfangService 的 queryPage 方法进行分页查询,使用 MPUtil 工具类处理排序、范围查询和模糊查询 + PageUtils page = yuyuekanfangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yuyuekanfang), params), params)); + // 返回成功响应,并将分页数据放入响应数据中(键为 "data") + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 映射处理 HTTP 请求,路径为 /lists,用于获取预约看房信息的列表 + @RequestMapping("/lists") + // 处理列表请求的方法,接收预约看房信息实体对象 + public R list(YuyuekanfangEntity yuyuekanfang) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(yuyuekanfang, "yuyuekanfang")); + // 调用 YuyuekanfangService 的 selectListView 方法,根据查询条件获取列表视图数据 + return R.ok().put("data", yuyuekanfangService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射处理 HTTP 请求,路径为 /query,用于查询预约看房信息 + @RequestMapping("/query") + // 处理查询请求的方法,接收预约看房信息实体对象 + public R query(YuyuekanfangEntity yuyuekanfang) { + // 创建一个 MyBatis-Plus 的 EntityWrapper 对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 使用 MPUtil 工具类将实体对象的属性转换为查询条件,并设置到 EntityWrapper 中 + ew.allEq(MPUtil.allEQMapPre(yuyuekanfang, "yuyuekanfang")); + // 调用 YuyuekanfangService 的 selectView 方法,根据查询条件获取预约看房信息视图对象 + YuyuekanfangView yuyuekanfangView = yuyuekanfangService.selectView(ew); + // 返回成功响应,附带查询成功的提示信息,并将查询到的数据放入响应数据中(键为 "data") + return R.ok("查询预约看房成功").put("data", yuyuekanfangView); + } + + /** + * 后端详情 + */ + // 映射处理 HTTP 请求,路径为 /info/{id},用于获取指定 ID 的预约看房信息详情 + @RequestMapping("/info/{id}") + // 处理详情请求的方法,接收路径参数 id + public R info(@PathVariable("id") Long id) { + // 根据传入的预约看房信息 ID 从数据库中查询预约看房信息实体对象 + YuyuekanfangEntity yuyuekanfang = yuyuekanfangService.selectById(id); + // 返回成功响应,并将查询到的预约看房信息实体对象放入响应数据中(键为 "data") + return R.ok().put("data", yuyuekanfang); + } + + /** + * 前端详情 + */ + // 映射处理 HTTP 请求,路径为 /detail/{id},用于获取指定 ID 的预约看房信息详情 + @RequestMapping("/detail/{id}") + // 处理详情请求的方法,接收路径参数 id + public R detail(@PathVariable("id") Long id) { + // 根据传入的预约看房信息 ID 从数据库中查询预约看房信息实体对象 + YuyuekanfangEntity yuyuekanfang = yuyuekanfangService.selectById(id); + // 返回成功响应,并将查询到的预约看房信息实体对象放入响应数据中(键为 "data") + return R.ok().put("data", yuyuekanfang); + } + + /** + * 后端保存 + */ + // 映射处理 HTTP 请求,路径为 /save,用于在后端保存预约看房信息 + @RequestMapping("/save") + // 处理保存请求的方法,接收请求体中的预约看房信息实体对象以及 HttpServletRequest 对象 + public R save(@RequestBody YuyuekanfangEntity yuyuekanfang, HttpServletRequest request) { + // 为预约看房信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + yuyuekanfang.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yuyuekanfang); + // 将预约看房信息实体对象插入到数据库中 + yuyuekanfangService.insert(yuyuekanfang); + // 返回成功响应 + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射处理 HTTP 请求,路径为 /add,用于在前端保存预约看房信息 + @RequestMapping("/add") + // 处理保存请求的方法,接收请求体中的预约看房信息实体对象以及 HttpServletRequest 对象 + public R add(@RequestBody YuyuekanfangEntity yuyuekanfang, HttpServletRequest request) { + // 为预约看房信息实体对象生成一个唯一的 ID,由当前时间戳加上一个 0 到 999 的随机整数组成 + yuyuekanfang.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yuyuekanfang); + // 将预约看房信息实体对象插入到数据库中 + yuyuekanfangService.insert(yuyuekanfang); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 映射处理 HTTP 请求,路径为 /update,用于更新预约看房信息 + @RequestMapping("/update") + // 处理更新请求的方法,接收请求体中的预约看房信息实体对象以及 HttpServletRequest 对象 + public R update(@RequestBody YuyuekanfangEntity yuyuekanfang, HttpServletRequest request) { + // 注释掉的代码,可能是用于验证实体对象的合法性(未实现或暂不使用) + //ValidatorUtils.validateEntity(yuyuekanfang); + // 根据预约看房信息实体对象的 ID 更新数据库中的该对象(更新所有字段) + yuyuekanfangService.updateById(yuyuekanfang); + // 返回成功响应 + return R.ok(); + } + + /** + * 删除 + */ + // 映射处理 HTTP 请求,路径为 /delete,用于删除预约看房信息 + @RequestMapping("/delete") + // 处理删除请求的方法,接收请求体中的 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 根据传入的 ID 数组批量删除数据库中的预约看房信息实体对象 + yuyuekanfangService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射处理 HTTP 请求,路径为 /remind/{columnName}/{type},用于统计符合特定条件的预约看房信息数量(提醒相关) + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求的方法,接收路径参数 columnName 和 type,请求参数 map 以及 HttpServletRequest 对象 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将路径参数 columnName 放入请求参数 map 中,键为 "column" + map.put("column", columnName); + // 将路径参数 type 放入请求参数 map 中,键为 "type" + map.put("type", type); + + // 如果路径参数 type 的值等于 "2" + if (type.equals("2")) { + // 创建一个 SimpleDateFormat 对象,用于格式化日期,格式为 "yyyy-MM-dd" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取当前的日历实例 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期变量,初始值为 null + Date remindStartDate = null; + // 定义提醒结束日期变量,初始值为 null + Date remindEndDate = null; + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 将 "remindstart" 的值转换为整数类型,代表提醒开始的天数偏移量 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒开始的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取计算后的提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 map 中,键为 "remindstart" + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 将 "remindend" 的值转换为整数类型,代表提醒结束的天数偏移量 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历实例的时间为当前日期 + c.setTime(new Date()); + // 在当前日期的基础上加上提醒结束的天数偏移量 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取计算后的提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 map 中,键为 "remindend" + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个 MyBatis-Plus 的 Wrapper 对象,具体类型为 EntityWrapper,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数 map 中存在键为 "remindstart" 的值 + if (map.get("remindstart") != null) { + // 在查询条件中设置 columnName 字段的值要大于等于提醒开始日期(remindstart) + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数 map 中存在键为 "remindend" 的值 + if (map.get("remindend") != null) { + // 在查询条件中设置 columnName 字段的值要小于等于提醒结束日期(remindend) + wrapper.le(columnName, map.get("remindend")); + } + + // 从请求的会话中获取名为 "tableName" 的属性值,并转换为字符串类型 + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果获取到的 tableName 等于 "yonghu"(用户) + if (tableName.equals("yonghu")) { + // 在查询条件中设置 yonghuming 字段的值等于当前会话中名为 "username" 的属性值(用户名) + wrapper.eq("yonghuming", (String) request.getSession().getAttribute("username")); + } + // 如果获取到的 tableName 等于 "fangzhu"(房主) + if (tableName.equals("fangzhu")) { + // 在查询条件中设置 fangzhuzhanghao 字段的值等于当前会话中名为 "username" 的属性值(房主账号) + wrapper.eq("fangzhuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用 YuyuekanfangService 的 selectCount 方法,根据构建的查询条件(wrapper)统计符合条件的记录数量 + int count = yuyuekanfangService.selectCount(wrapper); + // 返回一个成功的响应对象 R,并将统计得到的数量放置在响应的 "count" 字段中 + return R.ok().put("count", count); + } +} diff --git a/src/main/java/com/dao/CommonDao.java b/src/main/java/com/dao/CommonDao.java new file mode 100644 index 0000000..f7156fd --- /dev/null +++ b/src/main/java/com/dao/CommonDao.java @@ -0,0 +1,34 @@ + +package com.dao; + +import java.util.List; +import java.util.Map; + +/** + * 通用接口 + */ +public interface CommonDao{ + // 获取选项列表,根据传入的参数Map params进行查询,返回值为包含字符串的列表 + List getOption(Map params); + + // 根据传入的参数Map params进行查询,返回一个包含各种属性的Map对象,具体含义由业务逻辑决定 + Map getFollowByOption(Map params); + + // 获取另一组选项列表,根据传入的参数Map params进行查询,返回值为包含字符串的列表,与getOption方法的区别可能在于查询逻辑或返回数据不同 + List getFollowByOption2(Map params); + + // 执行名为sh的操作,具体功能由实现类决定,传入参数为Map params + void sh(Map params); + + // 根据传入的参数Map params进行查询,统计符合条件的数量,返回统计的数量值 + int remindCount(Map params); + + // 根据传入的参数Map params进行查询,返回一个包含计算结果或相关数据的Map对象,具体计算逻辑由业务决定 + Map selectCal(Map params); + + // 根据传入的参数Map params进行查询,返回一个包含多个Map对象的列表,每个Map对象可能代表分组后的统计数据或相关信息,分组逻辑由业务决定 + List> selectGroup(Map params); + + // 根据传入的参数Map params进行查询,返回一个包含多个Map对象的列表,每个Map对象可能代表特定的值或相关数据,具体含义由业务逻辑决定 + List> selectValue(Map params); +} diff --git a/src/main/java/com/dao/ConfigDao.java b/src/main/java/com/dao/ConfigDao.java new file mode 100644 index 0000000..3b1a357 --- /dev/null +++ b/src/main/java/com/dao/ConfigDao.java @@ -0,0 +1,12 @@ + +package com.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.entity.ConfigEntity; + +/** + * 配置 + */ +public interface ConfigDao extends BaseMapper { + +} diff --git a/src/main/java/com/dao/DiscussfangwuxinxiDao.java b/src/main/java/com/dao/DiscussfangwuxinxiDao.java new file mode 100644 index 0000000..4b294da --- /dev/null +++ b/src/main/java/com/dao/DiscussfangwuxinxiDao.java @@ -0,0 +1,40 @@ +package com.dao; + +import com.entity.DiscussfangwuxinxiEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.DiscussfangwuxinxiVO; +import com.entity.view.DiscussfangwuxinxiView; + + +/** + * 房屋信息评论表 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为DiscussfangwuxinxiDao的接口,它继承自BaseMapper, +// 意味着该接口具备对DiscussfangwuxinxiEntity实体进行基本数据库操作的能力(如插入、更新、删除、查询等) +public interface DiscussfangwuxinxiDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋信息评论视图对象DiscussfangwuxinxiVO列表 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋信息评论视图对象DiscussfangwuxinxiVO + DiscussfangwuxinxiVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋信息评论视图DiscussfangwuxinxiView列表 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 分页查询符合条件的房屋信息评论视图DiscussfangwuxinxiView列表 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋信息评论视图DiscussfangwuxinxiView + DiscussfangwuxinxiView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/DiscusswoyaodangfangzhuDao.java b/src/main/java/com/dao/DiscusswoyaodangfangzhuDao.java new file mode 100644 index 0000000..c34596e --- /dev/null +++ b/src/main/java/com/dao/DiscusswoyaodangfangzhuDao.java @@ -0,0 +1,44 @@ +package com.dao; + +import com.entity.DiscusswoyaodangfangzhuEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.DiscusswoyaodangfangzhuVO; +import com.entity.view.DiscusswoyaodangfangzhuView; + + +/** + * 我要当房主评论表 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为DiscusswoyaodangfangzhuDao的接口,它继承自BaseMapper, +// 这意味着该接口具备对DiscusswoyaodangfangzhuEntity实体进行基础数据库操作(如插入、更新、删除、查询等)的能力 +public interface DiscusswoyaodangfangzhuDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper, + // 查询并返回符合条件的“我要当房主”评论视图对象DiscusswoyaodangfangzhuVO的列表 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper, + // 查询并返回符合条件的单个“我要当房主”评论视图对象DiscusswoyaodangfangzhuVO + DiscusswoyaodangfangzhuVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper, + // 查询并返回符合条件的“我要当房主”评论视图DiscusswoyaodangfangzhuView的列表 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的“我要当房主”评论视图DiscusswoyaodangfangzhuView的列表 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper, + // 查询并返回符合条件的单个“我要当房主”评论视图DiscusswoyaodangfangzhuView + DiscusswoyaodangfangzhuView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/FangwubaoxiuDao.java b/src/main/java/com/dao/FangwubaoxiuDao.java new file mode 100644 index 0000000..5d19201 --- /dev/null +++ b/src/main/java/com/dao/FangwubaoxiuDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.FangwubaoxiuEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.FangwubaoxiuVO; +import com.entity.view.FangwubaoxiuView; + + +/** + * 房屋报修 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为FangwubaoxiuDao的接口,继承自BaseMapper, +// 表明该接口可以使用MyBatis-Plus提供的针对FangwubaoxiuEntity实体的基础数据库操作方法 +public interface FangwubaoxiuDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋报修视图对象列表 + // 返回一个包含FangwubaoxiuVO对象的List集合 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋报修视图对象 + // 返回一个FangwubaoxiuVO对象 + FangwubaoxiuVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋报修视图列表 + // 返回一个包含FangwubaoxiuView对象的List集合 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的房屋报修视图列表 + // 返回一个包含FangwubaoxiuView对象的List集合 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋报修视图 + // 返回一个FangwubaoxiuView对象 + FangwubaoxiuView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/FangwuleixingDao.java b/src/main/java/com/dao/FangwuleixingDao.java new file mode 100644 index 0000000..0a89917 --- /dev/null +++ b/src/main/java/com/dao/FangwuleixingDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.FangwuleixingEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.FangwuleixingVO; +import com.entity.view.FangwuleixingView; + + +/** + * 房屋类型 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为FangwuleixingDao的接口,继承自BaseMapper, +// 意味着该接口具备对FangwuleixingEntity实体进行基本数据库操作(如增删改查)的能力 +public interface FangwuleixingDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋类型视图对象列表 + // 以List形式返回FangwuleixingVO对象,@Param("ew")用于给查询条件参数命名 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋类型视图对象 + // 返回一个FangwuleixingVO对象,@Param("ew")用于给查询条件参数命名 + FangwuleixingVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋类型视图列表 + // 以List形式返回FangwuleixingView对象,@Param("ew")用于给查询条件参数命名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的房屋类型视图列表 + // 以List形式返回FangwuleixingView对象,@Param("ew")用于给查询条件参数命名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋类型视图 + // 返回一个FangwuleixingView对象,@Param("ew")用于给查询条件参数命名 + FangwuleixingView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/FangwupingjiaDao.java b/src/main/java/com/dao/FangwupingjiaDao.java new file mode 100644 index 0000000..e7f005f --- /dev/null +++ b/src/main/java/com/dao/FangwupingjiaDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.FangwupingjiaEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.FangwupingjiaVO; +import com.entity.view.FangwupingjiaView; + + +/** + * 房屋评价 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为FangwupingjiaDao的接口,它继承自BaseMapper, +// 这使得该接口具备了对FangwupingjiaEntity实体进行基础数据库操作(如插入、更新、删除、查询等)的能力 +public interface FangwupingjiaDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋评价视图对象列表 + // 返回值为包含FangwupingjiaVO对象的List集合,@Param("ew")注解用于指定传入的查询条件参数名 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋评价视图对象 + // 返回一个FangwupingjiaVO对象,@Param("ew")用于指定查询条件参数名 + FangwupingjiaVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋评价视图列表 + // 返回值为包含FangwupingjiaView对象的List集合,@Param("ew")指定查询条件参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的房屋评价视图列表 + // 返回值为包含FangwupingjiaView对象的List集合,@Param("ew")指定查询条件参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋评价视图 + // 返回一个FangwupingjiaView对象,@Param("ew")指定查询条件参数名 + FangwupingjiaView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/FangwuxinxiDao.java b/src/main/java/com/dao/FangwuxinxiDao.java new file mode 100644 index 0000000..be3733f --- /dev/null +++ b/src/main/java/com/dao/FangwuxinxiDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.FangwuxinxiEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.FangwuxinxiVO; +import com.entity.view.FangwuxinxiView; + + +/** + * 房屋信息 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为FangwuxinxiDao的接口,继承自BaseMapper, +// 表明该接口可使用MyBatis-Plus提供的对FangwuxinxiEntity实体的基本数据库操作功能 +public interface FangwuxinxiDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋信息视图对象列表 + // 返回一个包含FangwuxinxiVO对象的列表,@Param("ew")用于指定参数名,方便在SQL映射中引用 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋信息视图对象 + // 返回一个FangwuxinxiVO对象,@Param("ew")用于指定参数名 + FangwuxinxiVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房屋信息视图列表 + // 返回一个包含FangwuxinxiView对象的列表,@Param("ew")用于指定参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的房屋信息视图列表 + // 返回一个包含FangwuxinxiView对象的列表,@Param("ew")用于指定参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房屋信息视图 + // 返回一个FangwuxinxiView对象,@Param("ew")用于指定参数名 + FangwuxinxiView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/FangzhuDao.java b/src/main/java/com/dao/FangzhuDao.java new file mode 100644 index 0000000..ee9b76b --- /dev/null +++ b/src/main/java/com/dao/FangzhuDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.FangzhuEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.FangzhuVO; +import com.entity.view.FangzhuView; + + +/** + * 房主 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为FangzhuDao的接口,继承自BaseMapper, +// 意味着该接口具备对FangzhuEntity实体进行基本数据库操作(如增删改查)的能力 +public interface FangzhuDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房主视图对象列表 + // 返回一个包含FangzhuVO对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房主视图对象 + // 返回一个FangzhuVO对象,@Param("ew")用于指定查询条件的参数名 + FangzhuVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的房主视图列表 + // 返回一个包含FangzhuView对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的房主视图列表 + // 返回一个包含FangzhuView对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个房主视图 + // 返回一个FangzhuView对象,@Param("ew")用于指定查询条件的参数名 + FangzhuView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/HetongxinxiDao.java b/src/main/java/com/dao/HetongxinxiDao.java new file mode 100644 index 0000000..417ad95 --- /dev/null +++ b/src/main/java/com/dao/HetongxinxiDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.HetongxinxiEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.HetongxinxiVO; +import com.entity.view.HetongxinxiView; + + +/** + * 合同信息 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为HetongxinxiDao的接口,它继承自BaseMapper, +// 表明该接口能够使用MyBatis-Plus提供的针对HetongxinxiEntity实体的基础数据库操作方法(如增、删、改、查) +public interface HetongxinxiDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的合同信息视图对象列表 + // 返回值为一个包含HetongxinxiVO对象的List集合,@Param("ew")用于指定参数名,方便在SQL映射中引用该查询条件 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的单个合同信息视图对象 + // 返回一个HetongxinxiVO对象,@Param("ew")用于指定参数名 + HetongxinxiVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的合同信息视图列表 + // 返回值为一个包含HetongxinxiView对象的List集合,@Param("ew")用于指定参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的合同信息视图列表 + // 返回值为一个包含HetongxinxiView对象的List集合,@Param("ew")用于指定参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的单个合同信息视图 + // 返回一个HetongxinxiView对象,@Param("ew")用于指定参数名 + HetongxinxiView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/MessagesDao.java b/src/main/java/com/dao/MessagesDao.java new file mode 100644 index 0000000..a737a2a --- /dev/null +++ b/src/main/java/com/dao/MessagesDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.MessagesEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.MessagesVO; +import com.entity.view.MessagesView; + + +/** + * 留言板 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为MessagesDao的接口,继承自BaseMapper, +// 表明该接口具备对MessagesEntity实体进行基本数据库操作(如插入、更新、删除、查询等)的能力 +public interface MessagesDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的消息视图对象列表 + // 返回一个包含MessagesVO对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个消息视图对象 + // 返回一个MessagesVO对象,@Param("ew")用于指定查询条件的参数名 + MessagesVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的消息视图列表 + // 返回一个包含MessagesView对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的消息视图列表 + // 返回一个包含MessagesView对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个消息视图 + // 返回一个MessagesView对象,@Param("ew")用于指定查询条件的参数名 + MessagesView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/NewsDao.java b/src/main/java/com/dao/NewsDao.java new file mode 100644 index 0000000..7288078 --- /dev/null +++ b/src/main/java/com/dao/NewsDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.NewsEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.NewsVO; +import com.entity.view.NewsView; + + +/** + * 公告信息 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为NewsDao的接口,继承自BaseMapper, +// 这意味着该接口拥有对NewsEntity实体进行基本数据库操作(如插入、更新、删除、查询等)的能力 +public interface NewsDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的新闻视图对象列表 + // 返回一个包含NewsVO对象的List集合,@Param("ew")用于指定查询条件参数的名称 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的单个新闻视图对象 + // 返回一个NewsVO对象,@Param("ew")用于指定查询条件参数的名称 + NewsVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的新闻视图列表 + // 返回一个包含NewsView对象的List集合,@Param("ew")用于指定查询条件参数的名称 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的新闻视图列表 + // 返回一个包含NewsView对象的List集合,@Param("ew")用于指定查询条件参数的名称 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询并返回符合条件的单个新闻视图 + // 返回一个NewsView对象,@Param("ew")用于指定查询条件参数的名称 + NewsView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/StoreupDao.java b/src/main/java/com/dao/StoreupDao.java new file mode 100644 index 0000000..1f7b2e0 --- /dev/null +++ b/src/main/java/com/dao/StoreupDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.StoreupEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.StoreupVO; +import com.entity.view.StoreupView; + + +/** + * 收藏表 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为StoreupDao的接口,继承自BaseMapper, +// 这表明该接口可以使用MyBatis-Plus提供的对StoreupEntity实体的基础数据库操作功能 +public interface StoreupDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的收藏视图对象列表 + // 返回一个包含StoreupVO对象的列表,@Param("ew")用于指定查询条件参数名,方便在SQL映射中引用 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个收藏视图对象 + // 返回一个StoreupVO对象,@Param("ew")用于指定查询条件参数名 + StoreupVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的收藏视图列表 + // 返回一个包含StoreupView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的收藏视图列表 + // 返回一个包含StoreupView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个收藏视图 + // 返回一个StoreupView对象,@Param("ew")用于指定查询条件参数名 + StoreupView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/TokenDao.java b/src/main/java/com/dao/TokenDao.java new file mode 100644 index 0000000..65839f1 --- /dev/null +++ b/src/main/java/com/dao/TokenDao.java @@ -0,0 +1,28 @@ + +package com.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; +import com.entity.TokenEntity; + +/** + * token + */ +// 定义一个名为TokenDao的接口,继承自BaseMapper, +// 意味着该接口具备对TokenEntity实体进行基本数据库操作(如增删改查)的能力 +public interface TokenDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的Token实体列表 + // 返回一个包含TokenEntity对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的Token实体列表 + // 返回一个包含TokenEntity对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/UserDao.java b/src/main/java/com/dao/UserDao.java new file mode 100644 index 0000000..397e5b4 --- /dev/null +++ b/src/main/java/com/dao/UserDao.java @@ -0,0 +1,28 @@ + +package com.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; +import com.entity.UserEntity; + +/** + * 用户 + */ +// 定义一个名为UserDao的接口,继承自BaseMapper, +// 这表明该接口可以使用MyBatis-Plus提供的针对UserEntity实体的基础数据库操作(如插入、更新、删除、查询等) +public interface UserDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的用户实体列表 + // 返回一个包含UserEntity对象的列表,@Param("ew")用于指定查询条件的参数名,方便在SQL映射中引用该条件 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的用户实体列表 + // 返回一个包含UserEntity对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/WeixiuchuliDao.java b/src/main/java/com/dao/WeixiuchuliDao.java new file mode 100644 index 0000000..1a83914 --- /dev/null +++ b/src/main/java/com/dao/WeixiuchuliDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.WeixiuchuliEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.WeixiuchuliVO; +import com.entity.view.WeixiuchuliView; + + +/** + * 维修处理 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为WeixiuchuliDao的接口,继承自BaseMapper, +// 这表明该接口具备对WeixiuchuliEntity实体进行基本数据库操作(如增、删、改、查)的能力 +public interface WeixiuchuliDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的维修处理视图对象列表 + // 返回一个包含WeixiuchuliVO对象的列表,@Param("ew")用于指定查询条件参数名,方便在SQL映射中引用 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个维修处理视图对象 + // 返回一个WeixiuchuliVO对象,@Param("ew")用于指定查询条件参数名 + WeixiuchuliVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的维修处理视图列表 + // 返回一个包含WeixiuchuliView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的维修处理视图列表 + // 返回一个包含WeixiuchuliView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个维修处理视图 + // 返回一个WeixiuchuliView对象,@Param("ew")用于指定查询条件参数名 + WeixiuchuliView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/WoyaodangfangzhuDao.java b/src/main/java/com/dao/WoyaodangfangzhuDao.java new file mode 100644 index 0000000..6cc9acc --- /dev/null +++ b/src/main/java/com/dao/WoyaodangfangzhuDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.WoyaodangfangzhuEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.WoyaodangfangzhuVO; +import com.entity.view.WoyaodangfangzhuView; + + +/** + * 我要当房主 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为WoyaodangfangzhuDao的接口,继承自BaseMapper, +// 表明该接口具备对WoyaodangfangzhuEntity实体进行基本数据库操作(如增、删、改、查)的能力 +public interface WoyaodangfangzhuDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的“我要当房主”视图对象列表 + // 返回一个包含WoyaodangfangzhuVO对象的列表,@Param("ew")用于指定查询条件参数名,便于在SQL映射中引用 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个“我要当房主”视图对象 + // 返回一个WoyaodangfangzhuVO对象,@Param("ew")用于指定查询条件参数名 + WoyaodangfangzhuVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的“我要当房主”视图列表 + // 返回一个包含WoyaodangfangzhuView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的“我要当房主”视图列表 + // 返回一个包含WoyaodangfangzhuView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个“我要当房主”视图 + // 返回一个WoyaodangfangzhuView对象,@Param("ew")用于指定查询条件参数名 + WoyaodangfangzhuView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/YonghuDao.java b/src/main/java/com/dao/YonghuDao.java new file mode 100644 index 0000000..33002b1 --- /dev/null +++ b/src/main/java/com/dao/YonghuDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.YonghuEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.YonghuVO; +import com.entity.view.YonghuView; + + +/** + * 用户 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为YonghuDao的接口,继承自BaseMapper, +// 这意味着该接口可以使用MyBatis-Plus提供的对YonghuEntity实体的基础数据库操作功能 +public interface YonghuDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的用户视图对象列表 + // 返回一个包含YonghuVO对象的列表,@Param("ew")用于指定查询条件参数名,方便在SQL映射中引用 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个用户视图对象 + // 返回一个YonghuVO对象,@Param("ew")用于指定查询条件参数名 + YonghuVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的用户视图列表 + // 返回一个包含YonghuView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的用户视图列表 + // 返回一个包含YonghuView对象的列表,@Param("ew")用于指定查询条件参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个用户视图 + // 返回一个YonghuView对象,@Param("ew")用于指定查询条件参数名 + YonghuView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/dao/YuyuekanfangDao.java b/src/main/java/com/dao/YuyuekanfangDao.java new file mode 100644 index 0000000..bab2a87 --- /dev/null +++ b/src/main/java/com/dao/YuyuekanfangDao.java @@ -0,0 +1,45 @@ +package com.dao; + +import com.entity.YuyuekanfangEntity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import java.util.List; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.pagination.Pagination; + +import org.apache.ibatis.annotations.Param; +import com.entity.vo.YuyuekanfangVO; +import com.entity.view.YuyuekanfangView; + + +/** + * 预约看房 + * + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 定义一个名为YuyuekanfangDao的接口,继承自BaseMapper, +// 表明该接口具备对YuyuekanfangEntity实体进行基本数据库操作(如插入、更新、删除、查询等)的能力 +public interface YuyuekanfangDao extends BaseMapper { + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的预约看房视图对象列表 + // 返回一个包含YuyuekanfangVO对象的列表,@Param("ew")用于指定查询条件的参数名,方便在SQL映射中引用 + List selectListVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个预约看房视图对象 + // 返回一个YuyuekanfangVO对象,@Param("ew")用于指定查询条件的参数名 + YuyuekanfangVO selectVO(@Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的预约看房视图列表 + // 返回一个包含YuyuekanfangView对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(@Param("ew") Wrapper wrapper); + + // 根据传入的分页信息Pagination page和查询条件Wrapper wrapper, + // 进行分页查询,返回符合条件的预约看房视图列表 + // 返回一个包含YuyuekanfangView对象的列表,@Param("ew")用于指定查询条件的参数名 + List selectListView(Pagination page, @Param("ew") Wrapper wrapper); + + // 根据传入的查询条件Wrapper wrapper,查询符合条件的单个预约看房视图 + // 返回一个YuyuekanfangView对象,@Param("ew")用于指定查询条件的参数名 + YuyuekanfangView selectView(@Param("ew") Wrapper wrapper); +} diff --git a/src/main/java/com/entity/ConfigEntity.java b/src/main/java/com/entity/ConfigEntity.java new file mode 100644 index 0000000..25281d6 --- /dev/null +++ b/src/main/java/com/entity/ConfigEntity.java @@ -0,0 +1,63 @@ +package com.entity; + +// 导入序列化接口,用于支持对象的序列化 +import java.io.Serializable; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 配置信息实体类,对应数据库表 config + */ +@TableName("config") // 使用 @TableName 注解指定对应的数据库表名 +public class ConfigEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * key(配置项的键) + */ + private String name; // 配置项的键 + + /** + * value(配置项的值) + */ + private String value; // 配置项的值 + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + // 获取配置项的键 + public String getName() { + return name; + } + + // 设置配置项的键 + public void setName(String name) { + this.name = name; + } + + // 获取配置项的值 + public String getValue() { + return value; + } + + // 设置配置项的值 + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/java/com/entity/DiscussfangwuxinxiEntity.java b/src/main/java/com/entity/DiscussfangwuxinxiEntity.java new file mode 100644 index 0000000..f29497b --- /dev/null +++ b/src/main/java/com/entity/DiscussfangwuxinxiEntity.java @@ -0,0 +1,158 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 房屋信息评论表实体类,对应数据库表 discussfangwuxinxi + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("discussfangwuxinxi") // 使用 @TableName 注解指定对应的数据库表名 +public class DiscussfangwuxinxiEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public DiscussfangwuxinxiEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public DiscussfangwuxinxiEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 关联表id + */ + private Long refid; // 关联表id + + /** + * 用户id + */ + private Long userid; // 用户id + + /** + * 评论内容 + */ + private String content; // 评论内容 + + /** + * 回复内容 + */ + private String reply; // 回复内容 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:关联表id + */ + public void setRefid(Long refid) { + this.refid = refid; + } + + /** + * 获取:关联表id + */ + public Long getRefid() { + return refid; + } + + /** + * 设置:用户id + */ + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + /** + * 设置:评论内容 + */ + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:评论内容 + */ + public String getContent() { + return content; + } + + /** + * 设置:回复内容 + */ + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } +} diff --git a/src/main/java/com/entity/DiscusswoyaodangfangzhuEntity.java b/src/main/java/com/entity/DiscusswoyaodangfangzhuEntity.java new file mode 100644 index 0000000..9cb7aa1 --- /dev/null +++ b/src/main/java/com/entity/DiscusswoyaodangfangzhuEntity.java @@ -0,0 +1,158 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 我要当房主评论表实体类,对应数据库表 discusswoyaodangfangzhu + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("discusswoyaodangfangzhu") // 使用 @TableName 注解指定对应的数据库表名 +public class DiscusswoyaodangfangzhuEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public DiscusswoyaodangfangzhuEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public DiscusswoyaodangfangzhuEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 关联表id + */ + private Long refid; // 关联表id + + /** + * 用户id + */ + private Long userid; // 用户id + + /** + * 评论内容 + */ + private String content; // 评论内容 + + /** + * 回复内容 + */ + private String reply; // 回复内容 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:关联表id + */ + public void setRefid(Long refid) { + this.refid = refid; + } + + /** + * 获取:关联表id + */ + public Long getRefid() { + return refid; + } + + /** + * 设置:用户id + */ + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + /** + * 设置:评论内容 + */ + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:评论内容 + */ + public String getContent() { + return content; + } + + /** + * 设置:回复内容 + */ + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } +} diff --git a/src/main/java/com/entity/EIException.java b/src/main/java/com/entity/EIException.java new file mode 100644 index 0000000..c910706 --- /dev/null +++ b/src/main/java/com/entity/EIException.java @@ -0,0 +1,73 @@ +package com.entity; + +/** + * 自定义异常类,用于统一处理系统中的异常信息 + */ +public class EIException extends RuntimeException { // 继承 RuntimeException,表示运行时异常 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + private String msg; // 异常信息 + private int code = 500; // 异常代码,默认为 500 + + /** + * 构造方法,传入异常信息 + */ + public EIException(String msg) { + super(msg); // 调用父类构造方法,设置异常信息 + this.msg = msg; // 设置自定义异常信息 + } + + /** + * 构造方法,传入异常信息和异常对象 + */ + public EIException(String msg, Throwable e) { + super(msg, e); // 调用父类构造方法,设置异常信息和异常对象 + this.msg = msg; // 设置自定义异常信息 + } + + /** + * 构造方法,传入异常信息和异常代码 + */ + public EIException(String msg, int code) { + super(msg); // 调用父类构造方法,设置异常信息 + this.msg = msg; // 设置自定义异常信息 + this.code = code; // 设置自定义异常代码 + } + + /** + * 构造方法,传入异常信息、异常代码和异常对象 + */ + public EIException(String msg, int code, Throwable e) { + super(msg, e); // 调用父类构造方法,设置异常信息和异常对象 + this.msg = msg; // 设置自定义异常信息 + this.code = code; // 设置自定义异常代码 + } + + /** + * 获取异常信息 + */ + public String getMsg() { + return msg; + } + + /** + * 设置异常信息 + */ + public void setMsg(String msg) { + this.msg = msg; + } + + /** + * 获取异常代码 + */ + public int getCode() { + return code; + } + + /** + * 设置异常代码 + */ + public void setCode(int code) { + this.code = code; + } +} diff --git a/src/main/java/com/entity/FangwubaoxiuEntity.java b/src/main/java/com/entity/FangwubaoxiuEntity.java new file mode 100644 index 0000000..f41ea94 --- /dev/null +++ b/src/main/java/com/entity/FangwubaoxiuEntity.java @@ -0,0 +1,369 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 房屋报修实体类,对应数据库表 fangwubaoxiu + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("fangwubaoxiu") // 使用 @TableName 注解指定对应的数据库表名 +public class FangwubaoxiuEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public FangwubaoxiuEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public FangwubaoxiuEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 合同编号 + */ + private String hetongbianhao; // 合同编号 + + /** + * 房屋名称 + */ + private String fangwumingcheng; // 房屋名称 + + /** + * 房屋类型 + */ + private String fangwuleixing; // 房屋类型 + + /** + * 小区 + */ + private String xiaoqu; // 小区 + + /** + * 报修名称 + */ + private String baoxiumingcheng; // 报修名称 + + /** + * 类型 + */ + private String leixing; // 类型 + + /** + * 报修内容 + */ + private String baoxiuneirong; // 报修内容 + + /** + * 图片 + */ + private String tupian; // 图片 + + /** + * 报修日期 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date baoxiuriqi; // 报修日期 + + /** + * 房主账号 + */ + private String fangzhuzhanghao; // 房主账号 + + /** + * 房主姓名 + */ + private String fangzhuxingming; // 房主姓名 + + /** + * 用户名 + */ + private String yonghuming; // 用户名 + + /** + * 联系电话 + */ + private String lianxidianhua; // 联系电话 + + /** + * 是否审核 + */ + private String sfsh; // 是否审核 + + /** + * 审核回复 + */ + private String shhf; // 审核回复 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:合同编号 + */ + public void setHetongbianhao(String hetongbianhao) { + this.hetongbianhao = hetongbianhao; + } + + /** + * 获取:合同编号 + */ + public String getHetongbianhao() { + return hetongbianhao; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:小区 + */ + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + /** + * 设置:报修名称 + */ + public void setBaoxiumingcheng(String baoxiumingcheng) { + this.baoxiumingcheng = baoxiumingcheng; + } + + /** + * 获取:报修名称 + */ + public String getBaoxiumingcheng() { + return baoxiumingcheng; + } + + /** + * 设置:类型 + */ + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + /** + * 获取:类型 + */ + public String getLeixing() { + return leixing; + } + + /** + * 设置:报修内容 + */ + public void setBaoxiuneirong(String baoxiuneirong) { + this.baoxiuneirong = baoxiuneirong; + } + + /** + * 获取:报修内容 + */ + public String getBaoxiuneirong() { + return baoxiuneirong; + } + + /** + * 设置:图片 + */ + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + /** + * 设置:报修日期 + */ + public void setBaoxiuriqi(Date baoxiuriqi) { + this.baoxiuriqi = baoxiuriqi; + } + + /** + * 获取:报修日期 + */ + public Date getBaoxiuriqi() { + return baoxiuriqi; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:房主姓名 + */ + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + /** + * 设置:用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置:联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + /** + * 设置:是否审核 + */ + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + /** + * 设置:审核回复 + */ + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } +} diff --git a/src/main/java/com/entity/FangwuleixingEntity.java b/src/main/java/com/entity/FangwuleixingEntity.java new file mode 100644 index 0000000..f974b48 --- /dev/null +++ b/src/main/java/com/entity/FangwuleixingEntity.java @@ -0,0 +1,101 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 房屋类型实体类,对应数据库表 fangwuleixing + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("fangwuleixing") // 使用 @TableName 注解指定对应的数据库表名 +public class FangwuleixingEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public FangwuleixingEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public FangwuleixingEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 房屋类型 + */ + private String fangwuleixing; // 房屋类型 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } +} diff --git a/src/main/java/com/entity/FangwupingjiaEntity.java b/src/main/java/com/entity/FangwupingjiaEntity.java new file mode 100644 index 0000000..3cdab22 --- /dev/null +++ b/src/main/java/com/entity/FangwupingjiaEntity.java @@ -0,0 +1,312 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 房屋评价实体类,对应数据库表 fangwupingjia + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("fangwupingjia") // 使用 @TableName 注解指定对应的数据库表名 +public class FangwupingjiaEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public FangwupingjiaEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public FangwupingjiaEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 合同编号 + */ + private String hetongbianhao; // 合同编号 + + /** + * 房屋名称 + */ + private String fangwumingcheng; // 房屋名称 + + /** + * 房屋类型 + */ + private String fangwuleixing; // 房屋类型 + + /** + * 小区 + */ + private String xiaoqu; // 小区 + + /** + * 评分 + */ + private String pingfen; // 评分 + + /** + * 评价内容 + */ + private String pingjianeirong; // 评价内容 + + /** + * 评价日期 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date pingjiariqi; // 评价日期 + + /** + * 房主账号 + */ + private String fangzhuzhanghao; // 房主账号 + + /** + * 用户名 + */ + private String yonghuming; // 用户名 + + /** + * 联系电话 + */ + private String lianxidianhua; // 联系电话 + + /** + * 是否审核 + */ + private String sfsh; // 是否审核 + + /** + * 审核回复 + */ + private String shhf; // 审核回复 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:合同编号 + */ + public void setHetongbianhao(String hetongbianhao) { + this.hetongbianhao = hetongbianhao; + } + + /** + * 获取:合同编号 + */ + public String getHetongbianhao() { + return hetongbianhao; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:小区 + */ + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + /** + * 设置:评分 + */ + public void setPingfen(String pingfen) { + this.pingfen = pingfen; + } + + /** + * 获取:评分 + */ + public String getPingfen() { + return pingfen; + } + + /** + * 设置:评价内容 + */ + public void setPingjianeirong(String pingjianeirong) { + this.pingjianeirong = pingjianeirong; + } + + /** + * 获取:评价内容 + */ + public String getPingjianeirong() { + return pingjianeirong; + } + + /** + * 设置:评价日期 + */ + public void setPingjiariqi(Date pingjiariqi) { + this.pingjiariqi = pingjiariqi; + } + + /** + * 获取:评价日期 + */ + public Date getPingjiariqi() { + return pingjiariqi; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置:联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + /** + * 设置:是否审核 + */ + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + /** + * 设置:审核回复 + */ + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } +} diff --git a/src/main/java/com/entity/FangwuxinxiEntity.java b/src/main/java/com/entity/FangwuxinxiEntity.java new file mode 100644 index 0000000..ab8c980 --- /dev/null +++ b/src/main/java/com/entity/FangwuxinxiEntity.java @@ -0,0 +1,388 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 房屋信息实体类,对应数据库表 fangwuxinxi + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("fangwuxinxi") // 使用 @TableName 注解指定对应的数据库表名 +public class FangwuxinxiEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public FangwuxinxiEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public FangwuxinxiEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 房屋名称 + */ + private String fangwumingcheng; // 房屋名称 + + /** + * 房屋类型 + */ + private String fangwuleixing; // 房屋类型 + + /** + * 图片 + */ + private String tupian; // 图片 + + /** + * 租赁方式 + */ + private String zulinfangshi; // 租赁方式 + + /** + * 朝向楼层 + */ + private String chaoxianglouceng; // 朝向楼层 + + /** + * 面积 + */ + private String mianji; // 面积 + + /** + * 房屋状态 + */ + private String fangwuzhuangtai; // 房屋状态 + + /** + * 小区 + */ + private String xiaoqu; // 小区 + + /** + * 详细地址 + */ + private String xiangxidizhi; // 详细地址 + + /** + * 月租价格 + */ + private Integer yuezujiage; // 月租价格 + + /** + * 押金 + */ + private Integer yajin; // 押金 + + /** + * 房屋设施 + */ + private String fangwusheshi; // 房屋设施 + + /** + * 房屋详情 + */ + private String fangwuxiangqing; // 房屋详情 + + /** + * 发布日期 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date faburiqi; // 发布日期 + + /** + * 房主账号 + */ + private String fangzhuzhanghao; // 房主账号 + + /** + * 房主姓名 + */ + private String fangzhuxingming; // 房主姓名 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:图片 + */ + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + /** + * 设置:租赁方式 + */ + public void setZulinfangshi(String zulinfangshi) { + this.zulinfangshi = zulinfangshi; + } + + /** + * 获取:租赁方式 + */ + public String getZulinfangshi() { + return zulinfangshi; + } + + /** + * 设置:朝向楼层 + */ + public void setChaoxianglouceng(String chaoxianglouceng) { + this.chaoxianglouceng = chaoxianglouceng; + } + + /** + * 获取:朝向楼层 + */ + public String getChaoxianglouceng() { + return chaoxianglouceng; + } + + /** + * 设置:面积 + */ + public void setMianji(String mianji) { + this.mianji = mianji; + } + + /** + * 获取:面积 + */ + public String getMianji() { + return mianji; + } + + /** + * 设置:房屋状态 + */ + public void setFangwuzhuangtai(String fangwuzhuangtai) { + this.fangwuzhuangtai = fangwuzhuangtai; + } + + /** + * 获取:房屋状态 + */ + public String getFangwuzhuangtai() { + return fangwuzhuangtai; + } + + /** + * 设置:小区 + */ + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + /** + * 设置:详细地址 + */ + public void setXiangxidizhi(String xiangxidizhi) { + this.xiangxidizhi = xiangxidizhi; + } + + /** + * 获取:详细地址 + */ + public String getXiangxidizhi() { + return xiangxidizhi; + } + + /** + * 设置:月租价格 + */ + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + /** + * 设置:押金 + */ + public void setYajin(Integer yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public Integer getYajin() { + return yajin; + } + + /** + * 设置:房屋设施 + */ + public void setFangwusheshi(String fangwusheshi) { + this.fangwusheshi = fangwusheshi; + } + + /** + * 获取:房屋设施 + */ + public String getFangwusheshi() { + return fangwusheshi; + } + + /** + * 设置:房屋详情 + */ + public void setFangwuxiangqing(String fangwuxiangqing) { + this.fangwuxiangqing = fangwuxiangqing; + } + + /** + * 获取:房屋详情 + */ + public String getFangwuxiangqing() { + return fangwuxiangqing; + } + + /** + * 设置:发布日期 + */ + public void setFaburiqi(Date faburiqi) { + this.faburiqi = faburiqi; + } + + /** + * 获取:发布日期 + */ + public Date getFaburiqi() { + return faburiqi; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:房主姓名 + */ + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } +} diff --git a/src/main/java/com/entity/FangzhuEntity.java b/src/main/java/com/entity/FangzhuEntity.java new file mode 100644 index 0000000..aafbbb1 --- /dev/null +++ b/src/main/java/com/entity/FangzhuEntity.java @@ -0,0 +1,215 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 房主实体类,对应数据库表 fangzhu + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("fangzhu") // 使用 @TableName 注解指定对应的数据库表名 +public class FangzhuEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public FangzhuEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public FangzhuEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 房主账号 + */ + private String fangzhuzhanghao; // 房主账号 + + /** + * 密码 + */ + private String mima; // 密码 + + /** + * 房主姓名 + */ + private String fangzhuxingming; // 房主姓名 + + /** + * 性别 + */ + private String xingbie; // 性别 + + /** + * 头像 + */ + private String touxiang; // 头像 + + /** + * 手机 + */ + private String shouji; // 手机 + + /** + * 身份证 + */ + private String shenfenzheng; // 身份证 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:密码 + */ + public void setMima(String mima) { + this.mima = mima; + } + + /** + * 获取:密码 + */ + public String getMima() { + return mima; + } + + /** + * 设置:房主姓名 + */ + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + /** + * 设置:性别 + */ + public void setXingbie(String xingbie) { + this.xingbie = xingbie; + } + + /** + * 获取:性别 + */ + public String getXingbie() { + return xingbie; + } + + /** + * 设置:头像 + */ + public void setTouxiang(String touxiang) { + this.touxiang = touxiang; + } + + /** + * 获取:头像 + */ + public String getTouxiang() { + return touxiang; + } + + /** + * 设置:手机 + */ + public void setShouji(String shouji) { + this.shouji = shouji; + } + + /** + * 获取:手机 + */ + public String getShouji() { + return shouji; + } + + /** + * 设置:身份证 + */ + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } +} diff --git a/src/main/java/com/entity/HetongxinxiEntity.java b/src/main/java/com/entity/HetongxinxiEntity.java new file mode 100644 index 0000000..80da8fe --- /dev/null +++ b/src/main/java/com/entity/HetongxinxiEntity.java @@ -0,0 +1,466 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 合同信息实体类,对应数据库表 hetongxinxi + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("hetongxinxi") // 使用 @TableName 注解指定对应的数据库表名 +public class HetongxinxiEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public HetongxinxiEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public HetongxinxiEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 合同编号 + */ + private String hetongbianhao; // 合同编号 + + /** + * 房屋名称 + */ + private String fangwumingcheng; // 房屋名称 + + /** + * 房屋类型 + */ + private String fangwuleixing; // 房屋类型 + + /** + * 小区 + */ + private String xiaoqu; // 小区 + + /** + * 月租价格 + */ + private String yuezujiage; // 月租价格 + + /** + * 租用月数 + */ + private String zuyongyueshu; // 租用月数 + + /** + * 租用金额 + */ + private Integer zuyongjine; // 租用金额 + + /** + * 押金 + */ + private Integer yajin; // 押金 + + /** + * 房租状态 + */ + private String fangzuzhuangtai; // 房租状态 + + /** + * 合同金额 + */ + private String hetongjine; // 合同金额 + + /** + * 合同内容 + */ + private String hetongneirong; // 合同内容 + + /** + * 生效日 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date shengxiaori; // 生效日 + + /** + * 有限期至 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date youxianqizhi; // 有限期至 + + /** + * 用户名 + */ + private String yonghuming; // 用户名 + + /** + * 联系电话 + */ + private String lianxidianhua; // 联系电话 + + /** + * 房主账号 + */ + private String fangzhuzhanghao; // 房主账号 + + /** + * 房主姓名 + */ + private String fangzhuxingming; // 房主姓名 + + /** + * 是否审核 + */ + private String sfsh; // 是否审核 + + /** + * 审核回复 + */ + private String shhf; // 审核回复 + + /** + * 是否支付 + */ + private String ispay; // 是否支付 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:合同编号 + */ + public void setHetongbianhao(String hetongbianhao) { + this.hetongbianhao = hetongbianhao; + } + + /** + * 获取:合同编号 + */ + public String getHetongbianhao() { + return hetongbianhao; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:小区 + */ + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + /** + * 设置:月租价格 + */ + public void setYuezujiage(String yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public String getYuezujiage() { + return yuezujiage; + } + + /** + * 设置:租用月数 + */ + public void setZuyongyueshu(String zuyongyueshu) { + this.zuyongyueshu = zuyongyueshu; + } + + /** + * 获取:租用月数 + */ + public String getZuyongyueshu() { + return zuyongyueshu; + } + + /** + * 设置:租用金额 + */ + public void setZuyongjine(Integer zuyongjine) { + this.zuyongjine = zuyongjine; + } + + /** + * 获取:租用金额 + */ + public Integer getZuyongjine() { + return zuyongjine; + } + + /** + * 设置:押金 + */ + public void setYajin(Integer yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public Integer getYajin() { + return yajin; + } + + /** + * 设置:房租状态 + */ + public void setFangzuzhuangtai(String fangzuzhuangtai) { + this.fangzuzhuangtai = fangzuzhuangtai; + } + + /** + * 获取:房租状态 + */ + public String getFangzuzhuangtai() { + return fangzuzhuangtai; + } + + /** + * 设置:合同金额 + */ + public void setHetongjine(String hetongjine) { + this.hetongjine = hetongjine; + } + + /** + * 获取:合同金额 + */ + public String getHetongjine() { + return hetongjine; + } + + /** + * 设置:合同内容 + */ + public void setHetongneirong(String hetongneirong) { + this.hetongneirong = hetongneirong; + } + + /** + * 获取:合同内容 + */ + public String getHetongneirong() { + return hetongneirong; + } + + /** + * 设置:生效日 + */ + public void setShengxiaori(Date shengxiaori) { + this.shengxiaori = shengxiaori; + } + + /** + * 获取:生效日 + */ + public Date getShengxiaori() { + return shengxiaori; + } + + /** + * 设置:有限期至 + */ + public void setYouxianqizhi(Date youxianqizhi) { + this.youxianqizhi = youxianqizhi; + } + + /** + * 获取:有限期至 + */ + public Date getYouxianqizhi() { + return youxianqizhi; + } + + /** + * 设置:用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置:联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:房主姓名 + */ + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + /** + * 设置:是否审核 + */ + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + /** + * 设置:审核回复 + */ + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + + /** + * 设置:是否支付 + */ + public void setIspay(String ispay) { + this.ispay = ispay; + } + + /** + * 获取:是否支付 + */ + public String getIspay() { + return ispay; + } +} diff --git a/src/main/java/com/entity/MessagesEntity.java b/src/main/java/com/entity/MessagesEntity.java new file mode 100644 index 0000000..5b479f2 --- /dev/null +++ b/src/main/java/com/entity/MessagesEntity.java @@ -0,0 +1,158 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 留言板实体类,对应数据库表 messages + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("messages") // 使用 @TableName 注解指定对应的数据库表名 +public class MessagesEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public MessagesEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public MessagesEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 留言人id + */ + private Long userid; // 留言人id + + /** + * 用户名 + */ + private String username; // 用户名 + + /** + * 留言内容 + */ + private String content; // 留言内容 + + /** + * 回复内容 + */ + private String reply; // 回复内容 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:留言人id + */ + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:留言人id + */ + public Long getUserid() { + return userid; + } + + /** + * 设置:用户名 + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * 获取:用户名 + */ + public String getUsername() { + return username; + } + + /** + * 设置:留言内容 + */ + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:留言内容 + */ + public String getContent() { + return content; + } + + /** + * 设置:回复内容 + */ + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } +} diff --git a/src/main/java/com/entity/NewsEntity.java b/src/main/java/com/entity/NewsEntity.java new file mode 100644 index 0000000..3adf419 --- /dev/null +++ b/src/main/java/com/entity/NewsEntity.java @@ -0,0 +1,158 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 公告信息实体类,对应数据库表 news + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("news") // 使用 @TableName 注解指定对应的数据库表名 +public class NewsEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public NewsEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public NewsEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 标题 + */ + private String title; // 标题 + + /** + * 简介 + */ + private String introduction; // 简介 + + /** + * 图片 + */ + private String picture; // 图片 + + /** + * 内容 + */ + private String content; // 内容 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:标题 + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * 获取:标题 + */ + public String getTitle() { + return title; + } + + /** + * 设置:简介 + */ + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + /** + * 获取:简介 + */ + public String getIntroduction() { + return introduction; + } + + /** + * 设置:图片 + */ + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * 获取:图片 + */ + public String getPicture() { + return picture; + } + + /** + * 设置:内容 + */ + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:内容 + */ + public String getContent() { + return content; + } +} diff --git a/src/main/java/com/entity/StoreupEntity.java b/src/main/java/com/entity/StoreupEntity.java new file mode 100644 index 0000000..8bb453e --- /dev/null +++ b/src/main/java/com/entity/StoreupEntity.java @@ -0,0 +1,177 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 收藏表实体类,对应数据库表 storeup + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("storeup") // 使用 @TableName 注解指定对应的数据库表名 +public class StoreupEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public StoreupEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public StoreupEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 用户id + */ + private Long userid; // 用户id + + /** + * 收藏id + */ + private Long refid; // 收藏id + + /** + * 表名 + */ + private String tablename; // 表名 + + /** + * 收藏名称 + */ + private String name; // 收藏名称 + + /** + * 收藏图片 + */ + private String picture; // 收藏图片 + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; // 添加时间 + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:用户id + */ + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + /** + * 设置:收藏id + */ + public void setRefid(Long refid) { + this.refid = refid; + } + + /** + * 获取:收藏id + */ + public Long getRefid() { + return refid; + } + + /** + * 设置:表名 + */ + public void setTablename(String tablename) { + this.tablename = tablename; + } + + /** + * 获取:表名 + */ + public String getTablename() { + return tablename; + } + + /** + * 设置:收藏名称 + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取:收藏名称 + */ + public String getName() { + return name; + } + + /** + * 设置:收藏图片 + */ + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * 获取:收藏图片 + */ + public String getPicture() { + return picture; + } +} diff --git a/src/main/java/com/entity/TokenEntity.java b/src/main/java/com/entity/TokenEntity.java new file mode 100644 index 0000000..7f8f681 --- /dev/null +++ b/src/main/java/com/entity/TokenEntity.java @@ -0,0 +1,151 @@ +package com.entity; + +// 导入必要的 Java 类 +import java.io.Serializable; +import java.util.Date; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * token表实体类,对应数据库表 token + */ +@TableName("token") // 使用 @TableName 注解指定对应的数据库表名 +public class TokenEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 用户id + */ + private Long userid; // 用户id + + /** + * 用户名 + */ + private String username; // 用户名 + + /** + * 表名 + */ + private String tablename; // 表名 + + /** + * 角色 + */ + private String role; // 角色 + + /** + * token + */ + private String token; // token + + /** + * 过期时间 + */ + private Date expiratedtime; // 过期时间 + + /** + * 新增时间 + */ + private Date addtime; // 新增时间 + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + // 获取用户id + public Long getUserid() { + return userid; + } + + // 设置用户id + public void setUserid(Long userid) { + this.userid = userid; + } + + // 获取角色 + public String getRole() { + return role; + } + + // 设置角色 + public void setRole(String role) { + this.role = role; + } + + // 获取token + public String getToken() { + return token; + } + + // 获取表名 + public String getTablename() { + return tablename; + } + + // 设置表名 + public void setTablename(String tablename) { + this.tablename = tablename; + } + + // 设置token + public void setToken(String token) { + this.token = token; + } + + // 获取过期时间 + public Date getExpiratedtime() { + return expiratedtime; + } + + // 设置过期时间 + public void setExpiratedtime(Date expiratedtime) { + this.expiratedtime = expiratedtime; + } + + // 获取新增时间 + public Date getAddtime() { + return addtime; + } + + // 设置新增时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取用户名 + public String getUsername() { + return username; + } + + // 设置用户名 + public void setUsername(String username) { + this.username = username; + } + + // 带参数的构造方法 + public TokenEntity(Long userid, String username, String tablename, String role, String token, Date expiratedtime) { + super(); + this.userid = userid; + this.username = username; + this.tablename = tablename; + this.role = role; + this.token = token; + this.expiratedtime = expiratedtime; + } + + // 无参构造方法 + public TokenEntity() { + } +} diff --git a/src/main/java/com/entity/UserEntity.java b/src/main/java/com/entity/UserEntity.java new file mode 100644 index 0000000..f5a0f22 --- /dev/null +++ b/src/main/java/com/entity/UserEntity.java @@ -0,0 +1,88 @@ +package com.entity; + +// 导入必要的 Java 类 +import java.io.Serializable; +import java.util.Date; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 用户实体类,对应数据库表 users + */ +@TableName("users") // 使用 @TableName 注解指定对应的数据库表名 +public class UserEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; // 主键id + + /** + * 用户账号 + */ + private String username; // 用户账号 + + /** + * 密码 + */ + private String password; // 密码 + + /** + * 用户类型 + */ + private String role; // 用户类型 + + private Date addtime; // 添加时间 + + // 获取用户账号 + public String getUsername() { + return username; + } + + // 设置用户账号 + public void setUsername(String username) { + this.username = username; + } + + // 获取密码 + public String getPassword() { + return password; + } + + // 设置密码 + public void setPassword(String password) { + this.password = password; + } + + // 获取用户类型 + public String getRole() { + return role; + } + + // 设置用户类型 + public void setRole(String role) { + this.role = role; + } + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } +} diff --git a/src/main/java/com/entity/WeixiuchuliEntity.java b/src/main/java/com/entity/WeixiuchuliEntity.java new file mode 100644 index 0000000..1b5d918 --- /dev/null +++ b/src/main/java/com/entity/WeixiuchuliEntity.java @@ -0,0 +1,312 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 维修处理实体类,对应数据库表 weixiuchuli + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("weixiuchuli") // 使用 @TableName 注解指定对应的数据库表名 +public class WeixiuchuliEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public WeixiuchuliEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public WeixiuchuliEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; + + /** + * 房屋名称 + */ + private String fangwumingcheng; + + /** + * 房屋类型 + */ + private String fangwuleixing; + + /** + * 报修名称 + */ + private String baoxiumingcheng; + + /** + * 类型 + */ + private String leixing; + + /** + * 报修日期 + */ + private String baoxiuriqi; + + /** + * 维修反馈 + */ + private String weixiufankui; + + /** + * 维修进度 + */ + private String weixiujindu; + + /** + * 更新日期 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date gengxinriqi; + + /** + * 房主账号 + */ + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + private String fangzhuxingming; + + /** + * 用户名 + */ + private String yonghuming; + + /** + * 联系电话 + */ + private String lianxidianhua; + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:报修名称 + */ + public void setBaoxiumingcheng(String baoxiumingcheng) { + this.baoxiumingcheng = baoxiumingcheng; + } + + /** + * 获取:报修名称 + */ + public String getBaoxiumingcheng() { + return baoxiumingcheng; + } + + /** + * 设置:类型 + */ + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + /** + * 获取:类型 + */ + public String getLeixing() { + return leixing; + } + + /** + * 设置:报修日期 + */ + public void setBaoxiuriqi(String baoxiuriqi) { + this.baoxiuriqi = baoxiuriqi; + } + + /** + * 获取:报修日期 + */ + public String getBaoxiuriqi() { + return baoxiuriqi; + } + + /** + * 设置:维修反馈 + */ + public void setWeixiufankui(String weixiufankui) { + this.weixiufankui = weixiufankui; + } + + /** + * 获取:维修反馈 + */ + public String getWeixiufankui() { + return weixiufankui; + } + + /** + * 设置:维修进度 + */ + public void setWeixiujindu(String weixiujindu) { + this.weixiujindu = weixiujindu; + } + + /** + * 获取:维修进度 + */ + public String getWeixiujindu() { + return weixiujindu; + } + + /** + * 设置:更新日期 + */ + public void setGengxinriqi(Date gengxinriqi) { + this.gengxinriqi = gengxinriqi; + } + + /** + * 获取:更新日期 + */ + public Date getGengxinriqi() { + return gengxinriqi; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:房主姓名 + */ + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + /** + * 设置:用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置:联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } +} diff --git a/src/main/java/com/entity/WoyaodangfangzhuEntity.java b/src/main/java/com/entity/WoyaodangfangzhuEntity.java new file mode 100644 index 0000000..cf5c084 --- /dev/null +++ b/src/main/java/com/entity/WoyaodangfangzhuEntity.java @@ -0,0 +1,350 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 我要当房主实体类,对应数据库表 woyaodangfangzhu + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("woyaodangfangzhu") // 使用 @TableName 注解指定对应的数据库表名 +public class WoyaodangfangzhuEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public WoyaodangfangzhuEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public WoyaodangfangzhuEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; + + /** + * 房屋名称 + */ + private String fangwumingcheng; + + /** + * 房屋类型 + */ + private String fangwuleixing; + + /** + * 图片 + */ + private String tupian; + + /** + * 租赁方式 + */ + private String zulinfangshi; + + /** + * 朝向楼层 + */ + private String chaoxianglouceng; + + /** + * 小区 + */ + private String xiaoqu; + + /** + * 面积 + */ + private String mianji; + + /** + * 月租价格 + */ + private Integer yuezujiage; + + /** + * 房屋详情 + */ + private String fangwuxiangqing; + + /** + * 发布日期 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date faburiqi; + + /** + * 用户名 + */ + private String yonghuming; + + /** + * 联系电话 + */ + private String lianxidianhua; + + /** + * 是否审核 + */ + private String sfsh; + + /** + * 审核回复 + */ + private String shhf; + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:图片 + */ + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + /** + * 设置:租赁方式 + */ + public void setZulinfangshi(String zulinfangshi) { + this.zulinfangshi = zulinfangshi; + } + + /** + * 获取:租赁方式 + */ + public String getZulinfangshi() { + return zulinfangshi; + } + + /** + * 设置:朝向楼层 + */ + public void setChaoxianglouceng(String chaoxianglouceng) { + this.chaoxianglouceng = chaoxianglouceng; + } + + /** + * 获取:朝向楼层 + */ + public String getChaoxianglouceng() { + return chaoxianglouceng; + } + + /** + * 设置:小区 + */ + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + /** + * 设置:面积 + */ + public void setMianji(String mianji) { + this.mianji = mianji; + } + + /** + * 获取:面积 + */ + public String getMianji() { + return mianji; + } + + /** + * 设置:月租价格 + */ + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + /** + * 设置:房屋详情 + */ + public void setFangwuxiangqing(String fangwuxiangqing) { + this.fangwuxiangqing = fangwuxiangqing; + } + + /** + * 获取:房屋详情 + */ + public String getFangwuxiangqing() { + return fangwuxiangqing; + } + + /** + * 设置:发布日期 + */ + public void setFaburiqi(Date faburiqi) { + this.faburiqi = faburiqi; + } + + /** + * 获取:发布日期 + */ + public Date getFaburiqi() { + return faburiqi; + } + + /** + * 设置:用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置:联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + /** + * 设置:是否审核 + */ + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + /** + * 设置:审核回复 + */ + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } +} diff --git a/src/main/java/com/entity/YonghuEntity.java b/src/main/java/com/entity/YonghuEntity.java new file mode 100644 index 0000000..91a719b --- /dev/null +++ b/src/main/java/com/entity/YonghuEntity.java @@ -0,0 +1,270 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 用户实体类,对应数据库表 yonghu + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("yonghu") // 使用 @TableName 注解指定对应的数据库表名 +public class YonghuEntity implements Serializable { + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + /** + * 构造方法,无参 + */ + public YonghuEntity() { + } + + /** + * 构造方法,通过传入的对象复制属性值 + * @param t 传入的对象 + */ + public YonghuEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; + + /** + * 用户名 + */ + private String yonghuming; + + /** + * 密码 + */ + private String mima; + + /** + * 姓名 + */ + private String xingming; + + /** + * 头像 + */ + private String touxiang; + + /** + * 性别 + */ + private String xingbie; + + /** + * 职业 + */ + private String zhiye; + + /** + * 联系电话 + */ + private String lianxidianhua; + + /** + * 身份证 + */ + private String shenfenzheng; + + /** + * 添加时间 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; + + /** + * 获取添加时间 + * @return 返回添加时间 + */ + public Date getAddtime() { + return addtime; + } + + /** + * 设置添加时间 + * @param addtime 添加时间 + */ + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + /** + * 获取主键id + * @return 返回主键id + */ + public Long getId() { + return id; + } + + /** + * 设置主键id + * @param id 主键id + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 设置用户名 + * @param yonghuming 用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取用户名 + * @return 返回用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置密码 + * @param mima 密码 + */ + public void setMima(String mima) { + this.mima = mima; + } + + /** + * 获取密码 + * @return 返回密码 + */ + public String getMima() { + return mima; + } + + /** + * 设置姓名 + * @param xingming 姓名 + */ + public void setXingming(String xingming) { + this.xingming = xingming; + } + + /** + * 获取姓名 + * @return 返回姓名 + */ + public String getXingming() { + return xingming; + } + + /** + * 设置头像 + * @param touxiang 头像 + */ + public void setTouxiang(String touxiang) { + this.touxiang = touxiang; + } + + /** + * 获取头像 + * @return 返回头像 + */ + public String getTouxiang() { + return touxiang; + } + + /** + * 设置性别 + * @param xingbie 性别 + */ + public void setXingbie(String xingbie) { + this.xingbie = xingbie; + } + + /** + * 获取性别 + * @return 返回性别 + */ + public String getXingbie() { + return xingbie; + } + + /** + * 设置职业 + * @param zhiye 职业 + */ + public void setZhiye(String zhiye) { + this.zhiye = zhiye; + } + + /** + * 获取职业 + * @return 返回职业 + */ + public String getZhiye() { + return zhiye; + } + + /** + * 设置联系电话 + * @param lianxidianhua 联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取联系电话 + * @return 返回联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + /** + * 设置身份证 + * @param shenfenzheng 身份证 + */ + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取身份证 + * @return 返回身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } +} diff --git a/src/main/java/com/entity/YuyuekanfangEntity.java b/src/main/java/com/entity/YuyuekanfangEntity.java new file mode 100644 index 0000000..568713d --- /dev/null +++ b/src/main/java/com/entity/YuyuekanfangEntity.java @@ -0,0 +1,426 @@ +package com.entity; + +// 导入 MyBatis-Plus 的注解,用于标识表和字段 +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.enums.FieldFill; +import com.baomidou.mybatisplus.enums.IdType; + +// 导入 Java Bean 验证相关注解 +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +// 导入 Jackson 注解,用于 JSON 格式化 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonFormat; + +// 导入 Spring 的日期格式化注解 +import org.springframework.format.annotation.DateTimeFormat; + +// 导入常用工具类 +import java.lang.reflect.InvocationTargetException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.commons.beanutils.BeanUtils; + +/** + * 预约看房实体类,对应数据库表 yuyuekanfang + * 数据库通用操作实体类(普通增删改查) + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +@TableName("yuyuekanfang") // 使用 @TableName 注解指定对应的数据库表名 +public class YuyuekanfangEntity implements Serializable { // 继承 Serializable,用于支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,无参 + public YuyuekanfangEntity() { + } + + // 构造方法,通过传入的对象复制属性值 + public YuyuekanfangEntity(T t) { + try { + BeanUtils.copyProperties(this, t); // 使用 Apache Commons 工具类复制属性值 + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); // 捕获并打印异常信息 + } + } + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) // 使用 @TableId 注解标识主键,并设置自增类型 + private Long id; + + /** + * 预约编号 + */ + private String yuyuebianhao; + + /** + * 房屋名称 + */ + private String fangwumingcheng; + + /** + * 房屋类型 + */ + private String fangwuleixing; + + /** + * 房屋状态 + */ + private String fangwuzhuangtai; + + /** + * 小区 + */ + private String xiaoqu; + + /** + * 月租价格 + */ + private Integer yuezujiage; + + /** + * 押金 + */ + private String yajin; + + /** + * 租用月数 + */ + private Integer zuyongyueshu; + + /** + * 租用金额 + */ + private String zuyongjine; + + /** + * 预约时间 + */ + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date yuyueshijian; + + /** + * 用户名 + */ + private String yonghuming; + + /** + * 姓名 + */ + private String xingming; + + /** + * 身份证 + */ + private String shenfenzheng; + + /** + * 联系电话 + */ + private String lianxidianhua; + + /** + * 房主账号 + */ + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + private String fangzhuxingming; + + /** + * 是否审核 + */ + private String sfsh; + + /** + * 审核回复 + */ + private String shhf; + + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") // 使用 @JsonFormat 注解格式化日期 + @DateTimeFormat // 使用 @DateTimeFormat 注解支持日期格式化输入 + private Date addtime; + + // 获取添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取主键id + public Long getId() { + return id; + } + + // 设置主键id + public void setId(Long id) { + this.id = id; + } + + /** + * 设置:预约编号 + */ + public void setYuyuebianhao(String yuyuebianhao) { + this.yuyuebianhao = yuyuebianhao; + } + + /** + * 获取:预约编号 + */ + public String getYuyuebianhao() { + return yuyuebianhao; + } + + /** + * 设置:房屋名称 + */ + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + /** + * 设置:房屋类型 + */ + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + /** + * 设置:房屋状态 + */ + public void setFangwuzhuangtai(String fangwuzhuangtai) { + this.fangwuzhuangtai = fangwuzhuangtai; + } + + /** + * 获取:房屋状态 + */ + public String getFangwuzhuangtai() { + return fangwuzhuangtai; + } + + /** + * 设置:小区 + */ + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + /** + * 设置:月租价格 + */ + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + /** + * 设置:押金 + */ + public void setYajin(String yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public String getYajin() { + return yajin; + } + + /** + * 设置:租用月数 + */ + public void setZuyongyueshu(Integer zuyongyueshu) { + this.zuyongyueshu = zuyongyueshu; + } + + /** + * 获取:租用月数 + */ + public Integer getZuyongyueshu() { + return zuyongyueshu; + } + + /** + * 设置:租用金额 + */ + public void setZuyongjine(String zuyongjine) { + this.zuyongjine = zuyongjine; + } + + /** + * 获取:租用金额 + */ + public String getZuyongjine() { + return zuyongjine; + } + + /** + * 设置:预约时间 + */ + public void setYuyueshijian(Date yuyueshijian) { + this.yuyueshijian = yuyueshijian; + } + + /** + * 获取:预约时间 + */ + public Date getYuyueshijian() { + return yuyueshijian; + } + + /** + * 设置:用户名 + */ + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + /** + * 设置:姓名 + */ + public void setXingming(String xingming) { + this.xingming = xingming; + } + + /** + * 获取:姓名 + */ + public String getXingming() { + return xingming; + } + + /** + * 设置:身份证 + */ + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + + /** + * 设置:联系电话 + */ + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + /** + * 设置:房主账号 + */ + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + /** + * 设置:房主姓名 + */ + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + /** + * 设置:是否审核 + */ + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + /** + * 设置:审核回复 + */ + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } +} diff --git a/src/main/java/com/entity/model/DiscussfangwuxinxiModel.java b/src/main/java/com/entity/model/DiscussfangwuxinxiModel.java new file mode 100644 index 0000000..ead403f --- /dev/null +++ b/src/main/java/com/entity/model/DiscussfangwuxinxiModel.java @@ -0,0 +1,92 @@ +package com.entity.model; + +import com.entity.DiscussfangwuxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋信息评论表 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class DiscussfangwuxinxiModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 用户id + */ + + private Long userid; + + /** + * 评论内容 + */ + + private String content; + + /** + * 回复内容 + */ + + private String reply; + + + /** + * 设置:用户id + */ + + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + + /** + * 设置:评论内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:评论内容 + */ + public String getContent() { + return content; + } + + + /** + * 设置:回复内容 + */ + + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } + +} diff --git a/src/main/java/com/entity/model/DiscusswoyaodangfangzhuModel.java b/src/main/java/com/entity/model/DiscusswoyaodangfangzhuModel.java new file mode 100644 index 0000000..7a55c09 --- /dev/null +++ b/src/main/java/com/entity/model/DiscusswoyaodangfangzhuModel.java @@ -0,0 +1,92 @@ +package com.entity.model; + +import com.entity.DiscusswoyaodangfangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 我要当房主评论表 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class DiscusswoyaodangfangzhuModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 用户id + */ + + private Long userid; + + /** + * 评论内容 + */ + + private String content; + + /** + * 回复内容 + */ + + private String reply; + + + /** + * 设置:用户id + */ + + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + + /** + * 设置:评论内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:评论内容 + */ + public String getContent() { + return content; + } + + + /** + * 设置:回复内容 + */ + + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } + +} diff --git a/src/main/java/com/entity/model/FangwubaoxiuModel.java b/src/main/java/com/entity/model/FangwubaoxiuModel.java new file mode 100644 index 0000000..440a08b --- /dev/null +++ b/src/main/java/com/entity/model/FangwubaoxiuModel.java @@ -0,0 +1,336 @@ +package com.entity.model; + +import com.entity.FangwubaoxiuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋报修 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwubaoxiuModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 报修名称 + */ + + private String baoxiumingcheng; + + /** + * 类型 + */ + + private String leixing; + + /** + * 报修内容 + */ + + private String baoxiuneirong; + + /** + * 图片 + */ + + private String tupian; + + /** + * 报修日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date baoxiuriqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:报修名称 + */ + + public void setBaoxiumingcheng(String baoxiumingcheng) { + this.baoxiumingcheng = baoxiumingcheng; + } + + /** + * 获取:报修名称 + */ + public String getBaoxiumingcheng() { + return baoxiumingcheng; + } + + + /** + * 设置:类型 + */ + + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + /** + * 获取:类型 + */ + public String getLeixing() { + return leixing; + } + + + /** + * 设置:报修内容 + */ + + public void setBaoxiuneirong(String baoxiuneirong) { + this.baoxiuneirong = baoxiuneirong; + } + + /** + * 获取:报修内容 + */ + public String getBaoxiuneirong() { + return baoxiuneirong; + } + + + /** + * 设置:图片 + */ + + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + + /** + * 设置:报修日期 + */ + + public void setBaoxiuriqi(Date baoxiuriqi) { + this.baoxiuriqi = baoxiuriqi; + } + + /** + * 获取:报修日期 + */ + public Date getBaoxiuriqi() { + return baoxiuriqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/model/FangwuleixingModel.java b/src/main/java/com/entity/model/FangwuleixingModel.java new file mode 100644 index 0000000..9973377 --- /dev/null +++ b/src/main/java/com/entity/model/FangwuleixingModel.java @@ -0,0 +1,26 @@ +package com.entity.model; + +import com.entity.FangwuleixingEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋类型 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwuleixingModel implements Serializable { + private static final long serialVersionUID = 1L; + + +} diff --git a/src/main/java/com/entity/model/FangwupingjiaModel.java b/src/main/java/com/entity/model/FangwupingjiaModel.java new file mode 100644 index 0000000..8081186 --- /dev/null +++ b/src/main/java/com/entity/model/FangwupingjiaModel.java @@ -0,0 +1,270 @@ +package com.entity.model; + +import com.entity.FangwupingjiaEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋评价 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwupingjiaModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 评分 + */ + + private String pingfen; + + /** + * 评价内容 + */ + + private String pingjianeirong; + + /** + * 评价日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date pingjiariqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:评分 + */ + + public void setPingfen(String pingfen) { + this.pingfen = pingfen; + } + + /** + * 获取:评分 + */ + public String getPingfen() { + return pingfen; + } + + + /** + * 设置:评价内容 + */ + + public void setPingjianeirong(String pingjianeirong) { + this.pingjianeirong = pingjianeirong; + } + + /** + * 获取:评价内容 + */ + public String getPingjianeirong() { + return pingjianeirong; + } + + + /** + * 设置:评价日期 + */ + + public void setPingjiariqi(Date pingjiariqi) { + this.pingjiariqi = pingjiariqi; + } + + /** + * 获取:评价日期 + */ + public Date getPingjiariqi() { + return pingjiariqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/model/FangwuxinxiModel.java b/src/main/java/com/entity/model/FangwuxinxiModel.java new file mode 100644 index 0000000..fa54458 --- /dev/null +++ b/src/main/java/com/entity/model/FangwuxinxiModel.java @@ -0,0 +1,358 @@ +package com.entity.model; + +import com.entity.FangwuxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋信息 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwuxinxiModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 图片 + */ + + private String tupian; + + /** + * 租赁方式 + */ + + private String zulinfangshi; + + /** + * 朝向楼层 + */ + + private String chaoxianglouceng; + + /** + * 面积 + */ + + private String mianji; + + /** + * 房屋状态 + */ + + private String fangwuzhuangtai; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 详细地址 + */ + + private String xiangxidizhi; + + /** + * 月租价格 + */ + + private Integer yuezujiage; + + /** + * 押金 + */ + + private Integer yajin; + + /** + * 房屋设施 + */ + + private String fangwusheshi; + + /** + * 房屋详情 + */ + + private String fangwuxiangqing; + + /** + * 发布日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date faburiqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:图片 + */ + + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + + /** + * 设置:租赁方式 + */ + + public void setZulinfangshi(String zulinfangshi) { + this.zulinfangshi = zulinfangshi; + } + + /** + * 获取:租赁方式 + */ + public String getZulinfangshi() { + return zulinfangshi; + } + + + /** + * 设置:朝向楼层 + */ + + public void setChaoxianglouceng(String chaoxianglouceng) { + this.chaoxianglouceng = chaoxianglouceng; + } + + /** + * 获取:朝向楼层 + */ + public String getChaoxianglouceng() { + return chaoxianglouceng; + } + + + /** + * 设置:面积 + */ + + public void setMianji(String mianji) { + this.mianji = mianji; + } + + /** + * 获取:面积 + */ + public String getMianji() { + return mianji; + } + + + /** + * 设置:房屋状态 + */ + + public void setFangwuzhuangtai(String fangwuzhuangtai) { + this.fangwuzhuangtai = fangwuzhuangtai; + } + + /** + * 获取:房屋状态 + */ + public String getFangwuzhuangtai() { + return fangwuzhuangtai; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:详细地址 + */ + + public void setXiangxidizhi(String xiangxidizhi) { + this.xiangxidizhi = xiangxidizhi; + } + + /** + * 获取:详细地址 + */ + public String getXiangxidizhi() { + return xiangxidizhi; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:押金 + */ + + public void setYajin(Integer yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public Integer getYajin() { + return yajin; + } + + + /** + * 设置:房屋设施 + */ + + public void setFangwusheshi(String fangwusheshi) { + this.fangwusheshi = fangwusheshi; + } + + /** + * 获取:房屋设施 + */ + public String getFangwusheshi() { + return fangwusheshi; + } + + + /** + * 设置:房屋详情 + */ + + public void setFangwuxiangqing(String fangwuxiangqing) { + this.fangwuxiangqing = fangwuxiangqing; + } + + /** + * 获取:房屋详情 + */ + public String getFangwuxiangqing() { + return fangwuxiangqing; + } + + + /** + * 设置:发布日期 + */ + + public void setFaburiqi(Date faburiqi) { + this.faburiqi = faburiqi; + } + + /** + * 获取:发布日期 + */ + public Date getFaburiqi() { + return faburiqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + +} diff --git a/src/main/java/com/entity/model/FangzhuModel.java b/src/main/java/com/entity/model/FangzhuModel.java new file mode 100644 index 0000000..d1f7a6a --- /dev/null +++ b/src/main/java/com/entity/model/FangzhuModel.java @@ -0,0 +1,158 @@ +package com.entity.model; + +import com.entity.FangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房主 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangzhuModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 密码 + */ + + private String mima; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 性别 + */ + + private String xingbie; + + /** + * 头像 + */ + + private String touxiang; + + /** + * 手机 + */ + + private String shouji; + + /** + * 身份证 + */ + + private String shenfenzheng; + + + /** + * 设置:密码 + */ + + public void setMima(String mima) { + this.mima = mima; + } + + /** + * 获取:密码 + */ + public String getMima() { + return mima; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:性别 + */ + + public void setXingbie(String xingbie) { + this.xingbie = xingbie; + } + + /** + * 获取:性别 + */ + public String getXingbie() { + return xingbie; + } + + + /** + * 设置:头像 + */ + + public void setTouxiang(String touxiang) { + this.touxiang = touxiang; + } + + /** + * 获取:头像 + */ + public String getTouxiang() { + return touxiang; + } + + + /** + * 设置:手机 + */ + + public void setShouji(String shouji) { + this.shouji = shouji; + } + + /** + * 获取:手机 + */ + public String getShouji() { + return shouji; + } + + + /** + * 设置:身份证 + */ + + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + +} diff --git a/src/main/java/com/entity/model/HetongxinxiModel.java b/src/main/java/com/entity/model/HetongxinxiModel.java new file mode 100644 index 0000000..a6efd19 --- /dev/null +++ b/src/main/java/com/entity/model/HetongxinxiModel.java @@ -0,0 +1,448 @@ +package com.entity.model; + +import com.entity.HetongxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 合同信息 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class HetongxinxiModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 月租价格 + */ + + private String yuezujiage; + + /** + * 租用月数 + */ + + private String zuyongyueshu; + + /** + * 租用金额 + */ + + private Integer zuyongjine; + + /** + * 押金 + */ + + private Integer yajin; + + /** + * 房租状态 + */ + + private String fangzuzhuangtai; + + /** + * 合同金额 + */ + + private String hetongjine; + + /** + * 合同内容 + */ + + private String hetongneirong; + + /** + * 生效日 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date shengxiaori; + + /** + * 有限期至 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date youxianqizhi; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + /** + * 是否支付 + */ + + private String ispay; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(String yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public String getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:租用月数 + */ + + public void setZuyongyueshu(String zuyongyueshu) { + this.zuyongyueshu = zuyongyueshu; + } + + /** + * 获取:租用月数 + */ + public String getZuyongyueshu() { + return zuyongyueshu; + } + + + /** + * 设置:租用金额 + */ + + public void setZuyongjine(Integer zuyongjine) { + this.zuyongjine = zuyongjine; + } + + /** + * 获取:租用金额 + */ + public Integer getZuyongjine() { + return zuyongjine; + } + + + /** + * 设置:押金 + */ + + public void setYajin(Integer yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public Integer getYajin() { + return yajin; + } + + + /** + * 设置:房租状态 + */ + + public void setFangzuzhuangtai(String fangzuzhuangtai) { + this.fangzuzhuangtai = fangzuzhuangtai; + } + + /** + * 获取:房租状态 + */ + public String getFangzuzhuangtai() { + return fangzuzhuangtai; + } + + + /** + * 设置:合同金额 + */ + + public void setHetongjine(String hetongjine) { + this.hetongjine = hetongjine; + } + + /** + * 获取:合同金额 + */ + public String getHetongjine() { + return hetongjine; + } + + + /** + * 设置:合同内容 + */ + + public void setHetongneirong(String hetongneirong) { + this.hetongneirong = hetongneirong; + } + + /** + * 获取:合同内容 + */ + public String getHetongneirong() { + return hetongneirong; + } + + + /** + * 设置:生效日 + */ + + public void setShengxiaori(Date shengxiaori) { + this.shengxiaori = shengxiaori; + } + + /** + * 获取:生效日 + */ + public Date getShengxiaori() { + return shengxiaori; + } + + + /** + * 设置:有限期至 + */ + + public void setYouxianqizhi(Date youxianqizhi) { + this.youxianqizhi = youxianqizhi; + } + + /** + * 获取:有限期至 + */ + public Date getYouxianqizhi() { + return youxianqizhi; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + + + /** + * 设置:是否支付 + */ + + public void setIspay(String ispay) { + this.ispay = ispay; + } + + /** + * 获取:是否支付 + */ + public String getIspay() { + return ispay; + } + +} diff --git a/src/main/java/com/entity/model/MessagesModel.java b/src/main/java/com/entity/model/MessagesModel.java new file mode 100644 index 0000000..14d2f61 --- /dev/null +++ b/src/main/java/com/entity/model/MessagesModel.java @@ -0,0 +1,92 @@ +package com.entity.model; + +import com.entity.MessagesEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 留言板 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class MessagesModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 用户名 + */ + + private String username; + + /** + * 留言内容 + */ + + private String content; + + /** + * 回复内容 + */ + + private String reply; + + + /** + * 设置:用户名 + */ + + public void setUsername(String username) { + this.username = username; + } + + /** + * 获取:用户名 + */ + public String getUsername() { + return username; + } + + + /** + * 设置:留言内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:留言内容 + */ + public String getContent() { + return content; + } + + + /** + * 设置:回复内容 + */ + + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } + +} diff --git a/src/main/java/com/entity/model/NewsModel.java b/src/main/java/com/entity/model/NewsModel.java new file mode 100644 index 0000000..b7e6ce8 --- /dev/null +++ b/src/main/java/com/entity/model/NewsModel.java @@ -0,0 +1,92 @@ +package com.entity.model; + +import com.entity.NewsEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 公告信息 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class NewsModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 简介 + */ + + private String introduction; + + /** + * 图片 + */ + + private String picture; + + /** + * 内容 + */ + + private String content; + + + /** + * 设置:简介 + */ + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + /** + * 获取:简介 + */ + public String getIntroduction() { + return introduction; + } + + + /** + * 设置:图片 + */ + + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * 获取:图片 + */ + public String getPicture() { + return picture; + } + + + /** + * 设置:内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:内容 + */ + public String getContent() { + return content; + } + +} diff --git a/src/main/java/com/entity/model/StoreupModel.java b/src/main/java/com/entity/model/StoreupModel.java new file mode 100644 index 0000000..119e716 --- /dev/null +++ b/src/main/java/com/entity/model/StoreupModel.java @@ -0,0 +1,114 @@ +package com.entity.model; + +import com.entity.StoreupEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 收藏表 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class StoreupModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 收藏id + */ + + private Long refid; + + /** + * 表名 + */ + + private String tablename; + + /** + * 收藏名称 + */ + + private String name; + + /** + * 收藏图片 + */ + + private String picture; + + + /** + * 设置:收藏id + */ + + public void setRefid(Long refid) { + this.refid = refid; + } + + /** + * 获取:收藏id + */ + public Long getRefid() { + return refid; + } + + + /** + * 设置:表名 + */ + + public void setTablename(String tablename) { + this.tablename = tablename; + } + + /** + * 获取:表名 + */ + public String getTablename() { + return tablename; + } + + + /** + * 设置:收藏名称 + */ + + public void setName(String name) { + this.name = name; + } + + /** + * 获取:收藏名称 + */ + public String getName() { + return name; + } + + + /** + * 设置:收藏图片 + */ + + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * 获取:收藏图片 + */ + public String getPicture() { + return picture; + } + +} diff --git a/src/main/java/com/entity/model/WeixiuchuliModel.java b/src/main/java/com/entity/model/WeixiuchuliModel.java new file mode 100644 index 0000000..68b149b --- /dev/null +++ b/src/main/java/com/entity/model/WeixiuchuliModel.java @@ -0,0 +1,270 @@ +package com.entity.model; + +import com.entity.WeixiuchuliEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 维修处理 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class WeixiuchuliModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 报修名称 + */ + + private String baoxiumingcheng; + + /** + * 类型 + */ + + private String leixing; + + /** + * 报修日期 + */ + + private String baoxiuriqi; + + /** + * 维修反馈 + */ + + private String weixiufankui; + + /** + * 维修进度 + */ + + private String weixiujindu; + + /** + * 更新日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date gengxinriqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:报修名称 + */ + + public void setBaoxiumingcheng(String baoxiumingcheng) { + this.baoxiumingcheng = baoxiumingcheng; + } + + /** + * 获取:报修名称 + */ + public String getBaoxiumingcheng() { + return baoxiumingcheng; + } + + + /** + * 设置:类型 + */ + + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + /** + * 获取:类型 + */ + public String getLeixing() { + return leixing; + } + + + /** + * 设置:报修日期 + */ + + public void setBaoxiuriqi(String baoxiuriqi) { + this.baoxiuriqi = baoxiuriqi; + } + + /** + * 获取:报修日期 + */ + public String getBaoxiuriqi() { + return baoxiuriqi; + } + + + /** + * 设置:维修反馈 + */ + + public void setWeixiufankui(String weixiufankui) { + this.weixiufankui = weixiufankui; + } + + /** + * 获取:维修反馈 + */ + public String getWeixiufankui() { + return weixiufankui; + } + + + /** + * 设置:维修进度 + */ + + public void setWeixiujindu(String weixiujindu) { + this.weixiujindu = weixiujindu; + } + + /** + * 获取:维修进度 + */ + public String getWeixiujindu() { + return weixiujindu; + } + + + /** + * 设置:更新日期 + */ + + public void setGengxinriqi(Date gengxinriqi) { + this.gengxinriqi = gengxinriqi; + } + + /** + * 获取:更新日期 + */ + public Date getGengxinriqi() { + return gengxinriqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + +} diff --git a/src/main/java/com/entity/model/WoyaodangfangzhuModel.java b/src/main/java/com/entity/model/WoyaodangfangzhuModel.java new file mode 100644 index 0000000..9873400 --- /dev/null +++ b/src/main/java/com/entity/model/WoyaodangfangzhuModel.java @@ -0,0 +1,314 @@ +package com.entity.model; + +import com.entity.WoyaodangfangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 我要当房主 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class WoyaodangfangzhuModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 图片 + */ + + private String tupian; + + /** + * 租赁方式 + */ + + private String zulinfangshi; + + /** + * 朝向楼层 + */ + + private String chaoxianglouceng; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 面积 + */ + + private String mianji; + + /** + * 月租价格 + */ + + private Integer yuezujiage; + + /** + * 房屋详情 + */ + + private String fangwuxiangqing; + + /** + * 发布日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date faburiqi; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:图片 + */ + + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + + /** + * 设置:租赁方式 + */ + + public void setZulinfangshi(String zulinfangshi) { + this.zulinfangshi = zulinfangshi; + } + + /** + * 获取:租赁方式 + */ + public String getZulinfangshi() { + return zulinfangshi; + } + + + /** + * 设置:朝向楼层 + */ + + public void setChaoxianglouceng(String chaoxianglouceng) { + this.chaoxianglouceng = chaoxianglouceng; + } + + /** + * 获取:朝向楼层 + */ + public String getChaoxianglouceng() { + return chaoxianglouceng; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:面积 + */ + + public void setMianji(String mianji) { + this.mianji = mianji; + } + + /** + * 获取:面积 + */ + public String getMianji() { + return mianji; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:房屋详情 + */ + + public void setFangwuxiangqing(String fangwuxiangqing) { + this.fangwuxiangqing = fangwuxiangqing; + } + + /** + * 获取:房屋详情 + */ + public String getFangwuxiangqing() { + return fangwuxiangqing; + } + + + /** + * 设置:发布日期 + */ + + public void setFaburiqi(Date faburiqi) { + this.faburiqi = faburiqi; + } + + /** + * 获取:发布日期 + */ + public Date getFaburiqi() { + return faburiqi; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/model/YonghuModel.java b/src/main/java/com/entity/model/YonghuModel.java new file mode 100644 index 0000000..918de7d --- /dev/null +++ b/src/main/java/com/entity/model/YonghuModel.java @@ -0,0 +1,180 @@ +package com.entity.model; + +import com.entity.YonghuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 用户 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class YonghuModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 密码 + */ + + private String mima; + + /** + * 姓名 + */ + + private String xingming; + + /** + * 头像 + */ + + private String touxiang; + + /** + * 性别 + */ + + private String xingbie; + + /** + * 职业 + */ + + private String zhiye; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 身份证 + */ + + private String shenfenzheng; + + + /** + * 设置:密码 + */ + + public void setMima(String mima) { + this.mima = mima; + } + + /** + * 获取:密码 + */ + public String getMima() { + return mima; + } + + + /** + * 设置:姓名 + */ + + public void setXingming(String xingming) { + this.xingming = xingming; + } + + /** + * 获取:姓名 + */ + public String getXingming() { + return xingming; + } + + + /** + * 设置:头像 + */ + + public void setTouxiang(String touxiang) { + this.touxiang = touxiang; + } + + /** + * 获取:头像 + */ + public String getTouxiang() { + return touxiang; + } + + + /** + * 设置:性别 + */ + + public void setXingbie(String xingbie) { + this.xingbie = xingbie; + } + + /** + * 获取:性别 + */ + public String getXingbie() { + return xingbie; + } + + + /** + * 设置:职业 + */ + + public void setZhiye(String zhiye) { + this.zhiye = zhiye; + } + + /** + * 获取:职业 + */ + public String getZhiye() { + return zhiye; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:身份证 + */ + + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + +} diff --git a/src/main/java/com/entity/model/YuyuekanfangModel.java b/src/main/java/com/entity/model/YuyuekanfangModel.java new file mode 100644 index 0000000..eab41dc --- /dev/null +++ b/src/main/java/com/entity/model/YuyuekanfangModel.java @@ -0,0 +1,402 @@ +package com.entity.model; + +import com.entity.YuyuekanfangEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 预约看房 + * 接收传参的实体类 + *(实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了) + * 取自ModelAndView 的model名称 + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class YuyuekanfangModel implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 房屋状态 + */ + + private String fangwuzhuangtai; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 月租价格 + */ + + private Integer yuezujiage; + + /** + * 押金 + */ + + private String yajin; + + /** + * 租用月数 + */ + + private Integer zuyongyueshu; + + /** + * 租用金额 + */ + + private String zuyongjine; + + /** + * 预约时间 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date yuyueshijian; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 姓名 + */ + + private String xingming; + + /** + * 身份证 + */ + + private String shenfenzheng; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:房屋状态 + */ + + public void setFangwuzhuangtai(String fangwuzhuangtai) { + this.fangwuzhuangtai = fangwuzhuangtai; + } + + /** + * 获取:房屋状态 + */ + public String getFangwuzhuangtai() { + return fangwuzhuangtai; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:押金 + */ + + public void setYajin(String yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public String getYajin() { + return yajin; + } + + + /** + * 设置:租用月数 + */ + + public void setZuyongyueshu(Integer zuyongyueshu) { + this.zuyongyueshu = zuyongyueshu; + } + + /** + * 获取:租用月数 + */ + public Integer getZuyongyueshu() { + return zuyongyueshu; + } + + + /** + * 设置:租用金额 + */ + + public void setZuyongjine(String zuyongjine) { + this.zuyongjine = zuyongjine; + } + + /** + * 获取:租用金额 + */ + public String getZuyongjine() { + return zuyongjine; + } + + + /** + * 设置:预约时间 + */ + + public void setYuyueshijian(Date yuyueshijian) { + this.yuyueshijian = yuyueshijian; + } + + /** + * 获取:预约时间 + */ + public Date getYuyueshijian() { + return yuyueshijian; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:姓名 + */ + + public void setXingming(String xingming) { + this.xingming = xingming; + } + + /** + * 获取:姓名 + */ + public String getXingming() { + return xingming; + } + + + /** + * 设置:身份证 + */ + + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/view/DiscussfangwuxinxiView.java b/src/main/java/com/entity/view/DiscussfangwuxinxiView.java new file mode 100644 index 0000000..2b2472d --- /dev/null +++ b/src/main/java/com/entity/view/DiscussfangwuxinxiView.java @@ -0,0 +1,46 @@ +package com.entity.view; + +import com.entity.DiscussfangwuxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 房屋信息评论表 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该实体类对应的数据库表名为 "discussfangwuxinxi" +@TableName("discussfangwuxinxi") +// 定义一个名为 DiscussfangwuxinxiView 的类,它继承自 DiscussfangwuxinxiEntity 类,同时实现了 Serializable 接口, +// 实现 Serializable 接口意味着该类的对象可以被序列化,即可以在网络上传输或保存到文件中 +public class DiscussfangwuxinxiView extends DiscussfangwuxinxiEntity implements Serializable { + // 定义一个序列化版本号,用于在反序列化时验证版本的一致性,确保序列化和反序列化的对象版本相同 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 DiscussfangwuxinxiView 对象时,如果不传入任何参数,会调用此构造函数 + public DiscussfangwuxinxiView(){ + } + + // 定义一个带参构造函数,接收一个 DiscussfangwuxinxiEntity 类型的参数 discussfangwuxinxiEntity + // 该构造函数的作用是将传入的 DiscussfangwuxinxiEntity 对象的属性值复制到当前 DiscussfangwuxinxiView 对象中 + public DiscussfangwuxinxiView(DiscussfangwuxinxiEntity discussfangwuxinxiEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 discussfangwuxinxiEntity 对象的属性值复制到当前对象中 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, discussfangwuxinxiEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在复制属性过程中出现非法访问异常(IllegalAccessException)或调用目标异常(InvocationTargetException) + // 会捕获该异常,并在控制台打印异常堆栈信息,方便调试和定位问题 + // TODO Auto-generated catch block 这是 IDE 自动生成的提示信息,提示开发者需要在这里添加具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/DiscusswoyaodangfangzhuView.java b/src/main/java/com/entity/view/DiscusswoyaodangfangzhuView.java new file mode 100644 index 0000000..489211b --- /dev/null +++ b/src/main/java/com/entity/view/DiscusswoyaodangfangzhuView.java @@ -0,0 +1,47 @@ +package com.entity.view; + +import com.entity.DiscusswoyaodangfangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 我要当房主评论表 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类在数据库中对应的表名为 "discusswoyaodangfangzhu" +@TableName("discusswoyaodangfangzhu") +// 定义一个名为 DiscusswoyaodangfangzhuView 的类,它继承自 DiscusswoyaodangfangzhuEntity 类, +// 同时实现了 Serializable 接口,这意味着该类的对象可以被序列化,以便在网络传输或存储到文件等场景中使用 +public class DiscusswoyaodangfangzhuView extends DiscusswoyaodangfangzhuEntity implements Serializable { + // 定义一个序列化版本号,用于在反序列化时确保对象版本的一致性 + // 当对象被序列化后,如果类的结构发生了变化,通过这个版本号可以判断是否能正确反序列化 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 DiscusswoyaodangfangzhuView 类的对象且不传入任何参数时,会调用此构造函数 + public DiscusswoyaodangfangzhuView(){ + } + + // 定义一个带参构造函数,接收一个 DiscusswoyaodangfangzhuEntity 类型的参数 discusswoyaodangfangzhuEntity + // 该构造函数的作用是将传入的 DiscusswoyaodangfangzhuEntity 对象的属性值复制到当前 DiscusswoyaodangfangzhuView 对象中 + public DiscusswoyaodangfangzhuView(DiscusswoyaodangfangzhuEntity discusswoyaodangfangzhuEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 discusswoyaodangfangzhuEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, discusswoyaodangfangzhuEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException)或者调用目标方法时出现异常(InvocationTargetException) + // 会捕获该异常并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示,提醒开发者可能需要在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/FangwubaoxiuView.java b/src/main/java/com/entity/view/FangwubaoxiuView.java new file mode 100644 index 0000000..3630949 --- /dev/null +++ b/src/main/java/com/entity/view/FangwubaoxiuView.java @@ -0,0 +1,46 @@ +package com.entity.view; + +import com.entity.FangwubaoxiuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 房屋报修 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类在数据库中对应的表名为 "fangwubaoxiu" +@TableName("fangwubaoxiu") +// 定义一个名为 FangwubaoxiuView 的类,它继承自 FangwubaoxiuEntity 类, +// 并实现了 Serializable 接口,实现该接口意味着该类的对象可以被序列化,以便在网络传输或存储到文件等场景使用 +public class FangwubaoxiuView extends FangwubaoxiuEntity implements Serializable { + // 定义序列化版本号,用于在反序列化时验证版本的一致性,确保序列化和反序列化的对象版本匹配 + private static final long serialVersionUID = 1L; + + // 定义无参构造函数,当创建 FangwubaoxiuView 对象时不传入参数,会调用此构造函数 + public FangwubaoxiuView(){ + } + + // 定义带参构造函数,接收一个 FangwubaoxiuEntity 类型的参数 fangwubaoxiuEntity + // 此构造函数的作用是将传入的 FangwubaoxiuEntity 对象的属性值复制到当前 FangwubaoxiuView 对象中 + public FangwubaoxiuView(FangwubaoxiuEntity fangwubaoxiuEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 fangwubaoxiuEntity 对象的属性值复制到当前对象 + // 该方法会自动匹配两个对象中相同名称和类型的属性并完成复制操作 + BeanUtils.copyProperties(this, fangwubaoxiuEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException)或调用目标异常(InvocationTargetException) + // 捕获该异常并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示,提醒开发者可能需要添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/FangwuleixingView.java b/src/main/java/com/entity/view/FangwuleixingView.java new file mode 100644 index 0000000..0ead197 --- /dev/null +++ b/src/main/java/com/entity/view/FangwuleixingView.java @@ -0,0 +1,47 @@ +package com.entity.view; + +import com.entity.FangwuleixingEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 房屋类型 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类对应的数据库表名为 "fangwuleixing" +@TableName("fangwuleixing") +// 定义一个名为 FangwuleixingView 的类,它继承自 FangwuleixingEntity 类, +// 同时实现了 Serializable 接口,这意味着该类的对象可以被序列化,用于网络传输或存储到文件等场景 +public class FangwuleixingView extends FangwuleixingEntity implements Serializable { + // 定义一个静态常量 serialVersionUID,用于在序列化和反序列化过程中确保版本的一致性 + // 当序列化对象时,该版本号会被记录,反序列化时会检查版本号是否匹配 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 FangwuleixingView 类的对象且不传入任何参数时,会调用此构造函数 + public FangwuleixingView(){ + } + + // 定义一个带参构造函数,接收一个 FangwuleixingEntity 类型的参数 fangwuleixingEntity + // 该构造函数的作用是将传入的 FangwuleixingEntity 对象的属性值复制到当前 FangwuleixingView 对象中 + public FangwuleixingView(FangwuleixingEntity fangwuleixingEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 fangwuleixingEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, fangwuleixingEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException)或调用目标异常(InvocationTargetException) + // 捕获该异常并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示,提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/FangwupingjiaView.java b/src/main/java/com/entity/view/FangwupingjiaView.java new file mode 100644 index 0000000..59338d2 --- /dev/null +++ b/src/main/java/com/entity/view/FangwupingjiaView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.FangwupingjiaEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 房屋评价 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 MyBatis-Plus 的 @TableName 注解,指定该实体类对应的数据库表名为 "fangwupingjia" +@TableName("fangwupingjia") +// 定义一个名为 FangwupingjiaView 的类,它继承自 FangwupingjiaEntity 类, +// 并实现了 Serializable 接口,表明该类的对象可以被序列化,以便在网络传输或存储时使用 +public class FangwupingjiaView extends FangwupingjiaEntity implements Serializable { + // 定义一个序列化版本号,用于在反序列化时验证对象版本的一致性, + // 确保序列化和反序列化过程中类的结构兼容 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 FangwupingjiaView 类的对象时不传入任何参数,会调用此构造函数 + public FangwupingjiaView(){ + } + + // 带参构造函数,接收一个 FangwupingjiaEntity 类型的参数 fangwupingjiaEntity + // 此构造函数的作用是将传入的 FangwupingjiaEntity 对象的属性值复制到当前 FangwupingjiaView 对象中 + public FangwupingjiaView(FangwupingjiaEntity fangwupingjiaEntity){ + try { + // 使用 BeanUtils 工具类的 copyProperties 方法,将 fangwupingjiaEntity 对象的属性值 + // 复制到当前的 FangwupingjiaView 对象中。该方法会自动匹配两个对象中同名同类型的属性进行复制 + BeanUtils.copyProperties(this, fangwupingjiaEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发人员定位问题 + // 这里的 "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可能需要在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/FangwuxinxiView.java b/src/main/java/com/entity/view/FangwuxinxiView.java new file mode 100644 index 0000000..1a38878 --- /dev/null +++ b/src/main/java/com/entity/view/FangwuxinxiView.java @@ -0,0 +1,47 @@ +package com.entity.view; + +import com.entity.FangwuxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 房屋信息 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类在数据库中对应的表名为 "fangwuxinxi" +@TableName("fangwuxinxi") +// 定义一个名为 FangwuxinxiView 的类,它继承自 FangwuxinxiEntity 类, +// 同时实现了 Serializable 接口,意味着该类的对象可以被序列化,用于网络传输或存储到文件等场景 +public class FangwuxinxiView extends FangwuxinxiEntity implements Serializable { + // 定义一个静态常量 serialVersionUID,用于在序列化和反序列化时确保版本的一致性 + // 序列化时该版本号会被记录,反序列化时会检查版本号是否匹配,防止版本不兼容问题 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 FangwuxinxiView 类的对象且不传入任何参数时,会调用此构造函数 + public FangwuxinxiView(){ + } + + // 定义一个带参构造函数,接收一个 FangwuxinxiEntity 类型的参数 fangwuxinxiEntity + // 该构造函数的作用是将传入的 FangwuxinxiEntity 对象的属性值复制到当前 FangwuxinxiView 对象中 + public FangwuxinxiView(FangwuxinxiEntity fangwuxinxiEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 fangwuxinxiEntity 对象的属性值复制到当前对象 + // 该方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, fangwuxinxiEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException)或调用目标异常(InvocationTargetException) + // 捕获该异常并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示,提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/FangzhuView.java b/src/main/java/com/entity/view/FangzhuView.java new file mode 100644 index 0000000..d2f1034 --- /dev/null +++ b/src/main/java/com/entity/view/FangzhuView.java @@ -0,0 +1,47 @@ +package com.entity.view; + +import com.entity.FangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 房主 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 利用 @TableName 注解来指定该类在数据库里对应的表名为 "fangzhu" +@TableName("fangzhu") +// 定义一个名为 FangzhuView 的类,它继承自 FangzhuEntity 类, +// 并且实现了 Serializable 接口,这表明该类的对象能够被序列化,适用于网络传输或文件存储等场景 +public class FangzhuView extends FangzhuEntity implements Serializable { + // 定义一个静态常量 serialVersionUID,用于在序列化和反序列化过程中保证版本的一致性 + // 当进行反序列化操作时,会检查该版本号是否匹配,以此确保对象的兼容性 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 FangzhuView 类的对象且不传入任何参数时,会调用此构造函数 + public FangzhuView(){ + } + + // 定义一个带参构造函数,接收一个 FangzhuEntity 类型的参数 fangzhuEntity + // 此构造函数的用途是把传入的 FangzhuEntity 对象的属性值复制到当前 FangzhuView 对象中 + public FangzhuView(FangzhuEntity fangzhuEntity){ + try { + // 借助 BeanUtils 类的 copyProperties 方法,将 fangzhuEntity 对象的属性值复制到当前对象 + // 该方法会自动匹配两个对象中名称和类型相同的属性并完成复制操作 + BeanUtils.copyProperties(this, fangzhuEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 若在属性复制过程中出现非法访问异常(IllegalAccessException)或者调用目标异常(InvocationTargetException) + // 就捕获该异常并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示,提醒开发者可以添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/HetongxinxiView.java b/src/main/java/com/entity/view/HetongxinxiView.java new file mode 100644 index 0000000..6cf5aae --- /dev/null +++ b/src/main/java/com/entity/view/HetongxinxiView.java @@ -0,0 +1,46 @@ +package com.entity.view; + +import com.entity.HetongxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 合同信息 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该实体类对应的数据库表名为 "hetongxinxi" +@TableName("hetongxinxi") +// 定义一个名为 HetongxinxiView 的类,它继承自 HetongxinxiEntity 类, +// 同时实现了 Serializable 接口,意味着该类的对象可以进行序列化操作,用于网络传输或持久化存储 +public class HetongxinxiView extends HetongxinxiEntity implements Serializable { + // 定义序列化版本号,用于在反序列化时验证版本一致性,确保序列化和反序列化的类结构兼容 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 HetongxinxiView 对象时不传入参数,会调用此构造函数 + public HetongxinxiView(){ + } + + // 带参构造函数,接收一个 HetongxinxiEntity 类型的对象 hetongxinxiEntity + // 该构造函数的作用是将传入对象的属性值复制到当前 HetongxinxiView 对象中 + public HetongxinxiView(HetongxinxiEntity hetongxinxiEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法,将 hetongxinxiEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性进行复制 + BeanUtils.copyProperties(this, hetongxinxiEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException)或调用目标异常(InvocationTargetException) + // 捕获该异常并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示,提醒开发者可添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/MessagesView.java b/src/main/java/com/entity/view/MessagesView.java new file mode 100644 index 0000000..5e44f2f --- /dev/null +++ b/src/main/java/com/entity/view/MessagesView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.MessagesEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 留言板 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类在数据库中对应的表名为 "messages" +@TableName("messages") +// 定义一个名为 MessagesView 的类,它继承自 MessagesEntity 类, +// 并实现了 Serializable 接口,表明该类的对象可以被序列化,以便在网络传输或存储到文件等场景使用 +public class MessagesView extends MessagesEntity implements Serializable { + // 定义序列化版本号,用于在反序列化时确保版本的一致性, + // 保证序列化和反序列化过程中对象结构的兼容性 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 MessagesView 类的对象且不传入任何参数时,会调用此构造函数 + public MessagesView(){ + } + + // 带参构造函数,接收一个 MessagesEntity 类型的参数 messagesEntity + // 该构造函数的作用是将传入的 MessagesEntity 对象的属性值复制到当前 MessagesView 对象中 + public MessagesView(MessagesEntity messagesEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 messagesEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, messagesEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/NewsView.java b/src/main/java/com/entity/view/NewsView.java new file mode 100644 index 0000000..ccb5736 --- /dev/null +++ b/src/main/java/com/entity/view/NewsView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.NewsEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 公告信息 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类对应的数据库表名为 "news" +@TableName("news") +// 定义一个名为 NewsView 的类,它继承自 NewsEntity 类, +// 并实现了 Serializable 接口,意味着该类的对象可以被序列化,以便进行网络传输或存储到文件等操作 +public class NewsView extends NewsEntity implements Serializable { + // 定义序列化版本号,用于在反序列化时确保版本的一致性, + // 保证序列化和反序列化过程中类的结构兼容 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 NewsView 类的对象且不传入任何参数时,会调用此构造函数 + public NewsView(){ + } + + // 带参构造函数,接收一个 NewsEntity 类型的参数 newsEntity + // 该构造函数的作用是将传入的 NewsEntity 对象的属性值复制到当前 NewsView 对象中 + public NewsView(NewsEntity newsEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 newsEntity 对象的属性值复制到当前对象 + // 该方法会自动匹配两个对象中名称和类型相同的属性并进行复制 + BeanUtils.copyProperties(this, newsEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/StoreupView.java b/src/main/java/com/entity/view/StoreupView.java new file mode 100644 index 0000000..8a547f5 --- /dev/null +++ b/src/main/java/com/entity/view/StoreupView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.StoreupEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 收藏表 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类在数据库中对应的表名为 "storeup" +@TableName("storeup") +// 定义一个名为 StoreupView 的类,继承自 StoreupEntity 类, +// 同时实现了 Serializable 接口,表明该类的对象可以被序列化,用于网络传输或持久化存储 +public class StoreupView extends StoreupEntity implements Serializable { + // 定义一个静态常量 serialVersionUID,用于在序列化和反序列化过程中确保版本的一致性 + // 当进行反序列化时,会检查该版本号是否匹配,以防止因类结构变化导致的反序列化失败 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 StoreupView 类的对象且不传入任何参数时,会调用此构造函数 + public StoreupView(){ + } + + // 定义一个带参构造函数,接收一个 StoreupEntity 类型的参数 storeupEntity + // 该构造函数的作用是将传入的 StoreupEntity 对象的属性值复制到当前 StoreupView 对象中 + public StoreupView(StoreupEntity storeupEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 storeupEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, storeupEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/WeixiuchuliView.java b/src/main/java/com/entity/view/WeixiuchuliView.java new file mode 100644 index 0000000..03a0abc --- /dev/null +++ b/src/main/java/com/entity/view/WeixiuchuliView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.WeixiuchuliEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 维修处理 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类对应的数据库表名为 "weixiuchuli" +@TableName("weixiuchuli") +// 定义一个名为 WeixiuchuliView 的类,继承自 WeixiuchuliEntity 类, +// 同时实现 Serializable 接口,这意味着该类的对象可以进行序列化操作,用于网络传输或存储到文件等场景 +public class WeixiuchuliView extends WeixiuchuliEntity implements Serializable { + // 定义序列化版本号,用于在反序列化时确保对象版本的一致性, + // 避免因类结构变化导致反序列化失败 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 WeixiuchuliView 对象时不传入任何参数,会调用此构造函数 + public WeixiuchuliView(){ + } + + // 带参构造函数,接收一个 WeixiuchuliEntity 类型的对象 weixiuchuliEntity + // 该构造函数的作用是将传入对象的属性值复制到当前 WeixiuchuliView 对象中 + public WeixiuchuliView(WeixiuchuliEntity weixiuchuliEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 weixiuchuliEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, weixiuchuliEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/WoyaodangfangzhuView.java b/src/main/java/com/entity/view/WoyaodangfangzhuView.java new file mode 100644 index 0000000..eede43a --- /dev/null +++ b/src/main/java/com/entity/view/WoyaodangfangzhuView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.WoyaodangfangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 我要当房主 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该类对应的数据库表名为 "woyaodangfangzhu" +@TableName("woyaodangfangzhu") +// 定义一个名为 WoyaodangfangzhuView 的类,继承自 WoyaodangfangzhuEntity 类, +// 并实现了 Serializable 接口,表明该类的对象可以被序列化,以便在网络传输或存储到文件时使用 +public class WoyaodangfangzhuView extends WoyaodangfangzhuEntity implements Serializable { + // 定义一个静态常量 serialVersionUID,用于在序列化和反序列化过程中确保版本的一致性 + // 当反序列化对象时,会检查这个版本号是否匹配,以保证对象结构的兼容性 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 WoyaodangfangzhuView 类的对象且不传入任何参数时,会调用此构造函数 + public WoyaodangfangzhuView(){ + } + + // 带参构造函数,接收一个 WoyaodangfangzhuEntity 类型的参数 woyaodangfangzhuEntity + // 该构造函数的作用是将传入的 WoyaodangfangzhuEntity 对象的属性值复制到当前 WoyaodangfangzhuView 对象中 + public WoyaodangfangzhuView(WoyaodangfangzhuEntity woyaodangfangzhuEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 woyaodangfangzhuEntity 对象的属性值复制到当前对象 + // 此方法会自动匹配两个对象中相同名称和类型的属性并进行复制 + BeanUtils.copyProperties(this, woyaodangfangzhuEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/YonghuView.java b/src/main/java/com/entity/view/YonghuView.java new file mode 100644 index 0000000..b1ee66f --- /dev/null +++ b/src/main/java/com/entity/view/YonghuView.java @@ -0,0 +1,49 @@ +package com.entity.view; + +import com.entity.YonghuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 用户 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 利用 @TableName 注解,指定该类在数据库里对应的表名为 "yonghu" +@TableName("yonghu") +// 定义一个名为 YonghuView 的类,它继承自 YonghuEntity 类, +// 同时实现了 Serializable 接口,这意味着该类的对象能够被序列化,适用于网络传输或者文件存储等场景 +public class YonghuView extends YonghuEntity implements Serializable { + // 定义一个静态常量 serialVersionUID,用于在序列化和反序列化过程中保证版本的一致性 + // 反序列化时会检查该版本号是否匹配,以此确保对象的兼容性 + private static final long serialVersionUID = 1L; + + // 定义一个无参构造函数,当创建 YonghuView 类的对象且不传入任何参数时,会调用此构造函数 + public YonghuView(){ + } + + // 定义一个带参构造函数,接收一个 YonghuEntity 类型的参数 yonghuEntity + // 此构造函数的作用是将传入的 YonghuEntity 对象的属性值复制到当前 YonghuView 对象中 + public YonghuView(YonghuEntity yonghuEntity){ + try { + // 借助 BeanUtils 类的 copyProperties 方法,把 yonghuEntity 对象的属性值复制到当前对象 + // 该方法会自动匹配两个对象中名称和类型相同的属性并完成复制操作 + BeanUtils.copyProperties(this, yonghuEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 若在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/view/YuyuekanfangView.java b/src/main/java/com/entity/view/YuyuekanfangView.java new file mode 100644 index 0000000..b53be21 --- /dev/null +++ b/src/main/java/com/entity/view/YuyuekanfangView.java @@ -0,0 +1,48 @@ +package com.entity.view; + +import com.entity.YuyuekanfangEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.InvocationTargetException; + +import java.io.Serializable; + + +/** + * 预约看房 + * 后端返回视图实体辅助类 + * (通常后端关联的表或者自定义的字段需要返回使用) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +// 使用 @TableName 注解指定该实体类对应的数据库表名为 "yuyuekanfang" +@TableName("yuyuekanfang") +// 定义一个名为 YuyuekanfangView 的类,它继承自 YuyuekanfangEntity 类, +// 实现 Serializable 接口意味着该类的对象可以被序列化,用于网络传输或存储到文件等场景 +public class YuyuekanfangView extends YuyuekanfangEntity implements Serializable { + // 定义序列化版本号,用于在反序列化时确保版本一致性,防止因类结构变化导致反序列化失败 + private static final long serialVersionUID = 1L; + + // 无参构造函数,当创建 YuyuekanfangView 对象且不传入任何参数时,会调用此构造函数 + public YuyuekanfangView(){ + } + + // 带参构造函数,接收一个 YuyuekanfangEntity 类型的对象 yuyuekanfangEntity + // 此构造函数的作用是将传入对象的属性值复制到当前 YuyuekanfangView 对象中 + public YuyuekanfangView(YuyuekanfangEntity yuyuekanfangEntity){ + try { + // 使用 BeanUtils 类的 copyProperties 方法将 yuyuekanfangEntity 对象的属性值复制到当前对象 + // 该方法会自动匹配两个对象中名称和类型相同的属性并进行复制 + BeanUtils.copyProperties(this, yuyuekanfangEntity); + } catch (IllegalAccessException | InvocationTargetException e) { + // 如果在属性复制过程中出现非法访问异常(IllegalAccessException) + // 或者调用目标方法时出现异常(InvocationTargetException),捕获该异常 + // 并打印异常堆栈信息,方便开发者定位问题 + // "// TODO Auto-generated catch block" 是 IDE 自动生成的提示, + // 提醒开发者可以在这里添加更具体的异常处理逻辑 + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/entity/vo/DiscussfangwuxinxiVO.java b/src/main/java/com/entity/vo/DiscussfangwuxinxiVO.java new file mode 100644 index 0000000..58a0a69 --- /dev/null +++ b/src/main/java/com/entity/vo/DiscussfangwuxinxiVO.java @@ -0,0 +1,91 @@ +package com.entity.vo; + +import com.entity.DiscussfangwuxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋信息评论表 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class DiscussfangwuxinxiVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 用户id + */ + + private Long userid; + + /** + * 评论内容 + */ + + private String content; + + /** + * 回复内容 + */ + + private String reply; + + + /** + * 设置:用户id + */ + + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + + /** + * 设置:评论内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:评论内容 + */ + public String getContent() { + return content; + } + + + /** + * 设置:回复内容 + */ + + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } + +} diff --git a/src/main/java/com/entity/vo/DiscusswoyaodangfangzhuVO.java b/src/main/java/com/entity/vo/DiscusswoyaodangfangzhuVO.java new file mode 100644 index 0000000..44bebf5 --- /dev/null +++ b/src/main/java/com/entity/vo/DiscusswoyaodangfangzhuVO.java @@ -0,0 +1,91 @@ +package com.entity.vo; + +import com.entity.DiscusswoyaodangfangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 我要当房主评论表 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class DiscusswoyaodangfangzhuVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 用户id + */ + + private Long userid; + + /** + * 评论内容 + */ + + private String content; + + /** + * 回复内容 + */ + + private String reply; + + + /** + * 设置:用户id + */ + + public void setUserid(Long userid) { + this.userid = userid; + } + + /** + * 获取:用户id + */ + public Long getUserid() { + return userid; + } + + + /** + * 设置:评论内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:评论内容 + */ + public String getContent() { + return content; + } + + + /** + * 设置:回复内容 + */ + + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } + +} diff --git a/src/main/java/com/entity/vo/FangwubaoxiuVO.java b/src/main/java/com/entity/vo/FangwubaoxiuVO.java new file mode 100644 index 0000000..fd611a2 --- /dev/null +++ b/src/main/java/com/entity/vo/FangwubaoxiuVO.java @@ -0,0 +1,335 @@ +package com.entity.vo; + +import com.entity.FangwubaoxiuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋报修 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwubaoxiuVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 报修名称 + */ + + private String baoxiumingcheng; + + /** + * 类型 + */ + + private String leixing; + + /** + * 报修内容 + */ + + private String baoxiuneirong; + + /** + * 图片 + */ + + private String tupian; + + /** + * 报修日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date baoxiuriqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:报修名称 + */ + + public void setBaoxiumingcheng(String baoxiumingcheng) { + this.baoxiumingcheng = baoxiumingcheng; + } + + /** + * 获取:报修名称 + */ + public String getBaoxiumingcheng() { + return baoxiumingcheng; + } + + + /** + * 设置:类型 + */ + + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + /** + * 获取:类型 + */ + public String getLeixing() { + return leixing; + } + + + /** + * 设置:报修内容 + */ + + public void setBaoxiuneirong(String baoxiuneirong) { + this.baoxiuneirong = baoxiuneirong; + } + + /** + * 获取:报修内容 + */ + public String getBaoxiuneirong() { + return baoxiuneirong; + } + + + /** + * 设置:图片 + */ + + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + + /** + * 设置:报修日期 + */ + + public void setBaoxiuriqi(Date baoxiuriqi) { + this.baoxiuriqi = baoxiuriqi; + } + + /** + * 获取:报修日期 + */ + public Date getBaoxiuriqi() { + return baoxiuriqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/vo/FangwuleixingVO.java b/src/main/java/com/entity/vo/FangwuleixingVO.java new file mode 100644 index 0000000..075e9c2 --- /dev/null +++ b/src/main/java/com/entity/vo/FangwuleixingVO.java @@ -0,0 +1,25 @@ +package com.entity.vo; + +import com.entity.FangwuleixingEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋类型 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwuleixingVO implements Serializable { + private static final long serialVersionUID = 1L; + + +} diff --git a/src/main/java/com/entity/vo/FangwupingjiaVO.java b/src/main/java/com/entity/vo/FangwupingjiaVO.java new file mode 100644 index 0000000..c08d4a2 --- /dev/null +++ b/src/main/java/com/entity/vo/FangwupingjiaVO.java @@ -0,0 +1,269 @@ +package com.entity.vo; + +import com.entity.FangwupingjiaEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋评价 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwupingjiaVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 评分 + */ + + private String pingfen; + + /** + * 评价内容 + */ + + private String pingjianeirong; + + /** + * 评价日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date pingjiariqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:评分 + */ + + public void setPingfen(String pingfen) { + this.pingfen = pingfen; + } + + /** + * 获取:评分 + */ + public String getPingfen() { + return pingfen; + } + + + /** + * 设置:评价内容 + */ + + public void setPingjianeirong(String pingjianeirong) { + this.pingjianeirong = pingjianeirong; + } + + /** + * 获取:评价内容 + */ + public String getPingjianeirong() { + return pingjianeirong; + } + + + /** + * 设置:评价日期 + */ + + public void setPingjiariqi(Date pingjiariqi) { + this.pingjiariqi = pingjiariqi; + } + + /** + * 获取:评价日期 + */ + public Date getPingjiariqi() { + return pingjiariqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/vo/FangwuxinxiVO.java b/src/main/java/com/entity/vo/FangwuxinxiVO.java new file mode 100644 index 0000000..a869ad3 --- /dev/null +++ b/src/main/java/com/entity/vo/FangwuxinxiVO.java @@ -0,0 +1,357 @@ +package com.entity.vo; + +import com.entity.FangwuxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房屋信息 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangwuxinxiVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 图片 + */ + + private String tupian; + + /** + * 租赁方式 + */ + + private String zulinfangshi; + + /** + * 朝向楼层 + */ + + private String chaoxianglouceng; + + /** + * 面积 + */ + + private String mianji; + + /** + * 房屋状态 + */ + + private String fangwuzhuangtai; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 详细地址 + */ + + private String xiangxidizhi; + + /** + * 月租价格 + */ + + private Integer yuezujiage; + + /** + * 押金 + */ + + private Integer yajin; + + /** + * 房屋设施 + */ + + private String fangwusheshi; + + /** + * 房屋详情 + */ + + private String fangwuxiangqing; + + /** + * 发布日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date faburiqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:图片 + */ + + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + + /** + * 设置:租赁方式 + */ + + public void setZulinfangshi(String zulinfangshi) { + this.zulinfangshi = zulinfangshi; + } + + /** + * 获取:租赁方式 + */ + public String getZulinfangshi() { + return zulinfangshi; + } + + + /** + * 设置:朝向楼层 + */ + + public void setChaoxianglouceng(String chaoxianglouceng) { + this.chaoxianglouceng = chaoxianglouceng; + } + + /** + * 获取:朝向楼层 + */ + public String getChaoxianglouceng() { + return chaoxianglouceng; + } + + + /** + * 设置:面积 + */ + + public void setMianji(String mianji) { + this.mianji = mianji; + } + + /** + * 获取:面积 + */ + public String getMianji() { + return mianji; + } + + + /** + * 设置:房屋状态 + */ + + public void setFangwuzhuangtai(String fangwuzhuangtai) { + this.fangwuzhuangtai = fangwuzhuangtai; + } + + /** + * 获取:房屋状态 + */ + public String getFangwuzhuangtai() { + return fangwuzhuangtai; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:详细地址 + */ + + public void setXiangxidizhi(String xiangxidizhi) { + this.xiangxidizhi = xiangxidizhi; + } + + /** + * 获取:详细地址 + */ + public String getXiangxidizhi() { + return xiangxidizhi; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:押金 + */ + + public void setYajin(Integer yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public Integer getYajin() { + return yajin; + } + + + /** + * 设置:房屋设施 + */ + + public void setFangwusheshi(String fangwusheshi) { + this.fangwusheshi = fangwusheshi; + } + + /** + * 获取:房屋设施 + */ + public String getFangwusheshi() { + return fangwusheshi; + } + + + /** + * 设置:房屋详情 + */ + + public void setFangwuxiangqing(String fangwuxiangqing) { + this.fangwuxiangqing = fangwuxiangqing; + } + + /** + * 获取:房屋详情 + */ + public String getFangwuxiangqing() { + return fangwuxiangqing; + } + + + /** + * 设置:发布日期 + */ + + public void setFaburiqi(Date faburiqi) { + this.faburiqi = faburiqi; + } + + /** + * 获取:发布日期 + */ + public Date getFaburiqi() { + return faburiqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + +} diff --git a/src/main/java/com/entity/vo/FangzhuVO.java b/src/main/java/com/entity/vo/FangzhuVO.java new file mode 100644 index 0000000..af71196 --- /dev/null +++ b/src/main/java/com/entity/vo/FangzhuVO.java @@ -0,0 +1,157 @@ +package com.entity.vo; + +import com.entity.FangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 房主 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class FangzhuVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 密码 + */ + + private String mima; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 性别 + */ + + private String xingbie; + + /** + * 头像 + */ + + private String touxiang; + + /** + * 手机 + */ + + private String shouji; + + /** + * 身份证 + */ + + private String shenfenzheng; + + + /** + * 设置:密码 + */ + + public void setMima(String mima) { + this.mima = mima; + } + + /** + * 获取:密码 + */ + public String getMima() { + return mima; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:性别 + */ + + public void setXingbie(String xingbie) { + this.xingbie = xingbie; + } + + /** + * 获取:性别 + */ + public String getXingbie() { + return xingbie; + } + + + /** + * 设置:头像 + */ + + public void setTouxiang(String touxiang) { + this.touxiang = touxiang; + } + + /** + * 获取:头像 + */ + public String getTouxiang() { + return touxiang; + } + + + /** + * 设置:手机 + */ + + public void setShouji(String shouji) { + this.shouji = shouji; + } + + /** + * 获取:手机 + */ + public String getShouji() { + return shouji; + } + + + /** + * 设置:身份证 + */ + + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + +} diff --git a/src/main/java/com/entity/vo/HetongxinxiVO.java b/src/main/java/com/entity/vo/HetongxinxiVO.java new file mode 100644 index 0000000..df60917 --- /dev/null +++ b/src/main/java/com/entity/vo/HetongxinxiVO.java @@ -0,0 +1,447 @@ +package com.entity.vo; + +import com.entity.HetongxinxiEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 合同信息 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class HetongxinxiVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 月租价格 + */ + + private String yuezujiage; + + /** + * 租用月数 + */ + + private String zuyongyueshu; + + /** + * 租用金额 + */ + + private Integer zuyongjine; + + /** + * 押金 + */ + + private Integer yajin; + + /** + * 房租状态 + */ + + private String fangzuzhuangtai; + + /** + * 合同金额 + */ + + private String hetongjine; + + /** + * 合同内容 + */ + + private String hetongneirong; + + /** + * 生效日 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date shengxiaori; + + /** + * 有限期至 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date youxianqizhi; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + /** + * 是否支付 + */ + + private String ispay; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(String yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public String getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:租用月数 + */ + + public void setZuyongyueshu(String zuyongyueshu) { + this.zuyongyueshu = zuyongyueshu; + } + + /** + * 获取:租用月数 + */ + public String getZuyongyueshu() { + return zuyongyueshu; + } + + + /** + * 设置:租用金额 + */ + + public void setZuyongjine(Integer zuyongjine) { + this.zuyongjine = zuyongjine; + } + + /** + * 获取:租用金额 + */ + public Integer getZuyongjine() { + return zuyongjine; + } + + + /** + * 设置:押金 + */ + + public void setYajin(Integer yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public Integer getYajin() { + return yajin; + } + + + /** + * 设置:房租状态 + */ + + public void setFangzuzhuangtai(String fangzuzhuangtai) { + this.fangzuzhuangtai = fangzuzhuangtai; + } + + /** + * 获取:房租状态 + */ + public String getFangzuzhuangtai() { + return fangzuzhuangtai; + } + + + /** + * 设置:合同金额 + */ + + public void setHetongjine(String hetongjine) { + this.hetongjine = hetongjine; + } + + /** + * 获取:合同金额 + */ + public String getHetongjine() { + return hetongjine; + } + + + /** + * 设置:合同内容 + */ + + public void setHetongneirong(String hetongneirong) { + this.hetongneirong = hetongneirong; + } + + /** + * 获取:合同内容 + */ + public String getHetongneirong() { + return hetongneirong; + } + + + /** + * 设置:生效日 + */ + + public void setShengxiaori(Date shengxiaori) { + this.shengxiaori = shengxiaori; + } + + /** + * 获取:生效日 + */ + public Date getShengxiaori() { + return shengxiaori; + } + + + /** + * 设置:有限期至 + */ + + public void setYouxianqizhi(Date youxianqizhi) { + this.youxianqizhi = youxianqizhi; + } + + /** + * 获取:有限期至 + */ + public Date getYouxianqizhi() { + return youxianqizhi; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + + + /** + * 设置:是否支付 + */ + + public void setIspay(String ispay) { + this.ispay = ispay; + } + + /** + * 获取:是否支付 + */ + public String getIspay() { + return ispay; + } + +} diff --git a/src/main/java/com/entity/vo/MessagesVO.java b/src/main/java/com/entity/vo/MessagesVO.java new file mode 100644 index 0000000..eb63530 --- /dev/null +++ b/src/main/java/com/entity/vo/MessagesVO.java @@ -0,0 +1,91 @@ +package com.entity.vo; + +import com.entity.MessagesEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 留言板 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class MessagesVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 用户名 + */ + + private String username; + + /** + * 留言内容 + */ + + private String content; + + /** + * 回复内容 + */ + + private String reply; + + + /** + * 设置:用户名 + */ + + public void setUsername(String username) { + this.username = username; + } + + /** + * 获取:用户名 + */ + public String getUsername() { + return username; + } + + + /** + * 设置:留言内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:留言内容 + */ + public String getContent() { + return content; + } + + + /** + * 设置:回复内容 + */ + + public void setReply(String reply) { + this.reply = reply; + } + + /** + * 获取:回复内容 + */ + public String getReply() { + return reply; + } + +} diff --git a/src/main/java/com/entity/vo/NewsVO.java b/src/main/java/com/entity/vo/NewsVO.java new file mode 100644 index 0000000..7574102 --- /dev/null +++ b/src/main/java/com/entity/vo/NewsVO.java @@ -0,0 +1,91 @@ +package com.entity.vo; + +import com.entity.NewsEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 公告信息 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class NewsVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 简介 + */ + + private String introduction; + + /** + * 图片 + */ + + private String picture; + + /** + * 内容 + */ + + private String content; + + + /** + * 设置:简介 + */ + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + /** + * 获取:简介 + */ + public String getIntroduction() { + return introduction; + } + + + /** + * 设置:图片 + */ + + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * 获取:图片 + */ + public String getPicture() { + return picture; + } + + + /** + * 设置:内容 + */ + + public void setContent(String content) { + this.content = content; + } + + /** + * 获取:内容 + */ + public String getContent() { + return content; + } + +} diff --git a/src/main/java/com/entity/vo/StoreupVO.java b/src/main/java/com/entity/vo/StoreupVO.java new file mode 100644 index 0000000..fc53bbe --- /dev/null +++ b/src/main/java/com/entity/vo/StoreupVO.java @@ -0,0 +1,113 @@ +package com.entity.vo; + +import com.entity.StoreupEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 收藏表 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class StoreupVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 收藏id + */ + + private Long refid; + + /** + * 表名 + */ + + private String tablename; + + /** + * 收藏名称 + */ + + private String name; + + /** + * 收藏图片 + */ + + private String picture; + + + /** + * 设置:收藏id + */ + + public void setRefid(Long refid) { + this.refid = refid; + } + + /** + * 获取:收藏id + */ + public Long getRefid() { + return refid; + } + + + /** + * 设置:表名 + */ + + public void setTablename(String tablename) { + this.tablename = tablename; + } + + /** + * 获取:表名 + */ + public String getTablename() { + return tablename; + } + + + /** + * 设置:收藏名称 + */ + + public void setName(String name) { + this.name = name; + } + + /** + * 获取:收藏名称 + */ + public String getName() { + return name; + } + + + /** + * 设置:收藏图片 + */ + + public void setPicture(String picture) { + this.picture = picture; + } + + /** + * 获取:收藏图片 + */ + public String getPicture() { + return picture; + } + +} diff --git a/src/main/java/com/entity/vo/WeixiuchuliVO.java b/src/main/java/com/entity/vo/WeixiuchuliVO.java new file mode 100644 index 0000000..c9b0687 --- /dev/null +++ b/src/main/java/com/entity/vo/WeixiuchuliVO.java @@ -0,0 +1,269 @@ +package com.entity.vo; + +import com.entity.WeixiuchuliEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 维修处理 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class WeixiuchuliVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 报修名称 + */ + + private String baoxiumingcheng; + + /** + * 类型 + */ + + private String leixing; + + /** + * 报修日期 + */ + + private String baoxiuriqi; + + /** + * 维修反馈 + */ + + private String weixiufankui; + + /** + * 维修进度 + */ + + private String weixiujindu; + + /** + * 更新日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date gengxinriqi; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:报修名称 + */ + + public void setBaoxiumingcheng(String baoxiumingcheng) { + this.baoxiumingcheng = baoxiumingcheng; + } + + /** + * 获取:报修名称 + */ + public String getBaoxiumingcheng() { + return baoxiumingcheng; + } + + + /** + * 设置:类型 + */ + + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + /** + * 获取:类型 + */ + public String getLeixing() { + return leixing; + } + + + /** + * 设置:报修日期 + */ + + public void setBaoxiuriqi(String baoxiuriqi) { + this.baoxiuriqi = baoxiuriqi; + } + + /** + * 获取:报修日期 + */ + public String getBaoxiuriqi() { + return baoxiuriqi; + } + + + /** + * 设置:维修反馈 + */ + + public void setWeixiufankui(String weixiufankui) { + this.weixiufankui = weixiufankui; + } + + /** + * 获取:维修反馈 + */ + public String getWeixiufankui() { + return weixiufankui; + } + + + /** + * 设置:维修进度 + */ + + public void setWeixiujindu(String weixiujindu) { + this.weixiujindu = weixiujindu; + } + + /** + * 获取:维修进度 + */ + public String getWeixiujindu() { + return weixiujindu; + } + + + /** + * 设置:更新日期 + */ + + public void setGengxinriqi(Date gengxinriqi) { + this.gengxinriqi = gengxinriqi; + } + + /** + * 获取:更新日期 + */ + public Date getGengxinriqi() { + return gengxinriqi; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + +} diff --git a/src/main/java/com/entity/vo/WoyaodangfangzhuVO.java b/src/main/java/com/entity/vo/WoyaodangfangzhuVO.java new file mode 100644 index 0000000..944522e --- /dev/null +++ b/src/main/java/com/entity/vo/WoyaodangfangzhuVO.java @@ -0,0 +1,313 @@ +package com.entity.vo; + +import com.entity.WoyaodangfangzhuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 我要当房主 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class WoyaodangfangzhuVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 图片 + */ + + private String tupian; + + /** + * 租赁方式 + */ + + private String zulinfangshi; + + /** + * 朝向楼层 + */ + + private String chaoxianglouceng; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 面积 + */ + + private String mianji; + + /** + * 月租价格 + */ + + private Integer yuezujiage; + + /** + * 房屋详情 + */ + + private String fangwuxiangqing; + + /** + * 发布日期 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date faburiqi; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:图片 + */ + + public void setTupian(String tupian) { + this.tupian = tupian; + } + + /** + * 获取:图片 + */ + public String getTupian() { + return tupian; + } + + + /** + * 设置:租赁方式 + */ + + public void setZulinfangshi(String zulinfangshi) { + this.zulinfangshi = zulinfangshi; + } + + /** + * 获取:租赁方式 + */ + public String getZulinfangshi() { + return zulinfangshi; + } + + + /** + * 设置:朝向楼层 + */ + + public void setChaoxianglouceng(String chaoxianglouceng) { + this.chaoxianglouceng = chaoxianglouceng; + } + + /** + * 获取:朝向楼层 + */ + public String getChaoxianglouceng() { + return chaoxianglouceng; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:面积 + */ + + public void setMianji(String mianji) { + this.mianji = mianji; + } + + /** + * 获取:面积 + */ + public String getMianji() { + return mianji; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:房屋详情 + */ + + public void setFangwuxiangqing(String fangwuxiangqing) { + this.fangwuxiangqing = fangwuxiangqing; + } + + /** + * 获取:房屋详情 + */ + public String getFangwuxiangqing() { + return fangwuxiangqing; + } + + + /** + * 设置:发布日期 + */ + + public void setFaburiqi(Date faburiqi) { + this.faburiqi = faburiqi; + } + + /** + * 获取:发布日期 + */ + public Date getFaburiqi() { + return faburiqi; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/entity/vo/YonghuVO.java b/src/main/java/com/entity/vo/YonghuVO.java new file mode 100644 index 0000000..fa2e007 --- /dev/null +++ b/src/main/java/com/entity/vo/YonghuVO.java @@ -0,0 +1,179 @@ +package com.entity.vo; + +import com.entity.YonghuEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 用户 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class YonghuVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 密码 + */ + + private String mima; + + /** + * 姓名 + */ + + private String xingming; + + /** + * 头像 + */ + + private String touxiang; + + /** + * 性别 + */ + + private String xingbie; + + /** + * 职业 + */ + + private String zhiye; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 身份证 + */ + + private String shenfenzheng; + + + /** + * 设置:密码 + */ + + public void setMima(String mima) { + this.mima = mima; + } + + /** + * 获取:密码 + */ + public String getMima() { + return mima; + } + + + /** + * 设置:姓名 + */ + + public void setXingming(String xingming) { + this.xingming = xingming; + } + + /** + * 获取:姓名 + */ + public String getXingming() { + return xingming; + } + + + /** + * 设置:头像 + */ + + public void setTouxiang(String touxiang) { + this.touxiang = touxiang; + } + + /** + * 获取:头像 + */ + public String getTouxiang() { + return touxiang; + } + + + /** + * 设置:性别 + */ + + public void setXingbie(String xingbie) { + this.xingbie = xingbie; + } + + /** + * 获取:性别 + */ + public String getXingbie() { + return xingbie; + } + + + /** + * 设置:职业 + */ + + public void setZhiye(String zhiye) { + this.zhiye = zhiye; + } + + /** + * 获取:职业 + */ + public String getZhiye() { + return zhiye; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:身份证 + */ + + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + +} diff --git a/src/main/java/com/entity/vo/YuyuekanfangVO.java b/src/main/java/com/entity/vo/YuyuekanfangVO.java new file mode 100644 index 0000000..832a344 --- /dev/null +++ b/src/main/java/com/entity/vo/YuyuekanfangVO.java @@ -0,0 +1,401 @@ +package com.entity.vo; + +import com.entity.YuyuekanfangEntity; + +import com.baomidou.mybatisplus.annotations.TableName; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; + + +/** + * 预约看房 + * 手机端接口返回实体辅助类 + * (主要作用去除一些不必要的字段) + * @author + * @email + * @date 2025-04-04 18:46:21 + */ +public class YuyuekanfangVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 房屋名称 + */ + + private String fangwumingcheng; + + /** + * 房屋类型 + */ + + private String fangwuleixing; + + /** + * 房屋状态 + */ + + private String fangwuzhuangtai; + + /** + * 小区 + */ + + private String xiaoqu; + + /** + * 月租价格 + */ + + private Integer yuezujiage; + + /** + * 押金 + */ + + private String yajin; + + /** + * 租用月数 + */ + + private Integer zuyongyueshu; + + /** + * 租用金额 + */ + + private String zuyongjine; + + /** + * 预约时间 + */ + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + @DateTimeFormat + private Date yuyueshijian; + + /** + * 用户名 + */ + + private String yonghuming; + + /** + * 姓名 + */ + + private String xingming; + + /** + * 身份证 + */ + + private String shenfenzheng; + + /** + * 联系电话 + */ + + private String lianxidianhua; + + /** + * 房主账号 + */ + + private String fangzhuzhanghao; + + /** + * 房主姓名 + */ + + private String fangzhuxingming; + + /** + * 是否审核 + */ + + private String sfsh; + + /** + * 审核回复 + */ + + private String shhf; + + + /** + * 设置:房屋名称 + */ + + public void setFangwumingcheng(String fangwumingcheng) { + this.fangwumingcheng = fangwumingcheng; + } + + /** + * 获取:房屋名称 + */ + public String getFangwumingcheng() { + return fangwumingcheng; + } + + + /** + * 设置:房屋类型 + */ + + public void setFangwuleixing(String fangwuleixing) { + this.fangwuleixing = fangwuleixing; + } + + /** + * 获取:房屋类型 + */ + public String getFangwuleixing() { + return fangwuleixing; + } + + + /** + * 设置:房屋状态 + */ + + public void setFangwuzhuangtai(String fangwuzhuangtai) { + this.fangwuzhuangtai = fangwuzhuangtai; + } + + /** + * 获取:房屋状态 + */ + public String getFangwuzhuangtai() { + return fangwuzhuangtai; + } + + + /** + * 设置:小区 + */ + + public void setXiaoqu(String xiaoqu) { + this.xiaoqu = xiaoqu; + } + + /** + * 获取:小区 + */ + public String getXiaoqu() { + return xiaoqu; + } + + + /** + * 设置:月租价格 + */ + + public void setYuezujiage(Integer yuezujiage) { + this.yuezujiage = yuezujiage; + } + + /** + * 获取:月租价格 + */ + public Integer getYuezujiage() { + return yuezujiage; + } + + + /** + * 设置:押金 + */ + + public void setYajin(String yajin) { + this.yajin = yajin; + } + + /** + * 获取:押金 + */ + public String getYajin() { + return yajin; + } + + + /** + * 设置:租用月数 + */ + + public void setZuyongyueshu(Integer zuyongyueshu) { + this.zuyongyueshu = zuyongyueshu; + } + + /** + * 获取:租用月数 + */ + public Integer getZuyongyueshu() { + return zuyongyueshu; + } + + + /** + * 设置:租用金额 + */ + + public void setZuyongjine(String zuyongjine) { + this.zuyongjine = zuyongjine; + } + + /** + * 获取:租用金额 + */ + public String getZuyongjine() { + return zuyongjine; + } + + + /** + * 设置:预约时间 + */ + + public void setYuyueshijian(Date yuyueshijian) { + this.yuyueshijian = yuyueshijian; + } + + /** + * 获取:预约时间 + */ + public Date getYuyueshijian() { + return yuyueshijian; + } + + + /** + * 设置:用户名 + */ + + public void setYonghuming(String yonghuming) { + this.yonghuming = yonghuming; + } + + /** + * 获取:用户名 + */ + public String getYonghuming() { + return yonghuming; + } + + + /** + * 设置:姓名 + */ + + public void setXingming(String xingming) { + this.xingming = xingming; + } + + /** + * 获取:姓名 + */ + public String getXingming() { + return xingming; + } + + + /** + * 设置:身份证 + */ + + public void setShenfenzheng(String shenfenzheng) { + this.shenfenzheng = shenfenzheng; + } + + /** + * 获取:身份证 + */ + public String getShenfenzheng() { + return shenfenzheng; + } + + + /** + * 设置:联系电话 + */ + + public void setLianxidianhua(String lianxidianhua) { + this.lianxidianhua = lianxidianhua; + } + + /** + * 获取:联系电话 + */ + public String getLianxidianhua() { + return lianxidianhua; + } + + + /** + * 设置:房主账号 + */ + + public void setFangzhuzhanghao(String fangzhuzhanghao) { + this.fangzhuzhanghao = fangzhuzhanghao; + } + + /** + * 获取:房主账号 + */ + public String getFangzhuzhanghao() { + return fangzhuzhanghao; + } + + + /** + * 设置:房主姓名 + */ + + public void setFangzhuxingming(String fangzhuxingming) { + this.fangzhuxingming = fangzhuxingming; + } + + /** + * 获取:房主姓名 + */ + public String getFangzhuxingming() { + return fangzhuxingming; + } + + + /** + * 设置:是否审核 + */ + + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + /** + * 获取:是否审核 + */ + public String getSfsh() { + return sfsh; + } + + + /** + * 设置:审核回复 + */ + + public void setShhf(String shhf) { + this.shhf = shhf; + } + + /** + * 获取:审核回复 + */ + public String getShhf() { + return shhf; + } + +} diff --git a/src/main/java/com/interceptor/AuthorizationInterceptor.java b/src/main/java/com/interceptor/AuthorizationInterceptor.java new file mode 100644 index 0000000..d334c2b --- /dev/null +++ b/src/main/java/com/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,120 @@ +package com.interceptor; + +// 导入必要的 Java 类库 +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +// 导入 FastJSON 工具类,用于 JSON 格式化 +import com.alibaba.fastjson.JSONObject; + +// 导入 Servlet 相关类,用于处理 HTTP 请求和响应 +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +// 导入 Apache Commons Lang 工具类,用于字符串操作 +import org.apache.commons.lang3.StringUtils; + +// 导入 Spring 框架相关注解和组件 +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +// 导入 HTTP 请求方法和状态码相关类 +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.http.HttpStatus; + +// 导入项目中自定义的类和接口 +import com.annotation.IgnoreAuth; +import com.entity.EIException; +import com.entity.TokenEntity; +import com.service.TokenService; +import com.utils.R; + +/** + * 权限(Token)验证拦截器,用于拦截请求并验证用户身份 + */ +@Component // 使用 @Component 注解标识该类为 Spring 容器中的一个组件 +public class AuthorizationInterceptor implements HandlerInterceptor { + + // 定义 Token 的 Header 键名常量 + public static final String LOGIN_TOKEN_KEY = "Token"; + + // 自动注入 TokenService,用于验证 Token 的有效性 + @Autowired + private TokenService tokenService; + + /** + * 在请求处理之前执行的方法,用于验证权限 + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + // 设置跨域请求支持的 HTTP 方法 + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + // 设置跨域请求缓存时间 + response.setHeader("Access-Control-Max-Age", "3600"); + // 允许跨域请求携带凭证 + response.setHeader("Access-Control-Allow-Credentials", "true"); + // 设置允许的跨域请求头 + response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); + // 设置允许的跨域来源 + response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); + + // 如果是 OPTIONS 请求(预检请求),直接返回正常状态码 + if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { + response.setStatus(HttpStatus.OK.value()); + return false; + } + + // 判断当前处理器是否为方法处理器,并获取 IgnoreAuth 注解 + IgnoreAuth annotation; + if (handler instanceof HandlerMethod) { + annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); + } else { + // 如果不是方法处理器,直接放行 + return true; + } + + // 从请求头中获取 Token + String token = request.getHeader(LOGIN_TOKEN_KEY); + + /** + * 如果方法上标注了 @IgnoreAuth 注解,则不需要验证权限,直接放行 + */ + if (annotation != null) { + return true; + } + + // 如果 Token 不为空,尝试通过 TokenService 验证 Token 的有效性 + TokenEntity tokenEntity = null; + if (StringUtils.isNotBlank(token)) { + tokenEntity = tokenService.getTokenEntity(token); + } + + // 如果 Token 验证成功,将用户信息存储到 Session 中 + if (tokenEntity != null) { + request.getSession().setAttribute("userId", tokenEntity.getUserid()); // 存储用户 ID + request.getSession().setAttribute("role", tokenEntity.getRole()); // 存储用户角色 + request.getSession().setAttribute("tableName", tokenEntity.getTablename()); // 存储表名 + request.getSession().setAttribute("username", tokenEntity.getUsername()); // 存储用户名 + return true; // 放行请求 + } + + // 如果 Token 验证失败,返回未授权的错误信息 + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); // 设置响应字符编码为 UTF-8 + response.setContentType("application/json; charset=utf-8"); // 设置响应内容类型为 JSON + try { + writer = response.getWriter(); // 获取输出流 + writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); // 返回 JSON 格式的错误信息 + } finally { + if (writer != null) { + writer.close(); // 关闭输出流 + } + } + return false; // 拒绝请求 + } +} diff --git a/src/main/java/com/service/CommonService.java b/src/main/java/com/service/CommonService.java new file mode 100644 index 0000000..ac77f6e --- /dev/null +++ b/src/main/java/com/service/CommonService.java @@ -0,0 +1,32 @@ +package com.service; + +// 导入必要的 Java 类 +import java.util.List; +import java.util.Map; + +/** + * 通用服务接口,定义了一些通用的业务方法 + */ +public interface CommonService { + + // 获取选项列表,返回一个字符串列表 + List getOption(Map params); + + // 根据选项获取关联数据,返回一个 Map 对象 + Map getFollowByOption(Map params); + + // 执行审核操作,参数为一个 Map 对象 + void sh(Map params); + + // 提醒计数,返回符合条件的记录数 + int remindCount(Map params); + + // 查询计算结果,返回一个 Map 对象 + Map selectCal(Map params); + + // 分组查询,返回一个包含 Map 的列表 + List> selectGroup(Map params); + + // 查询值列表,返回一个包含 Map 的列表 + List> selectValue(Map params); +} diff --git a/src/main/java/com/service/ConfigService.java b/src/main/java/com/service/ConfigService.java new file mode 100644 index 0000000..000eb54 --- /dev/null +++ b/src/main/java/com/service/ConfigService.java @@ -0,0 +1,23 @@ +package com.service; + +// 导入 MyBatis-Plus 的 IService 接口,用于定义服务层接口 +import com.baomidou.mybatisplus.service.IService; + +// 导入实体类 ConfigEntity,表示配置表的实体类 +import com.entity.ConfigEntity; + +// 导入分页工具类 PageUtils,用于封装分页查询结果 +import com.utils.PageUtils; + +// 导入 Map 类,用于传递查询参数 +import java.util.Map; + + +/** + * 配置服务接口,定义与系统配置相关的业务操作 + */ +public interface ConfigService extends IService { + + // 根据参数进行分页查询,并返回封装的分页结果 + PageUtils queryPage(Map params); +} diff --git a/src/main/java/com/service/DiscussfangwuxinxiService.java b/src/main/java/com/service/DiscussfangwuxinxiService.java new file mode 100644 index 0000000..2638450 --- /dev/null +++ b/src/main/java/com/service/DiscussfangwuxinxiService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 DiscussfangwuxinxiEntity,表示“房屋信息评论表”的数据库表结构 +import com.entity.DiscussfangwuxinxiEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.DiscussfangwuxinxiVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.DiscussfangwuxinxiView; + + +/** + * 房屋信息评论表 服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface DiscussfangwuxinxiService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“房屋信息评论表”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“房屋信息评论表”的视图对象(VO) + DiscussfangwuxinxiVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“房屋信息评论表”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“房屋信息评论表”的视图模型(View) + DiscussfangwuxinxiView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/DiscusswoyaodangfangzhuService.java b/src/main/java/com/service/DiscusswoyaodangfangzhuService.java new file mode 100644 index 0000000..8ccd26b --- /dev/null +++ b/src/main/java/com/service/DiscusswoyaodangfangzhuService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 DiscusswoyaodangfangzhuEntity,表示“我要当房主评论表”的数据库表结构 +import com.entity.DiscusswoyaodangfangzhuEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.DiscusswoyaodangfangzhuVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.DiscusswoyaodangfangzhuView; + + +/** + * 我要当房主评论表 服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface DiscusswoyaodangfangzhuService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“我要当房主评论表”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“我要当房主评论表”的视图对象(VO) + DiscusswoyaodangfangzhuVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“我要当房主评论表”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“我要当房主评论表”的视图模型(View) + DiscusswoyaodangfangzhuView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/FangwubaoxiuService.java b/src/main/java/com/service/FangwubaoxiuService.java new file mode 100644 index 0000000..7d16d46 --- /dev/null +++ b/src/main/java/com/service/FangwubaoxiuService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 FangwubaoxiuEntity,表示“房屋报修”的数据库表结构 +import com.entity.FangwubaoxiuEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.FangwubaoxiuVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.FangwubaoxiuView; + + +/** + * 房屋报修服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface FangwubaoxiuService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“房屋报修”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“房屋报修”的视图对象(VO) + FangwubaoxiuVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“房屋报修”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“房屋报修”的视图模型(View) + FangwubaoxiuView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/FangwuleixingService.java b/src/main/java/com/service/FangwuleixingService.java new file mode 100644 index 0000000..3190a87 --- /dev/null +++ b/src/main/java/com/service/FangwuleixingService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 FangwuleixingEntity,表示“房屋类型”的数据库表结构 +import com.entity.FangwuleixingEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.FangwuleixingVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.FangwuleixingView; + + +/** + * 房屋类型服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface FangwuleixingService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“房屋类型”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“房屋类型”的视图对象(VO) + FangwuleixingVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“房屋类型”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“房屋类型”的视图模型(View) + FangwuleixingView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/FangwupingjiaService.java b/src/main/java/com/service/FangwupingjiaService.java new file mode 100644 index 0000000..de52271 --- /dev/null +++ b/src/main/java/com/service/FangwupingjiaService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 FangwupingjiaEntity,表示“房屋评价”的数据库表结构 +import com.entity.FangwupingjiaEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.FangwupingjiaVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.FangwupingjiaView; + + +/** + * 房屋评价服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface FangwupingjiaService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“房屋评价”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“房屋评价”的视图对象(VO) + FangwupingjiaVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“房屋评价”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“房屋评价”的视图模型(View) + FangwupingjiaView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/FangwuxinxiService.java b/src/main/java/com/service/FangwuxinxiService.java new file mode 100644 index 0000000..49ab1c7 --- /dev/null +++ b/src/main/java/com/service/FangwuxinxiService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 FangwuxinxiEntity,表示“房屋信息”的数据库表结构 +import com.entity.FangwuxinxiEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.FangwuxinxiVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.FangwuxinxiView; + + +/** + * 房屋信息服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface FangwuxinxiService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“房屋信息”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“房屋信息”的视图对象(VO) + FangwuxinxiVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“房屋信息”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“房屋信息”的视图模型(View) + FangwuxinxiView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/FangzhuService.java b/src/main/java/com/service/FangzhuService.java new file mode 100644 index 0000000..e29a66e --- /dev/null +++ b/src/main/java/com/service/FangzhuService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 FangzhuEntity,表示“房主”的数据库表结构 +import com.entity.FangzhuEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.FangzhuVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.FangzhuView; + + +/** + * 房主服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface FangzhuService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“房主”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“房主”的视图对象(VO) + FangzhuVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“房主”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“房主”的视图模型(View) + FangzhuView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/HetongxinxiService.java b/src/main/java/com/service/HetongxinxiService.java new file mode 100644 index 0000000..f21c9da --- /dev/null +++ b/src/main/java/com/service/HetongxinxiService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 HetongxinxiEntity,表示“合同信息”的数据库表结构 +import com.entity.HetongxinxiEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.HetongxinxiVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.HetongxinxiView; + + +/** + * 合同信息服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface HetongxinxiService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“合同信息”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“合同信息”的视图对象(VO) + HetongxinxiVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“合同信息”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“合同信息”的视图模型(View) + HetongxinxiView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/MessagesService.java b/src/main/java/com/service/MessagesService.java new file mode 100644 index 0000000..9deb7ae --- /dev/null +++ b/src/main/java/com/service/MessagesService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 MessagesEntity,表示“留言板”的数据库表结构 +import com.entity.MessagesEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.MessagesVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.MessagesView; + + +/** + * 留言板服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface MessagesService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“留言板”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“留言板”的视图对象(VO) + MessagesVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“留言板”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“留言板”的视图模型(View) + MessagesView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/NewsService.java b/src/main/java/com/service/NewsService.java new file mode 100644 index 0000000..ed90be1 --- /dev/null +++ b/src/main/java/com/service/NewsService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 NewsEntity,表示“公告信息”的数据库表结构 +import com.entity.NewsEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.NewsVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.NewsView; + + +/** + * 公告信息服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface NewsService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“公告信息”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“公告信息”的视图对象(VO) + NewsVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“公告信息”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“公告信息”的视图模型(View) + NewsView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/StoreupService.java b/src/main/java/com/service/StoreupService.java new file mode 100644 index 0000000..23832dc --- /dev/null +++ b/src/main/java/com/service/StoreupService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 StoreupEntity,表示“收藏表”的数据库表结构 +import com.entity.StoreupEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.StoreupVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.StoreupView; + + +/** + * 收藏表 服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface StoreupService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“收藏表”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“收藏表”的视图对象(VO) + StoreupVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“收藏表”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“收藏表”的视图模型(View) + StoreupView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/TokenService.java b/src/main/java/com/service/TokenService.java new file mode 100644 index 0000000..be4d83a --- /dev/null +++ b/src/main/java/com/service/TokenService.java @@ -0,0 +1,32 @@ +package com.service; + +// 导入必要的类和接口 +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; +import com.entity.TokenEntity; +import com.utils.PageUtils; + + +/** + * Token 服务接口,定义了与 Token 相关的业务操作方法 + */ +public interface TokenService extends IService { + + // 根据参数进行分页查询,返回封装的分页结果 + PageUtils queryPage(Map params); + + // 查询 Token 列表视图,返回符合条件的 Token 实体列表 + List selectListView(Wrapper wrapper); + + // 根据参数和条件进行分页查询,返回封装的分页结果 + PageUtils queryPage(Map params, Wrapper wrapper); + + // 生成 Token,根据用户 ID、用户名、表名和角色生成对应的 Token + String generateToken(Long userid, String username, String tableName, String role); + + // 根据 Token 获取对应的 Token 实体对象 + TokenEntity getTokenEntity(String token); +} diff --git a/src/main/java/com/service/UserService.java b/src/main/java/com/service/UserService.java new file mode 100644 index 0000000..97ee85f --- /dev/null +++ b/src/main/java/com/service/UserService.java @@ -0,0 +1,28 @@ +package com.service; + +// 导入必要的类和接口 +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; +import com.entity.UserEntity; +import com.utils.PageUtils; + + +/** + * 系统用户服务接口,定义了与用户相关的业务操作方法 + */ +public interface UserService extends IService { + + // 根据参数进行分页查询,返回封装的分页结果 + PageUtils queryPage(Map params); + + // 查询用户列表视图,返回符合条件的用户实体列表 + List selectListView(Wrapper wrapper); + + // 根据参数和条件进行分页查询,返回封装的分页结果 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/WeixiuchuliService.java b/src/main/java/com/service/WeixiuchuliService.java new file mode 100644 index 0000000..12098e7 --- /dev/null +++ b/src/main/java/com/service/WeixiuchuliService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 WeixiuchuliEntity,表示“维修处理”的数据库表结构 +import com.entity.WeixiuchuliEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.WeixiuchuliVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.WeixiuchuliView; + + +/** + * 维修处理 服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface WeixiuchuliService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“维修处理”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“维修处理”的视图对象(VO) + WeixiuchuliVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“维修处理”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“维修处理”的视图模型(View) + WeixiuchuliView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/WoyaodangfangzhuService.java b/src/main/java/com/service/WoyaodangfangzhuService.java new file mode 100644 index 0000000..3e35597 --- /dev/null +++ b/src/main/java/com/service/WoyaodangfangzhuService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入实体类 WoyaodangfangzhuEntity,表示“我要当房主”的数据库表结构 +import com.entity.WoyaodangfangzhuEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.WoyaodangfangzhuVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.WoyaodangfangzhuView; + + +/** + * 我要当房主 服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface WoyaodangfangzhuService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询“我要当房主”的视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个“我要当房主”的视图对象(VO) + WoyaodangfangzhuVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询“我要当房主”的视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个“我要当房主”的视图模型(View) + WoyaodangfangzhuView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/YonghuService.java b/src/main/java/com/service/YonghuService.java new file mode 100644 index 0000000..b28b78e --- /dev/null +++ b/src/main/java/com/service/YonghuService.java @@ -0,0 +1,47 @@ +package com.service; + +// 导入 MyBatis-Plus 的 Wrapper 和 IService 接口,用于构建查询条件和定义服务接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; + +// 导入分页工具类 PageUtils,用于封装分页结果 +import com.utils.PageUtils; + +// 导入用户实体类 YonghuEntity,表示用户的数据库表结构 +import com.entity.YonghuEntity; + +// 导入其他相关类,包括 VO(视图对象)、View(视图模型)等 +import java.util.List; +import java.util.Map; +import com.entity.vo.YonghuVO; +import org.apache.ibatis.annotations.Param; +import com.entity.view.YonghuView; + + +/** + * 用户服务接口 + * + * @author + * @email + * @date 2021-03-04 18:46:21 + */ +public interface YonghuService extends IService { + + // 根据参数进行分页查询 + PageUtils queryPage(Map params); + + // 查询用户视图对象列表(VO) + List selectListVO(Wrapper wrapper); + + // 根据条件查询单个用户视图对象(VO) + YonghuVO selectVO(@Param("ew") Wrapper wrapper); + + // 查询用户视图模型列表(View) + List selectListView(Wrapper wrapper); + + // 根据条件查询单个用户视图模型(View) + YonghuView selectView(@Param("ew") Wrapper wrapper); + + // 根据参数和条件进行分页查询 + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/YuyuekanfangService.java b/src/main/java/com/service/YuyuekanfangService.java new file mode 100644 index 0000000..531d11a --- /dev/null +++ b/src/main/java/com/service/YuyuekanfangService.java @@ -0,0 +1,71 @@ +package com.service; + +// 导入 MyBatis-Plus 相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.service.IService; +// 导入自定义的分页工具类 +import com.utils.PageUtils; +// 导入预约看房实体类 +import com.entity.YuyuekanfangEntity; +// 导入 List 和 Map 接口,用于存储数据 +import java.util.List; +import java.util.Map; +// 导入预约看房的 VO 类 +import com.entity.vo.YuyuekanfangVO; +// 导入 MyBatis 的 @Param 注解,用于参数命名 +import org.apache.ibatis.annotations.Param; +// 导入预约看房的视图类 +import com.entity.view.YuyuekanfangView; + +/** + * 预约看房服务接口 + * + * @author 作者名 + * @email 作者邮箱 + * @date 2021-03-04 18:46:21 + */ +public interface YuyuekanfangService extends IService { // 继承 MyBatis-Plus 的基础服务接口 + + /** + * 分页查询预约看房信息 + * @param params 查询参数 + * @return 返回分页结果 + */ + PageUtils queryPage(Map params); + + /** + * 根据条件查询预约看房的列表,并返回 VO 对象 + * @param wrapper 查询条件包装器 + * @return 返回预约看房的 VO 列表 + */ + List selectListVO(Wrapper wrapper); + + /** + * 根据条件查询单个预约看房的信息,并返回 VO 对象 + * @param wrapper 查询条件包装器 + * @return 返回预约看房的 VO 对象 + */ + YuyuekanfangVO selectVO(@Param("ew") Wrapper wrapper); + + /** + * 根据条件查询预约看房的列表,并返回视图对象 + * @param wrapper 查询条件包装器 + * @return 返回预约看房的视图列表 + */ + List selectListView(Wrapper wrapper); + + /** + * 根据条件查询单个预约看房的信息,并返回视图对象 + * @param wrapper 查询条件包装器 + * @return 返回预约看房的视图对象 + */ + YuyuekanfangView selectView(@Param("ew") Wrapper wrapper); + + /** + * 带条件的分页查询预约看房信息 + * @param params 查询参数 + * @param wrapper 查询条件包装器 + * @return 返回分页结果 + */ + PageUtils queryPage(Map params, Wrapper wrapper); +} diff --git a/src/main/java/com/service/impl/CommonServiceImpl.java b/src/main/java/com/service/impl/CommonServiceImpl.java new file mode 100644 index 0000000..4b1f417 --- /dev/null +++ b/src/main/java/com/service/impl/CommonServiceImpl.java @@ -0,0 +1,66 @@ +package com.service.impl; + +// 导入必要的 Java 类 +import java.util.List; +import java.util.Map; + +// 导入 Spring 的注解,用于自动装配和标识服务层组件 +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +// 导入项目中自定义的 DAO 和 Service 接口 +import com.dao.CommonDao; +import com.service.CommonService; + +/** + * 通用服务实现类,提供一些通用的功能方法 + */ +@Service("commonService") // 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "commonService" +public class CommonServiceImpl implements CommonService { + + // 自动装配 CommonDao,用于执行数据库操作 + @Autowired + private CommonDao commonDao; + + // 实现获取选项列表的方法,返回一个字符串列表 + @Override + public List getOption(Map params) { + return commonDao.getOption(params); // 调用 DAO 层方法获取选项列表 + } + + // 实现根据选项获取关联数据的方法,返回一个 Map 对象 + @Override + public Map getFollowByOption(Map params) { + return commonDao.getFollowByOption(params); // 调用 DAO 层方法获取关联数据 + } + + // 实现审核操作的方法,参数为一个 Map 对象 + @Override + public void sh(Map params) { + commonDao.sh(params); // 调用 DAO 层方法执行审核操作 + } + + // 实现提醒计数的方法,返回符合条件的记录数 + @Override + public int remindCount(Map params) { + return commonDao.remindCount(params); // 调用 DAO 层方法进行提醒计数 + } + + // 实现查询计算结果的方法,返回一个 Map 对象 + @Override + public Map selectCal(Map params) { + return commonDao.selectCal(params); // 调用 DAO 层方法查询计算结果 + } + + // 实现分组查询的方法,返回一个包含 Map 的列表 + @Override + public List> selectGroup(Map params) { + return commonDao.selectGroup(params); // 调用 DAO 层方法进行分组查询 + } + + // 实现查询值列表的方法,返回一个包含 Map 的列表 + @Override + public List> selectValue(Map params) { + return commonDao.selectValue(params); // 调用 DAO 层方法查询值列表 + } +} diff --git a/src/main/java/com/service/impl/ConfigServiceImpl.java b/src/main/java/com/service/impl/ConfigServiceImpl.java new file mode 100644 index 0000000..ad80304 --- /dev/null +++ b/src/main/java/com/service/impl/ConfigServiceImpl.java @@ -0,0 +1,39 @@ +package com.service.impl; + +// 导入必要的 Java 类 +import java.util.Map; + +// 导入 Spring 的 Service 注解,用于标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的 DAO、实体类、工具类等 +import com.dao.ConfigDao; +import com.entity.ConfigEntity; +import com.entity.UserEntity; +import com.service.ConfigService; +import com.utils.PageUtils; +import com.utils.Query; + +/** + * 系统配置服务实现类 + */ +@Service("configService") // 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "configService" +public class ConfigServiceImpl extends ServiceImpl implements ConfigService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } +} diff --git a/src/main/java/com/service/impl/DiscussfangwuxinxiServiceImpl.java b/src/main/java/com/service/impl/DiscussfangwuxinxiServiceImpl.java new file mode 100644 index 0000000..865283a --- /dev/null +++ b/src/main/java/com/service/impl/DiscussfangwuxinxiServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.DiscussfangwuxinxiDao; +import com.entity.DiscussfangwuxinxiEntity; +import com.service.DiscussfangwuxinxiService; +import com.entity.vo.DiscussfangwuxinxiVO; +import com.entity.view.DiscussfangwuxinxiView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "discussfangwuxinxiService" +@Service("discussfangwuxinxiService") +public class DiscussfangwuxinxiServiceImpl extends ServiceImpl implements DiscussfangwuxinxiService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public DiscussfangwuxinxiVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public DiscussfangwuxinxiView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/DiscusswoyaodangfangzhuServiceImpl.java b/src/main/java/com/service/impl/DiscusswoyaodangfangzhuServiceImpl.java new file mode 100644 index 0000000..40ccd34 --- /dev/null +++ b/src/main/java/com/service/impl/DiscusswoyaodangfangzhuServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.DiscusswoyaodangfangzhuDao; +import com.entity.DiscusswoyaodangfangzhuEntity; +import com.service.DiscusswoyaodangfangzhuService; +import com.entity.vo.DiscusswoyaodangfangzhuVO; +import com.entity.view.DiscusswoyaodangfangzhuView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "discusswoyaodangfangzhuService" +@Service("discusswoyaodangfangzhuService") +public class DiscusswoyaodangfangzhuServiceImpl extends ServiceImpl implements DiscusswoyaodangfangzhuService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public DiscusswoyaodangfangzhuVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public DiscusswoyaodangfangzhuView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/FangwubaoxiuServiceImpl.java b/src/main/java/com/service/impl/FangwubaoxiuServiceImpl.java new file mode 100644 index 0000000..89c880a --- /dev/null +++ b/src/main/java/com/service/impl/FangwubaoxiuServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.FangwubaoxiuDao; +import com.entity.FangwubaoxiuEntity; +import com.service.FangwubaoxiuService; +import com.entity.vo.FangwubaoxiuVO; +import com.entity.view.FangwubaoxiuView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "fangwubaoxiuService" +@Service("fangwubaoxiuService") +public class FangwubaoxiuServiceImpl extends ServiceImpl implements FangwubaoxiuService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public FangwubaoxiuVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public FangwubaoxiuView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/FangwuleixingServiceImpl.java b/src/main/java/com/service/impl/FangwuleixingServiceImpl.java new file mode 100644 index 0000000..a1fbef7 --- /dev/null +++ b/src/main/java/com/service/impl/FangwuleixingServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.FangwuleixingDao; +import com.entity.FangwuleixingEntity; +import com.service.FangwuleixingService; +import com.entity.vo.FangwuleixingVO; +import com.entity.view.FangwuleixingView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "fangwuleixingService" +@Service("fangwuleixingService") +public class FangwuleixingServiceImpl extends ServiceImpl implements FangwuleixingService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public FangwuleixingVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public FangwuleixingView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/FangwupingjiaServiceImpl.java b/src/main/java/com/service/impl/FangwupingjiaServiceImpl.java new file mode 100644 index 0000000..2ac6d8f --- /dev/null +++ b/src/main/java/com/service/impl/FangwupingjiaServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.FangwupingjiaDao; +import com.entity.FangwupingjiaEntity; +import com.service.FangwupingjiaService; +import com.entity.vo.FangwupingjiaVO; +import com.entity.view.FangwupingjiaView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "fangwupingjiaService" +@Service("fangwupingjiaService") +public class FangwupingjiaServiceImpl extends ServiceImpl implements FangwupingjiaService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public FangwupingjiaVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public FangwupingjiaView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/FangwuxinxiServiceImpl.java b/src/main/java/com/service/impl/FangwuxinxiServiceImpl.java new file mode 100644 index 0000000..7f0ce3d --- /dev/null +++ b/src/main/java/com/service/impl/FangwuxinxiServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.FangwuxinxiDao; +import com.entity.FangwuxinxiEntity; +import com.service.FangwuxinxiService; +import com.entity.vo.FangwuxinxiVO; +import com.entity.view.FangwuxinxiView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "fangwuxinxiService" +@Service("fangwuxinxiService") +public class FangwuxinxiServiceImpl extends ServiceImpl implements FangwuxinxiService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public FangwuxinxiVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public FangwuxinxiView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/FangzhuServiceImpl.java b/src/main/java/com/service/impl/FangzhuServiceImpl.java new file mode 100644 index 0000000..453c9f0 --- /dev/null +++ b/src/main/java/com/service/impl/FangzhuServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.FangzhuDao; +import com.entity.FangzhuEntity; +import com.service.FangzhuService; +import com.entity.vo.FangzhuVO; +import com.entity.view.FangzhuView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "fangzhuService" +@Service("fangzhuService") +public class FangzhuServiceImpl extends ServiceImpl implements FangzhuService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public FangzhuVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public FangzhuView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/HetongxinxiServiceImpl.java b/src/main/java/com/service/impl/HetongxinxiServiceImpl.java new file mode 100644 index 0000000..257ce6c --- /dev/null +++ b/src/main/java/com/service/impl/HetongxinxiServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.HetongxinxiDao; +import com.entity.HetongxinxiEntity; +import com.service.HetongxinxiService; +import com.entity.vo.HetongxinxiVO; +import com.entity.view.HetongxinxiView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "hetongxinxiService" +@Service("hetongxinxiService") +public class HetongxinxiServiceImpl extends ServiceImpl implements HetongxinxiService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public HetongxinxiVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public HetongxinxiView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/MessagesServiceImpl.java b/src/main/java/com/service/impl/MessagesServiceImpl.java new file mode 100644 index 0000000..9b1cb40 --- /dev/null +++ b/src/main/java/com/service/impl/MessagesServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.MessagesDao; +import com.entity.MessagesEntity; +import com.service.MessagesService; +import com.entity.vo.MessagesVO; +import com.entity.view.MessagesView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "messagesService" +@Service("messagesService") +public class MessagesServiceImpl extends ServiceImpl implements MessagesService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public MessagesVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public MessagesView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/NewsServiceImpl.java b/src/main/java/com/service/impl/NewsServiceImpl.java new file mode 100644 index 0000000..c949142 --- /dev/null +++ b/src/main/java/com/service/impl/NewsServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.NewsDao; +import com.entity.NewsEntity; +import com.service.NewsService; +import com.entity.vo.NewsVO; +import com.entity.view.NewsView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "newsService" +@Service("newsService") +public class NewsServiceImpl extends ServiceImpl implements NewsService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public NewsVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public NewsView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/StoreupServiceImpl.java b/src/main/java/com/service/impl/StoreupServiceImpl.java new file mode 100644 index 0000000..0f45892 --- /dev/null +++ b/src/main/java/com/service/impl/StoreupServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.StoreupDao; +import com.entity.StoreupEntity; +import com.service.StoreupService; +import com.entity.vo.StoreupVO; +import com.entity.view.StoreupView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "storeupService" +@Service("storeupService") +public class StoreupServiceImpl extends ServiceImpl implements StoreupService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public StoreupVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public StoreupView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/TokenServiceImpl.java b/src/main/java/com/service/impl/TokenServiceImpl.java new file mode 100644 index 0000000..a97594e --- /dev/null +++ b/src/main/java/com/service/impl/TokenServiceImpl.java @@ -0,0 +1,99 @@ +package com.service.impl; + +// 导入必要的 Java 类 +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; + +// 导入 Spring 的 Service 注解,用于标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的 DAO、实体类、工具类等 +import com.dao.TokenDao; +import com.entity.TokenEntity; +import com.service.TokenService; +import com.utils.CommonUtil; +import com.utils.PageUtils; +import com.utils.Query; + +/** + * Token 服务实现类 + */ +@Service("tokenService") // 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "tokenService" +public class TokenServiceImpl extends ServiceImpl implements TokenService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现查询 Token 列表视图的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回符合条件的 Token 列表视图 + return baseMapper.selectListView(wrapper); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现生成 Token 的方法 + @Override + public String generateToken(Long userid, String username, String tableName, String role) { + // 查询是否存在已有的 Token 记录 + TokenEntity tokenEntity = this.selectOne(new EntityWrapper().eq("userid", userid).eq("role", role)); + // 生成随机字符串作为新的 Token + String token = CommonUtil.getRandomString(32); + // 获取当前时间,并设置 Token 过期时间为 1 小时后 + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.add(Calendar.HOUR_OF_DAY, 1); + // 如果存在已有记录,则更新 Token 和过期时间 + if (tokenEntity != null) { + tokenEntity.setToken(token); + tokenEntity.setExpiratedtime(cal.getTime()); + this.updateById(tokenEntity); + } else { + // 如果不存在已有记录,则插入新的 Token 记录 + this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime())); + } + // 返回生成的 Token + return token; + } + + // 实现根据 Token 获取 Token 实体的方法 + @Override + public TokenEntity getTokenEntity(String token) { + // 查询与指定 Token 匹配的记录 + TokenEntity tokenEntity = this.selectOne(new EntityWrapper().eq("token", token)); + // 如果记录不存在或已过期,则返回 null + if (tokenEntity == null || tokenEntity.getExpiratedtime().getTime() < new Date().getTime()) { + return null; + } + // 返回有效的 Token 实体 + return tokenEntity; + } +} diff --git a/src/main/java/com/service/impl/UserServiceImpl.java b/src/main/java/com/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..c93695f --- /dev/null +++ b/src/main/java/com/service/impl/UserServiceImpl.java @@ -0,0 +1,59 @@ +package com.service.impl; + +// 导入必要的 Java 集合类 +import java.util.List; +import java.util.Map; + +// 导入 Spring 的 Service 注解,用于标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的 DAO、实体类、工具类等 +import com.dao.UserDao; +import com.entity.UserEntity; +import com.service.UserService; +import com.utils.PageUtils; +import com.utils.Query; + +/** + * 系统用户服务实现类 + */ +@Service("userService") // 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "userService" +public class UserServiceImpl extends ServiceImpl implements UserService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现查询用户列表视图的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回符合条件的用户列表视图 + return baseMapper.selectListView(wrapper); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } +} diff --git a/src/main/java/com/service/impl/WeixiuchuliServiceImpl.java b/src/main/java/com/service/impl/WeixiuchuliServiceImpl.java new file mode 100644 index 0000000..2fe8a33 --- /dev/null +++ b/src/main/java/com/service/impl/WeixiuchuliServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.WeixiuchuliDao; +import com.entity.WeixiuchuliEntity; +import com.service.WeixiuchuliService; +import com.entity.vo.WeixiuchuliVO; +import com.entity.view.WeixiuchuliView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "weixiuchuliService" +@Service("weixiuchuliService") +public class WeixiuchuliServiceImpl extends ServiceImpl implements WeixiuchuliService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public WeixiuchuliVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public WeixiuchuliView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/WoyaodangfangzhuServiceImpl.java b/src/main/java/com/service/impl/WoyaodangfangzhuServiceImpl.java new file mode 100644 index 0000000..dc6becd --- /dev/null +++ b/src/main/java/com/service/impl/WoyaodangfangzhuServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.WoyaodangfangzhuDao; +import com.entity.WoyaodangfangzhuEntity; +import com.service.WoyaodangfangzhuService; +import com.entity.vo.WoyaodangfangzhuVO; +import com.entity.view.WoyaodangfangzhuView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "woyaodangfangzhuService" +@Service("woyaodangfangzhuService") +public class WoyaodangfangzhuServiceImpl extends ServiceImpl implements WoyaodangfangzhuService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public WoyaodangfangzhuVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public WoyaodangfangzhuView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/YonghuServiceImpl.java b/src/main/java/com/service/impl/YonghuServiceImpl.java new file mode 100644 index 0000000..2fc1631 --- /dev/null +++ b/src/main/java/com/service/impl/YonghuServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入 Spring 的 Service 注解,标识该类为服务层组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 的相关类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.YonghuDao; +import com.entity.YonghuEntity; +import com.service.YonghuService; +import com.entity.vo.YonghuVO; +import com.entity.view.YonghuView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称为 "yonghuService" +@Service("yonghuService") +public class YonghuServiceImpl extends ServiceImpl implements YonghuService { + + // 实现分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回封装后的分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public YonghuVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public YonghuView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/service/impl/YuyuekanfangServiceImpl.java b/src/main/java/com/service/impl/YuyuekanfangServiceImpl.java new file mode 100644 index 0000000..037596b --- /dev/null +++ b/src/main/java/com/service/impl/YuyuekanfangServiceImpl.java @@ -0,0 +1,82 @@ +package com.service.impl; + +// 导入必要的注解,用于标识该类为 Spring 的服务组件 +import org.springframework.stereotype.Service; + +// 导入 Java 集合相关的类 +import java.util.Map; +import java.util.List; + +// 导入 MyBatis-Plus 相关的类和接口 +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +// 导入项目中自定义的工具类和分页工具类 +import com.utils.PageUtils; +import com.utils.Query; + +// 导入与当前服务相关的 DAO、实体类、VO 和 View 等 +import com.dao.YuyuekanfangDao; +import com.entity.YuyuekanfangEntity; +import com.service.YuyuekanfangService; +import com.entity.vo.YuyuekanfangVO; +import com.entity.view.YuyuekanfangView; + +// 使用 @Service 注解标识该类为 Spring 的服务组件,并指定 Bean 名称 +@Service("yuyuekanfangService") +public class YuyuekanfangServiceImpl extends ServiceImpl implements YuyuekanfangService { + + // 实现分页查询方法,根据参数返回分页结果 + @Override + public PageUtils queryPage(Map params) { + // 创建分页对象,并设置查询条件 + Page page = this.selectPage( + new Query(params).getPage(), // 根据参数生成分页对象 + new EntityWrapper() // 设置默认的查询条件包装器 + ); + // 返回封装后的分页结果 + return new PageUtils(page); + } + + // 实现带条件的分页查询方法,返回分页结果 + @Override + public PageUtils queryPage(Map params, Wrapper wrapper) { + // 创建分页对象 + Page page = new Query(params).getPage(); + // 设置查询结果数据,并调用 DAO 层的自定义查询方法 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 封装并返回分页结果 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 实现查询视图对象列表的方法 + @Override + public List selectListVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图对象列表 + return baseMapper.selectListVO(wrapper); + } + + // 实现查询单个视图对象的方法 + @Override + public YuyuekanfangVO selectVO(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图对象 + return baseMapper.selectVO(wrapper); + } + + // 实现查询视图模型列表的方法 + @Override + public List selectListView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回视图模型列表 + return baseMapper.selectListView(wrapper); + } + + // 实现查询单个视图模型的方法 + @Override + public YuyuekanfangView selectView(Wrapper wrapper) { + // 调用 DAO 层的自定义方法,返回单个视图模型 + return baseMapper.selectView(wrapper); + } +} diff --git a/src/main/java/com/utils/BaiduUtil.java b/src/main/java/com/utils/BaiduUtil.java new file mode 100644 index 0000000..13cb473 --- /dev/null +++ b/src/main/java/com/utils/BaiduUtil.java @@ -0,0 +1,114 @@ +package com.utils; + +// 导入必要的 Java I/O 和网络相关类 +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// 导入 JSON 解析库 +import org.json.JSONObject; + +/** + * 百度地图工具类,提供与百度地图 API 相关的功能方法 + */ +public class BaiduUtil { + + /** + * 根据经纬度获取省市区信息 + * @param key 百度地图 API 的访问密钥 + * @param lng 经度 + * @param lat 纬度 + * @return 返回包含省市区信息的 Map 对象 + */ + public static Map getCityByLonLat(String key, String lng, String lat) { + // 将纬度和经度拼接为 location 参数 + String location = lat + "," + lng; + try { + // 拼装请求 URL + String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=" + key + "&output=json&coordtype=wgs84ll&location=" + location; + // 发送 GET 请求并获取返回结果 + String result = HttpClientUtils.doGet(url); + // 将返回结果解析为 JSONObject + JSONObject o = new JSONObject(result); + // 创建一个 Map 用于存储省市区信息 + Map area = new HashMap<>(); + // 提取省信息 + area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province")); + // 提取市信息 + area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city")); + // 提取区信息 + area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district")); + // 提取街道信息 + area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street")); + // 返回包含省市区信息的 Map + return area; + } catch (Exception e) { + // 打印异常堆栈信息 + e.printStackTrace(); + } + // 如果发生异常,返回 null + return null; + } + + /** + * 获取百度 API 访问 token + * @param ak 百度云官网获取的 API Key + * @param sk 百度云官网获取的 Securet Key + * @return 返回访问 token + */ + public static String getAuth(String ak, String sk) { + // 定义获取 token 的基础 URL + String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; + // 拼装完整的获取 token 的 URL + String getAccessTokenUrl = authHost + // grant_type 为固定参数,表示授权类型 + + "grant_type=client_credentials" + // client_id 为 API Key + + "&client_id=" + ak + // client_secret 为 Securet Key + + "&client_secret=" + sk; + try { + // 根据 URL 创建对象 + URL realUrl = new URL(getAccessTokenUrl); + // 打开与 URL 的连接 + HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); + // 设置请求方法为 GET + connection.setRequestMethod("GET"); + // 建立连接 + connection.connect(); + // 获取所有响应头字段 + Map> map = connection.getHeaderFields(); + // 遍历所有响应头字段并打印 + for (String key : map.keySet()) { + System.err.println(key + "--->" + map.get(key)); + } + // 使用 BufferedReader 读取 URL 的响应内容 + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String result = ""; + String line; + // 循环读取每一行响应内容 + while ((line = in.readLine()) != null) { + result += line; + } + // 打印完整的响应内容 + System.err.println("result:" + result); + // 将响应内容解析为 JSONObject + JSONObject jsonObject = new JSONObject(result); + // 提取 access_token 字段值 + String access_token = jsonObject.getString("access_token"); + // 返回 access_token + return access_token; + } catch (Exception e) { + // 打印错误信息 + System.err.printf("获取token失败!"); + // 打印异常堆栈信息 + e.printStackTrace(System.err); + } + // 如果发生异常,返回 null + return null; + } +} diff --git a/src/main/java/com/utils/CommonUtil.java b/src/main/java/com/utils/CommonUtil.java new file mode 100644 index 0000000..bdf4085 --- /dev/null +++ b/src/main/java/com/utils/CommonUtil.java @@ -0,0 +1,32 @@ +package com.utils; + +// 导入 Random 类,用于生成随机数 +import java.util.Random; + +public class CommonUtil { + + /** + * 获取指定长度的随机字符串 + * @param num 指定生成的随机字符串长度 + * @return 返回生成的随机字符串 + */ + public static String getRandomString(Integer num) { + // 定义随机字符的基础字符集,包含小写字母和数字 + String base = "abcdefghijklmnopqrstuvwxyz0123456789"; + // 创建 Random 对象,用于生成随机数 + Random random = new Random(); + // 创建 StringBuffer 对象,用于拼接生成的随机字符 + StringBuffer sb = new StringBuffer(); + + // 循环生成指定数量的随机字符 + for (int i = 0; i < num; i++) { + // 在基础字符集中随机选取一个字符的位置 + int number = random.nextInt(base.length()); + // 将选中的字符添加到 StringBuffer 中 + sb.append(base.charAt(number)); + } + + // 将生成的随机字符串返回 + return sb.toString(); + } +} diff --git a/src/main/java/com/utils/FileUtil.java b/src/main/java/com/utils/FileUtil.java new file mode 100644 index 0000000..d7e2584 --- /dev/null +++ b/src/main/java/com/utils/FileUtil.java @@ -0,0 +1,38 @@ +package com.utils; + +// 导入必要的 Java I/O 类 +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * 文件工具类,提供文件相关操作方法 + */ +public class FileUtil { + + /** + * 将文件转换为字节数组 + * @param file 要转换的文件对象 + * @return 返回文件的字节数组 + * @throws IOException 如果读取文件时发生异常,则抛出此异常 + */ + public static byte[] FileToByte(File file) throws IOException { + // 将文件内容转为输入流 + @SuppressWarnings("resource") // 抑制资源未关闭的警告(此处会在 while 循环中处理流的关闭) + InputStream content = new FileInputStream(file); // 创建文件输入流 + + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); // 创建字节输出流,用于存储文件内容 + byte[] buff = new byte[100]; // 定义一个 100 字节大小的缓冲区,用于读取文件内容 + int rc = 0; // 定义变量 rc,用于存储每次从文件中读取的字节数 + + // 循环读取文件内容,直到读取完毕 + while ((rc = content.read(buff, 0, 100)) > 0) { // 每次从文件中读取最多 100 字节到缓冲区 + swapStream.write(buff, 0, rc); // 将读取到的内容写入字节输出流 + } + + // 将字节输出流中的数据转换为字节数组并返回 + return swapStream.toByteArray(); + } +} diff --git a/src/main/java/com/utils/HttpClientUtils.java b/src/main/java/com/utils/HttpClientUtils.java new file mode 100644 index 0000000..2aefbd3 --- /dev/null +++ b/src/main/java/com/utils/HttpClientUtils.java @@ -0,0 +1,48 @@ +package com.utils; + +// 导入必要的 Java I/O 和网络相关类 +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * HttpClient工具类,用于发送 HTTP 请求 + */ +public class HttpClientUtils { + + /** + * 发送 GET 请求的方法 + * @param uri 请求的 URL 地址 + * @return 返回请求的结果字符串 + * @description get请求方式 + * @author: long.he01 + */ + public static String doGet(String uri) { + // 用于存储返回结果的字符串构建器 + StringBuilder result = new StringBuilder(); + try { + // 定义一个临时变量,用于拼接读取到的每一行数据 + String res = ""; + // 根据传入的 URI 创建 URL 对象 + URL url = new URL(uri); + // 打开连接并转换为 HttpURLConnection 类型 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + // 使用 BufferedReader 读取连接的输入流,指定字符编码为 UTF-8 + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + // 定义一行数据的临时变量 + String line; + // 循环读取输入流中的每一行数据,直到读取完毕 + while ((line = in.readLine()) != null) { + res += line + "\n"; // 将每一行数据拼接到结果中,并添加换行符 + } + // 关闭输入流 + in.close(); + // 返回最终的请求结果 + return res; + } catch (Exception e) { // 捕获异常 + e.printStackTrace(); // 打印异常堆栈信息 + return null; // 如果发生异常,返回 null + } + } +} diff --git a/src/main/java/com/utils/JQPageInfo.java b/src/main/java/com/utils/JQPageInfo.java new file mode 100644 index 0000000..06d0fba --- /dev/null +++ b/src/main/java/com/utils/JQPageInfo.java @@ -0,0 +1,100 @@ +package com.utils; + +// 定义分页信息类,用于封装前端传递的分页参数 +public class JQPageInfo { + + // 当前页码 + private Integer page; + + // 每页显示的记录数 + private Integer limit; + + // 排序字段 + private String sidx; + + // 排序方式(升序或降序) + private String order; + + // 分页偏移量 + private Integer offset; + + /** + * 获取当前页码 + * @return 当前页码 + */ + public Integer getPage() { + return page; + } + + /** + * 设置当前页码 + * @param page 当前页码 + */ + public void setPage(Integer page) { + this.page = page; + } + + /** + * 获取每页显示的记录数 + * @return 每页显示的记录数 + */ + public Integer getLimit() { + return limit; + } + + /** + * 设置每页显示的记录数 + * @param limit 每页显示的记录数 + */ + public void setLimit(Integer limit) { + this.limit = limit; + } + + /** + * 获取排序字段 + * @return 排序字段 + */ + public String getSidx() { + return sidx; + } + + /** + * 设置排序字段 + * @param sidx 排序字段 + */ + public void setSidx(String sidx) { + this.sidx = sidx; + } + + /** + * 获取排序方式(升序或降序) + * @return 排序方式 + */ + public String getOrder() { + return order; + } + + /** + * 设置排序方式(升序或降序) + * @param order 排序方式 + */ + public void setOrder(String order) { + this.order = order; + } + + /** + * 获取分页偏移量 + * @return 分页偏移量 + */ + public Integer getOffset() { + return offset; + } + + /** + * 设置分页偏移量 + * @param offset 分页偏移量 + */ + public void setOffset(Integer offset) { + this.offset = offset; + } +} diff --git a/src/main/java/com/utils/MD5Util.java b/src/main/java/com/utils/MD5Util.java new file mode 100644 index 0000000..4a0ee75 --- /dev/null +++ b/src/main/java/com/utils/MD5Util.java @@ -0,0 +1,19 @@ +package com.utils; + +// 导入 Hutool 工具库中的 DigestUtil 类,用于实现 MD5 加密功能 +import cn.hutool.crypto.digest.DigestUtil; + +public class MD5Util { + + /** + * MD5 加密方法 + * @param text 明文字符串 + * @return 返回加密后的密文字符串 + */ + // 带秘钥加密(此处方法名与注释略有不符,实际并未使用秘钥进行加密) + public static String md5(String text) { + // 使用 Hutool 的 DigestUtil.md5Hex 方法对明文进行 MD5 加密,并返回十六进制表示的加密结果 + String md5str = DigestUtil.md5Hex(text); + return md5str; // 返回加密后的字符串 + } +} diff --git a/src/main/java/com/utils/MPUtil.java b/src/main/java/com/utils/MPUtil.java new file mode 100644 index 0000000..003544c --- /dev/null +++ b/src/main/java/com/utils/MPUtil.java @@ -0,0 +1,193 @@ +package com.utils; + +// 导入必要的 Java 类 +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +// 导入 Apache Commons Lang 工具类,用于字符串操作 +import org.apache.commons.lang3.StringUtils; + +// 导入 Hutool 工具类,用于 Bean 操作 +import cn.hutool.core.bean.BeanUtil; + +// 导入 MyBatis-Plus 的 Wrapper 接口 +import com.baomidou.mybatisplus.mapper.Wrapper; + +/** + * Mybatis-Plus工具类 + */ +public class MPUtil { + public static final char UNDERLINE = '_'; // 定义下划线常量 + + // mybatis plus allEQ 表达式转换,带前缀 + public static Map allEQMapPre(Object bean, String pre) { + Map map = BeanUtil.beanToMap(bean); // 将 Bean 转换为 Map + return camelToUnderlineMap(map, pre); // 将驼峰格式键名转换为下划线格式,并添加前缀 + } + + // mybatis plus allEQ 表达式转换,不带前缀 + public static Map allEQMap(Object bean) { + Map map = BeanUtil.beanToMap(bean); // 将 Bean 转换为 Map + return camelToUnderlineMap(map, ""); // 将驼峰格式键名转换为下划线格式 + } + + // mybatis plus allLike 表达式转换,带前缀 + public static Wrapper allLikePre(Wrapper wrapper, Object bean, String pre) { + Map map = BeanUtil.beanToMap(bean); // 将 Bean 转换为 Map + Map result = camelToUnderlineMap(map, pre); // 将驼峰格式键名转换为下划线格式,并添加前缀 + return genLike(wrapper, result); // 生成 like 查询条件 + } + + // mybatis plus allLike 表达式转换,不带前缀 + public static Wrapper allLike(Wrapper wrapper, Object bean) { + Map result = BeanUtil.beanToMap(bean, true, true); // 将 Bean 转换为 Map + return genLike(wrapper, result); // 生成 like 查询条件 + } + + // 生成 like 查询条件 + public static Wrapper genLike(Wrapper wrapper, Map param) { + Iterator> it = param.entrySet().iterator(); // 获取 Map 迭代器 + int i = 0; + while (it.hasNext()) { + if (i > 0) + wrapper.and(); // 添加 and 条件 + Map.Entry entry = it.next(); // 获取下一个键值对 + String key = entry.getKey(); // 获取键 + String value = (String) entry.getValue(); // 获取值 + wrapper.like(key, value); // 添加 like 查询条件 + i++; + } + return wrapper; // 返回 Wrapper 对象 + } + + // mybatis plus likeOrEq 表达式转换,不带前缀 + public static Wrapper likeOrEq(Wrapper wrapper, Object bean) { + Map result = BeanUtil.beanToMap(bean, true, true); // 将 Bean 转换为 Map + return genLikeOrEq(wrapper, result); // 生成 like 或 eq 查询条件 + } + + // 生成 like 或 eq 查询条件 + public static Wrapper genLikeOrEq(Wrapper wrapper, Map param) { + Iterator> it = param.entrySet().iterator(); // 获取 Map 迭代器 + int i = 0; + while (it.hasNext()) { + if (i > 0) + wrapper.and(); // 添加 and 条件 + Map.Entry entry = it.next(); // 获取下一个键值对 + String key = entry.getKey(); // 获取键 + if (entry.getValue().toString().contains("%")) { + wrapper.like(key, entry.getValue().toString().replace("%", "")); // 添加 like 查询条件 + } else { + wrapper.eq(key, entry.getValue()); // 添加 eq 查询条件 + } + i++; + } + return wrapper; // 返回 Wrapper 对象 + } + + // mybatis plus allEq 表达式转换,不带前缀 + public static Wrapper allEq(Wrapper wrapper, Object bean) { + Map result = BeanUtil.beanToMap(bean, true, true); // 将 Bean 转换为 Map + return genEq(wrapper, result); // 生成 eq 查询条件 + } + + // 生成 eq 查询条件 + public static Wrapper genEq(Wrapper wrapper, Map param) { + Iterator> it = param.entrySet().iterator(); // 获取 Map 迭代器 + int i = 0; + while (it.hasNext()) { + if (i > 0) + wrapper.and(); // 添加 and 条件 + Map.Entry entry = it.next(); // 获取下一个键值对 + String key = entry.getKey(); // 获取键 + wrapper.eq(key, entry.getValue()); // 添加 eq 查询条件 + i++; + } + return wrapper; // 返回 Wrapper 对象 + } + + // 生成 between 查询条件 + public static Wrapper between(Wrapper wrapper, Map params) { + for (String key : params.keySet()) { // 遍历 Map 的键 + String columnName = ""; + if (key.endsWith("_start")) { + columnName = key.substring(0, key.indexOf("_start")); // 获取列名 + if (StringUtils.isNotBlank(params.get(key).toString())) { + wrapper.ge(columnName, params.get(key)); // 添加大于等于查询条件 + } + } + if (key.endsWith("_end")) { + columnName = key.substring(0, key.indexOf("_end")); // 获取列名 + if (StringUtils.isNotBlank(params.get(key).toString())) { + wrapper.le(columnName, params.get(key)); // 添加小于等于查询条件 + } + } + } + return wrapper; // 返回 Wrapper 对象 + } + + // 生成排序查询条件 + public static Wrapper sort(Wrapper wrapper, Map params) { + String order = ""; + if (params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) { + order = params.get("order").toString(); // 获取排序方式 + } + if (params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) { + if (order.equalsIgnoreCase("desc")) { + wrapper.orderDesc(Arrays.asList(params.get("sort"))); // 添加降序排序 + } else { + wrapper.orderAsc(Arrays.asList(params.get("sort"))); // 添加升序排序 + } + } + return wrapper; // 返回 Wrapper 对象 + } + + /** + * 驼峰格式字符串转换为下划线格式字符串 + * + * @param param 驼峰格式字符串 + * @return 下划线格式字符串 + */ + public static String camelToUnderline(String param) { + if (param == null || "".equals(param.trim())) { + return ""; // 如果字符串为空,返回空字符串 + } + int len = param.length(); + StringBuilder sb = new StringBuilder(len); // 创建 StringBuilder 对象 + for (int i = 0; i < len; i++) { + char c = param.charAt(i); // 获取字符 + if (Character.isUpperCase(c)) { + sb.append(UNDERLINE); // 添加下划线 + sb.append(Character.toLowerCase(c)); // 添加小写字符 + } else { + sb.append(c); // 添加字符 + } + } + return sb.toString(); // 返回下划线格式字符串 + } + + public static void main(String[] ages) { + System.out.println(camelToUnderline("ABCddfANM")); // 测试 camelToUnderline 方法 + } + + // 将 Map 中的驼峰格式键名转换为下划线格式,并添加前缀 + public static Map camelToUnderlineMap(Map param, String pre) { + Map newMap = new HashMap(); // 创建新的 Map 对象 + Iterator> it = param.entrySet().iterator(); // 获取 Map 迭代器 + while (it.hasNext()) { + Map.Entry entry = it.next(); // 获取下一个键值对 + String key = entry.getKey(); // 获取键 + String newKey = camelToUnderline(key); // 将驼峰格式键名转换为下划线格式 + if (pre.endsWith(".")) { + newMap.put(pre + newKey, entry.getValue()); // 添加键值对,带前缀和点 + } else if (StringUtils.isEmpty(pre)) { + newMap.put(newKey, entry.getValue()); // 添加键值对,不带前缀 + } else { + newMap.put(pre + "." + newKey, entry.getValue()); // 添加键值对,带前缀和点 + } + } + return newMap; // 返回新的 Map 对象 + } +} diff --git a/src/main/java/com/utils/PageUtils.java b/src/main/java/com/utils/PageUtils.java new file mode 100644 index 0000000..ce8d249 --- /dev/null +++ b/src/main/java/com/utils/PageUtils.java @@ -0,0 +1,116 @@ +package com.utils; + +// 导入必要的 Java 类 +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +// 导入 MyBatis-Plus 的分页类 +import com.baomidou.mybatisplus.plugins.Page; + +/** + * 分页工具类 + */ +public class PageUtils implements Serializable { // 实现 Serializable 接口,支持序列化 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 总记录数 + private long total; + + // 每页记录数 + private int pageSize; + + // 总页数 + private long totalPage; + + // 当前页数 + private int currPage; + + // 列表数据 + private List list; + + /** + * 分页构造方法 + * @param list 列表数据 + * @param totalCount 总记录数 + * @param pageSize 每页记录数 + * @param currPage 当前页数 + */ + public PageUtils(List list, int totalCount, int pageSize, int currPage) { + this.list = list; // 设置列表数据 + this.total = totalCount; // 设置总记录数 + this.pageSize = pageSize; // 设置每页记录数 + this.currPage = currPage; // 设置当前页数 + this.totalPage = (int)Math.ceil((double)totalCount/pageSize); // 计算总页数 + } + + /** + * 分页构造方法 + * @param page MyBatis-Plus 的 Page 对象 + */ + public PageUtils(Page page) { + this.list = page.getRecords(); // 设置列表数据 + this.total = page.getTotal(); // 设置总记录数 + this.pageSize = page.getSize(); // 设置每页记录数 + this.currPage = page.getCurrent(); // 设置当前页数 + this.totalPage = page.getPages(); // 设置总页数 + } + + /* + * 空数据的分页构造方法 + */ + public PageUtils(Map params) { + Page page = new Query(params).getPage(); // 创建分页对象 + new PageUtils(page); // 调用另一个构造方法 + } + + // 获取每页记录数 + public int getPageSize() { + return pageSize; + } + + // 设置每页记录数 + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + // 获取当前页数 + public int getCurrPage() { + return currPage; + } + + // 设置当前页数 + public void setCurrPage(int currPage) { + this.currPage = currPage; + } + + // 获取列表数据 + public List getList() { + return list; + } + + // 设置列表数据 + public void setList(List list) { + this.list = list; + } + + // 获取总页数 + public long getTotalPage() { + return totalPage; + } + + // 设置总页数 + public void setTotalPage(long totalPage) { + this.totalPage = totalPage; + } + + // 获取总记录数 + public long getTotal() { + return total; + } + + // 设置总记录数 + public void setTotal(long total) { + this.total = total; + } +} diff --git a/src/main/java/com/utils/Query.java b/src/main/java/com/utils/Query.java new file mode 100644 index 0000000..d09efc3 --- /dev/null +++ b/src/main/java/com/utils/Query.java @@ -0,0 +1,98 @@ +package com.utils; + +// 导入必要的 Java 类 +import java.util.LinkedHashMap; +import java.util.Map; + +// 导入 Apache Commons Lang 工具类,用于字符串操作 +import org.apache.commons.lang3.StringUtils; + +// 导入 MyBatis-Plus 的分页类 +import com.baomidou.mybatisplus.plugins.Page; + +/** + * 查询参数工具类,用于封装查询条件和分页信息 + */ +public class Query extends LinkedHashMap { // 继承 LinkedHashMap,用于存储键值对形式的查询参数 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // mybatis-plus 分页参数 + private Page page; + + // 当前页码,默认为 1 + private int currPage = 1; + + // 每页条数,默认为 10 + private int limit = 10; + + // 构造方法,通过 JQPageInfo 对象初始化分页参数 + public Query(JQPageInfo pageInfo) { + // 分页参数 + if(pageInfo.getPage() != null){ + currPage = pageInfo.getPage(); // 设置当前页码 + } + if(pageInfo.getLimit() != null){ + limit = pageInfo.getLimit(); // 设置每页条数 + } + + // 防止 SQL 注入(因为 sidx、order 是通过拼接 SQL 实现排序的,会有 SQL 注入风险) + String sidx = SQLFilter.sqlInject(pageInfo.getSidx()); // 过滤 sidx 参数 + String order = SQLFilter.sqlInject(pageInfo.getOrder()); // 过滤 order 参数 + + // mybatis-plus 分页 + this.page = new Page<>(currPage, limit); // 创建分页对象 + + // 排序 + if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)){ + this.page.setOrderByField(sidx); // 设置排序字段 + this.page.setAsc("ASC".equalsIgnoreCase(order)); // 设置排序顺序 + } + } + + // 构造方法,通过 Map 对象初始化查询参数 + public Query(Map params){ + this.putAll(params); // 将 Map 中的所有键值对添加到当前对象中 + + // 分页参数 + if(params.get("page") != null){ + currPage = Integer.parseInt((String)params.get("page")); // 设置当前页码 + } + if(params.get("limit") != null){ + limit = Integer.parseInt((String)params.get("limit")); // 设置每页条数 + } + + this.put("offset", (currPage - 1) * limit); // 计算并设置偏移量 + this.put("page", currPage); // 设置当前页码 + this.put("limit", limit); // 设置每页条数 + + // 防止 SQL 注入(因为 sidx、order 是通过拼接 SQL 实现排序的,会有 SQL 注入风险) + String sidx = SQLFilter.sqlInject((String)params.get("sidx")); // 过滤 sidx 参数 + String order = SQLFilter.sqlInject((String)params.get("order")); // 过滤 order 参数 + this.put("sidx", sidx); // 设置排序字段 + this.put("order", order); // 设置排序顺序 + + // mybatis-plus 分页 + this.page = new Page<>(currPage, limit); // 创建分页对象 + + // 排序 + if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)){ + this.page.setOrderByField(sidx); // 设置排序字段 + this.page.setAsc("ASC".equalsIgnoreCase(order)); // 设置排序顺序 + } + } + + // 获取分页对象 + public Page getPage() { + return page; + } + + // 获取当前页码 + public int getCurrPage() { + return currPage; + } + + // 获取每页条数 + public int getLimit() { + return limit; + } +} diff --git a/src/main/java/com/utils/R.java b/src/main/java/com/utils/R.java new file mode 100644 index 0000000..8d1ccd6 --- /dev/null +++ b/src/main/java/com/utils/R.java @@ -0,0 +1,60 @@ +package com.utils; + +// 导入必要的 Java 类 +import java.util.HashMap; +import java.util.Map; + +/** + * 返回数据工具类,用于封装接口返回结果 + */ +public class R extends HashMap { // 继承 HashMap,用于存储键值对形式的返回数据 + private static final long serialVersionUID = 1L; // 定义序列化版本号 + + // 构造方法,初始化时默认设置 code 为 0(表示成功) + public R() { + put("code", 0); // 默认添加 "code" 键,值为 0 + } + + // 静态方法,返回一个表示错误的 R 对象,默认状态码为 500,消息为 "未知异常,请联系管理员" + public static R error() { + return error(500, "未知异常,请联系管理员"); // 调用重载的 error 方法 + } + + // 静态方法,返回一个表示错误的 R 对象,状态码为 500,自定义错误消息 + public static R error(String msg) { + return error(500, msg); // 调用重载的 error 方法 + } + + // 静态方法,返回一个表示错误的 R 对象,支持自定义状态码和错误消息 + public static R error(int code, String msg) { + R r = new R(); // 创建一个新的 R 对象 + r.put("code", code); // 设置状态码 + r.put("msg", msg); // 设置错误消息 + return r; // 返回封装后的 R 对象 + } + + // 静态方法,返回一个表示成功的 R 对象,支持自定义成功消息 + public static R ok(String msg) { + R r = new R(); // 创建一个新的 R 对象 + r.put("msg", msg); // 设置成功消息 + return r; // 返回封装后的 R 对象 + } + + // 静态方法,返回一个表示成功的 R 对象,支持传入 Map 数据 + public static R ok(Map map) { + R r = new R(); // 创建一个新的 R 对象 + r.putAll(map); // 将 Map 中的所有键值对添加到 R 对象中 + return r; // 返回封装后的 R 对象 + } + + // 静态方法,返回一个表示成功的 R 对象,无额外参数 + public static R ok() { + return new R(); // 返回一个新的 R 对象 + } + + // 重写 put 方法,支持链式调用 + public R put(String key, Object value) { + super.put(key, value); // 调用父类的 put 方法 + return this; // 返回当前对象,支持链式调用 + } +} diff --git a/src/main/java/com/utils/SQLFilter.java b/src/main/java/com/utils/SQLFilter.java new file mode 100644 index 0000000..ff08f4a --- /dev/null +++ b/src/main/java/com/utils/SQLFilter.java @@ -0,0 +1,48 @@ +package com.utils; + +// 导入 Apache Commons Lang3 工具类,用于字符串操作 +import org.apache.commons.lang3.StringUtils; + +// 导入自定义异常类 EIException,用于处理非法字符的情况 +import com.entity.EIException; + +/** + * SQL过滤工具类 + */ +public class SQLFilter { + + /** + * SQL注入过滤方法 + * @param str 待验证的字符串 + * @return 过滤后的字符串 + */ + public static String sqlInject(String str) { + // 如果字符串为空或仅包含空白字符,返回 null + if (StringUtils.isBlank(str)) { + return null; + } + + // 去掉字符串中的 '、"、;、\ 等特殊字符 + str = StringUtils.replace(str, "'", ""); // 去掉单引号 ' + str = StringUtils.replace(str, "\"", ""); // 去掉双引号 " + str = StringUtils.replace(str, ";", ""); // 去掉分号 ; + str = StringUtils.replace(str, "\\", ""); // 去掉反斜杠 \ + + // 将字符串转换为小写,便于后续关键字匹配 + str = str.toLowerCase(); + + // 定义非法 SQL 关键字数组 + String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"}; + + // 遍历非法关键字数组,判断字符串中是否包含非法字符 + for (String keyword : keywords) { + // 如果字符串中包含任意非法关键字,抛出异常 + if (str.indexOf(keyword) != -1) { + throw new EIException("包含非法字符"); + } + } + + // 返回过滤后的字符串 + return str; + } +} diff --git a/src/main/java/com/utils/SpringContextUtils.java b/src/main/java/com/utils/SpringContextUtils.java new file mode 100644 index 0000000..edfc79f --- /dev/null +++ b/src/main/java/com/utils/SpringContextUtils.java @@ -0,0 +1,52 @@ +package com.utils; + +// 导入 Spring 框架中用于处理 Beans 的异常类 +import org.springframework.beans.BeansException; +// 导入 Spring 框架中的 ApplicationContext 接口,用于获取 Bean 容器 +import org.springframework.context.ApplicationContext; +// 导入 Spring 框架中的 ApplicationContextAware 接口,用于设置 ApplicationContext +import org.springframework.context.ApplicationContextAware; +// 导入 Spring 的组件注解,将该工具类注册为 Spring 容器中的一个 Bean +import org.springframework.stereotype.Component; + + +/** + * Spring Context 工具类,用于获取 Spring 容器中的 Bean 实例及相关信息 + */ +@Component // 将该类标记为 Spring 的组件,使其被 Spring 容器管理 +public class SpringContextUtils implements ApplicationContextAware { // 实现 ApplicationContextAware 接口,获取 ApplicationContext + + public static ApplicationContext applicationContext; // 定义静态变量,存储 Spring 的 ApplicationContext 实例 + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + // 重写 setApplicationContext 方法,设置静态变量 applicationContext 的值 + SpringContextUtils.applicationContext = applicationContext; + } + + public static Object getBean(String name) { + // 根据 Bean 名称从 Spring 容器中获取对应的 Bean 实例 + return applicationContext.getBean(name); + } + + public static T getBean(String name, Class requiredType) { + // 根据 Bean 名称和类型从 Spring 容器中获取对应的 Bean 实例 + return applicationContext.getBean(name, requiredType); + } + + public static boolean containsBean(String name) { + // 判断 Spring 容器中是否存在指定名称的 Bean + return applicationContext.containsBean(name); + } + + public static boolean isSingleton(String name) { + // 判断指定名称的 Bean 是否为单例模式 + return applicationContext.isSingleton(name); + } + + public static Class getType(String name) { + // 获取指定名称 Bean 的类型 + return applicationContext.getType(name); + } + +} diff --git a/src/main/java/com/utils/ValidatorUtils.java b/src/main/java/com/utils/ValidatorUtils.java new file mode 100644 index 0000000..3804d1e --- /dev/null +++ b/src/main/java/com/utils/ValidatorUtils.java @@ -0,0 +1,45 @@ +package com.utils; + +// 导入 Set 集合接口,用于存储校验结果 +import java.util.Set; + +// 导入 Hibernate Validator 相关类,用于进行对象校验 +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +// 导入自定义异常类 EIException,用于处理校验失败的情况 +import com.entity.EIException; + +/** + * hibernate-validator 校验工具类 + */ +public class ValidatorUtils { + // 定义一个静态的 Validator 对象,用于执行校验操作 + private static Validator validator; + + // 静态代码块,在类加载时初始化 Validator 对象 + static { + // 使用默认的校验器工厂创建并获取 Validator 实例 + validator = Validation.buildDefaultValidatorFactory().getValidator(); + } + + /** + * 校验对象 + * @param object 待校验对象 + * @param groups 待校验的组 + * @throws EIException 校验不通过,则报 EIException 异常 + */ + public static void validateEntity(Object object, Class... groups) + throws EIException { + // 调用 Validator 的 validate 方法对对象进行校验,并返回校验结果集 + Set> constraintViolations = validator.validate(object, groups); + // 如果校验结果集不为空,表示存在校验错误 + if (!constraintViolations.isEmpty()) { + // 获取第一个校验错误信息 + ConstraintViolation constraint = (ConstraintViolation)constraintViolations.iterator().next(); + // 抛出包含错误信息的 EIException 异常 + throw new EIException(constraint.getMessage()); + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..347987e --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,46 @@ +# Tomcat +server: + tomcat: + uri-encoding: UTF-8 + port: 8080 + servlet: + context-path: /springboot08hr3 + +spring: + datasource: + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/springboot08hr3?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC + username: root + password: 123456 + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB + resources: + static-locations: classpath:static/,file:static/ + +#mybatis +mybatis-plus: + mapper-locations: classpath*:mapper/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.entity + global-config: + #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; + id-type: 1 + #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" + field-strategy: 2 + #驼峰下划线转换 + db-column-underline: true + #刷新mapper 调试神器 + refresh-mapper: true + #逻辑删除配置 + logic-delete-value: -1 + logic-not-delete-value: 0 + #自定义SQL注入器 + sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + #springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other) + jdbc-type-for-null: 'null' diff --git a/src/main/resources/front/front/css/bootstrap.min.css b/src/main/resources/front/front/css/bootstrap.min.css new file mode 100644 index 0000000..8348a25 --- /dev/null +++ b/src/main/resources/front/front/css/bootstrap.min.css @@ -0,0 +1,13 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1200px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media(min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media(min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media(min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media(min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media(max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::after,.was-validated .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::after,.was-validated .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media(min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0;flex:1 0 0;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media(min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0;flex:1 0 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media(min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports((-webkit-transform-style:preserve-3d) or(transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports((-webkit-transform-style:preserve-3d) or(transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports((-webkit-transform-style:preserve-3d) or(transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports((-webkit-transform-style:preserve-3d) or(transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#007bff !important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width:576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width:768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width:992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width:1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-ms-flexbox !important;display:flex !important}.d-print-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-fill{-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-grow-0{-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-grow-1{-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-start{-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media(min-width:576px){.flex-sm-row{-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-sm-fill{-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-grow-0{-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-sm-grow-1{-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-sm-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-sm-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-sm-start{-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media(min-width:768px){.flex-md-row{-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-md-fill{-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-grow-0{-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-md-grow-1{-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-md-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-md-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-md-start{-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media(min-width:992px){.flex-lg-row{-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-lg-fill{-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-grow-0{-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-lg-grow-1{-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-lg-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-lg-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-lg-start{-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media(min-width:1200px){.flex-xl-row{-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-xl-fill{-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-grow-0{-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-xl-grow-1{-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-xl-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-xl-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-xl-start{-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width:576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width:768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width:992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width:1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports((position:-webkit-sticky) or(position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width:576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width:768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width:992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width:1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width:576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width:768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width:992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width:1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#007bff !important}a.text-primary:focus,a.text-primary:hover{color:#0062cc !important}.text-secondary{color:#6c757d !important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62 !important}.text-success{color:#28a745 !important}a.text-success:focus,a.text-success:hover{color:#1e7e34 !important}.text-info{color:#17a2b8 !important}a.text-info:focus,a.text-info:hover{color:#117a8b !important}.text-warning{color:#ffc107 !important}a.text-warning:focus,a.text-warning:hover{color:#d39e00 !important}.text-danger{color:#dc3545 !important}a.text-danger:focus,a.text-danger:hover{color:#bd2130 !important}.text-light{color:#f8f9fa !important}a.text-light:focus,a.text-light:hover{color:#dae0e5 !important}.text-dark{color:#343a40 !important}a.text-dark:focus,a.text-dark:hover{color:#1d2124 !important}.text-body{color:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,::after,::before{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} + /* 引入boostrap 样式的时候 layui 表单样式会被影响,需要加入该css设置 */ + form,.center-container *, + ::after, + ::before { + box-sizing: unset; + } + \ No newline at end of file diff --git a/src/main/resources/front/front/css/common.css b/src/main/resources/front/front/css/common.css new file mode 100644 index 0000000..f11bb1f --- /dev/null +++ b/src/main/resources/front/front/css/common.css @@ -0,0 +1,22 @@ +/** + * 工具类css + */ +/* 嵌套文字横线 */ +.line-container { + width: 100%; + background: url(../img/line.jpg) left center repeat-x; + text-align: center; +} +.line { + display: inline-block; + padding: 0 10px; + text-align: center; + font-family: 'Microsoft Yahei'; + font-size: 24px; + background: #fff; + color: #000000; + line-height: 1.3; +} +/** + * 工具类css end + */ \ No newline at end of file diff --git a/src/main/resources/front/front/css/style.css b/src/main/resources/front/front/css/style.css new file mode 100644 index 0000000..6281ab4 --- /dev/null +++ b/src/main/resources/front/front/css/style.css @@ -0,0 +1,701 @@ +.container { + margin: 0 auto; + width: 980px; +} + +label { + margin: 0; +} + +/* 导航栏 */ +.nav { + text-align: center; +} + +.layui-nav * { + font-size: 18px; +} + +/* 轮播图 */ +.swiper-item { + width: 100%; +} + +.layui-carousel-ind li { + width: 80px; + height: 5px; + border-radius: 0; +} + +/* 商品推荐标题 */ +.recommend-container { + margin-top: 20px; +} + +.index-title { + margin: 0 auto; + width: 980px; + text-align: center; + font-size: 42px; + font-family: "Times New Roman", Times, serif; + text-transform: uppercase; +} + +.recommend-list { + width: 1000px; + margin: 0 auto; + height: 360px; + padding: 0px 0 0 0; +} + +.recommend-item { + float: left; + width: 1000px; + padding: 20px 0 0 0; +} + +.recommend-item li { + float: left; + width: 218px; + position: relative; + display: inline; + margin: 0 15px; +} + +.recommend-item li a.img { + float: left; + width: 218px; + height: 218px; + position: absolute; + left: 0; + top: 0; + background: url(../img/yuan.png) left top no-repeat; +} + +.recommend-item li a.wor { + float: left; + width: 218px; + height: 30px; + line-height: 30px; + text-align: center; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + font-size: 14px; + color: #000; + display: inline; + margin: 10px 0 0 0; +} + +/* 首页新闻样式(手风琴) */ +.news-home-container { + padding-top: 20px; + margin-bottom: 20px; + padding-bottom: 20px; +} + +.news-home-container .layui-collapse { + border: 0; + margin: 0 20px; +} + +.news-home-container .layui-colla-item { + margin-top: 14px; +} + +.news-home-container .layui-colla-content { + font-size: 16px; + line-height: 40px; + height: 115px; +} + +.news-home-container .layui-colla-title { + height: 50px; + line-height: 50px; + font-size: 16px; + font-weight: 500; +} + +.news-home-container .card-container { + margin-top: 18px; +} + +.news-home-container .layui-card-header { + height: 50px; + line-height: 50px; +} + +/* 底部导航 */ +.nav-bottom { + text-align: center; +} + +/* 底部栏 */ +.footer { + margin: 10px; + text-align: center; +} + +.footer-item { + color: #515151; + margin-top: 10px; +} + +/* 留言 */ +.message-container { + width: 980px; + margin: 0 auto; + text-align: center; +} + +.message-container .message-form { + margin-top: 20px; + border-bottom: 1px dotted #888888; +} + +.message-container .message-list { + text-align: left; +} + + +.message-container .message-list .message-item { + margin-top: 20px; + border-bottom: 1px solid #EEEEEE; +} + +.message-container .message-list .message-item .username-container { + font-size: 18px; +} + +.message-container .message-list .message-item .username-container .avator { + width: 60px; + height: 60px; + border-radius: 50%; +} + +.message-container .message-list .message-item .content { + margin: 10px; +} + +.message-container .message-list .message-item .replay { + background: #EEEEEE; + margin: 10px; + padding: 20px; + border-radius: 20px; +} + +/* 论坛 */ +.forum-container { + width: 980px; + margin: 0 auto; + text-align: center; +} + +.forum-container .forum-list { + text-align: left; + margin-top: 20px; +} + +.forum-container .forum-list .forum-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + border-bottom: 3px dotted #EEEEEE; + border-top: 3px dotted #EEEEEE; +} + +.forum-container .forum-list .forum-item.line { + background: #EEEEEE; +} + + +.forum-container .forum-list .forum-item .h2 { + font-size: 14px; +} + +.forum-container .forum-list .forum-item .create-time { + font-size: 14px; +} + +.forum-container { + margin-top: 20px; +} + +.forum-container .title { + font-size: 22px; + font-weight: bold; +} + +.forum-container .content { + width: 980px; + margin: 0 auto; + text-align: left; + margin-top: 30px; + font-size: 16px; + line-height: 30px; +} + +.forum-container .auth-container { + margin-top: 20px; + color: #888888; + border-bottom: 1px dotted #888888; + padding-bottom: 20px; +} + +.forum-container .bottom-container { + display: flex; + justify-content: space-between; + width: 980px; + margin: 0 auto; + background: #EEEEEE; + height: 60px; + line-height: 60px; + margin-top: 30px; +} + +.forum-container .bottom-container .title { + margin-left: 30px; + font-size: 20px; + color: #515151; +} + +.forum-container .bottom-container .btn { + font-size: 20px; + padding: 0 20px; +} + +.forum-container .message-list { + text-align: left; +} + + +.forum-container .message-list .message-item { + margin-top: 20px; + border-bottom: 1px solid #EEEEEE; +} + +.forum-container .message-list .message-item .username-container { + font-size: 18px; +} + +.forum-container .message-list .message-item .username-container .avator { + width: 60px; + height: 60px; + border-radius: 50%; +} + +.forum-container .message-list .message-item .content { + margin: 10px; +} + +.forum-container .message-list .message-item .replay { + background: #EEEEEE; + margin: 10px; + padding: 20px; + border-radius: 20px; +} + +/* 考试 */ +.paper-container { + width: 980px; + margin: 0 auto; + margin-top: 20px; + text-align: center; +} + +.paper-container thead { + border-radius: 100px; +} + +.paper-container thead tr th { + font-size: 16px; + font-weight: blod; + line-height: 50px; + height: 50px; + text-align: center; +} + +.paper-container tbody tr td { + font-size: 16px; + height: 50px; + border-bottom: 5px dotted #EEEEEE; +} + +.paper-container tbody tr { + border: 3px dotted #EEEEEE; +} + +/* 个人中心 */ +.center-container { + width: 980px; + margin: 0 auto; + margin-top: 20px; + text-align: center; + display: flex; + margin-bottom: 20px; +} + +.center-container .left-container { + border: 2px dotted #EEEEEE; + background: #FFFFFF; + width: 200px; + padding-top: 20px; + height: 600px; +} + +.center-container .right-container { + flex: 1; + border: 2px dotted #EEEEEE; + background: #FFFFFF; + text-align: left; + padding: 20px; + padding-top: 40px; +} + +/* 购物车 */ +.btn-container { + margin-top: 20px; + text-align: right; + margin-bottom: 60px; + border: 2px dotted #EEEEEE; + padding: 20px; +} + +/* 登陆注册 */ +.login-container { + background: #FFFFFF; + z-index: 9; + position: relative; + width: 480px; + margin: 0 auto; + border-radius: 20px; + margin-top: 100px; + padding-top: 30px; +} + +.login-form { + text-align: center; + padding: 20px; +} + +.login-bg { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.8; + background-size: 100% 100%; + background-repeat: no-repeat; +} + +.login-container .bottom-container { + text-align: center; + color: #888888; + padding: 20px; +} + +.login-container .bottom-container a { + margin-left: 10px; + border: 2px dotted #888888; + padding: 10px; +} + +/* 确认下单页面 */ +.address-table { + border: 3px dotted #EEEEEE; +} + +/* 图文列表 */ +.data-container { + margin: 20px 0; + text-align: center; + display: flex; + flex-direction: column; +} + +.data-container .data-list .data-item { + padding: 20px; + text-align: left; + margin-bottom: 10px; + min-height: 330px; +} + +.data-container .data-list .data-item:hover { + padding: 10px; +} + + +.data-container .data-list .data-item .cover { + width: 100%; + height: 200px; + object-fit: cover; + border: 1px solid #EEEEEE; +} + +.data-container .data-list .data-item .title { + text-align: center; + padding: 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.data-container .data-list .data-item .price { + font-size: 20px; + text-align: right; +} + +.data-container .data-list .data-item .data { + font-size: 16px; + border: 1px solid #EEEEEE; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +.data-container .data-list .data-item .data .item { + width: 40%; + text-align: center; + margin: 10px; +} + +.search-container { + border: 0; + font-size: 16px; + width: 980px; + margin: 0 auto; + text-align: left; + margin-top: 10px; + margin-bottom: 10px; +} + +/* 数据详情页 */ + +.data-detail { + width: 980px; + margin: 0 auto; + margin-top: 20px; + text-align: left; + margin-bottom: 20px; +} + +.data-detail-breadcrumb { + margin: 10px 0; + padding: 20px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.data-detail .title { + font-size: 20px; + font-weight: bold; + border: 3px dotted #EEEEEE; + padding: 10px; +} + +.data-detail .count-container { + background: url(../img/seckilling.jpg); + margin-top: 20px; + padding: 15px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.data-detail .count-container .text { + font-size: 18px; + font-weight: blod; +} + +.data-detail .count-container .number { + padding: 10px; + font-size: 16px; + font-weight: blod; +} + +.data-detail .tool-container { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 20px; + font-size: 16px; + font-weight: bolder; + padding: 10px; +} + +.data-detail .price { + color: red; + font-size: 16px; + font-weight: bolder; + font-size: 20px; + font-weight: bolder; +} + +.data-detail .detail-item { + background: #EEEEEE; + padding: 10px; + display: flex; + align-items: center; +} + +.data-detail .desc { + font-size: 16px; + color: #515151; +} + +.video-container { + width: 100%; + margin-top: 20px; +} + +.num-picker { + display: flex; + align-items: center; + margin-right: 20px; +} + +.num-picker button { + border: 0; + font-size: 20px; +} + +.num-picker input { + width: 50px; + text-align: center; + height: 40px; +} + +.data-add-container{ + width: 800px; + margin: 0 auto; + margin-top: 20px; + text-align: left; + margin-bottom: 20px; + background: #FFFFFF; + padding: 20px; + padding-top: 30px; +} + +/* 详情页选座 */ +.seat-list { + display: flex; + align-items: center; + flex-wrap: wrap; + background: #FFFFFF; + margin: 20px; + border-radius: 20px; + padding: 20px; + font-size: 16px; +} + +.seat-item { + width: 10%; + display: flex; + align-items: center; + flex-direction: column; + margin-bottom: 20px; +} + +.seat-icon { + width: 30px; + height: 30px; + margin-bottom: 10px; +} + +/* banner */ +.banner { + width: 100%; + height: 50px; + margin-top: 30px; +} + +/* 新闻列表 */ +.news-container { + text-align: center; + margin: 0 auto; + margin: 40px 0; +} + +.news-container .pager { + margin: 20px 0; +} + +.news-container .news-list { + width: 980px; + margin: 0 auto; + text-align: left; +} + +.news-container .news-list .news-item { + display: flex; + border-bottom: 1px solid #EEEEEE; + padding: 10px; +} + +.news-container .news-list .news-item .cover-container { + margin: 0 20px; +} + +.news-container .news-list .news-item .cover-container .cover { + width: 200px; + height: 200px; + object-fit: cover; +} + +.news-container .news-list .news-item .detail-container .h2 { + font-size: 18px; + font-weight: bold; +} + +.news-container .news-list .news-item .detail-container .desc { + height: 140px; + padding-top: 20px; +} + +.news-container .title { + font-size: 22px; + font-weight: bold; +} + +.news-container .content { + width: 980px; + margin: 0 auto; + text-align: left; + margin-top: 30px; + font-size: 16px; + line-height: 30px; +} + +.news-container .auth-container { + margin-top: 20px; + color: #888888; + border-bottom: 1px dotted #888888; + padding-bottom: 20px; +} + + +.news-container .bottom-container { + display: flex; + justify-content: space-between; + width: 980px; + margin: 0 auto; + background: #EEEEEE; + height: 60px; + line-height: 60px; + margin-top: 30px; +} + +.news-container .bottom-container .title { + margin-left: 30px; + font-size: 20px; + color: #515151; +} + +.news-container .bottom-container .btn { + font-size: 20px; + padding: 0 20px; +} diff --git a/src/main/resources/front/front/css/theme.css b/src/main/resources/front/front/css/theme.css new file mode 100644 index 0000000..43572db --- /dev/null +++ b/src/main/resources/front/front/css/theme.css @@ -0,0 +1,265 @@ +/* 导航栏 */ +.nav { + background: #f7f7f7; +} + +.layui-nav .layui-nav-item a { + color: #515151; +} + +.layui-nav .layui-this:after, +.layui-nav-bar, +.layui-nav-tree .layui-nav-itemed:after { + background-color: #ce0b07; +} + +.layui-nav .layui-nav-item a:hover { + color: #FFFFFF; + background-color: #ce0b07; +} + +.layui-nav .layui-nav-child dd.layui-this a, +.layui-nav-child dd.layui-this { + background-color: #ce0b07; +} + +.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover { + background-color: #ce0b07; + color: #fff; +} + +/* 轮播图 */ +.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul { + background-color: #FFFFFF; +} + +.layui-carousel-ind li.layui-this { + background-color: #ce0b07; +} + +.layui-carousel-ind li { + background-color: #888888; +} + +/* 首页标题 */ +.index-title { + color: #ce0b07; +} + +/* 首页新闻 */ +.news-home-container { + background: #e5e5e5; +} + +.news-home-container .layui-colla-item { + border: 1px solid #EEEEEE; +} + +.news-home-container .layui-colla-content { + background: #FFFFFF; +} + +.news-home-container .layui-colla-title { + background: #d1d1d1; + border: 1px solid #EEEEEE; + color: #515151; +} + +.news-home-container .layui-colla-title:hover { + background: #ce0b07; + color: #FFFFFF; +} + +.news-home-container .layui-card-header { + background: #d1d1d1; + border: 1px solid #FFFFFF; + color: #515151; +} + +/* 图文列表 */ + +.data-container .data-list .data-item:hover { + border: 1px solid #ce0b07; +} + + +.data-container .data-list .data-item .title:hover { + background: #ce0b07; +} + + +.data-container .data-list .data-item .title { + background: #515151; + color: #FFFFFF; +} + +.data-container .data-list .data-item .price { + color: #ce0b07; +} + +/* 详情页 */ +.data-detail { + background: #FFFFFF; +} + +.data-detail-breadcrumb { + background: #EEEEEE; + color: #515151; +} + +.data-detail .title { + color: #515151; + border: 3px dotted #EEEEEE; +} + +.data-detail .count-container { + color: #FFFFFF; +} + +.data-detail .count-container .number { + background: #443b3b; +} + +.data-detail .tool-container{ + border: 3px dotted #EEEEEE; +} + +.data-detail .price{ + color: #ce0b07; +} + + +.layui-tab-card>.layui-tab-title .layui-this { + background-color: #ce0b07; + color: #FFFFFF; +} + +/* 底部导航栏 */ +.nav-bottom { + background: #ce0b07; +} + +.nav-bottom .layui-nav-item a { + color: #FFFFFF; +} + +/* banner */ +.banner { + background: #ce0b07; +} + +/* 新闻资讯 */ +.news-container .news-list .news-item .detail-container .h2 { + color: #4e6990; +} + +.news-container .news-list .news-item .detail-container .desc { + color: #515151; +} + +.news-container .news-list .news-item .detail-container .create-time { + color: #515151; +} + +.news-container .title { + color: #ce0b07; +} + + +.news-container .bottom-container .btn { + background: #ce0b07; + color: #FFFFFF; +} + +/* 论坛 */ + +.forum-container .bottom-container .btn { + background: #ce0b07; + color: #FFFFFF; +} + +.forum-container .forum-list .forum-item:hover { + background: #ce0b07; + color: #FFFFFF; +} + +.forum-container .forum-list .forum-item.line:hover { + background: #ce0b07; + color: #FFFFFF; +} + +/* 考试 */ +.paper-container thead tr{ + background: #ce0b07 ; + color: #FFFFFF; +} + +.paper-container tbody tr:hover{ + color: #FFFFFF; + background-color: #ce0b07; +} + +/* 个人中心 */ + +.center-container .layui-nav .layui-nav-more { + border-color: #515151 transparent transparent; +} + +.center-container .layui-nav-itemed>a, .layui-nav-tree .layui-nav-title a, .layui-nav-tree .layui-nav-title a:hover { + color: #515151 !important; +} + +.center-container .layui-nav .layui-nav-mored, .layui-nav-itemed>a .layui-nav-more { + border-color: transparent transparent #515151; +} + +.center-container .layui-nav { + background-color: #FFFFFF; + color: #515151; +} + +.center-container .layui-nav-itemed>.layui-nav-child { + background-color: #FFFFFF !important; +} + +.center-container .layui-nav-tree .layui-nav-bar { + width: 5px; + height: 0; + background-color: #ce0b07; +} + +/* 分页插件 */ +.layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #ce0b07; +} + +.layui-laypage a:hover { + color: #ce0b07; +} + +.btn-submit { + background: #ce0b07; +} + +.btn-theme{ + background: #ce0b07; +} + + +/* checkbox */ +.layui-form-radio>i:hover, .layui-form-radioed>i { + color: #ce0b07; +} + +.layui-form-select dl dd.layui-this { + background-color: #ce0b07; + color: #fff; +} + +.layui-tab-brief>.layui-tab-title .layui-this { + color: #ce0b07; +} + +.layui-tab-brief>.layui-tab-more li.layui-this:after, .layui-tab-brief>.layui-tab-title .layui-this:after { + border-bottom: 2px solid #ce0b07; +} \ No newline at end of file diff --git a/src/main/resources/front/front/elementui/elementui.css b/src/main/resources/front/front/elementui/elementui.css new file mode 100644 index 0000000..ccd234c --- /dev/null +++ b/src/main/resources/front/front/elementui/elementui.css @@ -0,0 +1 @@ +@charset "UTF-8";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.is-hidden>*,.el-table--hidden{visibility:hidden}.el-input__suffix,.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing),.el-message__closeBtn:focus,.el-message__content:focus,.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing),.el-rate:active,.el-rate:focus,.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing),.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}@font-face{font-family:element-icons;src:url(fonts/element-icons.woff) format("woff"),url(fonts/element-icons.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\e6a0"}.el-icon-ice-cream-square:before{content:"\e6a3"}.el-icon-lollipop:before{content:"\e6a4"}.el-icon-potato-strips:before{content:"\e6a5"}.el-icon-milk-tea:before{content:"\e6a6"}.el-icon-ice-drink:before{content:"\e6a7"}.el-icon-ice-tea:before{content:"\e6a9"}.el-icon-coffee:before{content:"\e6aa"}.el-icon-orange:before{content:"\e6ab"}.el-icon-pear:before{content:"\e6ac"}.el-icon-apple:before{content:"\e6ad"}.el-icon-cherry:before{content:"\e6ae"}.el-icon-watermelon:before{content:"\e6af"}.el-icon-grape:before{content:"\e6b0"}.el-icon-refrigerator:before{content:"\e6b1"}.el-icon-goblet-square-full:before{content:"\e6b2"}.el-icon-goblet-square:before{content:"\e6b3"}.el-icon-goblet-full:before{content:"\e6b4"}.el-icon-goblet:before{content:"\e6b5"}.el-icon-cold-drink:before{content:"\e6b6"}.el-icon-coffee-cup:before{content:"\e6b8"}.el-icon-water-cup:before{content:"\e6b9"}.el-icon-hot-water:before{content:"\e6ba"}.el-icon-ice-cream:before{content:"\e6bb"}.el-icon-dessert:before{content:"\e6bc"}.el-icon-sugar:before{content:"\e6bd"}.el-icon-tableware:before{content:"\e6be"}.el-icon-burger:before{content:"\e6bf"}.el-icon-knife-fork:before{content:"\e6c1"}.el-icon-fork-spoon:before{content:"\e6c2"}.el-icon-chicken:before{content:"\e6c3"}.el-icon-food:before{content:"\e6c4"}.el-icon-dish-1:before{content:"\e6c5"}.el-icon-dish:before{content:"\e6c6"}.el-icon-moon-night:before{content:"\e6ee"}.el-icon-moon:before{content:"\e6f0"}.el-icon-cloudy-and-sunny:before{content:"\e6f1"}.el-icon-partly-cloudy:before{content:"\e6f2"}.el-icon-cloudy:before{content:"\e6f3"}.el-icon-sunny:before{content:"\e6f6"}.el-icon-sunset:before{content:"\e6f7"}.el-icon-sunrise-1:before{content:"\e6f8"}.el-icon-sunrise:before{content:"\e6f9"}.el-icon-heavy-rain:before{content:"\e6fa"}.el-icon-lightning:before{content:"\e6fb"}.el-icon-light-rain:before{content:"\e6fc"}.el-icon-wind-power:before{content:"\e6fd"}.el-icon-baseball:before{content:"\e712"}.el-icon-soccer:before{content:"\e713"}.el-icon-football:before{content:"\e715"}.el-icon-basketball:before{content:"\e716"}.el-icon-ship:before{content:"\e73f"}.el-icon-truck:before{content:"\e740"}.el-icon-bicycle:before{content:"\e741"}.el-icon-mobile-phone:before{content:"\e6d3"}.el-icon-service:before{content:"\e6d4"}.el-icon-key:before{content:"\e6e2"}.el-icon-unlock:before{content:"\e6e4"}.el-icon-lock:before{content:"\e6e5"}.el-icon-watch:before{content:"\e6fe"}.el-icon-watch-1:before{content:"\e6ff"}.el-icon-timer:before{content:"\e702"}.el-icon-alarm-clock:before{content:"\e703"}.el-icon-map-location:before{content:"\e704"}.el-icon-delete-location:before{content:"\e705"}.el-icon-add-location:before{content:"\e706"}.el-icon-location-information:before{content:"\e707"}.el-icon-location-outline:before{content:"\e708"}.el-icon-location:before{content:"\e79e"}.el-icon-place:before{content:"\e709"}.el-icon-discover:before{content:"\e70a"}.el-icon-first-aid-kit:before{content:"\e70b"}.el-icon-trophy-1:before{content:"\e70c"}.el-icon-trophy:before{content:"\e70d"}.el-icon-medal:before{content:"\e70e"}.el-icon-medal-1:before{content:"\e70f"}.el-icon-stopwatch:before{content:"\e710"}.el-icon-mic:before{content:"\e711"}.el-icon-copy-document:before{content:"\e718"}.el-icon-full-screen:before{content:"\e719"}.el-icon-switch-button:before{content:"\e71b"}.el-icon-aim:before{content:"\e71c"}.el-icon-crop:before{content:"\e71d"}.el-icon-odometer:before{content:"\e71e"}.el-icon-time:before{content:"\e71f"}.el-icon-bangzhu:before{content:"\e724"}.el-icon-close-notification:before{content:"\e726"}.el-icon-microphone:before{content:"\e727"}.el-icon-turn-off-microphone:before{content:"\e728"}.el-icon-position:before{content:"\e729"}.el-icon-postcard:before{content:"\e72a"}.el-icon-message:before{content:"\e72b"}.el-icon-chat-line-square:before{content:"\e72d"}.el-icon-chat-dot-square:before{content:"\e72e"}.el-icon-chat-dot-round:before{content:"\e72f"}.el-icon-chat-square:before{content:"\e730"}.el-icon-chat-line-round:before{content:"\e731"}.el-icon-chat-round:before{content:"\e732"}.el-icon-set-up:before{content:"\e733"}.el-icon-turn-off:before{content:"\e734"}.el-icon-open:before{content:"\e735"}.el-icon-connection:before{content:"\e736"}.el-icon-link:before{content:"\e737"}.el-icon-cpu:before{content:"\e738"}.el-icon-thumb:before{content:"\e739"}.el-icon-female:before{content:"\e73a"}.el-icon-male:before{content:"\e73b"}.el-icon-guide:before{content:"\e73c"}.el-icon-news:before{content:"\e73e"}.el-icon-price-tag:before{content:"\e744"}.el-icon-discount:before{content:"\e745"}.el-icon-wallet:before{content:"\e747"}.el-icon-coin:before{content:"\e748"}.el-icon-money:before{content:"\e749"}.el-icon-bank-card:before{content:"\e74a"}.el-icon-box:before{content:"\e74b"}.el-icon-present:before{content:"\e74c"}.el-icon-sell:before{content:"\e6d5"}.el-icon-sold-out:before{content:"\e6d6"}.el-icon-shopping-bag-2:before{content:"\e74d"}.el-icon-shopping-bag-1:before{content:"\e74e"}.el-icon-shopping-cart-2:before{content:"\e74f"}.el-icon-shopping-cart-1:before{content:"\e750"}.el-icon-shopping-cart-full:before{content:"\e751"}.el-icon-smoking:before{content:"\e752"}.el-icon-no-smoking:before{content:"\e753"}.el-icon-house:before{content:"\e754"}.el-icon-table-lamp:before{content:"\e755"}.el-icon-school:before{content:"\e756"}.el-icon-office-building:before{content:"\e757"}.el-icon-toilet-paper:before{content:"\e758"}.el-icon-notebook-2:before{content:"\e759"}.el-icon-notebook-1:before{content:"\e75a"}.el-icon-files:before{content:"\e75b"}.el-icon-collection:before{content:"\e75c"}.el-icon-receiving:before{content:"\e75d"}.el-icon-suitcase-1:before{content:"\e760"}.el-icon-suitcase:before{content:"\e761"}.el-icon-film:before{content:"\e763"}.el-icon-collection-tag:before{content:"\e765"}.el-icon-data-analysis:before{content:"\e766"}.el-icon-pie-chart:before{content:"\e767"}.el-icon-data-board:before{content:"\e768"}.el-icon-data-line:before{content:"\e76d"}.el-icon-reading:before{content:"\e769"}.el-icon-magic-stick:before{content:"\e76a"}.el-icon-coordinate:before{content:"\e76b"}.el-icon-mouse:before{content:"\e76c"}.el-icon-brush:before{content:"\e76e"}.el-icon-headset:before{content:"\e76f"}.el-icon-umbrella:before{content:"\e770"}.el-icon-scissors:before{content:"\e771"}.el-icon-mobile:before{content:"\e773"}.el-icon-attract:before{content:"\e774"}.el-icon-monitor:before{content:"\e775"}.el-icon-search:before{content:"\e778"}.el-icon-takeaway-box:before{content:"\e77a"}.el-icon-paperclip:before{content:"\e77d"}.el-icon-printer:before{content:"\e77e"}.el-icon-document-add:before{content:"\e782"}.el-icon-document:before{content:"\e785"}.el-icon-document-checked:before{content:"\e786"}.el-icon-document-copy:before{content:"\e787"}.el-icon-document-delete:before{content:"\e788"}.el-icon-document-remove:before{content:"\e789"}.el-icon-tickets:before{content:"\e78b"}.el-icon-folder-checked:before{content:"\e77f"}.el-icon-folder-delete:before{content:"\e780"}.el-icon-folder-remove:before{content:"\e781"}.el-icon-folder-add:before{content:"\e783"}.el-icon-folder-opened:before{content:"\e784"}.el-icon-folder:before{content:"\e78a"}.el-icon-edit-outline:before{content:"\e764"}.el-icon-edit:before{content:"\e78c"}.el-icon-date:before{content:"\e78e"}.el-icon-c-scale-to-original:before{content:"\e7c6"}.el-icon-view:before{content:"\e6ce"}.el-icon-loading:before{content:"\e6cf"}.el-icon-rank:before{content:"\e6d1"}.el-icon-sort-down:before{content:"\e7c4"}.el-icon-sort-up:before{content:"\e7c5"}.el-icon-sort:before{content:"\e6d2"}.el-icon-finished:before{content:"\e6cd"}.el-icon-refresh-left:before{content:"\e6c7"}.el-icon-refresh-right:before{content:"\e6c8"}.el-icon-refresh:before{content:"\e6d0"}.el-icon-video-play:before{content:"\e7c0"}.el-icon-video-pause:before{content:"\e7c1"}.el-icon-d-arrow-right:before{content:"\e6dc"}.el-icon-d-arrow-left:before{content:"\e6dd"}.el-icon-arrow-up:before{content:"\e6e1"}.el-icon-arrow-down:before{content:"\e6df"}.el-icon-arrow-right:before{content:"\e6e0"}.el-icon-arrow-left:before{content:"\e6de"}.el-icon-top-right:before{content:"\e6e7"}.el-icon-top-left:before{content:"\e6e8"}.el-icon-top:before{content:"\e6e6"}.el-icon-bottom:before{content:"\e6eb"}.el-icon-right:before{content:"\e6e9"}.el-icon-back:before{content:"\e6ea"}.el-icon-bottom-right:before{content:"\e6ec"}.el-icon-bottom-left:before{content:"\e6ed"}.el-icon-caret-top:before{content:"\e78f"}.el-icon-caret-bottom:before{content:"\e790"}.el-icon-caret-right:before{content:"\e791"}.el-icon-caret-left:before{content:"\e792"}.el-icon-d-caret:before{content:"\e79a"}.el-icon-share:before{content:"\e793"}.el-icon-menu:before{content:"\e798"}.el-icon-s-grid:before{content:"\e7a6"}.el-icon-s-check:before{content:"\e7a7"}.el-icon-s-data:before{content:"\e7a8"}.el-icon-s-opportunity:before{content:"\e7aa"}.el-icon-s-custom:before{content:"\e7ab"}.el-icon-s-claim:before{content:"\e7ad"}.el-icon-s-finance:before{content:"\e7ae"}.el-icon-s-comment:before{content:"\e7af"}.el-icon-s-flag:before{content:"\e7b0"}.el-icon-s-marketing:before{content:"\e7b1"}.el-icon-s-shop:before{content:"\e7b4"}.el-icon-s-open:before{content:"\e7b5"}.el-icon-s-management:before{content:"\e7b6"}.el-icon-s-ticket:before{content:"\e7b7"}.el-icon-s-release:before{content:"\e7b8"}.el-icon-s-home:before{content:"\e7b9"}.el-icon-s-promotion:before{content:"\e7ba"}.el-icon-s-operation:before{content:"\e7bb"}.el-icon-s-unfold:before{content:"\e7bc"}.el-icon-s-fold:before{content:"\e7a9"}.el-icon-s-platform:before{content:"\e7bd"}.el-icon-s-order:before{content:"\e7be"}.el-icon-s-cooperation:before{content:"\e7bf"}.el-icon-bell:before{content:"\e725"}.el-icon-message-solid:before{content:"\e799"}.el-icon-video-camera:before{content:"\e772"}.el-icon-video-camera-solid:before{content:"\e796"}.el-icon-camera:before{content:"\e779"}.el-icon-camera-solid:before{content:"\e79b"}.el-icon-download:before{content:"\e77c"}.el-icon-upload2:before{content:"\e77b"}.el-icon-upload:before{content:"\e7c3"}.el-icon-picture-outline-round:before{content:"\e75f"}.el-icon-picture-outline:before{content:"\e75e"}.el-icon-picture:before{content:"\e79f"}.el-icon-close:before{content:"\e6db"}.el-icon-check:before{content:"\e6da"}.el-icon-plus:before{content:"\e6d9"}.el-icon-minus:before{content:"\e6d8"}.el-icon-help:before{content:"\e73d"}.el-icon-s-help:before{content:"\e7b3"}.el-icon-circle-close:before{content:"\e78d"}.el-icon-circle-check:before{content:"\e720"}.el-icon-circle-plus-outline:before{content:"\e723"}.el-icon-remove-outline:before{content:"\e722"}.el-icon-zoom-out:before{content:"\e776"}.el-icon-zoom-in:before{content:"\e777"}.el-icon-error:before{content:"\e79d"}.el-icon-success:before{content:"\e79c"}.el-icon-circle-plus:before{content:"\e7a0"}.el-icon-remove:before{content:"\e7a2"}.el-icon-info:before{content:"\e7a1"}.el-icon-question:before{content:"\e7a4"}.el-icon-warning-outline:before{content:"\e6c9"}.el-icon-warning:before{content:"\e7a3"}.el-icon-goods:before{content:"\e7c2"}.el-icon-s-goods:before{content:"\e7b2"}.el-icon-star-off:before{content:"\e717"}.el-icon-star-on:before{content:"\e797"}.el-icon-more-outline:before{content:"\e6cc"}.el-icon-more:before{content:"\e794"}.el-icon-phone-outline:before{content:"\e6cb"}.el-icon-phone:before{content:"\e795"}.el-icon-user:before{content:"\e6e3"}.el-icon-user-solid:before{content:"\e7a5"}.el-icon-setting:before{content:"\e6ca"}.el-icon-s-tools:before{content:"\e7ac"}.el-icon-delete:before{content:"\e6d7"}.el-icon-delete-solid:before{content:"\e7c9"}.el-icon-eleme:before{content:"\e7c7"}.el-icon-platform-eleme:before{content:"\e7ca"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:""}.el-pagination::after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409EFF}.el-pagination button:disabled{color:#C0C4CC;background-color:#FFF;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #FFF;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#C0C4CC;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409EFF}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#C0C4CC}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409EFF}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409EFF;color:#FFF}.el-dialog,.el-pager li{background:#FFF;-webkit-box-sizing:border-box}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-date-table,.el-table th{-webkit-user-select:none;-moz-user-select:none}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-menu--collapse .el-menu .el-submenu,.el-menu--popup{min-width:200px}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#C0C4CC}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409EFF}.el-pager li.active{color:#409EFF;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409EFF}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #E4E7ED;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#FFF}.el-dropdown-menu,.el-menu--collapse .el-submenu .el-menu{z-index:10;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#F5F7FA}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#FFF}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown-menu{position:absolute;top:0;left:0;padding:10px 0;margin:5px 0;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #EBEEF5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#FFF}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#FFF}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu::after,.el-menu::before{display:table;content:""}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409EFF;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#FFF;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409EFF;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;border:1px solid #E4E7ED;border-radius:2px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;position:relative;-webkit-box-sizing:border-box;white-space:nowrap;list-style:none}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409EFF}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409EFF}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{white-space:nowrap;background:#FFF;border:1px solid #DCDFE6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409EFF}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #409EFF;box-shadow:-1px 0 0 0 #409EFF}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#F2F6FC}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-popover,.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409EFF}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #DCDFE6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#DCDFE6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#FFF}.el-switch.is-checked .el-switch__core{border-color:#409EFF;background-color:#409EFF}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #E4E7ED;border-radius:4px;background-color:#FFF;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409EFF;background-color:#FFF}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#F5F7FA}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\e6da";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#FFF}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#F5F7FA}.el-select-dropdown__item.selected{color:#409EFF;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#E4E7ED}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#C0C4CC}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409EFF}.el-select .el-input .el-select__caret{color:#C0C4CC;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#C0C4CC;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#E4E7ED}.el-select .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#C0C4CC;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select .el-tag__close{margin-top:-2px}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5}.el-select .el-tag__close.el-icon-close{background-color:#C0C4CC;right:-7px;top:0;color:#FFF}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#FFF}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table--mini,.el-table--small,.el-table__expand-icon{font-size:12px}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit td.gutter,.el-table--fit th.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th{background:#F5F7FA}.el-table th,.el-table tr{background-color:#FFF}.el-table td,.el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table td.is-center,.el-table th.is-center{text-align:center}.el-table td.is-right,.el-table th.is-right{text-align:right}.el-table td.gutter,.el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table--medium td,.el-table--medium th{padding:10px 0}.el-table--small td,.el-table--small th{padding:8px 0}.el-table--mini td,.el-table--mini th{padding:6px 0}.el-table .cell,.el-table--border td:first-child .cell,.el-table--border th:first-child .cell{padding-left:10px}.el-table tr input[type=checkbox]{margin:0}.el-table td,.el-table th.is-leaf{border-bottom:1px solid #EBEEF5}.el-table th.is-sortable{cursor:pointer}.el-table th{overflow:hidden;-ms-user-select:none;user-select:none}.el-table th>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th>.cell.highlight{color:#409EFF}.el-table th.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-table td.gutter{width:0}.el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #EBEEF5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#EBEEF5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border td,.el-table--border th,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #EBEEF5}.el-table--border th.gutter:last-of-type{border-bottom:1px solid #EBEEF5;border-bottom-width:1px}.el-table--border th,.el-table__fixed-right-patch{border-bottom:1px solid #EBEEF5}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#EBEEF5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#FFF}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td{border-top:1px solid #EBEEF5;background-color:#F5F7FA;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td{border-top:1px solid #EBEEF5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td,.el-table__header-wrapper tbody td{background-color:#F5F7FA;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-picker-panel,.el-table-filter{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #EBEEF5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#C0C4CC;top:5px}.el-table .sort-caret.descending{border-top-color:#C0C4CC;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409EFF}.el-table .descending .sort-caret.descending{border-top-color:#409EFF}.el-table .hidden-columns{position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td{background:#FAFAFA}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td,.el-table__body tr.hover-row.el-table__row--striped.current-row>td,.el-table__body tr.hover-row.el-table__row--striped>td,.el-table__body tr.hover-row>td{background-color:#F5F7FA}.el-table__body tr.current-row>td{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #EBEEF5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#F5F7FA}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #EBEEF5;border-radius:2px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.el-date-table td,.el-date-table td div{height:30px;-webkit-box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409EFF;color:#FFF}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #EBEEF5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#F2F6FC}.el-table-filter__bottom button:hover{color:#409EFF}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{padding:3px 0;box-sizing:border-box}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#C0C4CC}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409EFF;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#FFF}.el-date-table td.available:hover{color:#409EFF}.el-date-table td.current:not(.disabled) span{color:#FFF;background-color:#409EFF}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#FFF}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409EFF}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#F5F7FA;opacity:1;cursor:not-allowed;color:#C0C4CC}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#F2F6FC;border-radius:15px}.el-date-table td.selected div:hover{background-color:#F2F6FC}.el-date-table td.selected span{background-color:#409EFF;color:#FFF;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #EBEEF5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409EFF;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#FFF}.el-month-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-month-table td.disabled .cell:hover{color:#C0C4CC}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409EFF}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#F2F6FC}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#FFF}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#FFF;background-color:#409EFF}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409EFF}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409EFF;font-weight:700}.el-year-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-year-table td.disabled .cell:hover{color:#C0C4CC}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409EFF}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#FFF}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #EBEEF5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409EFF}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409EFF;font-weight:700}.time-select-item.disabled{color:#E4E7ED;cursor:not-allowed}.time-select-item:hover{background-color:#F5F7FA;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#C0C4CC;float:left;line-height:32px}.el-date-editor .el-range-input,.el-date-editor .el-range-separator{height:100%;margin:0;text-align:center;display:inline-block;font-size:14px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;padding:0;width:39%;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input:-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::placeholder{color:#C0C4CC}.el-date-editor .el-range-separator{padding:0 5px;line-height:32px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#C0C4CC;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor.is-active,.el-range-editor.is-active:hover{border-color:#409EFF}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#E4E7ED}.el-range-editor.is-disabled input{background-color:#F5F7FA;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::placeholder{color:#C0C4CC}.el-range-editor.is-disabled .el-range-separator{color:#C0C4CC}.el-picker-panel{color:#606266;border:1px solid #E4E7ED;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#FFF;border-radius:4px;line-height:30px;margin:5px 0}.el-popover,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#FFF;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409EFF}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409EFF}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409EFF}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#FFF;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#FFF;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409EFF}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#F5F7FA;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#C0C4CC;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #E4E7ED;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-slider__button,.el-slider__button-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #E4E7ED;border-bottom:1px solid #E4E7ED}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409EFF}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #E4E7ED}.el-popover{position:absolute;background:#FFF;min-width:150px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#FFF;border-radius:4px;border:1px solid #EBEEF5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#F56C6C}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409EFF}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67C23A}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#E6A23C}.el-message-box__status.el-icon-error{color:#F56C6C}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#F56C6C;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#C0C4CC}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#409EFF;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content::after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#F56C6C;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#F56C6C;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#F56C6C}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409EFF;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-collapse-item__arrow,.el-tabs__nav{-webkit-transition:-webkit-transform .3s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:#409EFF}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#E4E7ED;z-index:1}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after,.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409EFF inset;box-shadow:0 0 2px 2px #409EFF inset;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#C0C4CC;color:#FFF}.el-tabs__item.is-active{color:#409EFF}.el-tabs__item:hover{color:#409EFF;cursor:pointer}.el-tabs__item.is-disabled{color:#C0C4CC;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #E4E7ED}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #E4E7ED;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close,.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #E4E7ED;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#FFF}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--border-card{background:#FFF;border:1px solid #DCDFE6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#F5F7FA;border-bottom:1px solid #E4E7ED;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409EFF;background-color:#FFF;border-right-color:#DCDFE6;border-left-color:#DCDFE6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409EFF}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#C0C4CC}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #DCDFE6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #E4E7ED;border-bottom:none;border-top:1px solid #E4E7ED;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #E4E7ED;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #E4E7ED;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #E4E7ED;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #E4E7ED}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #E4E7ED;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #E4E7ED;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #E4E7ED;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#FFF;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409EFF}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#F5F7FA}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409EFF;color:#fff}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:#F5F7FA}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#C0C4CC;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#C0C4CC}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#FFF;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#C0C4CC}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#FFF}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67C23A}.el-alert--success.is-light .el-alert__description{color:#67C23A}.el-alert--success.is-dark{background-color:#67C23A;color:#FFF}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#FFF}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#E6A23C}.el-alert--warning.is-light .el-alert__description{color:#E6A23C}.el-alert--warning.is-dark{background-color:#E6A23C;color:#FFF}.el-alert--error.is-light{background-color:#fef0f0;color:#F56C6C}.el-alert--error.is-light .el-alert__description{color:#F56C6C}.el-alert--error.is-dark{background-color:#F56C6C;color:#FFF}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active{opacity:0}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #EBEEF5;position:fixed;background-color:#FFF;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67C23A}.el-notification .el-icon-error{color:#F56C6C}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#E6A23C}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#F5F7FA;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409EFF}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409EFF}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #DCDFE6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #DCDFE6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#E4E7ED;color:#E4E7ED}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#E4E7ED;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #DCDFE6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #DCDFE6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-upload-cover::after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#FFF}.el-tooltip__popper.is-light{background:#FFF;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#FFF}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#FFF}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#FFF}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#FFF}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{vertical-align:middle;display:inline-block}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#E4E7ED;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button{border-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409EFF;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;transform:translateX(-50%);background-color:transparent;text-align:center;user-select:none;line-height:normal}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409EFF;background-color:#FFF;border-radius:50%;-webkit-transition:.2s;transition:.2s;user-select:none}.el-image-viewer__btn,.el-step__icon-inner{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#FFF;transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #DCDFE6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#C0C4CC}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409EFF}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row{position:relative}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-upload--picture-card,.el-upload-dragger{-webkit-box-sizing:border-box;cursor:pointer}.el-col-0{width:0%}.el-col-offset-0{margin-left:0}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;box-sizing:border-box;width:148px;height:148px;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409EFF;color:#409EFF}.el-upload:focus .el-upload-dragger{border-color:#409EFF}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;box-sizing:border-box;width:360px;height:180px;text-align:center;position:relative;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#C0C4CC;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #DCDFE6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409EFF;font-style:normal}.el-upload-dragger:hover{border-color:#409EFF}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409EFF}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67C23A}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409EFF}.el-upload-list__item:hover{background-color:#F5F7FA}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409EFF;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409EFF}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#FFF}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#FFF;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#FFF;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#FFF;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner::after,.el-progress-bar__innerText,.el-spinner{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67C23A}.el-progress.is-success .el-progress__text{color:#67C23A}.el-progress.is-warning .el-progress-bar__inner{background-color:#E6A23C}.el-progress.is-warning .el-progress__text{color:#E6A23C}.el-progress.is-exception .el-progress-bar__inner{background-color:#F56C6C}.el-progress.is-exception .el-progress__text{color:#F56C6C}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#EBEEF5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409EFF;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-card,.el-message{border-radius:4px;overflow:hidden}.el-progress-bar__inner::after{height:100%}.el-progress-bar__innerText{color:#FFF;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#EBEEF5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67C23A}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#E6A23C}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#F56C6C}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#C0C4CC;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67C23A}.el-message .el-icon-error{color:#F56C6C}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#E6A23C}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#F56C6C;border-radius:10px;color:#FFF;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #FFF}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409EFF}.el-badge__content--success{background-color:#67C23A}.el-badge__content--warning{background-color:#E6A23C}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#F56C6C}.el-card{border:1px solid #EBEEF5;background-color:#FFF;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}.el-rate{height:20px;line-height:1}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#C0C4CC;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#F5F7FA}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#C0C4CC;border-color:#C0C4CC}.el-step__head.is-success{color:#67C23A;border-color:#67C23A}.el-step__head.is-error{color:#F56C6C;border-color:#F56C6C}.el-step__head.is-finish{color:#409EFF;border-color:#409EFF}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#FFF;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#C0C4CC}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#C0C4CC}.el-step__title.is-success{color:#67C23A}.el-step__title.is-error{color:#F56C6C}.el-step__title.is-finish{color:#409EFF}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#C0C4CC}.el-step__description.is-success{color:#67C23A}.el-step__description.is-error{color:#F56C6C}.el-step__description.is-finish{color:#409EFF}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#C0C4CC}.el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#FFF;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#C0C4CC;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#FFF;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;top:0;left:0;position:absolute}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#FFF;opacity:.24;-webkit-transition:.2s;transition:.2s}.el-fade-in-enter,.el-fade-in-leave-active,.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active,.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #EBEEF5;border-bottom:1px solid #EBEEF5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#FFF;color:#303133;cursor:pointer;border-bottom:1px solid #EBEEF5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409EFF}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#FFF;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #EBEEF5}.el-cascader__tags,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;display:inline-block;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409EFF;border-width:1px;border-style:solid;border-radius:4px;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409EFF}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67C23A}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close::before{display:block}.el-tag--dark{background-color:#409eff;border-color:#409eff;color:#fff}.el-tag--dark.is-hit{border-color:#409EFF}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#FFF;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67C23A}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409EFF}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67C23A}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#C0C4CC}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#C0C4CC}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#FFF;border:1px solid #E4E7ED;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#C0C4CC;color:#FFF}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#F5F7FA}.el-cascader__suggestion-item.is-checked{color:#409EFF;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#C0C4CC}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#C0C4CC}.el-cascader__search-input:-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::placeholder{color:#C0C4CC}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409EFF;box-shadow:0 0 3px 2px #409EFF}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{content:"";display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409EFF;border-color:#409EFF}.el-color-dropdown__link-btn{cursor:pointer;color:#409EFF;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409EFF,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty,.el-color-picker__icon{top:50%;left:50%;font-size:12px;position:absolute}.el-color-picker__empty{color:#999;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{display:inline-block;width:100%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#FFF;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#FFF;background-image:none;border:1px solid #DCDFE6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea__inner:hover{border-color:#C0C4CC}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea .el-input__count{color:#909399;background:#FFF;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea.is-exceed .el-textarea__inner{border-color:#F56C6C}.el-textarea.is-exceed .el-input__count{color:#F56C6C}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#C0C4CC;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input .el-input__count .el-input__count-inner{background:#FFF;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#FFF;background-image:none;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;display:inline-block;font-size:inherit;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;height:100%;color:#C0C4CC;text-align:center}.el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input__inner::placeholder{color:#C0C4CC}.el-input__inner:hover{border-color:#C0C4CC}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{right:5px;transition:all .3s}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#F56C6C}.el-input.is-exceed .el-input__suffix .el-input__count{color:#F56C6C}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#F5F7FA;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #DCDFE6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#FFF;background-color:#409EFF;font-size:0}.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #DCDFE6;background-color:#F5F7FA;color:#C0C4CC}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer-panel{border:1px solid #EBEEF5;border-radius:4px;overflow:hidden;background:#FFF;display:inline-block;vertical-align:middle;width:200px;max-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409EFF}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#F5F7FA;margin:0;padding-left:15px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-divider__text,.el-link{font-weight:500;font-size:14px}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#FFF;margin:0;padding:0;border-top:1px solid #EBEEF5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-aside,.el-header{-webkit-box-sizing:border-box}.el-container.is-vertical{-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-footer,.el-main{-webkit-box-sizing:border-box}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;box-sizing:border-box;padding:20px}.el-footer{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;font-size:14px;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #E4E7ED}.el-timeline-item__icon{color:#FFF;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#E4E7ED;border-radius:50%;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409EFF}.el-timeline-item__node--success{background-color:#67C23A}.el-timeline-item__node--warning{background-color:#E6A23C}.el-timeline-item__node--danger{background-color:#F56C6C}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409EFF}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409EFF}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409EFF}.el-link.el-link--default.is-disabled{color:#C0C4CC}.el-link.el-link--primary{color:#409EFF}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#F56C6C}.el-link.el-link--danger{color:#F56C6C}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67C23A}.el-link.el-link--success{color:#67C23A}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#E6A23C}.el-link.el-link--warning{color:#E6A23C}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#DCDFE6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#FFF;padding:0 20px;color:#303133}.el-image__error,.el-image__placeholder{background:#F5F7FA}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#C0C4CC;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;user-select:none}.el-button,.el-checkbox{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:40px}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{top:50%;width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#FFF;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#FFF;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#FFF;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#FFF;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#FFF}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#FFF;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#FFF}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#FFF;background-color:#67C23A;border-color:#67C23A}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#FFF}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#FFF}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#FFF;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67C23A;border-color:#67C23A;color:#FFF}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#FFF;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#FFF;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#FFF}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#FFF}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#FFF;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#E6A23C;border-color:#E6A23C;color:#FFF}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#FFF;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#FFF;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#FFF}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#FFF}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#FFF;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#F56C6C;border-color:#F56C6C;color:#FFF}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#FFF;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#FFF;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#FFF}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#FFF}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#FFF;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#FFF}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#FFF;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--text,.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover,.el-button--text:active{border-color:transparent}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;background-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table;content:""}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #EBEEF5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#C0C4CC}.el-backtop,.el-calendar-table td.is-today{color:#409EFF}.el-calendar-table td{border-bottom:1px solid #EBEEF5;border-right:1px solid #EBEEF5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#F2F8FE}.el-calendar-table tr:first-child td{border-top:1px solid #EBEEF5}.el-calendar-table tr td:first-child{border-left:1px solid #EBEEF5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#F2F8FE}.el-backtop{position:fixed;background-color:#FFF;width:40px;height:40px;border-radius:50%;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#F2F6FC}.el-page-header{display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{content:"";position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#DCDFE6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox-button__inner,.el-radio{font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409EFF}.el-checkbox.is-bordered.is-disabled{border-color:#EBEEF5;cursor:not-allowed}.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#DCDFE6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#C0C4CC}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#C0C4CC}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#C0C4CC;border-color:#C0C4CC}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409EFF;border-color:#409EFF}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#C0C4CC;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409EFF}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409EFF}.el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#FFF;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #DCDFE6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#FFF;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409EFF}.el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #FFF;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409EFF}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-radio,.el-radio__input{line-height:1;outline:0;white-space:nowrap}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409EFF}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#EBEEF5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409EFF}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio{color:#606266;cursor:pointer;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#409EFF}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#EBEEF5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#F5F7FA;border-color:#E4E7ED}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#F5F7FA}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#C0C4CC}.el-radio__input.is-disabled+span.el-radio__label{color:#C0C4CC;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409EFF;background:#409EFF}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409EFF}.el-radio__input.is-focus .el-radio__inner{border-color:#409EFF}.el-radio__inner{border:1px solid #DCDFE6;border-radius:100%;width:14px;height:14px;background-color:#FFF;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:#409EFF}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#FFF;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-radio__label{font-size:14px;padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px;font-size:14px}.el-cascader-panel.is-bordered{border:1px solid #E4E7ED;border-radius:4px}.el-cascader-menu{min-width:180px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;border-right:solid 1px #E4E7ED}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box}.el-avatar,.el-drawer{-webkit-box-sizing:border-box;overflow:hidden}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#C0C4CC}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409EFF;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#F5F7FA}.el-cascader-node.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;box-sizing:border-box;text-align:center;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-drawer,.el-drawer__header{display:-webkit-box;display:-ms-flexbox}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}.el-drawer.btt,.el-drawer.ttb,.el-drawer__container{left:0;right:0;width:100%}.el-drawer.ltr,.el-drawer.rtl,.el-drawer__container{top:0;bottom:0;height:100%}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#FFF;display:flex;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__body>*{-webkit-box-sizing:border-box;box-sizing:border-box}.el-drawer__container{position:relative}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-popconfirm__main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0} \ No newline at end of file diff --git a/src/main/resources/front/front/elementui/elementui.js b/src/main/resources/front/front/elementui/elementui.js new file mode 100644 index 0000000..40ff56d --- /dev/null +++ b/src/main/resources/front/front/elementui/elementui.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("vue")):"function"==typeof define&&define.amd?define("ELEMENT",["vue"],t):"object"==typeof exports?exports.ELEMENT=t(require("vue")):e.ELEMENT=t(e.Vue)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/dist/",i(i.s=49)}([function(t,i){t.exports=e},function(e,t,i){var n=i(4);e.exports=function(e,t,i){return void 0===i?n(e,t,!1):n(e,i,!1!==t)}},function(e,t,i){var n;!function(r){"use strict";var s={},a=/d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,o="[^\\s]+",l=/\[([^]*?)\]/gm,u=function(){};function c(e,t){for(var i=[],n=0,r=e.length;n3?0:(e-e%10!=10)*e%10]}};var g={D:function(e){return e.getDay()},DD:function(e){return d(e.getDay())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return e.getDate()},dd:function(e){return d(e.getDate())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return e.getMonth()+1},MM:function(e){return d(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},yy:function(e){return d(String(e.getFullYear()),4).substr(2)},yyyy:function(e){return d(e.getFullYear(),4)},h:function(e){return e.getHours()%12||12},hh:function(e){return d(e.getHours()%12||12)},H:function(e){return e.getHours()},HH:function(e){return d(e.getHours())},m:function(e){return e.getMinutes()},mm:function(e){return d(e.getMinutes())},s:function(e){return e.getSeconds()},ss:function(e){return d(e.getSeconds())},S:function(e){return Math.round(e.getMilliseconds()/100)},SS:function(e){return d(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return d(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+d(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)}},b={d:["\\d\\d?",function(e,t){e.day=t}],Do:["\\d\\d?"+o,function(e,t){e.day=parseInt(t,10)}],M:["\\d\\d?",function(e,t){e.month=t-1}],yy:["\\d\\d?",function(e,t){var i=+(""+(new Date).getFullYear()).substr(0,2);e.year=""+(t>68?i-1:i)+t}],h:["\\d\\d?",function(e,t){e.hour=t}],m:["\\d\\d?",function(e,t){e.minute=t}],s:["\\d\\d?",function(e,t){e.second=t}],yyyy:["\\d{4}",function(e,t){e.year=t}],S:["\\d",function(e,t){e.millisecond=100*t}],SS:["\\d{2}",function(e,t){e.millisecond=10*t}],SSS:["\\d{3}",function(e,t){e.millisecond=t}],D:["\\d\\d?",u],ddd:[o,u],MMM:[o,h("monthNamesShort")],MMMM:[o,h("monthNames")],a:[o,function(e,t,i){var n=t.toLowerCase();n===i.amPm[0]?e.isPm=!1:n===i.amPm[1]&&(e.isPm=!0)}],ZZ:["[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z",function(e,t){var i,n=(t+"").match(/([+-]|\d\d)/gi);n&&(i=60*n[1]+parseInt(n[2],10),e.timezoneOffset="+"===n[0]?i:-i)}]};b.dd=b.d,b.dddd=b.ddd,b.DD=b.D,b.mm=b.m,b.hh=b.H=b.HH=b.h,b.MM=b.M,b.ss=b.s,b.A=b.a,s.masks={default:"ddd MMM dd yyyy HH:mm:ss",shortDate:"M/D/yy",mediumDate:"MMM d, yyyy",longDate:"MMMM d, yyyy",fullDate:"dddd, MMMM d, yyyy",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},s.format=function(e,t,i){var n=i||s.i18n;if("number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date in fecha.format");t=s.masks[t]||t||s.masks.default;var r=[];return(t=(t=t.replace(l,function(e,t){return r.push(t),"@@@"})).replace(a,function(t){return t in g?g[t](e,n):t.slice(1,t.length-1)})).replace(/@@@/g,function(){return r.shift()})},s.parse=function(e,t,i){var n=i||s.i18n;if("string"!=typeof t)throw new Error("Invalid format in fecha.parse");if(t=s.masks[t]||t,e.length>1e3)return null;var r={},o=[],u=[];t=t.replace(l,function(e,t){return u.push(t),"@@@"});var c,h=(c=t,c.replace(/[|\\{()[^$+*?.-]/g,"\\$&")).replace(a,function(e){if(b[e]){var t=b[e];return o.push(t[1]),"("+t[0]+")"}return e});h=h.replace(/@@@/g,function(){return u.shift()});var d=e.match(new RegExp(h,"i"));if(!d)return null;for(var p=1;pe?u():!0!==t&&(r=setTimeout(n?function(){r=void 0}:u,void 0===n?e-o:e))}}},function(e,t){var i=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(e,t){var i=/^(attrs|props|on|nativeOn|class|style|hook)$/;function n(e,t){return function(){e&&e.apply(this,arguments),t&&t.apply(this,arguments)}}e.exports=function(e){return e.reduce(function(e,t){var r,s,a,o,l;for(a in t)if(r=e[a],s=t[a],r&&i.test(a))if("class"===a&&("string"==typeof r&&(l=r,e[a]=r={},r[l]=!0),"string"==typeof s&&(l=s,t[a]=s={},s[l]=!0)),"on"===a||"nativeOn"===a||"hook"===a)for(o in s)r[o]=n(r[o],s[o]);else if(Array.isArray(r))e[a]=r.concat(s);else if(Array.isArray(s))e[a]=[r].concat(s);else for(o in s)r[o]=s[o];else e[a]=t[a];return e},{})}},function(e,t){var i={}.hasOwnProperty;e.exports=function(e,t){return i.call(e,t)}},function(e,t,i){"use strict";t.__esModule=!0;var n,r=i(56),s=(n=r)&&n.__esModule?n:{default:n};t.default=s.default||function(e){for(var t=1;t0?n:i)(e)}},function(e,t,i){var n=i(28)("keys"),r=i(21);e.exports=function(e){return n[e]||(n[e]=r(e))}},function(e,t,i){var n=i(14),r=i(5),s=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,t){return s[e]||(s[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:i(20)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){e.exports={}},function(e,t,i){var n=i(10).f,r=i(7),s=i(13)("toStringTag");e.exports=function(e,t,i){e&&!r(e=i?e:e.prototype,s)&&n(e,s,{configurable:!0,value:t})}},function(e,t,i){t.f=i(13)},function(e,t,i){var n=i(5),r=i(14),s=i(20),a=i(33),o=i(10).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=s?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||o(t,e,{value:a.f(e)})}},function(e,t,i){var n=i(4),r=i(1);e.exports={throttle:n,debounce:r}},function(e,t,i){e.exports=!i(11)&&!i(16)(function(){return 7!=Object.defineProperty(i(37)("div"),"a",{get:function(){return 7}}).a})},function(e,t,i){var n=i(15),r=i(5).document,s=n(r)&&n(r.createElement);e.exports=function(e){return s?r.createElement(e):{}}},function(e,t,i){var n=i(7),r=i(12),s=i(62)(!1),a=i(27)("IE_PROTO");e.exports=function(e,t){var i,o=r(e),l=0,u=[];for(i in o)i!=a&&n(o,i)&&u.push(i);for(;t.length>l;)n(o,i=t[l++])&&(~s(u,i)||u.push(i));return u}},function(e,t,i){var n=i(40);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},function(e,t){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,t,i){var n=i(25);e.exports=function(e){return Object(n(e))}},function(e,t,i){"use strict";var n=i(20),r=i(23),s=i(43),a=i(9),o=i(31),l=i(69),u=i(32),c=i(72),h=i(13)("iterator"),d=!([].keys&&"next"in[].keys()),p=function(){return this};e.exports=function(e,t,i,f,m,v,g){l(i,t,f);var b,y,w,_=function(e){if(!d&&e in S)return S[e];switch(e){case"keys":case"values":return function(){return new i(this,e)}}return function(){return new i(this,e)}},x=t+" Iterator",C="values"==m,k=!1,S=e.prototype,D=S[h]||S["@@iterator"]||m&&S[m],$=D||_(m),E=m?C?_("entries"):$:void 0,T="Array"==t&&S.entries||D;if(T&&(w=c(T.call(new e)))!==Object.prototype&&w.next&&(u(w,x,!0),n||"function"==typeof w[h]||a(w,h,p)),C&&D&&"values"!==D.name&&(k=!0,$=function(){return D.call(this)}),n&&!g||!d&&!k&&S[h]||a(S,h,$),o[t]=$,o[x]=p,m)if(b={values:C?$:_("values"),keys:v?$:_("keys"),entries:E},g)for(y in b)y in S||s(S,y,b[y]);else r(r.P+r.F*(d||k),t,b);return b}},function(e,t,i){e.exports=i(9)},function(e,t,i){var n=i(17),r=i(70),s=i(29),a=i(27)("IE_PROTO"),o=function(){},l=function(){var e,t=i(37)("iframe"),n=s.length;for(t.style.display="none",i(71).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + + + + + diff --git a/src/main/resources/front/front/index.html.bak b/src/main/resources/front/front/index.html.bak new file mode 100644 index 0000000..1629e15 --- /dev/null +++ b/src/main/resources/front/front/index.html.bak @@ -0,0 +1,121 @@ + + + + + + + 首页 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/front/front/js/bootstrap.AMapPositionPicker.js b/src/main/resources/front/front/js/bootstrap.AMapPositionPicker.js new file mode 100644 index 0000000..46badfc --- /dev/null +++ b/src/main/resources/front/front/js/bootstrap.AMapPositionPicker.js @@ -0,0 +1,707 @@ +/** + * BootstrapAMapPositionPicker v0.8.3 + * @author: Kinegratii + */ +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery', 'AMap'], factory); + } else if (typeof exports === 'object') { + module.exports = factory(require('jquery'), require('AMap')); + } else { + if (typeof jQuery === 'undefined') { + throw 'AMapPositionPicker requires jQuery to be loaded first'; + } + if (typeof AMap == 'undefined') { + throw 'AMapPositionPicker requires AMap to be loaded first'; + } + factory(jQuery, AMap); + } +}(function ($, AMap) { + // Global tool functions + String.prototype.format = function (data) { + var result = this; + for (var key in data) { + if (data[key] != undefined) { + var reg = new RegExp("({" + key + "})", "g"); + result = result.replace(reg, data[key]); + } + } + return result; + }; + if (typeof String.prototype.startsWith != 'function') { + String.prototype.startsWith = function (prefix) { + return this.slice(0, prefix.length) === prefix; + }; + } + + function wrapFormat(formatter, data) { + if (typeof formatter == 'function') { + return formatter(data); + } else if (typeof formatter == 'string') { + return formatter.format(data); + } else { + return ''; + } + } + + // Data Structure Start + var Position = (function () { + function Position(longitude, latitude, address, label) { + this.longitude = longitude; + this.latitude = latitude; + this.address = address || ''; + this.label = label || ''; + } + + Position.prototype.isValid = function () { + return this.longitude != undefined && this.longitude != null && this.latitude != undefined && this.latitude != null; + }; + Position.prototype.copy = function (data) { + if (data == undefined) { + return new Position(this.longitude, this.latitude, this.address, this.label); + } else { + return new Position( + data.longitude || this.longitude, + data.latitude || this.latitude, + data.address || this.address, + data.label || this.label + ); + } + }; + Position.prototype.getDisplayString = function () { + if (this.label) { + return this.label; + } else { + return this.address; + } + }; + Position.fromOptions = function (options) { + if (options instanceof Position) { + return options; + } else { + return new Position(options.longitude, options.latitude, options.address, options.label); + } + }; + Position.empty = function () { + return new Position(null, null, "", ""); + }; + Position.validate = function (position) { + if (position) { + return position.isValid(); + } else { + return false; + } + }; + Position.validateLngLat = function (lnglatStr) { + var result = /^([+-]?(0?\d{1,2}(\.\d{1,6})?|1[0-7]?\d{1}(\.\d{1,6})?|180\.0{1,6}))[-;,]([-+]?([0-8]?\d{1}(\.\d{1,6})?|90(\.0{1,6})?))$/.exec(lnglatStr); + if (result) { + return {longitude: parseFloat(result[1]), latitude: parseFloat(result[5])}; + } else { + return null; + } + }; + Position.LNGLAT_FORMATTER = ['{longitude}-{latitude}', '{longitude};{latitude}', '{longitude},{latitude}']; + return Position; + }()); + + var Field = (function () { + var idIndex = -1; + + function generateSelectorId(selector) { + if (selector.startsWith('#')) { + return selector.substring(1); + } else { + idIndex += 1; + return 'id_ampp_i' + idIndex; + } + } + + function Field(options) { + this.name = options.name; + if (options.selector instanceof jQuery) { + this.$widget = options.selector; + this.created = true; + } + else if ($(options.selector).length > 0) { + this.$widget = $(options.selector); + this.created = true; + } else { + var inputHtml = ''.format({ + id: generateSelectorId(options.selector), + name: options.name + }); + this.$widget = $(inputHtml); + this.created = false; + } + this.formatter = function (position) { + return wrapFormat(options.formatter, position); + }; + } + + Field.prototype.render = function (position, hasPicked) { + + var v; + if (hasPicked) { + v = this.formatter(position); + } else { + v = ''; + } + console.log(v); + if (this.$widget.is('input') || this.$widget.is('textarea')) { + this.$widget.val(v); + } else if (this.$widget.is('div') || this.$widget.is('td') || this.$widget.is('p')) { + this.$widget.html(v); + } + }; + + return Field; + + }()); + + var FieldManager = (function () { + var fields = []; + + function FieldManager() { + fields = []; + } + + FieldManager.prototype.addField = function (field) { + fields.push(field); + }; + + FieldManager.prototype.render = function (position, hasPicked) { + for (var i = 0.; i < fields.length; i++) { + fields[i].render(position, hasPicked); + } + + }; + + return FieldManager; + + }()); + + // Data Structure End + + function buildBootstrapModalHTML() { + var toolsHtml = '
' + + '' + + '' + + '' + + '' + + '
'; + var searchPanelHtml = '
    '; + var mapPanelHtml = '
    ' + toolsHtml + searchPanelHtml + '
    '; + var modalHtml = '';//End of Modal + return modalHtml; + } + + var PICKER_CONTROLLER = (function () { + // Common Modal Controller for all elements + + // Context pick + var mPicker = null; + var mapObj = null; + + var isShowOrPickMode = false; + + var $modal = null, $map, $addressInput, $alert, $pickBtn, $locationBtn, $resetBtn, $clearBtn, $cancelBtn; + + // Current picked + var selectedMarker = null; + var cachePosition = Position.empty(); + // Search plugin + var $searchBtn, $searchPanel, $searchInput, $searchResultList; + var markerList = []; + + var geolocation; + + + var mapClickClickHandler = function (e) { + $alert.hide(); + selectMarker(createMarkerFromLnglat(e.lnglat.lng, e.lnglat.lat)); + }; + + function activate(picker) { + mPicker = picker; + showModal(); + } + + function deactivate() { + mPicker = null; + } + + function showModal() { + initializeController(); + initializePicker(); + + var p = mPicker.position(); + if (p && p.isValid()) { + selectMarker(createMarkerFromPosition(p)); + } else { + if (selectedMarker) { + selectedMarker.setMap(null); + } + $addressInput.val(''); + if (mPicker.opts.center.longitude && mPicker.opts.center.latitude) { + mapObj.setCenter(new AMap.LngLat(mPicker.opts.center.longitude, mPicker.opts.center.latitude)); + } + } + $modal.modal('show'); + } + + + function initializeController() { + // Initialize global options + if ($modal == null) { + $modal = $(buildBootstrapModalHTML()); + $(document.body).append($modal); + mapObj = new AMap.Map("idAMapPositionPickerMap", { + zoom: 15 + }); + AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.OverView'], + function () { + mapObj.addControl(new AMap.ToolBar()); + mapObj.addControl(new AMap.Scale()); + mapObj.addControl(new AMap.OverView({isOpen: true})); + }); + mapObj.on('click', mapClickClickHandler); + mapObj.plugin('AMap.Geolocation', function () { + geolocation = new AMap.Geolocation({ + enableHighAccuracy: true, + timeout: 3000, + maximumAge: 0, + convert: true, + panToLocation: true, + zoomToAccuracy: true, + markerOptions: {} + }); + }); + // DOM Selectors and events + $map = $("#idAMapPositionPickerMap"); + $pickBtn = $("#idAMapPositionPickerSelect"); + $locationBtn = $("#idAMapPositionPickerLocation"); + $resetBtn = $("#idAMapPositionPickerReset"); + $clearBtn = $("#idAMapPositionPickerClear"); + $addressInput = $("#idAMapPositionPickerAddress"); + $cancelBtn = $("#idAMapPositionPickerCancelBtn"); + $alert = $("#idAMapPositionPickerAlert"); + + $searchBtn = $("#idAMapPositionPickerSearch"); + $searchPanel = $("#idAMapPositionPickerSearchPanel"); + $searchInput = $("#idAMapPositionPickerSearchInput"); + $searchResultList = $("#idAMapPositionPickerSearchResult"); + + $pickBtn.on('click', pickPosition); + $resetBtn.on('click', resetInitialPosition); + $clearBtn.on('click', clearPosition); + $locationBtn.on('click', location); + $searchPanel.on('show.bs.collapse', function () { + $searchBtn.removeClass('btn-default').addClass('btn-primary'); + startSearch(); + }).on('hide.bs.collapse', function () { + $searchBtn.removeClass('btn-primary').addClass('btn-default'); + endSearch(); + }); + $('ul#idAMapPositionPickerSearchResult').on('click', 'li[data-poi-index]', highlightMarker); + } + } + + function initializePicker() { + toggleMode(false); + $map.css('height', mPicker.opts.height); + $modal.find('h4.modal-title').html(mPicker.opts.title); + $alert.hide(); + + } + + function location() { + $alert.hide(); + geolocation.getCurrentPosition(function (status, result) { + if (status == 'complete') { + selectMarker(createMarkerFromLnglat(result.position.lng, result.position.lat, result.formattedAddress)) + } else { + $alert.html(result.message).show(); + } + }); + } + + function clearPosition() { + cachePosition = Position.empty(); + if (selectedMarker != null) { + selectedMarker.setMap(null); + } + $addressInput.val(''); + } + + function resetInitialPosition() { + cachePosition = mPicker.getInitialPosition(); + if (Position.validate(cachePosition)) { + selectMarker(createMarkerFromPosition(cachePosition)); + } else if (selectedMarker != null) { + selectedMarker.setMap(null); + $addressInput.val(''); + } + } + + function isPositionPicked() { + return cachePosition.isValid(); + } + + function pickPosition() { + if (isShowOrPickMode) { + $modal.modal('hide'); + return; + } + var address = $addressInput.val(); + cachePosition.address = address; + + // Always use new position instance + var pickedPosition; + var hasPicked = isPositionPicked(); + if (hasPicked) { + pickedPosition = cachePosition.copy(); + } else { + pickedPosition = Position.empty(); + } + + if (mPicker.opts.required && !hasPicked) { + $alert.html(mPicker.opts.errorTip).show(); + } else { + $alert.hide(); + $modal.modal('hide'); + mPicker._onPickedCallback(pickedPosition, hasPicked); + } + } + + // Search Start + function highlightMarker(e) { + + var index = $(this).data('poiIndex'); + if (index < markerList.length) { + markerList[index].resumeMove(); + } + } + + function startSearch() { + mapObj.off('click', mapClickClickHandler); + $resetBtn.prop('disabled', true); + $clearBtn.prop('disabled', true); + $locationBtn.prop('disabled', true); + + $searchInput.on('keydown', function (e) { + var searchKeyword = $searchInput.val(); + if (e.which == '13' && searchKeyword.length > 0) { //Enter + AMap.service('AMap.PlaceSearch', function () { + var placeSearch = new AMap.PlaceSearch({ + pageSize: 6, + pageIndex: 1, + extensions: 'all' // return full address for POI + }); + // Search in the given bound + placeSearch.searchInBounds(searchKeyword, mapObj.getBounds(), function (status, result) { + $searchResultList.children('li').remove(); + for (var i in markerList) { + markerList[i].setMap(null); + } + markerList = []; + if (status == 'complete') { + for (var i in result.poiList.pois) { + var poi = result.poiList.pois[i]; + var li = $('
  • {name}
  • '.format({ + i: i, + name: poi.name + })); + $searchResultList.append(li); + // delay to username poi.address + var mMarker = createMarkerFromLnglat(poi.location.lng, poi.location.lat); + mMarker.on('click', function (e) { + selectMarker(e.target); + }); + markerList.push(mMarker); + } + mapObj.panTo(markerList[0].getPosition()); + } else { + $searchPanel.append('
  • 抱歉,暂无找到符合条件的结果。
  • '); + } + }); + }); + } + }); + } + + function endSearch() { + mapObj.on('click', mapClickClickHandler); + $resetBtn.prop('disabled', false); + $clearBtn.prop('disabled', false); + $locationBtn.prop('disabled', false); + $searchInput.val('').off('keydown'); + for (var i in markerList) { + markerList[i].setMap(null); + } + markerList = []; + $searchResultList.children('li').remove(); + } + + // Search End + + + // New tools + + function createMarkerFromPosition(position) { + var markerOpts = { + map: mapObj, + position: new AMap.LngLat(position.longitude, position.latitude), + topWhenClick: true, + offset: new AMap.Pixel(-5, -30), + animation: 'AMAP_ANIMATION_DROP', + extData: position + }; + if (position.address) { + markerOpts.title = position.address; + } + var marker = new AMap.Marker(markerOpts); + return marker; + } + + function createMarkerFromLnglat(longitude, latitude, address) { + var position = new Position(longitude, latitude, address, ""); + return createMarkerFromPosition(position); + } + + function selectMarker(marker) { + clearPosition(); + selectedMarker = marker; + var position = marker.getExtData(); + var lngLat = marker.getPosition(); + + cachePosition.longitude = position.longitude; + cachePosition.latitude = position.latitude; + if (!position.address) { + var geocoder; + mapObj.plugin(["AMap.Geocoder"], function () { + geocoder = new AMap.Geocoder({ + radius: 1000, + extensions: "base" + }); + AMap.event.addListener(geocoder, "complete", function (GeocoderResult) { + if (GeocoderResult["info"] == "OK") { + var address = GeocoderResult.regeocode.formattedAddress; + position.address = address; + selectedMarker.setExtData(position); + cachePosition.address = address; + $addressInput.val(address); + mapObj.panTo(lngLat); + } + }); + geocoder.getAddress(lngLat); + }); + } else { + cachePosition.address = position.address; + mapObj.panTo(lngLat); + $addressInput.val(position.address); + } + } + + // End Tool functions + + function toggleMode(isShowOrPick) { + isShowOrPickMode = isShowOrPick; + + $addressInput.prop('readonly', isShowOrPick); + if (isShowOrPick) { + mapObj.off('click', mapClickClickHandler); + $cancelBtn.hide(); + $alert.hide(); + $('#idAMapPositionPickerFloatContainer').hide(); + } else { + mapObj.on('click', mapClickClickHandler); + $('#idAMapPositionPickerFloatContainer').show(); + $cancelBtn.show(); + } + + } + + function showPositionInMap(position) { + initializeController(); + toggleMode(true); + clearPosition(); + var mMarker = createMarkerFromPosition(position); + mapObj.panTo(mMarker.getPosition()); + $modal.find('h4.modal-title').html(position.getDisplayString()); + $addressInput.val(position.address); + $modal.modal('show'); + + } + + return { + activate: activate, + deactivate: activate, + //Tools + showPositionInMap: showPositionInMap + } + })(); + + var aMapPositionPicker = function (element, options) { + + var picker = { + isFirstLoad: false, + initialPosition: null, + fieldManager: new FieldManager() + }; + var $inputEl = null; + + function triggerPickedComplete(mPosition, hasPicked) { + if (options.onPicked) { + options.onPicked(mPosition) + } else { + element.trigger('AMPP.PickCompleted', [mPosition, hasPicked]); + } + } + + // API for PICKER_CONTROLLER + picker._onPickedCallback = function (mPosition, hasPicked) { + element.data('position', mPosition); + $inputEl.val(wrapFormat(options.formatter, mPosition)); + picker.fieldManager.render(mPosition, hasPicked); + triggerPickedComplete(mPosition, hasPicked); + }; + + // Public API + + picker.getInitialPosition = function () { + return initialPosition; + }; + + picker.position = function () { + var s = JSON.stringify(element.data('position')); + return element.data('position'); + + }; + + // + if (element.is('input') || element.is('textarea')) { + $inputEl = element; + } else { + $inputEl = element.children('input'); + } + $inputEl.prop("readonly", true); + //Handle initial data + if (Position.LNGLAT_FORMATTER.indexOf(options.formatter)) { + var result = Position.validateLngLat($inputEl.val()); + if (result) { + options.value.longitude = parseFloat(result.longitude); + options.value.latitude = parseFloat(result.latitude); + } + } + var initialPosition = new Position(options.value.longitude, options.value.latitude, options.value.address, options.value.label); + element.data('position', initialPosition.copy()); + // Register events + element.on('click', function () { + //show modal/ + PICKER_CONTROLLER.activate(picker); + }); + // 处理fields + var fields = options.fields || []; + for (var i in fields) { + var iEl = new Field(fields[i] || {}); + if (!iEl.created) { + $inputEl.after(iEl.$widget); + } + picker.fieldManager.addField(iEl); + } + + picker.opts = options; + return picker; + }; + + $.fn.AMapPositionPicker = function (options) { + options = options || {}; + var args = Array.prototype.slice.call(arguments, 1), + isInstance = true, + thisMethods = [], //可级联函数列表 + returnValue; + if (typeof options == 'object') { + return this.each(function () { + var $this = $(this); + if (!$this.data('AMapPositionPicker')) { + var dataOptions = { + formatter: $this.data('formatter'), + title: $this.data('title'), + errorTip: $this.data('errorTip'), + height: $this.data('height'), + required: $this.data('required'), + value: { + longitude: $this.data('valueLongitude'), + latitude: $this.data('valueLatitude'), + address: $this.data('valueAddress'), + label: $this.data('valueLabel') + }, + center: { + longitude: $this.data('centerLongitude'), + latitude: $this.data('centerLatitude') + } + }; + options = $.extend(true, {}, $.fn.AMapPositionPicker.defaults, dataOptions, options); + $this.data('AMapPositionPicker', aMapPositionPicker($this, options)); + } + }); + } else if (typeof options == 'string') { + this.each(function () { + var $this = $(this), + instance = $this.data('AMapPositionPicker'); + if (!instance) { + throw new Error('AMapPositionPicker("' + options + '") method was called on an element that is not using AMapPositionPicker'); + } + returnValue = instance[options].apply(instance, args); + isInstance = returnValue === instance; + }); + if (isInstance || $.inArray(options, thisMethods) > -1) { + return this; + } + + return returnValue; + } + throw new TypeError('Invalid arguments for AMapPositionPicker: ' + options); + }; + $.fn.AMapPositionPicker.defaults = { + formatter: '{address}', + onPicked: null, + value: { + longitude: null, + latitude: null, + address: null + }, + required: true, + title: '请选择地址', + errorTip: '请选择地址', + height: '500px', + fields: [] + }; + $.extend({AMapPositionPicker: {}}); + $.extend($.AMapPositionPicker, { + showPositionInMap: function (position) { + PICKER_CONTROLLER.showPositionInMap(Position.fromOptions(position)); + }, + pluginVersion: '0.8.3' + }); + $(function () { + $('[data-provide="AMapPositionPicker"]').AMapPositionPicker(); + }); +})) +; \ No newline at end of file diff --git a/src/main/resources/front/front/js/bootstrap.min.js b/src/main/resources/front/front/js/bootstrap.min.js new file mode 100644 index 0000000..c4c0d1f --- /dev/null +++ b/src/main/resources/front/front/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + diff --git a/src/main/resources/front/front/modules/tinymce/tinymce.js b/src/main/resources/front/front/modules/tinymce/tinymce.js new file mode 100644 index 0000000..c0a89b6 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce.js @@ -0,0 +1,209 @@ +// 菜单显示异常修改tinymce/skins/ui/oxide/skin.min.css:96 .tox-silver-sink的z-index值 +// http://tinymce.ax-z.cn/ 中文文档 + +layui.define(['jquery'],function (exports) { + var $ = layui.$ + + var modFile = layui.cache.modules['tinymce']; + + var modPath = modFile.substr(0, modFile.lastIndexOf('.')) + + var setter = layui.setter || {}//兼容layuiadmin + + var response = setter.response || {}//兼容layuiadmin + + // ---------------- 以上代码无需修改 ---------------- + + var settings = { + base_url: modPath + , images_upload_url: '/rest/upload'//图片上传接口,可在option传入,也可在这里修改,option的值优先 + , language: 'zh_CN'//语言,可在option传入,也可在这里修改,option的值优先 + , response: {//后台返回数据格式设置 + statusName: response.statusName || 'code'//返回状态字段 + , msgName: response.msgName || 'msg'//返回消息字段 + , dataName: response.dataName || 'data'//返回的数据 + , statusCode: response.statusCode || { + ok: 0//数据正常 + } + } + , success: function (res, succFun, failFun) {//图片上传完成回调 根据自己需要修改 + if (res[this.response.statusName] == this.response.statusCode.ok) { + succFun(res[this.response.dataName]); + } else { + failFun(res[this.response.msgName]); + } + } + }; + + // ---------------- 以下代码无需修改 ---------------- + + var t = {}; + + //初始化 + t.render = function (option,callback) { + + var admin = layui.admin || {} + + option.base_url = option.base_url ? option.base_url : settings.base_url + + option.language = option.language ? option.language : settings.language + + option.selector = option.selector ? option.selector : option.elem + + option.quickbars_selection_toolbar = option.quickbars_selection_toolbar ? option.quickbars_selection_toolbar : 'cut copy | bold italic underline strikethrough ' + + option.plugins = option.plugins ? option.plugins : 'quickbars print preview searchreplace autolink fullscreen image link media codesample table charmap hr advlist lists wordcount imagetools indent2em'; + + option.toolbar = option.toolbar ? option.toolbar : 'undo redo | forecolor backcolor bold italic underline strikethrough | indent2em alignleft aligncenter alignright alignjustify outdent indent | link bullist numlist image table codesample | formatselect fontselect fontsizeselect'; + + option.resize = false; + + option.elementpath = false + + option.branding = false; + + option.contextmenu_never_use_native = true; + + option.menubar = option.menubar ? option.menubar : 'file edit insert format table'; + + option.images_upload_url = option.images_upload_url ? option.images_upload_url : settings.images_upload_url; + + option.images_upload_handler = option.images_upload_handler? option.images_upload_handler : function (blobInfo, succFun, failFun) { + + var formData = new FormData(); + + formData.append('target', 'edit'); + + formData.append('edit', blobInfo.blob()); + + var ajaxOpt = { + + url: option.images_upload_url, + + dataType: 'json', + + type: 'POST', + + data: formData, + + processData: false, + + contentType: false, + + success: function (res) { + + settings.success(res, succFun, failFun) + + }, + error: function (res) { + + failFun("网络错误:" + res.status); + + } + }; + + if (typeof admin.req == 'function') { + + admin.req(ajaxOpt); + + } else { + + $.ajax(ajaxOpt); + + } + } + + option.menu = option.menu ? option.menu : { + file: {title: '文件', items: 'newdocument | print preview fullscreen | wordcount'}, + edit: {title: '编辑', items: 'undo redo | cut copy paste pastetext selectall | searchreplace'}, + format: { + title: '格式', + items: 'bold italic underline strikethrough superscript subscript | formats | forecolor backcolor | removeformat' + }, + table: {title: '表格', items: 'inserttable tableprops deletetable | cell row column'}, + }; + if(typeof tinymce == 'undefined'){ + + $.ajax({//获取插件 + url: option.base_url + '/tinymce.js', + + dataType: 'script', + + cache: true, + + async: false, + }); + + } + + layui.sessionData('layui-tinymce',{ + + key:option.selector, + + value:option + + }) + + tinymce.init(option); + + if(typeof callback == 'function'){ + + callback.call(option) + + } + + return tinymce.activeEditor; + }; + + t.init = t.render + + // 获取ID对应的编辑器对象 + t.get = (elem) => { + + if(elem && /^#|\./.test(elem)){ + + var id = elem.substr(1) + + var edit = tinymce.editors[id]; + + if(!edit){ + + return console.error("编辑器未加载") + + } + + return edit + + } else { + + return console.error("elem错误") + + } + } + + //重载 + t.reload = (option,callback) => { + option = option || {} + + var edit = t.get(option.elem); + + var optionCache = layui.sessionData('layui-tinymce')[option.elem] + + edit.destroy() + + $.extend(optionCache,option) + + tinymce.init(optionCache) + + if(typeof callback == 'function'){ + + callback.call(optionCache) + + } + + return tinymce.activeEditor; + } + + + exports('tinymce', t); +}); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/jquery.tinymce.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/jquery.tinymce.min.js new file mode 100644 index 0000000..5a6ef56 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/jquery.tinymce.min.js @@ -0,0 +1,91 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +/** + * Jquery integration plugin. + * + * @class tinymce.core.JqueryIntegration + * @private + */ +!function(){var f,c,u,p,d,s=[];d="undefined"!=typeof global?global:window,p=d.jQuery;function v(){ +// Reference to tinymce needs to be lazily evaluated since tinymce +// might be loaded through the compressor or other means +return d.tinymce}p.fn.tinymce=function(o){var e,t,i,l=this,r=""; +// No match then just ignore the call +if(!l.length)return l; +// Get editor instance +if(!o)return v()?v().get(l[0].id):null;l.css("visibility","hidden");function n(){var a=[],c=0; +// Apply patches to the jQuery object, only once +u||(m(),u=!0), +// Create an editor instance for each matched node +l.each(function(e,t){var n,i=t.id,r=o.oninit; +// Generate unique id for target element if needed +i||(t.id=i=v().DOM.uniqueId()), +// Only init the editor once +v().get(i)||( +// Create editor instance and render it +n=v().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), +// Run this if the oninit setting is defined +// this logic will fire the oninit callback ones each +// matched editor instance is initialized +r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:v().resolve(t.replace(/\.\w+$/,"")),t=v().resolve(t)), +// Call the oninit function with the object +t.apply(e||v(),a))}))}), +// Render the editor instances in a separate loop since we +// need to have the full editors array used in the onInit calls +p.each(a,function(e,t){t.render()})} +// Load TinyMCE on demand, if we need to +if(d.tinymce||c||!(e=o.script_url)) +// Delay the init call until tinymce is loaded +1===c?s.push(n):n();else{c=1,t=e.substring(0,e.lastIndexOf("/")), +// Check if it's a dev/src version they want to load then +// make sure that all plugins, themes etc are loaded in source mode as well +-1!=e.indexOf(".min")&&(r=".min"), +// Setup tinyMCEPreInit object this will later be used by the TinyMCE +// core script to locate other resources like CSS files, dialogs etc +// You can also predefined a tinyMCEPreInit object and then it will use that instead +d.tinymce=d.tinyMCEPreInit||{base:t,suffix:r}, +// url contains gzip then we assume it's a compressor +-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), +// Check if compressor script is already loaded otherwise setup a basic one +d.tinyMCE_GZ||(d.tinyMCE_GZ={start:function(){function n(e){v().ScriptLoader.markDone(v().baseURI.toAbsolute(e))} +// Add core languages +n("langs/"+i+".js"), +// Add themes with languages +n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), +// Add plugins with languages +p.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}}));var a=document.createElement("script");a.type="text/javascript",a.onload=a.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(a.readyState)||(v().dom.Event.domLoaded=1,c=2, +// Execute callback after mainscript has been loaded and before the initialization occurs +o.script_loaded&&o.script_loaded(),n(),p.each(s,function(e,t){t()}))},a.src=e,document.body.appendChild(a)}return l}, +// Add :tinymce pseudo selector this will select elements that has been converted into editor instances +// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. +p.extend(p.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in d&&(t=v().get(e.id))&&t.editorManager===v())}}); +// This function patches internal jQuery functions so that if +// you for example remove an div element containing an editor it's +// automatically destroyed by the TinyMCE API +var m=function(){function r(e){ +// If the function is remove +"remove"===e&&this.each(function(e,t){var n=u(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=v().get(t.id.replace(/_parent$/,""));n&&n.remove()})}function o(i){var e,t=this; +// Handle set value +/*jshint eqnull:true */if(null!=i)r.call(t), +// Saves the contents before get/set value of textarea/div +t.each(function(e,t){var n;(n=v().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(p(t),r)}),i}}), +// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe +p.each(["append","prepend"],function(e,t){var n=s[t]=p.fn[t],r="prepend"===t;p.fn[t]=function(i){var e=this;return l(e)?i!==f?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=u(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), +// Makes sure that the editor instance gets properly destroyed when the parent element is removed +p.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=p.fn[t];p.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=p.fn.attr, +// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents +p.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!l(n))return s.attr.apply(n,i);if(t!==f)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining +var r=n[0],a=u(r);return a?a.getContent({save:!0}):s.attr.apply(p(r),i)}}}(); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/langs/readme.md b/src/main/resources/front/front/modules/tinymce/tinymce/langs/readme.md new file mode 100644 index 0000000..a52bf03 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/langs/zh_CN.js b/src/main/resources/front/front/modules/tinymce/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..89b106c --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/langs/zh_CN.js @@ -0,0 +1,419 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/license.txt b/src/main/resources/front/front/modules/tinymce/tinymce/license.txt new file mode 100644 index 0000000..b17fc90 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.js new file mode 100644 index 0000000..c31e5ca --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,297 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + var Actions = { applyListFormat: applyListFormat }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + var Commands = { register: register }; + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + var Settings = { + getNumberStyles: getNumberStyles, + getBulletStyles: getBulletStyles + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + var style = editor.dom.getStyle(listElm, 'listStyleType'); + return Option.from(style); + }; + var ListUtils = { + isTableCellNode: isTableCellNode, + isListNode: isListNode, + getSelectedStyleType: getSelectedStyleType + }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var isWithinList = function (editor, e, nodeName) { + var tableCellIndex = findIndex(e.parents, ListUtils.isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, ListUtils.isListNode(editor)); + return lists.length > 0 && lists[0].nodeName === nodeName; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addSplitButton(id, { + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + presets: 'listpreview', + columns: 3, + fetch: function (callback) { + var items = global$1.map(styles, function (styleValue) { + var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + var itemValue = styleValue === 'default' ? '' : styleValue; + var displayText = styleValueToText(styleValue); + return { + type: 'choiceitem', + value: itemValue, + icon: 'list-' + iconStyle + '-' + iconName, + text: displayText + }; + }); + callback(items); + }, + onAction: function () { + return editor.execCommand(cmd); + }, + onItemAction: function (splitButtonApi, value) { + Actions.applyListFormat(editor, nodeName, value); + }, + select: function (value) { + var listStyleType = ListUtils.getSelectedStyleType(editor); + return listStyleType.map(function (listStyle) { + return value === listStyle; + }).getOr(false); + }, + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addToggleButton(id, { + active: false, + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }, + onAction: function () { + return editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 0) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', Settings.getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', Settings.getBulletStyles(editor)); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('advlist', function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$1.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + if (hasPlugin(editor, 'lists')) { + Buttons.register(editor); + Commands.register(editor); + } + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 0000000..a07d3e3 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function n(){}function o(n){return function(){return n}}function t(){return d}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=function(n,t,e){var r="UL"===t?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===e?null:{"list-style-type":e})},i=function(e){e.addCommand("ApplyUnorderedListStyle",function(n,t){l(e,"UL",t["list-style-type"])}),e.addCommand("ApplyOrderedListStyle",function(n,t){l(e,"OL",t["list-style-type"])})},c=function(n){var t=n.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");return t?t.split(/[ ,]/):[]},s=function(n){var t=n.getParam("advlist_bullet_styles","default,circle,square");return t?t.split(/[ ,]/):[]},f=o(!1),a=o(!0),d=(e={fold:function(n,t){return n()},is:f,isSome:f,isNone:a,getOr:m,getOrThunk:p,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(undefined),or:m,orThunk:p,map:t,each:n,bind:t,exists:f,forall:a,filter:t,equals:g,equals_:g,toArray:function(){return[]},toString:o("none()")},Object.freeze&&Object.freeze(e),e);function g(n){return n.isNone()}function p(n){return n()}function m(n){return n}function y(n,t,e){var r=function(n,t){for(var e=0;e len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var rng, end, start, endContainer, bookmark, text, matches, prev, len, rngText; + var autoLinkPattern = Settings.getAutoLinkPattern(editor); + var defaultLinkTarget = Settings.getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + rng = editor.selection.getRng(true).cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + matches = text.match(autoLinkPattern); + var protocol = Settings.getDefaultLinkProtocol(editor); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = protocol + '://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget !== false) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.browser.isIE()) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + var Keys = { setup: setup }; + + function Plugin () { + global.add('autolink', function (editor) { + Keys.setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autolink/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 0000000..76daf67 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function i(t,e){if(e<0&&(e=0),3===t.nodeType){var n=t.data.length;n Settings.getAutoResizeMinHeight(editor)) { + resizeHeight = contentHeight + chromeHeight; + } + var maxHeight = Settings.getAutoResizeMaxHeight(editor); + if (maxHeight && resizeHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + Events.fireResizeEditor(editor); + if (global$1.browser.isSafari() && global$1.mac) { + var win = editor.getWin(); + win.scrollTo(win.pageXOffset, win.pageYOffset); + } + if (editor.hasFocus()) { + editor.selection.scrollIntoView(editor.selection.getNode()); + } + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding = Settings.getAutoResizeOverflowPadding(editor); + var dom = editor.dom; + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + }); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () { + resize(editor, oldSize); + }); + if (Settings.shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + var Resize = { + setup: setup, + resize: resize + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + Resize.resize(editor, oldSize); + }); + }; + var Commands = { register: register }; + + function Plugin () { + global.add('autoresize', function (editor) { + if (!editor.settings.hasOwnProperty('resize')) { + editor.settings.resize = false; + } + if (!editor.inline) { + var oldSize = Cell(0); + Commands.register(editor, oldSize); + Resize.setup(editor, oldSize); + } + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autoresize/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000..f4a1c12 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function d(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))}function h(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o}var i=function(e){function t(){return n}var n=e;return{get:t,set:function(e){n=e},clone:function(){return i(t())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),p=function(e){return e.fire("ResizeEditor")},y=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},z=function(e){return e.getParam("max_height",0,"number")},n=function(e){return e.getParam("autoresize_overflow_padding",1,"number")},b=function(e){return e.getParam("autoresize_bottom_margin",50,"number")},o=function(e){return e.getParam("autoresize_on_init",!0,"boolean")},u=function(e,t,n,i,o){r.setEditorTimeout(e,function(){C(e,t),n--?u(e,t,n,i,o):o&&o()},i)},C=function(e,t){var n,i,o,r=e.dom,u=e.getDoc();if(u)if(function(e){return e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()}(e))d(e,!0);else{var s=u.documentElement,a=b(e);i=y(e);var f=h(r,s,"margin-top",!0),c=h(r,s,"margin-bottom",!0);(o=s.offsetHeight+f+c+a)<0&&(o=0);var g=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;o+g>y(e)&&(i=o+g);var l=z(e);if(l&&l]*>((\xA0| |[ \t]|]*>)+?|)|
    $', 'i').test(html); + }; + var hasDraft = function (editor) { + var time = parseInt(global$2.getItem(getAutoSavePrefix(editor) + 'time'), 10) || 0; + if (new Date().getTime() - time > getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$2.removeItem(prefix + 'draft'); + global$2.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$2.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$2.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor, started) { + var interval = getAutoSaveInterval(editor); + if (!started.get()) { + global$1.setInterval(function () { + if (!editor.removed) { + storeDraft(editor); + } + }, interval); + started.set(true); + } + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + + var get = function (editor) { + return { + hasDraft: curry(hasDraft, editor), + storeDraft: curry(storeDraft, editor), + restoreDraft: curry(restoreDraft, editor), + removeDraft: curry(removeDraft, editor), + isEmpty: curry(isEmpty, editor) + }; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var setup = function (editor) { + editor.editorManager.on('BeforeUnload', function (e) { + var msg; + global$3.each(global$4.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + if (msg) { + e.preventDefault(); + e.returnValue = msg; + } + }); + }; + + var makeSetupHandler = function (editor, started) { + return function (api) { + api.setDisabled(!hasDraft(editor)); + var editorEventCallback = function () { + return api.setDisabled(!hasDraft(editor)); + }; + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return function () { + return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + }; + }; + }; + var register = function (editor, started) { + startStoreDraft(editor, started); + editor.ui.registry.addButton('restoredraft', { + tooltip: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + editor.ui.registry.addMenuItem('restoredraft', { + text: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + }; + + function Plugin () { + global.add('autosave', function (editor) { + var started = Cell(false); + setup(editor); + register(editor, started); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autosave/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 0000000..c9bf058 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(n){"use strict";function r(t,e){var n=t||e,r=/^(\d+)([ms]?)$/.exec(""+n);return(r[2]?{s:1e3,m:6e4}[r[2]]:1)*parseInt(n,10)}function o(t){var e=t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-");return e=(e=(e=(e=e.replace(/\{path\}/g,n.document.location.pathname)).replace(/\{query\}/g,n.document.location.search)).replace(/\{hash\}/g,n.document.location.hash)).replace(/\{id\}/g,t.id)}function a(t,e){var n=t.settings.forced_root_block;return""===(e=d.trim(void 0===e?t.getBody().innerHTML:e))||new RegExp("^<"+n+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
    $","i").test(e)}function i(t){var e=parseInt(v.getItem(o(t)+"time"),10)||0;return!((new Date).getTime()-e>function(t){return r(t.settings.autosave_retention,"20m")}(t))||(g(t,!1),!1)}function u(t){var e=o(t);!a(t)&&t.isDirty()&&(v.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),v.setItem(e+"time",(new Date).getTime().toString()),function(t){t.fire("StoreDraft")}(t))}function s(t){var e=o(t);i(t)&&(t.setContent(v.getItem(e+"draft"),{format:"raw"}),function(t){t.fire("RestoreDraft")}(t))}function c(t,e){var n=function(t){return r(t.settings.autosave_interval,"30s")}(t);e.get()||(m.setInterval(function(){t.removed||u(t)},n),e.set(!0))}function f(t){t.undoManager.transact(function(){s(t),g(t)}),t.focus()}var l=function(t){function e(){return n}var n=t;return{get:e,set:function(t){n=t},clone:function(){return l(e())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,e){var n=o(t);v.removeItem(n+"draft"),v.removeItem(n+"time"),!1!==e&&function(t){t.fire("RemoveDraft")}(t)};function y(r){for(var o=[],t=1;t(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
    /gi, '\n'); + rep(//gi, '\n'); + rep(/
    /gi, '\n'); + rep(/

    /gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
    '); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '$2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + var Convert = { + html2bbcode: html2bbcode, + bbcode2html: bbcode2html + }; + + function Plugin () { + global.add('bbcode', function (editor) { + editor.on('BeforeSetContent', function (e) { + e.content = Convert.bbcode2html(e.content); + }); + editor.on('PostProcess', function (e) { + if (e.set) { + e.content = Convert.bbcode2html(e.content); + } + if (e.get) { + e.content = Convert.html2bbcode(e.content); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/bbcode/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 0000000..17c247e --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);function o(o,e){t=t.replace(o,e)}return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
    /gi,"\n"),o(//gi,"\n"),o(/
    /gi,"\n"),o(/

    /gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t},i=function(t){t=e.trim(t);function o(o,e){t=t.replace(o,e)}return o(/\n/gi,"
    "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};!function n(){o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=i(o.content)),o.get&&(o.content=t(o.content))})})}()}(); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.js new file mode 100644 index 0000000..73e547b --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1695 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + var Events = { fireInsertCustomChar: fireInsertCustomChar }; + + var insertChar = function (editor, chr) { + var evtChr = Events.fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + var Actions = { insertChar: insertChar }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.settings.charmap; + }; + var getCharMapAppend = function (editor) { + return editor.settings.charmap_append; + }; + var Settings = { + getCharMap: getCharMap, + getCharMapAppend: getCharMapAppend + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray = isType('array'); + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var isArray$1 = global$1.isArray; + var UserDefined = 'User Defined'; + var getDefaultCharMap = function () { + return [ + { + name: 'Currency', + characters: [ + [ + 36, + 'dollar sign' + ], + [ + 162, + 'cent sign' + ], + [ + 8364, + 'euro sign' + ], + [ + 163, + 'pound sign' + ], + [ + 165, + 'yen sign' + ], + [ + 164, + 'currency sign' + ], + [ + 8352, + 'euro-currency sign' + ], + [ + 8353, + 'colon sign' + ], + [ + 8354, + 'cruzeiro sign' + ], + [ + 8355, + 'french franc sign' + ], + [ + 8356, + 'lira sign' + ], + [ + 8357, + 'mill sign' + ], + [ + 8358, + 'naira sign' + ], + [ + 8359, + 'peseta sign' + ], + [ + 8360, + 'rupee sign' + ], + [ + 8361, + 'won sign' + ], + [ + 8362, + 'new sheqel sign' + ], + [ + 8363, + 'dong sign' + ], + [ + 8365, + 'kip sign' + ], + [ + 8366, + 'tugrik sign' + ], + [ + 8367, + 'drachma sign' + ], + [ + 8368, + 'german penny symbol' + ], + [ + 8369, + 'peso sign' + ], + [ + 8370, + 'guarani sign' + ], + [ + 8371, + 'austral sign' + ], + [ + 8372, + 'hryvnia sign' + ], + [ + 8373, + 'cedi sign' + ], + [ + 8374, + 'livre tournois sign' + ], + [ + 8375, + 'spesmilo sign' + ], + [ + 8376, + 'tenge sign' + ], + [ + 8377, + 'indian rupee sign' + ], + [ + 8378, + 'turkish lira sign' + ], + [ + 8379, + 'nordic mark sign' + ], + [ + 8380, + 'manat sign' + ], + [ + 8381, + 'ruble sign' + ], + [ + 20870, + 'yen character' + ], + [ + 20803, + 'yuan character' + ], + [ + 22291, + 'yuan character, in hong kong and taiwan' + ], + [ + 22278, + 'yen/yuan character variant one' + ] + ] + }, + { + name: 'Text', + characters: [ + [ + 169, + 'copyright sign' + ], + [ + 174, + 'registered sign' + ], + [ + 8482, + 'trade mark sign' + ], + [ + 8240, + 'per mille sign' + ], + [ + 181, + 'micro sign' + ], + [ + 183, + 'middle dot' + ], + [ + 8226, + 'bullet' + ], + [ + 8230, + 'three dot leader' + ], + [ + 8242, + 'minutes / feet' + ], + [ + 8243, + 'seconds / inches' + ], + [ + 167, + 'section sign' + ], + [ + 182, + 'paragraph sign' + ], + [ + 223, + 'sharp s / ess-zed' + ] + ] + }, + { + name: 'Quotations', + characters: [ + [ + 8249, + 'single left-pointing angle quotation mark' + ], + [ + 8250, + 'single right-pointing angle quotation mark' + ], + [ + 171, + 'left pointing guillemet' + ], + [ + 187, + 'right pointing guillemet' + ], + [ + 8216, + 'left single quotation mark' + ], + [ + 8217, + 'right single quotation mark' + ], + [ + 8220, + 'left double quotation mark' + ], + [ + 8221, + 'right double quotation mark' + ], + [ + 8218, + 'single low-9 quotation mark' + ], + [ + 8222, + 'double low-9 quotation mark' + ], + [ + 60, + 'less-than sign' + ], + [ + 62, + 'greater-than sign' + ], + [ + 8804, + 'less-than or equal to' + ], + [ + 8805, + 'greater-than or equal to' + ], + [ + 8211, + 'en dash' + ], + [ + 8212, + 'em dash' + ], + [ + 175, + 'macron' + ], + [ + 8254, + 'overline' + ], + [ + 164, + 'currency sign' + ], + [ + 166, + 'broken bar' + ], + [ + 168, + 'diaeresis' + ], + [ + 161, + 'inverted exclamation mark' + ], + [ + 191, + 'turned question mark' + ], + [ + 710, + 'circumflex accent' + ], + [ + 732, + 'small tilde' + ], + [ + 176, + 'degree sign' + ], + [ + 8722, + 'minus sign' + ], + [ + 177, + 'plus-minus sign' + ], + [ + 247, + 'division sign' + ], + [ + 8260, + 'fraction slash' + ], + [ + 215, + 'multiplication sign' + ], + [ + 185, + 'superscript one' + ], + [ + 178, + 'superscript two' + ], + [ + 179, + 'superscript three' + ], + [ + 188, + 'fraction one quarter' + ], + [ + 189, + 'fraction one half' + ], + [ + 190, + 'fraction three quarters' + ] + ] + }, + { + name: 'Mathematical', + characters: [ + [ + 402, + 'function / florin' + ], + [ + 8747, + 'integral' + ], + [ + 8721, + 'n-ary sumation' + ], + [ + 8734, + 'infinity' + ], + [ + 8730, + 'square root' + ], + [ + 8764, + 'similar to' + ], + [ + 8773, + 'approximately equal to' + ], + [ + 8776, + 'almost equal to' + ], + [ + 8800, + 'not equal to' + ], + [ + 8801, + 'identical to' + ], + [ + 8712, + 'element of' + ], + [ + 8713, + 'not an element of' + ], + [ + 8715, + 'contains as member' + ], + [ + 8719, + 'n-ary product' + ], + [ + 8743, + 'logical and' + ], + [ + 8744, + 'logical or' + ], + [ + 172, + 'not sign' + ], + [ + 8745, + 'intersection' + ], + [ + 8746, + 'union' + ], + [ + 8706, + 'partial differential' + ], + [ + 8704, + 'for all' + ], + [ + 8707, + 'there exists' + ], + [ + 8709, + 'diameter' + ], + [ + 8711, + 'backward difference' + ], + [ + 8727, + 'asterisk operator' + ], + [ + 8733, + 'proportional to' + ], + [ + 8736, + 'angle' + ] + ] + }, + { + name: 'Extended Latin', + characters: [ + [ + 192, + 'A - grave' + ], + [ + 193, + 'A - acute' + ], + [ + 194, + 'A - circumflex' + ], + [ + 195, + 'A - tilde' + ], + [ + 196, + 'A - diaeresis' + ], + [ + 197, + 'A - ring above' + ], + [ + 256, + 'A - macron' + ], + [ + 198, + 'ligature AE' + ], + [ + 199, + 'C - cedilla' + ], + [ + 200, + 'E - grave' + ], + [ + 201, + 'E - acute' + ], + [ + 202, + 'E - circumflex' + ], + [ + 203, + 'E - diaeresis' + ], + [ + 274, + 'E - macron' + ], + [ + 204, + 'I - grave' + ], + [ + 205, + 'I - acute' + ], + [ + 206, + 'I - circumflex' + ], + [ + 207, + 'I - diaeresis' + ], + [ + 298, + 'I - macron' + ], + [ + 208, + 'ETH' + ], + [ + 209, + 'N - tilde' + ], + [ + 210, + 'O - grave' + ], + [ + 211, + 'O - acute' + ], + [ + 212, + 'O - circumflex' + ], + [ + 213, + 'O - tilde' + ], + [ + 214, + 'O - diaeresis' + ], + [ + 216, + 'O - slash' + ], + [ + 332, + 'O - macron' + ], + [ + 338, + 'ligature OE' + ], + [ + 352, + 'S - caron' + ], + [ + 217, + 'U - grave' + ], + [ + 218, + 'U - acute' + ], + [ + 219, + 'U - circumflex' + ], + [ + 220, + 'U - diaeresis' + ], + [ + 362, + 'U - macron' + ], + [ + 221, + 'Y - acute' + ], + [ + 376, + 'Y - diaeresis' + ], + [ + 562, + 'Y - macron' + ], + [ + 222, + 'THORN' + ], + [ + 224, + 'a - grave' + ], + [ + 225, + 'a - acute' + ], + [ + 226, + 'a - circumflex' + ], + [ + 227, + 'a - tilde' + ], + [ + 228, + 'a - diaeresis' + ], + [ + 229, + 'a - ring above' + ], + [ + 257, + 'a - macron' + ], + [ + 230, + 'ligature ae' + ], + [ + 231, + 'c - cedilla' + ], + [ + 232, + 'e - grave' + ], + [ + 233, + 'e - acute' + ], + [ + 234, + 'e - circumflex' + ], + [ + 235, + 'e - diaeresis' + ], + [ + 275, + 'e - macron' + ], + [ + 236, + 'i - grave' + ], + [ + 237, + 'i - acute' + ], + [ + 238, + 'i - circumflex' + ], + [ + 239, + 'i - diaeresis' + ], + [ + 299, + 'i - macron' + ], + [ + 240, + 'eth' + ], + [ + 241, + 'n - tilde' + ], + [ + 242, + 'o - grave' + ], + [ + 243, + 'o - acute' + ], + [ + 244, + 'o - circumflex' + ], + [ + 245, + 'o - tilde' + ], + [ + 246, + 'o - diaeresis' + ], + [ + 248, + 'o slash' + ], + [ + 333, + 'o macron' + ], + [ + 339, + 'ligature oe' + ], + [ + 353, + 's - caron' + ], + [ + 249, + 'u - grave' + ], + [ + 250, + 'u - acute' + ], + [ + 251, + 'u - circumflex' + ], + [ + 252, + 'u - diaeresis' + ], + [ + 363, + 'u - macron' + ], + [ + 253, + 'y - acute' + ], + [ + 254, + 'thorn' + ], + [ + 255, + 'y - diaeresis' + ], + [ + 563, + 'y - macron' + ], + [ + 913, + 'Alpha' + ], + [ + 914, + 'Beta' + ], + [ + 915, + 'Gamma' + ], + [ + 916, + 'Delta' + ], + [ + 917, + 'Epsilon' + ], + [ + 918, + 'Zeta' + ], + [ + 919, + 'Eta' + ], + [ + 920, + 'Theta' + ], + [ + 921, + 'Iota' + ], + [ + 922, + 'Kappa' + ], + [ + 923, + 'Lambda' + ], + [ + 924, + 'Mu' + ], + [ + 925, + 'Nu' + ], + [ + 926, + 'Xi' + ], + [ + 927, + 'Omicron' + ], + [ + 928, + 'Pi' + ], + [ + 929, + 'Rho' + ], + [ + 931, + 'Sigma' + ], + [ + 932, + 'Tau' + ], + [ + 933, + 'Upsilon' + ], + [ + 934, + 'Phi' + ], + [ + 935, + 'Chi' + ], + [ + 936, + 'Psi' + ], + [ + 937, + 'Omega' + ], + [ + 945, + 'alpha' + ], + [ + 946, + 'beta' + ], + [ + 947, + 'gamma' + ], + [ + 948, + 'delta' + ], + [ + 949, + 'epsilon' + ], + [ + 950, + 'zeta' + ], + [ + 951, + 'eta' + ], + [ + 952, + 'theta' + ], + [ + 953, + 'iota' + ], + [ + 954, + 'kappa' + ], + [ + 955, + 'lambda' + ], + [ + 956, + 'mu' + ], + [ + 957, + 'nu' + ], + [ + 958, + 'xi' + ], + [ + 959, + 'omicron' + ], + [ + 960, + 'pi' + ], + [ + 961, + 'rho' + ], + [ + 962, + 'final sigma' + ], + [ + 963, + 'sigma' + ], + [ + 964, + 'tau' + ], + [ + 965, + 'upsilon' + ], + [ + 966, + 'phi' + ], + [ + 967, + 'chi' + ], + [ + 968, + 'psi' + ], + [ + 969, + 'omega' + ] + ] + }, + { + name: 'Symbols', + characters: [ + [ + 8501, + 'alef symbol' + ], + [ + 982, + 'pi symbol' + ], + [ + 8476, + 'real part symbol' + ], + [ + 978, + 'upsilon - hook symbol' + ], + [ + 8472, + 'Weierstrass p' + ], + [ + 8465, + 'imaginary part' + ] + ] + }, + { + name: 'Arrows', + characters: [ + [ + 8592, + 'leftwards arrow' + ], + [ + 8593, + 'upwards arrow' + ], + [ + 8594, + 'rightwards arrow' + ], + [ + 8595, + 'downwards arrow' + ], + [ + 8596, + 'left right arrow' + ], + [ + 8629, + 'carriage return' + ], + [ + 8656, + 'leftwards double arrow' + ], + [ + 8657, + 'upwards double arrow' + ], + [ + 8658, + 'rightwards double arrow' + ], + [ + 8659, + 'downwards double arrow' + ], + [ + 8660, + 'left right double arrow' + ], + [ + 8756, + 'therefore' + ], + [ + 8834, + 'subset of' + ], + [ + 8835, + 'superset of' + ], + [ + 8836, + 'not a subset of' + ], + [ + 8838, + 'subset of or equal to' + ], + [ + 8839, + 'superset of or equal to' + ], + [ + 8853, + 'circled plus' + ], + [ + 8855, + 'circled times' + ], + [ + 8869, + 'perpendicular' + ], + [ + 8901, + 'dot operator' + ], + [ + 8968, + 'left ceiling' + ], + [ + 8969, + 'right ceiling' + ], + [ + 8970, + 'left floor' + ], + [ + 8971, + 'right floor' + ], + [ + 9001, + 'left-pointing angle bracket' + ], + [ + 9002, + 'right-pointing angle bracket' + ], + [ + 9674, + 'lozenge' + ], + [ + 9824, + 'black spade suit' + ], + [ + 9827, + 'black club suit' + ], + [ + 9829, + 'black heart suit' + ], + [ + 9830, + 'black diamond suit' + ], + [ + 8194, + 'en space' + ], + [ + 8195, + 'em space' + ], + [ + 8201, + 'thin space' + ], + [ + 8204, + 'zero width non-joiner' + ], + [ + 8205, + 'zero width joiner' + ], + [ + 8206, + 'left-to-right mark' + ], + [ + 8207, + 'right-to-left mark' + ] + ] + } + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray$1(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray$1(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = Settings.getCharMap(editor); + if (userCharMap) { + charmap = [{ + name: UserDefined, + characters: getCharsFromSetting(userCharMap) + }]; + } + var userCharMapAppend = Settings.getCharMapAppend(editor); + if (userCharMapAppend) { + var userDefinedGroup = global$1.grep(charmap, function (cg) { + return cg.name === UserDefined; + }); + if (userDefinedGroup.length) { + userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + return charmap; + } + return [].concat(charmap).concat({ + name: UserDefined, + characters: getCharsFromSetting(userCharMapAppend) + }); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + var groups = extendCharMap(editor, getDefaultCharMap()); + return groups.length > 1 ? [{ + name: 'All', + characters: bind(groups, function (g) { + return g.characters; + }) + }].concat(groups) : groups; + }; + var CharMap = { getCharMap: getCharMap$1 }; + + var get = function (editor) { + var getCharMap = function () { + return CharMap.getCharMap(editor); + }; + var insertChar = function (chr) { + Actions.insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar + }; + }; + var Api = { get: get }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var charMatches = function (charCode, name, lowerCasePattern) { + if (contains(String.fromCharCode(charCode).toLowerCase(), lowerCasePattern)) { + return true; + } else { + return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); + } + }; + var scan = function (group, pattern) { + var matches = []; + var lowerCasePattern = pattern.toLowerCase(); + each(group.characters, function (g) { + if (charMatches(g[0], g[1], lowerCasePattern)) { + matches.push(g); + } + }); + return map(matches, function (m) { + return { + text: m[1], + value: String.fromCharCode(m[0]), + icon: String.fromCharCode(m[0]) + }; + }); + }; + var Scan = { scan: scan }; + + var patternName = 'pattern'; + var open = function (editor, charMap) { + var makeGroupItems = function () { + return [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + }; + var makeTabs = function () { + return map(charMap, function (charGroup) { + return { + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + }; + }); + }; + var makePanel = function () { + return { + type: 'panel', + items: makeGroupItems() + }; + }; + var makeTabPanel = function () { + return { + type: 'tabpanel', + tabs: makeTabs() + }; + }; + var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + var scanAndSet = function (dialogApi, pattern) { + find(charMap, function (group) { + return group.name === currentTab.get(); + }).each(function (f) { + var items = Scan.scan(f, pattern); + dialogApi.setData({ results: items }); + }); + }; + var SEARCH_DELAY = 40; + var updateFilter = last(function (dialogApi) { + var pattern = dialogApi.getData().pattern; + scanAndSet(dialogApi, pattern); + }, SEARCH_DELAY); + var body = charMap.length === 1 ? makePanel() : makeTabPanel(); + var initialData = { + pattern: '', + results: Scan.scan(charMap[0], '') + }; + var bridgeSpec = { + title: 'Special Character', + size: 'normal', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: initialData, + onAction: function (api, details) { + if (details.name === 'results') { + Actions.insertChar(editor, details.value); + api.close(); + } + }, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: function (dialogApi, changeData) { + if (changeData.name === patternName) { + updateFilter.throttle(dialogApi); + } + } + }; + var dialogApi = editor.windowManager.open(bridgeSpec); + dialogApi.focus(patternName); + }; + var Dialog = { open: open }; + + var register = function (editor, charMap) { + editor.addCommand('mceShowCharmap', function () { + Dialog.open(editor, charMap); + }); + }; + var Commands = { register: register }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var init = function (editor, all) { + editor.ui.registry.addAutocompleter('charmap', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return new global$2(function (resolve, reject) { + resolve(Scan.scan(all, pattern)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('charmap', { + icon: 'insert-character', + tooltip: 'Special character', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + editor.ui.registry.addMenuItem('charmap', { + icon: 'insert-character', + text: 'Special character...', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('charmap', function (editor) { + var charMap = CharMap.getCharMap(editor); + Commands.register(editor, charMap); + Buttons.register(editor); + init(editor, charMap[0]); + return Api.get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000..a19df5b --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(c){"use strict";function n(){}function i(n){return function(){return n}}function e(){return m}var r,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(n,e){return n.fire("insertCustomChar",{chr:e})},u=function(n,e){var r=a(n,e).chr;n.execCommand("mceInsertContent",!1,r)},o=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=function(n){return n.settings.charmap},l=function(n){return n.settings.charmap_append},f=i(!1),g=i(!0),m=(r={fold:function(n,e){return n()},is:f,isSome:f,isNone:g,getOr:p,getOrThunk:d,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:p,orThunk:d,map:e,each:n,bind:e,exists:f,forall:g,filter:e,equals:h,equals_:h,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(r),r);function h(n){return n.isNone()}function d(n){return n()}function p(n){return n}function y(e){return function(n){return function(n){if(null===n)return"null";var e=typeof n;return"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e}(n)===e}}function w(n,e){for(var r=n.length,t=new Array(r),a=0;a>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/, + 'number': /(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + alias: 'property', + inside: { + 'string': { + pattern: /(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/, + lookbehind: true + }, + 'directive': { + pattern: /(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/, + lookbehind: true, + alias: 'keyword' + } + } + }, + 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ + }); + delete Prism.languages.c['boolean']; + }, + {} + ], + 2: [ + function (require, module, exports) { + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + }, + {} + ], + 3: [ + function (require, module, exports) { + (function (global) { + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; + var Prism = function (_self) { + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + var uniqueId = 0; + var _ = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function (tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias); + } else if (Array.isArray(tokens)) { + return tokens.map(_.util.encode); + } else { + return tokens.replace(/&/g, '&').replace(/ text.length) { + return; + } + if (str instanceof Token) { + continue; + } + if (greedy && i != strarr.length - 1) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + var from = match.index + (lookbehind && match[1] ? match[1].length : 0), to = match.index + match[0].length, k = i, p = pos; + for (var len = strarr.length; k < len && (p < to || !strarr[k].type && !strarr[k - 1].greedy); ++k) { + p += strarr[k].length; + if (from >= p) { + ++i; + pos = p; + } + } + if (strarr[i] instanceof Token) { + continue; + } + delNum = k - i; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + var match = pattern.exec(str), delNum = 1; + } + if (!match) { + if (oneshot) { + break; + } + continue; + } + if (lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + var from = match.index + lookbehindLength, match = match[0].slice(lookbehindLength), to = from + match.length, before = str.slice(0, from), after = str.slice(to); + var args = [ + i, + delNum + ]; + if (before) { + ++i; + pos += before.length; + args.push(before); + } + var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias, match, greedy); + args.push(wrapped); + if (after) { + args.push(after); + } + Array.prototype.splice.apply(strarr, args); + if (delNum != 1) + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); + if (oneshot) + break; + } + } + } + }, + tokenize: function (text, grammar) { + var strarr = [text]; + var rest = grammar.rest; + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; + } + delete grammar.rest; + } + _.matchGrammar(text, strarr, grammar, 0, 0, false); + return strarr; + }, + hooks: { + all: {}, + add: function (name, callback) { + var hooks = _.hooks.all; + hooks[name] = hooks[name] || []; + hooks[name].push(callback); + }, + run: function (name, env) { + var callbacks = _.hooks.all[name]; + if (!callbacks || !callbacks.length) { + return; + } + for (var i = 0, callback; callback = callbacks[i++];) { + callback(env); + } + } + }, + Token: Token + }; + _self.Prism = _; + function Token(type, content, alias, matchedStr, greedy) { + this.type = type; + this.content = content; + this.alias = alias; + this.length = (matchedStr || '').length | 0; + this.greedy = !!greedy; + } + Token.stringify = function (o, language) { + if (typeof o == 'string') { + return o; + } + if (Array.isArray(o)) { + return o.map(function (element) { + return Token.stringify(element, language); + }).join(''); + } + var env = { + type: o.type, + content: Token.stringify(o.content, language), + tag: 'span', + classes: [ + 'token', + o.type + ], + attributes: {}, + language: language + }; + if (o.alias) { + var aliases = Array.isArray(o.alias) ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + _.hooks.run('wrap', env); + var attributes = Object.keys(env.attributes).map(function (name) { + return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + }).join(' '); + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; + }; + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + if (!_.manual) { + var highlightAutomaticallyCallback = function () { + if (!_.manual) { + _.highlightAll(); + } + }; + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + }.call(this, typeof global$2 !== 'undefined' ? global$2 : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {})); + }, + {} + ], + 4: [ + function (require, module, exports) { + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': { + pattern: /(\b(?:class|enum|struct)\s+)\w+/, + lookbehind: true + }, + 'keyword': /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:true|false)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + }, + {} + ], + 5: [ + function (require, module, exports) { + Prism.languages.csharp = Prism.languages.extend('clike', { + 'keyword': /\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/, + 'string': [ + { + pattern: /@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/, + greedy: true + }, + { + pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/, + greedy: true + } + ], + 'class-name': [ + { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/, + inside: { punctuation: /\./ } + }, + { + pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + } + ], + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'generic-method': { + pattern: /\w+\s*<[^>\r\n]+?>\s*(?=\()/, + inside: { + function: /^\w+/, + 'class-name': { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b/, + inside: { punctuation: /\./ } + }, + keyword: Prism.languages.csharp.keyword, + punctuation: /[<>(),.:]/ + } + }, + 'preprocessor': { + pattern: /(^\s*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/, + lookbehind: true, + alias: 'keyword' + } + } + } + }); + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }, + {} + ], + 6: [ + function (require, module, exports) { + (function (Prism) { + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/, + inside: { 'rule': /@[\w-]+/ } + }, + 'url': { + pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'), + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/ + } + }, + 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), + 'string': { + pattern: string, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, markup.tag); + } + }(Prism)); + }, + {} + ], + 7: [ + function (require, module, exports) { + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/; + Prism.languages.java = Prism.languages.extend('clike', { + 'class-name': [ + className, + /\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/ + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, + { + pattern: /(\:\:)[a-z_]\w*/, + lookbehind: true + } + ], + 'number': /\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + } + }); + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, + greedy: true, + alias: 'string' + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + alias: 'punctuation', + pattern: /(^|[^.])@\w+/, + lookbehind: true + }, + 'namespace': { + pattern: /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/, + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'generics': { + pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/, + inside: { + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + } + }); + }(Prism)); + }, + {} + ], + 8: [ + function (require, module, exports) { + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, + 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'operator': /--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + lookbehind: true, + greedy: true + }, + 'function-variable': { + pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + }, + {} + ], + 9: [ + function (require, module, exports) { + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; + } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) + ++i; + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; + } + }, + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; + } + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } + } + return tokens; + } + walkTokens(env.tokens); + } + } + }); + }(Prism)); + }, + {} + ], + 10: [ + function (require, module, exports) { + Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i, + greedy: true + }, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i, + inside: { + 'punctuation': [ + /^=/, + { + pattern: /^(\s*)["']|["']$/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': /&#?[\da-z]{1,8};/i + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g, tagName), 'i'), + lookbehind: true, + greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + }, + {} + ], + 11: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.php = Prism.languages.extend('clike', { + 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, + 'boolean': { + pattern: /\b(?:false|true)\b/i, + alias: 'constant' + }, + 'constant': [ + /\b[A-Z_][A-Z0-9_]*\b/, + /\b(?:null)\b/i + ], + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'string', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'comment', { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + 'variable': /\$+(?:\w+\b|(?={))/i, + 'package': { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + 'property': { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + var string_interpolation = { + pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/, + lookbehind: true, + inside: Prism.languages.php + }; + Prism.languages.insertBefore('php', 'string', { + 'nowdoc-string': { + pattern: /<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } + } + } + }, + 'heredoc-string': { + pattern: /<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation + } + }, + 'single-quoted-string': { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + greedy: true, + alias: 'string' + }, + 'double-quoted-string': { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + greedy: true, + alias: 'string', + inside: { 'interpolation': string_interpolation } + } + }); + delete Prism.languages.php['string']; + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + }, + {} + ], + 12: [ + function (require, module, exports) { + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string-interpolation': { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:True|False|None)\b/, + 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + }, + {} + ], + 13: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': [ + /#.*/, + { + pattern: /^=begin\s[\s\S]*?^=end/m, + greedy: true + } + ], + 'class-name': { + pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.ruby + } + }; + delete Prism.languages.ruby.function; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex': [ + { + pattern: /%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, + lookbehind: true, + greedy: true + } + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': { + pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, + lookbehind: true + }, + 'method-definition': { + pattern: /(\bdef\s+)[\w.]+/, + lookbehind: true, + inside: { + 'function': /\w+$/, + rest: Prism.languages.ruby + } + } + }); + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + } + ]; + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); + }, + {} + ], + 14: [ + function (require, module, exports) { + var Prism = require('prismjs/components/prism-core'); + require('prismjs/components/prism-clike'); + require('prismjs/components/prism-markup-templating'); + require('prismjs/components/prism-c'); + require('prismjs/components/prism-cpp'); + require('prismjs/components/prism-csharp'); + require('prismjs/components/prism-css'); + require('prismjs/components/prism-java'); + require('prismjs/components/prism-javascript'); + require('prismjs/components/prism-markup'); + require('prismjs/components/prism-php'); + require('prismjs/components/prism-python'); + require('prismjs/components/prism-ruby'); + module.exports = { boltExport: Prism }; + }, + { + 'prismjs/components/prism-c': 1, + 'prismjs/components/prism-clike': 2, + 'prismjs/components/prism-core': 3, + 'prismjs/components/prism-cpp': 4, + 'prismjs/components/prism-csharp': 5, + 'prismjs/components/prism-css': 6, + 'prismjs/components/prism-java': 7, + 'prismjs/components/prism-javascript': 8, + 'prismjs/components/prism-markup': 10, + 'prismjs/components/prism-markup-templating': 9, + 'prismjs/components/prism-php': 11, + 'prismjs/components/prism-python': 12, + 'prismjs/components/prism-ruby': 13 + } + ] + }, {}, [14])(14); + })); + var prism = window.Prism; + window.Prism = oldprism; + return prism; + }(undefined, exports$1, module, undefined)); + var Prism$1 = module.exports.boltExport; + + var getLanguages = function (editor) { + return editor.getParam('codesample_languages'); + }; + var useGlobalPrismJS = function (editor) { + return editor.getParam('codesample_global_prismjs', false, 'boolean'); + }; + var Settings = { + getLanguages: getLanguages, + useGlobalPrismJS: useGlobalPrismJS + }; + + var get = function (editor) { + return Global.Prism && Settings.useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + }; + var Prism$2 = { get: get }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection ? editor.selection.getNode() : null; + if (Utils.isCodeSample(node)) { + return Option.some(node); + } + return Option.none(); + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + return node.fold(function () { + editor.insertContent('

    ' + code + '
    '); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + }, function (n) { + editor.dom.setAttrib(n, 'class', 'language-' + language); + n.innerHTML = code; + Prism$2.get(editor).highlightElement(n); + editor.selection.select(n); + }); + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return ''; + }, function (n) { + return n.textContent; + }); + }; + var CodeSample = { + getSelectedCodeSample: getSelectedCodeSample, + insertCodeSample: insertCodeSample, + getCurrentCode: getCurrentCode + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = Settings.getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor, fallback) { + var node = CodeSample.getSelectedCodeSample(editor); + return node.fold(function () { + return fallback; + }, function (n) { + var matches = n.className.match(/language-(\w+)/); + return matches ? matches[1] : fallback; + }); + }; + var Languages = { + getLanguages: getLanguages$1, + getCurrentLanguage: getCurrentLanguage + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var open = function (editor) { + var languages = Languages.getLanguages(editor); + var defaultLanguage = head(languages).fold(function () { + return ''; + }, function (l) { + return l.value; + }); + var currentLanguage = Languages.getCurrentLanguage(editor, defaultLanguage); + var currentCode = CodeSample.getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit Code Sample', + size: 'large', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'language', + label: 'Language', + items: languages + }, + { + type: 'textarea', + name: 'code', + label: 'Code view' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: { + language: currentLanguage, + code: currentCode + }, + onSubmit: function (api) { + var data = api.getData(); + CodeSample.insertCodeSample(editor, data.language, data.code); + api.close(); + } + }); + }; + var Dialog = { open: open }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || Utils.isCodeSample(node)) { + Dialog.open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + var Commands = { register: register }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(Utils.trimArg(Utils.isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(Utils.trimArg(Utils.isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = 'false'; + elm.innerHTML = editor.dom.encode(elm.textContent); + Prism$2.get(editor).highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + var FilterContent = { setup: setup }; + + var isCodeSampleSelection = function (editor) { + var node = editor.selection.getStart(); + return editor.dom.is(node, 'pre[class*="language-"]'); + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('codesample', { + icon: 'code-sample', + tooltip: 'Insert/edit code sample', + onAction: function () { + return Dialog.open(editor); + }, + onSetup: function (api) { + var nodeChangeHandler = function () { + api.setActive(isCodeSampleSelection(editor)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + editor.ui.registry.addMenuItem('codesample', { + text: 'Code sample...', + icon: 'code-sample', + onAction: function () { + return Dialog.open(editor); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('codesample', function (editor) { + FilterContent.setup(editor); + Buttons.register(editor); + Commands.register(editor); + editor.on('dblclick', function (ev) { + if (Utils.isCodeSample(ev.target)) { + Dialog.open(editor); + } + }); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/codesample/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000..86f67ce --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(e){"use strict";function n(){}function i(e){return function(){return e}}function t(){return l}var r,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=i(!1),o=i(!0),l=(r={fold:function(e,n){return e()},is:s,isSome:s,isNone:o,getOr:p,getOrThunk:c,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:p,orThunk:c,map:t,each:n,bind:t,exists:s,forall:o,filter:t,equals:u,equals_:u,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(r),r);function u(e){return e.isNone()}function c(e){return e()}function p(e){return e}var d=function(t){function e(){return a}function n(e){return e(t)}var r=i(t),a={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:s,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return d(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?a:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(s,function(e){return n(t,e)})}};return a},g={some:d,none:t,from:function(e){return null===e||e===undefined?l:d(e)}},m=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");var f={isCodeSample:function q(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")},trimArg:function I(t){return function(e,n){return t(n)}}},h="undefined"!=typeof e.window?e.window:Function("return this;")(),b={},y={exports:b},w={};!function(n,t,r,p){var e=window.Prism;window.Prism={manual:!0},function(e){if("object"==typeof t&&void 0!==r)r.exports=e();else if("function"==typeof n&&n.amd)n([],e);else{("undefined"!=typeof window?window:void 0!==w?w:"undefined"!=typeof self?self:this).EphoxContactWrapper=e()}}(function(){return function c(i,s,o){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof p&&p;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var a=s[n]={exports:{}};i[n][0].call(a.exports,function(e){return l(i[n][1][e]||e)},a,a.exports,c,i,s,o)}return s[n].exports}for(var u="function"==typeof p&&p,e=0;e>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(e){var n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,E={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof O?new O(e.type,E.util.encode(e.content),e.alias):Array.isArray(e)?e.map(E.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof O)){if(g&&b!=n.length-1){if(c.lastIndex=y,!(F=c.exec(e)))break;for(var v=F.index+(d&&F[1]?F[1].length:0),k=F.index+F[0].length,x=b,_=y,A=n.length;x"+t.content+""},!u.document)return u.addEventListener&&(E.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(E.highlight(r,E.languages[t],t)),a&&u.close()},!1)),E;var e=E.util.currentScript();if(e&&(E.filename=e.src,e.hasAttribute("data-manual")&&(E.manual=!0)),!E.manual){var t=function(){E.manual||E.highlightAll()},r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return E}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=n),void 0!==e&&(e.Prism=n)}).call(this,void 0!==w?w:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}})},{}],5:[function(e,n,t){Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+n.source+"|[^\n\r()]*)\\)","i"),inside:{"function":/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var r,a,i;r=Prism,a=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,i=/\b[A-Z](?:\w*[a-z]\w*)?\b/,r.languages.java=r.languages.extend("clike",{"class-name":[i,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:a,"function":[r.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),r.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),r.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":i,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(r,a,e,i){if(r.language===a){var s=r.tokenStack=[];r.code=r.code.replace(e,function(e){if("function"==typeof i&&!i(e))return e;for(var n,t=s.length;-1!==r.code.indexOf(n=b(a,t));)++t;return s[t]=e,n}),r.grammar=y.languages.markup}}},tokenizePlaceholders:{value:function(d,g){if(d.language===g&&d.tokenStack){d.grammar=y.languages[g];var m=0,f=Object.keys(d.tokenStack);!function h(e){for(var n=0;n=f.length);n++){var t=e[n];if("string"==typeof t||t.content&&"string"==typeof t.content){var r=f[m],a=d.tokenStack[r],i="string"==typeof t?t:t.content,s=b(g,r),o=i.indexOf(s);if(-1/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:t}};r["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var a={};a[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",a)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var r=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:r}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var a=window.Prism;window.Prism=e}(undefined,b,y,undefined);function v(e){var n=e.selection?e.selection.getNode():null;return f.isCodeSample(n)?g.some(n):g.none()}var k,x=y.exports.boltExport,_=function(e){return e.getParam("codesample_languages")},A=function(e){return e.getParam("codesample_global_prismjs",!1,"boolean")},F=function(e){return h.Prism&&A(e)?h.Prism:x},P=v,S=function(n,t,r){n.undoManager.transact(function(){var e=v(n);return r=m.DOM.encode(r),e.fold(function(){n.insertContent('
    '+r+"
    "),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=r,F(n).highlightElement(e),n.selection.select(e)})})},j=function(e){return v(e).fold(function(){return""},function(e){return e.textContent})},$=function(e){var n=_(e);return n||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}]},C=function(e,t){return P(e).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})},E=(k="function",function(e){return function(e){if(null===e)return"null";var n=typeof e;return"object"==n&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":n}(e)===k}),O=Array.prototype.slice,z=(E(Array.from)&&Array.from,function(t){var e=$(t),n=function(e){return 0===e.length?g.none():g.some(e[0])}(e).fold(function(){return""},function(e){return e.value}),r=C(t,n),a=j(t);t.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:e},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:a},onSubmit:function(e){var n=e.getData();S(t,n.language,n.code),e.close()}})}),N=function(n){n.addCommand("codesample",function(){var e=n.selection.getNode();n.selection.isCollapsed()||f.isCodeSample(e)?z(n):n.formatter.toggle("code")})},T=function(t){var a=t.$;t.on("PreProcess",function(e){a("pre[contenteditable=false]",e.node).filter(f.trimArg(f.isCodeSample)).each(function(e,n){var t=a(n),r=n.textContent;t.attr("class",a.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(a("").each(function(){this.textContent=r}))})}),t.on("SetContent",function(){var e=a("pre").filter(f.trimArg(f.isCodeSample)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){a(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),F(t).highlightElement(n),n.className=a.trim(n.className)})})})},B=function(t){t.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return z(t)},onSetup:function(e){function n(){e.setActive(function(e){var n=e.selection.getStart();return e.dom.is(n,'pre[class*="language-"]')}(t))}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}),t.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return z(t)}})};!function M(){a.add("codesample",function(n){T(n),B(n),N(n),n.on("dblclick",function(e){f.isCodeSample(e.target)&&z(n)})})}()}(window); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 0000000..9ebbb9e --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('colorpicker', function () { + domGlobals.console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000..d08758f --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(o){"use strict";var i=tinymce.util.Tools.resolve("tinymce.PluginManager");!function n(){i.add("colorpicker",function(){o.console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 0000000..f81d603 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('contextmenu', function () { + domGlobals.console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000..3df2511 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(n){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager");!function e(){o.add("contextmenu",function(){n.console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.js new file mode 100644 index 0000000..42a825e --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.js @@ -0,0 +1,314 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var setDir = function (editor, dir) { + var dom = editor.dom; + var curDir; + var blocks = editor.selection.getSelectedBlocks(); + if (blocks.length) { + curDir = dom.getAttrib(blocks[0], 'dir'); + global$1.each(blocks, function (block) { + if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) { + dom.setAttrib(block, 'dir', curDir !== dir ? dir : null); + } + }); + editor.nodeChanged(); + } + }; + var Direction = { setDir: setDir }; + + var register = function (editor) { + editor.addCommand('mceDirectionLTR', function () { + Direction.setDir(editor, 'ltr'); + }); + editor.addCommand('mceDirectionRTL', function () { + Direction.setDir(editor, 'rtl'); + }); + }; + var Commands = { register: register }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType$1(TEXT); + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); + }; + + var get = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + return v === null ? undefined : v; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var getDirection = function (element) { + return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + }; + + var getNodeChangeHandler = function (editor, dir) { + return function (api) { + var nodeChangeHandler = function (e) { + var element = Element.fromDom(e.element); + api.setActive(getDirection(element) === dir); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('ltr', { + tooltip: 'Left to right', + icon: 'ltr', + onAction: function () { + return editor.execCommand('mceDirectionLTR'); + }, + onSetup: getNodeChangeHandler(editor, 'ltr') + }); + editor.ui.registry.addToggleButton('rtl', { + tooltip: 'Right to left', + icon: 'rtl', + onAction: function () { + return editor.execCommand('mceDirectionRTL'); + }, + onSetup: getNodeChangeHandler(editor, 'rtl') + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('directionality', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 0000000..0d601b5 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(i){"use strict";function n(){}function u(n){return function(){return n}}function t(){return a}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(n,t){var e,r=n.dom,o=n.selection.getSelectedBlocks();o.length&&(e=r.getAttrib(o[0],"dir"),c.each(o,function(n){r.getParent(n.parentNode,'*[dir="'+t+'"]',r.getRoot())||r.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},d=function(n){n.addCommand("mceDirectionLTR",function(){o(n,"ltr")}),n.addCommand("mceDirectionRTL",function(){o(n,"rtl")})},f=u(!1),l=u(!0),a=(e={fold:function(n,t){return n()},is:f,isSome:f,isNone:l,getOr:s,getOrThunk:N,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:s,orThunk:N,map:t,each:n,bind:t,exists:f,forall:l,filter:t,equals:m,equals_:m,toArray:function(){return[]},toString:u("none()")},Object.freeze&&Object.freeze(e),e);function m(n){return n.isNone()}function N(n){return n()}function s(n){return n}function g(n,t){var e=n.dom(),r=i.window.getComputedStyle(e).getPropertyValue(t),o=""!==r||function(n){var t=A(n)?n.dom().parentNode:n.dom();return t!==undefined&&null!==t&&t.ownerDocument.body.contains(t)}(n)?r:w(e,t);return null===o?undefined:o}function T(t,r){return function(e){function n(n){var t=p.fromDom(n.element);e.setActive(function(n){return"rtl"===g(n,"direction")?"rtl":"ltr"}(t)===r)}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}var E,O,y=function(e){function n(){return o}function t(n){return n(e)}var r=u(e),o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:l,isNone:f,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:n,orThunk:n,map:function(n){return y(n(e))},each:function(n){n(e)},bind:t,exists:t,forall:t,filter:function(n){return n(e)?o:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return o},D=function(n){return null===n||n===undefined?a:y(n)},h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:u(n)}},p={fromHtml:function(n,t){var e=(t||i.document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1= max; + }; + }); + for (var i = 0; i < list.length; i++) { + if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { + matches.push({ + value: list[i].char, + text: list[i].title, + icon: list[i].char + }); + if (reachedLimit(matches.length)) { + break; + } + } + } + return matches; + }; + + var init = function (editor, database) { + editor.ui.registry.addAutocompleter('emoticons', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return database.waitForLoad().then(function () { + var candidates = database.listAll(); + return emojisFrom(candidates, pattern, Option.some(maxResults)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var insertEmoticon = function (editor, ch) { + editor.insertContent(ch); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var keys = Object.keys; + var hasOwnProperty$1 = Object.hasOwnProperty; + var each = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var map$1 = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + var has = function (obj, key) { + return hasOwnProperty$1.call(obj, key); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var DEFAULT_ID = 'tinymce.plugins.emoticons'; + var getEmoticonDatabaseUrl = function (editor, pluginUrl) { + return editor.getParam('emoticons_database_url', pluginUrl + '/js/emojis' + editor.suffix + '.js'); + }; + var getEmoticonDatabaseId = function (editor) { + return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); + }; + var getAppendedEmoticons = function (editor) { + return editor.getParam('emoticons_append', {}, 'object'); + }; + var Settings = { + getEmoticonDatabaseUrl: getEmoticonDatabaseUrl, + getEmoticonDatabaseId: getEmoticonDatabaseId, + getAppendedEmoticons: getAppendedEmoticons + }; + + var ALL_CATEGORY = 'All'; + var categoryNameMap = { + symbols: 'Symbols', + people: 'People', + animals_and_nature: 'Animals and Nature', + food_and_drink: 'Food and Drink', + activity: 'Activity', + travel_and_places: 'Travel and Places', + objects: 'Objects', + flags: 'Flags', + user: 'User Defined' + }; + var translateCategory = function (categories, name) { + return has(categories, name) ? categories[name] : name; + }; + var getUserDefinedEmoticons = function (editor) { + var userDefinedEmoticons = Settings.getAppendedEmoticons(editor); + return map$1(userDefinedEmoticons, function (value) { + return __assign({ + keywords: [], + category: 'user' + }, value); + }); + }; + var initDatabase = function (editor, databaseUrl, databaseId) { + var categories = Cell(Option.none()); + var all = Cell(Option.none()); + var processEmojis = function (emojis) { + var cats = {}; + var everything = []; + each(emojis, function (lib, title) { + var entry = { + title: title, + keywords: lib.keywords, + char: lib.char, + category: translateCategory(categoryNameMap, lib.category) + }; + var current = cats[entry.category] !== undefined ? cats[entry.category] : []; + cats[entry.category] = current.concat([entry]); + everything.push(entry); + }); + categories.set(Option.some(cats)); + all.set(Option.some(everything)); + }; + editor.on('init', function () { + global$1.load(databaseId, databaseUrl).then(function (emojis) { + var userEmojis = getUserDefinedEmoticons(editor); + processEmojis(merge(emojis, userEmojis)); + }, function (err) { + domGlobals.console.log('Failed to load emoticons: ' + err); + categories.set(Option.some({})); + all.set(Option.some([])); + }); + }); + var listCategory = function (category) { + if (category === ALL_CATEGORY) { + return listAll(); + } + return categories.get().bind(function (cats) { + return Option.from(cats[category]); + }).getOr([]); + }; + var listAll = function () { + return all.get().getOr([]); + }; + var listCategories = function () { + return [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); + }; + var waitForLoad = function () { + if (hasLoaded()) { + return global$3.resolve(true); + } else { + return new global$3(function (resolve, reject) { + var numRetries = 15; + var interval = global$2.setInterval(function () { + if (hasLoaded()) { + global$2.clearInterval(interval); + resolve(true); + } else { + numRetries--; + if (numRetries < 0) { + domGlobals.console.log('Could not load emojis from url: ' + databaseUrl); + global$2.clearInterval(interval); + reject(false); + } + } + }, 100); + }); + } + }; + var hasLoaded = function () { + return categories.get().isSome() && all.get().isSome(); + }; + return { + listCategories: listCategories, + hasLoaded: hasLoaded, + waitForLoad: waitForLoad, + listAll: listAll, + listCategory: listCategory + }; + }; + + var patternName = 'pattern'; + var open = function (editor, database) { + var initialState = { + pattern: '', + results: emojisFrom(database.listAll(), '', Option.some(300)) + }; + var currentTab = Cell(ALL_CATEGORY); + var scan = function (dialogApi) { + var dialogData = dialogApi.getData(); + var category = currentTab.get(); + var candidates = database.listCategory(category); + var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Option.some(300) : Option.none()); + dialogApi.setData({ results: results }); + }; + var updateFilter = last(function (dialogApi) { + scan(dialogApi); + }, 200); + var searchField = { + label: 'Search', + type: 'input', + name: patternName + }; + var resultsField = { + type: 'collection', + name: 'results' + }; + var getInitialState = function () { + var body = { + type: 'tabpanel', + tabs: map(database.listCategories(), function (cat) { + return { + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + }; + }) + }; + return { + title: 'Emoticons', + size: 'normal', + body: body, + initialData: initialState, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: updateFilter.throttle, + onAction: function (dialogApi, actionData) { + if (actionData.name === 'results') { + insertEmoticon(editor, actionData.value); + dialogApi.close(); + } + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }] + }; + }; + var dialogApi = editor.windowManager.open(getInitialState()); + dialogApi.focus(patternName); + if (!database.hasLoaded()) { + dialogApi.block('Loading emoticons...'); + database.waitForLoad().then(function () { + dialogApi.redial(getInitialState()); + updateFilter.throttle(dialogApi); + dialogApi.focus(patternName); + dialogApi.unblock(); + }).catch(function (err) { + dialogApi.redial({ + title: 'Emoticons', + body: { + type: 'panel', + items: [{ + type: 'alertbanner', + level: 'error', + icon: 'warning', + text: '

    Could not load emoticons

    ' + }] + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }], + initialData: { + pattern: '', + results: [] + } + }); + dialogApi.focus(patternName); + dialogApi.unblock(); + }); + } + }; + var Dialog = { open: open }; + + var register = function (editor, database) { + var onAction = function () { + return Dialog.open(editor, database); + }; + editor.ui.registry.addButton('emoticons', { + tooltip: 'Emoticons', + icon: 'emoji', + onAction: onAction + }); + editor.ui.registry.addMenuItem('emoticons', { + text: 'Emoticons...', + icon: 'emoji', + onAction: onAction + }); + }; + var Buttons = { register: register }; + + function Plugin () { + global.add('emoticons', function (editor, pluginUrl) { + var databaseUrl = Settings.getEmoticonDatabaseUrl(editor, pluginUrl); + var databaseId = Settings.getEmoticonDatabaseId(editor); + var database = initDatabase(editor, databaseUrl, databaseId); + Buttons.register(editor, database); + init(editor, database); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/emoticons/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000..f300335 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(l){"use strict";function n(){}function i(n){return function(){return n}}function t(){return a}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=i(!1),u=i(!0),a=(e={fold:function(n,t){return n()},is:c,isSome:c,isNone:u,getOr:f,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:f,orThunk:s,map:t,each:n,bind:t,exists:c,forall:u,filter:t,equals:o,equals_:o,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(e),e);function o(n){return n.isNone()}function s(n){return n()}function f(n){return n}function m(n,t){return-1!==n.indexOf(t)}function g(n,t){return m(n.title.toLowerCase(),t)||function(n,t){for(var e=0,r=n.length;eCould not load emoticons

    "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),a.focus(U),a.unblock()}))},B=function(n,t){function e(){return R(n,t)}n.ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:e}),n.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:e})};!function G(){r.add("emoticons",function(n,t){var e=F(n,t),r=q(n),o=h(n,e,r);B(n,o),function(r,o){r.ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,e){return o.waitForLoad().then(function(){var n=o.listAll();return d(n,t,A.some(e))})},onAction:function(n,t,e){r.selection.setRng(t),r.insertContent(e),n.hide()}})}(n,o)})}()}(window); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.js new file mode 100644 index 0000000..16420c4 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.js @@ -0,0 +1,568 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); + + var shouldHideInSourceView = function (editor) { + return editor.getParam('fullpage_hide_in_source_view'); + }; + var getDefaultXmlPi = function (editor) { + return editor.getParam('fullpage_default_xml_pi'); + }; + var getDefaultEncoding = function (editor) { + return editor.getParam('fullpage_default_encoding'); + }; + var getDefaultFontFamily = function (editor) { + return editor.getParam('fullpage_default_font_family'); + }; + var getDefaultFontSize = function (editor) { + return editor.getParam('fullpage_default_font_size'); + }; + var getDefaultTextColor = function (editor) { + return editor.getParam('fullpage_default_text_color'); + }; + var getDefaultTitle = function (editor) { + return editor.getParam('fullpage_default_title'); + }; + var getDefaultDocType = function (editor) { + return editor.getParam('fullpage_default_doctype', ''); + }; + var Settings = { + shouldHideInSourceView: shouldHideInSourceView, + getDefaultXmlPi: getDefaultXmlPi, + getDefaultEncoding: getDefaultEncoding, + getDefaultFontFamily: getDefaultFontFamily, + getDefaultFontSize: getDefaultFontSize, + getDefaultTextColor: getDefaultTextColor, + getDefaultTitle: getDefaultTitle, + getDefaultDocType: getDefaultDocType + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head, { format: 'xhtml' }); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = Settings.getDefaultFontFamily(editor); + data.fontsize = Settings.getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headerFragment, headElement, html, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + html = global$4({ + validate: false, + indent: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + var Parser = { + parseHeader: parseHeader, + htmlToData: htmlToData, + dataToHtml: dataToHtml + }; + + var open = function (editor, headState) { + var data = Parser.htmlToData(editor, headState.get()); + var defaultData = { + title: '', + keywords: '', + description: '', + robots: '', + author: '', + docencoding: '' + }; + var initialData = __assign(__assign({}, defaultData), data); + editor.windowManager.open({ + title: 'Metadata and Document Properties', + size: 'normal', + body: { + type: 'panel', + items: [ + { + name: 'title', + type: 'input', + label: 'Title' + }, + { + name: 'keywords', + type: 'input', + label: 'Keywords' + }, + { + name: 'description', + type: 'input', + label: 'Description' + }, + { + name: 'robots', + type: 'input', + label: 'Robots' + }, + { + name: 'author', + type: 'input', + label: 'Author' + }, + { + name: 'docencoding', + type: 'input', + label: 'Encoding' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onSubmit: function (api) { + var nuData = api.getData(); + var headHtml = Parser.dataToHtml(editor, global$1.extend(data, nuData), headState.get()); + headState.set(headHtml); + api.close(); + } + }); + }; + var Dialog = { open: open }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + Dialog.open(editor, headState); + }); + }; + var Commands = { register: register }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + var Protect = { + protectHtml: protectHtml, + unprotectHtml: unprotectHtml + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, headerFragment, styles = ''; + var dom = editor.dom; + if (evt.selection) { + return; + } + content = Protect.protectHtml(editor.settings.protect, evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && Settings.shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + headerFragment = Parser.parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + var bodyElm = headerFragment.getAll('body')[0]; + if (bodyElm) { + dom.setAttribs(editor.getBody(), { + style: bodyElm.attr('style') || '', + dir: bodyElm.attr('dir') || '', + vLink: bodyElm.attr('vlink') || '', + link: bodyElm.attr('link') || '', + aLink: bodyElm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); + styleElm.appendChild(domGlobals.document.createTextNode(styles)); + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + 'href': href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (Settings.getDefaultXmlPi(editor)) { + var piEncoding = Settings.getDefaultEncoding(editor); + header += '\n'; + } + header += Settings.getDefaultDocType(editor); + header += '\n\n\n'; + if (value = Settings.getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = Settings.getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = Settings.getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = Settings.getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = Settings.getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (!evt.selection && (!evt.source_view || !Settings.shouldHideInSourceView(editor))) { + evt.content = Protect.unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + var FilterContent = { setup: setup }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('fullpage', { + tooltip: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + editor.ui.registry.addMenuItem('fullpage', { + text: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + Commands.register(editor, headState); + Buttons.register(editor); + FilterContent.setup(editor, headState, footState); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 0000000..7ef1075 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(m){"use strict";function f(t){return n({validate:!1,root_name:"#document"}).parse(t,{format:"xhtml"})}function g(t){return t.replace(/<\/?[A-Z]+/g,function(t){return t.toLowerCase()})}var i=function(t){function e(){return n}var n=t;return{get:e,set:function(t){n=t},clone:function(){return i(e())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(){return(e=Object.assign||function(t){for(var e,n=1,i=arguments.length;n")},_=f,b=function(t,e){var n,i,l=f(e),r={};function o(t,e){return t.attr(e)||""}return r.fontface=a(t),r.fontsize=c(t),7===(n=l.firstChild).type&&(r.xml_pi=!0,(i=/encoding="([^"]+)"/.exec(n.value))&&(r.docencoding=i[1])),(n=l.getAll("#doctype")[0])&&(r.doctype=""),(n=l.getAll("title")[0])&&n.firstChild&&(r.title=n.firstChild.value),p.each(l.getAll("meta"),function(t){var e,n=t.attr("name"),i=t.attr("http-equiv");n?r[n.toLowerCase()]=t.attr("content"):"Content-Type"===i&&(e=/charset\s*=\s*(.*)\s*/gi.exec(t.attr("content")))&&(r.docencoding=e[1])}),(n=l.getAll("html")[0])&&(r.langcode=o(n,"lang")||o(n,"xml:lang")),r.stylesheets=[],p.each(l.getAll("link"),function(t){"stylesheet"===t.attr("rel")&&r.stylesheets.push(t.attr("href"))}),(n=l.getAll("body")[0])&&(r.langdir=o(n,"dir"),r.style=o(n,"style"),r.visited_color=o(n,"vlink"),r.link_color=o(n,"link"),r.active_color=o(n,"alink")),r},x=function(t,r,e){var o,n,i,a,l,c=t.dom;function s(t,e,n){t.attr(e,n||undefined)}function u(t){n.firstChild?n.insert(t,n.firstChild):n.append(t)}o=f(e),(n=o.getAll("head")[0])||(a=o.getAll("html")[0],n=new y("head",1),a.firstChild?a.insert(n,a.firstChild,!0):a.append(n)),a=o.firstChild,r.xml_pi?(l='version="1.0"',r.docencoding&&(l+=' encoding="'+r.docencoding+'"'),7!==a.type&&(a=new y("xml",7),o.insert(a,o.firstChild,!0)),a.value=l):a&&7===a.type&&a.remove(),a=o.getAll("#doctype")[0],r.doctype?(a||(a=new y("#doctype",10),r.xml_pi?o.insert(a,o.firstChild):u(a)),a.value=r.doctype.substring(9,r.doctype.length-1)):a&&a.remove(),a=null,p.each(o.getAll("meta"),function(t){"Content-Type"===t.attr("http-equiv")&&(a=t)}),r.docencoding?(a||((a=new y("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,u(a)),a.attr("content","text/html; charset="+r.docencoding)):a&&a.remove(),a=o.getAll("title")[0],r.title?(a?a.empty():u(a=new y("title",1)),a.append(new y("#text",3)).value=r.title):a&&a.remove(),p.each("keywords,description,author,copyright,robots".split(","),function(t){var e,n,i=o.getAll("meta"),l=r[t];for(e=0;e"))},l=function(i,l){var r=b(i,l.get()),t=e(e({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),r);i.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:t,onSubmit:function(t){var e=t.getData(),n=x(i,p.extend(r,e),l.get());l.set(n),t.close()}})},k=function(t,e){t.addCommand("mceFullPageProperties",function(){l(t,e)})},C=function(t,e){return p.each(t,function(t){e=e.replace(t,function(t){return"\x3c!--mce:protected "+escape(t)+"--\x3e"})}),e},A=function(t){return t.replace(//g,function(t,e){return unescape(e)})},w=p.each,P=function(t){var e,n="",i="";if(r(t)){var l=o(t);n+='\n'}return n+=d(t),n+="\n\n\n",(e=u(t))&&(n+=""+e+"\n"),(e=o(t))&&(n+='\n'),(e=a(t))&&(i+="font-family: "+e+";"),(e=c(t))&&(i+="font-size: "+e+";"),(e=s(t))&&(i+="color: "+e+";"),n+="\n\n"},T=function(e,n,i){e.on("BeforeSetContent",function(t){!function(t,e,n,i){var l,r,o,a,c="",s=t.dom;if(!(i.selection||(o=C(t.settings.protect,i.content),"raw"===i.format&&e.get()||i.source_view&&v(t)))){0!==o.length||i.source_view||(o=p.trim(e.get())+"\n"+p.trim(o)+"\n"+p.trim(n.get())),-1!==(l=(o=o.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",l),e.set(g(o.substring(0,l+1))),-1===(r=o.indexOf("\n")),a=_(e.get()),w(a.getAll("style"),function(t){t.firstChild&&(c+=t.firstChild.value)});var u=a.getAll("body")[0];u&&s.setAttribs(t.getBody(),{style:u.attr("style")||"",dir:u.attr("dir")||"",vLink:u.attr("vlink")||"",link:u.attr("link")||"",aLink:u.attr("alink")||""}),s.remove("fullpage_styles");var d=t.getDoc().getElementsByTagName("head")[0];if(c)s.add(d,"style",{id:"fullpage_styles"}).appendChild(m.document.createTextNode(c));var f={};p.each(d.getElementsByTagName("link"),function(t){"stylesheet"===t.rel&&t.getAttribute("data-mce-fullpage")&&(f[t.href]=t)}),p.each(a.getAll("link"),function(t){var e=t.attr("href");if(!e)return!0;f[e]||"stylesheet"!==t.attr("rel")||s.add(d,"link",{rel:"stylesheet",text:"text/css",href:e,"data-mce-fullpage":"1"}),delete f[e]}),p.each(f,function(t){t.parentNode.removeChild(t)})}}(e,n,i,t)}),e.on("GetContent",function(t){!function(t,e,n,i){i.selection||i.source_view&&v(t)||(i.content=A(p.trim(e)+"\n"+p.trim(i.content)+"\n"+p.trim(n)))}(e,n.get(),i.get(),t)})},O=function(t){t.ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){t.execCommand("mceFullPageProperties")}}),t.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){t.execCommand("mceFullPageProperties")}})};!function D(){t.add("fullpage",function(t){var e=i(""),n=i("");k(t,e),O(t),T(t,e,n)})}()}(window); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 0000000..fa68d39 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,1192 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + var Api = { get: get }; + + var noop = function () { + }; + var compose = function (fa, fb) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fa(fb.apply(null, args)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var revocable = function (doRevoke) { + var subject = Cell(Option.none()); + var revoke = function () { + subject.get().each(doRevoke); + }; + var clear = function () { + revoke(); + subject.set(Option.none()); + }; + var set = function (s) { + revoke(); + subject.set(Option.some(s)); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + isSet: isSet, + set: set + }; + }; + var unbindable = function () { + return revocable(function (s) { + s.unbind(); + }); + }; + var value = function () { + var subject = Cell(Option.none()); + var clear = function () { + subject.set(Option.none()); + }; + var set = function (s) { + subject.set(Option.some(s)); + }; + var on = function (f) { + subject.get().each(f); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + set: set, + isSet: isSet, + on: on + }; + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isBoolean = isType('boolean'); + var isFunction = isType('function'); + var isNumber = isType('number'); + + var nativeSlice = Array.prototype.slice; + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType$1(TEXT); + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + var get$1 = function (element, key) { + var v = element.dom().getAttribute(key); + return v === null ? undefined : v; + }; + var remove = function (element, key) { + element.dom().removeAttribute(key); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var setAll = function (element, css) { + var dom = element.dom(); + each$1(css, function (v, k) { + internalSet(dom, k, v); + }); + }; + var get$2 = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + return v === null ? undefined : v; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + return { + target: constant(target), + x: constant(x), + y: constant(y), + stop: stop, + prevent: prevent, + kill: kill, + raw: constant(raw) + }; + }; + var fromRawEvent = function (rawEvent) { + var target = Element.fromDom(rawEvent.target); + var stop = function () { + rawEvent.stopPropagation(); + }; + var prevent = function () { + rawEvent.preventDefault(); + }; + var kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var isBrowser = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isEdge: isBrowser(edge, current), + isChrome: isBrowser(chrome, current), + isIE: isBrowser(ie, current), + isOpera: isBrowser(opera, current), + isFirefox: isBrowser(firefox, current), + isSafari: isBrowser(safari, current) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var chromeos = 'ChromeOS'; + var isOS = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isWindows: isOS(windows, current), + isiOS: isOS(ios, current), + isAndroid: isOS(android, current), + isOSX: isOS(osx, current), + isLinux: isOS(linux, current), + isSolaris: isOS(solaris, current), + isFreeBSD: isOS(freebsd, current), + isChromeOS: isOS(chromeos, current) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + var DeviceType = function (os, browser, userAgent, mediaMatch) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isMobile = os.isiOS() || os.isAndroid(); + var isTouch = isMobile || mediaMatch('(pointer:coarse)'); + var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + var isPhone = isiPhone || isMobile && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + var isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var detect$2 = function (userAgent, mediaMatch) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var mediaMatch = function (query) { + return domGlobals.window.matchMedia(query).matches; + }; + var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch)); + var detect$3 = function () { + return platform.get(); + }; + + var Immutable = function () { + var fields = []; + for (var _i = 0; _i < arguments.length; _i++) { + fields[_i] = arguments[_i]; + } + return function () { + var values = []; + for (var _i = 0; _i < arguments.length; _i++) { + values[_i] = arguments[_i]; + } + if (fields.length !== values.length) { + throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); + } + var struct = {}; + each(fields, function (name, i) { + struct[name] = constant(values[i]); + }); + return struct; + }; + }; + + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionPreceding = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING); + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + var Node = { + documentPositionPreceding: documentPositionPreceding, + documentPositionContainedBy: documentPositionContainedBy + }; + + var ELEMENT$1 = ELEMENT; + var DOCUMENT$1 = DOCUMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? domGlobals.document : scope.dom(); + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = detect$3().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var parents = function (element, isRoot) { + var stop = isFunction(isRoot) ? isRoot : never; + var dom = element.dom(); + var ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + var rawParent = dom.parentNode; + var p = Element.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + var siblings = function (element) { + var filterSelf = function (elements) { + return filter(elements, function (x) { + return !eq(element, x); + }); + }; + return parent(element).map(children).map(filterSelf).getOr([]); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + var spot = Immutable('element', 'offset'); + + var r = function (left, top) { + var translate = function (x, y) { + return r(left + x, top + y); + }; + return { + left: constant(left), + top: constant(top), + translate: translate + }; + }; + var Position = r; + + var isSafari = detect$3().browser.isSafari(); + var get$3 = function (_DOC) { + var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; + var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + var y = doc.body.scrollTop || doc.documentElement.scrollTop; + return Position(x, y); + }; + + var get$4 = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + return Option.from(win['visualViewport']); + }; + var bounds = function (x, y, width, height) { + return { + x: constant(x), + y: constant(y), + width: constant(width), + height: constant(height), + right: constant(x + width), + bottom: constant(y + height) + }; + }; + var getBounds = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + var doc = win.document; + var scroll = get$3(Element.fromDom(doc)); + return get$4(win).fold(function () { + var html = win.document.documentElement; + var width = html.clientWidth; + var height = html.clientHeight; + return bounds(scroll.left(), scroll.top(), width, height); + }, function (visualViewport) { + return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height); + }); + }; + var bind$1 = function (name, callback, _win) { + return get$4(_win).map(function (visualViewport) { + var handler = function (e) { + return fromRawEvent(e); + }; + visualViewport.addEventListener(name, handler); + return { + unbind: function () { + return visualViewport.removeEventListener(name, handler); + } + }; + }).getOrThunk(function () { + return { unbind: noop }; + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + var Events = { fireFullscreenStateChanged: fireFullscreenStateChanged }; + + var ancestors = function (scope, predicate, isRoot) { + return filter(parents(scope, isRoot), predicate); + }; + var siblings$1 = function (scope, predicate) { + return filter(siblings(scope), predicate); + }; + + var all$1 = function (selector) { + return all(selector); + }; + var ancestors$1 = function (scope, selector, isRoot) { + return ancestors(scope, function (e) { + return is(e, selector); + }, isRoot); + }; + var siblings$2 = function (scope, selector) { + return siblings$1(scope, function (e) { + return is(e, selector); + }); + }; + + var attr = 'data-ephox-mobile-fullscreen-style'; + var siblingStyles = 'display:none!important;'; + var ancestorPosition = 'position:absolute!important;'; + var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + var bgFallback = 'background-color:rgb(255,255,255)!important;'; + var isAndroid = global$2.os.isAndroid(); + var matchColor = function (editorBody) { + var color = get$2(editorBody, 'background-color'); + return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; + }; + var clobberStyles = function (dom, container, editorBody) { + var gatherSibilings = function (element) { + return siblings$2(element, '*:not(.tox-silver-sink)'); + }; + var clobber = function (clobberStyle) { + return function (element) { + var styles = get$1(element, 'style'); + var backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } + }; + }; + var ancestors = ancestors$1(container, '*'); + var siblings = bind(ancestors, gatherSibilings); + var bgColor = matchColor(editorBody); + each(siblings, clobber(siblingStyles)); + each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); + var containerStyles = isAndroid === true ? '' : ancestorPosition; + clobber(containerStyles + ancestorStyles + bgColor)(container); + }; + var restoreStyles = function (dom) { + var clobberedEls = all$1('[' + attr + ']'); + each(clobberedEls, function (element) { + var restore = get$1(element, attr); + if (restore !== 'no-styles') { + setAll(element, dom.parseStyle(restore)); + } else { + remove(element, 'style'); + } + remove(element, attr); + }); + }; + var Thor = { + clobberStyles: clobberStyles, + restoreStyles: restoreStyles + }; + + var DOM = global$1.DOM; + var getScrollPos = function () { + var vp = getBounds(domGlobals.window); + return { + x: vp.x(), + y: vp.y() + }; + }; + var setScrollPos = function (pos) { + domGlobals.window.scrollTo(pos.x, pos.y); + }; + var viewportUpdate = get$4().fold(function () { + return { + bind: noop, + unbind: noop + }; + }, function (visualViewport) { + var editorContainer = value(); + var resizeBinder = unbindable(); + var scrollBinder = unbindable(); + var refreshScroll = function () { + domGlobals.document.body.scrollTop = 0; + domGlobals.document.documentElement.scrollTop = 0; + }; + var refreshVisualViewport = function () { + domGlobals.window.requestAnimationFrame(function () { + editorContainer.on(function (container) { + return setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + }); + }); + }); + }; + var update = global$3.throttle(function () { + refreshScroll(); + refreshVisualViewport(); + }, 50); + var bind = function (element) { + editorContainer.set(element); + update(); + resizeBinder.set(bind$1('resize')); + scrollBinder.set(bind$1('scroll')); + }; + var unbind = function () { + editorContainer.on(function () { + resizeBinder.clear(); + scrollBinder.clear(); + }); + editorContainer.clear(); + }; + return { + bind: bind, + unbind: unbind + }; + }); + var toggleFullscreen = function (editor, fullscreenState) { + var body = domGlobals.document.body; + var documentElement = domGlobals.document.documentElement; + var editorContainerStyle; + var editorContainer, iframe, iframeStyle; + editorContainer = editor.getContainer(); + var editorContainerS = Element.fromDom(editorContainer); + var fullscreenInfo = fullscreenState.get(); + var editorBody = Element.fromDom(editor.getBody()); + var isTouch = global$2.deviceType.isTouch(); + editorContainerStyle = editorContainer.style; + iframe = editor.getContentAreaContainer().firstChild; + iframeStyle = iframe.style; + if (!fullscreenInfo) { + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + containerTop: editorContainerStyle.top, + containerLeft: editorContainerStyle.left, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height + }; + if (isTouch) { + Thor.clobberStyles(editor.dom, editorContainerS, editorBody); + } + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + DOM.addClass(body, 'tox-fullscreen'); + DOM.addClass(documentElement, 'tox-fullscreen'); + DOM.addClass(editorContainer, 'tox-fullscreen'); + viewportUpdate.bind(editorContainerS); + editor.on('remove', viewportUpdate.unbind); + fullscreenState.set(newFullScreenInfo); + Events.fireFullscreenStateChanged(editor, true); + } else { + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + editorContainerStyle.width = fullscreenInfo.containerWidth; + editorContainerStyle.height = fullscreenInfo.containerHeight; + editorContainerStyle.top = fullscreenInfo.containerTop; + editorContainerStyle.left = fullscreenInfo.containerLeft; + if (isTouch) { + Thor.restoreStyles(editor.dom); + } + DOM.removeClass(body, 'tox-fullscreen'); + DOM.removeClass(documentElement, 'tox-fullscreen'); + DOM.removeClass(editorContainer, 'tox-fullscreen'); + setScrollPos(fullscreenInfo.scrollPos); + fullscreenState.set(null); + Events.fireFullscreenStateChanged(editor, false); + viewportUpdate.unbind(); + editor.off('remove', viewportUpdate.unbind); + } + }; + var Actions = { toggleFullscreen: toggleFullscreen }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + Actions.toggleFullscreen(editor, fullscreenState); + }); + }; + var Commands = { register: register }; + + var makeSetupHandler = function (editor, fullscreenState) { + return function (api) { + api.setActive(fullscreenState.get() !== null); + var editorEventCallback = function (e) { + return api.setActive(e.state); + }; + editor.on('FullscreenStateChanged', editorEventCallback); + return function () { + return editor.off('FullscreenStateChanged', editorEventCallback); + }; + }; + }; + var register$1 = function (editor, fullscreenState) { + editor.ui.registry.addToggleMenuItem('fullscreen', { + text: 'Fullscreen', + shortcut: 'Meta+Shift+F', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + editor.ui.registry.addToggleButton('fullscreen', { + tooltip: 'Fullscreen', + icon: 'fullscreen', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.settings.inline) { + return Api.get(fullscreenState); + } + Commands.register(editor, fullscreenState); + Buttons.register(editor, fullscreenState); + editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); + return Api.get(fullscreenState); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000..6eb913e --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(d){"use strict";function t(){}function m(n){return function(){return n}}function n(){return f}var e,u=function(n){function e(){return r}var r=n;return{get:e,set:function(n){r=n},clone:function(){return u(e())}}},r=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(n){return{isFullscreen:function(){return null!==n.get()}}},c=m(!1),i=m(!0),f=(e={fold:function(n,e){return n()},is:c,isSome:c,isNone:i,getOr:l,getOrThunk:a,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:m(null),getOrUndefined:m(undefined),or:l,orThunk:a,map:n,each:t,bind:n,exists:c,forall:i,filter:n,equals:s,equals_:s,toArray:function(){return[]},toString:m("none()")},Object.freeze&&Object.freeze(e),e);function s(n){return n.isNone()}function a(n){return n()}function l(n){return n}function h(){return function(n){function e(){r.get().each(n)}var r=u(Y.none());return{clear:function(){e(),r.set(Y.none())},isSet:function(){return r.get().isSome()},set:function(n){e(),r.set(Y.some(n))}}}(function(n){n.unbind()})}function v(e){return function(n){return function(n){if(null===n)return"null";var e=typeof n;return"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e}(n)===e}}function g(n,e){for(var r=n.length,t=new Array(r),o=0;o -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var get$1 = function (obj, key) { + return has(obj, key) ? Option.from(obj[key]) : Option.none(); + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getHelpTabs = function (editor) { + return Option.from(editor.getParam('help_tabs')); + }; + + var shortcuts = [ + { + shortcuts: ['Meta + B'], + action: 'Bold' + }, + { + shortcuts: ['Meta + I'], + action: 'Italic' + }, + { + shortcuts: ['Meta + U'], + action: 'Underline' + }, + { + shortcuts: ['Meta + A'], + action: 'Select all' + }, + { + shortcuts: [ + 'Meta + Y', + 'Meta + Shift + Z' + ], + action: 'Redo' + }, + { + shortcuts: ['Meta + Z'], + action: 'Undo' + }, + { + shortcuts: ['Access + 1'], + action: 'Header 1' + }, + { + shortcuts: ['Access + 2'], + action: 'Header 2' + }, + { + shortcuts: ['Access + 3'], + action: 'Header 3' + }, + { + shortcuts: ['Access + 4'], + action: 'Header 4' + }, + { + shortcuts: ['Access + 5'], + action: 'Header 5' + }, + { + shortcuts: ['Access + 6'], + action: 'Header 6' + }, + { + shortcuts: ['Access + 7'], + action: 'Paragraph' + }, + { + shortcuts: ['Access + 8'], + action: 'Div' + }, + { + shortcuts: ['Access + 9'], + action: 'Address' + }, + { + shortcuts: ['Alt + 0'], + action: 'Open help dialog' + }, + { + shortcuts: ['Alt + F9'], + action: 'Focus to menubar' + }, + { + shortcuts: ['Alt + F10'], + action: 'Focus to toolbar' + }, + { + shortcuts: ['Alt + F11'], + action: 'Focus to element path' + }, + { + shortcuts: ['Ctrl + F9'], + action: 'Focus to contextual toolbar' + }, + { + shortcuts: ['Shift + Enter'], + action: 'Open popup menu for split buttons' + }, + { + shortcuts: ['Meta + K'], + action: 'Insert link (if link plugin activated)' + }, + { + shortcuts: ['Meta + S'], + action: 'Save (if save plugin activated)' + }, + { + shortcuts: ['Meta + F'], + action: 'Find (if searchreplace plugin activated)' + }, + { + shortcuts: ['Meta + Shift + F'], + action: 'Switch to or from fullscreen mode' + } + ]; + var KeyboardShortcuts = { shortcuts: shortcuts }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var convertText = function (source) { + var mac = { + alt: '⌥', + ctrl: '⌃', + shift: '⇧', + meta: '⌘', + access: '⌃⌥' + }; + var other = { + meta: 'Ctrl ', + access: 'Shift + Alt ' + }; + var replace = global$1.mac ? mac : other; + var shortcut = source.split('+'); + var updated = map(shortcut, function (segment) { + var search = segment.toLowerCase().trim(); + return has(replace, search) ? replace[search] : segment; + }); + return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + }; + var ConvertShortcut = { convertText: convertText }; + + var tab = function () { + var shortcutList = map(KeyboardShortcuts.shortcuts, function (shortcut) { + var shortcutText = map(shortcut.shortcuts, ConvertShortcut.convertText).join(' or '); + return [ + shortcut.action, + shortcutText + ]; + }); + var tablePanel = { + type: 'table', + header: [ + 'Action', + 'Shortcut' + ], + cells: shortcutList + }; + return { + name: 'shortcuts', + title: 'Handy Shortcuts', + items: [tablePanel] + }; + }; + var KeyboardShortcutsTab = { tab: tab }; + + var supplant = function (str, obj) { + var isStringOrNumber = function (a) { + var t = typeof a; + return t === 'string' || t === 'number'; + }; + return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) { + var value = obj[key]; + return isStringOrNumber(value) ? value.toString() : fullMatch; + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + }, + { + key: 'advcode', + name: 'Advanced Code Editor*' + }, + { + key: 'formatpainter', + name: 'Format Painter*' + }, + { + key: 'powerpaste', + name: 'PowerPaste*' + }, + { + key: 'tinydrive', + name: 'Tiny Drive*' + }, + { + key: 'tinymcespellchecker', + name: 'Spell Checker Pro*' + }, + { + key: 'a11ychecker', + name: 'Accessibility Checker*' + }, + { + key: 'linkchecker', + name: 'Link Checker*' + }, + { + key: 'mentions', + name: 'Mentions*' + }, + { + key: 'mediaembed', + name: 'Enhanced Media Embed*' + }, + { + key: 'checklist', + name: 'Checklist*' + }, + { + key: 'casechange', + name: 'Case Change*' + }, + { + key: 'permanentpen', + name: 'Permanent Pen*' + }, + { + key: 'pageembed', + name: 'Page Embed*' + }, + { + key: 'tinycomments', + name: 'Tiny Comments*' + }, + { + key: 'advtable', + name: 'Advanced Tables*' + }, + { + key: 'autocorrect', + name: 'Autocorrect*' + } + ]; + var PluginUrls = { urls: urls }; + + var tab$1 = function (editor) { + var availablePlugins = function () { + var premiumPlugins = [ + 'Accessibility Checker', + 'Advanced Code Editor', + 'Advanced Tables', + 'Case Change', + 'Checklist', + 'Tiny Comments', + 'Tiny Drive', + 'Enhanced Media Embed', + 'Format Painter', + 'Link Checker', + 'Mentions', + 'MoxieManager', + 'Page Embed', + 'Permanent Pen', + 'PowerPaste', + 'Spell Checker Pro' + ]; + var premiumPluginList = map(premiumPlugins, function (plugin) { + return '
  • ' + global$2.translate(plugin) + '
  • '; + }).join(''); + return '
    ' + '

    ' + global$2.translate('Premium plugins:') + '

    ' + '' + '
    '; + }; + var makeLink = curry(supplant, '${name}'); + var maybeUrlize = function (editor, key) { + return find(PluginUrls.urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + return makeLink({ + name: x.name, + url: 'https://www.tiny.cloud/docs/plugins/' + x.key + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + return editor.settings.forced_plugins === undefined ? keys$1 : filter(keys$1, not(curry(contains, editor.settings.forced_plugins))); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
  • ' + maybeUrlize(editor, key) + '
  • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + var html = '

    ' + global$2.translate([ + 'Plugins installed ({0}):', + count + ]) + '

    ' + '
      ' + pluginsString + '
    '; + return html; + }; + var installedPlugins = function (editor) { + if (editor == null) { + return ''; + } + return '
    ' + pluginLister(editor) + '
    '; + }; + var htmlPanel = { + type: 'htmlpanel', + presets: 'document', + html: [ + installedPlugins(editor), + availablePlugins() + ].join('') + }; + return { + name: 'plugins', + title: 'Plugins', + items: [htmlPanel] + }; + }; + var PluginsTab = { tab: tab$1 }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var tab$2 = function () { + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + var htmlPanel = { + type: 'htmlpanel', + html: '

    ' + global$2.translate([ + 'You are using {0}', + changeLogLink + ]) + '

    ', + presets: 'document' + }; + return { + name: 'versions', + title: 'Version', + items: [htmlPanel] + }; + }; + var VersionTab = { tab: tab$2 }; + + var description = '

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    '; + var tab$3 = function () { + var body = { + type: 'htmlpanel', + presets: 'document', + html: description + }; + return { + name: 'keyboardnav', + title: 'Keyboard Navigation', + items: [body] + }; + }; + var KeyboardNavTab = { tab: tab$3 }; + + var parseHelpTabsSetting = function (tabsFromSettings, tabs) { + var newTabs = {}; + var names = map(tabsFromSettings, function (t) { + if (typeof t === 'string') { + if (has(tabs, t)) { + newTabs[t] = tabs[t]; + } + return t; + } else { + newTabs[t.name] = t; + return t.name; + } + }); + return { + tabs: newTabs, + names: names + }; + }; + var getNamesFromTabs = function (tabs) { + var names = keys(tabs); + var versionsIdx = indexOf(names, 'versions'); + versionsIdx.each(function (idx) { + names.splice(idx, 1); + names.push('versions'); + }); + return { + tabs: tabs, + names: names + }; + }; + var parseCustomTabs = function (editor, customTabs) { + var _a; + var shortcuts = KeyboardShortcutsTab.tab(); + var nav = KeyboardNavTab.tab(); + var plugins = PluginsTab.tab(editor); + var versions = VersionTab.tab(); + var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); + return getHelpTabs(editor).fold(function () { + return getNamesFromTabs(tabs); + }, function (tabsFromSettings) { + return parseHelpTabsSetting(tabsFromSettings, tabs); + }); + }; + var init = function (editor, customTabs) { + return function () { + var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; + var foundTabs = map(names, function (name) { + return get$1(tabs, name); + }); + var dialogTabs = cat(foundTabs); + var body = { + type: 'tabpanel', + tabs: dialogTabs + }; + editor.windowManager.open({ + title: 'Help', + size: 'medium', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: {} + }); + }; + }; + + function Plugin () { + global.add('help', function (editor) { + var customTabs = Cell({}); + var api = get(customTabs); + var dialogOpener = init(editor, customTabs); + Buttons.register(editor, dialogOpener); + Commands.register(editor, dialogOpener); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + return api; + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/help/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/help/plugin.min.js new file mode 100644 index 0000000..4c15c6e --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function e(){}function r(e){return function(){return e}}var a=function(e){function t(){return n}var n=e;return{get:t,set:function(e){n=e},clone:function(){return a(t())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e,t){e.addCommand("mceHelp",t)},s=function(e,t){e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t})},c=function(){return(c=Object.assign||function(e){for(var t,n=1,o=arguments.length;n${name}');return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[(n=e,null==n?"":'
    '+function(t){var e=function(e){var t=F(e.plugins);return e.settings.forced_plugins===undefined?t:function(e,t){for(var n=[],o=0,a=e.length;o"+r(t,e)+""}),o=n.length,a=n.join("");return"

    "+U.translate(["Plugins installed ({0}):",o])+"

      "+a+"
    "}(n)+"
    "),(t=y(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
  • "+U.translate(e)+"
  • "}).join(""),'

    '+U.translate("Premium plugins:")+"

    ")].join("")}]}},N=tinymce.util.Tools.resolve("tinymce.EditorManager"),L=function(){var e,t,n='TinyMCE '+(e=N.majorVersion,t=N.minorVersion,0===e.indexOf("@")?"X.X.X":e+"."+t)+"";return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+U.translate(["You are using {0}",n])+"

    ",presets:"document"}]}},B=function(){return{name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    "}]}};!function z(){t.add("help",function(e){var t=a({}),n=function(n){return{addTab:function(e){var t=n.get();t[e.name]=e,n.set(t)}}}(t),o=A(e,t);return s(e,o),i(e,o),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),n})}()}(); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/hr/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/hr/plugin.js new file mode 100644 index 0000000..984f7b4 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/hr/plugin.js @@ -0,0 +1,48 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var register = function (editor) { + editor.addCommand('InsertHorizontalRule', function () { + editor.execCommand('mceInsertContent', false, '
    '); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('hr', { + icon: 'horizontal-rule', + tooltip: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + editor.ui.registry.addMenuItem('hr', { + icon: 'horizontal-rule', + text: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('hr', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/hr/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 0000000..4660378 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"
    ")})},t=function(n){n.ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return n.execCommand("InsertHorizontalRule")}}),n.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return n.execCommand("InsertHorizontalRule")}})};!function e(){n.add("hr",function(n){o(n),t(n)})}()}(); \ No newline at end of file diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/image/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/image/plugin.js new file mode 100644 index 0000000..0e2b0c3 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/image/plugin.js @@ -0,0 +1,2519 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var identity = function (x) { + return x; + }; + var die = function (msg) { + return function () { + throw new Error(msg); + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isString = isType('string'); + var isObject = isType('object'); + var isArray = isType('array'); + var isBoolean = isType('boolean'); + var isFunction = isType('function'); + var isNumber = isType('number'); + + var nativeSlice = Array.prototype.slice; + var nativePush = Array.prototype.push; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var exports$1 = {}, module = { exports: exports$1 }; + (function (define, exports, module, require) { + (function (f) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = f(); + } else if (typeof define === 'function' && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== 'undefined') { + g = window; + } else if (typeof global !== 'undefined') { + g = global; + } else if (typeof self !== 'undefined') { + g = self; + } else { + g = this; + } + g.EphoxContactWrapper = f(); + } + }(function () { + return function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) + return c(i, !0); + if (u) + return u(i, !0); + var a = new Error('Cannot find module \'' + i + '\''); + throw a.code = 'MODULE_NOT_FOUND', a; + } + var p = n[i] = { exports: {} }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) + o(t[i]); + return o; + } + return r; + }()({ + 1: [ + function (require, module, exports) { + var process = module.exports = {}; + var cachedSetTimeout; + var cachedClearTimeout; + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + }()); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + return setTimeout(fun, 0); + } + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + return clearTimeout(marker); + } + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + return cachedClearTimeout(marker); + } catch (e) { + try { + return cachedClearTimeout.call(null, marker); + } catch (e) { + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; + process.versions = {}; + function noop() { + } + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + process.listeners = function (name) { + return []; + }; + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + process.cwd = function () { + return '/'; + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + }, + {} + ], + 2: [ + function (require, module, exports) { + (function (setImmediate) { + (function (root) { + var setTimeoutFunc = setTimeout; + function noop() { + } + function bind(fn, thisArg) { + return function () { + fn.apply(thisArg, arguments); + }; + } + function Promise(fn) { + if (typeof this !== 'object') + throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') + throw new TypeError('not a function'); + this._state = 0; + this._handled = false; + this._value = undefined; + this._deferreds = []; + doResolve(fn, this); + } + function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + Promise._immediateFn(function () { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + resolve(deferred.promise, ret); + }); + } + function resolve(self, newValue) { + try { + if (newValue === self) + throw new TypeError('A promise cannot be resolved with itself.'); + if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } + } + function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); + } + function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function () { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); + } + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; + } + function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; + } + function doResolve(fn, self) { + var done = false; + try { + fn(function (value) { + if (done) + return; + done = true; + resolve(self, value); + }, function (reason) { + if (done) + return; + done = true; + reject(self, reason); + }); + } catch (ex) { + if (done) + return; + done = true; + reject(self, ex); + } + } + Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); + }; + Promise.prototype.then = function (onFulfilled, onRejected) { + var prom = new this.constructor(noop); + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; + }; + Promise.all = function (arr) { + var args = Array.prototype.slice.call(arr); + return new Promise(function (resolve, reject) { + if (args.length === 0) + return resolve([]); + var remaining = args.length; + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, reject); + return; + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + }; + Promise.resolve = function (value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } + return new Promise(function (resolve) { + resolve(value); + }); + }; + Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); + }; + Promise.race = function (values) { + return new Promise(function (resolve, reject) { + for (var i = 0, len = values.length; i < len; i++) { + values[i].then(resolve, reject); + } + }); + }; + Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { + setImmediate(fn); + } : function (fn) { + setTimeoutFunc(fn, 0); + }; + Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); + } + }; + Promise._setImmediateFn = function _setImmediateFn(fn) { + Promise._immediateFn = fn; + }; + Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { + Promise._unhandledRejectionFn = fn; + }; + if (typeof module !== 'undefined' && module.exports) { + module.exports = Promise; + } else if (!root.Promise) { + root.Promise = Promise; + } + }(this)); + }.call(this, require('timers').setImmediate)); + }, + { 'timers': 3 } + ], + 3: [ + function (require, module, exports) { + (function (setImmediate, clearImmediate) { + var nextTick = require('process/browser.js').nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + exports.setTimeout = function () { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); + }; + exports.setInterval = function () { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); + }; + exports.clearTimeout = exports.clearInterval = function (timeout) { + timeout.close(); + }; + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function () { + }; + Timeout.prototype.close = function () { + this._clearFn.call(window, this._id); + }; + exports.enroll = function (item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + exports.unenroll = function (item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + exports._unrefActive = exports.active = function (item) { + clearTimeout(item._idleTimeoutId); + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } + }; + exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + immediateIds[id] = true; + nextTick(function onNextTick() { + if (immediateIds[id]) { + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + exports.clearImmediate(id); + } + }); + return id; + }; + exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) { + delete immediateIds[id]; + }; + }.call(this, require('timers').setImmediate, require('timers').clearImmediate)); + }, + { + 'process/browser.js': 1, + 'timers': 3 + } + ], + 4: [ + function (require, module, exports) { + var promisePolyfill = require('promise-polyfill'); + var Global = function () { + if (typeof window !== 'undefined') { + return window; + } else { + return Function('return this;')(); + } + }(); + module.exports = { boltExport: Global.Promise || promisePolyfill }; + }, + { 'promise-polyfill': 2 } + ] + }, {}, [4])(4); + })); + }(undefined, exports$1, module, undefined)); + var Promise = module.exports.boltExport; + + var nu = function (baseFn) { + var data = Option.none(); + var callbacks = []; + var map = function (f) { + return nu(function (nCallback) { + get(function (data) { + nCallback(f(data)); + }); + }); + }; + var get = function (nCallback) { + if (isReady()) { + call(nCallback); + } else { + callbacks.push(nCallback); + } + }; + var set = function (x) { + data = Option.some(x); + run(callbacks); + callbacks = []; + }; + var isReady = function () { + return data.isSome(); + }; + var run = function (cbs) { + each(cbs, call); + }; + var call = function (cb) { + data.each(function (x) { + domGlobals.setTimeout(function () { + cb(x); + }, 0); + }); + }; + baseFn(set); + return { + get: get, + map: map, + isReady: isReady + }; + }; + var pure = function (a) { + return nu(function (callback) { + callback(a); + }); + }; + var LazyValue = { + nu: nu, + pure: pure + }; + + var errorReporter = function (err) { + domGlobals.setTimeout(function () { + throw err; + }, 0); + }; + var make = function (run) { + var get = function (callback) { + run().then(callback, errorReporter); + }; + var map = function (fab) { + return make(function () { + return run().then(fab); + }); + }; + var bind = function (aFutureB) { + return make(function () { + return run().then(function (v) { + return aFutureB(v).toPromise(); + }); + }); + }; + var anonBind = function (futureB) { + return make(function () { + return run().then(function () { + return futureB.toPromise(); + }); + }); + }; + var toLazy = function () { + return LazyValue.nu(get); + }; + var toCached = function () { + var cache = null; + return make(function () { + if (cache === null) { + cache = run(); + } + return cache; + }); + }; + var toPromise = run; + return { + map: map, + bind: bind, + anonBind: anonBind, + toLazy: toLazy, + toCached: toCached, + toPromise: toPromise, + get: get + }; + }; + var nu$1 = function (baseFn) { + return make(function () { + return new Promise(baseFn); + }); + }; + var pure$1 = function (a) { + return make(function () { + return Promise.resolve(a); + }); + }; + var Future = { + nu: nu$1, + pure: pure$1 + }; + + var value = function (o) { + var is = function (v) { + return o === v; + }; + var or = function (opt) { + return value(o); + }; + var orThunk = function (f) { + return value(o); + }; + var map = function (f) { + return value(f(o)); + }; + var mapError = function (f) { + return value(o); + }; + var each = function (f) { + f(o); + }; + var bind = function (f) { + return f(o); + }; + var fold = function (_, onValue) { + return onValue(o); + }; + var exists = function (f) { + return f(o); + }; + var forall = function (f) { + return f(o); + }; + var toOption = function () { + return Option.some(o); + }; + return { + is: is, + isValue: always, + isError: never, + getOr: constant(o), + getOrThunk: constant(o), + getOrDie: constant(o), + or: or, + orThunk: orThunk, + fold: fold, + map: map, + mapError: mapError, + each: each, + bind: bind, + exists: exists, + forall: forall, + toOption: toOption + }; + }; + var error = function (message) { + var getOrThunk = function (f) { + return f(); + }; + var getOrDie = function () { + return die(String(message))(); + }; + var or = function (opt) { + return opt; + }; + var orThunk = function (f) { + return f(); + }; + var map = function (f) { + return error(message); + }; + var mapError = function (f) { + return error(f(message)); + }; + var bind = function (f) { + return error(message); + }; + var fold = function (onError, _) { + return onError(message); + }; + return { + is: never, + isValue: never, + isError: always, + getOr: identity, + getOrThunk: getOrThunk, + getOrDie: getOrDie, + or: or, + orThunk: orThunk, + fold: fold, + map: map, + mapError: mapError, + each: noop, + bind: bind, + exists: never, + forall: always, + toOption: Option.none + }; + }; + var fromOption = function (opt, err) { + return opt.fold(function () { + return error(err); + }, value); + }; + var Result = { + value: value, + error: error, + fromOption: fromOption + }; + + var wrap = function (delegate) { + var toCached = function () { + return wrap(delegate.toCached()); + }; + var bindFuture = function (f) { + return wrap(delegate.bind(function (resA) { + return resA.fold(function (err) { + return Future.pure(Result.error(err)); + }, function (a) { + return f(a); + }); + })); + }; + var bindResult = function (f) { + return wrap(delegate.map(function (resA) { + return resA.bind(f); + })); + }; + var mapResult = function (f) { + return wrap(delegate.map(function (resA) { + return resA.map(f); + })); + }; + var mapError = function (f) { + return wrap(delegate.map(function (resA) { + return resA.mapError(f); + })); + }; + var foldResult = function (whenError, whenValue) { + return delegate.map(function (res) { + return res.fold(whenError, whenValue); + }); + }; + var withTimeout = function (timeout, errorThunk) { + return wrap(Future.nu(function (callback) { + var timedOut = false; + var timer = domGlobals.setTimeout(function () { + timedOut = true; + callback(Result.error(errorThunk())); + }, timeout); + delegate.get(function (result) { + if (!timedOut) { + domGlobals.clearTimeout(timer); + callback(result); + } + }); + })); + }; + return __assign(__assign({}, delegate), { + toCached: toCached, + bindFuture: bindFuture, + bindResult: bindResult, + mapResult: mapResult, + mapError: mapError, + foldResult: foldResult, + withTimeout: withTimeout + }); + }; + var nu$2 = function (worker) { + return wrap(Future.nu(worker)); + }; + var value$1 = function (value) { + return wrap(Future.pure(Result.value(value))); + }; + var error$1 = function (error) { + return wrap(Future.pure(Result.error(error))); + }; + var fromResult = function (result) { + return wrap(Future.pure(result)); + }; + var fromFuture = function (future) { + return wrap(future.map(Result.value)); + }; + var fromPromise = function (promise) { + return nu$2(function (completer) { + promise.then(function (value) { + completer(Result.value(value)); + }, function (error) { + completer(Result.error(error)); + }); + }); + }; + var FutureResult = { + nu: nu$2, + wrap: wrap, + pure: value$1, + value: value$1, + error: error$1, + fromResult: fromResult, + fromFuture: fromFuture, + fromPromise: fromPromise + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var deep = function (old, nu) { + var bothObjects = isObject(old) && isObject(nu); + return bothObjects ? deepMerge(old, nu) : nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var deepMerge = baseMerge(deep); + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var hasDimensions = function (editor) { + return editor.getParam('image_dimensions', true, 'boolean'); + }; + var hasAdvTab = function (editor) { + return editor.getParam('image_advtab', false, 'boolean'); + }; + var hasUploadTab = function (editor) { + return editor.getParam('image_uploadtab', true, 'boolean'); + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', '', 'string'); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.getParam('image_description', true, 'boolean'); + }; + var hasImageTitle = function (editor) { + return editor.getParam('image_title', false, 'boolean'); + }; + var hasImageCaption = function (editor) { + return editor.getParam('image_caption', false, 'boolean'); + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return !!getUploadUrl(editor); + }; + var hasUploadHandler = function (editor) { + return !!getUploadHandler(editor); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url', '', 'string'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', undefined, 'function'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path', undefined, 'string'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials', false, 'boolean'); + }; + var showAccessibilityOptions = function (editor) { + return editor.getParam('a11y_advanced_options', false, 'boolean'); + }; + var isAutomaticUploadsEnabled = function (editor) { + return editor.getParam('automatic_uploads', true, 'boolean'); + }; + var Settings = { + hasDimensions: hasDimensions, + hasUploadTab: hasUploadTab, + hasAdvTab: hasAdvTab, + getPrependUrl: getPrependUrl, + getClassList: getClassList, + hasDescription: hasDescription, + hasImageTitle: hasImageTitle, + hasImageCaption: hasImageCaption, + getImageList: getImageList, + hasUploadUrl: hasUploadUrl, + hasUploadHandler: hasUploadHandler, + getUploadUrl: getUploadUrl, + getUploadHandler: getUploadHandler, + getUploadBasePath: getUploadBasePath, + getUploadCredentials: getUploadCredentials, + showAccessibilityOptions: showAccessibilityOptions, + isAutomaticUploadsEnabled: isAutomaticUploadsEnabled + }; + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url, callback) { + var img = domGlobals.document.createElement('img'); + var done = function (dimensions) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + var dimensions = { + width: width, + height: height + }; + done(Result.value(dimensions)); + }; + img.onerror = function () { + done(Result.error('Failed to get image dimensions for: ' + url)); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + domGlobals.document.body.appendChild(img); + img.src = url; + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = String(css.margin).split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = Settings.getImageList(editor); + if (typeof imageList === 'string') { + global$4.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + var selectImage = function () { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + }; + imgElm.onload = function () { + if (!data.width && !data.height && Settings.hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: String(imgElm.clientWidth), + height: String(imgElm.clientHeight) + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$3(function (resolve, reject) { + var reader = new domGlobals.FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var isPlaceholderImage = function (imgElm) { + return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + }; + var Utils = { + getImageSize: getImageSize, + removePixelSuffix: removePixelSuffix, + addPixelSuffix: addPixelSuffix, + mergeMargins: mergeMargins, + createImageList: createImageList, + waitLoadImage: waitLoadImage, + blobToDataUri: blobToDataUri, + isPlaceholderImage: isPlaceholderImage + }; + + var DOM = global$2.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return Utils.removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return Utils.removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return Utils.removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var setAttrib = function (image, name, value) { + image.setAttribute(name, value); + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = Utils.addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + setAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return Utils.removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var isImage = function (elm) { + return elm.nodeName === 'IMG'; + }; + var getIsDecorative = function (image) { + return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + }; + var getAlt = function (image) { + if (getIsDecorative(image)) { + return ''; + } else { + return getAttrib(image, 'alt'); + } + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + setAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data, info) { + var image = domGlobals.document.createElement('img'); + write(normalizeCss, __assign(__assign({}, data), { caption: false }), image, info); + setAlt(image, data.alt, data.isDecorative, info); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle'), + isDecorative: getIsDecorative(image) + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var setAlt = function (image, alt, isDecorative, info) { + if (isDecorative) { + DOM.setAttrib(image, 'role', 'presentation'); + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', ''); + } else { + if (info.hasAccessibilityOptions) { + DOM.setAttrib(image, 'alt', alt); + } else { + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', alt); + } + if (DOM.getAttrib(image, 'role') === 'presentation') { + DOM.setAttrib(image, 'role', ''); + } + } + }; + var updateAlt = function (image, oldData, newData, info) { + if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { + setAlt(image, newData.alt, newData.isDecorative, info); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image, info) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', setAttrib); + updateProp(image, oldData, newData, 'title', setAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', setAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return setAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + updateAlt(image, oldData, newData, info); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = Utils.mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || Utils.isPlaceholderImage(imgElm))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return !!editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data, info) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data, info); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data, info) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image, info); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + Utils.waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, data, info) { + var image = getSelectedImage(editor); + if (image) { + if (data.src) { + writeImageDataToSelection(editor, data, info); + } else { + deleteImage(editor, image); + } + } else if (data.src) { + insertImageAtCaret(editor, data, info); + } + }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$5.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizer = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + if (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + } else { + return Option.none(); + } + }; + }; + var sanitize = function (list) { + return sanitizer(getValue)(list); + }; + var isGroup = function (item) { + return Object.prototype.hasOwnProperty.call(item, 'items'); + }; + var findEntryDelegate = function (list, value) { + return findMap(list, function (item) { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Option.some(item); + } else { + return Option.none(); + } + }); + }; + var findEntry = function (optList, value) { + return optList.bind(function (list) { + return findEntryDelegate(list, value); + }); + }; + var ListUtils = { + sanitizer: sanitizer, + sanitize: sanitize, + findEntry: findEntry + }; + + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr, formData; + xhr = new domGlobals.XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + var json; + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + formData = new domGlobals.FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$3(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$3.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$5.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var makeTab = function (info) { + return { + title: 'Advanced', + name: 'advanced', + items: [ + { + type: 'input', + label: 'Style', + name: 'style' + }, + { + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'selectbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var collect = function (editor) { + var urlListSanitizer = ListUtils.sanitizer(function (item) { + return editor.convertURL(item.value || item.url, 'src'); + }); + var futureImageList = Future.nu(function (completer) { + Utils.createImageList(editor, function (imageList) { + completer(urlListSanitizer(imageList).map(function (items) { + return flatten([ + [{ + text: 'None', + value: '' + }], + items + ]); + })); + }); + }); + var classList = ListUtils.sanitize(Settings.getClassList(editor)); + var hasAdvTab = Settings.hasAdvTab(editor); + var hasUploadTab = Settings.hasUploadTab(editor); + var hasUploadUrl = Settings.hasUploadUrl(editor); + var hasUploadHandler = Settings.hasUploadHandler(editor); + var image = readImageDataFromSelection(editor); + var hasDescription = Settings.hasDescription(editor); + var hasImageTitle = Settings.hasImageTitle(editor); + var hasDimensions = Settings.hasDimensions(editor); + var hasImageCaption = Settings.hasImageCaption(editor); + var hasAccessibilityOptions = Settings.showAccessibilityOptions(editor); + var url = Settings.getUploadUrl(editor); + var basePath = Settings.getUploadBasePath(editor); + var credentials = Settings.getUploadCredentials(editor); + var handler = Settings.getUploadHandler(editor); + var automaticUploads = Settings.isAutomaticUploadsEnabled(editor); + var prependURL = Option.some(Settings.getPrependUrl(editor)).filter(function (preUrl) { + return isString(preUrl) && preUrl.length > 0; + }); + return futureImageList.map(function (imageList) { + return { + image: image, + imageList: imageList, + classList: classList, + hasAdvTab: hasAdvTab, + hasUploadTab: hasUploadTab, + hasUploadUrl: hasUploadUrl, + hasUploadHandler: hasUploadHandler, + hasDescription: hasDescription, + hasImageTitle: hasImageTitle, + hasDimensions: hasDimensions, + hasImageCaption: hasImageCaption, + url: url, + basePath: basePath, + credentials: credentials, + handler: handler, + prependURL: prependURL, + hasAccessibilityOptions: hasAccessibilityOptions, + automaticUploads: automaticUploads + }; + }); + }; + + var makeItems = function (info) { + var imageUrl = { + name: 'src', + type: 'urlinput', + filetype: 'image', + label: 'Source' + }; + var imageList = info.imageList.map(function (items) { + return { + name: 'images', + type: 'selectbox', + label: 'Image list', + items: items + }; + }); + var imageDescription = { + name: 'alt', + type: 'input', + label: 'Alternative description', + disabled: info.hasAccessibilityOptions && info.image.isDecorative + }; + var imageTitle = { + name: 'title', + type: 'input', + label: 'Image title' + }; + var imageDimensions = { + name: 'dimensions', + type: 'sizeinput' + }; + var isDecorative = { + type: 'label', + label: 'Accessibility', + items: [{ + name: 'isDecorative', + type: 'checkbox', + label: 'Image is decorative' + }] + }; + var classList = info.classList.map(function (items) { + return { + name: 'classes', + type: 'selectbox', + label: 'Class', + items: items + }; + }); + var caption = { + type: 'label', + label: 'Caption', + items: [{ + type: 'checkbox', + name: 'caption', + label: 'Show caption' + }] + }; + return flatten([ + [imageUrl], + imageList.toArray(), + info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [], + info.hasDescription ? [imageDescription] : [], + info.hasImageTitle ? [imageTitle] : [], + info.hasDimensions ? [imageDimensions] : [], + [{ + type: 'grid', + columns: 2, + items: flatten([ + classList.toArray(), + info.hasImageCaption ? [caption] : [] + ]) + }] + ]); + }; + var makeTab$1 = function (info) { + return { + title: 'General', + name: 'general', + items: makeItems(info) + }; + }; + var MainTab = { + makeTab: makeTab$1, + makeItems: makeItems + }; + + var makeTab$2 = function (info) { + var items = [{ + type: 'dropzone', + name: 'fileinput' + }]; + return { + title: 'Upload', + name: 'upload', + items: items + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + var createState = function (info) { + return { + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }; + }; + var fromImageData = function (image) { + return { + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }; + }; + var toImageData = function (data) { + return { + src: data.src.value, + alt: data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }; + }; + var addPrependUrl2 = function (info, srcURL) { + if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { + return info.prependURL.bind(function (prependUrl) { + if (srcURL.substring(0, prependUrl.length) !== prependUrl) { + return Option.some(prependUrl + srcURL); + } + return Option.none(); + }); + } + return Option.none(); + }; + var addPrependUrl = function (info, api) { + var data = api.getData(); + addPrependUrl2(info, data.src.value).each(function (srcURL) { + api.setData({ + src: { + value: srcURL, + meta: data.src.meta + } + }); + }); + }; + var formFillFromMeta2 = function (info, data, meta) { + if (info.hasDescription && isString(meta.alt)) { + data.alt = meta.alt; + } + if (info.hasAccessibilityOptions) { + data.isDecorative = meta.isDecorative || false; + } + if (info.hasImageTitle && isString(meta.title)) { + data.title = meta.title; + } + if (info.hasDimensions) { + if (isString(meta.width)) { + data.dimensions.width = meta.width; + } + if (isString(meta.height)) { + data.dimensions.height = meta.height; + } + } + if (isString(meta.class)) { + ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + data.classes = entry.value; + }); + } + if (info.hasImageCaption) { + if (isBoolean(meta.caption)) { + data.caption = meta.caption; + } + } + if (info.hasAdvTab) { + if (isString(meta.style)) { + data.style = meta.style; + } + if (isString(meta.vspace)) { + data.vspace = meta.vspace; + } + if (isString(meta.border)) { + data.border = meta.border; + } + if (isString(meta.hspace)) { + data.hspace = meta.hspace; + } + if (isString(meta.borderstyle)) { + data.borderstyle = meta.borderstyle; + } + } + }; + var formFillFromMeta = function (info, api) { + var data = api.getData(); + var meta = data.src.meta; + if (meta !== undefined) { + var newData = deepMerge({}, data); + formFillFromMeta2(info, newData, meta); + api.setData(newData); + } + }; + var calculateImageSize = function (helpers, info, state, api) { + var data = api.getData(); + var url = data.src.value; + var meta = data.src.meta || {}; + if (!meta.width && !meta.height && info.hasDimensions) { + helpers.imageSize(url).get(function (result) { + result.each(function (size) { + if (state.open) { + api.setData({ dimensions: size }); + } + }); + }); + } + }; + var updateImagesDropdown = function (info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.src.value); + state.prevImage = image; + api.setData({ + images: image.map(function (entry) { + return entry.value; + }).getOr('') + }); + }; + var changeSrc = function (helpers, info, state, api) { + addPrependUrl(info, api); + formFillFromMeta(info, api); + calculateImageSize(helpers, info, state, api); + updateImagesDropdown(info, state, api); + }; + var changeImages = function (helpers, info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.images); + image.each(function (img) { + var updateAlt = data.alt === '' || state.prevImage.map(function (image) { + return image.text === data.alt; + }).getOr(false); + if (updateAlt) { + if (img.value === '') { + api.setData({ + src: img, + alt: state.prevAlt + }); + } else { + api.setData({ + src: img, + alt: img.text + }); + } + } else { + api.setData({ src: img }); + } + }); + state.prevImage = image; + changeSrc(helpers, info, state, api); + }; + var calcVSpace = function (css) { + var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; + return matchingTopBottom ? Utils.removePixelSuffix(String(css['margin-top'])) : ''; + }; + var calcHSpace = function (css) { + var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; + return matchingLeftRight ? Utils.removePixelSuffix(String(css['margin-right'])) : ''; + }; + var calcBorderWidth = function (css) { + return css['border-width'] ? Utils.removePixelSuffix(String(css['border-width'])) : ''; + }; + var calcBorderStyle = function (css) { + return css['border-style'] ? String(css['border-style']) : ''; + }; + var calcStyle = function (parseStyle, serializeStyle, css) { + return serializeStyle(parseStyle(serializeStyle(css))); + }; + var changeStyle2 = function (parseStyle, serializeStyle, data) { + var css = Utils.mergeMargins(parseStyle(data.style)); + var dataCopy = deepMerge({}, data); + dataCopy.vspace = calcVSpace(css); + dataCopy.hspace = calcHSpace(css); + dataCopy.border = calcBorderWidth(css); + dataCopy.borderstyle = calcBorderStyle(css); + dataCopy.style = calcStyle(parseStyle, serializeStyle, css); + return dataCopy; + }; + var changeStyle = function (helpers, api) { + var data = api.getData(); + var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); + api.setData(newData); + }; + var changeAStyle = function (helpers, info, api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + var style = getStyleValue(helpers.normalizeCss, toImageData(data)); + api.setData({ style: style }); + }; + var changeFileInput = function (helpers, info, state, api) { + var data = api.getData(); + api.block('Uploading image'); + head(data.fileinput).fold(function () { + api.unblock(); + }, function (file) { + var blobUri = domGlobals.URL.createObjectURL(file); + var uploader = Uploader({ + url: info.url, + basePath: info.basePath, + credentials: info.credentials, + handler: info.handler + }); + var finalize = function () { + api.unblock(); + domGlobals.URL.revokeObjectURL(blobUri); + }; + var updateSrcAndSwitchTab = function (url) { + api.setData({ + src: { + value: url, + meta: {} + } + }); + api.showTab('general'); + changeSrc(helpers, info, state, api); + }; + Utils.blobToDataUri(file).then(function (dataUrl) { + var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + if (info.automaticUploads) { + uploader.upload(blobInfo).then(function (url) { + updateSrcAndSwitchTab(url); + finalize(); + }).catch(function (err) { + finalize(); + helpers.alertErr(api, err); + }); + } else { + helpers.addToBlobCache(blobInfo); + updateSrcAndSwitchTab(blobInfo.blobUri()); + api.unblock(); + } + }); + }); + }; + var changeHandler = function (helpers, info, state) { + return function (api, evt) { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'style') { + changeStyle(helpers, api); + } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { + changeAStyle(helpers, info, api); + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + if (api.getData().isDecorative) { + api.disable('alt'); + } else { + api.enable('alt'); + } + } + }; + }; + var closeHandler = function (state) { + return function () { + state.open = false; + }; + }; + var makeDialogBody = function (info) { + if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { + var tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [MainTab.makeTab(info)], + info.hasAdvTab ? [AdvTab.makeTab(info)] : [], + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + ]) + }; + return tabPanel; + } else { + var panel = { + type: 'panel', + items: MainTab.makeItems(info) + }; + return panel; + } + }; + var makeDialog = function (helpers) { + return function (info) { + var state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: helpers.onSubmit(info), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }; + }; + var submitHandler = function (editor) { + return function (info) { + return function (api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + editor.undoManager.transact(function () { + insertOrUpdateImage(editor, toImageData(data), info); + }); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + }; + }; + var imageSize = function (editor) { + return function (url) { + return FutureResult.nu(function (completer) { + Utils.getImageSize(editor.documentBaseURI.toAbsolute(url), function (data) { + var result = data.map(function (dimensions) { + return { + width: String(dimensions.width), + height: String(dimensions.height) + }; + }); + completer(result); + }); + }); + }; + }; + var createBlobCache = function (editor) { + return function (file, blobUri, dataUrl) { + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + base64: dataUrl.split(',')[1] + }); + }; + }; + var addToBlobCache = function (editor) { + return function (blobInfo) { + editor.editorUpload.blobCache.add(blobInfo); + }; + }; + var alertErr = function (editor) { + return function (api, message) { + editor.windowManager.alert(message, api.close); + }; + }; + var normalizeCss$1 = function (editor) { + return function (cssText) { + return normalizeCss(editor, cssText); + }; + }; + var parseStyle = function (editor) { + return function (cssText) { + return editor.dom.parseStyle(cssText); + }; + }; + var serializeStyle = function (editor) { + return function (stylesArg, name) { + return editor.dom.serializeStyle(stylesArg, name); + }; + }; + var Dialog = function (editor) { + var helpers = { + onSubmit: submitHandler(editor), + imageSize: imageSize(editor), + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + normalizeCss: normalizeCss$1(editor), + parseStyle: parseStyle(editor), + serializeStyle: serializeStyle(editor) + }; + var open = function () { + return collect(editor).map(makeDialog(helpers)).get(function (spec) { + editor.windowManager.open(spec); + }); + }; + return { open: open }; + }; + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).open); + }; + var Commands = { register: register }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + var node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$5.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('PreInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + var FilterContent = { setup: setup }; + + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onAction: Dialog(editor).open, + onSetup: function (buttonApi) { + return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + } + }); + editor.ui.registry.addMenuItem('image', { + icon: 'image', + text: 'Image...', + onAction: Dialog(editor).open + }); + editor.ui.registry.addContextMenu('image', { + update: function (element) { + return isFigure(element) || isImage(element) && !Utils.isPlaceholderImage(element) ? ['image'] : []; + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global$1.add('image', function (editor) { + FilterContent.setup(editor); + Buttons.register(editor); + Commands.register(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/image/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..dabe6ff --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(s){"use strict";function o(){}function a(t){return function(){return t}}function t(t){return t}function e(){return l}var n,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=a(!1),c=a(!0),l=(n={fold:function(t,e){return t()},is:u,isSome:u,isNone:c,getOr:d,getOrThunk:f,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:a(null),getOrUndefined:a(undefined),or:d,orThunk:f,map:e,each:o,bind:e,exists:u,forall:c,filter:e,equals:i,equals_:i,toArray:function(){return[]},toString:a("none()")},Object.freeze&&Object.freeze(n),n);function i(t){return t.isNone()}function f(t){return t()}function d(t){return t}function m(e){return function(t){return function(t){if(null===t)return"null";var e=typeof t;return"object"==e&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":e}(t)===e}}function T(t){for(var e=[],n=0,r=t.length;n= 300 ? Errors.handleServiceErrorResponse(result.status, result.blob) : global$3.resolve(result.blob); + }); + }; + function requestBlob(url, withCredentials) { + return Utils.requestUrlAsBlob(url, {}, withCredentials).then(function (result) { + return result.status < 200 || result.status >= 300 ? Errors.handleHttpError(result.status) : global$3.resolve(result.blob); + }); + } + var getUrl = function (url, apiKey, withCredentials) { + return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials); + }; + + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionPreceding = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING); + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + var Node = { + documentPositionPreceding: documentPositionPreceding, + documentPositionContainedBy: documentPositionContainedBy + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var isBrowser = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isEdge: isBrowser(edge, current), + isChrome: isBrowser(chrome, current), + isIE: isBrowser(ie, current), + isOpera: isBrowser(opera, current), + isFirefox: isBrowser(firefox, current), + isSafari: isBrowser(safari, current) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var chromeos = 'ChromeOS'; + var isOS = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isWindows: isOS(windows, current), + isiOS: isOS(ios, current), + isAndroid: isOS(android, current), + isOSX: isOS(osx, current), + isLinux: isOS(linux, current), + isSolaris: isOS(solaris, current), + isFreeBSD: isOS(freebsd, current), + isChromeOS: isOS(chromeos, current) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + var DeviceType = function (os, browser, userAgent, mediaMatch) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isMobile = os.isiOS() || os.isAndroid(); + var isTouch = isMobile || mediaMatch('(pointer:coarse)'); + var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + var isPhone = isiPhone || isMobile && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + var isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var detect$2 = function (userAgent, mediaMatch) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var mediaMatch = function (query) { + return domGlobals.window.matchMedia(query).matches; + }; + var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch)); + var detect$3 = function () { + return platform.get(); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var ELEMENT$1 = ELEMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = detect$3().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var child = function (scope, predicate) { + var pred = function (node) { + return predicate(Element.fromDom(node)); + }; + var result = find(scope.dom().childNodes, pred); + return result.map(Element.fromDom); + }; + + var child$1 = function (scope, selector) { + return child(scope, function (e) { + return is(e, selector); + }); + }; + + var count = 0; + var getFigureImg = function (elem) { + return child$1(Element.fromDom(elem), 'img'); + }; + var isFigure = function (editor, elem) { + return editor.dom.is(elem, 'figure'); + }; + var getEditableImage = function (editor, elem) { + var isImage = function (imgNode) { + return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); + }; + var isEditable = function (imgNode) { + return isImage(imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || editor.settings.imagetools_proxy); + }; + if (isFigure(editor, elem)) { + var imgOpt = getFigureImg(elem); + return imgOpt.map(function (img) { + return isEditable(img.dom()) ? Option.some(img.dom()) : Option.none(); + }); + } + return isEditable(elem) ? Option.some(elem) : Option.none(); + }; + var displayError = function (editor, error) { + editor.notificationManager.open({ + text: error, + type: 'error' + }); + }; + var getSelectedImage = function (editor) { + var elem = editor.selection.getNode(); + if (isFigure(editor, elem)) { + return getFigureImg(elem); + } else { + return Option.some(Element.fromDom(elem)); + } + }; + var extractFilename = function (editor, url) { + var m = url.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i); + if (m) { + return editor.dom.encode(m[1]); + } + return null; + }; + var createId = function () { + return 'imagetools' + count++; + }; + var isLocalImage = function (editor, img) { + var url = img.src; + return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host; + }; + var isCorsImage = function (editor, img) { + return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1; + }; + var isCorsWithCredentialsImage = function (editor, img) { + return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1; + }; + var defaultFetchImage = function (editor, img) { + var src = img.src, apiKey; + if (isCorsImage(editor, img)) { + return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); + } + if (!isLocalImage(editor, img)) { + src = getProxyUrl(editor); + src += (src.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); + apiKey = getApiKey(editor); + return getUrl(src, apiKey, false); + } + return imageToBlob$1(img); + }; + var imageToBlob$2 = function (editor, img) { + return getFetchImage(editor).fold(function () { + return defaultFetchImage(editor, img); + }, function (customFetchImage) { + return customFetchImage(img); + }); + }; + var findBlob = function (editor, img) { + var blobInfo; + blobInfo = editor.editorUpload.blobCache.getByUri(img.src); + if (blobInfo) { + return global$3.resolve(blobInfo.blob()); + } + return imageToBlob$2(editor, img); + }; + var startTimedUpload = function (editor, imageUploadTimerState) { + var imageUploadTimer = global$2.setEditorTimeout(editor, function () { + editor.editorUpload.uploadImagesAuto(); + }, getUploadTimeout(editor)); + imageUploadTimerState.set(imageUploadTimer); + }; + var cancelTimedUpload = function (imageUploadTimerState) { + global$2.clearTimeout(imageUploadTimerState.get()); + }; + var updateSelectedImage = function (editor, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { + return ir.toBlob().then(function (blob) { + var uri, name, blobCache, blobInfo; + blobCache = editor.editorUpload.blobCache; + uri = selectedImage.src; + if (shouldReuseFilename(editor)) { + blobInfo = blobCache.getByUri(uri); + if (blobInfo) { + uri = blobInfo.uri(); + name = blobInfo.name(); + } else { + name = extractFilename(editor, uri); + } + } + blobInfo = blobCache.create({ + id: createId(), + blob: blob, + base64: ir.toBase64(), + uri: uri, + name: name + }); + blobCache.add(blobInfo); + editor.undoManager.transact(function () { + function imageLoadedHandler() { + editor.$(selectedImage).off('load', imageLoadedHandler); + editor.nodeChanged(); + if (uploadImmediately) { + editor.editorUpload.uploadImagesAuto(); + } else { + cancelTimedUpload(imageUploadTimerState); + startTimedUpload(editor, imageUploadTimerState); + } + } + editor.$(selectedImage).on('load', imageLoadedHandler); + if (size) { + editor.$(selectedImage).attr({ + width: size.w, + height: size.h + }); + } + editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); + }); + return blobInfo; + }); + }; + var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { + return function () { + var imgOpt = getSelectedImage(editor); + return imgOpt.fold(function () { + displayError(editor, 'Could not find selected image'); + }, function (img) { + return editor._scanForImages().then(function () { + return findBlob(editor, img.dom()); + }).then(blobToImageResult).then(fn).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, false, imageUploadTimerState, img.dom(), size); + }, function (error) { + displayError(editor, error); + }); + }); + }; + }; + var rotate$2 = function (editor, imageUploadTimerState, angle) { + return function () { + var imgOpt = getSelectedImage(editor); + var flippedSize = imgOpt.fold(function () { + return null; + }, function (img) { + var size = ImageSize.getImageSize(img.dom()); + return size ? { + w: size.h, + h: size.w + } : null; + }); + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return rotate$1(imageResult, angle); + }, flippedSize)(); + }; + }; + var flip$2 = function (editor, imageUploadTimerState, axis) { + return function () { + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return flip$1(imageResult, axis); + })(); + }; + }; + var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { + return new global$3(function (resolve) { + blobToImage$1(blob).then(function (newImage) { + var newSize = ImageSize.getNaturalImageSize(newImage); + if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { + if (ImageSize.getImageSize(img)) { + ImageSize.setImageSize(img, newSize); + } + } + domGlobals.URL.revokeObjectURL(newImage.src); + return blob; + }).then(blobToImageResult).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, true, imageUploadTimerState, img); + }, function () { + }); + }); + }; + var Actions = { + rotate: rotate$2, + flip: flip$2, + getEditableImage: getEditableImage, + cancelTimedUpload: cancelTimedUpload, + findBlob: findBlob, + getSelectedImage: getSelectedImage, + handleDialogBlob: handleDialogBlob + }; + + var saveState = constant('save-state'); + var disable = constant('disable'); + var enable = constant('enable'); + + var createState = function (blob) { + return { + blob: blob, + url: domGlobals.URL.createObjectURL(blob) + }; + }; + var makeOpen = function (editor, imageUploadTimerState) { + return function () { + var getLoadedSpec = function (currentState) { + return { + title: 'Edit Image', + size: 'large', + body: { + type: 'panel', + items: [{ + type: 'imagetools', + name: 'imagetools', + label: 'Edit Image', + currentState: currentState + }] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true, + disabled: true + } + ], + onSubmit: function (api) { + var blob = api.getData().imagetools.blob; + originalImgOpt.each(function (originalImg) { + originalSizeOpt.each(function (originalSize) { + Actions.handleDialogBlob(editor, imageUploadTimerState, originalImg.dom(), originalSize, blob); + }); + }); + api.close(); + }, + onCancel: function () { + }, + onAction: function (api, details) { + switch (details.name) { + case saveState(): + if (details.value) { + api.enable('save'); + } else { + api.disable('save'); + } + break; + case disable(): + api.disable('save'); + api.disable('cancel'); + break; + case enable(): + api.enable('cancel'); + break; + } + } + }; + }; + var originalImgOpt = Actions.getSelectedImage(editor); + var originalSizeOpt = originalImgOpt.map(function (origImg) { + return ImageSize.getNaturalImageSize(origImg.dom()); + }); + var imgOpt = Actions.getSelectedImage(editor); + imgOpt.each(function (img) { + Actions.getEditableImage(editor, img.dom()).each(function (_) { + Actions.findBlob(editor, img.dom()).then(function (blob) { + var state = createState(blob); + editor.windowManager.open(getLoadedSpec(state)); + }); + }); + }); + }; + }; + var Dialog = { makeOpen: makeOpen }; + + var register = function (editor, imageUploadTimerState) { + global$1.each({ + mceImageRotateLeft: Actions.rotate(editor, imageUploadTimerState, -90), + mceImageRotateRight: Actions.rotate(editor, imageUploadTimerState, 90), + mceImageFlipVertical: Actions.flip(editor, imageUploadTimerState, 'v'), + mceImageFlipHorizontal: Actions.flip(editor, imageUploadTimerState, 'h'), + mceEditImage: Dialog.makeOpen(editor, imageUploadTimerState) + }, function (fn, cmd) { + editor.addCommand(cmd, fn); + }); + }; + var Commands = { register: register }; + + var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { + editor.on('NodeChange', function (e) { + var lastSelectedImage = lastSelectedImageState.get(); + if (lastSelectedImage && lastSelectedImage.src !== e.element.src) { + Actions.cancelTimedUpload(imageUploadTimerState); + editor.editorUpload.uploadImagesAuto(); + lastSelectedImageState.set(null); + } + Actions.getEditableImage(editor, e.element).each(lastSelectedImageState.set); + }); + }; + var UploadSelectedImage = { setup: setup }; + + var register$1 = function (editor) { + var cmd = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + editor.ui.registry.addButton('rotateleft', { + tooltip: 'Rotate counterclockwise', + icon: 'rotate-left', + onAction: cmd('mceImageRotateLeft') + }); + editor.ui.registry.addButton('rotateright', { + tooltip: 'Rotate clockwise', + icon: 'rotate-right', + onAction: cmd('mceImageRotateRight') + }); + editor.ui.registry.addButton('flipv', { + tooltip: 'Flip vertically', + icon: 'flip-vertically', + onAction: cmd('mceImageFlipVertical') + }); + editor.ui.registry.addButton('fliph', { + tooltip: 'Flip horizontally', + icon: 'flip-horizontally', + onAction: cmd('mceImageFlipHorizontal') + }); + editor.ui.registry.addButton('editimage', { + tooltip: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage'), + onSetup: function (buttonApi) { + var setDisabled = function () { + var elementOpt = Actions.getSelectedImage(editor); + elementOpt.each(function (element) { + var disabled = Actions.getEditableImage(editor, element.dom()).isNone(); + buttonApi.setDisabled(disabled); + }); + }; + editor.on('NodeChange', setDisabled); + return function () { + editor.off('NodeChange', setDisabled); + }; + } + }); + editor.ui.registry.addButton('imageoptions', { + tooltip: 'Image options', + icon: 'image-options', + onAction: cmd('mceImage') + }); + editor.ui.registry.addContextMenu('imagetools', { + update: function (element) { + return Actions.getEditableImage(editor, element).fold(function () { + return []; + }, function (_) { + return [{ + text: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage') + }]; + }); + } + }); + }; + var Buttons = { register: register$1 }; + + var register$2 = function (editor) { + editor.ui.registry.addContextToolbar('imagetools', { + items: getToolbarItems(editor), + predicate: function (elem) { + return Actions.getEditableImage(editor, elem).isSome(); + }, + position: 'node', + scope: 'node' + }); + }; + var ContextToolbar = { register: register$2 }; + + function Plugin () { + global.add('imagetools', function (editor) { + var imageUploadTimerState = Cell(0); + var lastSelectedImageState = Cell(null); + Commands.register(editor, imageUploadTimerState); + Buttons.register(editor); + ContextToolbar.register(editor); + UploadSelectedImage.setup(editor, imageUploadTimerState, lastSelectedImageState); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/imagetools/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 0000000..bc4f05e --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(v){"use strict";function e(){}function n(){return c}var t,r=function(e){function n(){return t}var t=e;return{get:n,set:function(e){t=e},clone:function(){return r(n())}}},o=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(e){return function(){return e}},u=d(!1),a=d(!0),c=(t={fold:function(e,n){return e()},is:u,isSome:u,isNone:a,getOr:l,getOrThunk:f,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:d(null),getOrUndefined:d(undefined),or:l,orThunk:f,map:n,each:e,bind:n,exists:u,forall:a,filter:n,equals:s,equals_:s,toArray:function(){return[]},toString:d("none()")},Object.freeze&&Object.freeze(t),t);function s(e){return e.isNone()}function f(e){return e()}function l(e){return e}var m=function(t){function e(){return o}function n(e){return e(t)}var r=d(t),o={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:a,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return m(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?o:c},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(u,function(e){return n(t,e)})}};return o},p={some:m,none:n,from:function(e){return null===e||e===undefined?c:m(e)}};function h(e,n){return y(v.document.createElement("canvas"),e,n)}function g(e){var n=h(e.width,e.height);return w(n).drawImage(e,0,0),n}function w(e){return e.getContext("2d")}function y(e,n,t){return e.width=n,e.height=t,e}var b,O,E=window.Promise?window.Promise:(b=T.immediateFn||"function"==typeof window.setImmediate&&window.setImmediate||function(e){v.setTimeout(e,1)},O=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},T.prototype["catch"]=function(e){return this.then(null,e)},T.prototype.then=function(t,r){var o=this;return new T(function(e,n){N.call(o,new R(t,r,e,n))})},T.all=function(){for(var e=[],n=0;n 0) { + global$4.each(selectorGroups, function (group) { + var menuItem = processSelector(selector, group); + if (menuItem) { + model.addItemToGroup(group.title, menuItem); + } + }); + } else { + var menuItem = processSelector(selector, null); + if (menuItem) { + model.addItem(menuItem); + } + } + } + } + }); + var items = model.toFormats(); + editor.fire('addStyleModifications', { + items: items, + replace: !Settings.shouldAppend(editor) + }); + }); + }; + var ImportCss = { + defaultConvertSelectorToFormat: defaultConvertSelectorToFormat, + setup: setup + }; + + var get = function (editor) { + var convertSelectorToFormat = function (selectorText) { + return ImportCss.defaultConvertSelectorToFormat(editor, selectorText); + }; + return { convertSelectorToFormat: convertSelectorToFormat }; + }; + var Api = { get: get }; + + function Plugin () { + global.add('importcss', function (editor) { + ImportCss.setup(editor); + return Api.get(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/importcss/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 0000000..d13c4f8 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function t(){}function n(t){return function(){return t}}function e(){return h}var r,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),f=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),m=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(t){return t.getParam("importcss_merge_classes")},i=function(t){return t.getParam("importcss_exclusive")},p=function(t){return t.getParam("importcss_selector_converter")},g=function(t){return t.getParam("importcss_selector_filter")},y=function(t){return t.getParam("importcss_groups")},v=function(t){return t.getParam("importcss_append")},d=function(t){return t.getParam("importcss_file_filter")},u=n(!1),s=n(!0),h=(r={fold:function(t,n){return t()},is:u,isSome:u,isNone:s,getOr:O,getOrThunk:x,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:n(null),getOrUndefined:n(undefined),or:O,orThunk:x,map:e,each:t,bind:e,exists:u,forall:s,filter:e,equals:_,equals_:_,toArray:function(){return[]},toString:n("none()")},Object.freeze&&Object.freeze(r),r);function _(t){return t.isNone()}function x(t){return t()}function O(t){return t}function T(n){return function(t){return function(t){if(null===t)return"null";var n=typeof t;return"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n}(t)===n}}function b(t,n){return function(t){for(var n=[],e=0,r=t.length;e', + tooltip: pluginName, + onAction: function () { + doAct(); + } + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/indent2em/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/indent2em/plugin.min.js new file mode 100644 index 0000000..5e8c8db --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/indent2em/plugin.min.js @@ -0,0 +1,47 @@ +tinymce.PluginManager.add('indent2em', function(editor, url) { + var pluginName='首行缩进'; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var indent2em_val = editor.getParam('indent2em_val', '2em'); + var doAct = function () { + var dom = editor.dom; + var blocks = editor.selection.getSelectedBlocks(); + var act = ''; + global$1.each(blocks, function (block) { + if(act==''){ + act = dom.getStyle(block,'text-indent')==indent2em_val ? 'remove' : 'add'; + } + if( act=='add' ){ + dom.setStyle(block, 'text-indent', indent2em_val); + }else{ + var style=dom.getAttrib(block,'style'); + style = style.replace(/text-indent:[\s]*2em;/ig,''); + dom.setAttrib(block,'style',style); + } + + }); + }; + + editor.ui.registry.addButton('indent2em', { + text: '', + tooltip: pluginName, + onAction: function () { + doAct(); + } + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.js new file mode 100644 index 0000000..d2d32e3 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.js @@ -0,0 +1,198 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var getDateFormat = function (editor) { + return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d')); + }; + var getTimeFormat = function (editor) { + return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S')); + }; + var getFormats = function (editor) { + return editor.getParam('insertdatetime_formats', [ + '%H:%M:%S', + '%Y-%m-%d', + '%I:%M:%S %p', + '%D' + ]); + }; + var getDefaultDateTime = function (editor) { + var formats = getFormats(editor); + return formats.length > 0 ? formats[0] : getTimeFormat(editor); + }; + var shouldInsertTimeElement = function (editor) { + return editor.getParam('insertdatetime_element', false); + }; + var Settings = { + getDateFormat: getDateFormat, + getTimeFormat: getTimeFormat, + getFormats: getFormats, + getDefaultDateTime: getDefaultDateTime, + shouldInsertTimeElement: shouldInsertTimeElement + }; + + var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + var monthsLong = 'January February March April May June July August September October November December'.split(' '); + var addZeros = function (value, len) { + value = '' + value; + if (value.length < len) { + for (var i = 0; i < len - value.length; i++) { + value = '0' + value; + } + } + return value; + }; + var getDateTime = function (editor, fmt, date) { + date = date || new Date(); + fmt = fmt.replace('%D', '%m/%d/%Y'); + fmt = fmt.replace('%r', '%I:%M:%S %p'); + fmt = fmt.replace('%Y', '' + date.getFullYear()); + fmt = fmt.replace('%y', '' + date.getYear()); + fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); + fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); + fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); + fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); + fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); + fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); + fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); + fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); + fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); + fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); + fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); + fmt = fmt.replace('%%', '%'); + return fmt; + }; + var updateElement = function (editor, timeElm, computerTime, userTime) { + var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + timeElm.parentNode.insertBefore(newTimeElm, timeElm); + editor.dom.remove(timeElm); + editor.selection.select(newTimeElm, true); + editor.selection.collapse(false); + }; + var insertDateTime = function (editor, format) { + if (Settings.shouldInsertTimeElement(editor)) { + var userTime = getDateTime(editor, format); + var computerTime = void 0; + if (/%[HMSIp]/.test(format)) { + computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); + } else { + computerTime = getDateTime(editor, '%Y-%m-%d'); + } + var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + if (timeElm) { + updateElement(editor, timeElm, computerTime, userTime); + } else { + editor.insertContent(''); + } + } else { + editor.insertContent(getDateTime(editor, format)); + } + }; + var Actions = { + insertDateTime: insertDateTime, + getDateTime: getDateTime + }; + + var register = function (editor) { + editor.addCommand('mceInsertDate', function () { + Actions.insertDateTime(editor, Settings.getDateFormat(editor)); + }); + editor.addCommand('mceInsertTime', function () { + Actions.insertDateTime(editor, Settings.getTimeFormat(editor)); + }); + }; + var Commands = { register: register }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var register$1 = function (editor) { + var formats = Settings.getFormats(editor); + var defaultFormat = Cell(Settings.getDefaultDateTime(editor)); + editor.ui.registry.addSplitButton('insertdatetime', { + icon: 'insert-time', + tooltip: 'Insert date/time', + select: function (value) { + return value === defaultFormat.get(); + }, + fetch: function (done) { + done(global$1.map(formats, function (format) { + return { + type: 'choiceitem', + text: Actions.getDateTime(editor, format), + value: format + }; + })); + }, + onAction: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + Actions.insertDateTime(editor, defaultFormat.get()); + }, + onItemAction: function (_, value) { + defaultFormat.set(value); + Actions.insertDateTime(editor, value); + } + }); + var makeMenuItemHandler = function (format) { + return function () { + defaultFormat.set(format); + Actions.insertDateTime(editor, format); + }; + }; + editor.ui.registry.addNestedMenuItem('insertdatetime', { + icon: 'insert-time', + text: 'Date/time', + getSubmenuItems: function () { + return global$1.map(formats, function (format) { + return { + type: 'menuitem', + text: Actions.getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + }; + }); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('insertdatetime', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 0000000..ce65a55 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function n(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))}function r(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])}function a(e,t){if((e=""+e).length'+n+"")}else e.insertContent(i(e,t))},g=i,y=function(e){e.addCommand("mceInsertDate",function(){p(e,t(e))}),e.addCommand("mceInsertTime",function(){p(e,o(e))})},M=tinymce.util.Tools.resolve("tinymce.util.Tools"),S=function(e){function t(){return n}var n=e;return{get:t,set:function(e){n=e},clone:function(){return S(t())}}},v=function(n){var t=u(n),r=S(c(n));n.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===r.get()},fetch:function(e){e(M.map(t,function(e){return{type:"choiceitem",text:g(n,e),value:e}}))},onAction:function(){for(var e=[],t=0;t -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var hasProtocol = function (url) { + return /^\w+:/i.test(url); + }; + var getHref = function (elm) { + var href = elm.getAttribute('data-mce-href'); + return href ? href : elm.getAttribute('href'); + }; + var applyRelTargetRules = function (rel, isUnsafe) { + var rules = ['noopener']; + var rels = rel ? rel.split(/\s+/) : []; + var toString = function (rels) { + return global$3.trim(rels.sort().join(' ')); + }; + var addTargetRules = function (rels) { + rels = removeTargetRules(rels); + return rels.length > 0 ? rels.concat(rules) : rules; + }; + var removeTargetRules = function (rels) { + return rels.filter(function (val) { + return global$3.inArray(rules, val) === -1; + }); + }; + var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + return newRels.length > 0 ? toString(newRels) : ''; + }; + var trimCaretContainers = function (text) { + return text.replace(/\uFEFF/g, ''); + }; + var getAnchorElement = function (editor, selectedElm) { + selectedElm = selectedElm || editor.selection.getNode(); + if (isImageFigure(selectedElm)) { + return editor.dom.select('a[href]', selectedElm)[0]; + } else { + return editor.dom.getParent(selectedElm, 'a[href]'); + } + }; + var getAnchorText = function (selection, anchorElm) { + var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + return trimCaretContainers(text); + }; + var isLink = function (elm) { + return elm && elm.nodeName === 'A' && !!elm.href; + }; + var hasLinks = function (elements) { + return global$3.grep(elements, isLink).length > 0; + }; + var isOnlyTextSelected = function (html) { + if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) { + return false; + } + return true; + }; + var isImageFigure = function (elm) { + return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + }; + var getLinkAttrs = function (data) { + return foldl([ + 'title', + 'rel', + 'class', + 'target' + ], function (acc, key) { + data[key].each(function (value) { + acc[key] = value.length > 0 ? value : null; + }); + return acc; + }, { href: data.href }); + }; + var handleExternalTargets = function (href, assumeExternalTargets) { + if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { + return assumeExternalTargets + '://' + href; + } + return href; + }; + var applyLinkOverrides = function (editor, linkAttrs) { + var newLinkAttrs = __assign({}, linkAttrs); + if (!(Settings.getRelList(editor).length > 0) && Settings.allowUnsafeLinkTarget(editor) === false) { + var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + newLinkAttrs.rel = newRel ? newRel : null; + } + if (Option.from(newLinkAttrs.target).isNone() && Settings.getTargetList(editor) === false) { + newLinkAttrs.target = Settings.getDefaultLinkTarget(editor); + } + newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, Settings.assumeExternalTargets(editor)); + return newLinkAttrs; + }; + var updateLink = function (editor, anchorElm, text, linkAttrs) { + text.each(function (text) { + if (anchorElm.hasOwnProperty('innerText')) { + anchorElm.innerText = text; + } else { + anchorElm.textContent = text; + } + }); + editor.dom.setAttribs(anchorElm, linkAttrs); + editor.selection.select(anchorElm); + }; + var createLink = function (editor, selectedElm, text, linkAttrs) { + if (isImageFigure(selectedElm)) { + linkImageFigure(editor, selectedElm, linkAttrs); + } else { + text.fold(function () { + editor.execCommand('mceInsertLink', false, linkAttrs); + }, function (text) { + editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }); + } + }; + var link = function (editor, attachState, data) { + var selectedElm = editor.selection.getNode(); + var anchorElm = getAnchorElement(editor, selectedElm); + var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(function () { + if (data.href === attachState.href) { + attachState.attach(); + } + if (anchorElm) { + editor.focus(); + updateLink(editor, anchorElm, data.text, linkAttrs); + } else { + createLink(editor, selectedElm, data.text, linkAttrs); + } + }); + }; + var unlink = function (editor) { + editor.undoManager.transact(function () { + var node = editor.selection.getNode(); + if (isImageFigure(node)) { + unlinkImageFigure(editor, node); + } else { + var anchorElm = editor.dom.getParent(node, 'a[href]', editor.getBody()); + if (anchorElm) { + editor.dom.remove(anchorElm, true); + } + } + editor.focus(); + }); + }; + var unlinkImageFigure = function (editor, fig) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + if (a) { + a.parentNode.insertBefore(img, a); + editor.dom.remove(a); + } + } + }; + var linkImageFigure = function (editor, fig, attrs) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.create('a', attrs); + img.parentNode.insertBefore(a, img); + a.appendChild(img); + } + }; + var Utils = { + link: link, + unlink: unlink, + isLink: isLink, + hasLinks: hasLinks, + getHref: getHref, + isOnlyTextSelected: isOnlyTextSelected, + getAnchorElement: getAnchorElement, + getAnchorText: getAnchorText, + applyRelTargetRules: applyRelTargetRules, + hasProtocol: hasProtocol + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$3.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) ; else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizeWith = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + }; + }; + var sanitize = function (list) { + return sanitizeWith(getValue)(list); + }; + var createUi = function (name, label) { + return function (items) { + return { + name: name, + type: 'selectbox', + label: label, + items: items + }; + }; + }; + var ListOptions = { + sanitize: sanitize, + sanitizeWith: sanitizeWith, + createUi: createUi, + getValue: getValue + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var findTextByValue = function (value, catalog) { + return findMap(catalog, function (item) { + return Option.some(item).filter(function (i) { + return i.value === value; + }); + }); + }; + var getDelta = function (persistentText, fieldName, catalog, data) { + var value = data[fieldName]; + var hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(function (i) { + return { + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + }; + }) : Option.none(); + }; + var findCatalog = function (settings, fieldName) { + if (fieldName === 'link') { + return settings.catalogs.link; + } else if (fieldName === 'anchor') { + return settings.catalogs.anchor; + } else { + return Option.none(); + } + }; + var init = function (initialData, linkSettings) { + var persistentText = Cell(initialData.text); + var onUrlChange = function (data) { + if (persistentText.get().length <= 0) { + var urlText = data.url.meta.text !== undefined ? data.url.meta.text : data.url.value; + var urlTitle = data.url.meta.title !== undefined ? data.url.meta.title : ''; + return Option.some({ + text: urlText, + title: urlTitle + }); + } else { + return Option.none(); + } + }; + var onCatalogChange = function (data, change) { + var catalog = findCatalog(linkSettings, change.name).getOr([]); + return getDelta(persistentText.get(), change.name, catalog, data); + }; + var onChange = function (getData, change) { + if (change.name === 'url') { + return onUrlChange(getData()); + } else if (contains([ + 'anchor', + 'link' + ], change.name)) { + return onCatalogChange(getData(), change); + } else if (change.name === 'text') { + persistentText.set(getData().text); + return Option.none(); + } else { + return Option.none(); + } + }; + return { onChange: onChange }; + }; + var DialogChanges = { + init: init, + getDelta: getDelta + }; + + var exports$1 = {}, module = { exports: exports$1 }; + (function (define, exports, module, require) { + (function (f) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = f(); + } else if (typeof define === 'function' && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== 'undefined') { + g = window; + } else if (typeof global !== 'undefined') { + g = global; + } else if (typeof self !== 'undefined') { + g = self; + } else { + g = this; + } + g.EphoxContactWrapper = f(); + } + }(function () { + return function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) + return c(i, !0); + if (u) + return u(i, !0); + var a = new Error('Cannot find module \'' + i + '\''); + throw a.code = 'MODULE_NOT_FOUND', a; + } + var p = n[i] = { exports: {} }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) + o(t[i]); + return o; + } + return r; + }()({ + 1: [ + function (require, module, exports) { + var process = module.exports = {}; + var cachedSetTimeout; + var cachedClearTimeout; + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + }()); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + return setTimeout(fun, 0); + } + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + return clearTimeout(marker); + } + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + return cachedClearTimeout(marker); + } catch (e) { + try { + return cachedClearTimeout.call(null, marker); + } catch (e) { + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; + process.versions = {}; + function noop() { + } + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + process.listeners = function (name) { + return []; + }; + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + process.cwd = function () { + return '/'; + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + }, + {} + ], + 2: [ + function (require, module, exports) { + (function (setImmediate) { + (function (root) { + var setTimeoutFunc = setTimeout; + function noop() { + } + function bind(fn, thisArg) { + return function () { + fn.apply(thisArg, arguments); + }; + } + function Promise(fn) { + if (typeof this !== 'object') + throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') + throw new TypeError('not a function'); + this._state = 0; + this._handled = false; + this._value = undefined; + this._deferreds = []; + doResolve(fn, this); + } + function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + Promise._immediateFn(function () { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + resolve(deferred.promise, ret); + }); + } + function resolve(self, newValue) { + try { + if (newValue === self) + throw new TypeError('A promise cannot be resolved with itself.'); + if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } + } + function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); + } + function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function () { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); + } + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; + } + function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; + } + function doResolve(fn, self) { + var done = false; + try { + fn(function (value) { + if (done) + return; + done = true; + resolve(self, value); + }, function (reason) { + if (done) + return; + done = true; + reject(self, reason); + }); + } catch (ex) { + if (done) + return; + done = true; + reject(self, ex); + } + } + Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); + }; + Promise.prototype.then = function (onFulfilled, onRejected) { + var prom = new this.constructor(noop); + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; + }; + Promise.all = function (arr) { + var args = Array.prototype.slice.call(arr); + return new Promise(function (resolve, reject) { + if (args.length === 0) + return resolve([]); + var remaining = args.length; + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, reject); + return; + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + }; + Promise.resolve = function (value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } + return new Promise(function (resolve) { + resolve(value); + }); + }; + Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); + }; + Promise.race = function (values) { + return new Promise(function (resolve, reject) { + for (var i = 0, len = values.length; i < len; i++) { + values[i].then(resolve, reject); + } + }); + }; + Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { + setImmediate(fn); + } : function (fn) { + setTimeoutFunc(fn, 0); + }; + Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); + } + }; + Promise._setImmediateFn = function _setImmediateFn(fn) { + Promise._immediateFn = fn; + }; + Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { + Promise._unhandledRejectionFn = fn; + }; + if (typeof module !== 'undefined' && module.exports) { + module.exports = Promise; + } else if (!root.Promise) { + root.Promise = Promise; + } + }(this)); + }.call(this, require('timers').setImmediate)); + }, + { 'timers': 3 } + ], + 3: [ + function (require, module, exports) { + (function (setImmediate, clearImmediate) { + var nextTick = require('process/browser.js').nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + exports.setTimeout = function () { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); + }; + exports.setInterval = function () { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); + }; + exports.clearTimeout = exports.clearInterval = function (timeout) { + timeout.close(); + }; + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function () { + }; + Timeout.prototype.close = function () { + this._clearFn.call(window, this._id); + }; + exports.enroll = function (item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + exports.unenroll = function (item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + exports._unrefActive = exports.active = function (item) { + clearTimeout(item._idleTimeoutId); + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } + }; + exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + immediateIds[id] = true; + nextTick(function onNextTick() { + if (immediateIds[id]) { + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + exports.clearImmediate(id); + } + }); + return id; + }; + exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) { + delete immediateIds[id]; + }; + }.call(this, require('timers').setImmediate, require('timers').clearImmediate)); + }, + { + 'process/browser.js': 1, + 'timers': 3 + } + ], + 4: [ + function (require, module, exports) { + var promisePolyfill = require('promise-polyfill'); + var Global = function () { + if (typeof window !== 'undefined') { + return window; + } else { + return Function('return this;')(); + } + }(); + module.exports = { boltExport: Global.Promise || promisePolyfill }; + }, + { 'promise-polyfill': 2 } + ] + }, {}, [4])(4); + })); + }(undefined, exports$1, module, undefined)); + var Promise = module.exports.boltExport; + + var nu = function (baseFn) { + var data = Option.none(); + var callbacks = []; + var map = function (f) { + return nu(function (nCallback) { + get(function (data) { + nCallback(f(data)); + }); + }); + }; + var get = function (nCallback) { + if (isReady()) { + call(nCallback); + } else { + callbacks.push(nCallback); + } + }; + var set = function (x) { + data = Option.some(x); + run(callbacks); + callbacks = []; + }; + var isReady = function () { + return data.isSome(); + }; + var run = function (cbs) { + each(cbs, call); + }; + var call = function (cb) { + data.each(function (x) { + domGlobals.setTimeout(function () { + cb(x); + }, 0); + }); + }; + baseFn(set); + return { + get: get, + map: map, + isReady: isReady + }; + }; + var pure = function (a) { + return nu(function (callback) { + callback(a); + }); + }; + var LazyValue = { + nu: nu, + pure: pure + }; + + var errorReporter = function (err) { + domGlobals.setTimeout(function () { + throw err; + }, 0); + }; + var make = function (run) { + var get = function (callback) { + run().then(callback, errorReporter); + }; + var map = function (fab) { + return make(function () { + return run().then(fab); + }); + }; + var bind = function (aFutureB) { + return make(function () { + return run().then(function (v) { + return aFutureB(v).toPromise(); + }); + }); + }; + var anonBind = function (futureB) { + return make(function () { + return run().then(function () { + return futureB.toPromise(); + }); + }); + }; + var toLazy = function () { + return LazyValue.nu(get); + }; + var toCached = function () { + var cache = null; + return make(function () { + if (cache === null) { + cache = run(); + } + return cache; + }); + }; + var toPromise = run; + return { + map: map, + bind: bind, + anonBind: anonBind, + toLazy: toLazy, + toCached: toCached, + toPromise: toPromise, + get: get + }; + }; + var nu$1 = function (baseFn) { + return make(function () { + return new Promise(baseFn); + }); + }; + var pure$1 = function (a) { + return make(function () { + return Promise.resolve(a); + }); + }; + var Future = { + nu: nu$1, + pure: pure$1 + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var delayedConfirm = function (editor, message, callback) { + var rng = editor.selection.getRng(); + global$4.setEditorTimeout(editor, function () { + editor.windowManager.confirm(message, function (state) { + editor.selection.setRng(rng); + callback(state); + }); + }); + }; + var tryEmailTransform = function (data) { + var url = data.href; + var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('//') === -1 && url.indexOf('mailto:') === -1; + return suggestMailTo ? Option.some({ + message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: 'mailto:' + url }); + } + }) : Option.none(); + }; + var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { + return function (data) { + var url = data.href; + var suggestProtocol = assumeExternalTargets === 1 && !Utils.hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www[\.|\d\.]/i.test(url); + return suggestProtocol ? Option.some({ + message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); + } + }) : Option.none(); + }; + }; + var preprocess = function (editor, data) { + return findMap([ + tryEmailTransform, + tryProtocolTransform(Settings.assumeExternalTargets(editor), Settings.getDefaultLinkProtocol(editor)) + ], function (f) { + return f(data); + }).fold(function () { + return Future.pure(data); + }, function (transform) { + return Future.nu(function (callback) { + delayedConfirm(editor, transform.message, function (state) { + callback(state ? transform.preprocess(data) : data); + }); + }); + }); + }; + var DialogConfirms = { preprocess: preprocess }; + + var getAnchors = function (editor) { + var anchorNodes = editor.dom.select('a:not([href])'); + var anchors = bind(anchorNodes, function (anchor) { + var id = anchor.name || anchor.id; + return id ? [{ + text: id, + value: '#' + id + }] : []; + }); + return anchors.length > 0 ? Option.some([{ + text: 'None', + value: '' + }].concat(anchors)) : Option.none(); + }; + var AnchorListOptions = { getAnchors: getAnchors }; + + var getClasses = function (editor) { + var list = Settings.getLinkClassList(editor); + if (list.length > 0) { + return ListOptions.sanitize(list); + } + return Option.none(); + }; + var ClassListOptions = { getClasses: getClasses }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseJson = function (text) { + try { + return Option.some(JSON.parse(text)); + } catch (err) { + return Option.none(); + } + }; + var getLinks = function (editor) { + var extractor = function (item) { + return editor.convertURL(item.value || item.url, 'href'); + }; + var linkList = Settings.getLinkList(editor); + return Future.nu(function (callback) { + if (isString(linkList)) { + global$5.send({ + url: linkList, + success: function (text) { + return callback(parseJson(text)); + }, + error: function (_) { + return callback(Option.none()); + } + }); + } else if (isFunction(linkList)) { + linkList(function (output) { + return callback(Option.some(output)); + }); + } else { + callback(Option.from(linkList)); + } + }).map(function (optItems) { + return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { + if (items.length > 0) { + return [{ + text: 'None', + value: '' + }].concat(items); + } else { + return items; + } + }); + }); + }; + var LinkListOptions = { getLinks: getLinks }; + + var getRels = function (editor, initialTarget) { + var list = Settings.getRelList(editor); + if (list.length > 0) { + var isTargetBlank_1 = initialTarget.is('_blank'); + var enforceSafe = Settings.allowUnsafeLinkTarget(editor) === false; + var safeRelExtractor = function (item) { + return Utils.applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); + }; + var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + return sanitizer(list); + } + return Option.none(); + }; + var RelOptions = { getRels: getRels }; + + var fallbacks = [ + { + text: 'Current window', + value: '' + }, + { + text: 'New window', + value: '_blank' + } + ]; + var getTargets = function (editor) { + var list = Settings.getTargetList(editor); + if (isArray(list)) { + return ListOptions.sanitize(list).orThunk(function () { + return Option.some(fallbacks); + }); + } else if (list === false) { + return Option.none(); + } + return Option.some(fallbacks); + }; + var TargetOptions = { getTargets: getTargets }; + + var nonEmptyAttr = function (dom, elem, name) { + var val = dom.getAttrib(elem, name); + return val !== null && val.length > 0 ? Option.some(val) : Option.none(); + }; + var extractFromAnchor = function (editor, anchor) { + var dom = editor.dom; + var onlyText = Utils.isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(Utils.getAnchorText(editor.selection, anchor)) : Option.none(); + var url = anchor ? Option.some(dom.getAttrib(anchor, 'href')) : Option.none(); + var target = anchor ? Option.from(dom.getAttrib(anchor, 'target')) : Option.none(); + var rel = nonEmptyAttr(dom, anchor, 'rel'); + var linkClass = nonEmptyAttr(dom, anchor, 'class'); + var title = nonEmptyAttr(dom, anchor, 'title'); + return { + url: url, + text: text, + title: title, + target: target, + rel: rel, + linkClass: linkClass + }; + }; + var collect = function (editor, linkNode) { + return LinkListOptions.getLinks(editor).map(function (links) { + var anchor = extractFromAnchor(editor, linkNode); + return { + anchor: anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: Option.from(linkNode), + flags: { titleEnabled: Settings.shouldShowLinkTitle(editor) } + }; + }); + }; + var DialogInfo = { collect: collect }; + + var handleSubmit = function (editor, info) { + return function (api) { + var data = api.getData(); + if (!data.url.value) { + Utils.unlink(editor); + api.close(); + return; + } + var getChangedValue = function (key) { + return Option.from(data[key]).filter(function (value) { + return !info.anchor[key].is(value); + }); + }; + var changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + var attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () { + } + }; + DialogConfirms.preprocess(editor, changedData).get(function (pData) { + Utils.link(editor, attachState, pData); + }); + api.close(); + }; + }; + var collectData = function (editor) { + var anchorNode = Utils.getAnchorElement(editor); + return DialogInfo.collect(editor, anchorNode); + }; + var getInitialData = function (info, defaultTarget) { + return { + url: { + value: info.anchor.url.getOr(''), + meta: { + attach: function () { + }, + text: info.anchor.url.fold(function () { + return ''; + }, function () { + return info.anchor.text.getOr(''); + }), + original: { value: info.anchor.url.getOr('') } + } + }, + text: info.anchor.text.getOr(''), + title: info.anchor.title.getOr(''), + anchor: info.anchor.url.getOr(''), + link: info.anchor.url.getOr(''), + rel: info.anchor.rel.getOr(''), + target: info.anchor.target.or(defaultTarget).getOr(''), + linkClass: info.anchor.linkClass.getOr('') + }; + }; + var makeDialog = function (settings, onSubmit, editor) { + var urlInput = [{ + name: 'url', + type: 'urlinput', + filetype: 'file', + label: 'URL' + }]; + var displayText = settings.anchor.text.map(function () { + return { + name: 'text', + type: 'input', + label: 'Text to display' + }; + }).toArray(); + var titleText = settings.flags.titleEnabled ? [{ + name: 'title', + type: 'input', + label: 'Title' + }] : []; + var defaultTarget = Option.from(Settings.getDefaultLinkTarget(editor)); + var initialData = getInitialData(settings, defaultTarget); + var dialogDelta = DialogChanges.init(initialData, settings); + var catalogs = settings.catalogs; + var body = { + type: 'panel', + items: flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]) + }; + return { + title: 'Insert/Edit Link', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onChange: function (api, _a) { + var name = _a.name; + dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + api.setData(newData); + }); + }, + onSubmit: onSubmit + }; + }; + var open$1 = function (editor) { + var data = collectData(editor); + data.map(function (info) { + var onSubmit = handleSubmit(editor, info); + return makeDialog(info, onSubmit, editor); + }).get(function (spec) { + editor.windowManager.open(spec); + }); + }; + var Dialog = { open: open$1 }; + + var getLink = function (editor, elm) { + return editor.dom.getParent(elm, 'a[href]'); + }; + var getSelectedLink = function (editor) { + return getLink(editor, editor.selection.getStart()); + }; + var hasOnlyAltModifier = function (e) { + return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; + }; + var gotoLink = function (editor, a) { + if (a) { + var href = Utils.getHref(a); + if (/^#/.test(href)) { + var targetEl = editor.$(href); + if (targetEl.length) { + editor.selection.scrollIntoView(targetEl[0], true); + } + } else { + OpenUrl.open(a.href); + } + } + }; + var openDialog = function (editor) { + return function () { + Dialog.open(editor); + }; + }; + var gotoSelectedLink = function (editor) { + return function () { + gotoLink(editor, getSelectedLink(editor)); + }; + }; + var leftClickedOnAHref = function (editor) { + return function (elm) { + var sel, rng, node; + if (Settings.hasContextToolbar(editor) && Utils.isLink(elm)) { + sel = editor.selection; + rng = sel.getRng(); + node = rng.startContainer; + if (node.nodeType === 3 && sel.isCollapsed() && rng.startOffset > 0 && rng.startOffset < node.data.length) { + return true; + } + } + return false; + }; + }; + var setupGotoLinks = function (editor) { + editor.on('click', function (e) { + var link = getLink(editor, e.target); + if (link && global$2.metaKeyPressed(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + editor.on('keydown', function (e) { + var link = getSelectedLink(editor); + if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + }; + var toggleActiveState = function (editor) { + return function (api) { + var nodeChangeHandler = function (e) { + return api.setActive(!editor.readonly && !!Utils.getAnchorElement(editor, e.element)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var toggleEnabledState = function (editor) { + return function (api) { + api.setDisabled(!Utils.hasLinks(editor.dom.getParents(editor.selection.getStart()))); + var nodeChangeHandler = function (e) { + return api.setDisabled(!Utils.hasLinks(e.parents)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var Actions = { + openDialog: openDialog, + gotoSelectedLink: gotoSelectedLink, + leftClickedOnAHref: leftClickedOnAHref, + setupGotoLinks: setupGotoLinks, + toggleActiveState: toggleActiveState, + toggleEnabledState: toggleEnabledState + }; + + var register = function (editor) { + editor.addCommand('mceLink', function () { + if (Settings.useQuickLink(editor)) { + editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } else { + Actions.openDialog(editor)(); + } + }); + }; + var Commands = { register: register }; + + var setup = function (editor) { + editor.addShortcut('Meta+K', '', function () { + editor.execCommand('mceLink'); + }); + }; + var Keyboard = { setup: setup }; + + var setupButtons = function (editor) { + editor.ui.registry.addToggleButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + onAction: Actions.openDialog(editor), + onSetup: Actions.toggleActiveState(editor) + }); + editor.ui.registry.addButton('openlink', { + icon: 'new-tab', + tooltip: 'Open link', + onAction: Actions.gotoSelectedLink(editor), + onSetup: Actions.toggleEnabledState(editor) + }); + editor.ui.registry.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + onAction: function () { + return Utils.unlink(editor); + }, + onSetup: Actions.toggleEnabledState(editor) + }); + }; + var setupMenuItems = function (editor) { + editor.ui.registry.addMenuItem('openlink', { + text: 'Open link', + icon: 'new-tab', + onAction: Actions.gotoSelectedLink(editor), + onSetup: Actions.toggleEnabledState(editor) + }); + editor.ui.registry.addMenuItem('link', { + icon: 'link', + text: 'Link...', + shortcut: 'Meta+K', + onAction: Actions.openDialog(editor) + }); + editor.ui.registry.addMenuItem('unlink', { + icon: 'unlink', + text: 'Remove link', + onAction: function () { + return Utils.unlink(editor); + }, + onSetup: Actions.toggleEnabledState(editor) + }); + }; + var setupContextMenu = function (editor) { + var inLink = 'link unlink openlink'; + var noLink = 'link'; + editor.ui.registry.addContextMenu('link', { + update: function (element) { + return Utils.hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; + } + }); + }; + var setupContextToolbars = function (editor) { + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var onSetupLink = function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setDisabled(!Utils.getAnchorElement(editor, node)); + return function () { + }; + }; + editor.ui.registry.addContextForm('quicklink', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + onSetup: Actions.toggleActiveState(editor) + }, + label: 'Link', + predicate: function (node) { + return !!Utils.getAnchorElement(editor, node) && Settings.hasContextToolbar(editor); + }, + initValue: function () { + var elm = Utils.getAnchorElement(editor); + return !!elm ? Utils.getHref(elm) : ''; + }, + commands: [ + { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + primary: true, + onSetup: function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setActive(!!Utils.getAnchorElement(editor, node)); + return Actions.toggleActiveState(editor)(buttonApi); + }, + onAction: function (formApi) { + var anchor = Utils.getAnchorElement(editor); + var value = formApi.getValue(); + if (!anchor) { + var attachState = { + href: value, + attach: function () { + } + }; + var onlyText = Utils.isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(Utils.getAnchorText(editor.selection, anchor)).filter(function (t) { + return t.length > 0; + }).or(Option.from(value)) : Option.none(); + Utils.link(editor, attachState, { + href: value, + text: text, + title: Option.none(), + rel: Option.none(), + target: Option.none(), + class: Option.none() + }); + formApi.hide(); + } else { + editor.dom.setAttrib(anchor, 'href', value); + collapseSelectionToEnd(editor); + formApi.hide(); + } + } + }, + { + type: 'contextformbutton', + icon: 'unlink', + tooltip: 'Remove link', + onSetup: onSetupLink, + onAction: function (formApi) { + Utils.unlink(editor); + formApi.hide(); + } + }, + { + type: 'contextformbutton', + icon: 'new-tab', + tooltip: 'Open link', + onSetup: onSetupLink, + onAction: function (formApi) { + Actions.gotoSelectedLink(editor)(); + formApi.hide(); + } + } + ] + }); + }; + var Controls = { + setupButtons: setupButtons, + setupMenuItems: setupMenuItems, + setupContextMenu: setupContextMenu, + setupContextToolbars: setupContextToolbars + }; + + function Plugin () { + global$1.add('link', function (editor) { + Controls.setupButtons(editor); + Controls.setupMenuItems(editor); + Controls.setupContextMenu(editor); + Controls.setupContextToolbars(editor); + Actions.setupGotoLinks(editor); + Commands.register(editor); + Keyboard.setup(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/link/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/link/plugin.min.js new file mode 100644 index 0000000..000ff86 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(c){"use strict";function n(t){return function(n){return function(n){if(null===n)return"null";var t=typeof n;return"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t}(n)===t}}function u(){}function i(n){return function(){return n}}function t(){return C}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.util.VK"),a=n("string"),f=n("array"),l=n("boolean"),s=n("function"),d=function(n){var t=n.getParam("link_assume_external_targets",!1);return l(t)&&t?1:!a(t)||"http"!==t&&"https"!==t?0:t},m=function(n){return n.getParam("link_context_toolbar",!1,"boolean")},h=function(n){return n.getParam("link_list")},p=function(n){return n.getParam("default_link_target")},g=function(n){return n.getParam("target_list",!0)},v=function(n){return n.getParam("rel_list",[],"array")},y=function(n){return n.getParam("link_class_list",[],"array")},w=function(n){return n.getParam("link_title",!0,"boolean")},k=function(n){return n.getParam("allow_unsafe_link_target",!1,"boolean")},x=function(n){return n.getParam("link_quicklink",!1,"boolean")},b=function(n){return n.getParam("link_default_protocol","http","string")},_=function(n){var t=c.document.createElement("a");t.target="_blank",t.href=n,t.rel="noreferrer noopener";var e=c.document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!0,c.window,0,0,0,0,0,!1,!1,!1,!1,0,null),function(n,t){c.document.body.appendChild(n),n.dispatchEvent(t),c.document.body.removeChild(n)}(t,e)},T=function(){return(T=Object.assign||function(n){for(var t,e=1,r=arguments.length;e]+>[^<]+<\/a>$/.test(n)||-1===n.indexOf("href=")))},ln=U,sn=function(n,t){return function(n){return n.replace(/\uFEFF/g,"")}(t?t.innerText||t.textContent:n.getContent({format:"text"}))},dn=D,mn=R,hn={sanitize:function(n){return B(K)(n)},sanitizeWith:B,createUi:function(t,e){return function(n){return{name:t,type:"selectbox",label:e,items:n}}},getValue:K},pn=function(n){function t(){return e}var e=n;return{get:t,set:function(n){e=n},clone:function(){return pn(t())}}},gn=function(n,r){function e(n,t){var e=function(n,t){return"link"===t?n.catalogs.link:"anchor"===t?n.catalogs.anchor:X.none()}(r,t.name).getOr([]);return V(o.get(),t.name,e,n)}var o=pn(n.text);return{onChange:function(n,t){return"url"===t.name?function(n){if(o.get().length<=0){var t=n.url.meta.text!==undefined?n.url.meta.text:n.url.value,e=n.url.meta.title!==undefined?n.url.meta.title:"";return X.some({text:t,title:e})}return X.none()}(n()):I(["anchor","link"],t.name)?e(n(),t):("text"===t.name&&o.set(n().text),X.none())}}},vn={},yn={exports:vn};W=undefined,H=vn,$=yn,G=undefined,function(n){"object"==typeof H&&void 0!==$?$.exports=n():"function"==typeof W&&W.amd?W([],n):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).EphoxContactWrapper=n()}(function(){return function l(i,u,c){function a(t,n){if(!u[t]){if(!i[t]){var e="function"==typeof G&&G;if(!n&&e)return e(t,!0);if(f)return f(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=u[t]={exports:{}};i[t][0].call(o.exports,function(n){return a(i[t][1][n]||n)},o,o.exports,l,i,u,c)}return u[t].exports}for(var f="function"==typeof G&&G,n=0;n 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var ELEMENT$1 = ELEMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = detect$3().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + var is$1 = is; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var lift2 = function (oa, ob, f) { + return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none(); + }; + + var fromElements = function (elements, scope) { + var doc = scope || domGlobals.document; + var fragment = doc.createDocumentFragment(); + each(elements, function (element) { + fragment.appendChild(element.dom()); + }); + return Element.fromDom(fragment); + }; + + var Immutable = function () { + var fields = []; + for (var _i = 0; _i < arguments.length; _i++) { + fields[_i] = arguments[_i]; + } + return function () { + var values = []; + for (var _i = 0; _i < arguments.length; _i++) { + values[_i] = arguments[_i]; + } + if (fields.length !== values.length) { + throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); + } + var struct = {}; + each(fields, function (name, i) { + struct[name] = constant(values[i]); + }); + return struct; + }; + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + var child = function (element, index) { + var cs = element.dom().childNodes; + return Option.from(cs[index]).map(Element.fromDom); + }; + var firstChild = function (element) { + return child(element, 0); + }; + var lastChild = function (element) { + return child(element, element.dom().childNodes.length - 1); + }; + var spot = Immutable('element', 'offset'); + + var before = function (marker, element) { + var parent$1 = parent(marker); + parent$1.each(function (v) { + v.dom().insertBefore(element.dom(), marker.dom()); + }); + }; + var append = function (parent, element) { + parent.dom().appendChild(element.dom()); + }; + + var before$1 = function (marker, elements) { + each(elements, function (x) { + before(marker, x); + }); + }; + var append$1 = function (parent, elements) { + each(elements, function (x) { + append(parent, x); + }); + }; + + var remove = function (element) { + var dom = element.dom(); + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + + var fireListEvent = function (editor, action, element) { + return editor.fire('ListMutation', { + action: action, + element: element + }); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var path = function (parts, scope) { + var o = scope !== undefined && scope !== null ? scope : Global; + for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { + o = o[parts[i]]; + } + return o; + }; + var resolve = function (p, scope) { + var parts = p.split('.'); + return path(parts, scope); + }; + + var unsafe = function (name, scope) { + return resolve(name, scope); + }; + var getOrDie = function (name, scope) { + var actual = unsafe(name, scope); + if (actual === undefined || actual === null) { + throw new Error(name + ' not available on this browser'); + } + return actual; + }; + var Global$1 = { getOrDie: getOrDie }; + + var htmlElement = function (scope) { + return Global$1.getOrDie('HTMLElement', scope); + }; + var isPrototypeOf = function (x) { + var scope = resolve('ownerDocument.defaultView', x); + return htmlElement(scope).prototype.isPrototypeOf(x); + }; + var HTMLElement = { isPrototypeOf: isPrototypeOf }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var isTextNode = function (node) { + return node && node.nodeType === 3; + }; + var isListNode = function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName); + }; + var isOlUlNode = function (node) { + return node && /^(OL|UL)$/.test(node.nodeName); + }; + var isListItemNode = function (node) { + return node && /^(LI|DT|DD)$/.test(node.nodeName); + }; + var isDlItemNode = function (node) { + return node && /^(DT|DD)$/.test(node.nodeName); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isBr = function (node) { + return node && node.nodeName === 'BR'; + }; + var isFirstChild = function (node) { + return node.parentNode.firstChild === node; + }; + var isLastChild = function (node) { + return node.parentNode.lastChild === node; + }; + var isTextBlock = function (editor, node) { + return node && !!editor.schema.getTextBlockElements()[node.nodeName]; + }; + var isBlock = function (node, blockElements) { + return node && node.nodeName in blockElements; + }; + var isBogusBr = function (dom, node) { + if (!isBr(node)) { + return false; + } + if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) { + return true; + } + return false; + }; + var isEmpty = function (dom, elm, keepBookmarks) { + var empty = dom.isEmpty(elm); + if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { + return false; + } + return empty; + }; + var isChildOfBody = function (dom, elm) { + return dom.isChildOf(elm, dom.getRoot()); + }; + var NodeType = { + isTextNode: isTextNode, + isListNode: isListNode, + isOlUlNode: isOlUlNode, + isDlItemNode: isDlItemNode, + isListItemNode: isListItemNode, + isTableCellNode: isTableCellNode, + isBr: isBr, + isFirstChild: isFirstChild, + isLastChild: isLastChild, + isTextBlock: isTextBlock, + isBlock: isBlock, + isBogusBr: isBogusBr, + isEmpty: isEmpty, + isChildOfBody: isChildOfBody + }; + + var getParentList = function (editor) { + var selectionStart = editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); + }; + var isParentListSelected = function (parentList, selectedBlocks) { + return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + }; + var findSubLists = function (parentList) { + return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) { + return NodeType.isListNode(elm); + }); + }; + var getSelectedSubLists = function (editor) { + var parentList = getParentList(editor); + var selectedBlocks = editor.selection.getSelectedBlocks(); + if (isParentListSelected(parentList, selectedBlocks)) { + return findSubLists(parentList); + } else { + return global$5.grep(selectedBlocks, function (elm) { + return NodeType.isListNode(elm) && parentList !== elm; + }); + } + }; + var findParentListItemsNodes = function (editor, elms) { + var listItemsElms = global$5.map(elms, function (elm) { + var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + return parentLi ? parentLi : elm; + }); + return global$4.unique(listItemsElms); + }; + var getSelectedListItems = function (editor) { + var selectedBlocks = editor.selection.getSelectedBlocks(); + return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) { + return NodeType.isListItemNode(block); + }); + }; + var getSelectedDlItems = function (editor) { + return filter(getSelectedListItems(editor), NodeType.isDlItemNode); + }; + var getClosestListRootElm = function (editor, elm) { + var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); + return root; + }; + var findLastParentListNode = function (editor, elm) { + var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + return last(parentLists); + }; + var getSelectedLists = function (editor) { + var firstList = findLastParentListNode(editor, editor.selection.getStart()); + var subsequentLists = filter(editor.selection.getSelectedBlocks(), NodeType.isOlUlNode); + return firstList.toArray().concat(subsequentLists); + }; + var getSelectedListRoots = function (editor) { + var selectedLists = getSelectedLists(editor); + return getUniqueListRoots(editor, selectedLists); + }; + var getUniqueListRoots = function (editor, lists) { + var listRoots = map(lists, function (list) { + return findLastParentListNode(editor, list).getOr(list); + }); + return global$4.unique(listRoots); + }; + var isList = function (editor) { + var list = getParentList(editor); + return HTMLElement.isPrototypeOf(list); + }; + var Selection = { + isList: isList, + getParentList: getParentList, + getSelectedSubLists: getSelectedSubLists, + getSelectedListItems: getSelectedListItems, + getClosestListRootElm: getClosestListRootElm, + getSelectedDlItems: getSelectedDlItems, + getSelectedListRoots: getSelectedListRoots + }; + + var shouldIndentOnTab = function (editor) { + return editor.getParam('lists_indent_on_tab', true); + }; + var getForcedRootBlock = function (editor) { + var block = editor.getParam('forced_root_block', 'p'); + if (block === false) { + return ''; + } else if (block === true) { + return 'p'; + } else { + return block; + } + }; + var getForcedRootBlockAttrs = function (editor) { + return editor.getParam('forced_root_block_attrs', {}); + }; + var Settings = { + shouldIndentOnTab: shouldIndentOnTab, + getForcedRootBlock: getForcedRootBlock, + getForcedRootBlockAttrs: getForcedRootBlockAttrs + }; + + var createTextBlock = function (editor, contentNode) { + var dom = editor.dom; + var blockElements = editor.schema.getBlockElements(); + var fragment = dom.createFragment(); + var blockName = Settings.getForcedRootBlock(editor); + var node, textBlock, hasContentNode; + if (blockName) { + textBlock = dom.create(blockName); + if (textBlock.tagName === blockName.toUpperCase()) { + dom.setAttribs(textBlock, Settings.getForcedRootBlockAttrs(editor)); + } + if (!NodeType.isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + } + if (contentNode) { + while (node = contentNode.firstChild) { + var nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; + } + if (NodeType.isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (blockName) { + if (!textBlock) { + textBlock = dom.create(blockName); + fragment.appendChild(textBlock); + } + textBlock.appendChild(node); + } else { + fragment.appendChild(node); + } + } + } + } + if (!blockName) { + fragment.appendChild(dom.create('br')); + } else { + if (!hasContentNode) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); + } + } + return fragment; + }; + + var name = function (element) { + var r = element.dom().nodeName; + return r.toLowerCase(); + }; + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var setAll = function (element, attrs) { + var dom = element.dom(); + each$1(attrs, function (v, k) { + rawSet(dom, k, v); + }); + }; + var clone = function (element) { + return foldl(element.dom().attributes, function (acc, attr) { + acc[attr.name] = attr.value; + return acc; + }, {}); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var set = function (element, property, value) { + var dom = element.dom(); + internalSet(dom, property, value); + }; + + var clone$1 = function (original, isDeep) { + return Element.fromDom(original.dom().cloneNode(isDeep)); + }; + var deep = function (original) { + return clone$1(original, true); + }; + var shallowAs = function (original, tag) { + var nu = Element.fromTag(tag); + var attributes = clone(original); + setAll(nu, attributes); + return nu; + }; + var mutate = function (original, tag) { + var nu = shallowAs(original, tag); + before(original, nu); + var children$1 = children(original); + append$1(nu, children$1); + remove(original); + return nu; + }; + + var joinSegment = function (parent, child) { + append(parent.item, child.list); + }; + var joinSegments = function (segments) { + for (var i = 1; i < segments.length; i++) { + joinSegment(segments[i - 1], segments[i]); + } + }; + var appendSegments = function (head$1, tail) { + lift2(last(head$1), head(tail), joinSegment); + }; + var createSegment = function (scope, listType) { + var segment = { + list: Element.fromTag(listType, scope), + item: Element.fromTag('li', scope) + }; + append(segment.list, segment.item); + return segment; + }; + var createSegments = function (scope, entry, size) { + var segments = []; + for (var i = 0; i < size; i++) { + segments.push(createSegment(scope, entry.listType)); + } + return segments; + }; + var populateSegments = function (segments, entry) { + for (var i = 0; i < segments.length - 1; i++) { + set(segments[i].item, 'list-style-type', 'none'); + } + last(segments).each(function (segment) { + setAll(segment.list, entry.listAttributes); + setAll(segment.item, entry.itemAttributes); + append$1(segment.item, entry.content); + }); + }; + var normalizeSegment = function (segment, entry) { + if (name(segment.list) !== entry.listType) { + segment.list = mutate(segment.list, entry.listType); + } + setAll(segment.list, entry.listAttributes); + }; + var createItem = function (scope, attr, content) { + var item = Element.fromTag('li', scope); + setAll(item, attr); + append$1(item, content); + return item; + }; + var appendItem = function (segment, item) { + append(segment.list, item); + segment.item = item; + }; + var writeShallow = function (scope, cast, entry) { + var newCast = cast.slice(0, entry.depth); + last(newCast).each(function (segment) { + var item = createItem(scope, entry.itemAttributes, entry.content); + appendItem(segment, item); + normalizeSegment(segment, entry); + }); + return newCast; + }; + var writeDeep = function (scope, cast, entry) { + var segments = createSegments(scope, entry, entry.depth - cast.length); + joinSegments(segments); + populateSegments(segments, entry); + appendSegments(cast, segments); + return cast.concat(segments); + }; + var composeList = function (scope, entries) { + var cast = foldl(entries, function (cast, entry) { + return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); + }, []); + return head(cast).map(function (segment) { + return segment.list; + }); + }; + + var isList$1 = function (el) { + return is$1(el, 'OL,UL'); + }; + var hasFirstChildList = function (el) { + return firstChild(el).map(isList$1).getOr(false); + }; + var hasLastChildList = function (el) { + return lastChild(el).map(isList$1).getOr(false); + }; + + var isIndented = function (entry) { + return entry.depth > 0; + }; + var isSelected = function (entry) { + return entry.isSelected; + }; + var cloneItemContent = function (li) { + var children$1 = children(li); + var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + return map(content, deep); + }; + var createEntry = function (li, depth, isSelected) { + return parent(li).filter(isElement).map(function (list) { + return { + depth: depth, + isSelected: isSelected, + content: cloneItemContent(li), + itemAttributes: clone(li), + listAttributes: clone(list), + listType: name(list) + }; + }); + }; + + var indentEntry = function (indentation, entry) { + switch (indentation) { + case 'Indent': + entry.depth++; + break; + case 'Outdent': + entry.depth--; + break; + case 'Flatten': + entry.depth = 0; + } + }; + + var cloneListProperties = function (target, source) { + target.listType = source.listType; + target.listAttributes = __assign({}, source.listAttributes); + }; + var previousSiblingEntry = function (entries, start) { + var depth = entries[start].depth; + for (var i = start - 1; i >= 0; i--) { + if (entries[i].depth === depth) { + return Option.some(entries[i]); + } + if (entries[i].depth < depth) { + break; + } + } + return Option.none(); + }; + var normalizeEntries = function (entries) { + each(entries, function (entry, i) { + previousSiblingEntry(entries, i).each(function (matchingEntry) { + cloneListProperties(entry, matchingEntry); + }); + }); + }; + + var parseItem = function (depth, itemSelection, selectionState, item) { + return firstChild(item).filter(isList$1).fold(function () { + itemSelection.each(function (selection) { + if (eq(selection.start, item)) { + selectionState.set(true); + } + }); + var currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(function (selection) { + if (eq(selection.end, item)) { + selectionState.set(false); + } + }); + var childListEntries = lastChild(item).filter(isList$1).map(function (list) { + return parseList(depth, itemSelection, selectionState, list); + }).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, function (list) { + return parseList(depth, itemSelection, selectionState, list); + }); + }; + var parseList = function (depth, itemSelection, selectionState, list) { + return bind(children(list), function (element) { + var parser = isList$1(element) ? parseList : parseItem; + var newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + }; + var parseLists = function (lists, itemSelection) { + var selectionState = Cell(false); + var initialDepth = 0; + return map(lists, function (list) { + return { + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + }; + }); + }; + + var outdentedComposer = function (editor, entries) { + return map(entries, function (entry) { + var content = fromElements(entry.content); + return Element.fromDom(createTextBlock(editor, content.dom())); + }); + }; + var indentedComposer = function (editor, entries) { + normalizeEntries(entries); + return composeList(editor.contentDocument, entries).toArray(); + }; + var composeEntries = function (editor, entries) { + return bind(groupBy(entries, isIndented), function (entries) { + var groupIsIndented = head(entries).map(isIndented).getOr(false); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + }; + var indentSelectedEntries = function (entries, indentation) { + each(filter(entries, isSelected), function (entry) { + return indentEntry(indentation, entry); + }); + }; + var getItemSelection = function (editor) { + var selectedListItems = map(Selection.getSelectedListItems(editor), Element.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { + return { + start: start, + end: end + }; + }); + }; + var listIndentation = function (editor, lists, indentation) { + var entrySets = parseLists(lists, getItemSelection(editor)); + each(entrySets, function (entrySet) { + indentSelectedEntries(entrySet.entries, indentation); + var composedLists = composeEntries(editor, entrySet.entries); + each(composedLists, function (composedList) { + fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom()); + }); + before$1(entrySet.sourceList, composedLists); + remove(entrySet.sourceList); + }); + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var DOM = global$6.DOM; + var splitList = function (editor, ul, li) { + var tmpRng, fragment, bookmarks, node, newBlock; + var removeAndKeepBookmarks = function (targetNode) { + global$5.each(bookmarks, function (node) { + targetNode.parentNode.insertBefore(node, li.parentNode); + }); + DOM.remove(targetNode); + }; + bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); + newBlock = createTextBlock(editor, li); + tmpRng = DOM.createRng(); + tmpRng.setStartAfter(li); + tmpRng.setEndAfter(ul); + fragment = tmpRng.extractContents(); + for (node = fragment.firstChild; node; node = node.firstChild) { + if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { + DOM.remove(node); + break; + } + } + if (!editor.dom.isEmpty(fragment)) { + DOM.insertAfter(fragment, ul); + } + DOM.insertAfter(newBlock, ul); + if (NodeType.isEmpty(editor.dom, li.parentNode)) { + removeAndKeepBookmarks(li.parentNode); + } + DOM.remove(li); + if (NodeType.isEmpty(editor.dom, ul)) { + DOM.remove(ul); + } + }; + var SplitList = { splitList: splitList }; + + var outdentDlItem = function (editor, item) { + if (is$1(item, 'dd')) { + mutate(item, 'dt'); + } else if (is$1(item, 'dt')) { + parent(item).each(function (dl) { + return SplitList.splitList(editor, dl.dom(), item.dom()); + }); + } + }; + var indentDlItem = function (item) { + if (is$1(item, 'dt')) { + mutate(item, 'dd'); + } + }; + var dlIndentation = function (editor, indentation, dlItems) { + if (indentation === 'Indent') { + each(dlItems, indentDlItem); + } else { + each(dlItems, function (item) { + return outdentDlItem(editor, item); + }); + } + }; + + var getNormalizedPoint = function (container, offset) { + if (NodeType.isTextNode(container)) { + return { + container: container, + offset: offset + }; + } + var node = global$1.getNode(container, offset); + if (NodeType.isTextNode(node)) { + return { + container: node, + offset: offset >= container.childNodes.length ? node.data.length : 0 + }; + } else if (node.previousSibling && NodeType.isTextNode(node.previousSibling)) { + return { + container: node.previousSibling, + offset: node.previousSibling.data.length + }; + } else if (node.nextSibling && NodeType.isTextNode(node.nextSibling)) { + return { + container: node.nextSibling, + offset: 0 + }; + } + return { + container: container, + offset: offset + }; + }; + var normalizeRange = function (rng) { + var outRng = rng.cloneRange(); + var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + outRng.setStart(rangeStart.container, rangeStart.offset); + var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + outRng.setEnd(rangeEnd.container, rangeEnd.offset); + return outRng; + }; + var Range = { + getNormalizedPoint: getNormalizedPoint, + normalizeRange: normalizeRange + }; + + var selectionIndentation = function (editor, indentation) { + var lists = map(Selection.getSelectedListRoots(editor), Element.fromDom); + var dlItems = map(Selection.getSelectedDlItems(editor), Element.fromDom); + var isHandled = false; + if (lists.length || dlItems.length) { + var bookmark = editor.selection.getBookmark(); + listIndentation(editor, lists, indentation); + dlIndentation(editor, indentation, dlItems); + editor.selection.moveToBookmark(bookmark); + editor.selection.setRng(Range.normalizeRange(editor.selection.getRng())); + editor.nodeChanged(); + isHandled = true; + } + return isHandled; + }; + var indentListSelection = function (editor) { + return selectionIndentation(editor, 'Indent'); + }; + var outdentListSelection = function (editor) { + return selectionIndentation(editor, 'Outdent'); + }; + var flattenListSelection = function (editor) { + return selectionIndentation(editor, 'Flatten'); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + var DOM$1 = global$6.DOM; + var createBookmark = function (rng) { + var bookmark = {}; + var setupEndPoint = function (start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + DOM$1.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + }; + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolveBookmark = function (bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + var nodeIndex = function (container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + }; + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + DOM$1.remove(node); + if (!container.hasChildNodes() && DOM$1.isBlock(container)) { + container.appendChild(DOM$1.create('br')); + } + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = DOM$1.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return Range.normalizeRange(rng); + }; + var Bookmark = { + createBookmark: createBookmark, + resolveBookmark: resolveBookmark + }; + + var isCustomList = function (list) { + return /\btox\-/.test(list.className); + }; + + var listToggleActionFromListName = function (listName) { + switch (listName) { + case 'UL': + return 'ToggleUlList'; + case 'OL': + return 'ToggleOlList'; + case 'DL': + return 'ToggleDLList'; + } + }; + + var updateListStyle = function (dom, el, detail) { + var type = detail['list-style-type'] ? detail['list-style-type'] : null; + dom.setStyle(el, 'list-style-type', type); + }; + var setAttribs = function (elm, attrs) { + global$5.each(attrs, function (value, key) { + elm.setAttribute(key, value); + }); + }; + var updateListAttrs = function (dom, el, detail) { + setAttribs(el, detail['list-attributes']); + global$5.each(dom.select('li', el), function (li) { + setAttribs(li, detail['list-item-attributes']); + }); + }; + var updateListWithDetails = function (dom, el, detail) { + updateListStyle(dom, el, detail); + updateListAttrs(dom, el, detail); + }; + var removeStyles = function (dom, element, styles) { + global$5.each(styles, function (style) { + var _a; + return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); + }); + }; + var getEndPointNode = function (editor, rng, start, root) { + var container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; + } + if (!start && NodeType.isBr(container.nextSibling)) { + container = container.nextSibling; + } + while (container.parentNode !== root) { + if (NodeType.isTextBlock(editor, container)) { + return container; + } + if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + return container; + } + container = container.parentNode; + } + return container; + }; + var getSelectedTextBlocks = function (editor, rng, root) { + var textBlocks = [], dom = editor.dom; + var startNode = getEndPointNode(editor, rng, true, root); + var endNode = getEndPointNode(editor, rng, false, root); + var block; + var siblings = []; + for (var node = startNode; node; node = node.nextSibling) { + siblings.push(node); + if (node === endNode) { + break; + } + } + global$5.each(siblings, function (node) { + if (NodeType.isTextBlock(editor, node)) { + textBlocks.push(node); + block = null; + return; + } + if (dom.isBlock(node) || NodeType.isBr(node)) { + if (NodeType.isBr(node)) { + dom.remove(node); + } + block = null; + return; + } + var nextSibling = node.nextSibling; + if (global$7.isBookmarkNode(node)) { + if (NodeType.isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { + block = null; + return; + } + } + if (!block) { + block = dom.create('p'); + node.parentNode.insertBefore(block, node); + textBlocks.push(block); + } + block.appendChild(node); + }); + return textBlocks; + }; + var hasCompatibleStyle = function (dom, sib, detail) { + var sibStyle = dom.getStyle(sib, 'list-style-type'); + var detailStyle = detail ? detail['list-style-type'] : ''; + detailStyle = detailStyle === null ? '' : detailStyle; + return sibStyle === detailStyle; + }; + var applyList = function (editor, listName, detail) { + if (detail === void 0) { + detail = {}; + } + var rng = editor.selection.getRng(true); + var bookmark; + var listItemName = 'LI'; + var root = Selection.getClosestListRootElm(editor, editor.selection.getStart(true)); + var dom = editor.dom; + if (dom.getContentEditable(editor.selection.getNode()) === 'false') { + return; + } + listName = listName.toUpperCase(); + if (listName === 'DL') { + listItemName = 'DT'; + } + bookmark = Bookmark.createBookmark(rng); + global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) { + var listBlock, sibling; + sibling = block.previousSibling; + if (sibling && NodeType.isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { + listBlock = sibling; + block = dom.rename(block, listItemName); + sibling.appendChild(block); + } else { + listBlock = dom.create(listName); + block.parentNode.insertBefore(listBlock, block); + listBlock.appendChild(block); + block = dom.rename(block, listItemName); + } + removeStyles(dom, block, [ + 'margin', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-top', + 'padding', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-top' + ]); + updateListWithDetails(dom, listBlock, detail); + mergeWithAdjacentLists(editor.dom, listBlock); + }); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + }; + var isValidLists = function (list1, list2) { + return list1 && list2 && NodeType.isListNode(list1) && list1.nodeName === list2.nodeName; + }; + var hasSameListStyle = function (dom, list1, list2) { + var targetStyle = dom.getStyle(list1, 'list-style-type', true); + var style = dom.getStyle(list2, 'list-style-type', true); + return targetStyle === style; + }; + var hasSameClasses = function (elm1, elm2) { + return elm1.className === elm2.className; + }; + var shouldMerge = function (dom, list1, list2) { + return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); + }; + var mergeWithAdjacentLists = function (dom, listBlock) { + var sibling, node; + sibling = listBlock.nextSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.firstChild) { + listBlock.appendChild(node); + } + dom.remove(sibling); + } + sibling = listBlock.previousSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.lastChild) { + listBlock.insertBefore(node, listBlock.firstChild); + } + dom.remove(sibling); + } + }; + var updateList = function (editor, list, listName, detail) { + if (list.nodeName !== listName) { + var newList = editor.dom.rename(list, listName); + updateListWithDetails(editor.dom, newList, detail); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } else { + updateListWithDetails(editor.dom, list, detail); + fireListEvent(editor, listToggleActionFromListName(listName), list); + } + }; + var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail)) { + flattenListSelection(editor); + } else { + var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); + global$5.each([parentList].concat(lists), function (elm) { + updateList(editor, elm, listName, detail); + }); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + } + }; + var hasListStyleDetail = function (detail) { + return 'list-style-type' in detail; + }; + var toggleSingleList = function (editor, parentList, listName, detail) { + if (parentList === editor.getBody()) { + return; + } + if (parentList) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { + flattenListSelection(editor); + } else { + var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); + updateListWithDetails(editor.dom, parentList, detail); + var newList = editor.dom.rename(parentList, listName); + mergeWithAdjacentLists(editor.dom, newList); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } + } else { + applyList(editor, listName, detail); + fireListEvent(editor, listToggleActionFromListName(listName), parentList); + } + }; + var toggleList = function (editor, listName, detail) { + var parentList = Selection.getParentList(editor); + var selectedSubLists = Selection.getSelectedSubLists(editor); + detail = detail ? detail : {}; + if (parentList && selectedSubLists.length > 0) { + toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); + } else { + toggleSingleList(editor, parentList, listName, detail); + } + }; + var ToggleList = { + toggleList: toggleList, + mergeWithAdjacentLists: mergeWithAdjacentLists + }; + + var DOM$2 = global$6.DOM; + var normalizeList = function (dom, ul) { + var sibling; + var parentNode = ul.parentNode; + if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + if (NodeType.isEmpty(dom, parentNode)) { + DOM$2.remove(parentNode); + } + } else { + DOM$2.setStyle(parentNode, 'listStyleType', 'none'); + } + } + if (NodeType.isListNode(parentNode)) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + } + } + }; + var normalizeLists = function (dom, element) { + global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) { + normalizeList(dom, ul); + }); + }; + var NormalizeLists = { + normalizeList: normalizeList, + normalizeLists: normalizeLists + }; + + var findNextCaretContainer = function (editor, rng, isForward, root) { + var node = rng.startContainer; + var offset = rng.startOffset; + if (NodeType.isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + return node; + } + var nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (node.nodeType === 1) { + node = global$1.getNode(node, offset); + } + var walker = new global$2(node, root); + if (isForward) { + if (NodeType.isBogusBr(editor.dom, node)) { + walker.next(); + } + } + while (node = walker[isForward ? 'next' : 'prev2']()) { + if (node.nodeName === 'LI' && !node.hasChildNodes()) { + return node; + } + if (nonEmptyBlocks[node.nodeName]) { + return node; + } + if (NodeType.isTextNode(node) && node.data.length > 0) { + return node; + } + } + }; + var hasOnlyOneBlockChild = function (dom, elm) { + var childNodes = elm.childNodes; + return childNodes.length === 1 && !NodeType.isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); + }; + var unwrapSingleBlockChild = function (dom, elm) { + if (hasOnlyOneBlockChild(dom, elm)) { + dom.remove(elm.firstChild, true); + } + }; + var moveChildren = function (dom, fromElm, toElm) { + var node, targetElm; + targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + unwrapSingleBlockChild(dom, fromElm); + if (!NodeType.isEmpty(dom, fromElm, true)) { + while (node = fromElm.firstChild) { + targetElm.appendChild(node); + } + } + }; + var mergeLiElements = function (dom, fromElm, toElm) { + var node, listNode; + var ul = fromElm.parentNode; + if (!NodeType.isChildOfBody(dom, fromElm) || !NodeType.isChildOfBody(dom, toElm)) { + return; + } + if (NodeType.isListNode(toElm.lastChild)) { + listNode = toElm.lastChild; + } + if (ul === toElm.lastChild) { + if (NodeType.isBr(ul.previousSibling)) { + dom.remove(ul.previousSibling); + } + } + node = toElm.lastChild; + if (node && NodeType.isBr(node) && fromElm.hasChildNodes()) { + dom.remove(node); + } + if (NodeType.isEmpty(dom, toElm, true)) { + dom.$(toElm).empty(); + } + moveChildren(dom, fromElm, toElm); + if (listNode) { + toElm.appendChild(listNode); + } + var contains = contains$1(Element.fromDom(toElm), Element.fromDom(fromElm)); + var nestedLists = contains ? dom.getParents(fromElm, NodeType.isListNode, toElm) : []; + dom.remove(fromElm); + each(nestedLists, function (list) { + if (NodeType.isEmpty(dom, list) && list !== dom.getRoot()) { + dom.remove(list); + } + }); + }; + var mergeIntoEmptyLi = function (editor, fromLi, toLi) { + editor.dom.$(toLi).empty(); + mergeLiElements(editor.dom, fromLi, toLi); + editor.selection.setCursorLocation(toLi); + }; + var mergeForward = function (editor, rng, fromLi, toLi) { + var dom = editor.dom; + if (dom.isEmpty(toLi)) { + mergeIntoEmptyLi(editor, fromLi, toLi); + } else { + var bookmark = Bookmark.createBookmark(rng); + mergeLiElements(dom, fromLi, toLi); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + } + }; + var mergeBackward = function (editor, rng, fromLi, toLi) { + var bookmark = Bookmark.createBookmark(rng); + mergeLiElements(editor.dom, fromLi, toLi); + var resolvedBookmark = Bookmark.resolveBookmark(bookmark); + editor.selection.setRng(resolvedBookmark); + }; + var backspaceDeleteFromListToListCaret = function (editor, isForward) { + var dom = editor.dom, selection = editor.selection; + var selectionStartElm = selection.getStart(); + var root = Selection.getClosestListRootElm(editor, selectionStartElm); + var li = dom.getParent(selection.getStart(), 'LI', root); + if (li) { + var ul = li.parentNode; + if (ul === editor.getBody() && NodeType.isEmpty(dom, ul)) { + return true; + } + var rng_1 = Range.normalizeRange(selection.getRng()); + var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); + if (otherLi_1 && otherLi_1 !== li) { + editor.undoManager.transact(function () { + if (isForward) { + mergeForward(editor, rng_1, otherLi_1, li); + } else { + if (NodeType.isFirstChild(li)) { + outdentListSelection(editor); + } else { + mergeBackward(editor, rng_1, li, otherLi_1); + } + } + }); + return true; + } else if (!otherLi_1) { + if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { + editor.undoManager.transact(function () { + flattenListSelection(editor); + }); + return true; + } + } + } + return false; + }; + var removeBlock = function (dom, block, root) { + var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + dom.remove(block); + if (parentBlock && dom.isEmpty(parentBlock)) { + dom.remove(parentBlock); + } + }; + var backspaceDeleteIntoListCaret = function (editor, isForward) { + var dom = editor.dom; + var selectionStartElm = editor.selection.getStart(); + var root = Selection.getClosestListRootElm(editor, selectionStartElm); + var block = dom.getParent(selectionStartElm, dom.isBlock, root); + if (block && dom.isEmpty(block)) { + var rng = Range.normalizeRange(editor.selection.getRng()); + var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi_2) { + editor.undoManager.transact(function () { + removeBlock(dom, block, root); + ToggleList.mergeWithAdjacentLists(dom, otherLi_2.parentNode); + editor.selection.select(otherLi_2, true); + editor.selection.collapse(isForward); + }); + return true; + } + } + return false; + }; + var backspaceDeleteCaret = function (editor, isForward) { + return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); + }; + var backspaceDeleteRange = function (editor) { + var selectionStartElm = editor.selection.getStart(); + var root = Selection.getClosestListRootElm(editor, selectionStartElm); + var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + if (startListParent || Selection.getSelectedListItems(editor).length > 0) { + editor.undoManager.transact(function () { + editor.execCommand('Delete'); + NormalizeLists.normalizeLists(editor.dom, editor.getBody()); + }); + return true; + } + return false; + }; + var backspaceDelete = function (editor, isForward) { + return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + }; + var setup = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode === global$3.BACKSPACE) { + if (backspaceDelete(editor, false)) { + e.preventDefault(); + } + } else if (e.keyCode === global$3.DELETE) { + if (backspaceDelete(editor, true)) { + e.preventDefault(); + } + } + }); + }; + var Delete = { + setup: setup, + backspaceDelete: backspaceDelete + }; + + var get = function (editor) { + return { + backspaceDelete: function (isForward) { + Delete.backspaceDelete(editor, isForward); + } + }; + }; + var Api = { get: get }; + + var queryListCommandState = function (editor, listName) { + return function () { + var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); + return parentList && parentList.nodeName === listName; + }; + }; + var register = function (editor) { + editor.on('BeforeExecCommand', function (e) { + var cmd = e.command.toLowerCase(); + if (cmd === 'indent') { + indentListSelection(editor); + } else if (cmd === 'outdent') { + outdentListSelection(editor); + } + }); + editor.addCommand('InsertUnorderedList', function (ui, detail) { + ToggleList.toggleList(editor, 'UL', detail); + }); + editor.addCommand('InsertOrderedList', function (ui, detail) { + ToggleList.toggleList(editor, 'OL', detail); + }); + editor.addCommand('InsertDefinitionList', function (ui, detail) { + ToggleList.toggleList(editor, 'DL', detail); + }); + editor.addCommand('RemoveList', function () { + flattenListSelection(editor); + }); + editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); + editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); + editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); + }; + var Commands = { register: register }; + + var setupTabKey = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) { + return; + } + editor.undoManager.transact(function () { + if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { + e.preventDefault(); + } + }); + }); + }; + var setup$1 = function (editor) { + if (Settings.shouldIndentOnTab(editor)) { + setupTabKey(editor); + } + Delete.setup(editor); + }; + var Keyboard = { setup: setup$1 }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var listState = function (editor, listName) { + return function (buttonApi) { + var nodeChangeHandler = function (e) { + var tableCellIndex = findIndex(e.parents, NodeType.isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$5.grep(parents, NodeType.isListNode); + buttonApi.setActive(lists.length > 0 && lists[0].nodeName === listName && !isCustomList(lists[0])); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$5.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + var exec = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + if (!hasPlugin(editor, 'advlist')) { + editor.ui.registry.addToggleButton('numlist', { + icon: 'ordered-list', + active: false, + tooltip: 'Numbered list', + onAction: exec('InsertOrderedList'), + onSetup: listState(editor, 'OL') + }); + editor.ui.registry.addToggleButton('bullist', { + icon: 'unordered-list', + active: false, + tooltip: 'Bullet list', + onAction: exec('InsertUnorderedList'), + onSetup: listState(editor, 'UL') + }); + } + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('lists', function (editor) { + Keyboard.setup(editor); + Buttons.register(editor); + Commands.register(editor); + return Api.get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/lists/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 0000000..0094a62 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(r){"use strict";function e(){}function l(e){return function(){return e}}function t(t){return function(){for(var e=[],n=0;ne.length?ne(t,e,n):ee(t,e,n)},[]);return S(n).map(function(e){return e.list})}(e.contentDocument,n).toArray()}function de(e){var n=g(Zn.getSelectedListItems(e),Ln.fromDom);return A(N(n,t(re)),N(function(e){var n=Xe.call(e,0);return n.reverse(),n}(n),t(re)),function(e,n){return{start:e,end:n}})}function le(t,e,r){var n=function(e,n){var t=Ge(!1);return g(e,function(e){return{sourceList:e,entries:ot(0,n,t,e)}})}(e,de(t));p(n,function(e){!function(e,n){p(v(e,ie),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}}(n,e)})}(e.entries,r);var n=function(n,e){return y(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i=e.childNodes.length?t.data.length:0}:t.previousSibling&&Un(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&Un(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}}function ve(e,n){var t=g(Zn.getSelectedListRoots(e),Ln.fromDom),r=g(Zn.getSelectedDlItems(e),Ln.fromDom),o=!1;if(t.length||r.length){var i=e.selection.getBookmark();le(e,t,n),ge(e,n,r),e.selection.moveToBookmark(i),e.selection.setRng(st(e.selection.getRng())),e.nodeChanged(),o=!0}return o}function he(e){return ve(e,"Indent")}function Ne(e){return ve(e,"Outdent")}function ye(e){return ve(e,"Flatten")}function Se(e){return/\btox\-/.test(e.className)}function Oe(e){switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}}function Ce(t,e){Mn.each(e,function(e,n){t.setAttribute(n,e)})}function be(e,n,t){!function(e,n,t){var r=t["list-style-type"]?t["list-style-type"]:null;e.setStyle(n,"list-style-type",r)}(e,n,t),function(e,n,t){Ce(n,t["list-attributes"]),Mn.each(e.select("li",n),function(e){Ce(e,t["list-item-attributes"])})}(e,n,t)}function Le(e,n,t,r){var o,i;for(o=n[t?"startContainer":"endContainer"],i=n[t?"startOffset":"endOffset"],1===o.nodeType&&(o=o.childNodes[Math.min(i,o.childNodes.length-1)]||o),!t&&Wn(o.nextSibling)&&(o=o.nextSibling);o.parentNode!==r;){if(Kn(e,o))return o;if(/^(TD|TH)$/.test(o.parentNode.nodeName))return o;o=o.parentNode}return o}function Te(r,o,i){void 0===i&&(i={});var e,n=r.selection.getRng(!0),u="LI",t=Zn.getClosestListRootElm(r,r.selection.getStart(!0)),a=r.dom;"false"!==a.getContentEditable(r.selection.getNode())&&("DL"===(o=o.toUpperCase())&&(u="DT"),e=dt(n),Mn.each(function(t,e,r){for(var o,i=[],u=t.dom,n=Le(t,e,!0,r),a=Le(t,e,!1,r),s=[],c=n;c&&(s.push(c),c!==a);c=c.nextSibling);return Mn.each(s,function(e){if(Kn(t,e))return i.push(e),void(o=null);if(u.isBlock(e)||Wn(e))return Wn(e)&&u.remove(e),void(o=null);var n=e.nextSibling;ct.isBookmarkNode(e)&&(Kn(t,n)||!n&&e.parentNode===r)?o=null:(o||(o=u.create("p"),e.parentNode.insertBefore(o,e),i.push(o)),o.appendChild(e))}),i}(r,n,t),function(e){var n,t;(t=e.previousSibling)&&Fn(t)&&t.nodeName===o&&function(e,n,t){var r=e.getStyle(n,"list-style-type"),o=t?t["list-style-type"]:"";return r===(o=null===o?"":o)}(a,t,i)?(n=t,e=a.rename(e,u),t.appendChild(e)):(n=a.create(o),e.parentNode.insertBefore(n,e),n.appendChild(e),e=a.rename(e,u)),function(t,r,e){Mn.each(e,function(e){var n;return t.setStyle(r,((n={})[e]="",n))})}(a,e,["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"]),be(a,n,i),mt(r.dom,n)}),r.selection.setRng(lt(e)))}function De(e,n,t){return function(e,n){return e&&n&&Fn(e)&&e.nodeName===n.nodeName}(n,t)&&function(e,n,t){return e.getStyle(n,"list-style-type",!0)===e.getStyle(t,"list-style-type",!0)}(e,n,t)&&function(e,n){return e.className===n.className}(n,t)}function Ee(n,e,t,r,o){if(e.nodeName!==r||gt(o)){var i=dt(n.selection.getRng(!0));Mn.each([e].concat(t),function(e){!function(e,n,t,r){if(n.nodeName!==t){var o=e.dom.rename(n,t);be(e.dom,o,r),j(e,Oe(t),o)}else be(e.dom,n,r),j(e,Oe(t),n)}(n,e,r,o)}),n.selection.setRng(lt(i))}else ye(n)}function we(e,n){var t,r=n.parentNode;"LI"===r.nodeName&&r.firstChild===n&&((t=r.previousSibling)&&"LI"===t.nodeName?(t.appendChild(n),Qn(e,r)&&vt.remove(r)):vt.setStyle(r,"listStyleType","none")),Fn(r)&&(t=r.previousSibling)&&"LI"===t.nodeName&&t.appendChild(n)}function ke(e,n,t,r){var o=n.startContainer,i=n.startOffset;if(Un(o)&&(t?i 1) { + return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; + } else { + return 'https://'; + } + }; + var getUrl = function (pattern, url) { + var protocol = getProtocol(url); + var match = pattern.regex.exec(url); + var newUrl = protocol + pattern.url; + var _loop_1 = function (i) { + newUrl = newUrl.replace('$' + i, function () { + return match[i] ? match[i] : ''; + }); + }; + for (var i = 0; i < match.length; i++) { + _loop_1(i); + } + return newUrl.replace(/\?$/, ''); + }; + var matchPattern = function (url) { + var patterns = urlPatterns.filter(function (pattern) { + return pattern.regex.test(url); + }); + if (patterns.length > 0) { + return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + } else { + return null; + } + }; + + var getIframeHtml = function (data) { + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; + return ''; + }; + var getFlashHtml = function (data) { + var html = ''; + if (data.poster) { + html += ''; + } + html += ''; + return html; + }; + var getAudioHtml = function (data, audioTemplateCallback) { + if (audioTemplateCallback) { + return audioTemplateCallback(data); + } else { + return ''; + } + }; + var getVideoHtml = function (data, videoTemplateCallback) { + if (videoTemplateCallback) { + return videoTemplateCallback(data); + } else { + return ''; + } + }; + var getScriptHtml = function (data) { + return ''; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(Settings.getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = Mime.guess(data.source); + data.altsourcemime = Mime.guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return UpdateHtml.updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(Settings.getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = Settings.getAudioTemplateCallback(editor); + var videoTemplateCallback = Settings.getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = Settings.getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + var Service = { + getEmbedHtml: getEmbedHtml, + isCached: isCached + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Option.some(v) : Option.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Option.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Option.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(Settings.getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(Settings.getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = UpdateHtml.updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || Service.isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + Service.getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + Service.getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !Settings.hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (Settings.hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (Settings.hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + var Dialog = { + showDialog: showDialog, + unwrap: unwrap + }; + + var get$1 = function (editor) { + var showDialog = function () { + Dialog.showDialog(editor); + }; + return { showDialog: showDialog }; + }; + var Api = { get: get$1 }; + + var register = function (editor) { + var showDialog = function () { + Dialog.showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog); + }; + var Commands = { register: register }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (Settings.shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$4(); + var blocked; + global$2({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript') { + return; + } + for (var i = 0; i < attrs.length; i++) { + if (attrs[i].name.indexOf('on') === 0) { + return; + } + if (attrs[i].name === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$5({})).parse(html); + return writer.getContent(); + }; + var Sanitize = { sanitize: sanitize }; + + var createPlaceholderNode = function (editor, node) { + var placeHolder; + var name = node.name; + placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var previewWrapper; + var previewNode; + var shimNode; + var name = node.name; + previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var attribs; + var ai; + var innerHtml; + attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(Settings.getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + var Nodes = { + createPreviewIframeNode: createPreviewIframeNode, + createPlaceholderNode: createPlaceholderNode, + placeHolderConverter: placeHolderConverter + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + var FilterContent = { setup: setup }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + var ResolveName = { setup: setup$1 }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + var Selection = { setup: setup$2 }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('media', function (editor) { + Commands.register(editor); + Buttons.register(editor); + ResolveName.setup(editor); + FilterContent.setup(editor); + Selection.setup(editor); + return Api.get(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/media/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..3858ecd --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function e(){}function o(e){return function(){return e}}function t(){return u}var r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"}(n):"application/x-shockwave-flash"===n.sourcemime?function(e){var t='';return e.poster&&(t+=''),t+=""}(n):-1!==n.sourcemime.indexOf("audio")?function(e,t){return t?t(e):'"}(n,o):"script"===n.type?function(e){return' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + var IframeContent = { getPreviewHtml: getPreviewHtml }; + + var open = function (editor) { + var content = IframeContent.getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('preview', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/front/front/modules/tinymce/tinymce/plugins/preview/plugin.min.js b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..7d7ca23 --- /dev/null +++ b/src/main/resources/front/front/modules/tinymce/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),m=function(e){return e.getParam("content_style","")},u=function(e){return e.getParam("content_css_cors",!1,"boolean")},y=tinymce.util.Tools.resolve("tinymce.Env"),n=function(t){var n="",i=t.dom.encode,e=m(t);n+='',e&&(n+='");var o=u(t)?' crossorigin="anonymous"':"";l.each(t.contentCSS,function(e){n+='"});var r=t.settings.body_id||"tinymce";-1!==r.indexOf("=")&&(r=(r=t.getParam("body_id","","hash"))[t.id]||r);var a=t.settings.body_class||"";-1!==a.indexOf("=")&&(a=(a=t.getParam("body_class","","hash"))[t.id]||"");var c=' + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/config/detail.html b/src/main/resources/front/front/pages/config/detail.html new file mode 100644 index 0000000..70d5b7b --- /dev/null +++ b/src/main/resources/front/front/pages/config/detail.html @@ -0,0 +1,368 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 名称: + + {{detail.name}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/config/list.html b/src/main/resources/front/front/pages/config/list.html new file mode 100644 index 0000000..4e3a696 --- /dev/null +++ b/src/main/resources/front/front/pages/config/list.html @@ -0,0 +1,426 @@ + + + + +轮播图管理 + + + + + + + + + + + + + +
    + +
    +
    +
    + 轮播图管理您现在的位置:轮播图管理 +
    +
    +
    +
    名称
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/discussfangwuxinxi/add.html b/src/main/resources/front/front/pages/discussfangwuxinxi/add.html new file mode 100644 index 0000000..63c5aba --- /dev/null +++ b/src/main/resources/front/front/pages/discussfangwuxinxi/add.html @@ -0,0 +1,309 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/discussfangwuxinxi/detail.html b/src/main/resources/front/front/pages/discussfangwuxinxi/detail.html new file mode 100644 index 0000000..f3ec1aa --- /dev/null +++ b/src/main/resources/front/front/pages/discussfangwuxinxi/detail.html @@ -0,0 +1,461 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 关联表id: + + {{detail.refid}} + +
    +
    + 评论内容: + + {{detail.content}} + +
    +
    + 回复内容: + + {{detail.reply}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + +
    • 评论
    • + + + + + +
    + +
    + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + 用户:{{item.userid}} +
    +
    + + {{item.content}} + +
    +
    + + 回复:{{item.reply}} + +
    +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/discussfangwuxinxi/list.html b/src/main/resources/front/front/pages/discussfangwuxinxi/list.html new file mode 100644 index 0000000..a71d57d --- /dev/null +++ b/src/main/resources/front/front/pages/discussfangwuxinxi/list.html @@ -0,0 +1,426 @@ + + + + +房屋信息评论表 + + + + + + + + + + + + + +
    + +
    +
    +
    + 房屋信息评论表您现在的位置:房屋信息评论表 +
    +
    +
    +
    评论内容
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/discusswoyaodangfangzhu/add.html b/src/main/resources/front/front/pages/discusswoyaodangfangzhu/add.html new file mode 100644 index 0000000..0bc9815 --- /dev/null +++ b/src/main/resources/front/front/pages/discusswoyaodangfangzhu/add.html @@ -0,0 +1,309 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/discusswoyaodangfangzhu/detail.html b/src/main/resources/front/front/pages/discusswoyaodangfangzhu/detail.html new file mode 100644 index 0000000..01a63d3 --- /dev/null +++ b/src/main/resources/front/front/pages/discusswoyaodangfangzhu/detail.html @@ -0,0 +1,461 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 关联表id: + + {{detail.refid}} + +
    +
    + 评论内容: + + {{detail.content}} + +
    +
    + 回复内容: + + {{detail.reply}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + +
    • 评论
    • + + + + + +
    + +
    + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + 用户:{{item.userid}} +
    +
    + + {{item.content}} + +
    +
    + + 回复:{{item.reply}} + +
    +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/discusswoyaodangfangzhu/list.html b/src/main/resources/front/front/pages/discusswoyaodangfangzhu/list.html new file mode 100644 index 0000000..dbeece3 --- /dev/null +++ b/src/main/resources/front/front/pages/discusswoyaodangfangzhu/list.html @@ -0,0 +1,426 @@ + + + + +我要当房主评论表 + + + + + + + + + + + + + +
    + +
    +
    +
    + 我要当房主评论表您现在的位置:我要当房主评论表 +
    +
    +
    +
    评论内容
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwubaoxiu/add.html b/src/main/resources/front/front/pages/fangwubaoxiu/add.html new file mode 100644 index 0000000..ca72e21 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwubaoxiu/add.html @@ -0,0 +1,510 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwubaoxiu/detail.html b/src/main/resources/front/front/pages/fangwubaoxiu/detail.html new file mode 100644 index 0000000..24fe150 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwubaoxiu/detail.html @@ -0,0 +1,444 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 合同编号: + + {{detail.hetongbianhao}} + +
    +
    + 房屋名称: + + {{detail.fangwumingcheng}} + +
    +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 小区: + + {{detail.xiaoqu}} + +
    +
    + 报修名称: + + {{detail.baoxiumingcheng}} + +
    +
    + 类型: + + {{detail.leixing}} + +
    +
    + 报修内容: + + {{detail.baoxiuneirong}} + +
    +
    + 报修日期: + + {{detail.baoxiuriqi}} + +
    +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 房主姓名: + + {{detail.fangzhuxingming}} + +
    +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    + + + + + +
    + + + + + + +
    +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwubaoxiu/list.html b/src/main/resources/front/front/pages/fangwubaoxiu/list.html new file mode 100644 index 0000000..a666b64 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwubaoxiu/list.html @@ -0,0 +1,448 @@ + + + + +房屋报修 + + + + + + + + + + + + + +
    + +
    +
    +
    + 房屋报修您现在的位置:房屋报修 +
    +
    +
    +
    房屋名称
    + +
    +
    +
    类型
    + +
    +
    +
    房主姓名
    + +
    +
    +
    用户名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwuleixing/add.html b/src/main/resources/front/front/pages/fangwuleixing/add.html new file mode 100644 index 0000000..81dadc3 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwuleixing/add.html @@ -0,0 +1,296 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwuleixing/detail.html b/src/main/resources/front/front/pages/fangwuleixing/detail.html new file mode 100644 index 0000000..2d55efc --- /dev/null +++ b/src/main/resources/front/front/pages/fangwuleixing/detail.html @@ -0,0 +1,368 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwuleixing/list.html b/src/main/resources/front/front/pages/fangwuleixing/list.html new file mode 100644 index 0000000..0ce1893 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwuleixing/list.html @@ -0,0 +1,426 @@ + + + + +房屋类型 + + + + + + + + + + + + + +
    + +
    +
    +
    + 房屋类型您现在的位置:房屋类型 +
    +
    +
    +
    房屋类型
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwupingjia/add.html b/src/main/resources/front/front/pages/fangwupingjia/add.html new file mode 100644 index 0000000..8f8424c --- /dev/null +++ b/src/main/resources/front/front/pages/fangwupingjia/add.html @@ -0,0 +1,412 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwupingjia/detail.html b/src/main/resources/front/front/pages/fangwupingjia/detail.html new file mode 100644 index 0000000..372c78f --- /dev/null +++ b/src/main/resources/front/front/pages/fangwupingjia/detail.html @@ -0,0 +1,422 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 合同编号: + + {{detail.hetongbianhao}} + +
    +
    + 房屋名称: + + {{detail.fangwumingcheng}} + +
    +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 小区: + + {{detail.xiaoqu}} + +
    +
    + 评分: + + {{detail.pingfen}} + +
    +
    + 评价内容: + + {{detail.pingjianeirong}} + +
    +
    + 评价日期: + + {{detail.pingjiariqi}} + +
    +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwupingjia/list.html b/src/main/resources/front/front/pages/fangwupingjia/list.html new file mode 100644 index 0000000..9a6e3e3 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwupingjia/list.html @@ -0,0 +1,448 @@ + + + + +房屋评价 + + + + + + + + + + + + + +
    + +
    +
    +
    + 房屋评价您现在的位置:房屋评价 +
    +
    +
    +
    房屋名称
    + +
    +
    +
    评分
    + +
    +
    +
    房主账号
    + +
    +
    +
    用户名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwuxinxi/add.html b/src/main/resources/front/front/pages/fangwuxinxi/add.html new file mode 100644 index 0000000..ff37dd1 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwuxinxi/add.html @@ -0,0 +1,639 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwuxinxi/detail.html b/src/main/resources/front/front/pages/fangwuxinxi/detail.html new file mode 100644 index 0000000..ac81c78 --- /dev/null +++ b/src/main/resources/front/front/pages/fangwuxinxi/detail.html @@ -0,0 +1,556 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    + +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 租赁方式: + + {{detail.zulinfangshi}} + +
    +
    + 朝向楼层: + + {{detail.chaoxianglouceng}} + +
    +
    + 面积: + + {{detail.mianji}} + +
    +
    + 房屋状态: + + {{detail.fangwuzhuangtai}} + +
    +
    + 小区: + + {{detail.xiaoqu}} + +
    +
    + 详细地址: + + {{detail.xiangxidizhi}} + +
    +
    + 月租价格: + + {{detail.yuezujiage}} + +
    +
    + 押金: + + {{detail.yajin}} + +
    +
    + 房屋设施: + + {{detail.fangwusheshi}} + +
    +
    + 发布日期: + + {{detail.faburiqi}} + +
    +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 房主姓名: + + {{detail.fangzhuxingming}} + +
    + + + + + +
    + + + + + + +
    +
    +
    + + + + +
    +
    + +
      + +
    • 房屋详情
    • + + + +
    • 评论
    • + + + + + +
    + +
    + +
    +
    +
    + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + 用户:{{item.userid}} +
    +
    + + {{item.content}} + +
    +
    + + 回复:{{item.reply}} + +
    +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangwuxinxi/list.html b/src/main/resources/front/front/pages/fangwuxinxi/list.html new file mode 100644 index 0000000..2bacffa --- /dev/null +++ b/src/main/resources/front/front/pages/fangwuxinxi/list.html @@ -0,0 +1,486 @@ + + + + +房屋信息 + + + + + + + + + + + + + +
    + +
    +
    +
    + + +
    +
    + 房屋信息您现在的位置:房屋信息 +
    +
    +
    +
    房屋名称
    + +
    +
    +
    房屋状态
    + +
    +
    +
    小区
    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    {{item.price}} RMB
    +
    {{item.fangwumingcheng}}
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangzhu/add.html b/src/main/resources/front/front/pages/fangzhu/add.html new file mode 100644 index 0000000..539a9ce --- /dev/null +++ b/src/main/resources/front/front/pages/fangzhu/add.html @@ -0,0 +1,453 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangzhu/center.html b/src/main/resources/front/front/pages/fangzhu/center.html new file mode 100644 index 0000000..e9ad376 --- /dev/null +++ b/src/main/resources/front/front/pages/fangzhu/center.html @@ -0,0 +1,541 @@ + + + + + + + + 个人中心 + + + + + + + + + + + +
    + + + + + + + +
    + USER / CENTER个人中心 +
    + + +
    + +
    + +
    + + +
    +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangzhu/detail.html b/src/main/resources/front/front/pages/fangzhu/detail.html new file mode 100644 index 0000000..72e354e --- /dev/null +++ b/src/main/resources/front/front/pages/fangzhu/detail.html @@ -0,0 +1,392 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 房主姓名: + + {{detail.fangzhuxingming}} + +
    +
    + 性别: + + {{detail.xingbie}} + +
    +
    + 手机: + + {{detail.shouji}} + +
    +
    + 身份证: + + {{detail.shenfenzheng}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangzhu/list.html b/src/main/resources/front/front/pages/fangzhu/list.html new file mode 100644 index 0000000..57ee236 --- /dev/null +++ b/src/main/resources/front/front/pages/fangzhu/list.html @@ -0,0 +1,433 @@ + + + + +房主 + + + + + + + + + + + + + +
    + +
    +
    +
    + 房主您现在的位置:房主 +
    +
    +
    +
    房主账号
    + +
    +
    +
    房主姓名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/fangzhu/register.html b/src/main/resources/front/front/pages/fangzhu/register.html new file mode 100644 index 0000000..8e7380f --- /dev/null +++ b/src/main/resources/front/front/pages/fangzhu/register.html @@ -0,0 +1,172 @@ + + + + + + 注册 + + + + + + +
    + +
    + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/hetongxinxi/add.html b/src/main/resources/front/front/pages/hetongxinxi/add.html new file mode 100644 index 0000000..6d31535 --- /dev/null +++ b/src/main/resources/front/front/pages/hetongxinxi/add.html @@ -0,0 +1,582 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + + 点击下载合同内容 +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/hetongxinxi/detail.html b/src/main/resources/front/front/pages/hetongxinxi/detail.html new file mode 100644 index 0000000..3bed180 --- /dev/null +++ b/src/main/resources/front/front/pages/hetongxinxi/detail.html @@ -0,0 +1,477 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 合同编号: + + {{detail.hetongbianhao}} + +
    +
    + 房屋名称: + + {{detail.fangwumingcheng}} + +
    +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 小区: + + {{detail.xiaoqu}} + +
    +
    + 月租价格: + + {{detail.yuezujiage}} + +
    +
    + 租用月数: + + {{detail.zuyongyueshu}} + +
    +
    + 租用金额: + + {{detail.zuyongjine}} + +
    +
    + 押金: + + {{detail.yajin}} + +
    +
    + 房租状态: + + {{detail.fangzuzhuangtai}} + +
    +
    + 合同金额: + + {{detail.hetongjine}} + +
    +
    + 生效日: + + {{detail.shengxiaori}} + +
    +
    + 有限期至: + + {{detail.youxianqizhi}} + +
    +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 房主姓名: + + {{detail.fangzhuxingming}} + +
    + + + +
    + 合同内容: + + 点击下载 + +
    + + +
    + + + + + + + +
    +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/hetongxinxi/list.html b/src/main/resources/front/front/pages/hetongxinxi/list.html new file mode 100644 index 0000000..16115aa --- /dev/null +++ b/src/main/resources/front/front/pages/hetongxinxi/list.html @@ -0,0 +1,441 @@ + + + + +合同信息 + + + + + + + + + + + + + +
    + +
    +
    +
    + 合同信息您现在的位置:合同信息 +
    +
    +
    +
    房屋名称
    + +
    +
    +
    房屋类型
    + +
    +
    +
    用户名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/home/home.html b/src/main/resources/front/front/pages/home/home.html new file mode 100644 index 0000000..e42bec2 --- /dev/null +++ b/src/main/resources/front/front/pages/home/home.html @@ -0,0 +1,700 @@ + + + + + +首页 + + + + + + + + + + + + + + + +
    + + + +
    + + + + +
    +
    +
    + HOME NEWS公告信息 +
    +
    +
    +
    + +
    +
    {{item.title}}
    +
    {{item.addtime}}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    + DATA SHOW房屋信息展示 +
    +
    +
    +
    + +
    {{item.fangwumingcheng}}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/login/login.html b/src/main/resources/front/front/pages/login/login.html new file mode 100644 index 0000000..3c616c8 --- /dev/null +++ b/src/main/resources/front/front/pages/login/login.html @@ -0,0 +1,174 @@ + + + + + + 登录 + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/messages/list.html b/src/main/resources/front/front/pages/messages/list.html new file mode 100644 index 0000000..700eb1b --- /dev/null +++ b/src/main/resources/front/front/pages/messages/list.html @@ -0,0 +1,271 @@ + + + + + + + 在线留言 + + + + + + + + + + + +
    + + + + + + + +
    + MESSAGES / ADVICE留言反馈 +
    + + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + 用户:{{item.username}} +
    +
    + + {{item.content}} + +
    +
    + 回复:{{item.reply}} + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/news/detail.html b/src/main/resources/front/front/pages/news/detail.html new file mode 100644 index 0000000..e7d7d2d --- /dev/null +++ b/src/main/resources/front/front/pages/news/detail.html @@ -0,0 +1,196 @@ + + + + + + + 公告信息 + + + + + + + + + + + +
    + +
    + NEWS / INFORMATION公告信息 +
    + +
    +

    {{detail.title}}

    +
    + 时间:{{detail.addtime}} +
    +
    +
    + + +
    +
    + 本篇文章:{{detail.title}} +
    + +
    +
    +
    + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/news/list.html b/src/main/resources/front/front/pages/news/list.html new file mode 100644 index 0000000..363fc53 --- /dev/null +++ b/src/main/resources/front/front/pages/news/list.html @@ -0,0 +1,399 @@ + + + + + +公告信息 + + + + + + + + + + + + + +
    + + + + +
    +
    +
    + 公告信息您现在的位置:公告信息 +
    + +
    +
    +
    + +
    +
    {{item.title}}
    +
    {{item.introduction}}
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/storeup/list.html b/src/main/resources/front/front/pages/storeup/list.html new file mode 100644 index 0000000..a724313 --- /dev/null +++ b/src/main/resources/front/front/pages/storeup/list.html @@ -0,0 +1,230 @@ + + + + + + + 收藏 + + + + + + + + + + + +
    + + + + + +
    + USER / STOREUP我的收藏 +
    + + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + +

    {{item.name}}

    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/users/add.html b/src/main/resources/front/front/pages/users/add.html new file mode 100644 index 0000000..3e9ef54 --- /dev/null +++ b/src/main/resources/front/front/pages/users/add.html @@ -0,0 +1,320 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/users/detail.html b/src/main/resources/front/front/pages/users/detail.html new file mode 100644 index 0000000..fa34de4 --- /dev/null +++ b/src/main/resources/front/front/pages/users/detail.html @@ -0,0 +1,380 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 用户名: + + {{detail.username}} + +
    +
    + 密码: + + {{detail.password}} + +
    +
    + 角色: + + {{detail.role}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/users/list.html b/src/main/resources/front/front/pages/users/list.html new file mode 100644 index 0000000..7166245 --- /dev/null +++ b/src/main/resources/front/front/pages/users/list.html @@ -0,0 +1,426 @@ + + + + +管理员 + + + + + + + + + + + + + +
    + +
    +
    +
    + 管理员您现在的位置:管理员 +
    +
    +
    +
    用户名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/weixiuchuli/add.html b/src/main/resources/front/front/pages/weixiuchuli/add.html new file mode 100644 index 0000000..76d0cc8 --- /dev/null +++ b/src/main/resources/front/front/pages/weixiuchuli/add.html @@ -0,0 +1,440 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/weixiuchuli/detail.html b/src/main/resources/front/front/pages/weixiuchuli/detail.html new file mode 100644 index 0000000..752a224 --- /dev/null +++ b/src/main/resources/front/front/pages/weixiuchuli/detail.html @@ -0,0 +1,434 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 房屋名称: + + {{detail.fangwumingcheng}} + +
    +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 报修名称: + + {{detail.baoxiumingcheng}} + +
    +
    + 类型: + + {{detail.leixing}} + +
    +
    + 报修日期: + + {{detail.baoxiuriqi}} + +
    +
    + 维修反馈: + + {{detail.weixiufankui}} + +
    +
    + 维修进度: + + {{detail.weixiujindu}} + +
    +
    + 更新日期: + + {{detail.gengxinriqi}} + +
    +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 房主姓名: + + {{detail.fangzhuxingming}} + +
    +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/weixiuchuli/list.html b/src/main/resources/front/front/pages/weixiuchuli/list.html new file mode 100644 index 0000000..a021ea2 --- /dev/null +++ b/src/main/resources/front/front/pages/weixiuchuli/list.html @@ -0,0 +1,447 @@ + + + + +维修处理 + + + + + + + + + + + + + +
    + +
    +
    +
    + 维修处理您现在的位置:维修处理 +
    +
    +
    +
    报修名称
    + +
    +
    +
    维修进度
    + +
    +
    +
    房主姓名
    + +
    +
    +
    用户名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/woyaodangfangzhu/add.html b/src/main/resources/front/front/pages/woyaodangfangzhu/add.html new file mode 100644 index 0000000..b4109e0 --- /dev/null +++ b/src/main/resources/front/front/pages/woyaodangfangzhu/add.html @@ -0,0 +1,579 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/woyaodangfangzhu/detail.html b/src/main/resources/front/front/pages/woyaodangfangzhu/detail.html new file mode 100644 index 0000000..be3af38 --- /dev/null +++ b/src/main/resources/front/front/pages/woyaodangfangzhu/detail.html @@ -0,0 +1,522 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    + +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 租赁方式: + + {{detail.zulinfangshi}} + +
    +
    + 朝向楼层: + + {{detail.chaoxianglouceng}} + +
    +
    + 小区: + + {{detail.xiaoqu}} + +
    +
    + 面积: + + {{detail.mianji}} + +
    +
    + 月租价格: + + {{detail.yuezujiage}} + +
    +
    + 发布日期: + + {{detail.faburiqi}} + +
    +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + +
    • 房屋详情
    • + + + +
    • 评论
    • + + + + + +
    + +
    + +
    +
    +
    + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + 用户:{{item.userid}} +
    +
    + + {{item.content}} + +
    +
    + + 回复:{{item.reply}} + +
    +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/woyaodangfangzhu/list.html b/src/main/resources/front/front/pages/woyaodangfangzhu/list.html new file mode 100644 index 0000000..a3d5e3b --- /dev/null +++ b/src/main/resources/front/front/pages/woyaodangfangzhu/list.html @@ -0,0 +1,477 @@ + + + + +我要当房主 + + + + + + + + + + + + + +
    + +
    +
    +
    + + +
    +
    + 我要当房主您现在的位置:我要当房主 +
    +
    +
    +
    房屋名称
    + +
    +
    +
    小区
    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    {{item.price}} RMB
    +
    {{item.fangwumingcheng}}
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yonghu/add.html b/src/main/resources/front/front/pages/yonghu/add.html new file mode 100644 index 0000000..daf5090 --- /dev/null +++ b/src/main/resources/front/front/pages/yonghu/add.html @@ -0,0 +1,459 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yonghu/center.html b/src/main/resources/front/front/pages/yonghu/center.html new file mode 100644 index 0000000..f47b618 --- /dev/null +++ b/src/main/resources/front/front/pages/yonghu/center.html @@ -0,0 +1,540 @@ + + + + + + + + 个人中心 + + + + + + + + + + + +
    + + + + + + + +
    + USER / CENTER个人中心 +
    + + +
    + +
    + +
    + + +
    +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yonghu/detail.html b/src/main/resources/front/front/pages/yonghu/detail.html new file mode 100644 index 0000000..3f4b657 --- /dev/null +++ b/src/main/resources/front/front/pages/yonghu/detail.html @@ -0,0 +1,398 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 姓名: + + {{detail.xingming}} + +
    +
    + 性别: + + {{detail.xingbie}} + +
    +
    + 职业: + + {{detail.zhiye}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    +
    + 身份证: + + {{detail.shenfenzheng}} + +
    + + + + + +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yonghu/list.html b/src/main/resources/front/front/pages/yonghu/list.html new file mode 100644 index 0000000..4557e2c --- /dev/null +++ b/src/main/resources/front/front/pages/yonghu/list.html @@ -0,0 +1,426 @@ + + + + +用户 + + + + + + + + + + + + + +
    + +
    +
    +
    + 用户您现在的位置:用户 +
    +
    +
    +
    用户名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yonghu/register.html b/src/main/resources/front/front/pages/yonghu/register.html new file mode 100644 index 0000000..81ecb02 --- /dev/null +++ b/src/main/resources/front/front/pages/yonghu/register.html @@ -0,0 +1,169 @@ + + + + + + 注册 + + + + + + +
    + +
    + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yuyuekanfang/add.html b/src/main/resources/front/front/pages/yuyuekanfang/add.html new file mode 100644 index 0000000..4ccac3e --- /dev/null +++ b/src/main/resources/front/front/pages/yuyuekanfang/add.html @@ -0,0 +1,541 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yuyuekanfang/detail.html b/src/main/resources/front/front/pages/yuyuekanfang/detail.html new file mode 100644 index 0000000..e126956 --- /dev/null +++ b/src/main/resources/front/front/pages/yuyuekanfang/detail.html @@ -0,0 +1,468 @@ + + + + + + + + 首页 + + + + + + + + + + + +
    + +
    +
    + + 首页 + {{title}} + + + +
    +
    +
    + + + + + +
    +
    +

    {{title}}

    + + + + +
    + 预约编号: + + {{detail.yuyuebianhao}} + +
    +
    + 房屋名称: + + {{detail.fangwumingcheng}} + +
    +
    + 房屋类型: + + {{detail.fangwuleixing}} + +
    +
    + 房屋状态: + + {{detail.fangwuzhuangtai}} + +
    +
    + 小区: + + {{detail.xiaoqu}} + +
    +
    + 月租价格: + + {{detail.yuezujiage}} + +
    +
    + 押金: + + {{detail.yajin}} + +
    +
    + 租用月数: + + {{detail.zuyongyueshu}} + +
    +
    + 租用金额: + + {{detail.zuyongjine}} + +
    +
    + 预约时间: + + {{detail.yuyueshijian}} + +
    +
    + 用户名: + + {{detail.yonghuming}} + +
    +
    + 姓名: + + {{detail.xingming}} + +
    +
    + 身份证: + + {{detail.shenfenzheng}} + +
    +
    + 联系电话: + + {{detail.lianxidianhua}} + +
    +
    + 房主账号: + + {{detail.fangzhuzhanghao}} + +
    +
    + 房主姓名: + + {{detail.fangzhuxingming}} + +
    + + + + + +
    + + + + + + +
    +
    +
    + + + + +
    +
    + +
      + + + + + + + + + +
    + +
    + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + diff --git a/src/main/resources/front/front/pages/yuyuekanfang/list.html b/src/main/resources/front/front/pages/yuyuekanfang/list.html new file mode 100644 index 0000000..c455bcf --- /dev/null +++ b/src/main/resources/front/front/pages/yuyuekanfang/list.html @@ -0,0 +1,448 @@ + + + + +预约看房 + + + + + + + + + + + + + +
    + +
    +
    +
    + 预约看房您现在的位置:预约看房 +
    +
    +
    +
    房屋名称
    + +
    +
    +
    用户名
    + +
    +
    +
    姓名
    + +
    +
    +
    房主姓名
    + +
    + + +
    + +
    +
    +
    +
    +
    {{item.price}} RMB
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/src/main/resources/front/front/xznstatic/css/common.css b/src/main/resources/front/front/xznstatic/css/common.css new file mode 100644 index 0000000..19ba8b1 --- /dev/null +++ b/src/main/resources/front/front/xznstatic/css/common.css @@ -0,0 +1,396 @@ +/* 模板秀(mobanxiu.cn)做最好的织梦整站模板下载网站 */ +html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, h6, form, fieldset, legend, img { + margin: 0 auto; + padding: 0; +} +h1, h2, h3, h4, h5, h6 { + font-size: 100%; + font-weight: bold; +} +fieldset, img { + vertical-align: middle; + border: none; +} +address, caption, cite, code, dfn, th, var { + font-style: normal; + font-weight: normal; +} +ul, ol { + list-style: none; +} +li { + list-style-type: none; +} +input { + padding-top: 0; + padding-bottom: 0; + font-family: "????????????", Arial, sans-serif; +} +select, input { + vertical-align: middle; +} +select, input, textarea { + font-size: 12px; + margin: 0; +} +input[type="text"], input[type="submit"], textarea { + outline-style: none; +} +textarea { + resize: none; + font-family: "????????????", Arial, sans-serif; +} +body { + color: #333; + font: 12px "????????????", Arial, sans-serif; + background: #ffffff; + overflow-x: hidden +} +a { + color: #333; + text-decoration: none; +} +a:link { + text-decoration: none; /* ????????????????????????????????????*/ +} +a:visited { + text-decoration: none; /*???????????????????????????*/ +} +a:hover { + text-decoration: none;/*??????????????????*/ +} +a:active { + text-decoration: none;/* ?????????????????????*/ +} +i, em { + font-style: normal; +} +.clear { + clear: both; +} +.fl { + float: left; +} +.fr { + float: right; +} +.auto { + margin-left: auto; + margin-right: auto; +} +#app { + position: relative; + z-index: 1; +} +/*transition*/ +.tran200 { + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + transition: all 0.2s ease; +} +.tran400 { + -webkit-transition: all 0.4s ease; + -moz-transition: all 0.4s ease; + transition: all 0.4s ease; +} +/*??????????????????*/ +.con_1000 { + margin: 0 auto; + position: relative; + width: 1002px; +} +.con_1000:after { + content: ""; + display: block; + height: 0; + clear: both; +} +.detail .tit { + height: 40px; + line-height: 40px; + text-align: center; + font-weight: bold; + border-bottom: 1px solid #ccc; + overflow: hidden; +} +.detail .related { + padding: 6px 0; + text-align: center; +} +.detail .related span { + padding: 0 10px; +} +.detail .text { + padding: 10px; + line-height: 23px; +} +.detail .text .photo { + text-align: center; +} +.detail .other { + padding: 8px 0; + width: 100%; +} +.detail .other li { + line-height: 24px; +} +.detail .print { + padding: 8px 0; + text-align: right; + clear: both; +} +.detail .print a { + margin-right: 20px; +} +.detail .text .pro_photo { + text-align: center; +} +.ny_right .content .photo img { + max-width: 100%; + display: block; + margin: 0 auto +} +#header { + height: 90px; + background: #d42e3b; + border-bottom: 19px solid #06897d +} +#header .top { + width: 1002px; + margin: 0 auto; + height: 90px; + position: relative +} +#header .top .logo { + position: absolute; + left: 0; + top: 74px; +} +#header .top .rexian { + position: absolute; + top: 45px; + right: 190px; + line-height: 26px; + font-size: 24px; + font-family: Arial; + color: #fff; + background: url(img/index_03.gif) left center no-repeat; + padding-left: 30px; +} +#header .top .search { + width: 155px; + height: 24px; + position: absolute; + top: 31px; + right: 0; + background: #fff; + border-radius: 8px; +} +.search .input { + float: left; + width: 125px; + height: 24px; + line-height: 24px; + text-align: right; + background: none; + border: none; + color: #d42e3b +} +.search .button { + float: left; + background: url(img/index_07.gif) no-repeat; + width: 9px; + height: 9px; + border: none; + margin: 9px 0 0 12px; +} +#header .nav { + height: 26px; + position: absolute; + top: 32px; + right: 0; +} +.nav ul li { + float: left; + height: 26px; + line-height: 26px; + margin-left: 54px; +} +.nav li a { + color: #fff; + font-size: 14px; +} +.nav li a:hover, .nav li.current a { + color: #fff500 +} +#footer { + width: 100%; + background: url(img/index_42.gif) center center no-repeat; + height: 300px; + overflow: hidden +} +.f_top { + width: 1002px; + margin: 0 auto; + padding-top: 12px; + height: 208px; + overflow: hidden +} +.f_top .f_left { + float: left; + width: 217px; + border-right: 1px dashed #ae1a25; + height: 143px; + overflow: hidden; + background: url(img/index_49.jpg) left 43px no-repeat; + padding: 34px 0 0 133px; + color: #fff; + line-height: 22px; + color: #fff +} +.f_top .f_left span { + color: #fff600; + font-size: 26px; + height: 38px; + line-height: 38px; + display: block +} +.f_top .f_right { + float: right; + width: 600px; + color: #fff; + padding-top: 24px; +} +.f_top .f_right dl { + float: left; + width: 162px; + margin-left: 30px; +} +.f_top .f_right dl dt { + height: 30px; + line-height: 30px; + font-size: 16px; + margin-bottom: 10px; +} +.f_top .f_right dl dd { + line-height: 18px; +} +.f_top .f_right dl dd span { + color: #fff600; + font-size: 18px; + display: block; + margin-top: 12px; +} +.copyright { + text-align: center; + line-height: 26px; + color: #f47982; +} +.copyright a { + color: #f47982 +} +/*?????????*/ +.ny_left { + float: left; + width: 196px; + font-size: 16px; +} +.ny_left ul { + margin-bottom: 57px; + margin-top: 15px; +} +.ny_left ul li { + margin: -2px; + width: 191px; + height: 48px; + border: solid 2px #d42e3b; +} +.ny_left ul li p { + margin-top: 12px; + margin-left: 33px; + float: left; +} +.ny_left li:hover, .ny_left li.hover { + background: url(../img/service_btn.png) #d42e3b 140px center no-repeat; +} +.ny_left li:hover a, .ny_left li.hover a { + color: #fff +} +.ny_left ul .hover { + margin: -2px; + width: 191px; + height: 48px; + border: solid 2px #d42e3b; + background: url(../img/service_btn.png) #d42e3b 140px center no-repeat; +} +.ny_left ul .hover p { + color: #fff; +} +.ny_left .service_tel { + color: #d42e3b; + margin-top: 36px; +} +.ny_left .service_tel p { + background: url(img/service_tel.png) left center no-repeat; + padding-left: 29px; + font-size: 21px; + margin-left: 5px; + font-family: Arial; + margin-top: 5px; +} +.ny_left .service_tel span { + display: block; + font-family: "Microsoft YaHei"; + color: #d42e3b; + font-size: 13px; +} +/*????????????*/ +.ny_right { + float: right; + width: 754px; + height: auto !important; + height: 500px; + min-height: 500px; + margin-bottom: 120px; +} +.ny_right .title { + height: 46px; + line-height: 46px; + border-bottom: 1px solid #dcdcdc; + margin-bottom: 40px +} +.ny_right .title p { + float: right; + color: #6c6c6c +} +.ny_right .title h3 { + height: 45px; + border-bottom: 2px solid #d42e3b; + display: inline-block; + float: left; + padding-right: 13px; + font-size: 18px; + font-weight: normal +} +/*??????*/ +#full .qq_info a, #full .qq_info span { + display: block +} +#full .qq_info span { + width: 86px; + background: #fff; + text-align: center; + padding-top: 6px; + line-height: 24px; + border: 1px solid #968f96; + border-top: none +} +.single_con { + margin-top: 20px +} +.news_con { + margin-top: 20px +} +.pro_con { + margin-top: 20px +} diff --git a/src/main/resources/front/front/xznstatic/css/login.css b/src/main/resources/front/front/xznstatic/css/login.css new file mode 100644 index 0000000..133f1dc --- /dev/null +++ b/src/main/resources/front/front/xznstatic/css/login.css @@ -0,0 +1,132 @@ +html, body { + width: 100%; + height: 100%; +} + +.reg { + width: 100%; + height: 100%; + background: url("../img/20.jpg") no-repeat; + background-size: 100% 100%; +} + +.login { + width: 100%; + height: 100%; + background: url("../img/20.jpg") no-repeat; + background-size: 100% 100%; +} + +.login img, .reg img { + width: auto; +} + +.login form, .reg form { + position: fixed; + top: 15%; + right: 140px; + padding: 20px 0; + text-align: center; + z-index: 10; + background: #fff; +} + +.msg-warn { + position: relative; + background: #fef4e5; + color: #666; + display: inline-block; + border: 1px solid #f6c090; + padding: 3px 31px 3px 31px; + line-height: 15px; + height: auto; + margin-bottom: 15px; +} + +.login form { + top: 18%; + border: 1px solid #dbdbdb; + width: 440px; + height: 350px; +} + +.reg form { + width: 480px; + height: 490px; + background: #fff; +} + +.reg form h1, .login form h1 { + border-bottom: 1px solid #dbdbdb; + padding-bottom: 20px; +} + +.reg form p, .login form p { + margin-top: 15px; +} + +.reg form a.off, .login form a.off { + position: absolute; + right: 20px; + top: 20px; +} + +.reg form input, .login form input { + width: 280px; + height: 40px; + border-radius: 3px; +} + +.reg form input[type="text"], .login form input[type="text"] { + border: 1px solid #dbdbdb; + font-size: 14px; + padding-left: 10px; +} + +.reg form input[type="password"], .login form input[type="password"] { + border: 1px solid #dbdbdb; + font-size: 14px; + padding-left: 10px; +} + +.reg input[type="submit"], .login input[type="submit"] { + width: 280px; + background: #C10000; + font-size: 20px; + border: none; + color: #fff; +} + +div.reg form input.code { + width: 150px; +} + +div.reg form p.txtL { + text-align: left; +} + +div.reg form p.txtL img { + width: 97px; + height: 37px; + vertical-align: middle; +} + +div.reg form p.txtL a { + color: #c10000; +} + +.reg form p.txt, .login form p.txt { + width: 280px; + margin: 10px auto 0; + text-align: right; +} + +.reg p.txt a, .login p.txt a, { + color: #666; + text-decoration: underline; +} + +div.login form p.txt a { + margin-left: 20px; + cursor: pointer; +} \ No newline at end of file diff --git a/src/main/resources/front/front/xznstatic/css/public.css b/src/main/resources/front/front/xznstatic/css/public.css new file mode 100644 index 0000000..8a1217d --- /dev/null +++ b/src/main/resources/front/front/xznstatic/css/public.css @@ -0,0 +1,498 @@ +@charset "utf-8"; /* CSS Document *//*css预设*/ +* { + margin: 0; + padding: 0; +} + +/*将所有HTML元素的默认边距清0*/ +html, body { + font-size: 12px; + font-family: "微软雅黑", "arial"; + color: #262626; + background: #FFF; +} + +/*对HTML元素中的字体、颜色、背景色进行初始设置*/ +ul li, ol li { + list-style: none; +} + +/*将列表标签的默认样式清除*/ +a { + text-decoration: none; + outline: none; + color: #262626; + blr: expression(this.onFocus=this.blur()); +} + +/*将超链接的下划线去掉以及在ie6中点击出现的虚线框去掉*/ +img { + border: none; +} + +/*图片的默认边框去掉 */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +caption, th, td { + font-weight: normal; + text-align: left; +} + +input, textarea, select, button { + font-size: 100%; + font-family: inherit; + margin: 0; + padding: 0; + border: none; + outline: none; +} + +label, button { + cursor: pointer +} + +textarea { + white-space: pre; + resize: none; + border: 1px solid #ececec; +} + +article, aside, figcaption, figure, footer, header, hgroup, nav, section, summary { + display: block; +} + +/*清楚浮动*/ +.clearfix:after { + content: ""; + display: block; + clear: both; + height: 0; + line-height: 0; + visibility: hidden; +} + +.clearfix { + zoom: 1; +} + +/*解决ie6的兼容性问题*/ +.fl { + float: left; +} + +.fr { + float: right; +} + +.mt { + margin-top: 80px; +} + +.wrapper { + width: 1160px; + margin: 0 auto; +} + +/*********************head********************/ +.head { + margin-top: 30px; + min-width: 1160px; + position: relative; + border-bottom: 1px solid #e0e0e0; +} + +.head h1 img { + width: 80%; + display: block; +} + +.head div p { + margin-top: 20px; +} + +.head div p a { + color: #262626; + padding: 0 10px; + font-size: 14px; +} + +.head div p a:nth-child(1) { + border-right: 1px solid #dbdbdb; +} + +.head div form { + width: 160px; + height: 30px; + line-height: 30px; + margin: 0 10px; + margin-top: 13px; + border-bottom: 1px solid #262626; +} + +.head div form input:nth-child(1) { + background: none; + text-indent: 8px; +} + +.head div form input:nth-child(2) { + float: right; + width: 13%; + padding-bottom: 10px; + background: url("../img/ss.png") no-repeat right 5px; + cursor: pointer; +} + +.head div.btn { + margin-top: 20px; + position: relative; +} + +.head div.btn a { + float: left; + margin: 0 10px; +} + +.head ul { + float: left; + margin-left: 18%; + line-height: 50px; +} + +.head ul li { + float: left; + padding: 0 20px; +} + +.head ul li > a { + color: #262626; + font-size: 14px; + display: inline-block; + position: relative; +} + +.head ul li a:before { + content: ""; + background: #A10000; + position: absolute; + bottom: -3px; + z-index: -1; + transform: scaleX(0); + transition: all .5s ease; + -webkit-transition: all .5s ease; +} + +.head ul li:nth-child(1) a:before { + left: -12px; +} + +.head ul li > a:hover { + color: #A10000; +} + +.head ul li > a:hover:before { + width: 56px; + height: 2px; + transform: scaleX(1); + transition-timing-function: cubic-bezier(0.52, 1.64, 0.37, 0.66); + -webkit-transition-timing-function: cubic-bezier(0.52, 1.64, 0.37, 0.66);; + z-index: 9999; +} + +.head div.sList { + position: absolute; + top: 113px; + left: 0; + z-index: 3; + background: #fff; + width: 100%; + display: none; +} + +.head div.sList div { + text-align: center; + padding: 20px 0; + display: flex; +} + +.head div.sList div a { + flex: 1 1 20%; + border-right: 1px solid #dbdbdb; +} + +.head div.sList div a:last-child { + border-right: none; +} + +.head div.sList div dl dt img { + width: 70%; +} + +.head div.sList div dl dd { + font-size: 14px; +} + +.head div.sList2 { + display: none; + position: absolute; + top: 113px; + left: 0; + z-index: 3; + background: #fff; + width: 100%; +} + +.head div.sList2 div { + width: 46%; + margin: 0 auto; +} + +.head div.sList2 a { + float: left; + margin-right: 40px; +} + +/*定位样式*/ +.ding { + margin-top: 0; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 40px; + padding: 20px 0; + background: #fff; + z-index: 100; +} + +.ding h1 { + position: absolute; + left: 10%; + top: 20%; +} + +.ding h1 img { + width: 65%; +} + +/*.ding #top1{ display: none;}*/ +.ding #top1 p, .ding #top1 div { + display: none; +} + +.ding ul li a:before { + bottom: -25px; +} + +.ding div.sList, .ding div.sList2 { + top: 81px; +} + +.ding ul { + float: left; + margin-left: 18%; + line-height: 0; +} + +.ding div form { + width: 185px; + height: 30px; + line-height: 30px; + margin: 0 10px; + margin-top: 5px; + border-bottom: 1px solid #262626; +} + +.ding div.sList2 a { + float: left; + margin-right: 40px; + line-height: 38px; +} + +.ding div.sList div dl dd { + line-height: 35px; +} + +/*头部二维码*/ +.head div.btn p { + display: none; +} + +.head div.btn p a { + width: 74px; + height: 74px; + position: absolute; + top: 30px; + background: #fff; + right: 10px; + padding: 2px; + z-index: 10; + border: 1px solid #A10000; +} + +.head div.btn p a img { + width: 100%; +} + +.head div.btn p a:before { + position: absolute; + top: -5px; + left: 50%; + width: 0; + height: 0; + margin-left: -5px; + vertical-align: middle; + content: " "; + border-right: 5px solid transparent; + border-bottom: 5px solid #A10000; + border-left: 5px solid transparent; +} + +/*********************address********************/ +.address { + height: 40px; + line-height: 40px; + border-bottom: 1px solid #DBDBDB; +} + +.address a, .address span { + float: left; + color: #777; +} + +.address span { + margin: 0 20px; +} + +.address a.on { + color: #262626; +} + +/*********************footer********************/ +.footer { + min-width: 1160px; +} + +.footer .top { + padding: 30px 0; + border-top: 1px solid #DBDBDB; + border-bottom: 1px solid #DBDBDB; +} + +.footer .top .wrapper { + display: flex; +} + +.footer .top .wrapper div { + flex: 1 1 25%; + border-right: 1px solid #dbdbdb; +} + +.footer .top .wrapper div:last-child { + border-right: none; +} + +.footer .top .wrapper div a img { + display: block; +} + +.footer .top .wrapper div a { + margin-left: 25%; +} + +.footer .top .wrapper div span { + margin-top: 15px; + margin-left: 10px; + display: block; + font-size: 16px; +} + +.footer p.dibu { + background: #000; + padding: 30px 0; + text-align: center; + color: #fff; +} + +/*********************gotop********************/ +body { + position: relative; +} + +.gotop { + position: fixed; + right: 20px; + top: 400px; + z-index: 20; +} + +.gotop a { + display: block; + width: 48px; + height: 48px; + line-height: 38px; + background: #f4f4f4; + margin-bottom: 10px; + border: 1px solid #d6d6d6; + cursor: pointer; +} + +.gotop dl dt { + margin: 0 auto; + width: 20px; + padding-top: 10px; +} + +.gotop dl.goCart { + position: relative; +} + +.gotop dl.goCart span { + position: absolute; + top: -9px; + right: -8px; + width: 16px; + height: 16px; + border-radius: 8px; + background: #c10000; + color: #fff; + text-align: center; + line-height: 16px; +} + +.gotop dl dd { + display: none; + background: #a10000; + height: 41px; + width: 41px; + color: #fff; + padding: 8px 0 0 10px; + line-height: 15px; +} + +.gotop p { + border: 1px solid #A10000; + padding: 10px; + position: absolute; + background: #f4f4f4; + top: 66px; + left: -130px; + display: none; +} + +.gotop p:before { + position: absolute; + top: 50%; + right: -6px; + width: 0; + margin-top: -5px; + height: 0; + margin-left: -5px; + vertical-align: middle; + content: " "; + border-bottom: 5px solid transparent; + border-left: 5px solid #a10000; + border-top: 5px solid transparent; +} \ No newline at end of file diff --git a/src/main/resources/front/front/xznstatic/css/style.css b/src/main/resources/front/front/xznstatic/css/style.css new file mode 100644 index 0000000..46c0956 --- /dev/null +++ b/src/main/resources/front/front/xznstatic/css/style.css @@ -0,0 +1,498 @@ +/* 模板秀(mobanxiu.cn)做最好的织梦整站模板下载网站 */ +@charset "utf-8"; +.banner { + position: relative; + /* left: 50%; */ + /* width: 1920px; */ + /* height: 492px; */ + /* text-align: center; */ + /* margin: 0 82px 0 -960px; */ + /* margin-bottom: 30px; */ +} +.banner .bd li { + width: 100%; + text-align: center +} +.banner .hd { + position: absolute; + bottom: 46px; + width: 100%; + text-align: center; + z-index: 10000 +} +.banner .hd ul { + width: 100%; + text-align: center; +} +.banner .hd li { + display: inline-block; +*display:inline; + width: 10px; + height: 10px; + background: #1e0f00; + border-radius: 5px; + margin: 0 3px; +} +.banner .hd li.on { + background: #fff; +} +.section { + width: 1014px; + margin: 0 auto; + overflow: hidden; + margin-bottom: 57px; +} +.section .title { + text-align: center; + margin-bottom: 26px; +} +.section li .photo { + display: block; + width: 312px; + height: 312px; + border-radius: 156px; + overflow: hidden +} +.section li .tit { + display: block; + height: 44px; + color: #037066; + font-size: 16px; + line-height: 44px; +} +.section li { + float: left; + width: 312px; + margin: 0 13px; + text-align: center +} +.section1 { + background: url(../img/index_24.gif) center center no-repeat; + width: 100%; + height: 551px; + margin-bottom: 38px; +} +.news { + width: 1002px; + margin: 0 auto; + padding-top: 72px; +} +.news .title { + text-align: center; + margin-bottom: 62px; +} +.news .n_left { + float: left; + width: 305px; + height: 271px; + padding: 7px 7px 0; + background: #e75f6a; + position: relative +} +#ifocus_pic { + position: relative; + width: 305px; + height: 271px; + overflow: hidden +} +#ifocus #ifocus_pic { + width: 305px; + height: 271px; +} +#ifocus_tx { + width: 293px; + height: 34px; + line-height: 34px; + text-align: right; + padding-right: 12px; + position: absolute; + left: 0; + bottom: 0; +} +#ifocus_tx a { + color: #fff +} +#ifocus_btn { + position: absolute; + width: 305px; + bottom: 40px; + z-index: 1000000 +} +#ifocus_btn ul { + width: 305px; + text-align: right; + zomm: 1; +} +#ifocus_btn ul li { + display: inline-block; +*display:inline; + width: 8px; + height: 8px; + margin: 0 2px; + background: #fff; + border-radius: 4px; + font-size: 0 +} +#ifocus_btn ul li.on { + background: #e75f6a +} +.n_right { + float: right; + width: 602px; +} +.n_right li .date { + float: left; + width: 78px; + height: 70px; + border-right: 1px solid #ea979d; + color: #ffd800; + font-size: 50px; + font-family: Arial; + line-height: 70px; +} +.n_right li .info { + float: right; + width: 495px; + line-height: 22px; + color: #c2c0be +} +.n_right li .info a { + display: block; + height: 28px; + line-height: 28px; + color: #fff +} +.n_right li { + height: 72px; + overflow: hidden; + margin-bottom: 22px; +} +.student { + width: 1002px; + margin: 0 auto; + background: url(../img/index_35.gif) #fffefa 145px bottom no-repeat; + height: 572px; + overflow: hidden +} +.student .title { + text-align: center; + margin-bottom: 28px; +} +.student .list { + width: 100%; + text-align: center; + height: 25px; + overflow: hidden; + margin-bottom: 48px; +} +.student .list a { + display: inline-block; + width: 84px; + height: 25px; + line-height: 25px; + text-align: center; + background: #f7eedc; + color: #d42e3b; + font-size: 14px; + border-radius: 6px +} +.student .list a:hover { + background: #d42e3b; + color: #fff +} +.student li .photo { + display: block; + width: 166px; + height: 166px; +} +.student li .name { + display: block; + height: 45px; + line-height: 45px; + text-align: center +} +.student li { + float: left; + width: 166px; + height: 211px; + padding: 5px 5px 0; + border: 1px solid #fcf9f3; + margin: 0 8px; + background: #fff +} +.student li:hover { + background: #d42e3b; + border-color: #d42e3b +} +.student li:hover a { + color: #fff +} +.student .bd { + width: 970px; + margin: 0 auto; + overflow: hidden +} +.student .hd { + width: 100%; + margin-top: 46px; + text-align: center; +} +.student .hd a { + display: inline-block; + width: 57px; + height: 33px; + margin: 0 20px; + cursor: pointer +} +.student .hd .prev { + background: url(../img/index_44.gif) no-repeat +} +.student .hd .next { + background: url(../img/index_41.gif) no-repeat +} +/*??????*/ +.single_con .ny_right .content { + line-height: 27px +} +/*????????????*/ +.news_con .ny_right .content_title { + margin-bottom: 30px; + padding-bottom: 20px; + text-align: center; + border-bottom: 1px #ddd dotted; +} +.news_con .ny_right .content_title h3 { + font-size: 17px; + color: #4d5260; +} +.news_con .ny_right .content_title .info { + margin-top: 15px; + font-size: 12px; + color: #aaa; +} +.news_con .ny_right .content_title .info span { + display: inline-block; + margin: 0 10px; +} +.news_con .ny_right .content { + line-height: 27px +} +.first_list { + height: 125px; + overflow: hidden; + margin-bottom: 26px; +} +.first_list img { + border: solid 1px #c2c2c2; + float: left; + width: 210px; + height: 123px; +} +.first_list .right { + float: right; + color: #8c8573; + line-height: 20px; + width: 516px; +} +.first_list .right .tit { + display: block; + height: 31px; + color: #d42e3b; + font-size: 14px; +} +.first_list .right .text { + height: 40px; + overflow: hidden; + margin-bottom: 4px; +} +.first_list .right a { + color: #cf281f; + display: block +} +.first_list .right .date { + display: block; + height: 20px; + line-height: 20px; + background: url(../img/news_list_time.jpg) left center no-repeat; + padding-left: 20px; + margin-top: 10px; +} +.other_list { + margin-bottom: 67px; +} +.other_list li { + height: 37px; + line-height: 37px; + border-bottom: dotted 1px #dddddd; +} +.other_list a:hover, .other_list li:hover { + color: #d42e3b +} +.other_list li span { + float: right; +} +/*????????????*/ +.list_btn { + margin: 20px auto; + width: 752px; +} +.list_btn_l_r { + float: left; + width: 20px; + height: 20px; + border: solid 1px #d3d3d3; + text-align: center; + color: #d3d3d3; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + transition: all 0.5s; +} +.list_btn_l_r:hover { + color: #8c8573; + border-color: #8c8573; +} +.list_btn_line { + float: left; + width: 85px; + height: 1px; + background-color: #d3d3d3; + margin-top: 11px; +} +.list_btn_num { + width: 120px; + float: left; + margin: 0 9px; + text-align: center; +} +.list_btn_num a { + display: inline-block; + width: 20px; + height: 20px; + text-align: center; + border: solid 1px #d3d3d3; + margin: 0 2px; + color: #606060; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + transition: all 0.5s; +} +.list_btn_num a:hover, .list_btn_num .hover { + color: #d42e3b; + border-color: #d42e3b; +} +/*????????????*/ +.news_con .ny_right .content_tit { + height: 40px; + line-height: 40px; + text-align: center; + font-weight: bold; + border-bottom: 1px solid #ccc; + overflow: hidden; +} +.news_con .ny_right .content_related { + padding: 6px 0; + text-align: center; + margin-bottom: 30px; +} +.news_con .ny_right .content { + line-height: 27px +} +.news_con .ny_right .content_btn { + line-height: 27px +} +.news_con .ny_right .content_btn a { + color: #2d3140 +} +/*????????????*/ +.pro_con .ny_right .content { + line-height: 27px +} +.pro_con .ny_right .content ul { + float: left; + margin: 0 -24px 0 -23px; +} +.pro_con .ny_right .content li { + float: left; + width: 212px; + height: 310px; + border: solid 3px transparent; + ; + margin: 0 24px 67px; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + transition: all 0.3s; +} +.pro_con .ny_right .content li .photo { + display: block; + width: 213px; + height: 200px; +} +.pro_con .ny_right .content li .info { + width: 213px; + height: 110px; + background: #f5f5f5; +} +.pro_con .ny_right .content li .info .name { + height: 40px; + line-height: 40px; + padding-left: 19px; + font-size: 14px; + font-weight: bold; +} +.pro_con .ny_right .content li .info .text { + line-height: 18px; + padding: 0 19px; + height: 36px; + overflow: hidden; + margin-bottom: 10px; +} +.pro_con .ny_right .content li .info .more { + display: block; + height: 24px; + line-height: 24px; + background: #adadad; + padding-left: 20px; + color: #fff; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + transition: all 0.3s; +} +.pro_con .ny_right .content li:hover { + border-color: #d42e3b +} +.pro_con .ny_right .content li:hover .more { + background: #d42e3b +} +.pagelink { + height: 26px; + width: 350px; + line-height: 26px; + TEXT-ALIGN: center; + float: left; +} +.pagelink li { + float: left; + margin-right: 3px; + list-style-type: none; + border: solid 1px; +} +.pagelink a, .pagelink span { + padding: 0 3px; +} +.pagelink .thisclass { + padding: -5px auto 3px; + color: #F00; + border: solid 1px #FF0000; +} +.pagelink .thisclass a { + padding: -5px auto 3px; + color: #F00; + ; +} +.pagelink a.on, .pagelink a:hover { + color: #F9003B; +} diff --git a/src/main/resources/front/front/xznstatic/img/162237296.jpg b/src/main/resources/front/front/xznstatic/img/162237296.jpg new file mode 100644 index 0000000..17ddc6a Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/162237296.jpg differ diff --git a/src/main/resources/front/front/xznstatic/img/162240878.jpg b/src/main/resources/front/front/xznstatic/img/162240878.jpg new file mode 100644 index 0000000..167a8e9 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/162240878.jpg differ diff --git a/src/main/resources/front/front/xznstatic/img/19.jpg b/src/main/resources/front/front/xznstatic/img/19.jpg new file mode 100644 index 0000000..05193c4 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/19.jpg differ diff --git a/src/main/resources/front/front/xznstatic/img/1_092ZZ2503138.jpg b/src/main/resources/front/front/xznstatic/img/1_092ZZ2503138.jpg new file mode 100644 index 0000000..87ffdb5 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/1_092ZZ2503138.jpg differ diff --git a/src/main/resources/front/front/xznstatic/img/20.jpg b/src/main/resources/front/front/xznstatic/img/20.jpg new file mode 100644 index 0000000..18d4e30 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/20.jpg differ diff --git a/src/main/resources/front/front/xznstatic/img/index_24.gif b/src/main/resources/front/front/xznstatic/img/index_24.gif new file mode 100644 index 0000000..99084d2 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/index_24.gif differ diff --git a/src/main/resources/front/front/xznstatic/img/index_35.gif b/src/main/resources/front/front/xznstatic/img/index_35.gif new file mode 100644 index 0000000..2299f88 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/index_35.gif differ diff --git a/src/main/resources/front/front/xznstatic/img/index_41.gif b/src/main/resources/front/front/xznstatic/img/index_41.gif new file mode 100644 index 0000000..0183ef3 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/index_41.gif differ diff --git a/src/main/resources/front/front/xznstatic/img/index_44.gif b/src/main/resources/front/front/xznstatic/img/index_44.gif new file mode 100644 index 0000000..e08b6c3 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/index_44.gif differ diff --git a/src/main/resources/front/front/xznstatic/img/logo.png b/src/main/resources/front/front/xznstatic/img/logo.png new file mode 100644 index 0000000..a3cc9b1 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/logo.png differ diff --git a/src/main/resources/front/front/xznstatic/img/news_list_time.jpg b/src/main/resources/front/front/xznstatic/img/news_list_time.jpg new file mode 100644 index 0000000..a10254d Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/news_list_time.jpg differ diff --git a/src/main/resources/front/front/xznstatic/img/service_btn.png b/src/main/resources/front/front/xznstatic/img/service_btn.png new file mode 100644 index 0000000..3e88734 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/service_btn.png differ diff --git a/src/main/resources/front/front/xznstatic/img/service_img.png b/src/main/resources/front/front/xznstatic/img/service_img.png new file mode 100644 index 0000000..51b3b89 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/service_img.png differ diff --git a/src/main/resources/front/front/xznstatic/img/service_title.png b/src/main/resources/front/front/xznstatic/img/service_title.png new file mode 100644 index 0000000..c998225 Binary files /dev/null and b/src/main/resources/front/front/xznstatic/img/service_title.png differ diff --git a/src/main/resources/front/front/xznstatic/js/index.js b/src/main/resources/front/front/xznstatic/js/index.js new file mode 100644 index 0000000..c0212be --- /dev/null +++ b/src/main/resources/front/front/xznstatic/js/index.js @@ -0,0 +1,8 @@ +jQuery(".banner").slide({mainCell:".bd ul",autoPlay:true,interTime:5000}); + +//???????????? +jQuery("#ifocus").slide({ titCell:"#ifocus_btn li", mainCell:"#ifocus_piclist ul",effect:"leftLoop", delayTime:200, autoPlay:true,triggerTime:0}); + //???????????? +jQuery("#ifocus").slide({ titCell:"#ifocus_btn li", mainCell:"#ifocus_tx ul",delayTime:0, autoPlay:true}); + +jQuery(".product_list").slide({mainCell:".bd ul",autoPage:true,effect:"leftLoop",autoPlay:true,vis:5,trigger:"click",interTime:4000}); \ No newline at end of file diff --git a/src/main/resources/front/front/xznstatic/js/jquery-1.11.3.min.js b/src/main/resources/front/front/xznstatic/js/jquery-1.11.3.min.js new file mode 100644 index 0000000..a313785 --- /dev/null +++ b/src/main/resources/front/front/xznstatic/js/jquery-1.11.3.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
    a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" + +
    + +
    +
    © 2020-2021 毕业设计所有
    +
    +
    + + + + + + + + + diff --git a/target/classes/front/front/index.html.bak b/target/classes/front/front/index.html.bak new file mode 100644 index 0000000..1629e15 --- /dev/null +++ b/target/classes/front/front/index.html.bak @@ -0,0 +1,121 @@ + + + + + + + 首页 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/target/classes/front/front/js/bootstrap.AMapPositionPicker.js b/target/classes/front/front/js/bootstrap.AMapPositionPicker.js new file mode 100644 index 0000000..46badfc --- /dev/null +++ b/target/classes/front/front/js/bootstrap.AMapPositionPicker.js @@ -0,0 +1,707 @@ +/** + * BootstrapAMapPositionPicker v0.8.3 + * @author: Kinegratii + */ +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery', 'AMap'], factory); + } else if (typeof exports === 'object') { + module.exports = factory(require('jquery'), require('AMap')); + } else { + if (typeof jQuery === 'undefined') { + throw 'AMapPositionPicker requires jQuery to be loaded first'; + } + if (typeof AMap == 'undefined') { + throw 'AMapPositionPicker requires AMap to be loaded first'; + } + factory(jQuery, AMap); + } +}(function ($, AMap) { + // Global tool functions + String.prototype.format = function (data) { + var result = this; + for (var key in data) { + if (data[key] != undefined) { + var reg = new RegExp("({" + key + "})", "g"); + result = result.replace(reg, data[key]); + } + } + return result; + }; + if (typeof String.prototype.startsWith != 'function') { + String.prototype.startsWith = function (prefix) { + return this.slice(0, prefix.length) === prefix; + }; + } + + function wrapFormat(formatter, data) { + if (typeof formatter == 'function') { + return formatter(data); + } else if (typeof formatter == 'string') { + return formatter.format(data); + } else { + return ''; + } + } + + // Data Structure Start + var Position = (function () { + function Position(longitude, latitude, address, label) { + this.longitude = longitude; + this.latitude = latitude; + this.address = address || ''; + this.label = label || ''; + } + + Position.prototype.isValid = function () { + return this.longitude != undefined && this.longitude != null && this.latitude != undefined && this.latitude != null; + }; + Position.prototype.copy = function (data) { + if (data == undefined) { + return new Position(this.longitude, this.latitude, this.address, this.label); + } else { + return new Position( + data.longitude || this.longitude, + data.latitude || this.latitude, + data.address || this.address, + data.label || this.label + ); + } + }; + Position.prototype.getDisplayString = function () { + if (this.label) { + return this.label; + } else { + return this.address; + } + }; + Position.fromOptions = function (options) { + if (options instanceof Position) { + return options; + } else { + return new Position(options.longitude, options.latitude, options.address, options.label); + } + }; + Position.empty = function () { + return new Position(null, null, "", ""); + }; + Position.validate = function (position) { + if (position) { + return position.isValid(); + } else { + return false; + } + }; + Position.validateLngLat = function (lnglatStr) { + var result = /^([+-]?(0?\d{1,2}(\.\d{1,6})?|1[0-7]?\d{1}(\.\d{1,6})?|180\.0{1,6}))[-;,]([-+]?([0-8]?\d{1}(\.\d{1,6})?|90(\.0{1,6})?))$/.exec(lnglatStr); + if (result) { + return {longitude: parseFloat(result[1]), latitude: parseFloat(result[5])}; + } else { + return null; + } + }; + Position.LNGLAT_FORMATTER = ['{longitude}-{latitude}', '{longitude};{latitude}', '{longitude},{latitude}']; + return Position; + }()); + + var Field = (function () { + var idIndex = -1; + + function generateSelectorId(selector) { + if (selector.startsWith('#')) { + return selector.substring(1); + } else { + idIndex += 1; + return 'id_ampp_i' + idIndex; + } + } + + function Field(options) { + this.name = options.name; + if (options.selector instanceof jQuery) { + this.$widget = options.selector; + this.created = true; + } + else if ($(options.selector).length > 0) { + this.$widget = $(options.selector); + this.created = true; + } else { + var inputHtml = ''.format({ + id: generateSelectorId(options.selector), + name: options.name + }); + this.$widget = $(inputHtml); + this.created = false; + } + this.formatter = function (position) { + return wrapFormat(options.formatter, position); + }; + } + + Field.prototype.render = function (position, hasPicked) { + + var v; + if (hasPicked) { + v = this.formatter(position); + } else { + v = ''; + } + console.log(v); + if (this.$widget.is('input') || this.$widget.is('textarea')) { + this.$widget.val(v); + } else if (this.$widget.is('div') || this.$widget.is('td') || this.$widget.is('p')) { + this.$widget.html(v); + } + }; + + return Field; + + }()); + + var FieldManager = (function () { + var fields = []; + + function FieldManager() { + fields = []; + } + + FieldManager.prototype.addField = function (field) { + fields.push(field); + }; + + FieldManager.prototype.render = function (position, hasPicked) { + for (var i = 0.; i < fields.length; i++) { + fields[i].render(position, hasPicked); + } + + }; + + return FieldManager; + + }()); + + // Data Structure End + + function buildBootstrapModalHTML() { + var toolsHtml = '
    ' + + '' + + '' + + '' + + '' + + '
    '; + var searchPanelHtml = '
      '; + var mapPanelHtml = '
      ' + toolsHtml + searchPanelHtml + '
      '; + var modalHtml = '';//End of Modal + return modalHtml; + } + + var PICKER_CONTROLLER = (function () { + // Common Modal Controller for all elements + + // Context pick + var mPicker = null; + var mapObj = null; + + var isShowOrPickMode = false; + + var $modal = null, $map, $addressInput, $alert, $pickBtn, $locationBtn, $resetBtn, $clearBtn, $cancelBtn; + + // Current picked + var selectedMarker = null; + var cachePosition = Position.empty(); + // Search plugin + var $searchBtn, $searchPanel, $searchInput, $searchResultList; + var markerList = []; + + var geolocation; + + + var mapClickClickHandler = function (e) { + $alert.hide(); + selectMarker(createMarkerFromLnglat(e.lnglat.lng, e.lnglat.lat)); + }; + + function activate(picker) { + mPicker = picker; + showModal(); + } + + function deactivate() { + mPicker = null; + } + + function showModal() { + initializeController(); + initializePicker(); + + var p = mPicker.position(); + if (p && p.isValid()) { + selectMarker(createMarkerFromPosition(p)); + } else { + if (selectedMarker) { + selectedMarker.setMap(null); + } + $addressInput.val(''); + if (mPicker.opts.center.longitude && mPicker.opts.center.latitude) { + mapObj.setCenter(new AMap.LngLat(mPicker.opts.center.longitude, mPicker.opts.center.latitude)); + } + } + $modal.modal('show'); + } + + + function initializeController() { + // Initialize global options + if ($modal == null) { + $modal = $(buildBootstrapModalHTML()); + $(document.body).append($modal); + mapObj = new AMap.Map("idAMapPositionPickerMap", { + zoom: 15 + }); + AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.OverView'], + function () { + mapObj.addControl(new AMap.ToolBar()); + mapObj.addControl(new AMap.Scale()); + mapObj.addControl(new AMap.OverView({isOpen: true})); + }); + mapObj.on('click', mapClickClickHandler); + mapObj.plugin('AMap.Geolocation', function () { + geolocation = new AMap.Geolocation({ + enableHighAccuracy: true, + timeout: 3000, + maximumAge: 0, + convert: true, + panToLocation: true, + zoomToAccuracy: true, + markerOptions: {} + }); + }); + // DOM Selectors and events + $map = $("#idAMapPositionPickerMap"); + $pickBtn = $("#idAMapPositionPickerSelect"); + $locationBtn = $("#idAMapPositionPickerLocation"); + $resetBtn = $("#idAMapPositionPickerReset"); + $clearBtn = $("#idAMapPositionPickerClear"); + $addressInput = $("#idAMapPositionPickerAddress"); + $cancelBtn = $("#idAMapPositionPickerCancelBtn"); + $alert = $("#idAMapPositionPickerAlert"); + + $searchBtn = $("#idAMapPositionPickerSearch"); + $searchPanel = $("#idAMapPositionPickerSearchPanel"); + $searchInput = $("#idAMapPositionPickerSearchInput"); + $searchResultList = $("#idAMapPositionPickerSearchResult"); + + $pickBtn.on('click', pickPosition); + $resetBtn.on('click', resetInitialPosition); + $clearBtn.on('click', clearPosition); + $locationBtn.on('click', location); + $searchPanel.on('show.bs.collapse', function () { + $searchBtn.removeClass('btn-default').addClass('btn-primary'); + startSearch(); + }).on('hide.bs.collapse', function () { + $searchBtn.removeClass('btn-primary').addClass('btn-default'); + endSearch(); + }); + $('ul#idAMapPositionPickerSearchResult').on('click', 'li[data-poi-index]', highlightMarker); + } + } + + function initializePicker() { + toggleMode(false); + $map.css('height', mPicker.opts.height); + $modal.find('h4.modal-title').html(mPicker.opts.title); + $alert.hide(); + + } + + function location() { + $alert.hide(); + geolocation.getCurrentPosition(function (status, result) { + if (status == 'complete') { + selectMarker(createMarkerFromLnglat(result.position.lng, result.position.lat, result.formattedAddress)) + } else { + $alert.html(result.message).show(); + } + }); + } + + function clearPosition() { + cachePosition = Position.empty(); + if (selectedMarker != null) { + selectedMarker.setMap(null); + } + $addressInput.val(''); + } + + function resetInitialPosition() { + cachePosition = mPicker.getInitialPosition(); + if (Position.validate(cachePosition)) { + selectMarker(createMarkerFromPosition(cachePosition)); + } else if (selectedMarker != null) { + selectedMarker.setMap(null); + $addressInput.val(''); + } + } + + function isPositionPicked() { + return cachePosition.isValid(); + } + + function pickPosition() { + if (isShowOrPickMode) { + $modal.modal('hide'); + return; + } + var address = $addressInput.val(); + cachePosition.address = address; + + // Always use new position instance + var pickedPosition; + var hasPicked = isPositionPicked(); + if (hasPicked) { + pickedPosition = cachePosition.copy(); + } else { + pickedPosition = Position.empty(); + } + + if (mPicker.opts.required && !hasPicked) { + $alert.html(mPicker.opts.errorTip).show(); + } else { + $alert.hide(); + $modal.modal('hide'); + mPicker._onPickedCallback(pickedPosition, hasPicked); + } + } + + // Search Start + function highlightMarker(e) { + + var index = $(this).data('poiIndex'); + if (index < markerList.length) { + markerList[index].resumeMove(); + } + } + + function startSearch() { + mapObj.off('click', mapClickClickHandler); + $resetBtn.prop('disabled', true); + $clearBtn.prop('disabled', true); + $locationBtn.prop('disabled', true); + + $searchInput.on('keydown', function (e) { + var searchKeyword = $searchInput.val(); + if (e.which == '13' && searchKeyword.length > 0) { //Enter + AMap.service('AMap.PlaceSearch', function () { + var placeSearch = new AMap.PlaceSearch({ + pageSize: 6, + pageIndex: 1, + extensions: 'all' // return full address for POI + }); + // Search in the given bound + placeSearch.searchInBounds(searchKeyword, mapObj.getBounds(), function (status, result) { + $searchResultList.children('li').remove(); + for (var i in markerList) { + markerList[i].setMap(null); + } + markerList = []; + if (status == 'complete') { + for (var i in result.poiList.pois) { + var poi = result.poiList.pois[i]; + var li = $('
    • {name}
    • '.format({ + i: i, + name: poi.name + })); + $searchResultList.append(li); + // delay to username poi.address + var mMarker = createMarkerFromLnglat(poi.location.lng, poi.location.lat); + mMarker.on('click', function (e) { + selectMarker(e.target); + }); + markerList.push(mMarker); + } + mapObj.panTo(markerList[0].getPosition()); + } else { + $searchPanel.append('
    • 抱歉,暂无找到符合条件的结果。
    • '); + } + }); + }); + } + }); + } + + function endSearch() { + mapObj.on('click', mapClickClickHandler); + $resetBtn.prop('disabled', false); + $clearBtn.prop('disabled', false); + $locationBtn.prop('disabled', false); + $searchInput.val('').off('keydown'); + for (var i in markerList) { + markerList[i].setMap(null); + } + markerList = []; + $searchResultList.children('li').remove(); + } + + // Search End + + + // New tools + + function createMarkerFromPosition(position) { + var markerOpts = { + map: mapObj, + position: new AMap.LngLat(position.longitude, position.latitude), + topWhenClick: true, + offset: new AMap.Pixel(-5, -30), + animation: 'AMAP_ANIMATION_DROP', + extData: position + }; + if (position.address) { + markerOpts.title = position.address; + } + var marker = new AMap.Marker(markerOpts); + return marker; + } + + function createMarkerFromLnglat(longitude, latitude, address) { + var position = new Position(longitude, latitude, address, ""); + return createMarkerFromPosition(position); + } + + function selectMarker(marker) { + clearPosition(); + selectedMarker = marker; + var position = marker.getExtData(); + var lngLat = marker.getPosition(); + + cachePosition.longitude = position.longitude; + cachePosition.latitude = position.latitude; + if (!position.address) { + var geocoder; + mapObj.plugin(["AMap.Geocoder"], function () { + geocoder = new AMap.Geocoder({ + radius: 1000, + extensions: "base" + }); + AMap.event.addListener(geocoder, "complete", function (GeocoderResult) { + if (GeocoderResult["info"] == "OK") { + var address = GeocoderResult.regeocode.formattedAddress; + position.address = address; + selectedMarker.setExtData(position); + cachePosition.address = address; + $addressInput.val(address); + mapObj.panTo(lngLat); + } + }); + geocoder.getAddress(lngLat); + }); + } else { + cachePosition.address = position.address; + mapObj.panTo(lngLat); + $addressInput.val(position.address); + } + } + + // End Tool functions + + function toggleMode(isShowOrPick) { + isShowOrPickMode = isShowOrPick; + + $addressInput.prop('readonly', isShowOrPick); + if (isShowOrPick) { + mapObj.off('click', mapClickClickHandler); + $cancelBtn.hide(); + $alert.hide(); + $('#idAMapPositionPickerFloatContainer').hide(); + } else { + mapObj.on('click', mapClickClickHandler); + $('#idAMapPositionPickerFloatContainer').show(); + $cancelBtn.show(); + } + + } + + function showPositionInMap(position) { + initializeController(); + toggleMode(true); + clearPosition(); + var mMarker = createMarkerFromPosition(position); + mapObj.panTo(mMarker.getPosition()); + $modal.find('h4.modal-title').html(position.getDisplayString()); + $addressInput.val(position.address); + $modal.modal('show'); + + } + + return { + activate: activate, + deactivate: activate, + //Tools + showPositionInMap: showPositionInMap + } + })(); + + var aMapPositionPicker = function (element, options) { + + var picker = { + isFirstLoad: false, + initialPosition: null, + fieldManager: new FieldManager() + }; + var $inputEl = null; + + function triggerPickedComplete(mPosition, hasPicked) { + if (options.onPicked) { + options.onPicked(mPosition) + } else { + element.trigger('AMPP.PickCompleted', [mPosition, hasPicked]); + } + } + + // API for PICKER_CONTROLLER + picker._onPickedCallback = function (mPosition, hasPicked) { + element.data('position', mPosition); + $inputEl.val(wrapFormat(options.formatter, mPosition)); + picker.fieldManager.render(mPosition, hasPicked); + triggerPickedComplete(mPosition, hasPicked); + }; + + // Public API + + picker.getInitialPosition = function () { + return initialPosition; + }; + + picker.position = function () { + var s = JSON.stringify(element.data('position')); + return element.data('position'); + + }; + + // + if (element.is('input') || element.is('textarea')) { + $inputEl = element; + } else { + $inputEl = element.children('input'); + } + $inputEl.prop("readonly", true); + //Handle initial data + if (Position.LNGLAT_FORMATTER.indexOf(options.formatter)) { + var result = Position.validateLngLat($inputEl.val()); + if (result) { + options.value.longitude = parseFloat(result.longitude); + options.value.latitude = parseFloat(result.latitude); + } + } + var initialPosition = new Position(options.value.longitude, options.value.latitude, options.value.address, options.value.label); + element.data('position', initialPosition.copy()); + // Register events + element.on('click', function () { + //show modal/ + PICKER_CONTROLLER.activate(picker); + }); + // 处理fields + var fields = options.fields || []; + for (var i in fields) { + var iEl = new Field(fields[i] || {}); + if (!iEl.created) { + $inputEl.after(iEl.$widget); + } + picker.fieldManager.addField(iEl); + } + + picker.opts = options; + return picker; + }; + + $.fn.AMapPositionPicker = function (options) { + options = options || {}; + var args = Array.prototype.slice.call(arguments, 1), + isInstance = true, + thisMethods = [], //可级联函数列表 + returnValue; + if (typeof options == 'object') { + return this.each(function () { + var $this = $(this); + if (!$this.data('AMapPositionPicker')) { + var dataOptions = { + formatter: $this.data('formatter'), + title: $this.data('title'), + errorTip: $this.data('errorTip'), + height: $this.data('height'), + required: $this.data('required'), + value: { + longitude: $this.data('valueLongitude'), + latitude: $this.data('valueLatitude'), + address: $this.data('valueAddress'), + label: $this.data('valueLabel') + }, + center: { + longitude: $this.data('centerLongitude'), + latitude: $this.data('centerLatitude') + } + }; + options = $.extend(true, {}, $.fn.AMapPositionPicker.defaults, dataOptions, options); + $this.data('AMapPositionPicker', aMapPositionPicker($this, options)); + } + }); + } else if (typeof options == 'string') { + this.each(function () { + var $this = $(this), + instance = $this.data('AMapPositionPicker'); + if (!instance) { + throw new Error('AMapPositionPicker("' + options + '") method was called on an element that is not using AMapPositionPicker'); + } + returnValue = instance[options].apply(instance, args); + isInstance = returnValue === instance; + }); + if (isInstance || $.inArray(options, thisMethods) > -1) { + return this; + } + + return returnValue; + } + throw new TypeError('Invalid arguments for AMapPositionPicker: ' + options); + }; + $.fn.AMapPositionPicker.defaults = { + formatter: '{address}', + onPicked: null, + value: { + longitude: null, + latitude: null, + address: null + }, + required: true, + title: '请选择地址', + errorTip: '请选择地址', + height: '500px', + fields: [] + }; + $.extend({AMapPositionPicker: {}}); + $.extend($.AMapPositionPicker, { + showPositionInMap: function (position) { + PICKER_CONTROLLER.showPositionInMap(Position.fromOptions(position)); + }, + pluginVersion: '0.8.3' + }); + $(function () { + $('[data-provide="AMapPositionPicker"]').AMapPositionPicker(); + }); +})) +; \ No newline at end of file diff --git a/target/classes/front/front/js/bootstrap.min.js b/target/classes/front/front/js/bootstrap.min.js new file mode 100644 index 0000000..c4c0d1f --- /dev/null +++ b/target/classes/front/front/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
      ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"
      ","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + diff --git a/target/classes/front/front/modules/tinymce/tinymce.js b/target/classes/front/front/modules/tinymce/tinymce.js new file mode 100644 index 0000000..c0a89b6 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce.js @@ -0,0 +1,209 @@ +// 菜单显示异常修改tinymce/skins/ui/oxide/skin.min.css:96 .tox-silver-sink的z-index值 +// http://tinymce.ax-z.cn/ 中文文档 + +layui.define(['jquery'],function (exports) { + var $ = layui.$ + + var modFile = layui.cache.modules['tinymce']; + + var modPath = modFile.substr(0, modFile.lastIndexOf('.')) + + var setter = layui.setter || {}//兼容layuiadmin + + var response = setter.response || {}//兼容layuiadmin + + // ---------------- 以上代码无需修改 ---------------- + + var settings = { + base_url: modPath + , images_upload_url: '/rest/upload'//图片上传接口,可在option传入,也可在这里修改,option的值优先 + , language: 'zh_CN'//语言,可在option传入,也可在这里修改,option的值优先 + , response: {//后台返回数据格式设置 + statusName: response.statusName || 'code'//返回状态字段 + , msgName: response.msgName || 'msg'//返回消息字段 + , dataName: response.dataName || 'data'//返回的数据 + , statusCode: response.statusCode || { + ok: 0//数据正常 + } + } + , success: function (res, succFun, failFun) {//图片上传完成回调 根据自己需要修改 + if (res[this.response.statusName] == this.response.statusCode.ok) { + succFun(res[this.response.dataName]); + } else { + failFun(res[this.response.msgName]); + } + } + }; + + // ---------------- 以下代码无需修改 ---------------- + + var t = {}; + + //初始化 + t.render = function (option,callback) { + + var admin = layui.admin || {} + + option.base_url = option.base_url ? option.base_url : settings.base_url + + option.language = option.language ? option.language : settings.language + + option.selector = option.selector ? option.selector : option.elem + + option.quickbars_selection_toolbar = option.quickbars_selection_toolbar ? option.quickbars_selection_toolbar : 'cut copy | bold italic underline strikethrough ' + + option.plugins = option.plugins ? option.plugins : 'quickbars print preview searchreplace autolink fullscreen image link media codesample table charmap hr advlist lists wordcount imagetools indent2em'; + + option.toolbar = option.toolbar ? option.toolbar : 'undo redo | forecolor backcolor bold italic underline strikethrough | indent2em alignleft aligncenter alignright alignjustify outdent indent | link bullist numlist image table codesample | formatselect fontselect fontsizeselect'; + + option.resize = false; + + option.elementpath = false + + option.branding = false; + + option.contextmenu_never_use_native = true; + + option.menubar = option.menubar ? option.menubar : 'file edit insert format table'; + + option.images_upload_url = option.images_upload_url ? option.images_upload_url : settings.images_upload_url; + + option.images_upload_handler = option.images_upload_handler? option.images_upload_handler : function (blobInfo, succFun, failFun) { + + var formData = new FormData(); + + formData.append('target', 'edit'); + + formData.append('edit', blobInfo.blob()); + + var ajaxOpt = { + + url: option.images_upload_url, + + dataType: 'json', + + type: 'POST', + + data: formData, + + processData: false, + + contentType: false, + + success: function (res) { + + settings.success(res, succFun, failFun) + + }, + error: function (res) { + + failFun("网络错误:" + res.status); + + } + }; + + if (typeof admin.req == 'function') { + + admin.req(ajaxOpt); + + } else { + + $.ajax(ajaxOpt); + + } + } + + option.menu = option.menu ? option.menu : { + file: {title: '文件', items: 'newdocument | print preview fullscreen | wordcount'}, + edit: {title: '编辑', items: 'undo redo | cut copy paste pastetext selectall | searchreplace'}, + format: { + title: '格式', + items: 'bold italic underline strikethrough superscript subscript | formats | forecolor backcolor | removeformat' + }, + table: {title: '表格', items: 'inserttable tableprops deletetable | cell row column'}, + }; + if(typeof tinymce == 'undefined'){ + + $.ajax({//获取插件 + url: option.base_url + '/tinymce.js', + + dataType: 'script', + + cache: true, + + async: false, + }); + + } + + layui.sessionData('layui-tinymce',{ + + key:option.selector, + + value:option + + }) + + tinymce.init(option); + + if(typeof callback == 'function'){ + + callback.call(option) + + } + + return tinymce.activeEditor; + }; + + t.init = t.render + + // 获取ID对应的编辑器对象 + t.get = (elem) => { + + if(elem && /^#|\./.test(elem)){ + + var id = elem.substr(1) + + var edit = tinymce.editors[id]; + + if(!edit){ + + return console.error("编辑器未加载") + + } + + return edit + + } else { + + return console.error("elem错误") + + } + } + + //重载 + t.reload = (option,callback) => { + option = option || {} + + var edit = t.get(option.elem); + + var optionCache = layui.sessionData('layui-tinymce')[option.elem] + + edit.destroy() + + $.extend(optionCache,option) + + tinymce.init(optionCache) + + if(typeof callback == 'function'){ + + callback.call(optionCache) + + } + + return tinymce.activeEditor; + } + + + exports('tinymce', t); +}); diff --git a/target/classes/front/front/modules/tinymce/tinymce/jquery.tinymce.min.js b/target/classes/front/front/modules/tinymce/tinymce/jquery.tinymce.min.js new file mode 100644 index 0000000..5a6ef56 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/jquery.tinymce.min.js @@ -0,0 +1,91 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +/** + * Jquery integration plugin. + * + * @class tinymce.core.JqueryIntegration + * @private + */ +!function(){var f,c,u,p,d,s=[];d="undefined"!=typeof global?global:window,p=d.jQuery;function v(){ +// Reference to tinymce needs to be lazily evaluated since tinymce +// might be loaded through the compressor or other means +return d.tinymce}p.fn.tinymce=function(o){var e,t,i,l=this,r=""; +// No match then just ignore the call +if(!l.length)return l; +// Get editor instance +if(!o)return v()?v().get(l[0].id):null;l.css("visibility","hidden");function n(){var a=[],c=0; +// Apply patches to the jQuery object, only once +u||(m(),u=!0), +// Create an editor instance for each matched node +l.each(function(e,t){var n,i=t.id,r=o.oninit; +// Generate unique id for target element if needed +i||(t.id=i=v().DOM.uniqueId()), +// Only init the editor once +v().get(i)||( +// Create editor instance and render it +n=v().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), +// Run this if the oninit setting is defined +// this logic will fire the oninit callback ones each +// matched editor instance is initialized +r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:v().resolve(t.replace(/\.\w+$/,"")),t=v().resolve(t)), +// Call the oninit function with the object +t.apply(e||v(),a))}))}), +// Render the editor instances in a separate loop since we +// need to have the full editors array used in the onInit calls +p.each(a,function(e,t){t.render()})} +// Load TinyMCE on demand, if we need to +if(d.tinymce||c||!(e=o.script_url)) +// Delay the init call until tinymce is loaded +1===c?s.push(n):n();else{c=1,t=e.substring(0,e.lastIndexOf("/")), +// Check if it's a dev/src version they want to load then +// make sure that all plugins, themes etc are loaded in source mode as well +-1!=e.indexOf(".min")&&(r=".min"), +// Setup tinyMCEPreInit object this will later be used by the TinyMCE +// core script to locate other resources like CSS files, dialogs etc +// You can also predefined a tinyMCEPreInit object and then it will use that instead +d.tinymce=d.tinyMCEPreInit||{base:t,suffix:r}, +// url contains gzip then we assume it's a compressor +-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), +// Check if compressor script is already loaded otherwise setup a basic one +d.tinyMCE_GZ||(d.tinyMCE_GZ={start:function(){function n(e){v().ScriptLoader.markDone(v().baseURI.toAbsolute(e))} +// Add core languages +n("langs/"+i+".js"), +// Add themes with languages +n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), +// Add plugins with languages +p.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}}));var a=document.createElement("script");a.type="text/javascript",a.onload=a.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(a.readyState)||(v().dom.Event.domLoaded=1,c=2, +// Execute callback after mainscript has been loaded and before the initialization occurs +o.script_loaded&&o.script_loaded(),n(),p.each(s,function(e,t){t()}))},a.src=e,document.body.appendChild(a)}return l}, +// Add :tinymce pseudo selector this will select elements that has been converted into editor instances +// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. +p.extend(p.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in d&&(t=v().get(e.id))&&t.editorManager===v())}}); +// This function patches internal jQuery functions so that if +// you for example remove an div element containing an editor it's +// automatically destroyed by the TinyMCE API +var m=function(){function r(e){ +// If the function is remove +"remove"===e&&this.each(function(e,t){var n=u(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=v().get(t.id.replace(/_parent$/,""));n&&n.remove()})}function o(i){var e,t=this; +// Handle set value +/*jshint eqnull:true */if(null!=i)r.call(t), +// Saves the contents before get/set value of textarea/div +t.each(function(e,t){var n;(n=v().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(p(t),r)}),i}}), +// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe +p.each(["append","prepend"],function(e,t){var n=s[t]=p.fn[t],r="prepend"===t;p.fn[t]=function(i){var e=this;return l(e)?i!==f?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=u(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), +// Makes sure that the editor instance gets properly destroyed when the parent element is removed +p.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=p.fn[t];p.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=p.fn.attr, +// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents +p.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!l(n))return s.attr.apply(n,i);if(t!==f)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining +var r=n[0],a=u(r);return a?a.getContent({save:!0}):s.attr.apply(p(r),i)}}}(); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/langs/readme.md b/target/classes/front/front/modules/tinymce/tinymce/langs/readme.md new file mode 100644 index 0000000..a52bf03 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/target/classes/front/front/modules/tinymce/tinymce/langs/zh_CN.js b/target/classes/front/front/modules/tinymce/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..89b106c --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/langs/zh_CN.js @@ -0,0 +1,419 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/license.txt b/target/classes/front/front/modules/tinymce/tinymce/license.txt new file mode 100644 index 0000000..b17fc90 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.js new file mode 100644 index 0000000..c31e5ca --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,297 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + var Actions = { applyListFormat: applyListFormat }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + var Commands = { register: register }; + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + var Settings = { + getNumberStyles: getNumberStyles, + getBulletStyles: getBulletStyles + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + var style = editor.dom.getStyle(listElm, 'listStyleType'); + return Option.from(style); + }; + var ListUtils = { + isTableCellNode: isTableCellNode, + isListNode: isListNode, + getSelectedStyleType: getSelectedStyleType + }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var isWithinList = function (editor, e, nodeName) { + var tableCellIndex = findIndex(e.parents, ListUtils.isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, ListUtils.isListNode(editor)); + return lists.length > 0 && lists[0].nodeName === nodeName; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addSplitButton(id, { + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + presets: 'listpreview', + columns: 3, + fetch: function (callback) { + var items = global$1.map(styles, function (styleValue) { + var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + var itemValue = styleValue === 'default' ? '' : styleValue; + var displayText = styleValueToText(styleValue); + return { + type: 'choiceitem', + value: itemValue, + icon: 'list-' + iconStyle + '-' + iconName, + text: displayText + }; + }); + callback(items); + }, + onAction: function () { + return editor.execCommand(cmd); + }, + onItemAction: function (splitButtonApi, value) { + Actions.applyListFormat(editor, nodeName, value); + }, + select: function (value) { + var listStyleType = ListUtils.getSelectedStyleType(editor); + return listStyleType.map(function (listStyle) { + return value === listStyle; + }).getOr(false); + }, + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addToggleButton(id, { + active: false, + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }, + onAction: function () { + return editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 0) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', Settings.getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', Settings.getBulletStyles(editor)); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('advlist', function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$1.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + if (hasPlugin(editor, 'lists')) { + Buttons.register(editor); + Commands.register(editor); + } + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 0000000..a07d3e3 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function n(){}function o(n){return function(){return n}}function t(){return d}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=function(n,t,e){var r="UL"===t?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===e?null:{"list-style-type":e})},i=function(e){e.addCommand("ApplyUnorderedListStyle",function(n,t){l(e,"UL",t["list-style-type"])}),e.addCommand("ApplyOrderedListStyle",function(n,t){l(e,"OL",t["list-style-type"])})},c=function(n){var t=n.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");return t?t.split(/[ ,]/):[]},s=function(n){var t=n.getParam("advlist_bullet_styles","default,circle,square");return t?t.split(/[ ,]/):[]},f=o(!1),a=o(!0),d=(e={fold:function(n,t){return n()},is:f,isSome:f,isNone:a,getOr:m,getOrThunk:p,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(undefined),or:m,orThunk:p,map:t,each:n,bind:t,exists:f,forall:a,filter:t,equals:g,equals_:g,toArray:function(){return[]},toString:o("none()")},Object.freeze&&Object.freeze(e),e);function g(n){return n.isNone()}function p(n){return n()}function m(n){return n}function y(n,t,e){var r=function(n,t){for(var e=0;e len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var rng, end, start, endContainer, bookmark, text, matches, prev, len, rngText; + var autoLinkPattern = Settings.getAutoLinkPattern(editor); + var defaultLinkTarget = Settings.getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + rng = editor.selection.getRng(true).cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + matches = text.match(autoLinkPattern); + var protocol = Settings.getDefaultLinkProtocol(editor); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = protocol + '://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget !== false) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.browser.isIE()) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + var Keys = { setup: setup }; + + function Plugin () { + global.add('autolink', function (editor) { + Keys.setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/autolink/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 0000000..76daf67 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function i(t,e){if(e<0&&(e=0),3===t.nodeType){var n=t.data.length;n Settings.getAutoResizeMinHeight(editor)) { + resizeHeight = contentHeight + chromeHeight; + } + var maxHeight = Settings.getAutoResizeMaxHeight(editor); + if (maxHeight && resizeHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + Events.fireResizeEditor(editor); + if (global$1.browser.isSafari() && global$1.mac) { + var win = editor.getWin(); + win.scrollTo(win.pageXOffset, win.pageYOffset); + } + if (editor.hasFocus()) { + editor.selection.scrollIntoView(editor.selection.getNode()); + } + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding = Settings.getAutoResizeOverflowPadding(editor); + var dom = editor.dom; + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + }); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () { + resize(editor, oldSize); + }); + if (Settings.shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + var Resize = { + setup: setup, + resize: resize + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + Resize.resize(editor, oldSize); + }); + }; + var Commands = { register: register }; + + function Plugin () { + global.add('autoresize', function (editor) { + if (!editor.settings.hasOwnProperty('resize')) { + editor.settings.resize = false; + } + if (!editor.inline) { + var oldSize = Cell(0); + Commands.register(editor, oldSize); + Resize.setup(editor, oldSize); + } + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/autoresize/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000..f4a1c12 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function d(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))}function h(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o}var i=function(e){function t(){return n}var n=e;return{get:t,set:function(e){n=e},clone:function(){return i(t())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),p=function(e){return e.fire("ResizeEditor")},y=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},z=function(e){return e.getParam("max_height",0,"number")},n=function(e){return e.getParam("autoresize_overflow_padding",1,"number")},b=function(e){return e.getParam("autoresize_bottom_margin",50,"number")},o=function(e){return e.getParam("autoresize_on_init",!0,"boolean")},u=function(e,t,n,i,o){r.setEditorTimeout(e,function(){C(e,t),n--?u(e,t,n,i,o):o&&o()},i)},C=function(e,t){var n,i,o,r=e.dom,u=e.getDoc();if(u)if(function(e){return e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()}(e))d(e,!0);else{var s=u.documentElement,a=b(e);i=y(e);var f=h(r,s,"margin-top",!0),c=h(r,s,"margin-bottom",!0);(o=s.offsetHeight+f+c+a)<0&&(o=0);var g=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;o+g>y(e)&&(i=o+g);var l=z(e);if(l&&l]*>((\xA0| |[ \t]|]*>)+?|)|
      $', 'i').test(html); + }; + var hasDraft = function (editor) { + var time = parseInt(global$2.getItem(getAutoSavePrefix(editor) + 'time'), 10) || 0; + if (new Date().getTime() - time > getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$2.removeItem(prefix + 'draft'); + global$2.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$2.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$2.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor, started) { + var interval = getAutoSaveInterval(editor); + if (!started.get()) { + global$1.setInterval(function () { + if (!editor.removed) { + storeDraft(editor); + } + }, interval); + started.set(true); + } + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + + var get = function (editor) { + return { + hasDraft: curry(hasDraft, editor), + storeDraft: curry(storeDraft, editor), + restoreDraft: curry(restoreDraft, editor), + removeDraft: curry(removeDraft, editor), + isEmpty: curry(isEmpty, editor) + }; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var setup = function (editor) { + editor.editorManager.on('BeforeUnload', function (e) { + var msg; + global$3.each(global$4.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + if (msg) { + e.preventDefault(); + e.returnValue = msg; + } + }); + }; + + var makeSetupHandler = function (editor, started) { + return function (api) { + api.setDisabled(!hasDraft(editor)); + var editorEventCallback = function () { + return api.setDisabled(!hasDraft(editor)); + }; + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return function () { + return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + }; + }; + }; + var register = function (editor, started) { + startStoreDraft(editor, started); + editor.ui.registry.addButton('restoredraft', { + tooltip: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + editor.ui.registry.addMenuItem('restoredraft', { + text: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + }; + + function Plugin () { + global.add('autosave', function (editor) { + var started = Cell(false); + setup(editor); + register(editor, started); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/autosave/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 0000000..c9bf058 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(n){"use strict";function r(t,e){var n=t||e,r=/^(\d+)([ms]?)$/.exec(""+n);return(r[2]?{s:1e3,m:6e4}[r[2]]:1)*parseInt(n,10)}function o(t){var e=t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-");return e=(e=(e=(e=e.replace(/\{path\}/g,n.document.location.pathname)).replace(/\{query\}/g,n.document.location.search)).replace(/\{hash\}/g,n.document.location.hash)).replace(/\{id\}/g,t.id)}function a(t,e){var n=t.settings.forced_root_block;return""===(e=d.trim(void 0===e?t.getBody().innerHTML:e))||new RegExp("^<"+n+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
      $","i").test(e)}function i(t){var e=parseInt(v.getItem(o(t)+"time"),10)||0;return!((new Date).getTime()-e>function(t){return r(t.settings.autosave_retention,"20m")}(t))||(g(t,!1),!1)}function u(t){var e=o(t);!a(t)&&t.isDirty()&&(v.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),v.setItem(e+"time",(new Date).getTime().toString()),function(t){t.fire("StoreDraft")}(t))}function s(t){var e=o(t);i(t)&&(t.setContent(v.getItem(e+"draft"),{format:"raw"}),function(t){t.fire("RestoreDraft")}(t))}function c(t,e){var n=function(t){return r(t.settings.autosave_interval,"30s")}(t);e.get()||(m.setInterval(function(){t.removed||u(t)},n),e.set(!0))}function f(t){t.undoManager.transact(function(){s(t),g(t)}),t.focus()}var l=function(t){function e(){return n}var n=t;return{get:e,set:function(t){n=t},clone:function(){return l(e())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,e){var n=o(t);v.removeItem(n+"draft"),v.removeItem(n+"time"),!1!==e&&function(t){t.fire("RemoveDraft")}(t)};function y(r){for(var o=[],t=1;t(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
      /gi, '\n'); + rep(//gi, '\n'); + rep(/
      /gi, '\n'); + rep(/

      /gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
      '); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '$2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + var Convert = { + html2bbcode: html2bbcode, + bbcode2html: bbcode2html + }; + + function Plugin () { + global.add('bbcode', function (editor) { + editor.on('BeforeSetContent', function (e) { + e.content = Convert.bbcode2html(e.content); + }); + editor.on('PostProcess', function (e) { + if (e.set) { + e.content = Convert.bbcode2html(e.content); + } + if (e.get) { + e.content = Convert.html2bbcode(e.content); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/bbcode/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 0000000..17c247e --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);function o(o,e){t=t.replace(o,e)}return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
      /gi,"\n"),o(//gi,"\n"),o(/
      /gi,"\n"),o(/

      /gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t},i=function(t){t=e.trim(t);function o(o,e){t=t.replace(o,e)}return o(/\n/gi,"
      "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};!function n(){o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=i(o.content)),o.get&&(o.content=t(o.content))})})}()}(); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.js new file mode 100644 index 0000000..73e547b --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1695 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + var Events = { fireInsertCustomChar: fireInsertCustomChar }; + + var insertChar = function (editor, chr) { + var evtChr = Events.fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + var Actions = { insertChar: insertChar }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.settings.charmap; + }; + var getCharMapAppend = function (editor) { + return editor.settings.charmap_append; + }; + var Settings = { + getCharMap: getCharMap, + getCharMapAppend: getCharMapAppend + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray = isType('array'); + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var isArray$1 = global$1.isArray; + var UserDefined = 'User Defined'; + var getDefaultCharMap = function () { + return [ + { + name: 'Currency', + characters: [ + [ + 36, + 'dollar sign' + ], + [ + 162, + 'cent sign' + ], + [ + 8364, + 'euro sign' + ], + [ + 163, + 'pound sign' + ], + [ + 165, + 'yen sign' + ], + [ + 164, + 'currency sign' + ], + [ + 8352, + 'euro-currency sign' + ], + [ + 8353, + 'colon sign' + ], + [ + 8354, + 'cruzeiro sign' + ], + [ + 8355, + 'french franc sign' + ], + [ + 8356, + 'lira sign' + ], + [ + 8357, + 'mill sign' + ], + [ + 8358, + 'naira sign' + ], + [ + 8359, + 'peseta sign' + ], + [ + 8360, + 'rupee sign' + ], + [ + 8361, + 'won sign' + ], + [ + 8362, + 'new sheqel sign' + ], + [ + 8363, + 'dong sign' + ], + [ + 8365, + 'kip sign' + ], + [ + 8366, + 'tugrik sign' + ], + [ + 8367, + 'drachma sign' + ], + [ + 8368, + 'german penny symbol' + ], + [ + 8369, + 'peso sign' + ], + [ + 8370, + 'guarani sign' + ], + [ + 8371, + 'austral sign' + ], + [ + 8372, + 'hryvnia sign' + ], + [ + 8373, + 'cedi sign' + ], + [ + 8374, + 'livre tournois sign' + ], + [ + 8375, + 'spesmilo sign' + ], + [ + 8376, + 'tenge sign' + ], + [ + 8377, + 'indian rupee sign' + ], + [ + 8378, + 'turkish lira sign' + ], + [ + 8379, + 'nordic mark sign' + ], + [ + 8380, + 'manat sign' + ], + [ + 8381, + 'ruble sign' + ], + [ + 20870, + 'yen character' + ], + [ + 20803, + 'yuan character' + ], + [ + 22291, + 'yuan character, in hong kong and taiwan' + ], + [ + 22278, + 'yen/yuan character variant one' + ] + ] + }, + { + name: 'Text', + characters: [ + [ + 169, + 'copyright sign' + ], + [ + 174, + 'registered sign' + ], + [ + 8482, + 'trade mark sign' + ], + [ + 8240, + 'per mille sign' + ], + [ + 181, + 'micro sign' + ], + [ + 183, + 'middle dot' + ], + [ + 8226, + 'bullet' + ], + [ + 8230, + 'three dot leader' + ], + [ + 8242, + 'minutes / feet' + ], + [ + 8243, + 'seconds / inches' + ], + [ + 167, + 'section sign' + ], + [ + 182, + 'paragraph sign' + ], + [ + 223, + 'sharp s / ess-zed' + ] + ] + }, + { + name: 'Quotations', + characters: [ + [ + 8249, + 'single left-pointing angle quotation mark' + ], + [ + 8250, + 'single right-pointing angle quotation mark' + ], + [ + 171, + 'left pointing guillemet' + ], + [ + 187, + 'right pointing guillemet' + ], + [ + 8216, + 'left single quotation mark' + ], + [ + 8217, + 'right single quotation mark' + ], + [ + 8220, + 'left double quotation mark' + ], + [ + 8221, + 'right double quotation mark' + ], + [ + 8218, + 'single low-9 quotation mark' + ], + [ + 8222, + 'double low-9 quotation mark' + ], + [ + 60, + 'less-than sign' + ], + [ + 62, + 'greater-than sign' + ], + [ + 8804, + 'less-than or equal to' + ], + [ + 8805, + 'greater-than or equal to' + ], + [ + 8211, + 'en dash' + ], + [ + 8212, + 'em dash' + ], + [ + 175, + 'macron' + ], + [ + 8254, + 'overline' + ], + [ + 164, + 'currency sign' + ], + [ + 166, + 'broken bar' + ], + [ + 168, + 'diaeresis' + ], + [ + 161, + 'inverted exclamation mark' + ], + [ + 191, + 'turned question mark' + ], + [ + 710, + 'circumflex accent' + ], + [ + 732, + 'small tilde' + ], + [ + 176, + 'degree sign' + ], + [ + 8722, + 'minus sign' + ], + [ + 177, + 'plus-minus sign' + ], + [ + 247, + 'division sign' + ], + [ + 8260, + 'fraction slash' + ], + [ + 215, + 'multiplication sign' + ], + [ + 185, + 'superscript one' + ], + [ + 178, + 'superscript two' + ], + [ + 179, + 'superscript three' + ], + [ + 188, + 'fraction one quarter' + ], + [ + 189, + 'fraction one half' + ], + [ + 190, + 'fraction three quarters' + ] + ] + }, + { + name: 'Mathematical', + characters: [ + [ + 402, + 'function / florin' + ], + [ + 8747, + 'integral' + ], + [ + 8721, + 'n-ary sumation' + ], + [ + 8734, + 'infinity' + ], + [ + 8730, + 'square root' + ], + [ + 8764, + 'similar to' + ], + [ + 8773, + 'approximately equal to' + ], + [ + 8776, + 'almost equal to' + ], + [ + 8800, + 'not equal to' + ], + [ + 8801, + 'identical to' + ], + [ + 8712, + 'element of' + ], + [ + 8713, + 'not an element of' + ], + [ + 8715, + 'contains as member' + ], + [ + 8719, + 'n-ary product' + ], + [ + 8743, + 'logical and' + ], + [ + 8744, + 'logical or' + ], + [ + 172, + 'not sign' + ], + [ + 8745, + 'intersection' + ], + [ + 8746, + 'union' + ], + [ + 8706, + 'partial differential' + ], + [ + 8704, + 'for all' + ], + [ + 8707, + 'there exists' + ], + [ + 8709, + 'diameter' + ], + [ + 8711, + 'backward difference' + ], + [ + 8727, + 'asterisk operator' + ], + [ + 8733, + 'proportional to' + ], + [ + 8736, + 'angle' + ] + ] + }, + { + name: 'Extended Latin', + characters: [ + [ + 192, + 'A - grave' + ], + [ + 193, + 'A - acute' + ], + [ + 194, + 'A - circumflex' + ], + [ + 195, + 'A - tilde' + ], + [ + 196, + 'A - diaeresis' + ], + [ + 197, + 'A - ring above' + ], + [ + 256, + 'A - macron' + ], + [ + 198, + 'ligature AE' + ], + [ + 199, + 'C - cedilla' + ], + [ + 200, + 'E - grave' + ], + [ + 201, + 'E - acute' + ], + [ + 202, + 'E - circumflex' + ], + [ + 203, + 'E - diaeresis' + ], + [ + 274, + 'E - macron' + ], + [ + 204, + 'I - grave' + ], + [ + 205, + 'I - acute' + ], + [ + 206, + 'I - circumflex' + ], + [ + 207, + 'I - diaeresis' + ], + [ + 298, + 'I - macron' + ], + [ + 208, + 'ETH' + ], + [ + 209, + 'N - tilde' + ], + [ + 210, + 'O - grave' + ], + [ + 211, + 'O - acute' + ], + [ + 212, + 'O - circumflex' + ], + [ + 213, + 'O - tilde' + ], + [ + 214, + 'O - diaeresis' + ], + [ + 216, + 'O - slash' + ], + [ + 332, + 'O - macron' + ], + [ + 338, + 'ligature OE' + ], + [ + 352, + 'S - caron' + ], + [ + 217, + 'U - grave' + ], + [ + 218, + 'U - acute' + ], + [ + 219, + 'U - circumflex' + ], + [ + 220, + 'U - diaeresis' + ], + [ + 362, + 'U - macron' + ], + [ + 221, + 'Y - acute' + ], + [ + 376, + 'Y - diaeresis' + ], + [ + 562, + 'Y - macron' + ], + [ + 222, + 'THORN' + ], + [ + 224, + 'a - grave' + ], + [ + 225, + 'a - acute' + ], + [ + 226, + 'a - circumflex' + ], + [ + 227, + 'a - tilde' + ], + [ + 228, + 'a - diaeresis' + ], + [ + 229, + 'a - ring above' + ], + [ + 257, + 'a - macron' + ], + [ + 230, + 'ligature ae' + ], + [ + 231, + 'c - cedilla' + ], + [ + 232, + 'e - grave' + ], + [ + 233, + 'e - acute' + ], + [ + 234, + 'e - circumflex' + ], + [ + 235, + 'e - diaeresis' + ], + [ + 275, + 'e - macron' + ], + [ + 236, + 'i - grave' + ], + [ + 237, + 'i - acute' + ], + [ + 238, + 'i - circumflex' + ], + [ + 239, + 'i - diaeresis' + ], + [ + 299, + 'i - macron' + ], + [ + 240, + 'eth' + ], + [ + 241, + 'n - tilde' + ], + [ + 242, + 'o - grave' + ], + [ + 243, + 'o - acute' + ], + [ + 244, + 'o - circumflex' + ], + [ + 245, + 'o - tilde' + ], + [ + 246, + 'o - diaeresis' + ], + [ + 248, + 'o slash' + ], + [ + 333, + 'o macron' + ], + [ + 339, + 'ligature oe' + ], + [ + 353, + 's - caron' + ], + [ + 249, + 'u - grave' + ], + [ + 250, + 'u - acute' + ], + [ + 251, + 'u - circumflex' + ], + [ + 252, + 'u - diaeresis' + ], + [ + 363, + 'u - macron' + ], + [ + 253, + 'y - acute' + ], + [ + 254, + 'thorn' + ], + [ + 255, + 'y - diaeresis' + ], + [ + 563, + 'y - macron' + ], + [ + 913, + 'Alpha' + ], + [ + 914, + 'Beta' + ], + [ + 915, + 'Gamma' + ], + [ + 916, + 'Delta' + ], + [ + 917, + 'Epsilon' + ], + [ + 918, + 'Zeta' + ], + [ + 919, + 'Eta' + ], + [ + 920, + 'Theta' + ], + [ + 921, + 'Iota' + ], + [ + 922, + 'Kappa' + ], + [ + 923, + 'Lambda' + ], + [ + 924, + 'Mu' + ], + [ + 925, + 'Nu' + ], + [ + 926, + 'Xi' + ], + [ + 927, + 'Omicron' + ], + [ + 928, + 'Pi' + ], + [ + 929, + 'Rho' + ], + [ + 931, + 'Sigma' + ], + [ + 932, + 'Tau' + ], + [ + 933, + 'Upsilon' + ], + [ + 934, + 'Phi' + ], + [ + 935, + 'Chi' + ], + [ + 936, + 'Psi' + ], + [ + 937, + 'Omega' + ], + [ + 945, + 'alpha' + ], + [ + 946, + 'beta' + ], + [ + 947, + 'gamma' + ], + [ + 948, + 'delta' + ], + [ + 949, + 'epsilon' + ], + [ + 950, + 'zeta' + ], + [ + 951, + 'eta' + ], + [ + 952, + 'theta' + ], + [ + 953, + 'iota' + ], + [ + 954, + 'kappa' + ], + [ + 955, + 'lambda' + ], + [ + 956, + 'mu' + ], + [ + 957, + 'nu' + ], + [ + 958, + 'xi' + ], + [ + 959, + 'omicron' + ], + [ + 960, + 'pi' + ], + [ + 961, + 'rho' + ], + [ + 962, + 'final sigma' + ], + [ + 963, + 'sigma' + ], + [ + 964, + 'tau' + ], + [ + 965, + 'upsilon' + ], + [ + 966, + 'phi' + ], + [ + 967, + 'chi' + ], + [ + 968, + 'psi' + ], + [ + 969, + 'omega' + ] + ] + }, + { + name: 'Symbols', + characters: [ + [ + 8501, + 'alef symbol' + ], + [ + 982, + 'pi symbol' + ], + [ + 8476, + 'real part symbol' + ], + [ + 978, + 'upsilon - hook symbol' + ], + [ + 8472, + 'Weierstrass p' + ], + [ + 8465, + 'imaginary part' + ] + ] + }, + { + name: 'Arrows', + characters: [ + [ + 8592, + 'leftwards arrow' + ], + [ + 8593, + 'upwards arrow' + ], + [ + 8594, + 'rightwards arrow' + ], + [ + 8595, + 'downwards arrow' + ], + [ + 8596, + 'left right arrow' + ], + [ + 8629, + 'carriage return' + ], + [ + 8656, + 'leftwards double arrow' + ], + [ + 8657, + 'upwards double arrow' + ], + [ + 8658, + 'rightwards double arrow' + ], + [ + 8659, + 'downwards double arrow' + ], + [ + 8660, + 'left right double arrow' + ], + [ + 8756, + 'therefore' + ], + [ + 8834, + 'subset of' + ], + [ + 8835, + 'superset of' + ], + [ + 8836, + 'not a subset of' + ], + [ + 8838, + 'subset of or equal to' + ], + [ + 8839, + 'superset of or equal to' + ], + [ + 8853, + 'circled plus' + ], + [ + 8855, + 'circled times' + ], + [ + 8869, + 'perpendicular' + ], + [ + 8901, + 'dot operator' + ], + [ + 8968, + 'left ceiling' + ], + [ + 8969, + 'right ceiling' + ], + [ + 8970, + 'left floor' + ], + [ + 8971, + 'right floor' + ], + [ + 9001, + 'left-pointing angle bracket' + ], + [ + 9002, + 'right-pointing angle bracket' + ], + [ + 9674, + 'lozenge' + ], + [ + 9824, + 'black spade suit' + ], + [ + 9827, + 'black club suit' + ], + [ + 9829, + 'black heart suit' + ], + [ + 9830, + 'black diamond suit' + ], + [ + 8194, + 'en space' + ], + [ + 8195, + 'em space' + ], + [ + 8201, + 'thin space' + ], + [ + 8204, + 'zero width non-joiner' + ], + [ + 8205, + 'zero width joiner' + ], + [ + 8206, + 'left-to-right mark' + ], + [ + 8207, + 'right-to-left mark' + ] + ] + } + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray$1(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray$1(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = Settings.getCharMap(editor); + if (userCharMap) { + charmap = [{ + name: UserDefined, + characters: getCharsFromSetting(userCharMap) + }]; + } + var userCharMapAppend = Settings.getCharMapAppend(editor); + if (userCharMapAppend) { + var userDefinedGroup = global$1.grep(charmap, function (cg) { + return cg.name === UserDefined; + }); + if (userDefinedGroup.length) { + userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + return charmap; + } + return [].concat(charmap).concat({ + name: UserDefined, + characters: getCharsFromSetting(userCharMapAppend) + }); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + var groups = extendCharMap(editor, getDefaultCharMap()); + return groups.length > 1 ? [{ + name: 'All', + characters: bind(groups, function (g) { + return g.characters; + }) + }].concat(groups) : groups; + }; + var CharMap = { getCharMap: getCharMap$1 }; + + var get = function (editor) { + var getCharMap = function () { + return CharMap.getCharMap(editor); + }; + var insertChar = function (chr) { + Actions.insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar + }; + }; + var Api = { get: get }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var charMatches = function (charCode, name, lowerCasePattern) { + if (contains(String.fromCharCode(charCode).toLowerCase(), lowerCasePattern)) { + return true; + } else { + return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); + } + }; + var scan = function (group, pattern) { + var matches = []; + var lowerCasePattern = pattern.toLowerCase(); + each(group.characters, function (g) { + if (charMatches(g[0], g[1], lowerCasePattern)) { + matches.push(g); + } + }); + return map(matches, function (m) { + return { + text: m[1], + value: String.fromCharCode(m[0]), + icon: String.fromCharCode(m[0]) + }; + }); + }; + var Scan = { scan: scan }; + + var patternName = 'pattern'; + var open = function (editor, charMap) { + var makeGroupItems = function () { + return [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + }; + var makeTabs = function () { + return map(charMap, function (charGroup) { + return { + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + }; + }); + }; + var makePanel = function () { + return { + type: 'panel', + items: makeGroupItems() + }; + }; + var makeTabPanel = function () { + return { + type: 'tabpanel', + tabs: makeTabs() + }; + }; + var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + var scanAndSet = function (dialogApi, pattern) { + find(charMap, function (group) { + return group.name === currentTab.get(); + }).each(function (f) { + var items = Scan.scan(f, pattern); + dialogApi.setData({ results: items }); + }); + }; + var SEARCH_DELAY = 40; + var updateFilter = last(function (dialogApi) { + var pattern = dialogApi.getData().pattern; + scanAndSet(dialogApi, pattern); + }, SEARCH_DELAY); + var body = charMap.length === 1 ? makePanel() : makeTabPanel(); + var initialData = { + pattern: '', + results: Scan.scan(charMap[0], '') + }; + var bridgeSpec = { + title: 'Special Character', + size: 'normal', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: initialData, + onAction: function (api, details) { + if (details.name === 'results') { + Actions.insertChar(editor, details.value); + api.close(); + } + }, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: function (dialogApi, changeData) { + if (changeData.name === patternName) { + updateFilter.throttle(dialogApi); + } + } + }; + var dialogApi = editor.windowManager.open(bridgeSpec); + dialogApi.focus(patternName); + }; + var Dialog = { open: open }; + + var register = function (editor, charMap) { + editor.addCommand('mceShowCharmap', function () { + Dialog.open(editor, charMap); + }); + }; + var Commands = { register: register }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var init = function (editor, all) { + editor.ui.registry.addAutocompleter('charmap', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return new global$2(function (resolve, reject) { + resolve(Scan.scan(all, pattern)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('charmap', { + icon: 'insert-character', + tooltip: 'Special character', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + editor.ui.registry.addMenuItem('charmap', { + icon: 'insert-character', + text: 'Special character...', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('charmap', function (editor) { + var charMap = CharMap.getCharMap(editor); + Commands.register(editor, charMap); + Buttons.register(editor); + init(editor, charMap[0]); + return Api.get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000..a19df5b --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(c){"use strict";function n(){}function i(n){return function(){return n}}function e(){return m}var r,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(n,e){return n.fire("insertCustomChar",{chr:e})},u=function(n,e){var r=a(n,e).chr;n.execCommand("mceInsertContent",!1,r)},o=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=function(n){return n.settings.charmap},l=function(n){return n.settings.charmap_append},f=i(!1),g=i(!0),m=(r={fold:function(n,e){return n()},is:f,isSome:f,isNone:g,getOr:p,getOrThunk:d,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:p,orThunk:d,map:e,each:n,bind:e,exists:f,forall:g,filter:e,equals:h,equals_:h,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(r),r);function h(n){return n.isNone()}function d(n){return n()}function p(n){return n}function y(e){return function(n){return function(n){if(null===n)return"null";var e=typeof n;return"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e}(n)===e}}function w(n,e){for(var r=n.length,t=new Array(r),a=0;a>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/, + 'number': /(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + alias: 'property', + inside: { + 'string': { + pattern: /(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/, + lookbehind: true + }, + 'directive': { + pattern: /(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/, + lookbehind: true, + alias: 'keyword' + } + } + }, + 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ + }); + delete Prism.languages.c['boolean']; + }, + {} + ], + 2: [ + function (require, module, exports) { + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + }, + {} + ], + 3: [ + function (require, module, exports) { + (function (global) { + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; + var Prism = function (_self) { + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + var uniqueId = 0; + var _ = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function (tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias); + } else if (Array.isArray(tokens)) { + return tokens.map(_.util.encode); + } else { + return tokens.replace(/&/g, '&').replace(/ text.length) { + return; + } + if (str instanceof Token) { + continue; + } + if (greedy && i != strarr.length - 1) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + var from = match.index + (lookbehind && match[1] ? match[1].length : 0), to = match.index + match[0].length, k = i, p = pos; + for (var len = strarr.length; k < len && (p < to || !strarr[k].type && !strarr[k - 1].greedy); ++k) { + p += strarr[k].length; + if (from >= p) { + ++i; + pos = p; + } + } + if (strarr[i] instanceof Token) { + continue; + } + delNum = k - i; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + var match = pattern.exec(str), delNum = 1; + } + if (!match) { + if (oneshot) { + break; + } + continue; + } + if (lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + var from = match.index + lookbehindLength, match = match[0].slice(lookbehindLength), to = from + match.length, before = str.slice(0, from), after = str.slice(to); + var args = [ + i, + delNum + ]; + if (before) { + ++i; + pos += before.length; + args.push(before); + } + var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias, match, greedy); + args.push(wrapped); + if (after) { + args.push(after); + } + Array.prototype.splice.apply(strarr, args); + if (delNum != 1) + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); + if (oneshot) + break; + } + } + } + }, + tokenize: function (text, grammar) { + var strarr = [text]; + var rest = grammar.rest; + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; + } + delete grammar.rest; + } + _.matchGrammar(text, strarr, grammar, 0, 0, false); + return strarr; + }, + hooks: { + all: {}, + add: function (name, callback) { + var hooks = _.hooks.all; + hooks[name] = hooks[name] || []; + hooks[name].push(callback); + }, + run: function (name, env) { + var callbacks = _.hooks.all[name]; + if (!callbacks || !callbacks.length) { + return; + } + for (var i = 0, callback; callback = callbacks[i++];) { + callback(env); + } + } + }, + Token: Token + }; + _self.Prism = _; + function Token(type, content, alias, matchedStr, greedy) { + this.type = type; + this.content = content; + this.alias = alias; + this.length = (matchedStr || '').length | 0; + this.greedy = !!greedy; + } + Token.stringify = function (o, language) { + if (typeof o == 'string') { + return o; + } + if (Array.isArray(o)) { + return o.map(function (element) { + return Token.stringify(element, language); + }).join(''); + } + var env = { + type: o.type, + content: Token.stringify(o.content, language), + tag: 'span', + classes: [ + 'token', + o.type + ], + attributes: {}, + language: language + }; + if (o.alias) { + var aliases = Array.isArray(o.alias) ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + _.hooks.run('wrap', env); + var attributes = Object.keys(env.attributes).map(function (name) { + return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + }).join(' '); + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; + }; + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + if (!_.manual) { + var highlightAutomaticallyCallback = function () { + if (!_.manual) { + _.highlightAll(); + } + }; + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + }.call(this, typeof global$2 !== 'undefined' ? global$2 : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {})); + }, + {} + ], + 4: [ + function (require, module, exports) { + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': { + pattern: /(\b(?:class|enum|struct)\s+)\w+/, + lookbehind: true + }, + 'keyword': /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:true|false)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + }, + {} + ], + 5: [ + function (require, module, exports) { + Prism.languages.csharp = Prism.languages.extend('clike', { + 'keyword': /\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/, + 'string': [ + { + pattern: /@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/, + greedy: true + }, + { + pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/, + greedy: true + } + ], + 'class-name': [ + { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/, + inside: { punctuation: /\./ } + }, + { + pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + } + ], + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'generic-method': { + pattern: /\w+\s*<[^>\r\n]+?>\s*(?=\()/, + inside: { + function: /^\w+/, + 'class-name': { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b/, + inside: { punctuation: /\./ } + }, + keyword: Prism.languages.csharp.keyword, + punctuation: /[<>(),.:]/ + } + }, + 'preprocessor': { + pattern: /(^\s*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/, + lookbehind: true, + alias: 'keyword' + } + } + } + }); + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }, + {} + ], + 6: [ + function (require, module, exports) { + (function (Prism) { + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/, + inside: { 'rule': /@[\w-]+/ } + }, + 'url': { + pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'), + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/ + } + }, + 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), + 'string': { + pattern: string, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, markup.tag); + } + }(Prism)); + }, + {} + ], + 7: [ + function (require, module, exports) { + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/; + Prism.languages.java = Prism.languages.extend('clike', { + 'class-name': [ + className, + /\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/ + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, + { + pattern: /(\:\:)[a-z_]\w*/, + lookbehind: true + } + ], + 'number': /\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + } + }); + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, + greedy: true, + alias: 'string' + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + alias: 'punctuation', + pattern: /(^|[^.])@\w+/, + lookbehind: true + }, + 'namespace': { + pattern: /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/, + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'generics': { + pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/, + inside: { + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + } + }); + }(Prism)); + }, + {} + ], + 8: [ + function (require, module, exports) { + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, + 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'operator': /--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + lookbehind: true, + greedy: true + }, + 'function-variable': { + pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + }, + {} + ], + 9: [ + function (require, module, exports) { + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; + } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) + ++i; + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; + } + }, + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; + } + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } + } + return tokens; + } + walkTokens(env.tokens); + } + } + }); + }(Prism)); + }, + {} + ], + 10: [ + function (require, module, exports) { + Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i, + greedy: true + }, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i, + inside: { + 'punctuation': [ + /^=/, + { + pattern: /^(\s*)["']|["']$/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': /&#?[\da-z]{1,8};/i + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g, tagName), 'i'), + lookbehind: true, + greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + }, + {} + ], + 11: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.php = Prism.languages.extend('clike', { + 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, + 'boolean': { + pattern: /\b(?:false|true)\b/i, + alias: 'constant' + }, + 'constant': [ + /\b[A-Z_][A-Z0-9_]*\b/, + /\b(?:null)\b/i + ], + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'string', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'comment', { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + 'variable': /\$+(?:\w+\b|(?={))/i, + 'package': { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + 'property': { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + var string_interpolation = { + pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/, + lookbehind: true, + inside: Prism.languages.php + }; + Prism.languages.insertBefore('php', 'string', { + 'nowdoc-string': { + pattern: /<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } + } + } + }, + 'heredoc-string': { + pattern: /<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation + } + }, + 'single-quoted-string': { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + greedy: true, + alias: 'string' + }, + 'double-quoted-string': { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + greedy: true, + alias: 'string', + inside: { 'interpolation': string_interpolation } + } + }); + delete Prism.languages.php['string']; + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + }, + {} + ], + 12: [ + function (require, module, exports) { + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string-interpolation': { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:True|False|None)\b/, + 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + }, + {} + ], + 13: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': [ + /#.*/, + { + pattern: /^=begin\s[\s\S]*?^=end/m, + greedy: true + } + ], + 'class-name': { + pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.ruby + } + }; + delete Prism.languages.ruby.function; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex': [ + { + pattern: /%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, + lookbehind: true, + greedy: true + } + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': { + pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, + lookbehind: true + }, + 'method-definition': { + pattern: /(\bdef\s+)[\w.]+/, + lookbehind: true, + inside: { + 'function': /\w+$/, + rest: Prism.languages.ruby + } + } + }); + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + } + ]; + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); + }, + {} + ], + 14: [ + function (require, module, exports) { + var Prism = require('prismjs/components/prism-core'); + require('prismjs/components/prism-clike'); + require('prismjs/components/prism-markup-templating'); + require('prismjs/components/prism-c'); + require('prismjs/components/prism-cpp'); + require('prismjs/components/prism-csharp'); + require('prismjs/components/prism-css'); + require('prismjs/components/prism-java'); + require('prismjs/components/prism-javascript'); + require('prismjs/components/prism-markup'); + require('prismjs/components/prism-php'); + require('prismjs/components/prism-python'); + require('prismjs/components/prism-ruby'); + module.exports = { boltExport: Prism }; + }, + { + 'prismjs/components/prism-c': 1, + 'prismjs/components/prism-clike': 2, + 'prismjs/components/prism-core': 3, + 'prismjs/components/prism-cpp': 4, + 'prismjs/components/prism-csharp': 5, + 'prismjs/components/prism-css': 6, + 'prismjs/components/prism-java': 7, + 'prismjs/components/prism-javascript': 8, + 'prismjs/components/prism-markup': 10, + 'prismjs/components/prism-markup-templating': 9, + 'prismjs/components/prism-php': 11, + 'prismjs/components/prism-python': 12, + 'prismjs/components/prism-ruby': 13 + } + ] + }, {}, [14])(14); + })); + var prism = window.Prism; + window.Prism = oldprism; + return prism; + }(undefined, exports$1, module, undefined)); + var Prism$1 = module.exports.boltExport; + + var getLanguages = function (editor) { + return editor.getParam('codesample_languages'); + }; + var useGlobalPrismJS = function (editor) { + return editor.getParam('codesample_global_prismjs', false, 'boolean'); + }; + var Settings = { + getLanguages: getLanguages, + useGlobalPrismJS: useGlobalPrismJS + }; + + var get = function (editor) { + return Global.Prism && Settings.useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + }; + var Prism$2 = { get: get }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection ? editor.selection.getNode() : null; + if (Utils.isCodeSample(node)) { + return Option.some(node); + } + return Option.none(); + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + return node.fold(function () { + editor.insertContent('

      ' + code + '
      '); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + }, function (n) { + editor.dom.setAttrib(n, 'class', 'language-' + language); + n.innerHTML = code; + Prism$2.get(editor).highlightElement(n); + editor.selection.select(n); + }); + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return ''; + }, function (n) { + return n.textContent; + }); + }; + var CodeSample = { + getSelectedCodeSample: getSelectedCodeSample, + insertCodeSample: insertCodeSample, + getCurrentCode: getCurrentCode + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = Settings.getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor, fallback) { + var node = CodeSample.getSelectedCodeSample(editor); + return node.fold(function () { + return fallback; + }, function (n) { + var matches = n.className.match(/language-(\w+)/); + return matches ? matches[1] : fallback; + }); + }; + var Languages = { + getLanguages: getLanguages$1, + getCurrentLanguage: getCurrentLanguage + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var open = function (editor) { + var languages = Languages.getLanguages(editor); + var defaultLanguage = head(languages).fold(function () { + return ''; + }, function (l) { + return l.value; + }); + var currentLanguage = Languages.getCurrentLanguage(editor, defaultLanguage); + var currentCode = CodeSample.getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit Code Sample', + size: 'large', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'language', + label: 'Language', + items: languages + }, + { + type: 'textarea', + name: 'code', + label: 'Code view' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: { + language: currentLanguage, + code: currentCode + }, + onSubmit: function (api) { + var data = api.getData(); + CodeSample.insertCodeSample(editor, data.language, data.code); + api.close(); + } + }); + }; + var Dialog = { open: open }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || Utils.isCodeSample(node)) { + Dialog.open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + var Commands = { register: register }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(Utils.trimArg(Utils.isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(Utils.trimArg(Utils.isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = 'false'; + elm.innerHTML = editor.dom.encode(elm.textContent); + Prism$2.get(editor).highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + var FilterContent = { setup: setup }; + + var isCodeSampleSelection = function (editor) { + var node = editor.selection.getStart(); + return editor.dom.is(node, 'pre[class*="language-"]'); + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('codesample', { + icon: 'code-sample', + tooltip: 'Insert/edit code sample', + onAction: function () { + return Dialog.open(editor); + }, + onSetup: function (api) { + var nodeChangeHandler = function () { + api.setActive(isCodeSampleSelection(editor)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + editor.ui.registry.addMenuItem('codesample', { + text: 'Code sample...', + icon: 'code-sample', + onAction: function () { + return Dialog.open(editor); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('codesample', function (editor) { + FilterContent.setup(editor); + Buttons.register(editor); + Commands.register(editor); + editor.on('dblclick', function (ev) { + if (Utils.isCodeSample(ev.target)) { + Dialog.open(editor); + } + }); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/codesample/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000..86f67ce --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(e){"use strict";function n(){}function i(e){return function(){return e}}function t(){return l}var r,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=i(!1),o=i(!0),l=(r={fold:function(e,n){return e()},is:s,isSome:s,isNone:o,getOr:p,getOrThunk:c,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:p,orThunk:c,map:t,each:n,bind:t,exists:s,forall:o,filter:t,equals:u,equals_:u,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(r),r);function u(e){return e.isNone()}function c(e){return e()}function p(e){return e}var d=function(t){function e(){return a}function n(e){return e(t)}var r=i(t),a={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:s,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return d(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?a:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(s,function(e){return n(t,e)})}};return a},g={some:d,none:t,from:function(e){return null===e||e===undefined?l:d(e)}},m=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");var f={isCodeSample:function q(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")},trimArg:function I(t){return function(e,n){return t(n)}}},h="undefined"!=typeof e.window?e.window:Function("return this;")(),b={},y={exports:b},w={};!function(n,t,r,p){var e=window.Prism;window.Prism={manual:!0},function(e){if("object"==typeof t&&void 0!==r)r.exports=e();else if("function"==typeof n&&n.amd)n([],e);else{("undefined"!=typeof window?window:void 0!==w?w:"undefined"!=typeof self?self:this).EphoxContactWrapper=e()}}(function(){return function c(i,s,o){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof p&&p;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var a=s[n]={exports:{}};i[n][0].call(a.exports,function(e){return l(i[n][1][e]||e)},a,a.exports,c,i,s,o)}return s[n].exports}for(var u="function"==typeof p&&p,e=0;e>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(e){var n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,E={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof O?new O(e.type,E.util.encode(e.content),e.alias):Array.isArray(e)?e.map(E.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof O)){if(g&&b!=n.length-1){if(c.lastIndex=y,!(F=c.exec(e)))break;for(var v=F.index+(d&&F[1]?F[1].length:0),k=F.index+F[0].length,x=b,_=y,A=n.length;x"+t.content+""},!u.document)return u.addEventListener&&(E.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(E.highlight(r,E.languages[t],t)),a&&u.close()},!1)),E;var e=E.util.currentScript();if(e&&(E.filename=e.src,e.hasAttribute("data-manual")&&(E.manual=!0)),!E.manual){var t=function(){E.manual||E.highlightAll()},r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return E}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=n),void 0!==e&&(e.Prism=n)}).call(this,void 0!==w?w:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}})},{}],5:[function(e,n,t){Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+n.source+"|[^\n\r()]*)\\)","i"),inside:{"function":/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var r,a,i;r=Prism,a=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,i=/\b[A-Z](?:\w*[a-z]\w*)?\b/,r.languages.java=r.languages.extend("clike",{"class-name":[i,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:a,"function":[r.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),r.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),r.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":i,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(r,a,e,i){if(r.language===a){var s=r.tokenStack=[];r.code=r.code.replace(e,function(e){if("function"==typeof i&&!i(e))return e;for(var n,t=s.length;-1!==r.code.indexOf(n=b(a,t));)++t;return s[t]=e,n}),r.grammar=y.languages.markup}}},tokenizePlaceholders:{value:function(d,g){if(d.language===g&&d.tokenStack){d.grammar=y.languages[g];var m=0,f=Object.keys(d.tokenStack);!function h(e){for(var n=0;n=f.length);n++){var t=e[n];if("string"==typeof t||t.content&&"string"==typeof t.content){var r=f[m],a=d.tokenStack[r],i="string"==typeof t?t:t.content,s=b(g,r),o=i.indexOf(s);if(-1/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:t}};r["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var a={};a[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",a)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var r=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:r}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var a=window.Prism;window.Prism=e}(undefined,b,y,undefined);function v(e){var n=e.selection?e.selection.getNode():null;return f.isCodeSample(n)?g.some(n):g.none()}var k,x=y.exports.boltExport,_=function(e){return e.getParam("codesample_languages")},A=function(e){return e.getParam("codesample_global_prismjs",!1,"boolean")},F=function(e){return h.Prism&&A(e)?h.Prism:x},P=v,S=function(n,t,r){n.undoManager.transact(function(){var e=v(n);return r=m.DOM.encode(r),e.fold(function(){n.insertContent('
      '+r+"
      "),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=r,F(n).highlightElement(e),n.selection.select(e)})})},j=function(e){return v(e).fold(function(){return""},function(e){return e.textContent})},$=function(e){var n=_(e);return n||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}]},C=function(e,t){return P(e).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})},E=(k="function",function(e){return function(e){if(null===e)return"null";var n=typeof e;return"object"==n&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":n}(e)===k}),O=Array.prototype.slice,z=(E(Array.from)&&Array.from,function(t){var e=$(t),n=function(e){return 0===e.length?g.none():g.some(e[0])}(e).fold(function(){return""},function(e){return e.value}),r=C(t,n),a=j(t);t.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:e},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:a},onSubmit:function(e){var n=e.getData();S(t,n.language,n.code),e.close()}})}),N=function(n){n.addCommand("codesample",function(){var e=n.selection.getNode();n.selection.isCollapsed()||f.isCodeSample(e)?z(n):n.formatter.toggle("code")})},T=function(t){var a=t.$;t.on("PreProcess",function(e){a("pre[contenteditable=false]",e.node).filter(f.trimArg(f.isCodeSample)).each(function(e,n){var t=a(n),r=n.textContent;t.attr("class",a.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(a("").each(function(){this.textContent=r}))})}),t.on("SetContent",function(){var e=a("pre").filter(f.trimArg(f.isCodeSample)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){a(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),F(t).highlightElement(n),n.className=a.trim(n.className)})})})},B=function(t){t.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return z(t)},onSetup:function(e){function n(){e.setActive(function(e){var n=e.selection.getStart();return e.dom.is(n,'pre[class*="language-"]')}(t))}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}),t.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return z(t)}})};!function M(){a.add("codesample",function(n){T(n),B(n),N(n),n.on("dblclick",function(e){f.isCodeSample(e.target)&&z(n)})})}()}(window); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 0000000..9ebbb9e --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('colorpicker', function () { + domGlobals.console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000..d08758f --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(o){"use strict";var i=tinymce.util.Tools.resolve("tinymce.PluginManager");!function n(){i.add("colorpicker",function(){o.console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 0000000..f81d603 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('contextmenu', function () { + domGlobals.console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000..3df2511 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(n){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager");!function e(){o.add("contextmenu",function(){n.console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.js new file mode 100644 index 0000000..42a825e --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.js @@ -0,0 +1,314 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var setDir = function (editor, dir) { + var dom = editor.dom; + var curDir; + var blocks = editor.selection.getSelectedBlocks(); + if (blocks.length) { + curDir = dom.getAttrib(blocks[0], 'dir'); + global$1.each(blocks, function (block) { + if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) { + dom.setAttrib(block, 'dir', curDir !== dir ? dir : null); + } + }); + editor.nodeChanged(); + } + }; + var Direction = { setDir: setDir }; + + var register = function (editor) { + editor.addCommand('mceDirectionLTR', function () { + Direction.setDir(editor, 'ltr'); + }); + editor.addCommand('mceDirectionRTL', function () { + Direction.setDir(editor, 'rtl'); + }); + }; + var Commands = { register: register }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isFunction = isType('function'); + + var nativeSlice = Array.prototype.slice; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType$1(TEXT); + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); + }; + + var get = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + return v === null ? undefined : v; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var getDirection = function (element) { + return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + }; + + var getNodeChangeHandler = function (editor, dir) { + return function (api) { + var nodeChangeHandler = function (e) { + var element = Element.fromDom(e.element); + api.setActive(getDirection(element) === dir); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('ltr', { + tooltip: 'Left to right', + icon: 'ltr', + onAction: function () { + return editor.execCommand('mceDirectionLTR'); + }, + onSetup: getNodeChangeHandler(editor, 'ltr') + }); + editor.ui.registry.addToggleButton('rtl', { + tooltip: 'Right to left', + icon: 'rtl', + onAction: function () { + return editor.execCommand('mceDirectionRTL'); + }, + onSetup: getNodeChangeHandler(editor, 'rtl') + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('directionality', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 0000000..0d601b5 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(i){"use strict";function n(){}function u(n){return function(){return n}}function t(){return a}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(n,t){var e,r=n.dom,o=n.selection.getSelectedBlocks();o.length&&(e=r.getAttrib(o[0],"dir"),c.each(o,function(n){r.getParent(n.parentNode,'*[dir="'+t+'"]',r.getRoot())||r.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},d=function(n){n.addCommand("mceDirectionLTR",function(){o(n,"ltr")}),n.addCommand("mceDirectionRTL",function(){o(n,"rtl")})},f=u(!1),l=u(!0),a=(e={fold:function(n,t){return n()},is:f,isSome:f,isNone:l,getOr:s,getOrThunk:N,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:s,orThunk:N,map:t,each:n,bind:t,exists:f,forall:l,filter:t,equals:m,equals_:m,toArray:function(){return[]},toString:u("none()")},Object.freeze&&Object.freeze(e),e);function m(n){return n.isNone()}function N(n){return n()}function s(n){return n}function g(n,t){var e=n.dom(),r=i.window.getComputedStyle(e).getPropertyValue(t),o=""!==r||function(n){var t=A(n)?n.dom().parentNode:n.dom();return t!==undefined&&null!==t&&t.ownerDocument.body.contains(t)}(n)?r:w(e,t);return null===o?undefined:o}function T(t,r){return function(e){function n(n){var t=p.fromDom(n.element);e.setActive(function(n){return"rtl"===g(n,"direction")?"rtl":"ltr"}(t)===r)}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}var E,O,y=function(e){function n(){return o}function t(n){return n(e)}var r=u(e),o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:l,isNone:f,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:n,orThunk:n,map:function(n){return y(n(e))},each:function(n){n(e)},bind:t,exists:t,forall:t,filter:function(n){return n(e)?o:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return o},D=function(n){return null===n||n===undefined?a:y(n)},h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:u(n)}},p={fromHtml:function(n,t){var e=(t||i.document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1= max; + }; + }); + for (var i = 0; i < list.length; i++) { + if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { + matches.push({ + value: list[i].char, + text: list[i].title, + icon: list[i].char + }); + if (reachedLimit(matches.length)) { + break; + } + } + } + return matches; + }; + + var init = function (editor, database) { + editor.ui.registry.addAutocompleter('emoticons', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return database.waitForLoad().then(function () { + var candidates = database.listAll(); + return emojisFrom(candidates, pattern, Option.some(maxResults)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var insertEmoticon = function (editor, ch) { + editor.insertContent(ch); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var keys = Object.keys; + var hasOwnProperty$1 = Object.hasOwnProperty; + var each = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var map$1 = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + var has = function (obj, key) { + return hasOwnProperty$1.call(obj, key); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var DEFAULT_ID = 'tinymce.plugins.emoticons'; + var getEmoticonDatabaseUrl = function (editor, pluginUrl) { + return editor.getParam('emoticons_database_url', pluginUrl + '/js/emojis' + editor.suffix + '.js'); + }; + var getEmoticonDatabaseId = function (editor) { + return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); + }; + var getAppendedEmoticons = function (editor) { + return editor.getParam('emoticons_append', {}, 'object'); + }; + var Settings = { + getEmoticonDatabaseUrl: getEmoticonDatabaseUrl, + getEmoticonDatabaseId: getEmoticonDatabaseId, + getAppendedEmoticons: getAppendedEmoticons + }; + + var ALL_CATEGORY = 'All'; + var categoryNameMap = { + symbols: 'Symbols', + people: 'People', + animals_and_nature: 'Animals and Nature', + food_and_drink: 'Food and Drink', + activity: 'Activity', + travel_and_places: 'Travel and Places', + objects: 'Objects', + flags: 'Flags', + user: 'User Defined' + }; + var translateCategory = function (categories, name) { + return has(categories, name) ? categories[name] : name; + }; + var getUserDefinedEmoticons = function (editor) { + var userDefinedEmoticons = Settings.getAppendedEmoticons(editor); + return map$1(userDefinedEmoticons, function (value) { + return __assign({ + keywords: [], + category: 'user' + }, value); + }); + }; + var initDatabase = function (editor, databaseUrl, databaseId) { + var categories = Cell(Option.none()); + var all = Cell(Option.none()); + var processEmojis = function (emojis) { + var cats = {}; + var everything = []; + each(emojis, function (lib, title) { + var entry = { + title: title, + keywords: lib.keywords, + char: lib.char, + category: translateCategory(categoryNameMap, lib.category) + }; + var current = cats[entry.category] !== undefined ? cats[entry.category] : []; + cats[entry.category] = current.concat([entry]); + everything.push(entry); + }); + categories.set(Option.some(cats)); + all.set(Option.some(everything)); + }; + editor.on('init', function () { + global$1.load(databaseId, databaseUrl).then(function (emojis) { + var userEmojis = getUserDefinedEmoticons(editor); + processEmojis(merge(emojis, userEmojis)); + }, function (err) { + domGlobals.console.log('Failed to load emoticons: ' + err); + categories.set(Option.some({})); + all.set(Option.some([])); + }); + }); + var listCategory = function (category) { + if (category === ALL_CATEGORY) { + return listAll(); + } + return categories.get().bind(function (cats) { + return Option.from(cats[category]); + }).getOr([]); + }; + var listAll = function () { + return all.get().getOr([]); + }; + var listCategories = function () { + return [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); + }; + var waitForLoad = function () { + if (hasLoaded()) { + return global$3.resolve(true); + } else { + return new global$3(function (resolve, reject) { + var numRetries = 15; + var interval = global$2.setInterval(function () { + if (hasLoaded()) { + global$2.clearInterval(interval); + resolve(true); + } else { + numRetries--; + if (numRetries < 0) { + domGlobals.console.log('Could not load emojis from url: ' + databaseUrl); + global$2.clearInterval(interval); + reject(false); + } + } + }, 100); + }); + } + }; + var hasLoaded = function () { + return categories.get().isSome() && all.get().isSome(); + }; + return { + listCategories: listCategories, + hasLoaded: hasLoaded, + waitForLoad: waitForLoad, + listAll: listAll, + listCategory: listCategory + }; + }; + + var patternName = 'pattern'; + var open = function (editor, database) { + var initialState = { + pattern: '', + results: emojisFrom(database.listAll(), '', Option.some(300)) + }; + var currentTab = Cell(ALL_CATEGORY); + var scan = function (dialogApi) { + var dialogData = dialogApi.getData(); + var category = currentTab.get(); + var candidates = database.listCategory(category); + var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Option.some(300) : Option.none()); + dialogApi.setData({ results: results }); + }; + var updateFilter = last(function (dialogApi) { + scan(dialogApi); + }, 200); + var searchField = { + label: 'Search', + type: 'input', + name: patternName + }; + var resultsField = { + type: 'collection', + name: 'results' + }; + var getInitialState = function () { + var body = { + type: 'tabpanel', + tabs: map(database.listCategories(), function (cat) { + return { + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + }; + }) + }; + return { + title: 'Emoticons', + size: 'normal', + body: body, + initialData: initialState, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: updateFilter.throttle, + onAction: function (dialogApi, actionData) { + if (actionData.name === 'results') { + insertEmoticon(editor, actionData.value); + dialogApi.close(); + } + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }] + }; + }; + var dialogApi = editor.windowManager.open(getInitialState()); + dialogApi.focus(patternName); + if (!database.hasLoaded()) { + dialogApi.block('Loading emoticons...'); + database.waitForLoad().then(function () { + dialogApi.redial(getInitialState()); + updateFilter.throttle(dialogApi); + dialogApi.focus(patternName); + dialogApi.unblock(); + }).catch(function (err) { + dialogApi.redial({ + title: 'Emoticons', + body: { + type: 'panel', + items: [{ + type: 'alertbanner', + level: 'error', + icon: 'warning', + text: '

      Could not load emoticons

      ' + }] + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }], + initialData: { + pattern: '', + results: [] + } + }); + dialogApi.focus(patternName); + dialogApi.unblock(); + }); + } + }; + var Dialog = { open: open }; + + var register = function (editor, database) { + var onAction = function () { + return Dialog.open(editor, database); + }; + editor.ui.registry.addButton('emoticons', { + tooltip: 'Emoticons', + icon: 'emoji', + onAction: onAction + }); + editor.ui.registry.addMenuItem('emoticons', { + text: 'Emoticons...', + icon: 'emoji', + onAction: onAction + }); + }; + var Buttons = { register: register }; + + function Plugin () { + global.add('emoticons', function (editor, pluginUrl) { + var databaseUrl = Settings.getEmoticonDatabaseUrl(editor, pluginUrl); + var databaseId = Settings.getEmoticonDatabaseId(editor); + var database = initDatabase(editor, databaseUrl, databaseId); + Buttons.register(editor, database); + init(editor, database); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/emoticons/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000..f300335 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(l){"use strict";function n(){}function i(n){return function(){return n}}function t(){return a}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=i(!1),u=i(!0),a=(e={fold:function(n,t){return n()},is:c,isSome:c,isNone:u,getOr:f,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:f,orThunk:s,map:t,each:n,bind:t,exists:c,forall:u,filter:t,equals:o,equals_:o,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(e),e);function o(n){return n.isNone()}function s(n){return n()}function f(n){return n}function m(n,t){return-1!==n.indexOf(t)}function g(n,t){return m(n.title.toLowerCase(),t)||function(n,t){for(var e=0,r=n.length;eCould not load emoticons

      "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),a.focus(U),a.unblock()}))},B=function(n,t){function e(){return R(n,t)}n.ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:e}),n.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:e})};!function G(){r.add("emoticons",function(n,t){var e=F(n,t),r=q(n),o=h(n,e,r);B(n,o),function(r,o){r.ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,e){return o.waitForLoad().then(function(){var n=o.listAll();return d(n,t,A.some(e))})},onAction:function(n,t,e){r.selection.setRng(t),r.insertContent(e),n.hide()}})}(n,o)})}()}(window); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.js new file mode 100644 index 0000000..16420c4 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.js @@ -0,0 +1,568 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); + + var shouldHideInSourceView = function (editor) { + return editor.getParam('fullpage_hide_in_source_view'); + }; + var getDefaultXmlPi = function (editor) { + return editor.getParam('fullpage_default_xml_pi'); + }; + var getDefaultEncoding = function (editor) { + return editor.getParam('fullpage_default_encoding'); + }; + var getDefaultFontFamily = function (editor) { + return editor.getParam('fullpage_default_font_family'); + }; + var getDefaultFontSize = function (editor) { + return editor.getParam('fullpage_default_font_size'); + }; + var getDefaultTextColor = function (editor) { + return editor.getParam('fullpage_default_text_color'); + }; + var getDefaultTitle = function (editor) { + return editor.getParam('fullpage_default_title'); + }; + var getDefaultDocType = function (editor) { + return editor.getParam('fullpage_default_doctype', ''); + }; + var Settings = { + shouldHideInSourceView: shouldHideInSourceView, + getDefaultXmlPi: getDefaultXmlPi, + getDefaultEncoding: getDefaultEncoding, + getDefaultFontFamily: getDefaultFontFamily, + getDefaultFontSize: getDefaultFontSize, + getDefaultTextColor: getDefaultTextColor, + getDefaultTitle: getDefaultTitle, + getDefaultDocType: getDefaultDocType + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head, { format: 'xhtml' }); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = Settings.getDefaultFontFamily(editor); + data.fontsize = Settings.getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headerFragment, headElement, html, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + html = global$4({ + validate: false, + indent: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + var Parser = { + parseHeader: parseHeader, + htmlToData: htmlToData, + dataToHtml: dataToHtml + }; + + var open = function (editor, headState) { + var data = Parser.htmlToData(editor, headState.get()); + var defaultData = { + title: '', + keywords: '', + description: '', + robots: '', + author: '', + docencoding: '' + }; + var initialData = __assign(__assign({}, defaultData), data); + editor.windowManager.open({ + title: 'Metadata and Document Properties', + size: 'normal', + body: { + type: 'panel', + items: [ + { + name: 'title', + type: 'input', + label: 'Title' + }, + { + name: 'keywords', + type: 'input', + label: 'Keywords' + }, + { + name: 'description', + type: 'input', + label: 'Description' + }, + { + name: 'robots', + type: 'input', + label: 'Robots' + }, + { + name: 'author', + type: 'input', + label: 'Author' + }, + { + name: 'docencoding', + type: 'input', + label: 'Encoding' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onSubmit: function (api) { + var nuData = api.getData(); + var headHtml = Parser.dataToHtml(editor, global$1.extend(data, nuData), headState.get()); + headState.set(headHtml); + api.close(); + } + }); + }; + var Dialog = { open: open }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + Dialog.open(editor, headState); + }); + }; + var Commands = { register: register }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + var Protect = { + protectHtml: protectHtml, + unprotectHtml: unprotectHtml + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, headerFragment, styles = ''; + var dom = editor.dom; + if (evt.selection) { + return; + } + content = Protect.protectHtml(editor.settings.protect, evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && Settings.shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + headerFragment = Parser.parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + var bodyElm = headerFragment.getAll('body')[0]; + if (bodyElm) { + dom.setAttribs(editor.getBody(), { + style: bodyElm.attr('style') || '', + dir: bodyElm.attr('dir') || '', + vLink: bodyElm.attr('vlink') || '', + link: bodyElm.attr('link') || '', + aLink: bodyElm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); + styleElm.appendChild(domGlobals.document.createTextNode(styles)); + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + 'href': href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (Settings.getDefaultXmlPi(editor)) { + var piEncoding = Settings.getDefaultEncoding(editor); + header += '\n'; + } + header += Settings.getDefaultDocType(editor); + header += '\n\n\n'; + if (value = Settings.getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = Settings.getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = Settings.getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = Settings.getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = Settings.getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (!evt.selection && (!evt.source_view || !Settings.shouldHideInSourceView(editor))) { + evt.content = Protect.unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + var FilterContent = { setup: setup }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('fullpage', { + tooltip: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + editor.ui.registry.addMenuItem('fullpage', { + text: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + Commands.register(editor, headState); + Buttons.register(editor); + FilterContent.setup(editor, headState, footState); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 0000000..7ef1075 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(m){"use strict";function f(t){return n({validate:!1,root_name:"#document"}).parse(t,{format:"xhtml"})}function g(t){return t.replace(/<\/?[A-Z]+/g,function(t){return t.toLowerCase()})}var i=function(t){function e(){return n}var n=t;return{get:e,set:function(t){n=t},clone:function(){return i(e())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=function(){return(e=Object.assign||function(t){for(var e,n=1,i=arguments.length;n")},_=f,b=function(t,e){var n,i,l=f(e),r={};function o(t,e){return t.attr(e)||""}return r.fontface=a(t),r.fontsize=c(t),7===(n=l.firstChild).type&&(r.xml_pi=!0,(i=/encoding="([^"]+)"/.exec(n.value))&&(r.docencoding=i[1])),(n=l.getAll("#doctype")[0])&&(r.doctype=""),(n=l.getAll("title")[0])&&n.firstChild&&(r.title=n.firstChild.value),p.each(l.getAll("meta"),function(t){var e,n=t.attr("name"),i=t.attr("http-equiv");n?r[n.toLowerCase()]=t.attr("content"):"Content-Type"===i&&(e=/charset\s*=\s*(.*)\s*/gi.exec(t.attr("content")))&&(r.docencoding=e[1])}),(n=l.getAll("html")[0])&&(r.langcode=o(n,"lang")||o(n,"xml:lang")),r.stylesheets=[],p.each(l.getAll("link"),function(t){"stylesheet"===t.attr("rel")&&r.stylesheets.push(t.attr("href"))}),(n=l.getAll("body")[0])&&(r.langdir=o(n,"dir"),r.style=o(n,"style"),r.visited_color=o(n,"vlink"),r.link_color=o(n,"link"),r.active_color=o(n,"alink")),r},x=function(t,r,e){var o,n,i,a,l,c=t.dom;function s(t,e,n){t.attr(e,n||undefined)}function u(t){n.firstChild?n.insert(t,n.firstChild):n.append(t)}o=f(e),(n=o.getAll("head")[0])||(a=o.getAll("html")[0],n=new y("head",1),a.firstChild?a.insert(n,a.firstChild,!0):a.append(n)),a=o.firstChild,r.xml_pi?(l='version="1.0"',r.docencoding&&(l+=' encoding="'+r.docencoding+'"'),7!==a.type&&(a=new y("xml",7),o.insert(a,o.firstChild,!0)),a.value=l):a&&7===a.type&&a.remove(),a=o.getAll("#doctype")[0],r.doctype?(a||(a=new y("#doctype",10),r.xml_pi?o.insert(a,o.firstChild):u(a)),a.value=r.doctype.substring(9,r.doctype.length-1)):a&&a.remove(),a=null,p.each(o.getAll("meta"),function(t){"Content-Type"===t.attr("http-equiv")&&(a=t)}),r.docencoding?(a||((a=new y("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,u(a)),a.attr("content","text/html; charset="+r.docencoding)):a&&a.remove(),a=o.getAll("title")[0],r.title?(a?a.empty():u(a=new y("title",1)),a.append(new y("#text",3)).value=r.title):a&&a.remove(),p.each("keywords,description,author,copyright,robots".split(","),function(t){var e,n,i=o.getAll("meta"),l=r[t];for(e=0;e"))},l=function(i,l){var r=b(i,l.get()),t=e(e({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),r);i.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:t,onSubmit:function(t){var e=t.getData(),n=x(i,p.extend(r,e),l.get());l.set(n),t.close()}})},k=function(t,e){t.addCommand("mceFullPageProperties",function(){l(t,e)})},C=function(t,e){return p.each(t,function(t){e=e.replace(t,function(t){return"\x3c!--mce:protected "+escape(t)+"--\x3e"})}),e},A=function(t){return t.replace(//g,function(t,e){return unescape(e)})},w=p.each,P=function(t){var e,n="",i="";if(r(t)){var l=o(t);n+='\n'}return n+=d(t),n+="\n\n\n",(e=u(t))&&(n+=""+e+"\n"),(e=o(t))&&(n+='\n'),(e=a(t))&&(i+="font-family: "+e+";"),(e=c(t))&&(i+="font-size: "+e+";"),(e=s(t))&&(i+="color: "+e+";"),n+="\n\n"},T=function(e,n,i){e.on("BeforeSetContent",function(t){!function(t,e,n,i){var l,r,o,a,c="",s=t.dom;if(!(i.selection||(o=C(t.settings.protect,i.content),"raw"===i.format&&e.get()||i.source_view&&v(t)))){0!==o.length||i.source_view||(o=p.trim(e.get())+"\n"+p.trim(o)+"\n"+p.trim(n.get())),-1!==(l=(o=o.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",l),e.set(g(o.substring(0,l+1))),-1===(r=o.indexOf("\n")),a=_(e.get()),w(a.getAll("style"),function(t){t.firstChild&&(c+=t.firstChild.value)});var u=a.getAll("body")[0];u&&s.setAttribs(t.getBody(),{style:u.attr("style")||"",dir:u.attr("dir")||"",vLink:u.attr("vlink")||"",link:u.attr("link")||"",aLink:u.attr("alink")||""}),s.remove("fullpage_styles");var d=t.getDoc().getElementsByTagName("head")[0];if(c)s.add(d,"style",{id:"fullpage_styles"}).appendChild(m.document.createTextNode(c));var f={};p.each(d.getElementsByTagName("link"),function(t){"stylesheet"===t.rel&&t.getAttribute("data-mce-fullpage")&&(f[t.href]=t)}),p.each(a.getAll("link"),function(t){var e=t.attr("href");if(!e)return!0;f[e]||"stylesheet"!==t.attr("rel")||s.add(d,"link",{rel:"stylesheet",text:"text/css",href:e,"data-mce-fullpage":"1"}),delete f[e]}),p.each(f,function(t){t.parentNode.removeChild(t)})}}(e,n,i,t)}),e.on("GetContent",function(t){!function(t,e,n,i){i.selection||i.source_view&&v(t)||(i.content=A(p.trim(e)+"\n"+p.trim(i.content)+"\n"+p.trim(n)))}(e,n.get(),i.get(),t)})},O=function(t){t.ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){t.execCommand("mceFullPageProperties")}}),t.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){t.execCommand("mceFullPageProperties")}})};!function D(){t.add("fullpage",function(t){var e=i(""),n=i("");k(t,e),O(t),T(t,e,n)})}()}(window); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 0000000..fa68d39 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,1192 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + var Api = { get: get }; + + var noop = function () { + }; + var compose = function (fa, fb) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fa(fb.apply(null, args)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var revocable = function (doRevoke) { + var subject = Cell(Option.none()); + var revoke = function () { + subject.get().each(doRevoke); + }; + var clear = function () { + revoke(); + subject.set(Option.none()); + }; + var set = function (s) { + revoke(); + subject.set(Option.some(s)); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + isSet: isSet, + set: set + }; + }; + var unbindable = function () { + return revocable(function (s) { + s.unbind(); + }); + }; + var value = function () { + var subject = Cell(Option.none()); + var clear = function () { + subject.set(Option.none()); + }; + var set = function (s) { + subject.set(Option.some(s)); + }; + var on = function (f) { + subject.get().each(f); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + set: set, + isSet: isSet, + on: on + }; + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isBoolean = isType('boolean'); + var isFunction = isType('function'); + var isNumber = isType('number'); + + var nativeSlice = Array.prototype.slice; + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType$1(TEXT); + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + var get$1 = function (element, key) { + var v = element.dom().getAttribute(key); + return v === null ? undefined : v; + }; + var remove = function (element, key) { + element.dom().removeAttribute(key); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var setAll = function (element, css) { + var dom = element.dom(); + each$1(css, function (v, k) { + internalSet(dom, k, v); + }); + }; + var get$2 = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + return v === null ? undefined : v; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + return { + target: constant(target), + x: constant(x), + y: constant(y), + stop: stop, + prevent: prevent, + kill: kill, + raw: constant(raw) + }; + }; + var fromRawEvent = function (rawEvent) { + var target = Element.fromDom(rawEvent.target); + var stop = function () { + rawEvent.stopPropagation(); + }; + var prevent = function () { + rawEvent.preventDefault(); + }; + var kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var isBrowser = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isEdge: isBrowser(edge, current), + isChrome: isBrowser(chrome, current), + isIE: isBrowser(ie, current), + isOpera: isBrowser(opera, current), + isFirefox: isBrowser(firefox, current), + isSafari: isBrowser(safari, current) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var chromeos = 'ChromeOS'; + var isOS = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isWindows: isOS(windows, current), + isiOS: isOS(ios, current), + isAndroid: isOS(android, current), + isOSX: isOS(osx, current), + isLinux: isOS(linux, current), + isSolaris: isOS(solaris, current), + isFreeBSD: isOS(freebsd, current), + isChromeOS: isOS(chromeos, current) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + var DeviceType = function (os, browser, userAgent, mediaMatch) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isMobile = os.isiOS() || os.isAndroid(); + var isTouch = isMobile || mediaMatch('(pointer:coarse)'); + var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + var isPhone = isiPhone || isMobile && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + var isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var detect$2 = function (userAgent, mediaMatch) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var mediaMatch = function (query) { + return domGlobals.window.matchMedia(query).matches; + }; + var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch)); + var detect$3 = function () { + return platform.get(); + }; + + var Immutable = function () { + var fields = []; + for (var _i = 0; _i < arguments.length; _i++) { + fields[_i] = arguments[_i]; + } + return function () { + var values = []; + for (var _i = 0; _i < arguments.length; _i++) { + values[_i] = arguments[_i]; + } + if (fields.length !== values.length) { + throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); + } + var struct = {}; + each(fields, function (name, i) { + struct[name] = constant(values[i]); + }); + return struct; + }; + }; + + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionPreceding = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING); + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + var Node = { + documentPositionPreceding: documentPositionPreceding, + documentPositionContainedBy: documentPositionContainedBy + }; + + var ELEMENT$1 = ELEMENT; + var DOCUMENT$1 = DOCUMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? domGlobals.document : scope.dom(); + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = detect$3().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var parents = function (element, isRoot) { + var stop = isFunction(isRoot) ? isRoot : never; + var dom = element.dom(); + var ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + var rawParent = dom.parentNode; + var p = Element.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + var siblings = function (element) { + var filterSelf = function (elements) { + return filter(elements, function (x) { + return !eq(element, x); + }); + }; + return parent(element).map(children).map(filterSelf).getOr([]); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + var spot = Immutable('element', 'offset'); + + var r = function (left, top) { + var translate = function (x, y) { + return r(left + x, top + y); + }; + return { + left: constant(left), + top: constant(top), + translate: translate + }; + }; + var Position = r; + + var isSafari = detect$3().browser.isSafari(); + var get$3 = function (_DOC) { + var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; + var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + var y = doc.body.scrollTop || doc.documentElement.scrollTop; + return Position(x, y); + }; + + var get$4 = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + return Option.from(win['visualViewport']); + }; + var bounds = function (x, y, width, height) { + return { + x: constant(x), + y: constant(y), + width: constant(width), + height: constant(height), + right: constant(x + width), + bottom: constant(y + height) + }; + }; + var getBounds = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + var doc = win.document; + var scroll = get$3(Element.fromDom(doc)); + return get$4(win).fold(function () { + var html = win.document.documentElement; + var width = html.clientWidth; + var height = html.clientHeight; + return bounds(scroll.left(), scroll.top(), width, height); + }, function (visualViewport) { + return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height); + }); + }; + var bind$1 = function (name, callback, _win) { + return get$4(_win).map(function (visualViewport) { + var handler = function (e) { + return fromRawEvent(e); + }; + visualViewport.addEventListener(name, handler); + return { + unbind: function () { + return visualViewport.removeEventListener(name, handler); + } + }; + }).getOrThunk(function () { + return { unbind: noop }; + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + var Events = { fireFullscreenStateChanged: fireFullscreenStateChanged }; + + var ancestors = function (scope, predicate, isRoot) { + return filter(parents(scope, isRoot), predicate); + }; + var siblings$1 = function (scope, predicate) { + return filter(siblings(scope), predicate); + }; + + var all$1 = function (selector) { + return all(selector); + }; + var ancestors$1 = function (scope, selector, isRoot) { + return ancestors(scope, function (e) { + return is(e, selector); + }, isRoot); + }; + var siblings$2 = function (scope, selector) { + return siblings$1(scope, function (e) { + return is(e, selector); + }); + }; + + var attr = 'data-ephox-mobile-fullscreen-style'; + var siblingStyles = 'display:none!important;'; + var ancestorPosition = 'position:absolute!important;'; + var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + var bgFallback = 'background-color:rgb(255,255,255)!important;'; + var isAndroid = global$2.os.isAndroid(); + var matchColor = function (editorBody) { + var color = get$2(editorBody, 'background-color'); + return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; + }; + var clobberStyles = function (dom, container, editorBody) { + var gatherSibilings = function (element) { + return siblings$2(element, '*:not(.tox-silver-sink)'); + }; + var clobber = function (clobberStyle) { + return function (element) { + var styles = get$1(element, 'style'); + var backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } + }; + }; + var ancestors = ancestors$1(container, '*'); + var siblings = bind(ancestors, gatherSibilings); + var bgColor = matchColor(editorBody); + each(siblings, clobber(siblingStyles)); + each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); + var containerStyles = isAndroid === true ? '' : ancestorPosition; + clobber(containerStyles + ancestorStyles + bgColor)(container); + }; + var restoreStyles = function (dom) { + var clobberedEls = all$1('[' + attr + ']'); + each(clobberedEls, function (element) { + var restore = get$1(element, attr); + if (restore !== 'no-styles') { + setAll(element, dom.parseStyle(restore)); + } else { + remove(element, 'style'); + } + remove(element, attr); + }); + }; + var Thor = { + clobberStyles: clobberStyles, + restoreStyles: restoreStyles + }; + + var DOM = global$1.DOM; + var getScrollPos = function () { + var vp = getBounds(domGlobals.window); + return { + x: vp.x(), + y: vp.y() + }; + }; + var setScrollPos = function (pos) { + domGlobals.window.scrollTo(pos.x, pos.y); + }; + var viewportUpdate = get$4().fold(function () { + return { + bind: noop, + unbind: noop + }; + }, function (visualViewport) { + var editorContainer = value(); + var resizeBinder = unbindable(); + var scrollBinder = unbindable(); + var refreshScroll = function () { + domGlobals.document.body.scrollTop = 0; + domGlobals.document.documentElement.scrollTop = 0; + }; + var refreshVisualViewport = function () { + domGlobals.window.requestAnimationFrame(function () { + editorContainer.on(function (container) { + return setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + }); + }); + }); + }; + var update = global$3.throttle(function () { + refreshScroll(); + refreshVisualViewport(); + }, 50); + var bind = function (element) { + editorContainer.set(element); + update(); + resizeBinder.set(bind$1('resize')); + scrollBinder.set(bind$1('scroll')); + }; + var unbind = function () { + editorContainer.on(function () { + resizeBinder.clear(); + scrollBinder.clear(); + }); + editorContainer.clear(); + }; + return { + bind: bind, + unbind: unbind + }; + }); + var toggleFullscreen = function (editor, fullscreenState) { + var body = domGlobals.document.body; + var documentElement = domGlobals.document.documentElement; + var editorContainerStyle; + var editorContainer, iframe, iframeStyle; + editorContainer = editor.getContainer(); + var editorContainerS = Element.fromDom(editorContainer); + var fullscreenInfo = fullscreenState.get(); + var editorBody = Element.fromDom(editor.getBody()); + var isTouch = global$2.deviceType.isTouch(); + editorContainerStyle = editorContainer.style; + iframe = editor.getContentAreaContainer().firstChild; + iframeStyle = iframe.style; + if (!fullscreenInfo) { + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + containerTop: editorContainerStyle.top, + containerLeft: editorContainerStyle.left, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height + }; + if (isTouch) { + Thor.clobberStyles(editor.dom, editorContainerS, editorBody); + } + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + DOM.addClass(body, 'tox-fullscreen'); + DOM.addClass(documentElement, 'tox-fullscreen'); + DOM.addClass(editorContainer, 'tox-fullscreen'); + viewportUpdate.bind(editorContainerS); + editor.on('remove', viewportUpdate.unbind); + fullscreenState.set(newFullScreenInfo); + Events.fireFullscreenStateChanged(editor, true); + } else { + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + editorContainerStyle.width = fullscreenInfo.containerWidth; + editorContainerStyle.height = fullscreenInfo.containerHeight; + editorContainerStyle.top = fullscreenInfo.containerTop; + editorContainerStyle.left = fullscreenInfo.containerLeft; + if (isTouch) { + Thor.restoreStyles(editor.dom); + } + DOM.removeClass(body, 'tox-fullscreen'); + DOM.removeClass(documentElement, 'tox-fullscreen'); + DOM.removeClass(editorContainer, 'tox-fullscreen'); + setScrollPos(fullscreenInfo.scrollPos); + fullscreenState.set(null); + Events.fireFullscreenStateChanged(editor, false); + viewportUpdate.unbind(); + editor.off('remove', viewportUpdate.unbind); + } + }; + var Actions = { toggleFullscreen: toggleFullscreen }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + Actions.toggleFullscreen(editor, fullscreenState); + }); + }; + var Commands = { register: register }; + + var makeSetupHandler = function (editor, fullscreenState) { + return function (api) { + api.setActive(fullscreenState.get() !== null); + var editorEventCallback = function (e) { + return api.setActive(e.state); + }; + editor.on('FullscreenStateChanged', editorEventCallback); + return function () { + return editor.off('FullscreenStateChanged', editorEventCallback); + }; + }; + }; + var register$1 = function (editor, fullscreenState) { + editor.ui.registry.addToggleMenuItem('fullscreen', { + text: 'Fullscreen', + shortcut: 'Meta+Shift+F', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + editor.ui.registry.addToggleButton('fullscreen', { + tooltip: 'Fullscreen', + icon: 'fullscreen', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.settings.inline) { + return Api.get(fullscreenState); + } + Commands.register(editor, fullscreenState); + Buttons.register(editor, fullscreenState); + editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); + return Api.get(fullscreenState); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000..6eb913e --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(d){"use strict";function t(){}function m(n){return function(){return n}}function n(){return f}var e,u=function(n){function e(){return r}var r=n;return{get:e,set:function(n){r=n},clone:function(){return u(e())}}},r=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(n){return{isFullscreen:function(){return null!==n.get()}}},c=m(!1),i=m(!0),f=(e={fold:function(n,e){return n()},is:c,isSome:c,isNone:i,getOr:l,getOrThunk:a,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:m(null),getOrUndefined:m(undefined),or:l,orThunk:a,map:n,each:t,bind:n,exists:c,forall:i,filter:n,equals:s,equals_:s,toArray:function(){return[]},toString:m("none()")},Object.freeze&&Object.freeze(e),e);function s(n){return n.isNone()}function a(n){return n()}function l(n){return n}function h(){return function(n){function e(){r.get().each(n)}var r=u(Y.none());return{clear:function(){e(),r.set(Y.none())},isSet:function(){return r.get().isSome()},set:function(n){e(),r.set(Y.some(n))}}}(function(n){n.unbind()})}function v(e){return function(n){return function(n){if(null===n)return"null";var e=typeof n;return"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e}(n)===e}}function g(n,e){for(var r=n.length,t=new Array(r),o=0;o -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var get$1 = function (obj, key) { + return has(obj, key) ? Option.from(obj[key]) : Option.none(); + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getHelpTabs = function (editor) { + return Option.from(editor.getParam('help_tabs')); + }; + + var shortcuts = [ + { + shortcuts: ['Meta + B'], + action: 'Bold' + }, + { + shortcuts: ['Meta + I'], + action: 'Italic' + }, + { + shortcuts: ['Meta + U'], + action: 'Underline' + }, + { + shortcuts: ['Meta + A'], + action: 'Select all' + }, + { + shortcuts: [ + 'Meta + Y', + 'Meta + Shift + Z' + ], + action: 'Redo' + }, + { + shortcuts: ['Meta + Z'], + action: 'Undo' + }, + { + shortcuts: ['Access + 1'], + action: 'Header 1' + }, + { + shortcuts: ['Access + 2'], + action: 'Header 2' + }, + { + shortcuts: ['Access + 3'], + action: 'Header 3' + }, + { + shortcuts: ['Access + 4'], + action: 'Header 4' + }, + { + shortcuts: ['Access + 5'], + action: 'Header 5' + }, + { + shortcuts: ['Access + 6'], + action: 'Header 6' + }, + { + shortcuts: ['Access + 7'], + action: 'Paragraph' + }, + { + shortcuts: ['Access + 8'], + action: 'Div' + }, + { + shortcuts: ['Access + 9'], + action: 'Address' + }, + { + shortcuts: ['Alt + 0'], + action: 'Open help dialog' + }, + { + shortcuts: ['Alt + F9'], + action: 'Focus to menubar' + }, + { + shortcuts: ['Alt + F10'], + action: 'Focus to toolbar' + }, + { + shortcuts: ['Alt + F11'], + action: 'Focus to element path' + }, + { + shortcuts: ['Ctrl + F9'], + action: 'Focus to contextual toolbar' + }, + { + shortcuts: ['Shift + Enter'], + action: 'Open popup menu for split buttons' + }, + { + shortcuts: ['Meta + K'], + action: 'Insert link (if link plugin activated)' + }, + { + shortcuts: ['Meta + S'], + action: 'Save (if save plugin activated)' + }, + { + shortcuts: ['Meta + F'], + action: 'Find (if searchreplace plugin activated)' + }, + { + shortcuts: ['Meta + Shift + F'], + action: 'Switch to or from fullscreen mode' + } + ]; + var KeyboardShortcuts = { shortcuts: shortcuts }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var convertText = function (source) { + var mac = { + alt: '⌥', + ctrl: '⌃', + shift: '⇧', + meta: '⌘', + access: '⌃⌥' + }; + var other = { + meta: 'Ctrl ', + access: 'Shift + Alt ' + }; + var replace = global$1.mac ? mac : other; + var shortcut = source.split('+'); + var updated = map(shortcut, function (segment) { + var search = segment.toLowerCase().trim(); + return has(replace, search) ? replace[search] : segment; + }); + return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + }; + var ConvertShortcut = { convertText: convertText }; + + var tab = function () { + var shortcutList = map(KeyboardShortcuts.shortcuts, function (shortcut) { + var shortcutText = map(shortcut.shortcuts, ConvertShortcut.convertText).join(' or '); + return [ + shortcut.action, + shortcutText + ]; + }); + var tablePanel = { + type: 'table', + header: [ + 'Action', + 'Shortcut' + ], + cells: shortcutList + }; + return { + name: 'shortcuts', + title: 'Handy Shortcuts', + items: [tablePanel] + }; + }; + var KeyboardShortcutsTab = { tab: tab }; + + var supplant = function (str, obj) { + var isStringOrNumber = function (a) { + var t = typeof a; + return t === 'string' || t === 'number'; + }; + return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) { + var value = obj[key]; + return isStringOrNumber(value) ? value.toString() : fullMatch; + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + }, + { + key: 'advcode', + name: 'Advanced Code Editor*' + }, + { + key: 'formatpainter', + name: 'Format Painter*' + }, + { + key: 'powerpaste', + name: 'PowerPaste*' + }, + { + key: 'tinydrive', + name: 'Tiny Drive*' + }, + { + key: 'tinymcespellchecker', + name: 'Spell Checker Pro*' + }, + { + key: 'a11ychecker', + name: 'Accessibility Checker*' + }, + { + key: 'linkchecker', + name: 'Link Checker*' + }, + { + key: 'mentions', + name: 'Mentions*' + }, + { + key: 'mediaembed', + name: 'Enhanced Media Embed*' + }, + { + key: 'checklist', + name: 'Checklist*' + }, + { + key: 'casechange', + name: 'Case Change*' + }, + { + key: 'permanentpen', + name: 'Permanent Pen*' + }, + { + key: 'pageembed', + name: 'Page Embed*' + }, + { + key: 'tinycomments', + name: 'Tiny Comments*' + }, + { + key: 'advtable', + name: 'Advanced Tables*' + }, + { + key: 'autocorrect', + name: 'Autocorrect*' + } + ]; + var PluginUrls = { urls: urls }; + + var tab$1 = function (editor) { + var availablePlugins = function () { + var premiumPlugins = [ + 'Accessibility Checker', + 'Advanced Code Editor', + 'Advanced Tables', + 'Case Change', + 'Checklist', + 'Tiny Comments', + 'Tiny Drive', + 'Enhanced Media Embed', + 'Format Painter', + 'Link Checker', + 'Mentions', + 'MoxieManager', + 'Page Embed', + 'Permanent Pen', + 'PowerPaste', + 'Spell Checker Pro' + ]; + var premiumPluginList = map(premiumPlugins, function (plugin) { + return '
    • ' + global$2.translate(plugin) + '
    • '; + }).join(''); + return '
      ' + '

      ' + global$2.translate('Premium plugins:') + '

      ' + '' + '
      '; + }; + var makeLink = curry(supplant, '${name}'); + var maybeUrlize = function (editor, key) { + return find(PluginUrls.urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + return makeLink({ + name: x.name, + url: 'https://www.tiny.cloud/docs/plugins/' + x.key + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + return editor.settings.forced_plugins === undefined ? keys$1 : filter(keys$1, not(curry(contains, editor.settings.forced_plugins))); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
    • ' + maybeUrlize(editor, key) + '
    • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + var html = '

      ' + global$2.translate([ + 'Plugins installed ({0}):', + count + ]) + '

      ' + '
        ' + pluginsString + '
      '; + return html; + }; + var installedPlugins = function (editor) { + if (editor == null) { + return ''; + } + return '
      ' + pluginLister(editor) + '
      '; + }; + var htmlPanel = { + type: 'htmlpanel', + presets: 'document', + html: [ + installedPlugins(editor), + availablePlugins() + ].join('') + }; + return { + name: 'plugins', + title: 'Plugins', + items: [htmlPanel] + }; + }; + var PluginsTab = { tab: tab$1 }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var tab$2 = function () { + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + var htmlPanel = { + type: 'htmlpanel', + html: '

      ' + global$2.translate([ + 'You are using {0}', + changeLogLink + ]) + '

      ', + presets: 'document' + }; + return { + name: 'versions', + title: 'Version', + items: [htmlPanel] + }; + }; + var VersionTab = { tab: tab$2 }; + + var description = '

      Editor UI keyboard navigation

      \n\n

      Activating keyboard navigation

      \n\n

      The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

      \n
        \n
      • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
      • \n
      • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
      • \n
      • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
      • \n
      \n\n

      Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

      \n\n

      Moving between UI sections

      \n\n

      When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

      \n
        \n
      • the menubar
      • \n
      • each group of the toolbar
      • \n
      • the sidebar
      • \n
      • the element path in the footer
      • \n
      • the wordcount toggle button in the footer
      • \n
      • the branding link in the footer
      • \n
      \n\n

      Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

      \n\n

      Moving within UI sections

      \n\n

      Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

      \n
        \n
      • moving between menus in the menubar
      • \n
      • moving between buttons in a toolbar group
      • \n
      • moving between items in the element path
      • \n
      \n\n

      In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

      \n\n

      Executing buttons

      \n\n

      To execute a button, navigate the selection to the desired button and hit space or enter.

      \n\n

      Opening, navigating and closing menus

      \n\n

      When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

      \n\n

      To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

      \n\n

      Context toolbars and menus

      \n\n

      To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

      \n\n

      Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

      \n\n

      Dialog navigation

      \n\n

      There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

      \n\n

      When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

      \n\n

      When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

      '; + var tab$3 = function () { + var body = { + type: 'htmlpanel', + presets: 'document', + html: description + }; + return { + name: 'keyboardnav', + title: 'Keyboard Navigation', + items: [body] + }; + }; + var KeyboardNavTab = { tab: tab$3 }; + + var parseHelpTabsSetting = function (tabsFromSettings, tabs) { + var newTabs = {}; + var names = map(tabsFromSettings, function (t) { + if (typeof t === 'string') { + if (has(tabs, t)) { + newTabs[t] = tabs[t]; + } + return t; + } else { + newTabs[t.name] = t; + return t.name; + } + }); + return { + tabs: newTabs, + names: names + }; + }; + var getNamesFromTabs = function (tabs) { + var names = keys(tabs); + var versionsIdx = indexOf(names, 'versions'); + versionsIdx.each(function (idx) { + names.splice(idx, 1); + names.push('versions'); + }); + return { + tabs: tabs, + names: names + }; + }; + var parseCustomTabs = function (editor, customTabs) { + var _a; + var shortcuts = KeyboardShortcutsTab.tab(); + var nav = KeyboardNavTab.tab(); + var plugins = PluginsTab.tab(editor); + var versions = VersionTab.tab(); + var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); + return getHelpTabs(editor).fold(function () { + return getNamesFromTabs(tabs); + }, function (tabsFromSettings) { + return parseHelpTabsSetting(tabsFromSettings, tabs); + }); + }; + var init = function (editor, customTabs) { + return function () { + var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; + var foundTabs = map(names, function (name) { + return get$1(tabs, name); + }); + var dialogTabs = cat(foundTabs); + var body = { + type: 'tabpanel', + tabs: dialogTabs + }; + editor.windowManager.open({ + title: 'Help', + size: 'medium', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: {} + }); + }; + }; + + function Plugin () { + global.add('help', function (editor) { + var customTabs = Cell({}); + var api = get(customTabs); + var dialogOpener = init(editor, customTabs); + Buttons.register(editor, dialogOpener); + Commands.register(editor, dialogOpener); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + return api; + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/help/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/help/plugin.min.js new file mode 100644 index 0000000..4c15c6e --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function e(){}function r(e){return function(){return e}}var a=function(e){function t(){return n}var n=e;return{get:t,set:function(e){n=e},clone:function(){return a(t())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e,t){e.addCommand("mceHelp",t)},s=function(e,t){e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t})},c=function(){return(c=Object.assign||function(e){for(var t,n=1,o=arguments.length;n${name}');return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[(n=e,null==n?"":'
      '+function(t){var e=function(e){var t=F(e.plugins);return e.settings.forced_plugins===undefined?t:function(e,t){for(var n=[],o=0,a=e.length;o"+r(t,e)+""}),o=n.length,a=n.join("");return"

      "+U.translate(["Plugins installed ({0}):",o])+"

        "+a+"
      "}(n)+"
      "),(t=y(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
    • "+U.translate(e)+"
    • "}).join(""),'

      '+U.translate("Premium plugins:")+"

      ")].join("")}]}},N=tinymce.util.Tools.resolve("tinymce.EditorManager"),L=function(){var e,t,n='TinyMCE '+(e=N.majorVersion,t=N.minorVersion,0===e.indexOf("@")?"X.X.X":e+"."+t)+"";return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

      "+U.translate(["You are using {0}",n])+"

      ",presets:"document"}]}},B=function(){return{name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

      Editor UI keyboard navigation

      \n\n

      Activating keyboard navigation

      \n\n

      The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

      \n
        \n
      • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
      • \n
      • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
      • \n
      • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
      • \n
      \n\n

      Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

      \n\n

      Moving between UI sections

      \n\n

      When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

      \n
        \n
      • the menubar
      • \n
      • each group of the toolbar
      • \n
      • the sidebar
      • \n
      • the element path in the footer
      • \n
      • the wordcount toggle button in the footer
      • \n
      • the branding link in the footer
      • \n
      \n\n

      Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

      \n\n

      Moving within UI sections

      \n\n

      Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

      \n
        \n
      • moving between menus in the menubar
      • \n
      • moving between buttons in a toolbar group
      • \n
      • moving between items in the element path
      • \n
      \n\n

      In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

      \n\n

      Executing buttons

      \n\n

      To execute a button, navigate the selection to the desired button and hit space or enter.

      \n\n

      Opening, navigating and closing menus

      \n\n

      When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

      \n\n

      To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

      \n\n

      Context toolbars and menus

      \n\n

      To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

      \n\n

      Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

      \n\n

      Dialog navigation

      \n\n

      There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

      \n\n

      When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

      \n\n

      When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

      "}]}};!function z(){t.add("help",function(e){var t=a({}),n=function(n){return{addTab:function(e){var t=n.get();t[e.name]=e,n.set(t)}}}(t),o=A(e,t);return s(e,o),i(e,o),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),n})}()}(); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/hr/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/hr/plugin.js new file mode 100644 index 0000000..984f7b4 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/hr/plugin.js @@ -0,0 +1,48 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var register = function (editor) { + editor.addCommand('InsertHorizontalRule', function () { + editor.execCommand('mceInsertContent', false, '
      '); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('hr', { + icon: 'horizontal-rule', + tooltip: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + editor.ui.registry.addMenuItem('hr', { + icon: 'horizontal-rule', + text: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('hr', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/hr/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 0000000..4660378 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"
      ")})},t=function(n){n.ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return n.execCommand("InsertHorizontalRule")}}),n.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return n.execCommand("InsertHorizontalRule")}})};!function e(){n.add("hr",function(n){o(n),t(n)})}()}(); \ No newline at end of file diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/image/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/image/plugin.js new file mode 100644 index 0000000..0e2b0c3 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/image/plugin.js @@ -0,0 +1,2519 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function (domGlobals) { + 'use strict'; + + var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var identity = function (x) { + return x; + }; + var die = function (msg) { + return function () { + throw new Error(msg); + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isString = isType('string'); + var isObject = isType('object'); + var isArray = isType('array'); + var isBoolean = isType('boolean'); + var isFunction = isType('function'); + var isNumber = isType('number'); + + var nativeSlice = Array.prototype.slice; + var nativePush = Array.prototype.push; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var exports$1 = {}, module = { exports: exports$1 }; + (function (define, exports, module, require) { + (function (f) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = f(); + } else if (typeof define === 'function' && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== 'undefined') { + g = window; + } else if (typeof global !== 'undefined') { + g = global; + } else if (typeof self !== 'undefined') { + g = self; + } else { + g = this; + } + g.EphoxContactWrapper = f(); + } + }(function () { + return function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) + return c(i, !0); + if (u) + return u(i, !0); + var a = new Error('Cannot find module \'' + i + '\''); + throw a.code = 'MODULE_NOT_FOUND', a; + } + var p = n[i] = { exports: {} }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) + o(t[i]); + return o; + } + return r; + }()({ + 1: [ + function (require, module, exports) { + var process = module.exports = {}; + var cachedSetTimeout; + var cachedClearTimeout; + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + }()); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + return setTimeout(fun, 0); + } + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + return clearTimeout(marker); + } + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + return cachedClearTimeout(marker); + } catch (e) { + try { + return cachedClearTimeout.call(null, marker); + } catch (e) { + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; + process.versions = {}; + function noop() { + } + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + process.listeners = function (name) { + return []; + }; + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + process.cwd = function () { + return '/'; + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + }, + {} + ], + 2: [ + function (require, module, exports) { + (function (setImmediate) { + (function (root) { + var setTimeoutFunc = setTimeout; + function noop() { + } + function bind(fn, thisArg) { + return function () { + fn.apply(thisArg, arguments); + }; + } + function Promise(fn) { + if (typeof this !== 'object') + throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') + throw new TypeError('not a function'); + this._state = 0; + this._handled = false; + this._value = undefined; + this._deferreds = []; + doResolve(fn, this); + } + function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + Promise._immediateFn(function () { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + resolve(deferred.promise, ret); + }); + } + function resolve(self, newValue) { + try { + if (newValue === self) + throw new TypeError('A promise cannot be resolved with itself.'); + if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } + } + function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); + } + function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function () { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); + } + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; + } + function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; + } + function doResolve(fn, self) { + var done = false; + try { + fn(function (value) { + if (done) + return; + done = true; + resolve(self, value); + }, function (reason) { + if (done) + return; + done = true; + reject(self, reason); + }); + } catch (ex) { + if (done) + return; + done = true; + reject(self, ex); + } + } + Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); + }; + Promise.prototype.then = function (onFulfilled, onRejected) { + var prom = new this.constructor(noop); + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; + }; + Promise.all = function (arr) { + var args = Array.prototype.slice.call(arr); + return new Promise(function (resolve, reject) { + if (args.length === 0) + return resolve([]); + var remaining = args.length; + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, reject); + return; + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + }; + Promise.resolve = function (value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } + return new Promise(function (resolve) { + resolve(value); + }); + }; + Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); + }; + Promise.race = function (values) { + return new Promise(function (resolve, reject) { + for (var i = 0, len = values.length; i < len; i++) { + values[i].then(resolve, reject); + } + }); + }; + Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { + setImmediate(fn); + } : function (fn) { + setTimeoutFunc(fn, 0); + }; + Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); + } + }; + Promise._setImmediateFn = function _setImmediateFn(fn) { + Promise._immediateFn = fn; + }; + Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { + Promise._unhandledRejectionFn = fn; + }; + if (typeof module !== 'undefined' && module.exports) { + module.exports = Promise; + } else if (!root.Promise) { + root.Promise = Promise; + } + }(this)); + }.call(this, require('timers').setImmediate)); + }, + { 'timers': 3 } + ], + 3: [ + function (require, module, exports) { + (function (setImmediate, clearImmediate) { + var nextTick = require('process/browser.js').nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + exports.setTimeout = function () { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); + }; + exports.setInterval = function () { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); + }; + exports.clearTimeout = exports.clearInterval = function (timeout) { + timeout.close(); + }; + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function () { + }; + Timeout.prototype.close = function () { + this._clearFn.call(window, this._id); + }; + exports.enroll = function (item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + exports.unenroll = function (item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + exports._unrefActive = exports.active = function (item) { + clearTimeout(item._idleTimeoutId); + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } + }; + exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + immediateIds[id] = true; + nextTick(function onNextTick() { + if (immediateIds[id]) { + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + exports.clearImmediate(id); + } + }); + return id; + }; + exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) { + delete immediateIds[id]; + }; + }.call(this, require('timers').setImmediate, require('timers').clearImmediate)); + }, + { + 'process/browser.js': 1, + 'timers': 3 + } + ], + 4: [ + function (require, module, exports) { + var promisePolyfill = require('promise-polyfill'); + var Global = function () { + if (typeof window !== 'undefined') { + return window; + } else { + return Function('return this;')(); + } + }(); + module.exports = { boltExport: Global.Promise || promisePolyfill }; + }, + { 'promise-polyfill': 2 } + ] + }, {}, [4])(4); + })); + }(undefined, exports$1, module, undefined)); + var Promise = module.exports.boltExport; + + var nu = function (baseFn) { + var data = Option.none(); + var callbacks = []; + var map = function (f) { + return nu(function (nCallback) { + get(function (data) { + nCallback(f(data)); + }); + }); + }; + var get = function (nCallback) { + if (isReady()) { + call(nCallback); + } else { + callbacks.push(nCallback); + } + }; + var set = function (x) { + data = Option.some(x); + run(callbacks); + callbacks = []; + }; + var isReady = function () { + return data.isSome(); + }; + var run = function (cbs) { + each(cbs, call); + }; + var call = function (cb) { + data.each(function (x) { + domGlobals.setTimeout(function () { + cb(x); + }, 0); + }); + }; + baseFn(set); + return { + get: get, + map: map, + isReady: isReady + }; + }; + var pure = function (a) { + return nu(function (callback) { + callback(a); + }); + }; + var LazyValue = { + nu: nu, + pure: pure + }; + + var errorReporter = function (err) { + domGlobals.setTimeout(function () { + throw err; + }, 0); + }; + var make = function (run) { + var get = function (callback) { + run().then(callback, errorReporter); + }; + var map = function (fab) { + return make(function () { + return run().then(fab); + }); + }; + var bind = function (aFutureB) { + return make(function () { + return run().then(function (v) { + return aFutureB(v).toPromise(); + }); + }); + }; + var anonBind = function (futureB) { + return make(function () { + return run().then(function () { + return futureB.toPromise(); + }); + }); + }; + var toLazy = function () { + return LazyValue.nu(get); + }; + var toCached = function () { + var cache = null; + return make(function () { + if (cache === null) { + cache = run(); + } + return cache; + }); + }; + var toPromise = run; + return { + map: map, + bind: bind, + anonBind: anonBind, + toLazy: toLazy, + toCached: toCached, + toPromise: toPromise, + get: get + }; + }; + var nu$1 = function (baseFn) { + return make(function () { + return new Promise(baseFn); + }); + }; + var pure$1 = function (a) { + return make(function () { + return Promise.resolve(a); + }); + }; + var Future = { + nu: nu$1, + pure: pure$1 + }; + + var value = function (o) { + var is = function (v) { + return o === v; + }; + var or = function (opt) { + return value(o); + }; + var orThunk = function (f) { + return value(o); + }; + var map = function (f) { + return value(f(o)); + }; + var mapError = function (f) { + return value(o); + }; + var each = function (f) { + f(o); + }; + var bind = function (f) { + return f(o); + }; + var fold = function (_, onValue) { + return onValue(o); + }; + var exists = function (f) { + return f(o); + }; + var forall = function (f) { + return f(o); + }; + var toOption = function () { + return Option.some(o); + }; + return { + is: is, + isValue: always, + isError: never, + getOr: constant(o), + getOrThunk: constant(o), + getOrDie: constant(o), + or: or, + orThunk: orThunk, + fold: fold, + map: map, + mapError: mapError, + each: each, + bind: bind, + exists: exists, + forall: forall, + toOption: toOption + }; + }; + var error = function (message) { + var getOrThunk = function (f) { + return f(); + }; + var getOrDie = function () { + return die(String(message))(); + }; + var or = function (opt) { + return opt; + }; + var orThunk = function (f) { + return f(); + }; + var map = function (f) { + return error(message); + }; + var mapError = function (f) { + return error(f(message)); + }; + var bind = function (f) { + return error(message); + }; + var fold = function (onError, _) { + return onError(message); + }; + return { + is: never, + isValue: never, + isError: always, + getOr: identity, + getOrThunk: getOrThunk, + getOrDie: getOrDie, + or: or, + orThunk: orThunk, + fold: fold, + map: map, + mapError: mapError, + each: noop, + bind: bind, + exists: never, + forall: always, + toOption: Option.none + }; + }; + var fromOption = function (opt, err) { + return opt.fold(function () { + return error(err); + }, value); + }; + var Result = { + value: value, + error: error, + fromOption: fromOption + }; + + var wrap = function (delegate) { + var toCached = function () { + return wrap(delegate.toCached()); + }; + var bindFuture = function (f) { + return wrap(delegate.bind(function (resA) { + return resA.fold(function (err) { + return Future.pure(Result.error(err)); + }, function (a) { + return f(a); + }); + })); + }; + var bindResult = function (f) { + return wrap(delegate.map(function (resA) { + return resA.bind(f); + })); + }; + var mapResult = function (f) { + return wrap(delegate.map(function (resA) { + return resA.map(f); + })); + }; + var mapError = function (f) { + return wrap(delegate.map(function (resA) { + return resA.mapError(f); + })); + }; + var foldResult = function (whenError, whenValue) { + return delegate.map(function (res) { + return res.fold(whenError, whenValue); + }); + }; + var withTimeout = function (timeout, errorThunk) { + return wrap(Future.nu(function (callback) { + var timedOut = false; + var timer = domGlobals.setTimeout(function () { + timedOut = true; + callback(Result.error(errorThunk())); + }, timeout); + delegate.get(function (result) { + if (!timedOut) { + domGlobals.clearTimeout(timer); + callback(result); + } + }); + })); + }; + return __assign(__assign({}, delegate), { + toCached: toCached, + bindFuture: bindFuture, + bindResult: bindResult, + mapResult: mapResult, + mapError: mapError, + foldResult: foldResult, + withTimeout: withTimeout + }); + }; + var nu$2 = function (worker) { + return wrap(Future.nu(worker)); + }; + var value$1 = function (value) { + return wrap(Future.pure(Result.value(value))); + }; + var error$1 = function (error) { + return wrap(Future.pure(Result.error(error))); + }; + var fromResult = function (result) { + return wrap(Future.pure(result)); + }; + var fromFuture = function (future) { + return wrap(future.map(Result.value)); + }; + var fromPromise = function (promise) { + return nu$2(function (completer) { + promise.then(function (value) { + completer(Result.value(value)); + }, function (error) { + completer(Result.error(error)); + }); + }); + }; + var FutureResult = { + nu: nu$2, + wrap: wrap, + pure: value$1, + value: value$1, + error: error$1, + fromResult: fromResult, + fromFuture: fromFuture, + fromPromise: fromPromise + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var deep = function (old, nu) { + var bothObjects = isObject(old) && isObject(nu); + return bothObjects ? deepMerge(old, nu) : nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var deepMerge = baseMerge(deep); + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var hasDimensions = function (editor) { + return editor.getParam('image_dimensions', true, 'boolean'); + }; + var hasAdvTab = function (editor) { + return editor.getParam('image_advtab', false, 'boolean'); + }; + var hasUploadTab = function (editor) { + return editor.getParam('image_uploadtab', true, 'boolean'); + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', '', 'string'); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.getParam('image_description', true, 'boolean'); + }; + var hasImageTitle = function (editor) { + return editor.getParam('image_title', false, 'boolean'); + }; + var hasImageCaption = function (editor) { + return editor.getParam('image_caption', false, 'boolean'); + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return !!getUploadUrl(editor); + }; + var hasUploadHandler = function (editor) { + return !!getUploadHandler(editor); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url', '', 'string'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', undefined, 'function'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path', undefined, 'string'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials', false, 'boolean'); + }; + var showAccessibilityOptions = function (editor) { + return editor.getParam('a11y_advanced_options', false, 'boolean'); + }; + var isAutomaticUploadsEnabled = function (editor) { + return editor.getParam('automatic_uploads', true, 'boolean'); + }; + var Settings = { + hasDimensions: hasDimensions, + hasUploadTab: hasUploadTab, + hasAdvTab: hasAdvTab, + getPrependUrl: getPrependUrl, + getClassList: getClassList, + hasDescription: hasDescription, + hasImageTitle: hasImageTitle, + hasImageCaption: hasImageCaption, + getImageList: getImageList, + hasUploadUrl: hasUploadUrl, + hasUploadHandler: hasUploadHandler, + getUploadUrl: getUploadUrl, + getUploadHandler: getUploadHandler, + getUploadBasePath: getUploadBasePath, + getUploadCredentials: getUploadCredentials, + showAccessibilityOptions: showAccessibilityOptions, + isAutomaticUploadsEnabled: isAutomaticUploadsEnabled + }; + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url, callback) { + var img = domGlobals.document.createElement('img'); + var done = function (dimensions) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + var dimensions = { + width: width, + height: height + }; + done(Result.value(dimensions)); + }; + img.onerror = function () { + done(Result.error('Failed to get image dimensions for: ' + url)); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + domGlobals.document.body.appendChild(img); + img.src = url; + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = String(css.margin).split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = Settings.getImageList(editor); + if (typeof imageList === 'string') { + global$4.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + var selectImage = function () { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + }; + imgElm.onload = function () { + if (!data.width && !data.height && Settings.hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: String(imgElm.clientWidth), + height: String(imgElm.clientHeight) + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$3(function (resolve, reject) { + var reader = new domGlobals.FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var isPlaceholderImage = function (imgElm) { + return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + }; + var Utils = { + getImageSize: getImageSize, + removePixelSuffix: removePixelSuffix, + addPixelSuffix: addPixelSuffix, + mergeMargins: mergeMargins, + createImageList: createImageList, + waitLoadImage: waitLoadImage, + blobToDataUri: blobToDataUri, + isPlaceholderImage: isPlaceholderImage + }; + + var DOM = global$2.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return Utils.removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return Utils.removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return Utils.removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var setAttrib = function (image, name, value) { + image.setAttribute(name, value); + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = Utils.addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + setAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return Utils.removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = Utils.addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var isImage = function (elm) { + return elm.nodeName === 'IMG'; + }; + var getIsDecorative = function (image) { + return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + }; + var getAlt = function (image) { + if (getIsDecorative(image)) { + return ''; + } else { + return getAttrib(image, 'alt'); + } + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + setAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data, info) { + var image = domGlobals.document.createElement('img'); + write(normalizeCss, __assign(__assign({}, data), { caption: false }), image, info); + setAlt(image, data.alt, data.isDecorative, info); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle'), + isDecorative: getIsDecorative(image) + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var setAlt = function (image, alt, isDecorative, info) { + if (isDecorative) { + DOM.setAttrib(image, 'role', 'presentation'); + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', ''); + } else { + if (info.hasAccessibilityOptions) { + DOM.setAttrib(image, 'alt', alt); + } else { + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', alt); + } + if (DOM.getAttrib(image, 'role') === 'presentation') { + DOM.setAttrib(image, 'role', ''); + } + } + }; + var updateAlt = function (image, oldData, newData, info) { + if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { + setAlt(image, newData.alt, newData.isDecorative, info); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image, info) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', setAttrib); + updateProp(image, oldData, newData, 'title', setAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', setAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return setAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + updateAlt(image, oldData, newData, info); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = Utils.mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || Utils.isPlaceholderImage(imgElm))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return !!editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data, info) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data, info); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data, info) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image, info); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + Utils.waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, data, info) { + var image = getSelectedImage(editor); + if (image) { + if (data.src) { + writeImageDataToSelection(editor, data, info); + } else { + deleteImage(editor, image); + } + } else if (data.src) { + insertImageAtCaret(editor, data, info); + } + }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$5.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizer = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + if (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + } else { + return Option.none(); + } + }; + }; + var sanitize = function (list) { + return sanitizer(getValue)(list); + }; + var isGroup = function (item) { + return Object.prototype.hasOwnProperty.call(item, 'items'); + }; + var findEntryDelegate = function (list, value) { + return findMap(list, function (item) { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Option.some(item); + } else { + return Option.none(); + } + }); + }; + var findEntry = function (optList, value) { + return optList.bind(function (list) { + return findEntryDelegate(list, value); + }); + }; + var ListUtils = { + sanitizer: sanitizer, + sanitize: sanitize, + findEntry: findEntry + }; + + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr, formData; + xhr = new domGlobals.XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + var json; + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + formData = new domGlobals.FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$3(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$3.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$5.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var makeTab = function (info) { + return { + title: 'Advanced', + name: 'advanced', + items: [ + { + type: 'input', + label: 'Style', + name: 'style' + }, + { + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'selectbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var collect = function (editor) { + var urlListSanitizer = ListUtils.sanitizer(function (item) { + return editor.convertURL(item.value || item.url, 'src'); + }); + var futureImageList = Future.nu(function (completer) { + Utils.createImageList(editor, function (imageList) { + completer(urlListSanitizer(imageList).map(function (items) { + return flatten([ + [{ + text: 'None', + value: '' + }], + items + ]); + })); + }); + }); + var classList = ListUtils.sanitize(Settings.getClassList(editor)); + var hasAdvTab = Settings.hasAdvTab(editor); + var hasUploadTab = Settings.hasUploadTab(editor); + var hasUploadUrl = Settings.hasUploadUrl(editor); + var hasUploadHandler = Settings.hasUploadHandler(editor); + var image = readImageDataFromSelection(editor); + var hasDescription = Settings.hasDescription(editor); + var hasImageTitle = Settings.hasImageTitle(editor); + var hasDimensions = Settings.hasDimensions(editor); + var hasImageCaption = Settings.hasImageCaption(editor); + var hasAccessibilityOptions = Settings.showAccessibilityOptions(editor); + var url = Settings.getUploadUrl(editor); + var basePath = Settings.getUploadBasePath(editor); + var credentials = Settings.getUploadCredentials(editor); + var handler = Settings.getUploadHandler(editor); + var automaticUploads = Settings.isAutomaticUploadsEnabled(editor); + var prependURL = Option.some(Settings.getPrependUrl(editor)).filter(function (preUrl) { + return isString(preUrl) && preUrl.length > 0; + }); + return futureImageList.map(function (imageList) { + return { + image: image, + imageList: imageList, + classList: classList, + hasAdvTab: hasAdvTab, + hasUploadTab: hasUploadTab, + hasUploadUrl: hasUploadUrl, + hasUploadHandler: hasUploadHandler, + hasDescription: hasDescription, + hasImageTitle: hasImageTitle, + hasDimensions: hasDimensions, + hasImageCaption: hasImageCaption, + url: url, + basePath: basePath, + credentials: credentials, + handler: handler, + prependURL: prependURL, + hasAccessibilityOptions: hasAccessibilityOptions, + automaticUploads: automaticUploads + }; + }); + }; + + var makeItems = function (info) { + var imageUrl = { + name: 'src', + type: 'urlinput', + filetype: 'image', + label: 'Source' + }; + var imageList = info.imageList.map(function (items) { + return { + name: 'images', + type: 'selectbox', + label: 'Image list', + items: items + }; + }); + var imageDescription = { + name: 'alt', + type: 'input', + label: 'Alternative description', + disabled: info.hasAccessibilityOptions && info.image.isDecorative + }; + var imageTitle = { + name: 'title', + type: 'input', + label: 'Image title' + }; + var imageDimensions = { + name: 'dimensions', + type: 'sizeinput' + }; + var isDecorative = { + type: 'label', + label: 'Accessibility', + items: [{ + name: 'isDecorative', + type: 'checkbox', + label: 'Image is decorative' + }] + }; + var classList = info.classList.map(function (items) { + return { + name: 'classes', + type: 'selectbox', + label: 'Class', + items: items + }; + }); + var caption = { + type: 'label', + label: 'Caption', + items: [{ + type: 'checkbox', + name: 'caption', + label: 'Show caption' + }] + }; + return flatten([ + [imageUrl], + imageList.toArray(), + info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [], + info.hasDescription ? [imageDescription] : [], + info.hasImageTitle ? [imageTitle] : [], + info.hasDimensions ? [imageDimensions] : [], + [{ + type: 'grid', + columns: 2, + items: flatten([ + classList.toArray(), + info.hasImageCaption ? [caption] : [] + ]) + }] + ]); + }; + var makeTab$1 = function (info) { + return { + title: 'General', + name: 'general', + items: makeItems(info) + }; + }; + var MainTab = { + makeTab: makeTab$1, + makeItems: makeItems + }; + + var makeTab$2 = function (info) { + var items = [{ + type: 'dropzone', + name: 'fileinput' + }]; + return { + title: 'Upload', + name: 'upload', + items: items + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + var createState = function (info) { + return { + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }; + }; + var fromImageData = function (image) { + return { + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }; + }; + var toImageData = function (data) { + return { + src: data.src.value, + alt: data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }; + }; + var addPrependUrl2 = function (info, srcURL) { + if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { + return info.prependURL.bind(function (prependUrl) { + if (srcURL.substring(0, prependUrl.length) !== prependUrl) { + return Option.some(prependUrl + srcURL); + } + return Option.none(); + }); + } + return Option.none(); + }; + var addPrependUrl = function (info, api) { + var data = api.getData(); + addPrependUrl2(info, data.src.value).each(function (srcURL) { + api.setData({ + src: { + value: srcURL, + meta: data.src.meta + } + }); + }); + }; + var formFillFromMeta2 = function (info, data, meta) { + if (info.hasDescription && isString(meta.alt)) { + data.alt = meta.alt; + } + if (info.hasAccessibilityOptions) { + data.isDecorative = meta.isDecorative || false; + } + if (info.hasImageTitle && isString(meta.title)) { + data.title = meta.title; + } + if (info.hasDimensions) { + if (isString(meta.width)) { + data.dimensions.width = meta.width; + } + if (isString(meta.height)) { + data.dimensions.height = meta.height; + } + } + if (isString(meta.class)) { + ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + data.classes = entry.value; + }); + } + if (info.hasImageCaption) { + if (isBoolean(meta.caption)) { + data.caption = meta.caption; + } + } + if (info.hasAdvTab) { + if (isString(meta.style)) { + data.style = meta.style; + } + if (isString(meta.vspace)) { + data.vspace = meta.vspace; + } + if (isString(meta.border)) { + data.border = meta.border; + } + if (isString(meta.hspace)) { + data.hspace = meta.hspace; + } + if (isString(meta.borderstyle)) { + data.borderstyle = meta.borderstyle; + } + } + }; + var formFillFromMeta = function (info, api) { + var data = api.getData(); + var meta = data.src.meta; + if (meta !== undefined) { + var newData = deepMerge({}, data); + formFillFromMeta2(info, newData, meta); + api.setData(newData); + } + }; + var calculateImageSize = function (helpers, info, state, api) { + var data = api.getData(); + var url = data.src.value; + var meta = data.src.meta || {}; + if (!meta.width && !meta.height && info.hasDimensions) { + helpers.imageSize(url).get(function (result) { + result.each(function (size) { + if (state.open) { + api.setData({ dimensions: size }); + } + }); + }); + } + }; + var updateImagesDropdown = function (info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.src.value); + state.prevImage = image; + api.setData({ + images: image.map(function (entry) { + return entry.value; + }).getOr('') + }); + }; + var changeSrc = function (helpers, info, state, api) { + addPrependUrl(info, api); + formFillFromMeta(info, api); + calculateImageSize(helpers, info, state, api); + updateImagesDropdown(info, state, api); + }; + var changeImages = function (helpers, info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.images); + image.each(function (img) { + var updateAlt = data.alt === '' || state.prevImage.map(function (image) { + return image.text === data.alt; + }).getOr(false); + if (updateAlt) { + if (img.value === '') { + api.setData({ + src: img, + alt: state.prevAlt + }); + } else { + api.setData({ + src: img, + alt: img.text + }); + } + } else { + api.setData({ src: img }); + } + }); + state.prevImage = image; + changeSrc(helpers, info, state, api); + }; + var calcVSpace = function (css) { + var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; + return matchingTopBottom ? Utils.removePixelSuffix(String(css['margin-top'])) : ''; + }; + var calcHSpace = function (css) { + var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; + return matchingLeftRight ? Utils.removePixelSuffix(String(css['margin-right'])) : ''; + }; + var calcBorderWidth = function (css) { + return css['border-width'] ? Utils.removePixelSuffix(String(css['border-width'])) : ''; + }; + var calcBorderStyle = function (css) { + return css['border-style'] ? String(css['border-style']) : ''; + }; + var calcStyle = function (parseStyle, serializeStyle, css) { + return serializeStyle(parseStyle(serializeStyle(css))); + }; + var changeStyle2 = function (parseStyle, serializeStyle, data) { + var css = Utils.mergeMargins(parseStyle(data.style)); + var dataCopy = deepMerge({}, data); + dataCopy.vspace = calcVSpace(css); + dataCopy.hspace = calcHSpace(css); + dataCopy.border = calcBorderWidth(css); + dataCopy.borderstyle = calcBorderStyle(css); + dataCopy.style = calcStyle(parseStyle, serializeStyle, css); + return dataCopy; + }; + var changeStyle = function (helpers, api) { + var data = api.getData(); + var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); + api.setData(newData); + }; + var changeAStyle = function (helpers, info, api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + var style = getStyleValue(helpers.normalizeCss, toImageData(data)); + api.setData({ style: style }); + }; + var changeFileInput = function (helpers, info, state, api) { + var data = api.getData(); + api.block('Uploading image'); + head(data.fileinput).fold(function () { + api.unblock(); + }, function (file) { + var blobUri = domGlobals.URL.createObjectURL(file); + var uploader = Uploader({ + url: info.url, + basePath: info.basePath, + credentials: info.credentials, + handler: info.handler + }); + var finalize = function () { + api.unblock(); + domGlobals.URL.revokeObjectURL(blobUri); + }; + var updateSrcAndSwitchTab = function (url) { + api.setData({ + src: { + value: url, + meta: {} + } + }); + api.showTab('general'); + changeSrc(helpers, info, state, api); + }; + Utils.blobToDataUri(file).then(function (dataUrl) { + var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + if (info.automaticUploads) { + uploader.upload(blobInfo).then(function (url) { + updateSrcAndSwitchTab(url); + finalize(); + }).catch(function (err) { + finalize(); + helpers.alertErr(api, err); + }); + } else { + helpers.addToBlobCache(blobInfo); + updateSrcAndSwitchTab(blobInfo.blobUri()); + api.unblock(); + } + }); + }); + }; + var changeHandler = function (helpers, info, state) { + return function (api, evt) { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'style') { + changeStyle(helpers, api); + } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { + changeAStyle(helpers, info, api); + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + if (api.getData().isDecorative) { + api.disable('alt'); + } else { + api.enable('alt'); + } + } + }; + }; + var closeHandler = function (state) { + return function () { + state.open = false; + }; + }; + var makeDialogBody = function (info) { + if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { + var tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [MainTab.makeTab(info)], + info.hasAdvTab ? [AdvTab.makeTab(info)] : [], + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + ]) + }; + return tabPanel; + } else { + var panel = { + type: 'panel', + items: MainTab.makeItems(info) + }; + return panel; + } + }; + var makeDialog = function (helpers) { + return function (info) { + var state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: helpers.onSubmit(info), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }; + }; + var submitHandler = function (editor) { + return function (info) { + return function (api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + editor.undoManager.transact(function () { + insertOrUpdateImage(editor, toImageData(data), info); + }); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + }; + }; + var imageSize = function (editor) { + return function (url) { + return FutureResult.nu(function (completer) { + Utils.getImageSize(editor.documentBaseURI.toAbsolute(url), function (data) { + var result = data.map(function (dimensions) { + return { + width: String(dimensions.width), + height: String(dimensions.height) + }; + }); + completer(result); + }); + }); + }; + }; + var createBlobCache = function (editor) { + return function (file, blobUri, dataUrl) { + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + base64: dataUrl.split(',')[1] + }); + }; + }; + var addToBlobCache = function (editor) { + return function (blobInfo) { + editor.editorUpload.blobCache.add(blobInfo); + }; + }; + var alertErr = function (editor) { + return function (api, message) { + editor.windowManager.alert(message, api.close); + }; + }; + var normalizeCss$1 = function (editor) { + return function (cssText) { + return normalizeCss(editor, cssText); + }; + }; + var parseStyle = function (editor) { + return function (cssText) { + return editor.dom.parseStyle(cssText); + }; + }; + var serializeStyle = function (editor) { + return function (stylesArg, name) { + return editor.dom.serializeStyle(stylesArg, name); + }; + }; + var Dialog = function (editor) { + var helpers = { + onSubmit: submitHandler(editor), + imageSize: imageSize(editor), + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + normalizeCss: normalizeCss$1(editor), + parseStyle: parseStyle(editor), + serializeStyle: serializeStyle(editor) + }; + var open = function () { + return collect(editor).map(makeDialog(helpers)).get(function (spec) { + editor.windowManager.open(spec); + }); + }; + return { open: open }; + }; + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).open); + }; + var Commands = { register: register }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + var node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$5.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('PreInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + var FilterContent = { setup: setup }; + + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onAction: Dialog(editor).open, + onSetup: function (buttonApi) { + return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + } + }); + editor.ui.registry.addMenuItem('image', { + icon: 'image', + text: 'Image...', + onAction: Dialog(editor).open + }); + editor.ui.registry.addContextMenu('image', { + update: function (element) { + return isFigure(element) || isImage(element) && !Utils.isPlaceholderImage(element) ? ['image'] : []; + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global$1.add('image', function (editor) { + FilterContent.setup(editor); + Buttons.register(editor); + Commands.register(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/image/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..dabe6ff --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(s){"use strict";function o(){}function a(t){return function(){return t}}function t(t){return t}function e(){return l}var n,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=a(!1),c=a(!0),l=(n={fold:function(t,e){return t()},is:u,isSome:u,isNone:c,getOr:d,getOrThunk:f,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:a(null),getOrUndefined:a(undefined),or:d,orThunk:f,map:e,each:o,bind:e,exists:u,forall:c,filter:e,equals:i,equals_:i,toArray:function(){return[]},toString:a("none()")},Object.freeze&&Object.freeze(n),n);function i(t){return t.isNone()}function f(t){return t()}function d(t){return t}function m(e){return function(t){return function(t){if(null===t)return"null";var e=typeof t;return"object"==e&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":e}(t)===e}}function T(t){for(var e=[],n=0,r=t.length;n= 300 ? Errors.handleServiceErrorResponse(result.status, result.blob) : global$3.resolve(result.blob); + }); + }; + function requestBlob(url, withCredentials) { + return Utils.requestUrlAsBlob(url, {}, withCredentials).then(function (result) { + return result.status < 200 || result.status >= 300 ? Errors.handleHttpError(result.status) : global$3.resolve(result.blob); + }); + } + var getUrl = function (url, apiKey, withCredentials) { + return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials); + }; + + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionPreceding = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING); + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + var Node = { + documentPositionPreceding: documentPositionPreceding, + documentPositionContainedBy: documentPositionContainedBy + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var isBrowser = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isEdge: isBrowser(edge, current), + isChrome: isBrowser(chrome, current), + isIE: isBrowser(ie, current), + isOpera: isBrowser(opera, current), + isFirefox: isBrowser(firefox, current), + isSafari: isBrowser(safari, current) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var chromeos = 'ChromeOS'; + var isOS = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isWindows: isOS(windows, current), + isiOS: isOS(ios, current), + isAndroid: isOS(android, current), + isOSX: isOS(osx, current), + isLinux: isOS(linux, current), + isSolaris: isOS(solaris, current), + isFreeBSD: isOS(freebsd, current), + isChromeOS: isOS(chromeos, current) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + var DeviceType = function (os, browser, userAgent, mediaMatch) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isMobile = os.isiOS() || os.isAndroid(); + var isTouch = isMobile || mediaMatch('(pointer:coarse)'); + var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + var isPhone = isiPhone || isMobile && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + var isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var detect$2 = function (userAgent, mediaMatch) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var mediaMatch = function (query) { + return domGlobals.window.matchMedia(query).matches; + }; + var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch)); + var detect$3 = function () { + return platform.get(); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var ELEMENT$1 = ELEMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = detect$3().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var child = function (scope, predicate) { + var pred = function (node) { + return predicate(Element.fromDom(node)); + }; + var result = find(scope.dom().childNodes, pred); + return result.map(Element.fromDom); + }; + + var child$1 = function (scope, selector) { + return child(scope, function (e) { + return is(e, selector); + }); + }; + + var count = 0; + var getFigureImg = function (elem) { + return child$1(Element.fromDom(elem), 'img'); + }; + var isFigure = function (editor, elem) { + return editor.dom.is(elem, 'figure'); + }; + var getEditableImage = function (editor, elem) { + var isImage = function (imgNode) { + return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); + }; + var isEditable = function (imgNode) { + return isImage(imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || editor.settings.imagetools_proxy); + }; + if (isFigure(editor, elem)) { + var imgOpt = getFigureImg(elem); + return imgOpt.map(function (img) { + return isEditable(img.dom()) ? Option.some(img.dom()) : Option.none(); + }); + } + return isEditable(elem) ? Option.some(elem) : Option.none(); + }; + var displayError = function (editor, error) { + editor.notificationManager.open({ + text: error, + type: 'error' + }); + }; + var getSelectedImage = function (editor) { + var elem = editor.selection.getNode(); + if (isFigure(editor, elem)) { + return getFigureImg(elem); + } else { + return Option.some(Element.fromDom(elem)); + } + }; + var extractFilename = function (editor, url) { + var m = url.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i); + if (m) { + return editor.dom.encode(m[1]); + } + return null; + }; + var createId = function () { + return 'imagetools' + count++; + }; + var isLocalImage = function (editor, img) { + var url = img.src; + return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host; + }; + var isCorsImage = function (editor, img) { + return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1; + }; + var isCorsWithCredentialsImage = function (editor, img) { + return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1; + }; + var defaultFetchImage = function (editor, img) { + var src = img.src, apiKey; + if (isCorsImage(editor, img)) { + return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); + } + if (!isLocalImage(editor, img)) { + src = getProxyUrl(editor); + src += (src.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); + apiKey = getApiKey(editor); + return getUrl(src, apiKey, false); + } + return imageToBlob$1(img); + }; + var imageToBlob$2 = function (editor, img) { + return getFetchImage(editor).fold(function () { + return defaultFetchImage(editor, img); + }, function (customFetchImage) { + return customFetchImage(img); + }); + }; + var findBlob = function (editor, img) { + var blobInfo; + blobInfo = editor.editorUpload.blobCache.getByUri(img.src); + if (blobInfo) { + return global$3.resolve(blobInfo.blob()); + } + return imageToBlob$2(editor, img); + }; + var startTimedUpload = function (editor, imageUploadTimerState) { + var imageUploadTimer = global$2.setEditorTimeout(editor, function () { + editor.editorUpload.uploadImagesAuto(); + }, getUploadTimeout(editor)); + imageUploadTimerState.set(imageUploadTimer); + }; + var cancelTimedUpload = function (imageUploadTimerState) { + global$2.clearTimeout(imageUploadTimerState.get()); + }; + var updateSelectedImage = function (editor, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { + return ir.toBlob().then(function (blob) { + var uri, name, blobCache, blobInfo; + blobCache = editor.editorUpload.blobCache; + uri = selectedImage.src; + if (shouldReuseFilename(editor)) { + blobInfo = blobCache.getByUri(uri); + if (blobInfo) { + uri = blobInfo.uri(); + name = blobInfo.name(); + } else { + name = extractFilename(editor, uri); + } + } + blobInfo = blobCache.create({ + id: createId(), + blob: blob, + base64: ir.toBase64(), + uri: uri, + name: name + }); + blobCache.add(blobInfo); + editor.undoManager.transact(function () { + function imageLoadedHandler() { + editor.$(selectedImage).off('load', imageLoadedHandler); + editor.nodeChanged(); + if (uploadImmediately) { + editor.editorUpload.uploadImagesAuto(); + } else { + cancelTimedUpload(imageUploadTimerState); + startTimedUpload(editor, imageUploadTimerState); + } + } + editor.$(selectedImage).on('load', imageLoadedHandler); + if (size) { + editor.$(selectedImage).attr({ + width: size.w, + height: size.h + }); + } + editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); + }); + return blobInfo; + }); + }; + var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { + return function () { + var imgOpt = getSelectedImage(editor); + return imgOpt.fold(function () { + displayError(editor, 'Could not find selected image'); + }, function (img) { + return editor._scanForImages().then(function () { + return findBlob(editor, img.dom()); + }).then(blobToImageResult).then(fn).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, false, imageUploadTimerState, img.dom(), size); + }, function (error) { + displayError(editor, error); + }); + }); + }; + }; + var rotate$2 = function (editor, imageUploadTimerState, angle) { + return function () { + var imgOpt = getSelectedImage(editor); + var flippedSize = imgOpt.fold(function () { + return null; + }, function (img) { + var size = ImageSize.getImageSize(img.dom()); + return size ? { + w: size.h, + h: size.w + } : null; + }); + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return rotate$1(imageResult, angle); + }, flippedSize)(); + }; + }; + var flip$2 = function (editor, imageUploadTimerState, axis) { + return function () { + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return flip$1(imageResult, axis); + })(); + }; + }; + var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { + return new global$3(function (resolve) { + blobToImage$1(blob).then(function (newImage) { + var newSize = ImageSize.getNaturalImageSize(newImage); + if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { + if (ImageSize.getImageSize(img)) { + ImageSize.setImageSize(img, newSize); + } + } + domGlobals.URL.revokeObjectURL(newImage.src); + return blob; + }).then(blobToImageResult).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, true, imageUploadTimerState, img); + }, function () { + }); + }); + }; + var Actions = { + rotate: rotate$2, + flip: flip$2, + getEditableImage: getEditableImage, + cancelTimedUpload: cancelTimedUpload, + findBlob: findBlob, + getSelectedImage: getSelectedImage, + handleDialogBlob: handleDialogBlob + }; + + var saveState = constant('save-state'); + var disable = constant('disable'); + var enable = constant('enable'); + + var createState = function (blob) { + return { + blob: blob, + url: domGlobals.URL.createObjectURL(blob) + }; + }; + var makeOpen = function (editor, imageUploadTimerState) { + return function () { + var getLoadedSpec = function (currentState) { + return { + title: 'Edit Image', + size: 'large', + body: { + type: 'panel', + items: [{ + type: 'imagetools', + name: 'imagetools', + label: 'Edit Image', + currentState: currentState + }] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true, + disabled: true + } + ], + onSubmit: function (api) { + var blob = api.getData().imagetools.blob; + originalImgOpt.each(function (originalImg) { + originalSizeOpt.each(function (originalSize) { + Actions.handleDialogBlob(editor, imageUploadTimerState, originalImg.dom(), originalSize, blob); + }); + }); + api.close(); + }, + onCancel: function () { + }, + onAction: function (api, details) { + switch (details.name) { + case saveState(): + if (details.value) { + api.enable('save'); + } else { + api.disable('save'); + } + break; + case disable(): + api.disable('save'); + api.disable('cancel'); + break; + case enable(): + api.enable('cancel'); + break; + } + } + }; + }; + var originalImgOpt = Actions.getSelectedImage(editor); + var originalSizeOpt = originalImgOpt.map(function (origImg) { + return ImageSize.getNaturalImageSize(origImg.dom()); + }); + var imgOpt = Actions.getSelectedImage(editor); + imgOpt.each(function (img) { + Actions.getEditableImage(editor, img.dom()).each(function (_) { + Actions.findBlob(editor, img.dom()).then(function (blob) { + var state = createState(blob); + editor.windowManager.open(getLoadedSpec(state)); + }); + }); + }); + }; + }; + var Dialog = { makeOpen: makeOpen }; + + var register = function (editor, imageUploadTimerState) { + global$1.each({ + mceImageRotateLeft: Actions.rotate(editor, imageUploadTimerState, -90), + mceImageRotateRight: Actions.rotate(editor, imageUploadTimerState, 90), + mceImageFlipVertical: Actions.flip(editor, imageUploadTimerState, 'v'), + mceImageFlipHorizontal: Actions.flip(editor, imageUploadTimerState, 'h'), + mceEditImage: Dialog.makeOpen(editor, imageUploadTimerState) + }, function (fn, cmd) { + editor.addCommand(cmd, fn); + }); + }; + var Commands = { register: register }; + + var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { + editor.on('NodeChange', function (e) { + var lastSelectedImage = lastSelectedImageState.get(); + if (lastSelectedImage && lastSelectedImage.src !== e.element.src) { + Actions.cancelTimedUpload(imageUploadTimerState); + editor.editorUpload.uploadImagesAuto(); + lastSelectedImageState.set(null); + } + Actions.getEditableImage(editor, e.element).each(lastSelectedImageState.set); + }); + }; + var UploadSelectedImage = { setup: setup }; + + var register$1 = function (editor) { + var cmd = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + editor.ui.registry.addButton('rotateleft', { + tooltip: 'Rotate counterclockwise', + icon: 'rotate-left', + onAction: cmd('mceImageRotateLeft') + }); + editor.ui.registry.addButton('rotateright', { + tooltip: 'Rotate clockwise', + icon: 'rotate-right', + onAction: cmd('mceImageRotateRight') + }); + editor.ui.registry.addButton('flipv', { + tooltip: 'Flip vertically', + icon: 'flip-vertically', + onAction: cmd('mceImageFlipVertical') + }); + editor.ui.registry.addButton('fliph', { + tooltip: 'Flip horizontally', + icon: 'flip-horizontally', + onAction: cmd('mceImageFlipHorizontal') + }); + editor.ui.registry.addButton('editimage', { + tooltip: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage'), + onSetup: function (buttonApi) { + var setDisabled = function () { + var elementOpt = Actions.getSelectedImage(editor); + elementOpt.each(function (element) { + var disabled = Actions.getEditableImage(editor, element.dom()).isNone(); + buttonApi.setDisabled(disabled); + }); + }; + editor.on('NodeChange', setDisabled); + return function () { + editor.off('NodeChange', setDisabled); + }; + } + }); + editor.ui.registry.addButton('imageoptions', { + tooltip: 'Image options', + icon: 'image-options', + onAction: cmd('mceImage') + }); + editor.ui.registry.addContextMenu('imagetools', { + update: function (element) { + return Actions.getEditableImage(editor, element).fold(function () { + return []; + }, function (_) { + return [{ + text: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage') + }]; + }); + } + }); + }; + var Buttons = { register: register$1 }; + + var register$2 = function (editor) { + editor.ui.registry.addContextToolbar('imagetools', { + items: getToolbarItems(editor), + predicate: function (elem) { + return Actions.getEditableImage(editor, elem).isSome(); + }, + position: 'node', + scope: 'node' + }); + }; + var ContextToolbar = { register: register$2 }; + + function Plugin () { + global.add('imagetools', function (editor) { + var imageUploadTimerState = Cell(0); + var lastSelectedImageState = Cell(null); + Commands.register(editor, imageUploadTimerState); + Buttons.register(editor); + ContextToolbar.register(editor); + UploadSelectedImage.setup(editor, imageUploadTimerState, lastSelectedImageState); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/imagetools/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 0000000..bc4f05e --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(v){"use strict";function e(){}function n(){return c}var t,r=function(e){function n(){return t}var t=e;return{get:n,set:function(e){t=e},clone:function(){return r(n())}}},o=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(e){return function(){return e}},u=d(!1),a=d(!0),c=(t={fold:function(e,n){return e()},is:u,isSome:u,isNone:a,getOr:l,getOrThunk:f,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:d(null),getOrUndefined:d(undefined),or:l,orThunk:f,map:n,each:e,bind:n,exists:u,forall:a,filter:n,equals:s,equals_:s,toArray:function(){return[]},toString:d("none()")},Object.freeze&&Object.freeze(t),t);function s(e){return e.isNone()}function f(e){return e()}function l(e){return e}var m=function(t){function e(){return o}function n(e){return e(t)}var r=d(t),o={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:a,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return m(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?o:c},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(u,function(e){return n(t,e)})}};return o},p={some:m,none:n,from:function(e){return null===e||e===undefined?c:m(e)}};function h(e,n){return y(v.document.createElement("canvas"),e,n)}function g(e){var n=h(e.width,e.height);return w(n).drawImage(e,0,0),n}function w(e){return e.getContext("2d")}function y(e,n,t){return e.width=n,e.height=t,e}var b,O,E=window.Promise?window.Promise:(b=T.immediateFn||"function"==typeof window.setImmediate&&window.setImmediate||function(e){v.setTimeout(e,1)},O=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},T.prototype["catch"]=function(e){return this.then(null,e)},T.prototype.then=function(t,r){var o=this;return new T(function(e,n){N.call(o,new R(t,r,e,n))})},T.all=function(){for(var e=[],n=0;n 0) { + global$4.each(selectorGroups, function (group) { + var menuItem = processSelector(selector, group); + if (menuItem) { + model.addItemToGroup(group.title, menuItem); + } + }); + } else { + var menuItem = processSelector(selector, null); + if (menuItem) { + model.addItem(menuItem); + } + } + } + } + }); + var items = model.toFormats(); + editor.fire('addStyleModifications', { + items: items, + replace: !Settings.shouldAppend(editor) + }); + }); + }; + var ImportCss = { + defaultConvertSelectorToFormat: defaultConvertSelectorToFormat, + setup: setup + }; + + var get = function (editor) { + var convertSelectorToFormat = function (selectorText) { + return ImportCss.defaultConvertSelectorToFormat(editor, selectorText); + }; + return { convertSelectorToFormat: convertSelectorToFormat }; + }; + var Api = { get: get }; + + function Plugin () { + global.add('importcss', function (editor) { + ImportCss.setup(editor); + return Api.get(editor); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/importcss/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 0000000..d13c4f8 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function t(){}function n(t){return function(){return t}}function e(){return h}var r,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),f=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),m=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(t){return t.getParam("importcss_merge_classes")},i=function(t){return t.getParam("importcss_exclusive")},p=function(t){return t.getParam("importcss_selector_converter")},g=function(t){return t.getParam("importcss_selector_filter")},y=function(t){return t.getParam("importcss_groups")},v=function(t){return t.getParam("importcss_append")},d=function(t){return t.getParam("importcss_file_filter")},u=n(!1),s=n(!0),h=(r={fold:function(t,n){return t()},is:u,isSome:u,isNone:s,getOr:O,getOrThunk:x,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:n(null),getOrUndefined:n(undefined),or:O,orThunk:x,map:e,each:t,bind:e,exists:u,forall:s,filter:e,equals:_,equals_:_,toArray:function(){return[]},toString:n("none()")},Object.freeze&&Object.freeze(r),r);function _(t){return t.isNone()}function x(t){return t()}function O(t){return t}function T(n){return function(t){return function(t){if(null===t)return"null";var n=typeof t;return"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n}(t)===n}}function b(t,n){return function(t){for(var n=[],e=0,r=t.length;e', + tooltip: pluginName, + onAction: function () { + doAct(); + } + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/indent2em/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/indent2em/plugin.min.js new file mode 100644 index 0000000..5e8c8db --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/indent2em/plugin.min.js @@ -0,0 +1,47 @@ +tinymce.PluginManager.add('indent2em', function(editor, url) { + var pluginName='首行缩进'; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var indent2em_val = editor.getParam('indent2em_val', '2em'); + var doAct = function () { + var dom = editor.dom; + var blocks = editor.selection.getSelectedBlocks(); + var act = ''; + global$1.each(blocks, function (block) { + if(act==''){ + act = dom.getStyle(block,'text-indent')==indent2em_val ? 'remove' : 'add'; + } + if( act=='add' ){ + dom.setStyle(block, 'text-indent', indent2em_val); + }else{ + var style=dom.getAttrib(block,'style'); + style = style.replace(/text-indent:[\s]*2em;/ig,''); + dom.setAttrib(block,'style',style); + } + + }); + }; + + editor.ui.registry.addButton('indent2em', { + text: '', + tooltip: pluginName, + onAction: function () { + doAct(); + } + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.js new file mode 100644 index 0000000..d2d32e3 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.js @@ -0,0 +1,198 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var getDateFormat = function (editor) { + return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d')); + }; + var getTimeFormat = function (editor) { + return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S')); + }; + var getFormats = function (editor) { + return editor.getParam('insertdatetime_formats', [ + '%H:%M:%S', + '%Y-%m-%d', + '%I:%M:%S %p', + '%D' + ]); + }; + var getDefaultDateTime = function (editor) { + var formats = getFormats(editor); + return formats.length > 0 ? formats[0] : getTimeFormat(editor); + }; + var shouldInsertTimeElement = function (editor) { + return editor.getParam('insertdatetime_element', false); + }; + var Settings = { + getDateFormat: getDateFormat, + getTimeFormat: getTimeFormat, + getFormats: getFormats, + getDefaultDateTime: getDefaultDateTime, + shouldInsertTimeElement: shouldInsertTimeElement + }; + + var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + var monthsLong = 'January February March April May June July August September October November December'.split(' '); + var addZeros = function (value, len) { + value = '' + value; + if (value.length < len) { + for (var i = 0; i < len - value.length; i++) { + value = '0' + value; + } + } + return value; + }; + var getDateTime = function (editor, fmt, date) { + date = date || new Date(); + fmt = fmt.replace('%D', '%m/%d/%Y'); + fmt = fmt.replace('%r', '%I:%M:%S %p'); + fmt = fmt.replace('%Y', '' + date.getFullYear()); + fmt = fmt.replace('%y', '' + date.getYear()); + fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); + fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); + fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); + fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); + fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); + fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); + fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); + fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); + fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); + fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); + fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); + fmt = fmt.replace('%%', '%'); + return fmt; + }; + var updateElement = function (editor, timeElm, computerTime, userTime) { + var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + timeElm.parentNode.insertBefore(newTimeElm, timeElm); + editor.dom.remove(timeElm); + editor.selection.select(newTimeElm, true); + editor.selection.collapse(false); + }; + var insertDateTime = function (editor, format) { + if (Settings.shouldInsertTimeElement(editor)) { + var userTime = getDateTime(editor, format); + var computerTime = void 0; + if (/%[HMSIp]/.test(format)) { + computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); + } else { + computerTime = getDateTime(editor, '%Y-%m-%d'); + } + var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + if (timeElm) { + updateElement(editor, timeElm, computerTime, userTime); + } else { + editor.insertContent(''); + } + } else { + editor.insertContent(getDateTime(editor, format)); + } + }; + var Actions = { + insertDateTime: insertDateTime, + getDateTime: getDateTime + }; + + var register = function (editor) { + editor.addCommand('mceInsertDate', function () { + Actions.insertDateTime(editor, Settings.getDateFormat(editor)); + }); + editor.addCommand('mceInsertTime', function () { + Actions.insertDateTime(editor, Settings.getTimeFormat(editor)); + }); + }; + var Commands = { register: register }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var register$1 = function (editor) { + var formats = Settings.getFormats(editor); + var defaultFormat = Cell(Settings.getDefaultDateTime(editor)); + editor.ui.registry.addSplitButton('insertdatetime', { + icon: 'insert-time', + tooltip: 'Insert date/time', + select: function (value) { + return value === defaultFormat.get(); + }, + fetch: function (done) { + done(global$1.map(formats, function (format) { + return { + type: 'choiceitem', + text: Actions.getDateTime(editor, format), + value: format + }; + })); + }, + onAction: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + Actions.insertDateTime(editor, defaultFormat.get()); + }, + onItemAction: function (_, value) { + defaultFormat.set(value); + Actions.insertDateTime(editor, value); + } + }); + var makeMenuItemHandler = function (format) { + return function () { + defaultFormat.set(format); + Actions.insertDateTime(editor, format); + }; + }; + editor.ui.registry.addNestedMenuItem('insertdatetime', { + icon: 'insert-time', + text: 'Date/time', + getSubmenuItems: function () { + return global$1.map(formats, function (format) { + return { + type: 'menuitem', + text: Actions.getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + }; + }); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('insertdatetime', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 0000000..ce65a55 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function n(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))}function r(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])}function a(e,t){if((e=""+e).length'+n+"")}else e.insertContent(i(e,t))},g=i,y=function(e){e.addCommand("mceInsertDate",function(){p(e,t(e))}),e.addCommand("mceInsertTime",function(){p(e,o(e))})},M=tinymce.util.Tools.resolve("tinymce.util.Tools"),S=function(e){function t(){return n}var n=e;return{get:t,set:function(e){n=e},clone:function(){return S(t())}}},v=function(n){var t=u(n),r=S(c(n));n.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===r.get()},fetch:function(e){e(M.map(t,function(e){return{type:"choiceitem",text:g(n,e),value:e}}))},onAction:function(){for(var e=[],t=0;t -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var hasProtocol = function (url) { + return /^\w+:/i.test(url); + }; + var getHref = function (elm) { + var href = elm.getAttribute('data-mce-href'); + return href ? href : elm.getAttribute('href'); + }; + var applyRelTargetRules = function (rel, isUnsafe) { + var rules = ['noopener']; + var rels = rel ? rel.split(/\s+/) : []; + var toString = function (rels) { + return global$3.trim(rels.sort().join(' ')); + }; + var addTargetRules = function (rels) { + rels = removeTargetRules(rels); + return rels.length > 0 ? rels.concat(rules) : rules; + }; + var removeTargetRules = function (rels) { + return rels.filter(function (val) { + return global$3.inArray(rules, val) === -1; + }); + }; + var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + return newRels.length > 0 ? toString(newRels) : ''; + }; + var trimCaretContainers = function (text) { + return text.replace(/\uFEFF/g, ''); + }; + var getAnchorElement = function (editor, selectedElm) { + selectedElm = selectedElm || editor.selection.getNode(); + if (isImageFigure(selectedElm)) { + return editor.dom.select('a[href]', selectedElm)[0]; + } else { + return editor.dom.getParent(selectedElm, 'a[href]'); + } + }; + var getAnchorText = function (selection, anchorElm) { + var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + return trimCaretContainers(text); + }; + var isLink = function (elm) { + return elm && elm.nodeName === 'A' && !!elm.href; + }; + var hasLinks = function (elements) { + return global$3.grep(elements, isLink).length > 0; + }; + var isOnlyTextSelected = function (html) { + if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) { + return false; + } + return true; + }; + var isImageFigure = function (elm) { + return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + }; + var getLinkAttrs = function (data) { + return foldl([ + 'title', + 'rel', + 'class', + 'target' + ], function (acc, key) { + data[key].each(function (value) { + acc[key] = value.length > 0 ? value : null; + }); + return acc; + }, { href: data.href }); + }; + var handleExternalTargets = function (href, assumeExternalTargets) { + if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { + return assumeExternalTargets + '://' + href; + } + return href; + }; + var applyLinkOverrides = function (editor, linkAttrs) { + var newLinkAttrs = __assign({}, linkAttrs); + if (!(Settings.getRelList(editor).length > 0) && Settings.allowUnsafeLinkTarget(editor) === false) { + var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + newLinkAttrs.rel = newRel ? newRel : null; + } + if (Option.from(newLinkAttrs.target).isNone() && Settings.getTargetList(editor) === false) { + newLinkAttrs.target = Settings.getDefaultLinkTarget(editor); + } + newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, Settings.assumeExternalTargets(editor)); + return newLinkAttrs; + }; + var updateLink = function (editor, anchorElm, text, linkAttrs) { + text.each(function (text) { + if (anchorElm.hasOwnProperty('innerText')) { + anchorElm.innerText = text; + } else { + anchorElm.textContent = text; + } + }); + editor.dom.setAttribs(anchorElm, linkAttrs); + editor.selection.select(anchorElm); + }; + var createLink = function (editor, selectedElm, text, linkAttrs) { + if (isImageFigure(selectedElm)) { + linkImageFigure(editor, selectedElm, linkAttrs); + } else { + text.fold(function () { + editor.execCommand('mceInsertLink', false, linkAttrs); + }, function (text) { + editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }); + } + }; + var link = function (editor, attachState, data) { + var selectedElm = editor.selection.getNode(); + var anchorElm = getAnchorElement(editor, selectedElm); + var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(function () { + if (data.href === attachState.href) { + attachState.attach(); + } + if (anchorElm) { + editor.focus(); + updateLink(editor, anchorElm, data.text, linkAttrs); + } else { + createLink(editor, selectedElm, data.text, linkAttrs); + } + }); + }; + var unlink = function (editor) { + editor.undoManager.transact(function () { + var node = editor.selection.getNode(); + if (isImageFigure(node)) { + unlinkImageFigure(editor, node); + } else { + var anchorElm = editor.dom.getParent(node, 'a[href]', editor.getBody()); + if (anchorElm) { + editor.dom.remove(anchorElm, true); + } + } + editor.focus(); + }); + }; + var unlinkImageFigure = function (editor, fig) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + if (a) { + a.parentNode.insertBefore(img, a); + editor.dom.remove(a); + } + } + }; + var linkImageFigure = function (editor, fig, attrs) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.create('a', attrs); + img.parentNode.insertBefore(a, img); + a.appendChild(img); + } + }; + var Utils = { + link: link, + unlink: unlink, + isLink: isLink, + hasLinks: hasLinks, + getHref: getHref, + isOnlyTextSelected: isOnlyTextSelected, + getAnchorElement: getAnchorElement, + getAnchorText: getAnchorText, + applyRelTargetRules: applyRelTargetRules, + hasProtocol: hasProtocol + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$3.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) ; else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizeWith = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + }; + }; + var sanitize = function (list) { + return sanitizeWith(getValue)(list); + }; + var createUi = function (name, label) { + return function (items) { + return { + name: name, + type: 'selectbox', + label: label, + items: items + }; + }; + }; + var ListOptions = { + sanitize: sanitize, + sanitizeWith: sanitizeWith, + createUi: createUi, + getValue: getValue + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone + }; + }; + + var findTextByValue = function (value, catalog) { + return findMap(catalog, function (item) { + return Option.some(item).filter(function (i) { + return i.value === value; + }); + }); + }; + var getDelta = function (persistentText, fieldName, catalog, data) { + var value = data[fieldName]; + var hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(function (i) { + return { + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + }; + }) : Option.none(); + }; + var findCatalog = function (settings, fieldName) { + if (fieldName === 'link') { + return settings.catalogs.link; + } else if (fieldName === 'anchor') { + return settings.catalogs.anchor; + } else { + return Option.none(); + } + }; + var init = function (initialData, linkSettings) { + var persistentText = Cell(initialData.text); + var onUrlChange = function (data) { + if (persistentText.get().length <= 0) { + var urlText = data.url.meta.text !== undefined ? data.url.meta.text : data.url.value; + var urlTitle = data.url.meta.title !== undefined ? data.url.meta.title : ''; + return Option.some({ + text: urlText, + title: urlTitle + }); + } else { + return Option.none(); + } + }; + var onCatalogChange = function (data, change) { + var catalog = findCatalog(linkSettings, change.name).getOr([]); + return getDelta(persistentText.get(), change.name, catalog, data); + }; + var onChange = function (getData, change) { + if (change.name === 'url') { + return onUrlChange(getData()); + } else if (contains([ + 'anchor', + 'link' + ], change.name)) { + return onCatalogChange(getData(), change); + } else if (change.name === 'text') { + persistentText.set(getData().text); + return Option.none(); + } else { + return Option.none(); + } + }; + return { onChange: onChange }; + }; + var DialogChanges = { + init: init, + getDelta: getDelta + }; + + var exports$1 = {}, module = { exports: exports$1 }; + (function (define, exports, module, require) { + (function (f) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = f(); + } else if (typeof define === 'function' && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== 'undefined') { + g = window; + } else if (typeof global !== 'undefined') { + g = global; + } else if (typeof self !== 'undefined') { + g = self; + } else { + g = this; + } + g.EphoxContactWrapper = f(); + } + }(function () { + return function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) + return c(i, !0); + if (u) + return u(i, !0); + var a = new Error('Cannot find module \'' + i + '\''); + throw a.code = 'MODULE_NOT_FOUND', a; + } + var p = n[i] = { exports: {} }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) + o(t[i]); + return o; + } + return r; + }()({ + 1: [ + function (require, module, exports) { + var process = module.exports = {}; + var cachedSetTimeout; + var cachedClearTimeout; + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + }()); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + return setTimeout(fun, 0); + } + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + return clearTimeout(marker); + } + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + return cachedClearTimeout(marker); + } catch (e) { + try { + return cachedClearTimeout.call(null, marker); + } catch (e) { + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; + process.versions = {}; + function noop() { + } + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + process.listeners = function (name) { + return []; + }; + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + process.cwd = function () { + return '/'; + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + }, + {} + ], + 2: [ + function (require, module, exports) { + (function (setImmediate) { + (function (root) { + var setTimeoutFunc = setTimeout; + function noop() { + } + function bind(fn, thisArg) { + return function () { + fn.apply(thisArg, arguments); + }; + } + function Promise(fn) { + if (typeof this !== 'object') + throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') + throw new TypeError('not a function'); + this._state = 0; + this._handled = false; + this._value = undefined; + this._deferreds = []; + doResolve(fn, this); + } + function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + Promise._immediateFn(function () { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + resolve(deferred.promise, ret); + }); + } + function resolve(self, newValue) { + try { + if (newValue === self) + throw new TypeError('A promise cannot be resolved with itself.'); + if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } + } + function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); + } + function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function () { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); + } + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; + } + function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; + } + function doResolve(fn, self) { + var done = false; + try { + fn(function (value) { + if (done) + return; + done = true; + resolve(self, value); + }, function (reason) { + if (done) + return; + done = true; + reject(self, reason); + }); + } catch (ex) { + if (done) + return; + done = true; + reject(self, ex); + } + } + Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); + }; + Promise.prototype.then = function (onFulfilled, onRejected) { + var prom = new this.constructor(noop); + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; + }; + Promise.all = function (arr) { + var args = Array.prototype.slice.call(arr); + return new Promise(function (resolve, reject) { + if (args.length === 0) + return resolve([]); + var remaining = args.length; + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, reject); + return; + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + }; + Promise.resolve = function (value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } + return new Promise(function (resolve) { + resolve(value); + }); + }; + Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); + }; + Promise.race = function (values) { + return new Promise(function (resolve, reject) { + for (var i = 0, len = values.length; i < len; i++) { + values[i].then(resolve, reject); + } + }); + }; + Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { + setImmediate(fn); + } : function (fn) { + setTimeoutFunc(fn, 0); + }; + Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); + } + }; + Promise._setImmediateFn = function _setImmediateFn(fn) { + Promise._immediateFn = fn; + }; + Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { + Promise._unhandledRejectionFn = fn; + }; + if (typeof module !== 'undefined' && module.exports) { + module.exports = Promise; + } else if (!root.Promise) { + root.Promise = Promise; + } + }(this)); + }.call(this, require('timers').setImmediate)); + }, + { 'timers': 3 } + ], + 3: [ + function (require, module, exports) { + (function (setImmediate, clearImmediate) { + var nextTick = require('process/browser.js').nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + exports.setTimeout = function () { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); + }; + exports.setInterval = function () { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); + }; + exports.clearTimeout = exports.clearInterval = function (timeout) { + timeout.close(); + }; + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function () { + }; + Timeout.prototype.close = function () { + this._clearFn.call(window, this._id); + }; + exports.enroll = function (item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + exports.unenroll = function (item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + exports._unrefActive = exports.active = function (item) { + clearTimeout(item._idleTimeoutId); + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } + }; + exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + immediateIds[id] = true; + nextTick(function onNextTick() { + if (immediateIds[id]) { + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + exports.clearImmediate(id); + } + }); + return id; + }; + exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) { + delete immediateIds[id]; + }; + }.call(this, require('timers').setImmediate, require('timers').clearImmediate)); + }, + { + 'process/browser.js': 1, + 'timers': 3 + } + ], + 4: [ + function (require, module, exports) { + var promisePolyfill = require('promise-polyfill'); + var Global = function () { + if (typeof window !== 'undefined') { + return window; + } else { + return Function('return this;')(); + } + }(); + module.exports = { boltExport: Global.Promise || promisePolyfill }; + }, + { 'promise-polyfill': 2 } + ] + }, {}, [4])(4); + })); + }(undefined, exports$1, module, undefined)); + var Promise = module.exports.boltExport; + + var nu = function (baseFn) { + var data = Option.none(); + var callbacks = []; + var map = function (f) { + return nu(function (nCallback) { + get(function (data) { + nCallback(f(data)); + }); + }); + }; + var get = function (nCallback) { + if (isReady()) { + call(nCallback); + } else { + callbacks.push(nCallback); + } + }; + var set = function (x) { + data = Option.some(x); + run(callbacks); + callbacks = []; + }; + var isReady = function () { + return data.isSome(); + }; + var run = function (cbs) { + each(cbs, call); + }; + var call = function (cb) { + data.each(function (x) { + domGlobals.setTimeout(function () { + cb(x); + }, 0); + }); + }; + baseFn(set); + return { + get: get, + map: map, + isReady: isReady + }; + }; + var pure = function (a) { + return nu(function (callback) { + callback(a); + }); + }; + var LazyValue = { + nu: nu, + pure: pure + }; + + var errorReporter = function (err) { + domGlobals.setTimeout(function () { + throw err; + }, 0); + }; + var make = function (run) { + var get = function (callback) { + run().then(callback, errorReporter); + }; + var map = function (fab) { + return make(function () { + return run().then(fab); + }); + }; + var bind = function (aFutureB) { + return make(function () { + return run().then(function (v) { + return aFutureB(v).toPromise(); + }); + }); + }; + var anonBind = function (futureB) { + return make(function () { + return run().then(function () { + return futureB.toPromise(); + }); + }); + }; + var toLazy = function () { + return LazyValue.nu(get); + }; + var toCached = function () { + var cache = null; + return make(function () { + if (cache === null) { + cache = run(); + } + return cache; + }); + }; + var toPromise = run; + return { + map: map, + bind: bind, + anonBind: anonBind, + toLazy: toLazy, + toCached: toCached, + toPromise: toPromise, + get: get + }; + }; + var nu$1 = function (baseFn) { + return make(function () { + return new Promise(baseFn); + }); + }; + var pure$1 = function (a) { + return make(function () { + return Promise.resolve(a); + }); + }; + var Future = { + nu: nu$1, + pure: pure$1 + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var delayedConfirm = function (editor, message, callback) { + var rng = editor.selection.getRng(); + global$4.setEditorTimeout(editor, function () { + editor.windowManager.confirm(message, function (state) { + editor.selection.setRng(rng); + callback(state); + }); + }); + }; + var tryEmailTransform = function (data) { + var url = data.href; + var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('//') === -1 && url.indexOf('mailto:') === -1; + return suggestMailTo ? Option.some({ + message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: 'mailto:' + url }); + } + }) : Option.none(); + }; + var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { + return function (data) { + var url = data.href; + var suggestProtocol = assumeExternalTargets === 1 && !Utils.hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www[\.|\d\.]/i.test(url); + return suggestProtocol ? Option.some({ + message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); + } + }) : Option.none(); + }; + }; + var preprocess = function (editor, data) { + return findMap([ + tryEmailTransform, + tryProtocolTransform(Settings.assumeExternalTargets(editor), Settings.getDefaultLinkProtocol(editor)) + ], function (f) { + return f(data); + }).fold(function () { + return Future.pure(data); + }, function (transform) { + return Future.nu(function (callback) { + delayedConfirm(editor, transform.message, function (state) { + callback(state ? transform.preprocess(data) : data); + }); + }); + }); + }; + var DialogConfirms = { preprocess: preprocess }; + + var getAnchors = function (editor) { + var anchorNodes = editor.dom.select('a:not([href])'); + var anchors = bind(anchorNodes, function (anchor) { + var id = anchor.name || anchor.id; + return id ? [{ + text: id, + value: '#' + id + }] : []; + }); + return anchors.length > 0 ? Option.some([{ + text: 'None', + value: '' + }].concat(anchors)) : Option.none(); + }; + var AnchorListOptions = { getAnchors: getAnchors }; + + var getClasses = function (editor) { + var list = Settings.getLinkClassList(editor); + if (list.length > 0) { + return ListOptions.sanitize(list); + } + return Option.none(); + }; + var ClassListOptions = { getClasses: getClasses }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseJson = function (text) { + try { + return Option.some(JSON.parse(text)); + } catch (err) { + return Option.none(); + } + }; + var getLinks = function (editor) { + var extractor = function (item) { + return editor.convertURL(item.value || item.url, 'href'); + }; + var linkList = Settings.getLinkList(editor); + return Future.nu(function (callback) { + if (isString(linkList)) { + global$5.send({ + url: linkList, + success: function (text) { + return callback(parseJson(text)); + }, + error: function (_) { + return callback(Option.none()); + } + }); + } else if (isFunction(linkList)) { + linkList(function (output) { + return callback(Option.some(output)); + }); + } else { + callback(Option.from(linkList)); + } + }).map(function (optItems) { + return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { + if (items.length > 0) { + return [{ + text: 'None', + value: '' + }].concat(items); + } else { + return items; + } + }); + }); + }; + var LinkListOptions = { getLinks: getLinks }; + + var getRels = function (editor, initialTarget) { + var list = Settings.getRelList(editor); + if (list.length > 0) { + var isTargetBlank_1 = initialTarget.is('_blank'); + var enforceSafe = Settings.allowUnsafeLinkTarget(editor) === false; + var safeRelExtractor = function (item) { + return Utils.applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); + }; + var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + return sanitizer(list); + } + return Option.none(); + }; + var RelOptions = { getRels: getRels }; + + var fallbacks = [ + { + text: 'Current window', + value: '' + }, + { + text: 'New window', + value: '_blank' + } + ]; + var getTargets = function (editor) { + var list = Settings.getTargetList(editor); + if (isArray(list)) { + return ListOptions.sanitize(list).orThunk(function () { + return Option.some(fallbacks); + }); + } else if (list === false) { + return Option.none(); + } + return Option.some(fallbacks); + }; + var TargetOptions = { getTargets: getTargets }; + + var nonEmptyAttr = function (dom, elem, name) { + var val = dom.getAttrib(elem, name); + return val !== null && val.length > 0 ? Option.some(val) : Option.none(); + }; + var extractFromAnchor = function (editor, anchor) { + var dom = editor.dom; + var onlyText = Utils.isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(Utils.getAnchorText(editor.selection, anchor)) : Option.none(); + var url = anchor ? Option.some(dom.getAttrib(anchor, 'href')) : Option.none(); + var target = anchor ? Option.from(dom.getAttrib(anchor, 'target')) : Option.none(); + var rel = nonEmptyAttr(dom, anchor, 'rel'); + var linkClass = nonEmptyAttr(dom, anchor, 'class'); + var title = nonEmptyAttr(dom, anchor, 'title'); + return { + url: url, + text: text, + title: title, + target: target, + rel: rel, + linkClass: linkClass + }; + }; + var collect = function (editor, linkNode) { + return LinkListOptions.getLinks(editor).map(function (links) { + var anchor = extractFromAnchor(editor, linkNode); + return { + anchor: anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: Option.from(linkNode), + flags: { titleEnabled: Settings.shouldShowLinkTitle(editor) } + }; + }); + }; + var DialogInfo = { collect: collect }; + + var handleSubmit = function (editor, info) { + return function (api) { + var data = api.getData(); + if (!data.url.value) { + Utils.unlink(editor); + api.close(); + return; + } + var getChangedValue = function (key) { + return Option.from(data[key]).filter(function (value) { + return !info.anchor[key].is(value); + }); + }; + var changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + var attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () { + } + }; + DialogConfirms.preprocess(editor, changedData).get(function (pData) { + Utils.link(editor, attachState, pData); + }); + api.close(); + }; + }; + var collectData = function (editor) { + var anchorNode = Utils.getAnchorElement(editor); + return DialogInfo.collect(editor, anchorNode); + }; + var getInitialData = function (info, defaultTarget) { + return { + url: { + value: info.anchor.url.getOr(''), + meta: { + attach: function () { + }, + text: info.anchor.url.fold(function () { + return ''; + }, function () { + return info.anchor.text.getOr(''); + }), + original: { value: info.anchor.url.getOr('') } + } + }, + text: info.anchor.text.getOr(''), + title: info.anchor.title.getOr(''), + anchor: info.anchor.url.getOr(''), + link: info.anchor.url.getOr(''), + rel: info.anchor.rel.getOr(''), + target: info.anchor.target.or(defaultTarget).getOr(''), + linkClass: info.anchor.linkClass.getOr('') + }; + }; + var makeDialog = function (settings, onSubmit, editor) { + var urlInput = [{ + name: 'url', + type: 'urlinput', + filetype: 'file', + label: 'URL' + }]; + var displayText = settings.anchor.text.map(function () { + return { + name: 'text', + type: 'input', + label: 'Text to display' + }; + }).toArray(); + var titleText = settings.flags.titleEnabled ? [{ + name: 'title', + type: 'input', + label: 'Title' + }] : []; + var defaultTarget = Option.from(Settings.getDefaultLinkTarget(editor)); + var initialData = getInitialData(settings, defaultTarget); + var dialogDelta = DialogChanges.init(initialData, settings); + var catalogs = settings.catalogs; + var body = { + type: 'panel', + items: flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]) + }; + return { + title: 'Insert/Edit Link', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onChange: function (api, _a) { + var name = _a.name; + dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + api.setData(newData); + }); + }, + onSubmit: onSubmit + }; + }; + var open$1 = function (editor) { + var data = collectData(editor); + data.map(function (info) { + var onSubmit = handleSubmit(editor, info); + return makeDialog(info, onSubmit, editor); + }).get(function (spec) { + editor.windowManager.open(spec); + }); + }; + var Dialog = { open: open$1 }; + + var getLink = function (editor, elm) { + return editor.dom.getParent(elm, 'a[href]'); + }; + var getSelectedLink = function (editor) { + return getLink(editor, editor.selection.getStart()); + }; + var hasOnlyAltModifier = function (e) { + return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; + }; + var gotoLink = function (editor, a) { + if (a) { + var href = Utils.getHref(a); + if (/^#/.test(href)) { + var targetEl = editor.$(href); + if (targetEl.length) { + editor.selection.scrollIntoView(targetEl[0], true); + } + } else { + OpenUrl.open(a.href); + } + } + }; + var openDialog = function (editor) { + return function () { + Dialog.open(editor); + }; + }; + var gotoSelectedLink = function (editor) { + return function () { + gotoLink(editor, getSelectedLink(editor)); + }; + }; + var leftClickedOnAHref = function (editor) { + return function (elm) { + var sel, rng, node; + if (Settings.hasContextToolbar(editor) && Utils.isLink(elm)) { + sel = editor.selection; + rng = sel.getRng(); + node = rng.startContainer; + if (node.nodeType === 3 && sel.isCollapsed() && rng.startOffset > 0 && rng.startOffset < node.data.length) { + return true; + } + } + return false; + }; + }; + var setupGotoLinks = function (editor) { + editor.on('click', function (e) { + var link = getLink(editor, e.target); + if (link && global$2.metaKeyPressed(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + editor.on('keydown', function (e) { + var link = getSelectedLink(editor); + if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + }; + var toggleActiveState = function (editor) { + return function (api) { + var nodeChangeHandler = function (e) { + return api.setActive(!editor.readonly && !!Utils.getAnchorElement(editor, e.element)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var toggleEnabledState = function (editor) { + return function (api) { + api.setDisabled(!Utils.hasLinks(editor.dom.getParents(editor.selection.getStart()))); + var nodeChangeHandler = function (e) { + return api.setDisabled(!Utils.hasLinks(e.parents)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var Actions = { + openDialog: openDialog, + gotoSelectedLink: gotoSelectedLink, + leftClickedOnAHref: leftClickedOnAHref, + setupGotoLinks: setupGotoLinks, + toggleActiveState: toggleActiveState, + toggleEnabledState: toggleEnabledState + }; + + var register = function (editor) { + editor.addCommand('mceLink', function () { + if (Settings.useQuickLink(editor)) { + editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } else { + Actions.openDialog(editor)(); + } + }); + }; + var Commands = { register: register }; + + var setup = function (editor) { + editor.addShortcut('Meta+K', '', function () { + editor.execCommand('mceLink'); + }); + }; + var Keyboard = { setup: setup }; + + var setupButtons = function (editor) { + editor.ui.registry.addToggleButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + onAction: Actions.openDialog(editor), + onSetup: Actions.toggleActiveState(editor) + }); + editor.ui.registry.addButton('openlink', { + icon: 'new-tab', + tooltip: 'Open link', + onAction: Actions.gotoSelectedLink(editor), + onSetup: Actions.toggleEnabledState(editor) + }); + editor.ui.registry.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + onAction: function () { + return Utils.unlink(editor); + }, + onSetup: Actions.toggleEnabledState(editor) + }); + }; + var setupMenuItems = function (editor) { + editor.ui.registry.addMenuItem('openlink', { + text: 'Open link', + icon: 'new-tab', + onAction: Actions.gotoSelectedLink(editor), + onSetup: Actions.toggleEnabledState(editor) + }); + editor.ui.registry.addMenuItem('link', { + icon: 'link', + text: 'Link...', + shortcut: 'Meta+K', + onAction: Actions.openDialog(editor) + }); + editor.ui.registry.addMenuItem('unlink', { + icon: 'unlink', + text: 'Remove link', + onAction: function () { + return Utils.unlink(editor); + }, + onSetup: Actions.toggleEnabledState(editor) + }); + }; + var setupContextMenu = function (editor) { + var inLink = 'link unlink openlink'; + var noLink = 'link'; + editor.ui.registry.addContextMenu('link', { + update: function (element) { + return Utils.hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; + } + }); + }; + var setupContextToolbars = function (editor) { + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var onSetupLink = function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setDisabled(!Utils.getAnchorElement(editor, node)); + return function () { + }; + }; + editor.ui.registry.addContextForm('quicklink', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + onSetup: Actions.toggleActiveState(editor) + }, + label: 'Link', + predicate: function (node) { + return !!Utils.getAnchorElement(editor, node) && Settings.hasContextToolbar(editor); + }, + initValue: function () { + var elm = Utils.getAnchorElement(editor); + return !!elm ? Utils.getHref(elm) : ''; + }, + commands: [ + { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + primary: true, + onSetup: function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setActive(!!Utils.getAnchorElement(editor, node)); + return Actions.toggleActiveState(editor)(buttonApi); + }, + onAction: function (formApi) { + var anchor = Utils.getAnchorElement(editor); + var value = formApi.getValue(); + if (!anchor) { + var attachState = { + href: value, + attach: function () { + } + }; + var onlyText = Utils.isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(Utils.getAnchorText(editor.selection, anchor)).filter(function (t) { + return t.length > 0; + }).or(Option.from(value)) : Option.none(); + Utils.link(editor, attachState, { + href: value, + text: text, + title: Option.none(), + rel: Option.none(), + target: Option.none(), + class: Option.none() + }); + formApi.hide(); + } else { + editor.dom.setAttrib(anchor, 'href', value); + collapseSelectionToEnd(editor); + formApi.hide(); + } + } + }, + { + type: 'contextformbutton', + icon: 'unlink', + tooltip: 'Remove link', + onSetup: onSetupLink, + onAction: function (formApi) { + Utils.unlink(editor); + formApi.hide(); + } + }, + { + type: 'contextformbutton', + icon: 'new-tab', + tooltip: 'Open link', + onSetup: onSetupLink, + onAction: function (formApi) { + Actions.gotoSelectedLink(editor)(); + formApi.hide(); + } + } + ] + }); + }; + var Controls = { + setupButtons: setupButtons, + setupMenuItems: setupMenuItems, + setupContextMenu: setupContextMenu, + setupContextToolbars: setupContextToolbars + }; + + function Plugin () { + global$1.add('link', function (editor) { + Controls.setupButtons(editor); + Controls.setupMenuItems(editor); + Controls.setupContextMenu(editor); + Controls.setupContextToolbars(editor); + Actions.setupGotoLinks(editor); + Commands.register(editor); + Keyboard.setup(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/link/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/link/plugin.min.js new file mode 100644 index 0000000..000ff86 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(c){"use strict";function n(t){return function(n){return function(n){if(null===n)return"null";var t=typeof n;return"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t}(n)===t}}function u(){}function i(n){return function(){return n}}function t(){return C}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.util.VK"),a=n("string"),f=n("array"),l=n("boolean"),s=n("function"),d=function(n){var t=n.getParam("link_assume_external_targets",!1);return l(t)&&t?1:!a(t)||"http"!==t&&"https"!==t?0:t},m=function(n){return n.getParam("link_context_toolbar",!1,"boolean")},h=function(n){return n.getParam("link_list")},p=function(n){return n.getParam("default_link_target")},g=function(n){return n.getParam("target_list",!0)},v=function(n){return n.getParam("rel_list",[],"array")},y=function(n){return n.getParam("link_class_list",[],"array")},w=function(n){return n.getParam("link_title",!0,"boolean")},k=function(n){return n.getParam("allow_unsafe_link_target",!1,"boolean")},x=function(n){return n.getParam("link_quicklink",!1,"boolean")},b=function(n){return n.getParam("link_default_protocol","http","string")},_=function(n){var t=c.document.createElement("a");t.target="_blank",t.href=n,t.rel="noreferrer noopener";var e=c.document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!0,c.window,0,0,0,0,0,!1,!1,!1,!1,0,null),function(n,t){c.document.body.appendChild(n),n.dispatchEvent(t),c.document.body.removeChild(n)}(t,e)},T=function(){return(T=Object.assign||function(n){for(var t,e=1,r=arguments.length;e]+>[^<]+<\/a>$/.test(n)||-1===n.indexOf("href=")))},ln=U,sn=function(n,t){return function(n){return n.replace(/\uFEFF/g,"")}(t?t.innerText||t.textContent:n.getContent({format:"text"}))},dn=D,mn=R,hn={sanitize:function(n){return B(K)(n)},sanitizeWith:B,createUi:function(t,e){return function(n){return{name:t,type:"selectbox",label:e,items:n}}},getValue:K},pn=function(n){function t(){return e}var e=n;return{get:t,set:function(n){e=n},clone:function(){return pn(t())}}},gn=function(n,r){function e(n,t){var e=function(n,t){return"link"===t?n.catalogs.link:"anchor"===t?n.catalogs.anchor:X.none()}(r,t.name).getOr([]);return V(o.get(),t.name,e,n)}var o=pn(n.text);return{onChange:function(n,t){return"url"===t.name?function(n){if(o.get().length<=0){var t=n.url.meta.text!==undefined?n.url.meta.text:n.url.value,e=n.url.meta.title!==undefined?n.url.meta.title:"";return X.some({text:t,title:e})}return X.none()}(n()):I(["anchor","link"],t.name)?e(n(),t):("text"===t.name&&o.set(n().text),X.none())}}},vn={},yn={exports:vn};W=undefined,H=vn,$=yn,G=undefined,function(n){"object"==typeof H&&void 0!==$?$.exports=n():"function"==typeof W&&W.amd?W([],n):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).EphoxContactWrapper=n()}(function(){return function l(i,u,c){function a(t,n){if(!u[t]){if(!i[t]){var e="function"==typeof G&&G;if(!n&&e)return e(t,!0);if(f)return f(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=u[t]={exports:{}};i[t][0].call(o.exports,function(n){return a(i[t][1][n]||n)},o,o.exports,l,i,u,c)}return u[t].exports}for(var f="function"==typeof G&&G,n=0;n 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var ELEMENT$1 = ELEMENT; + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT$1) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = detect$3().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + var is$1 = is; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var lift2 = function (oa, ob, f) { + return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none(); + }; + + var fromElements = function (elements, scope) { + var doc = scope || domGlobals.document; + var fragment = doc.createDocumentFragment(); + each(elements, function (element) { + fragment.appendChild(element.dom()); + }); + return Element.fromDom(fragment); + }; + + var Immutable = function () { + var fields = []; + for (var _i = 0; _i < arguments.length; _i++) { + fields[_i] = arguments[_i]; + } + return function () { + var values = []; + for (var _i = 0; _i < arguments.length; _i++) { + values[_i] = arguments[_i]; + } + if (fields.length !== values.length) { + throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); + } + var struct = {}; + each(fields, function (name, i) { + struct[name] = constant(values[i]); + }); + return struct; + }; + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + var child = function (element, index) { + var cs = element.dom().childNodes; + return Option.from(cs[index]).map(Element.fromDom); + }; + var firstChild = function (element) { + return child(element, 0); + }; + var lastChild = function (element) { + return child(element, element.dom().childNodes.length - 1); + }; + var spot = Immutable('element', 'offset'); + + var before = function (marker, element) { + var parent$1 = parent(marker); + parent$1.each(function (v) { + v.dom().insertBefore(element.dom(), marker.dom()); + }); + }; + var append = function (parent, element) { + parent.dom().appendChild(element.dom()); + }; + + var before$1 = function (marker, elements) { + each(elements, function (x) { + before(marker, x); + }); + }; + var append$1 = function (parent, elements) { + each(elements, function (x) { + append(parent, x); + }); + }; + + var remove = function (element) { + var dom = element.dom(); + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + + var fireListEvent = function (editor, action, element) { + return editor.fire('ListMutation', { + action: action, + element: element + }); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var path = function (parts, scope) { + var o = scope !== undefined && scope !== null ? scope : Global; + for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { + o = o[parts[i]]; + } + return o; + }; + var resolve = function (p, scope) { + var parts = p.split('.'); + return path(parts, scope); + }; + + var unsafe = function (name, scope) { + return resolve(name, scope); + }; + var getOrDie = function (name, scope) { + var actual = unsafe(name, scope); + if (actual === undefined || actual === null) { + throw new Error(name + ' not available on this browser'); + } + return actual; + }; + var Global$1 = { getOrDie: getOrDie }; + + var htmlElement = function (scope) { + return Global$1.getOrDie('HTMLElement', scope); + }; + var isPrototypeOf = function (x) { + var scope = resolve('ownerDocument.defaultView', x); + return htmlElement(scope).prototype.isPrototypeOf(x); + }; + var HTMLElement = { isPrototypeOf: isPrototypeOf }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var isTextNode = function (node) { + return node && node.nodeType === 3; + }; + var isListNode = function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName); + }; + var isOlUlNode = function (node) { + return node && /^(OL|UL)$/.test(node.nodeName); + }; + var isListItemNode = function (node) { + return node && /^(LI|DT|DD)$/.test(node.nodeName); + }; + var isDlItemNode = function (node) { + return node && /^(DT|DD)$/.test(node.nodeName); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isBr = function (node) { + return node && node.nodeName === 'BR'; + }; + var isFirstChild = function (node) { + return node.parentNode.firstChild === node; + }; + var isLastChild = function (node) { + return node.parentNode.lastChild === node; + }; + var isTextBlock = function (editor, node) { + return node && !!editor.schema.getTextBlockElements()[node.nodeName]; + }; + var isBlock = function (node, blockElements) { + return node && node.nodeName in blockElements; + }; + var isBogusBr = function (dom, node) { + if (!isBr(node)) { + return false; + } + if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) { + return true; + } + return false; + }; + var isEmpty = function (dom, elm, keepBookmarks) { + var empty = dom.isEmpty(elm); + if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { + return false; + } + return empty; + }; + var isChildOfBody = function (dom, elm) { + return dom.isChildOf(elm, dom.getRoot()); + }; + var NodeType = { + isTextNode: isTextNode, + isListNode: isListNode, + isOlUlNode: isOlUlNode, + isDlItemNode: isDlItemNode, + isListItemNode: isListItemNode, + isTableCellNode: isTableCellNode, + isBr: isBr, + isFirstChild: isFirstChild, + isLastChild: isLastChild, + isTextBlock: isTextBlock, + isBlock: isBlock, + isBogusBr: isBogusBr, + isEmpty: isEmpty, + isChildOfBody: isChildOfBody + }; + + var getParentList = function (editor) { + var selectionStart = editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); + }; + var isParentListSelected = function (parentList, selectedBlocks) { + return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + }; + var findSubLists = function (parentList) { + return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) { + return NodeType.isListNode(elm); + }); + }; + var getSelectedSubLists = function (editor) { + var parentList = getParentList(editor); + var selectedBlocks = editor.selection.getSelectedBlocks(); + if (isParentListSelected(parentList, selectedBlocks)) { + return findSubLists(parentList); + } else { + return global$5.grep(selectedBlocks, function (elm) { + return NodeType.isListNode(elm) && parentList !== elm; + }); + } + }; + var findParentListItemsNodes = function (editor, elms) { + var listItemsElms = global$5.map(elms, function (elm) { + var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + return parentLi ? parentLi : elm; + }); + return global$4.unique(listItemsElms); + }; + var getSelectedListItems = function (editor) { + var selectedBlocks = editor.selection.getSelectedBlocks(); + return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) { + return NodeType.isListItemNode(block); + }); + }; + var getSelectedDlItems = function (editor) { + return filter(getSelectedListItems(editor), NodeType.isDlItemNode); + }; + var getClosestListRootElm = function (editor, elm) { + var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); + return root; + }; + var findLastParentListNode = function (editor, elm) { + var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + return last(parentLists); + }; + var getSelectedLists = function (editor) { + var firstList = findLastParentListNode(editor, editor.selection.getStart()); + var subsequentLists = filter(editor.selection.getSelectedBlocks(), NodeType.isOlUlNode); + return firstList.toArray().concat(subsequentLists); + }; + var getSelectedListRoots = function (editor) { + var selectedLists = getSelectedLists(editor); + return getUniqueListRoots(editor, selectedLists); + }; + var getUniqueListRoots = function (editor, lists) { + var listRoots = map(lists, function (list) { + return findLastParentListNode(editor, list).getOr(list); + }); + return global$4.unique(listRoots); + }; + var isList = function (editor) { + var list = getParentList(editor); + return HTMLElement.isPrototypeOf(list); + }; + var Selection = { + isList: isList, + getParentList: getParentList, + getSelectedSubLists: getSelectedSubLists, + getSelectedListItems: getSelectedListItems, + getClosestListRootElm: getClosestListRootElm, + getSelectedDlItems: getSelectedDlItems, + getSelectedListRoots: getSelectedListRoots + }; + + var shouldIndentOnTab = function (editor) { + return editor.getParam('lists_indent_on_tab', true); + }; + var getForcedRootBlock = function (editor) { + var block = editor.getParam('forced_root_block', 'p'); + if (block === false) { + return ''; + } else if (block === true) { + return 'p'; + } else { + return block; + } + }; + var getForcedRootBlockAttrs = function (editor) { + return editor.getParam('forced_root_block_attrs', {}); + }; + var Settings = { + shouldIndentOnTab: shouldIndentOnTab, + getForcedRootBlock: getForcedRootBlock, + getForcedRootBlockAttrs: getForcedRootBlockAttrs + }; + + var createTextBlock = function (editor, contentNode) { + var dom = editor.dom; + var blockElements = editor.schema.getBlockElements(); + var fragment = dom.createFragment(); + var blockName = Settings.getForcedRootBlock(editor); + var node, textBlock, hasContentNode; + if (blockName) { + textBlock = dom.create(blockName); + if (textBlock.tagName === blockName.toUpperCase()) { + dom.setAttribs(textBlock, Settings.getForcedRootBlockAttrs(editor)); + } + if (!NodeType.isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + } + if (contentNode) { + while (node = contentNode.firstChild) { + var nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; + } + if (NodeType.isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (blockName) { + if (!textBlock) { + textBlock = dom.create(blockName); + fragment.appendChild(textBlock); + } + textBlock.appendChild(node); + } else { + fragment.appendChild(node); + } + } + } + } + if (!blockName) { + fragment.appendChild(dom.create('br')); + } else { + if (!hasContentNode) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); + } + } + return fragment; + }; + + var name = function (element) { + var r = element.dom().nodeName; + return r.toLowerCase(); + }; + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var setAll = function (element, attrs) { + var dom = element.dom(); + each$1(attrs, function (v, k) { + rawSet(dom, k, v); + }); + }; + var clone = function (element) { + return foldl(element.dom().attributes, function (acc, attr) { + acc[attr.name] = attr.value; + return acc; + }, {}); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var set = function (element, property, value) { + var dom = element.dom(); + internalSet(dom, property, value); + }; + + var clone$1 = function (original, isDeep) { + return Element.fromDom(original.dom().cloneNode(isDeep)); + }; + var deep = function (original) { + return clone$1(original, true); + }; + var shallowAs = function (original, tag) { + var nu = Element.fromTag(tag); + var attributes = clone(original); + setAll(nu, attributes); + return nu; + }; + var mutate = function (original, tag) { + var nu = shallowAs(original, tag); + before(original, nu); + var children$1 = children(original); + append$1(nu, children$1); + remove(original); + return nu; + }; + + var joinSegment = function (parent, child) { + append(parent.item, child.list); + }; + var joinSegments = function (segments) { + for (var i = 1; i < segments.length; i++) { + joinSegment(segments[i - 1], segments[i]); + } + }; + var appendSegments = function (head$1, tail) { + lift2(last(head$1), head(tail), joinSegment); + }; + var createSegment = function (scope, listType) { + var segment = { + list: Element.fromTag(listType, scope), + item: Element.fromTag('li', scope) + }; + append(segment.list, segment.item); + return segment; + }; + var createSegments = function (scope, entry, size) { + var segments = []; + for (var i = 0; i < size; i++) { + segments.push(createSegment(scope, entry.listType)); + } + return segments; + }; + var populateSegments = function (segments, entry) { + for (var i = 0; i < segments.length - 1; i++) { + set(segments[i].item, 'list-style-type', 'none'); + } + last(segments).each(function (segment) { + setAll(segment.list, entry.listAttributes); + setAll(segment.item, entry.itemAttributes); + append$1(segment.item, entry.content); + }); + }; + var normalizeSegment = function (segment, entry) { + if (name(segment.list) !== entry.listType) { + segment.list = mutate(segment.list, entry.listType); + } + setAll(segment.list, entry.listAttributes); + }; + var createItem = function (scope, attr, content) { + var item = Element.fromTag('li', scope); + setAll(item, attr); + append$1(item, content); + return item; + }; + var appendItem = function (segment, item) { + append(segment.list, item); + segment.item = item; + }; + var writeShallow = function (scope, cast, entry) { + var newCast = cast.slice(0, entry.depth); + last(newCast).each(function (segment) { + var item = createItem(scope, entry.itemAttributes, entry.content); + appendItem(segment, item); + normalizeSegment(segment, entry); + }); + return newCast; + }; + var writeDeep = function (scope, cast, entry) { + var segments = createSegments(scope, entry, entry.depth - cast.length); + joinSegments(segments); + populateSegments(segments, entry); + appendSegments(cast, segments); + return cast.concat(segments); + }; + var composeList = function (scope, entries) { + var cast = foldl(entries, function (cast, entry) { + return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); + }, []); + return head(cast).map(function (segment) { + return segment.list; + }); + }; + + var isList$1 = function (el) { + return is$1(el, 'OL,UL'); + }; + var hasFirstChildList = function (el) { + return firstChild(el).map(isList$1).getOr(false); + }; + var hasLastChildList = function (el) { + return lastChild(el).map(isList$1).getOr(false); + }; + + var isIndented = function (entry) { + return entry.depth > 0; + }; + var isSelected = function (entry) { + return entry.isSelected; + }; + var cloneItemContent = function (li) { + var children$1 = children(li); + var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + return map(content, deep); + }; + var createEntry = function (li, depth, isSelected) { + return parent(li).filter(isElement).map(function (list) { + return { + depth: depth, + isSelected: isSelected, + content: cloneItemContent(li), + itemAttributes: clone(li), + listAttributes: clone(list), + listType: name(list) + }; + }); + }; + + var indentEntry = function (indentation, entry) { + switch (indentation) { + case 'Indent': + entry.depth++; + break; + case 'Outdent': + entry.depth--; + break; + case 'Flatten': + entry.depth = 0; + } + }; + + var cloneListProperties = function (target, source) { + target.listType = source.listType; + target.listAttributes = __assign({}, source.listAttributes); + }; + var previousSiblingEntry = function (entries, start) { + var depth = entries[start].depth; + for (var i = start - 1; i >= 0; i--) { + if (entries[i].depth === depth) { + return Option.some(entries[i]); + } + if (entries[i].depth < depth) { + break; + } + } + return Option.none(); + }; + var normalizeEntries = function (entries) { + each(entries, function (entry, i) { + previousSiblingEntry(entries, i).each(function (matchingEntry) { + cloneListProperties(entry, matchingEntry); + }); + }); + }; + + var parseItem = function (depth, itemSelection, selectionState, item) { + return firstChild(item).filter(isList$1).fold(function () { + itemSelection.each(function (selection) { + if (eq(selection.start, item)) { + selectionState.set(true); + } + }); + var currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(function (selection) { + if (eq(selection.end, item)) { + selectionState.set(false); + } + }); + var childListEntries = lastChild(item).filter(isList$1).map(function (list) { + return parseList(depth, itemSelection, selectionState, list); + }).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, function (list) { + return parseList(depth, itemSelection, selectionState, list); + }); + }; + var parseList = function (depth, itemSelection, selectionState, list) { + return bind(children(list), function (element) { + var parser = isList$1(element) ? parseList : parseItem; + var newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + }; + var parseLists = function (lists, itemSelection) { + var selectionState = Cell(false); + var initialDepth = 0; + return map(lists, function (list) { + return { + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + }; + }); + }; + + var outdentedComposer = function (editor, entries) { + return map(entries, function (entry) { + var content = fromElements(entry.content); + return Element.fromDom(createTextBlock(editor, content.dom())); + }); + }; + var indentedComposer = function (editor, entries) { + normalizeEntries(entries); + return composeList(editor.contentDocument, entries).toArray(); + }; + var composeEntries = function (editor, entries) { + return bind(groupBy(entries, isIndented), function (entries) { + var groupIsIndented = head(entries).map(isIndented).getOr(false); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + }; + var indentSelectedEntries = function (entries, indentation) { + each(filter(entries, isSelected), function (entry) { + return indentEntry(indentation, entry); + }); + }; + var getItemSelection = function (editor) { + var selectedListItems = map(Selection.getSelectedListItems(editor), Element.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { + return { + start: start, + end: end + }; + }); + }; + var listIndentation = function (editor, lists, indentation) { + var entrySets = parseLists(lists, getItemSelection(editor)); + each(entrySets, function (entrySet) { + indentSelectedEntries(entrySet.entries, indentation); + var composedLists = composeEntries(editor, entrySet.entries); + each(composedLists, function (composedList) { + fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom()); + }); + before$1(entrySet.sourceList, composedLists); + remove(entrySet.sourceList); + }); + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var DOM = global$6.DOM; + var splitList = function (editor, ul, li) { + var tmpRng, fragment, bookmarks, node, newBlock; + var removeAndKeepBookmarks = function (targetNode) { + global$5.each(bookmarks, function (node) { + targetNode.parentNode.insertBefore(node, li.parentNode); + }); + DOM.remove(targetNode); + }; + bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); + newBlock = createTextBlock(editor, li); + tmpRng = DOM.createRng(); + tmpRng.setStartAfter(li); + tmpRng.setEndAfter(ul); + fragment = tmpRng.extractContents(); + for (node = fragment.firstChild; node; node = node.firstChild) { + if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { + DOM.remove(node); + break; + } + } + if (!editor.dom.isEmpty(fragment)) { + DOM.insertAfter(fragment, ul); + } + DOM.insertAfter(newBlock, ul); + if (NodeType.isEmpty(editor.dom, li.parentNode)) { + removeAndKeepBookmarks(li.parentNode); + } + DOM.remove(li); + if (NodeType.isEmpty(editor.dom, ul)) { + DOM.remove(ul); + } + }; + var SplitList = { splitList: splitList }; + + var outdentDlItem = function (editor, item) { + if (is$1(item, 'dd')) { + mutate(item, 'dt'); + } else if (is$1(item, 'dt')) { + parent(item).each(function (dl) { + return SplitList.splitList(editor, dl.dom(), item.dom()); + }); + } + }; + var indentDlItem = function (item) { + if (is$1(item, 'dt')) { + mutate(item, 'dd'); + } + }; + var dlIndentation = function (editor, indentation, dlItems) { + if (indentation === 'Indent') { + each(dlItems, indentDlItem); + } else { + each(dlItems, function (item) { + return outdentDlItem(editor, item); + }); + } + }; + + var getNormalizedPoint = function (container, offset) { + if (NodeType.isTextNode(container)) { + return { + container: container, + offset: offset + }; + } + var node = global$1.getNode(container, offset); + if (NodeType.isTextNode(node)) { + return { + container: node, + offset: offset >= container.childNodes.length ? node.data.length : 0 + }; + } else if (node.previousSibling && NodeType.isTextNode(node.previousSibling)) { + return { + container: node.previousSibling, + offset: node.previousSibling.data.length + }; + } else if (node.nextSibling && NodeType.isTextNode(node.nextSibling)) { + return { + container: node.nextSibling, + offset: 0 + }; + } + return { + container: container, + offset: offset + }; + }; + var normalizeRange = function (rng) { + var outRng = rng.cloneRange(); + var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + outRng.setStart(rangeStart.container, rangeStart.offset); + var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + outRng.setEnd(rangeEnd.container, rangeEnd.offset); + return outRng; + }; + var Range = { + getNormalizedPoint: getNormalizedPoint, + normalizeRange: normalizeRange + }; + + var selectionIndentation = function (editor, indentation) { + var lists = map(Selection.getSelectedListRoots(editor), Element.fromDom); + var dlItems = map(Selection.getSelectedDlItems(editor), Element.fromDom); + var isHandled = false; + if (lists.length || dlItems.length) { + var bookmark = editor.selection.getBookmark(); + listIndentation(editor, lists, indentation); + dlIndentation(editor, indentation, dlItems); + editor.selection.moveToBookmark(bookmark); + editor.selection.setRng(Range.normalizeRange(editor.selection.getRng())); + editor.nodeChanged(); + isHandled = true; + } + return isHandled; + }; + var indentListSelection = function (editor) { + return selectionIndentation(editor, 'Indent'); + }; + var outdentListSelection = function (editor) { + return selectionIndentation(editor, 'Outdent'); + }; + var flattenListSelection = function (editor) { + return selectionIndentation(editor, 'Flatten'); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + var DOM$1 = global$6.DOM; + var createBookmark = function (rng) { + var bookmark = {}; + var setupEndPoint = function (start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + DOM$1.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + }; + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolveBookmark = function (bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + var nodeIndex = function (container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + }; + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + DOM$1.remove(node); + if (!container.hasChildNodes() && DOM$1.isBlock(container)) { + container.appendChild(DOM$1.create('br')); + } + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = DOM$1.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return Range.normalizeRange(rng); + }; + var Bookmark = { + createBookmark: createBookmark, + resolveBookmark: resolveBookmark + }; + + var isCustomList = function (list) { + return /\btox\-/.test(list.className); + }; + + var listToggleActionFromListName = function (listName) { + switch (listName) { + case 'UL': + return 'ToggleUlList'; + case 'OL': + return 'ToggleOlList'; + case 'DL': + return 'ToggleDLList'; + } + }; + + var updateListStyle = function (dom, el, detail) { + var type = detail['list-style-type'] ? detail['list-style-type'] : null; + dom.setStyle(el, 'list-style-type', type); + }; + var setAttribs = function (elm, attrs) { + global$5.each(attrs, function (value, key) { + elm.setAttribute(key, value); + }); + }; + var updateListAttrs = function (dom, el, detail) { + setAttribs(el, detail['list-attributes']); + global$5.each(dom.select('li', el), function (li) { + setAttribs(li, detail['list-item-attributes']); + }); + }; + var updateListWithDetails = function (dom, el, detail) { + updateListStyle(dom, el, detail); + updateListAttrs(dom, el, detail); + }; + var removeStyles = function (dom, element, styles) { + global$5.each(styles, function (style) { + var _a; + return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); + }); + }; + var getEndPointNode = function (editor, rng, start, root) { + var container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; + } + if (!start && NodeType.isBr(container.nextSibling)) { + container = container.nextSibling; + } + while (container.parentNode !== root) { + if (NodeType.isTextBlock(editor, container)) { + return container; + } + if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + return container; + } + container = container.parentNode; + } + return container; + }; + var getSelectedTextBlocks = function (editor, rng, root) { + var textBlocks = [], dom = editor.dom; + var startNode = getEndPointNode(editor, rng, true, root); + var endNode = getEndPointNode(editor, rng, false, root); + var block; + var siblings = []; + for (var node = startNode; node; node = node.nextSibling) { + siblings.push(node); + if (node === endNode) { + break; + } + } + global$5.each(siblings, function (node) { + if (NodeType.isTextBlock(editor, node)) { + textBlocks.push(node); + block = null; + return; + } + if (dom.isBlock(node) || NodeType.isBr(node)) { + if (NodeType.isBr(node)) { + dom.remove(node); + } + block = null; + return; + } + var nextSibling = node.nextSibling; + if (global$7.isBookmarkNode(node)) { + if (NodeType.isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { + block = null; + return; + } + } + if (!block) { + block = dom.create('p'); + node.parentNode.insertBefore(block, node); + textBlocks.push(block); + } + block.appendChild(node); + }); + return textBlocks; + }; + var hasCompatibleStyle = function (dom, sib, detail) { + var sibStyle = dom.getStyle(sib, 'list-style-type'); + var detailStyle = detail ? detail['list-style-type'] : ''; + detailStyle = detailStyle === null ? '' : detailStyle; + return sibStyle === detailStyle; + }; + var applyList = function (editor, listName, detail) { + if (detail === void 0) { + detail = {}; + } + var rng = editor.selection.getRng(true); + var bookmark; + var listItemName = 'LI'; + var root = Selection.getClosestListRootElm(editor, editor.selection.getStart(true)); + var dom = editor.dom; + if (dom.getContentEditable(editor.selection.getNode()) === 'false') { + return; + } + listName = listName.toUpperCase(); + if (listName === 'DL') { + listItemName = 'DT'; + } + bookmark = Bookmark.createBookmark(rng); + global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) { + var listBlock, sibling; + sibling = block.previousSibling; + if (sibling && NodeType.isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { + listBlock = sibling; + block = dom.rename(block, listItemName); + sibling.appendChild(block); + } else { + listBlock = dom.create(listName); + block.parentNode.insertBefore(listBlock, block); + listBlock.appendChild(block); + block = dom.rename(block, listItemName); + } + removeStyles(dom, block, [ + 'margin', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-top', + 'padding', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-top' + ]); + updateListWithDetails(dom, listBlock, detail); + mergeWithAdjacentLists(editor.dom, listBlock); + }); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + }; + var isValidLists = function (list1, list2) { + return list1 && list2 && NodeType.isListNode(list1) && list1.nodeName === list2.nodeName; + }; + var hasSameListStyle = function (dom, list1, list2) { + var targetStyle = dom.getStyle(list1, 'list-style-type', true); + var style = dom.getStyle(list2, 'list-style-type', true); + return targetStyle === style; + }; + var hasSameClasses = function (elm1, elm2) { + return elm1.className === elm2.className; + }; + var shouldMerge = function (dom, list1, list2) { + return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); + }; + var mergeWithAdjacentLists = function (dom, listBlock) { + var sibling, node; + sibling = listBlock.nextSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.firstChild) { + listBlock.appendChild(node); + } + dom.remove(sibling); + } + sibling = listBlock.previousSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.lastChild) { + listBlock.insertBefore(node, listBlock.firstChild); + } + dom.remove(sibling); + } + }; + var updateList = function (editor, list, listName, detail) { + if (list.nodeName !== listName) { + var newList = editor.dom.rename(list, listName); + updateListWithDetails(editor.dom, newList, detail); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } else { + updateListWithDetails(editor.dom, list, detail); + fireListEvent(editor, listToggleActionFromListName(listName), list); + } + }; + var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail)) { + flattenListSelection(editor); + } else { + var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); + global$5.each([parentList].concat(lists), function (elm) { + updateList(editor, elm, listName, detail); + }); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + } + }; + var hasListStyleDetail = function (detail) { + return 'list-style-type' in detail; + }; + var toggleSingleList = function (editor, parentList, listName, detail) { + if (parentList === editor.getBody()) { + return; + } + if (parentList) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { + flattenListSelection(editor); + } else { + var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); + updateListWithDetails(editor.dom, parentList, detail); + var newList = editor.dom.rename(parentList, listName); + mergeWithAdjacentLists(editor.dom, newList); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } + } else { + applyList(editor, listName, detail); + fireListEvent(editor, listToggleActionFromListName(listName), parentList); + } + }; + var toggleList = function (editor, listName, detail) { + var parentList = Selection.getParentList(editor); + var selectedSubLists = Selection.getSelectedSubLists(editor); + detail = detail ? detail : {}; + if (parentList && selectedSubLists.length > 0) { + toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); + } else { + toggleSingleList(editor, parentList, listName, detail); + } + }; + var ToggleList = { + toggleList: toggleList, + mergeWithAdjacentLists: mergeWithAdjacentLists + }; + + var DOM$2 = global$6.DOM; + var normalizeList = function (dom, ul) { + var sibling; + var parentNode = ul.parentNode; + if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + if (NodeType.isEmpty(dom, parentNode)) { + DOM$2.remove(parentNode); + } + } else { + DOM$2.setStyle(parentNode, 'listStyleType', 'none'); + } + } + if (NodeType.isListNode(parentNode)) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + } + } + }; + var normalizeLists = function (dom, element) { + global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) { + normalizeList(dom, ul); + }); + }; + var NormalizeLists = { + normalizeList: normalizeList, + normalizeLists: normalizeLists + }; + + var findNextCaretContainer = function (editor, rng, isForward, root) { + var node = rng.startContainer; + var offset = rng.startOffset; + if (NodeType.isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + return node; + } + var nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (node.nodeType === 1) { + node = global$1.getNode(node, offset); + } + var walker = new global$2(node, root); + if (isForward) { + if (NodeType.isBogusBr(editor.dom, node)) { + walker.next(); + } + } + while (node = walker[isForward ? 'next' : 'prev2']()) { + if (node.nodeName === 'LI' && !node.hasChildNodes()) { + return node; + } + if (nonEmptyBlocks[node.nodeName]) { + return node; + } + if (NodeType.isTextNode(node) && node.data.length > 0) { + return node; + } + } + }; + var hasOnlyOneBlockChild = function (dom, elm) { + var childNodes = elm.childNodes; + return childNodes.length === 1 && !NodeType.isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); + }; + var unwrapSingleBlockChild = function (dom, elm) { + if (hasOnlyOneBlockChild(dom, elm)) { + dom.remove(elm.firstChild, true); + } + }; + var moveChildren = function (dom, fromElm, toElm) { + var node, targetElm; + targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + unwrapSingleBlockChild(dom, fromElm); + if (!NodeType.isEmpty(dom, fromElm, true)) { + while (node = fromElm.firstChild) { + targetElm.appendChild(node); + } + } + }; + var mergeLiElements = function (dom, fromElm, toElm) { + var node, listNode; + var ul = fromElm.parentNode; + if (!NodeType.isChildOfBody(dom, fromElm) || !NodeType.isChildOfBody(dom, toElm)) { + return; + } + if (NodeType.isListNode(toElm.lastChild)) { + listNode = toElm.lastChild; + } + if (ul === toElm.lastChild) { + if (NodeType.isBr(ul.previousSibling)) { + dom.remove(ul.previousSibling); + } + } + node = toElm.lastChild; + if (node && NodeType.isBr(node) && fromElm.hasChildNodes()) { + dom.remove(node); + } + if (NodeType.isEmpty(dom, toElm, true)) { + dom.$(toElm).empty(); + } + moveChildren(dom, fromElm, toElm); + if (listNode) { + toElm.appendChild(listNode); + } + var contains = contains$1(Element.fromDom(toElm), Element.fromDom(fromElm)); + var nestedLists = contains ? dom.getParents(fromElm, NodeType.isListNode, toElm) : []; + dom.remove(fromElm); + each(nestedLists, function (list) { + if (NodeType.isEmpty(dom, list) && list !== dom.getRoot()) { + dom.remove(list); + } + }); + }; + var mergeIntoEmptyLi = function (editor, fromLi, toLi) { + editor.dom.$(toLi).empty(); + mergeLiElements(editor.dom, fromLi, toLi); + editor.selection.setCursorLocation(toLi); + }; + var mergeForward = function (editor, rng, fromLi, toLi) { + var dom = editor.dom; + if (dom.isEmpty(toLi)) { + mergeIntoEmptyLi(editor, fromLi, toLi); + } else { + var bookmark = Bookmark.createBookmark(rng); + mergeLiElements(dom, fromLi, toLi); + editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); + } + }; + var mergeBackward = function (editor, rng, fromLi, toLi) { + var bookmark = Bookmark.createBookmark(rng); + mergeLiElements(editor.dom, fromLi, toLi); + var resolvedBookmark = Bookmark.resolveBookmark(bookmark); + editor.selection.setRng(resolvedBookmark); + }; + var backspaceDeleteFromListToListCaret = function (editor, isForward) { + var dom = editor.dom, selection = editor.selection; + var selectionStartElm = selection.getStart(); + var root = Selection.getClosestListRootElm(editor, selectionStartElm); + var li = dom.getParent(selection.getStart(), 'LI', root); + if (li) { + var ul = li.parentNode; + if (ul === editor.getBody() && NodeType.isEmpty(dom, ul)) { + return true; + } + var rng_1 = Range.normalizeRange(selection.getRng()); + var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); + if (otherLi_1 && otherLi_1 !== li) { + editor.undoManager.transact(function () { + if (isForward) { + mergeForward(editor, rng_1, otherLi_1, li); + } else { + if (NodeType.isFirstChild(li)) { + outdentListSelection(editor); + } else { + mergeBackward(editor, rng_1, li, otherLi_1); + } + } + }); + return true; + } else if (!otherLi_1) { + if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { + editor.undoManager.transact(function () { + flattenListSelection(editor); + }); + return true; + } + } + } + return false; + }; + var removeBlock = function (dom, block, root) { + var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + dom.remove(block); + if (parentBlock && dom.isEmpty(parentBlock)) { + dom.remove(parentBlock); + } + }; + var backspaceDeleteIntoListCaret = function (editor, isForward) { + var dom = editor.dom; + var selectionStartElm = editor.selection.getStart(); + var root = Selection.getClosestListRootElm(editor, selectionStartElm); + var block = dom.getParent(selectionStartElm, dom.isBlock, root); + if (block && dom.isEmpty(block)) { + var rng = Range.normalizeRange(editor.selection.getRng()); + var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi_2) { + editor.undoManager.transact(function () { + removeBlock(dom, block, root); + ToggleList.mergeWithAdjacentLists(dom, otherLi_2.parentNode); + editor.selection.select(otherLi_2, true); + editor.selection.collapse(isForward); + }); + return true; + } + } + return false; + }; + var backspaceDeleteCaret = function (editor, isForward) { + return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); + }; + var backspaceDeleteRange = function (editor) { + var selectionStartElm = editor.selection.getStart(); + var root = Selection.getClosestListRootElm(editor, selectionStartElm); + var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + if (startListParent || Selection.getSelectedListItems(editor).length > 0) { + editor.undoManager.transact(function () { + editor.execCommand('Delete'); + NormalizeLists.normalizeLists(editor.dom, editor.getBody()); + }); + return true; + } + return false; + }; + var backspaceDelete = function (editor, isForward) { + return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + }; + var setup = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode === global$3.BACKSPACE) { + if (backspaceDelete(editor, false)) { + e.preventDefault(); + } + } else if (e.keyCode === global$3.DELETE) { + if (backspaceDelete(editor, true)) { + e.preventDefault(); + } + } + }); + }; + var Delete = { + setup: setup, + backspaceDelete: backspaceDelete + }; + + var get = function (editor) { + return { + backspaceDelete: function (isForward) { + Delete.backspaceDelete(editor, isForward); + } + }; + }; + var Api = { get: get }; + + var queryListCommandState = function (editor, listName) { + return function () { + var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); + return parentList && parentList.nodeName === listName; + }; + }; + var register = function (editor) { + editor.on('BeforeExecCommand', function (e) { + var cmd = e.command.toLowerCase(); + if (cmd === 'indent') { + indentListSelection(editor); + } else if (cmd === 'outdent') { + outdentListSelection(editor); + } + }); + editor.addCommand('InsertUnorderedList', function (ui, detail) { + ToggleList.toggleList(editor, 'UL', detail); + }); + editor.addCommand('InsertOrderedList', function (ui, detail) { + ToggleList.toggleList(editor, 'OL', detail); + }); + editor.addCommand('InsertDefinitionList', function (ui, detail) { + ToggleList.toggleList(editor, 'DL', detail); + }); + editor.addCommand('RemoveList', function () { + flattenListSelection(editor); + }); + editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); + editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); + editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); + }; + var Commands = { register: register }; + + var setupTabKey = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) { + return; + } + editor.undoManager.transact(function () { + if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { + e.preventDefault(); + } + }); + }); + }; + var setup$1 = function (editor) { + if (Settings.shouldIndentOnTab(editor)) { + setupTabKey(editor); + } + Delete.setup(editor); + }; + var Keyboard = { setup: setup$1 }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var listState = function (editor, listName) { + return function (buttonApi) { + var nodeChangeHandler = function (e) { + var tableCellIndex = findIndex(e.parents, NodeType.isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$5.grep(parents, NodeType.isListNode); + buttonApi.setActive(lists.length > 0 && lists[0].nodeName === listName && !isCustomList(lists[0])); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.settings.plugins ? editor.settings.plugins : ''; + return global$5.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + var exec = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + if (!hasPlugin(editor, 'advlist')) { + editor.ui.registry.addToggleButton('numlist', { + icon: 'ordered-list', + active: false, + tooltip: 'Numbered list', + onAction: exec('InsertOrderedList'), + onSetup: listState(editor, 'OL') + }); + editor.ui.registry.addToggleButton('bullist', { + icon: 'unordered-list', + active: false, + tooltip: 'Bullet list', + onAction: exec('InsertUnorderedList'), + onSetup: listState(editor, 'UL') + }); + } + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('lists', function (editor) { + Keyboard.setup(editor); + Buttons.register(editor); + Commands.register(editor); + return Api.get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/lists/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 0000000..0094a62 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(r){"use strict";function e(){}function l(e){return function(){return e}}function t(t){return function(){for(var e=[],n=0;ne.length?ne(t,e,n):ee(t,e,n)},[]);return S(n).map(function(e){return e.list})}(e.contentDocument,n).toArray()}function de(e){var n=g(Zn.getSelectedListItems(e),Ln.fromDom);return A(N(n,t(re)),N(function(e){var n=Xe.call(e,0);return n.reverse(),n}(n),t(re)),function(e,n){return{start:e,end:n}})}function le(t,e,r){var n=function(e,n){var t=Ge(!1);return g(e,function(e){return{sourceList:e,entries:ot(0,n,t,e)}})}(e,de(t));p(n,function(e){!function(e,n){p(v(e,ie),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}}(n,e)})}(e.entries,r);var n=function(n,e){return y(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i=e.childNodes.length?t.data.length:0}:t.previousSibling&&Un(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&Un(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}}function ve(e,n){var t=g(Zn.getSelectedListRoots(e),Ln.fromDom),r=g(Zn.getSelectedDlItems(e),Ln.fromDom),o=!1;if(t.length||r.length){var i=e.selection.getBookmark();le(e,t,n),ge(e,n,r),e.selection.moveToBookmark(i),e.selection.setRng(st(e.selection.getRng())),e.nodeChanged(),o=!0}return o}function he(e){return ve(e,"Indent")}function Ne(e){return ve(e,"Outdent")}function ye(e){return ve(e,"Flatten")}function Se(e){return/\btox\-/.test(e.className)}function Oe(e){switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}}function Ce(t,e){Mn.each(e,function(e,n){t.setAttribute(n,e)})}function be(e,n,t){!function(e,n,t){var r=t["list-style-type"]?t["list-style-type"]:null;e.setStyle(n,"list-style-type",r)}(e,n,t),function(e,n,t){Ce(n,t["list-attributes"]),Mn.each(e.select("li",n),function(e){Ce(e,t["list-item-attributes"])})}(e,n,t)}function Le(e,n,t,r){var o,i;for(o=n[t?"startContainer":"endContainer"],i=n[t?"startOffset":"endOffset"],1===o.nodeType&&(o=o.childNodes[Math.min(i,o.childNodes.length-1)]||o),!t&&Wn(o.nextSibling)&&(o=o.nextSibling);o.parentNode!==r;){if(Kn(e,o))return o;if(/^(TD|TH)$/.test(o.parentNode.nodeName))return o;o=o.parentNode}return o}function Te(r,o,i){void 0===i&&(i={});var e,n=r.selection.getRng(!0),u="LI",t=Zn.getClosestListRootElm(r,r.selection.getStart(!0)),a=r.dom;"false"!==a.getContentEditable(r.selection.getNode())&&("DL"===(o=o.toUpperCase())&&(u="DT"),e=dt(n),Mn.each(function(t,e,r){for(var o,i=[],u=t.dom,n=Le(t,e,!0,r),a=Le(t,e,!1,r),s=[],c=n;c&&(s.push(c),c!==a);c=c.nextSibling);return Mn.each(s,function(e){if(Kn(t,e))return i.push(e),void(o=null);if(u.isBlock(e)||Wn(e))return Wn(e)&&u.remove(e),void(o=null);var n=e.nextSibling;ct.isBookmarkNode(e)&&(Kn(t,n)||!n&&e.parentNode===r)?o=null:(o||(o=u.create("p"),e.parentNode.insertBefore(o,e),i.push(o)),o.appendChild(e))}),i}(r,n,t),function(e){var n,t;(t=e.previousSibling)&&Fn(t)&&t.nodeName===o&&function(e,n,t){var r=e.getStyle(n,"list-style-type"),o=t?t["list-style-type"]:"";return r===(o=null===o?"":o)}(a,t,i)?(n=t,e=a.rename(e,u),t.appendChild(e)):(n=a.create(o),e.parentNode.insertBefore(n,e),n.appendChild(e),e=a.rename(e,u)),function(t,r,e){Mn.each(e,function(e){var n;return t.setStyle(r,((n={})[e]="",n))})}(a,e,["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"]),be(a,n,i),mt(r.dom,n)}),r.selection.setRng(lt(e)))}function De(e,n,t){return function(e,n){return e&&n&&Fn(e)&&e.nodeName===n.nodeName}(n,t)&&function(e,n,t){return e.getStyle(n,"list-style-type",!0)===e.getStyle(t,"list-style-type",!0)}(e,n,t)&&function(e,n){return e.className===n.className}(n,t)}function Ee(n,e,t,r,o){if(e.nodeName!==r||gt(o)){var i=dt(n.selection.getRng(!0));Mn.each([e].concat(t),function(e){!function(e,n,t,r){if(n.nodeName!==t){var o=e.dom.rename(n,t);be(e.dom,o,r),j(e,Oe(t),o)}else be(e.dom,n,r),j(e,Oe(t),n)}(n,e,r,o)}),n.selection.setRng(lt(i))}else ye(n)}function we(e,n){var t,r=n.parentNode;"LI"===r.nodeName&&r.firstChild===n&&((t=r.previousSibling)&&"LI"===t.nodeName?(t.appendChild(n),Qn(e,r)&&vt.remove(r)):vt.setStyle(r,"listStyleType","none")),Fn(r)&&(t=r.previousSibling)&&"LI"===t.nodeName&&t.appendChild(n)}function ke(e,n,t,r){var o=n.startContainer,i=n.startOffset;if(Un(o)&&(t?i 1) { + return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; + } else { + return 'https://'; + } + }; + var getUrl = function (pattern, url) { + var protocol = getProtocol(url); + var match = pattern.regex.exec(url); + var newUrl = protocol + pattern.url; + var _loop_1 = function (i) { + newUrl = newUrl.replace('$' + i, function () { + return match[i] ? match[i] : ''; + }); + }; + for (var i = 0; i < match.length; i++) { + _loop_1(i); + } + return newUrl.replace(/\?$/, ''); + }; + var matchPattern = function (url) { + var patterns = urlPatterns.filter(function (pattern) { + return pattern.regex.test(url); + }); + if (patterns.length > 0) { + return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + } else { + return null; + } + }; + + var getIframeHtml = function (data) { + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; + return ''; + }; + var getFlashHtml = function (data) { + var html = ''; + if (data.poster) { + html += ''; + } + html += ''; + return html; + }; + var getAudioHtml = function (data, audioTemplateCallback) { + if (audioTemplateCallback) { + return audioTemplateCallback(data); + } else { + return ''; + } + }; + var getVideoHtml = function (data, videoTemplateCallback) { + if (videoTemplateCallback) { + return videoTemplateCallback(data); + } else { + return ''; + } + }; + var getScriptHtml = function (data) { + return ''; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(Settings.getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = Mime.guess(data.source); + data.altsourcemime = Mime.guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return UpdateHtml.updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(Settings.getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = Settings.getAudioTemplateCallback(editor); + var videoTemplateCallback = Settings.getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = Settings.getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + var Service = { + getEmbedHtml: getEmbedHtml, + isCached: isCached + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Option.some(v) : Option.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Option.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Option.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(Settings.getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(Settings.getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = UpdateHtml.updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || Service.isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + Service.getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + Service.getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !Settings.hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (Settings.hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (Settings.hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + var Dialog = { + showDialog: showDialog, + unwrap: unwrap + }; + + var get$1 = function (editor) { + var showDialog = function () { + Dialog.showDialog(editor); + }; + return { showDialog: showDialog }; + }; + var Api = { get: get$1 }; + + var register = function (editor) { + var showDialog = function () { + Dialog.showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog); + }; + var Commands = { register: register }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (Settings.shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$4(); + var blocked; + global$2({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript') { + return; + } + for (var i = 0; i < attrs.length; i++) { + if (attrs[i].name.indexOf('on') === 0) { + return; + } + if (attrs[i].name === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$5({})).parse(html); + return writer.getContent(); + }; + var Sanitize = { sanitize: sanitize }; + + var createPlaceholderNode = function (editor, node) { + var placeHolder; + var name = node.name; + placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var previewWrapper; + var previewNode; + var shimNode; + var name = node.name; + previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var attribs; + var ai; + var innerHtml; + attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(Settings.getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + var Nodes = { + createPreviewIframeNode: createPreviewIframeNode, + createPlaceholderNode: createPlaceholderNode, + placeHolderConverter: placeHolderConverter + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + var FilterContent = { setup: setup }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + var ResolveName = { setup: setup$1 }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + var Selection = { setup: setup$2 }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('media', function (editor) { + Commands.register(editor); + Buttons.register(editor); + ResolveName.setup(editor); + FilterContent.setup(editor); + Selection.setup(editor); + return Api.get(editor); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/media/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..3858ecd --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";function e(){}function o(e){return function(){return e}}function t(){return u}var r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"}(n):"application/x-shockwave-flash"===n.sourcemime?function(e){var t='';return e.poster&&(t+=''),t+=""}(n):-1!==n.sourcemime.indexOf("audio")?function(e,t){return t?t(e):'"}(n,o):"script"===n.type?function(e){return' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + var IframeContent = { getPreviewHtml: getPreviewHtml }; + + var open = function (editor) { + var content = IframeContent.getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + var Buttons = { register: register$1 }; + + function Plugin () { + global.add('preview', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + } + + Plugin(); + +}()); diff --git a/target/classes/front/front/modules/tinymce/tinymce/plugins/preview/plugin.min.js b/target/classes/front/front/modules/tinymce/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..7d7ca23 --- /dev/null +++ b/target/classes/front/front/modules/tinymce/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.2.0 (2020-02-13) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),m=function(e){return e.getParam("content_style","")},u=function(e){return e.getParam("content_css_cors",!1,"boolean")},y=tinymce.util.Tools.resolve("tinymce.Env"),n=function(t){var n="",i=t.dom.encode,e=m(t);n+='',e&&(n+='");var o=u(t)?' crossorigin="anonymous"':"";l.each(t.contentCSS,function(e){n+='"});var r=t.settings.body_id||"tinymce";-1!==r.indexOf("=")&&(r=(r=t.getParam("body_id","","hash"))[t.id]||r);var a=t.settings.body_class||"";-1!==a.indexOf("=")&&(a=(a=t.getParam("body_class","","hash"))[t.id]||"");var c=' + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/config/detail.html b/target/classes/front/front/pages/config/detail.html new file mode 100644 index 0000000..70d5b7b --- /dev/null +++ b/target/classes/front/front/pages/config/detail.html @@ -0,0 +1,368 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 名称: + + {{detail.name}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/config/list.html b/target/classes/front/front/pages/config/list.html new file mode 100644 index 0000000..4e3a696 --- /dev/null +++ b/target/classes/front/front/pages/config/list.html @@ -0,0 +1,426 @@ + + + + +轮播图管理 + + + + + + + + + + + + + +
      + +
      +
      +
      + 轮播图管理您现在的位置:轮播图管理 +
      +
      +
      +
      名称
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/discussfangwuxinxi/add.html b/target/classes/front/front/pages/discussfangwuxinxi/add.html new file mode 100644 index 0000000..63c5aba --- /dev/null +++ b/target/classes/front/front/pages/discussfangwuxinxi/add.html @@ -0,0 +1,309 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/discussfangwuxinxi/detail.html b/target/classes/front/front/pages/discussfangwuxinxi/detail.html new file mode 100644 index 0000000..f3ec1aa --- /dev/null +++ b/target/classes/front/front/pages/discussfangwuxinxi/detail.html @@ -0,0 +1,461 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 关联表id: + + {{detail.refid}} + +
      +
      + 评论内容: + + {{detail.content}} + +
      +
      + 回复内容: + + {{detail.reply}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + +
      • 评论
      • + + + + + +
      + +
      + + + + +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + 用户:{{item.userid}} +
      +
      + + {{item.content}} + +
      +
      + + 回复:{{item.reply}} + +
      +
      +
      +
      +
      +
      + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/discussfangwuxinxi/list.html b/target/classes/front/front/pages/discussfangwuxinxi/list.html new file mode 100644 index 0000000..a71d57d --- /dev/null +++ b/target/classes/front/front/pages/discussfangwuxinxi/list.html @@ -0,0 +1,426 @@ + + + + +房屋信息评论表 + + + + + + + + + + + + + +
      + +
      +
      +
      + 房屋信息评论表您现在的位置:房屋信息评论表 +
      +
      +
      +
      评论内容
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/discusswoyaodangfangzhu/add.html b/target/classes/front/front/pages/discusswoyaodangfangzhu/add.html new file mode 100644 index 0000000..0bc9815 --- /dev/null +++ b/target/classes/front/front/pages/discusswoyaodangfangzhu/add.html @@ -0,0 +1,309 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/discusswoyaodangfangzhu/detail.html b/target/classes/front/front/pages/discusswoyaodangfangzhu/detail.html new file mode 100644 index 0000000..01a63d3 --- /dev/null +++ b/target/classes/front/front/pages/discusswoyaodangfangzhu/detail.html @@ -0,0 +1,461 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 关联表id: + + {{detail.refid}} + +
      +
      + 评论内容: + + {{detail.content}} + +
      +
      + 回复内容: + + {{detail.reply}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + +
      • 评论
      • + + + + + +
      + +
      + + + + +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + 用户:{{item.userid}} +
      +
      + + {{item.content}} + +
      +
      + + 回复:{{item.reply}} + +
      +
      +
      +
      +
      +
      + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/discusswoyaodangfangzhu/list.html b/target/classes/front/front/pages/discusswoyaodangfangzhu/list.html new file mode 100644 index 0000000..dbeece3 --- /dev/null +++ b/target/classes/front/front/pages/discusswoyaodangfangzhu/list.html @@ -0,0 +1,426 @@ + + + + +我要当房主评论表 + + + + + + + + + + + + + +
      + +
      +
      +
      + 我要当房主评论表您现在的位置:我要当房主评论表 +
      +
      +
      +
      评论内容
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwubaoxiu/add.html b/target/classes/front/front/pages/fangwubaoxiu/add.html new file mode 100644 index 0000000..ca72e21 --- /dev/null +++ b/target/classes/front/front/pages/fangwubaoxiu/add.html @@ -0,0 +1,510 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwubaoxiu/detail.html b/target/classes/front/front/pages/fangwubaoxiu/detail.html new file mode 100644 index 0000000..24fe150 --- /dev/null +++ b/target/classes/front/front/pages/fangwubaoxiu/detail.html @@ -0,0 +1,444 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 合同编号: + + {{detail.hetongbianhao}} + +
      +
      + 房屋名称: + + {{detail.fangwumingcheng}} + +
      +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 小区: + + {{detail.xiaoqu}} + +
      +
      + 报修名称: + + {{detail.baoxiumingcheng}} + +
      +
      + 类型: + + {{detail.leixing}} + +
      +
      + 报修内容: + + {{detail.baoxiuneirong}} + +
      +
      + 报修日期: + + {{detail.baoxiuriqi}} + +
      +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 房主姓名: + + {{detail.fangzhuxingming}} + +
      +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      + + + + + +
      + + + + + + +
      +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwubaoxiu/list.html b/target/classes/front/front/pages/fangwubaoxiu/list.html new file mode 100644 index 0000000..a666b64 --- /dev/null +++ b/target/classes/front/front/pages/fangwubaoxiu/list.html @@ -0,0 +1,448 @@ + + + + +房屋报修 + + + + + + + + + + + + + +
      + +
      +
      +
      + 房屋报修您现在的位置:房屋报修 +
      +
      +
      +
      房屋名称
      + +
      +
      +
      类型
      + +
      +
      +
      房主姓名
      + +
      +
      +
      用户名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwuleixing/add.html b/target/classes/front/front/pages/fangwuleixing/add.html new file mode 100644 index 0000000..81dadc3 --- /dev/null +++ b/target/classes/front/front/pages/fangwuleixing/add.html @@ -0,0 +1,296 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwuleixing/detail.html b/target/classes/front/front/pages/fangwuleixing/detail.html new file mode 100644 index 0000000..2d55efc --- /dev/null +++ b/target/classes/front/front/pages/fangwuleixing/detail.html @@ -0,0 +1,368 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwuleixing/list.html b/target/classes/front/front/pages/fangwuleixing/list.html new file mode 100644 index 0000000..0ce1893 --- /dev/null +++ b/target/classes/front/front/pages/fangwuleixing/list.html @@ -0,0 +1,426 @@ + + + + +房屋类型 + + + + + + + + + + + + + +
      + +
      +
      +
      + 房屋类型您现在的位置:房屋类型 +
      +
      +
      +
      房屋类型
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwupingjia/add.html b/target/classes/front/front/pages/fangwupingjia/add.html new file mode 100644 index 0000000..8f8424c --- /dev/null +++ b/target/classes/front/front/pages/fangwupingjia/add.html @@ -0,0 +1,412 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwupingjia/detail.html b/target/classes/front/front/pages/fangwupingjia/detail.html new file mode 100644 index 0000000..372c78f --- /dev/null +++ b/target/classes/front/front/pages/fangwupingjia/detail.html @@ -0,0 +1,422 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 合同编号: + + {{detail.hetongbianhao}} + +
      +
      + 房屋名称: + + {{detail.fangwumingcheng}} + +
      +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 小区: + + {{detail.xiaoqu}} + +
      +
      + 评分: + + {{detail.pingfen}} + +
      +
      + 评价内容: + + {{detail.pingjianeirong}} + +
      +
      + 评价日期: + + {{detail.pingjiariqi}} + +
      +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwupingjia/list.html b/target/classes/front/front/pages/fangwupingjia/list.html new file mode 100644 index 0000000..9a6e3e3 --- /dev/null +++ b/target/classes/front/front/pages/fangwupingjia/list.html @@ -0,0 +1,448 @@ + + + + +房屋评价 + + + + + + + + + + + + + +
      + +
      +
      +
      + 房屋评价您现在的位置:房屋评价 +
      +
      +
      +
      房屋名称
      + +
      +
      +
      评分
      + +
      +
      +
      房主账号
      + +
      +
      +
      用户名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwuxinxi/add.html b/target/classes/front/front/pages/fangwuxinxi/add.html new file mode 100644 index 0000000..ff37dd1 --- /dev/null +++ b/target/classes/front/front/pages/fangwuxinxi/add.html @@ -0,0 +1,639 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwuxinxi/detail.html b/target/classes/front/front/pages/fangwuxinxi/detail.html new file mode 100644 index 0000000..ac81c78 --- /dev/null +++ b/target/classes/front/front/pages/fangwuxinxi/detail.html @@ -0,0 +1,556 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      + +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 租赁方式: + + {{detail.zulinfangshi}} + +
      +
      + 朝向楼层: + + {{detail.chaoxianglouceng}} + +
      +
      + 面积: + + {{detail.mianji}} + +
      +
      + 房屋状态: + + {{detail.fangwuzhuangtai}} + +
      +
      + 小区: + + {{detail.xiaoqu}} + +
      +
      + 详细地址: + + {{detail.xiangxidizhi}} + +
      +
      + 月租价格: + + {{detail.yuezujiage}} + +
      +
      + 押金: + + {{detail.yajin}} + +
      +
      + 房屋设施: + + {{detail.fangwusheshi}} + +
      +
      + 发布日期: + + {{detail.faburiqi}} + +
      +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 房主姓名: + + {{detail.fangzhuxingming}} + +
      + + + + + +
      + + + + + + +
      +
      +
      + + + + +
      +
      + +
        + +
      • 房屋详情
      • + + + +
      • 评论
      • + + + + + +
      + +
      + +
      +
      +
      + + + +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + 用户:{{item.userid}} +
      +
      + + {{item.content}} + +
      +
      + + 回复:{{item.reply}} + +
      +
      +
      +
      +
      +
      + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangwuxinxi/list.html b/target/classes/front/front/pages/fangwuxinxi/list.html new file mode 100644 index 0000000..2bacffa --- /dev/null +++ b/target/classes/front/front/pages/fangwuxinxi/list.html @@ -0,0 +1,486 @@ + + + + +房屋信息 + + + + + + + + + + + + + +
      + +
      +
      +
      + + +
      +
      + 房屋信息您现在的位置:房屋信息 +
      +
      +
      +
      房屋名称
      + +
      +
      +
      房屋状态
      + +
      +
      +
      小区
      + +
      + + +
      + +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      {{item.price}} RMB
      +
      {{item.fangwumingcheng}}
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangzhu/add.html b/target/classes/front/front/pages/fangzhu/add.html new file mode 100644 index 0000000..539a9ce --- /dev/null +++ b/target/classes/front/front/pages/fangzhu/add.html @@ -0,0 +1,453 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangzhu/center.html b/target/classes/front/front/pages/fangzhu/center.html new file mode 100644 index 0000000..e9ad376 --- /dev/null +++ b/target/classes/front/front/pages/fangzhu/center.html @@ -0,0 +1,541 @@ + + + + + + + + 个人中心 + + + + + + + + + + + +
      + + + + + + + +
      + USER / CENTER个人中心 +
      + + +
      + +
      + +
      + + +
      +
      + + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      +
      + + +
      +
      + +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangzhu/detail.html b/target/classes/front/front/pages/fangzhu/detail.html new file mode 100644 index 0000000..72e354e --- /dev/null +++ b/target/classes/front/front/pages/fangzhu/detail.html @@ -0,0 +1,392 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 房主姓名: + + {{detail.fangzhuxingming}} + +
      +
      + 性别: + + {{detail.xingbie}} + +
      +
      + 手机: + + {{detail.shouji}} + +
      +
      + 身份证: + + {{detail.shenfenzheng}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangzhu/list.html b/target/classes/front/front/pages/fangzhu/list.html new file mode 100644 index 0000000..57ee236 --- /dev/null +++ b/target/classes/front/front/pages/fangzhu/list.html @@ -0,0 +1,433 @@ + + + + +房主 + + + + + + + + + + + + + +
      + +
      +
      +
      + 房主您现在的位置:房主 +
      +
      +
      +
      房主账号
      + +
      +
      +
      房主姓名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/fangzhu/register.html b/target/classes/front/front/pages/fangzhu/register.html new file mode 100644 index 0000000..8e7380f --- /dev/null +++ b/target/classes/front/front/pages/fangzhu/register.html @@ -0,0 +1,172 @@ + + + + + + 注册 + + + + + + +
      + +
      + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/hetongxinxi/add.html b/target/classes/front/front/pages/hetongxinxi/add.html new file mode 100644 index 0000000..6d31535 --- /dev/null +++ b/target/classes/front/front/pages/hetongxinxi/add.html @@ -0,0 +1,582 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + + + 点击下载合同内容 +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/hetongxinxi/detail.html b/target/classes/front/front/pages/hetongxinxi/detail.html new file mode 100644 index 0000000..3bed180 --- /dev/null +++ b/target/classes/front/front/pages/hetongxinxi/detail.html @@ -0,0 +1,477 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 合同编号: + + {{detail.hetongbianhao}} + +
      +
      + 房屋名称: + + {{detail.fangwumingcheng}} + +
      +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 小区: + + {{detail.xiaoqu}} + +
      +
      + 月租价格: + + {{detail.yuezujiage}} + +
      +
      + 租用月数: + + {{detail.zuyongyueshu}} + +
      +
      + 租用金额: + + {{detail.zuyongjine}} + +
      +
      + 押金: + + {{detail.yajin}} + +
      +
      + 房租状态: + + {{detail.fangzuzhuangtai}} + +
      +
      + 合同金额: + + {{detail.hetongjine}} + +
      +
      + 生效日: + + {{detail.shengxiaori}} + +
      +
      + 有限期至: + + {{detail.youxianqizhi}} + +
      +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 房主姓名: + + {{detail.fangzhuxingming}} + +
      + + + +
      + 合同内容: + + 点击下载 + +
      + + +
      + + + + + + + +
      +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/hetongxinxi/list.html b/target/classes/front/front/pages/hetongxinxi/list.html new file mode 100644 index 0000000..16115aa --- /dev/null +++ b/target/classes/front/front/pages/hetongxinxi/list.html @@ -0,0 +1,441 @@ + + + + +合同信息 + + + + + + + + + + + + + +
      + +
      +
      +
      + 合同信息您现在的位置:合同信息 +
      +
      +
      +
      房屋名称
      + +
      +
      +
      房屋类型
      + +
      +
      +
      用户名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/home/home.html b/target/classes/front/front/pages/home/home.html new file mode 100644 index 0000000..e42bec2 --- /dev/null +++ b/target/classes/front/front/pages/home/home.html @@ -0,0 +1,700 @@ + + + + + +首页 + + + + + + + + + + + + + + + +
      + + + +
      + + + + +
      +
      +
      + HOME NEWS公告信息 +
      +
      +
      +
      + +
      +
      {{item.title}}
      +
      {{item.addtime}}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + +
      +
      +
      + DATA SHOW房屋信息展示 +
      +
      +
      +
      + +
      {{item.fangwumingcheng}}
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      + + + + + + + + + + + diff --git a/target/classes/front/front/pages/login/login.html b/target/classes/front/front/pages/login/login.html new file mode 100644 index 0000000..3c616c8 --- /dev/null +++ b/target/classes/front/front/pages/login/login.html @@ -0,0 +1,174 @@ + + + + + + 登录 + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/messages/list.html b/target/classes/front/front/pages/messages/list.html new file mode 100644 index 0000000..700eb1b --- /dev/null +++ b/target/classes/front/front/pages/messages/list.html @@ -0,0 +1,271 @@ + + + + + + + 在线留言 + + + + + + + + + + + +
      + + + + + + + +
      + MESSAGES / ADVICE留言反馈 +
      + + +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + 用户:{{item.username}} +
      +
      + + {{item.content}} + +
      +
      + 回复:{{item.reply}} + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/news/detail.html b/target/classes/front/front/pages/news/detail.html new file mode 100644 index 0000000..e7d7d2d --- /dev/null +++ b/target/classes/front/front/pages/news/detail.html @@ -0,0 +1,196 @@ + + + + + + + 公告信息 + + + + + + + + + + + +
      + +
      + NEWS / INFORMATION公告信息 +
      + +
      +

      {{detail.title}}

      +
      + 时间:{{detail.addtime}} +
      +
      +
      + + +
      +
      + 本篇文章:{{detail.title}} +
      + +
      +
      +
      + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/news/list.html b/target/classes/front/front/pages/news/list.html new file mode 100644 index 0000000..363fc53 --- /dev/null +++ b/target/classes/front/front/pages/news/list.html @@ -0,0 +1,399 @@ + + + + + +公告信息 + + + + + + + + + + + + + +
      + + + + +
      +
      +
      + 公告信息您现在的位置:公告信息 +
      + +
      +
      +
      + +
      +
      {{item.title}}
      +
      {{item.introduction}}
      +
      +
      +
      +
      +
      +
      +
      + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/storeup/list.html b/target/classes/front/front/pages/storeup/list.html new file mode 100644 index 0000000..a724313 --- /dev/null +++ b/target/classes/front/front/pages/storeup/list.html @@ -0,0 +1,230 @@ + + + + + + + 收藏 + + + + + + + + + + + +
      + + + + + +
      + USER / STOREUP我的收藏 +
      + + + +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      +
      +
      + +

      {{item.name}}

      +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/users/add.html b/target/classes/front/front/pages/users/add.html new file mode 100644 index 0000000..3e9ef54 --- /dev/null +++ b/target/classes/front/front/pages/users/add.html @@ -0,0 +1,320 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/users/detail.html b/target/classes/front/front/pages/users/detail.html new file mode 100644 index 0000000..fa34de4 --- /dev/null +++ b/target/classes/front/front/pages/users/detail.html @@ -0,0 +1,380 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 用户名: + + {{detail.username}} + +
      +
      + 密码: + + {{detail.password}} + +
      +
      + 角色: + + {{detail.role}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/users/list.html b/target/classes/front/front/pages/users/list.html new file mode 100644 index 0000000..7166245 --- /dev/null +++ b/target/classes/front/front/pages/users/list.html @@ -0,0 +1,426 @@ + + + + +管理员 + + + + + + + + + + + + + +
      + +
      +
      +
      + 管理员您现在的位置:管理员 +
      +
      +
      +
      用户名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/weixiuchuli/add.html b/target/classes/front/front/pages/weixiuchuli/add.html new file mode 100644 index 0000000..76d0cc8 --- /dev/null +++ b/target/classes/front/front/pages/weixiuchuli/add.html @@ -0,0 +1,440 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/weixiuchuli/detail.html b/target/classes/front/front/pages/weixiuchuli/detail.html new file mode 100644 index 0000000..752a224 --- /dev/null +++ b/target/classes/front/front/pages/weixiuchuli/detail.html @@ -0,0 +1,434 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 房屋名称: + + {{detail.fangwumingcheng}} + +
      +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 报修名称: + + {{detail.baoxiumingcheng}} + +
      +
      + 类型: + + {{detail.leixing}} + +
      +
      + 报修日期: + + {{detail.baoxiuriqi}} + +
      +
      + 维修反馈: + + {{detail.weixiufankui}} + +
      +
      + 维修进度: + + {{detail.weixiujindu}} + +
      +
      + 更新日期: + + {{detail.gengxinriqi}} + +
      +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 房主姓名: + + {{detail.fangzhuxingming}} + +
      +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/weixiuchuli/list.html b/target/classes/front/front/pages/weixiuchuli/list.html new file mode 100644 index 0000000..a021ea2 --- /dev/null +++ b/target/classes/front/front/pages/weixiuchuli/list.html @@ -0,0 +1,447 @@ + + + + +维修处理 + + + + + + + + + + + + + +
      + +
      +
      +
      + 维修处理您现在的位置:维修处理 +
      +
      +
      +
      报修名称
      + +
      +
      +
      维修进度
      + +
      +
      +
      房主姓名
      + +
      +
      +
      用户名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/woyaodangfangzhu/add.html b/target/classes/front/front/pages/woyaodangfangzhu/add.html new file mode 100644 index 0000000..b4109e0 --- /dev/null +++ b/target/classes/front/front/pages/woyaodangfangzhu/add.html @@ -0,0 +1,579 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/woyaodangfangzhu/detail.html b/target/classes/front/front/pages/woyaodangfangzhu/detail.html new file mode 100644 index 0000000..be3af38 --- /dev/null +++ b/target/classes/front/front/pages/woyaodangfangzhu/detail.html @@ -0,0 +1,522 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      + +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 租赁方式: + + {{detail.zulinfangshi}} + +
      +
      + 朝向楼层: + + {{detail.chaoxianglouceng}} + +
      +
      + 小区: + + {{detail.xiaoqu}} + +
      +
      + 面积: + + {{detail.mianji}} + +
      +
      + 月租价格: + + {{detail.yuezujiage}} + +
      +
      + 发布日期: + + {{detail.faburiqi}} + +
      +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + +
      • 房屋详情
      • + + + +
      • 评论
      • + + + + + +
      + +
      + +
      +
      +
      + + + +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + 用户:{{item.userid}} +
      +
      + + {{item.content}} + +
      +
      + + 回复:{{item.reply}} + +
      +
      +
      +
      +
      +
      + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/woyaodangfangzhu/list.html b/target/classes/front/front/pages/woyaodangfangzhu/list.html new file mode 100644 index 0000000..a3d5e3b --- /dev/null +++ b/target/classes/front/front/pages/woyaodangfangzhu/list.html @@ -0,0 +1,477 @@ + + + + +我要当房主 + + + + + + + + + + + + + +
      + +
      +
      +
      + + +
      +
      + 我要当房主您现在的位置:我要当房主 +
      +
      +
      +
      房屋名称
      + +
      +
      +
      小区
      + +
      + + +
      + +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      {{item.price}} RMB
      +
      {{item.fangwumingcheng}}
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/yonghu/add.html b/target/classes/front/front/pages/yonghu/add.html new file mode 100644 index 0000000..daf5090 --- /dev/null +++ b/target/classes/front/front/pages/yonghu/add.html @@ -0,0 +1,459 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/yonghu/center.html b/target/classes/front/front/pages/yonghu/center.html new file mode 100644 index 0000000..f47b618 --- /dev/null +++ b/target/classes/front/front/pages/yonghu/center.html @@ -0,0 +1,540 @@ + + + + + + + + 个人中心 + + + + + + + + + + + +
      + + + + + + + +
      + USER / CENTER个人中心 +
      + + +
      + +
      + +
      + + +
      +
      + + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      +
      + + +
      +
      + +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/yonghu/detail.html b/target/classes/front/front/pages/yonghu/detail.html new file mode 100644 index 0000000..3f4b657 --- /dev/null +++ b/target/classes/front/front/pages/yonghu/detail.html @@ -0,0 +1,398 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 姓名: + + {{detail.xingming}} + +
      +
      + 性别: + + {{detail.xingbie}} + +
      +
      + 职业: + + {{detail.zhiye}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      +
      + 身份证: + + {{detail.shenfenzheng}} + +
      + + + + + +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/yonghu/list.html b/target/classes/front/front/pages/yonghu/list.html new file mode 100644 index 0000000..4557e2c --- /dev/null +++ b/target/classes/front/front/pages/yonghu/list.html @@ -0,0 +1,426 @@ + + + + +用户 + + + + + + + + + + + + + +
      + +
      +
      +
      + 用户您现在的位置:用户 +
      +
      +
      +
      用户名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/pages/yonghu/register.html b/target/classes/front/front/pages/yonghu/register.html new file mode 100644 index 0000000..81ecb02 --- /dev/null +++ b/target/classes/front/front/pages/yonghu/register.html @@ -0,0 +1,169 @@ + + + + + + 注册 + + + + + + +
      + +
      + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/yuyuekanfang/add.html b/target/classes/front/front/pages/yuyuekanfang/add.html new file mode 100644 index 0000000..4ccac3e --- /dev/null +++ b/target/classes/front/front/pages/yuyuekanfang/add.html @@ -0,0 +1,541 @@ + + + + + + + 注册 + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/yuyuekanfang/detail.html b/target/classes/front/front/pages/yuyuekanfang/detail.html new file mode 100644 index 0000000..e126956 --- /dev/null +++ b/target/classes/front/front/pages/yuyuekanfang/detail.html @@ -0,0 +1,468 @@ + + + + + + + + 首页 + + + + + + + + + + + +
      + +
      +
      + + 首页 + {{title}} + + + +
      +
      +
      + + + + + +
      +
      +

      {{title}}

      + + + + +
      + 预约编号: + + {{detail.yuyuebianhao}} + +
      +
      + 房屋名称: + + {{detail.fangwumingcheng}} + +
      +
      + 房屋类型: + + {{detail.fangwuleixing}} + +
      +
      + 房屋状态: + + {{detail.fangwuzhuangtai}} + +
      +
      + 小区: + + {{detail.xiaoqu}} + +
      +
      + 月租价格: + + {{detail.yuezujiage}} + +
      +
      + 押金: + + {{detail.yajin}} + +
      +
      + 租用月数: + + {{detail.zuyongyueshu}} + +
      +
      + 租用金额: + + {{detail.zuyongjine}} + +
      +
      + 预约时间: + + {{detail.yuyueshijian}} + +
      +
      + 用户名: + + {{detail.yonghuming}} + +
      +
      + 姓名: + + {{detail.xingming}} + +
      +
      + 身份证: + + {{detail.shenfenzheng}} + +
      +
      + 联系电话: + + {{detail.lianxidianhua}} + +
      +
      + 房主账号: + + {{detail.fangzhuzhanghao}} + +
      +
      + 房主姓名: + + {{detail.fangzhuxingming}} + +
      + + + + + +
      + + + + + + +
      +
      +
      + + + + +
      +
      + +
        + + + + + + + + + +
      + +
      + + + + + + + + + +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + diff --git a/target/classes/front/front/pages/yuyuekanfang/list.html b/target/classes/front/front/pages/yuyuekanfang/list.html new file mode 100644 index 0000000..c455bcf --- /dev/null +++ b/target/classes/front/front/pages/yuyuekanfang/list.html @@ -0,0 +1,448 @@ + + + + +预约看房 + + + + + + + + + + + + + +
      + +
      +
      +
      + 预约看房您现在的位置:预约看房 +
      +
      +
      +
      房屋名称
      + +
      +
      +
      用户名
      + +
      +
      +
      姓名
      + +
      +
      +
      房主姓名
      + +
      + + +
      + +
      +
      +
      +
      +
      {{item.price}} RMB
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + diff --git a/target/classes/front/front/xznstatic/css/common.css b/target/classes/front/front/xznstatic/css/common.css new file mode 100644 index 0000000..19ba8b1 --- /dev/null +++ b/target/classes/front/front/xznstatic/css/common.css @@ -0,0 +1,396 @@ +/* 模板秀(mobanxiu.cn)做最好的织梦整站模板下载网站 */ +html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, h6, form, fieldset, legend, img { + margin: 0 auto; + padding: 0; +} +h1, h2, h3, h4, h5, h6 { + font-size: 100%; + font-weight: bold; +} +fieldset, img { + vertical-align: middle; + border: none; +} +address, caption, cite, code, dfn, th, var { + font-style: normal; + font-weight: normal; +} +ul, ol { + list-style: none; +} +li { + list-style-type: none; +} +input { + padding-top: 0; + padding-bottom: 0; + font-family: "????????????", Arial, sans-serif; +} +select, input { + vertical-align: middle; +} +select, input, textarea { + font-size: 12px; + margin: 0; +} +input[type="text"], input[type="submit"], textarea { + outline-style: none; +} +textarea { + resize: none; + font-family: "????????????", Arial, sans-serif; +} +body { + color: #333; + font: 12px "????????????", Arial, sans-serif; + background: #ffffff; + overflow-x: hidden +} +a { + color: #333; + text-decoration: none; +} +a:link { + text-decoration: none; /* ????????????????????????????????????*/ +} +a:visited { + text-decoration: none; /*???????????????????????????*/ +} +a:hover { + text-decoration: none;/*??????????????????*/ +} +a:active { + text-decoration: none;/* ?????????????????????*/ +} +i, em { + font-style: normal; +} +.clear { + clear: both; +} +.fl { + float: left; +} +.fr { + float: right; +} +.auto { + margin-left: auto; + margin-right: auto; +} +#app { + position: relative; + z-index: 1; +} +/*transition*/ +.tran200 { + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + transition: all 0.2s ease; +} +.tran400 { + -webkit-transition: all 0.4s ease; + -moz-transition: all 0.4s ease; + transition: all 0.4s ease; +} +/*??????????????????*/ +.con_1000 { + margin: 0 auto; + position: relative; + width: 1002px; +} +.con_1000:after { + content: ""; + display: block; + height: 0; + clear: both; +} +.detail .tit { + height: 40px; + line-height: 40px; + text-align: center; + font-weight: bold; + border-bottom: 1px solid #ccc; + overflow: hidden; +} +.detail .related { + padding: 6px 0; + text-align: center; +} +.detail .related span { + padding: 0 10px; +} +.detail .text { + padding: 10px; + line-height: 23px; +} +.detail .text .photo { + text-align: center; +} +.detail .other { + padding: 8px 0; + width: 100%; +} +.detail .other li { + line-height: 24px; +} +.detail .print { + padding: 8px 0; + text-align: right; + clear: both; +} +.detail .print a { + margin-right: 20px; +} +.detail .text .pro_photo { + text-align: center; +} +.ny_right .content .photo img { + max-width: 100%; + display: block; + margin: 0 auto +} +#header { + height: 90px; + background: #d42e3b; + border-bottom: 19px solid #06897d +} +#header .top { + width: 1002px; + margin: 0 auto; + height: 90px; + position: relative +} +#header .top .logo { + position: absolute; + left: 0; + top: 74px; +} +#header .top .rexian { + position: absolute; + top: 45px; + right: 190px; + line-height: 26px; + font-size: 24px; + font-family: Arial; + color: #fff; + background: url(img/index_03.gif) left center no-repeat; + padding-left: 30px; +} +#header .top .search { + width: 155px; + height: 24px; + position: absolute; + top: 31px; + right: 0; + background: #fff; + border-radius: 8px; +} +.search .input { + float: left; + width: 125px; + height: 24px; + line-height: 24px; + text-align: right; + background: none; + border: none; + color: #d42e3b +} +.search .button { + float: left; + background: url(img/index_07.gif) no-repeat; + width: 9px; + height: 9px; + border: none; + margin: 9px 0 0 12px; +} +#header .nav { + height: 26px; + position: absolute; + top: 32px; + right: 0; +} +.nav ul li { + float: left; + height: 26px; + line-height: 26px; + margin-left: 54px; +} +.nav li a { + color: #fff; + font-size: 14px; +} +.nav li a:hover, .nav li.current a { + color: #fff500 +} +#footer { + width: 100%; + background: url(img/index_42.gif) center center no-repeat; + height: 300px; + overflow: hidden +} +.f_top { + width: 1002px; + margin: 0 auto; + padding-top: 12px; + height: 208px; + overflow: hidden +} +.f_top .f_left { + float: left; + width: 217px; + border-right: 1px dashed #ae1a25; + height: 143px; + overflow: hidden; + background: url(img/index_49.jpg) left 43px no-repeat; + padding: 34px 0 0 133px; + color: #fff; + line-height: 22px; + color: #fff +} +.f_top .f_left span { + color: #fff600; + font-size: 26px; + height: 38px; + line-height: 38px; + display: block +} +.f_top .f_right { + float: right; + width: 600px; + color: #fff; + padding-top: 24px; +} +.f_top .f_right dl { + float: left; + width: 162px; + margin-left: 30px; +} +.f_top .f_right dl dt { + height: 30px; + line-height: 30px; + font-size: 16px; + margin-bottom: 10px; +} +.f_top .f_right dl dd { + line-height: 18px; +} +.f_top .f_right dl dd span { + color: #fff600; + font-size: 18px; + display: block; + margin-top: 12px; +} +.copyright { + text-align: center; + line-height: 26px; + color: #f47982; +} +.copyright a { + color: #f47982 +} +/*?????????*/ +.ny_left { + float: left; + width: 196px; + font-size: 16px; +} +.ny_left ul { + margin-bottom: 57px; + margin-top: 15px; +} +.ny_left ul li { + margin: -2px; + width: 191px; + height: 48px; + border: solid 2px #d42e3b; +} +.ny_left ul li p { + margin-top: 12px; + margin-left: 33px; + float: left; +} +.ny_left li:hover, .ny_left li.hover { + background: url(../img/service_btn.png) #d42e3b 140px center no-repeat; +} +.ny_left li:hover a, .ny_left li.hover a { + color: #fff +} +.ny_left ul .hover { + margin: -2px; + width: 191px; + height: 48px; + border: solid 2px #d42e3b; + background: url(../img/service_btn.png) #d42e3b 140px center no-repeat; +} +.ny_left ul .hover p { + color: #fff; +} +.ny_left .service_tel { + color: #d42e3b; + margin-top: 36px; +} +.ny_left .service_tel p { + background: url(img/service_tel.png) left center no-repeat; + padding-left: 29px; + font-size: 21px; + margin-left: 5px; + font-family: Arial; + margin-top: 5px; +} +.ny_left .service_tel span { + display: block; + font-family: "Microsoft YaHei"; + color: #d42e3b; + font-size: 13px; +} +/*????????????*/ +.ny_right { + float: right; + width: 754px; + height: auto !important; + height: 500px; + min-height: 500px; + margin-bottom: 120px; +} +.ny_right .title { + height: 46px; + line-height: 46px; + border-bottom: 1px solid #dcdcdc; + margin-bottom: 40px +} +.ny_right .title p { + float: right; + color: #6c6c6c +} +.ny_right .title h3 { + height: 45px; + border-bottom: 2px solid #d42e3b; + display: inline-block; + float: left; + padding-right: 13px; + font-size: 18px; + font-weight: normal +} +/*??????*/ +#full .qq_info a, #full .qq_info span { + display: block +} +#full .qq_info span { + width: 86px; + background: #fff; + text-align: center; + padding-top: 6px; + line-height: 24px; + border: 1px solid #968f96; + border-top: none +} +.single_con { + margin-top: 20px +} +.news_con { + margin-top: 20px +} +.pro_con { + margin-top: 20px +} diff --git a/target/classes/front/front/xznstatic/css/login.css b/target/classes/front/front/xznstatic/css/login.css new file mode 100644 index 0000000..133f1dc --- /dev/null +++ b/target/classes/front/front/xznstatic/css/login.css @@ -0,0 +1,132 @@ +html, body { + width: 100%; + height: 100%; +} + +.reg { + width: 100%; + height: 100%; + background: url("../img/20.jpg") no-repeat; + background-size: 100% 100%; +} + +.login { + width: 100%; + height: 100%; + background: url("../img/20.jpg") no-repeat; + background-size: 100% 100%; +} + +.login img, .reg img { + width: auto; +} + +.login form, .reg form { + position: fixed; + top: 15%; + right: 140px; + padding: 20px 0; + text-align: center; + z-index: 10; + background: #fff; +} + +.msg-warn { + position: relative; + background: #fef4e5; + color: #666; + display: inline-block; + border: 1px solid #f6c090; + padding: 3px 31px 3px 31px; + line-height: 15px; + height: auto; + margin-bottom: 15px; +} + +.login form { + top: 18%; + border: 1px solid #dbdbdb; + width: 440px; + height: 350px; +} + +.reg form { + width: 480px; + height: 490px; + background: #fff; +} + +.reg form h1, .login form h1 { + border-bottom: 1px solid #dbdbdb; + padding-bottom: 20px; +} + +.reg form p, .login form p { + margin-top: 15px; +} + +.reg form a.off, .login form a.off { + position: absolute; + right: 20px; + top: 20px; +} + +.reg form input, .login form input { + width: 280px; + height: 40px; + border-radius: 3px; +} + +.reg form input[type="text"], .login form input[type="text"] { + border: 1px solid #dbdbdb; + font-size: 14px; + padding-left: 10px; +} + +.reg form input[type="password"], .login form input[type="password"] { + border: 1px solid #dbdbdb; + font-size: 14px; + padding-left: 10px; +} + +.reg input[type="submit"], .login input[type="submit"] { + width: 280px; + background: #C10000; + font-size: 20px; + border: none; + color: #fff; +} + +div.reg form input.code { + width: 150px; +} + +div.reg form p.txtL { + text-align: left; +} + +div.reg form p.txtL img { + width: 97px; + height: 37px; + vertical-align: middle; +} + +div.reg form p.txtL a { + color: #c10000; +} + +.reg form p.txt, .login form p.txt { + width: 280px; + margin: 10px auto 0; + text-align: right; +} + +.reg p.txt a, .login p.txt a, { + color: #666; + text-decoration: underline; +} + +div.login form p.txt a { + margin-left: 20px; + cursor: pointer; +} \ No newline at end of file diff --git a/target/classes/front/front/xznstatic/css/public.css b/target/classes/front/front/xznstatic/css/public.css new file mode 100644 index 0000000..8a1217d --- /dev/null +++ b/target/classes/front/front/xznstatic/css/public.css @@ -0,0 +1,498 @@ +@charset "utf-8"; /* CSS Document *//*css预设*/ +* { + margin: 0; + padding: 0; +} + +/*将所有HTML元素的默认边距清0*/ +html, body { + font-size: 12px; + font-family: "微软雅黑", "arial"; + color: #262626; + background: #FFF; +} + +/*对HTML元素中的字体、颜色、背景色进行初始设置*/ +ul li, ol li { + list-style: none; +} + +/*将列表标签的默认样式清除*/ +a { + text-decoration: none; + outline: none; + color: #262626; + blr: expression(this.onFocus=this.blur()); +} + +/*将超链接的下划线去掉以及在ie6中点击出现的虚线框去掉*/ +img { + border: none; +} + +/*图片的默认边框去掉 */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +caption, th, td { + font-weight: normal; + text-align: left; +} + +input, textarea, select, button { + font-size: 100%; + font-family: inherit; + margin: 0; + padding: 0; + border: none; + outline: none; +} + +label, button { + cursor: pointer +} + +textarea { + white-space: pre; + resize: none; + border: 1px solid #ececec; +} + +article, aside, figcaption, figure, footer, header, hgroup, nav, section, summary { + display: block; +} + +/*清楚浮动*/ +.clearfix:after { + content: ""; + display: block; + clear: both; + height: 0; + line-height: 0; + visibility: hidden; +} + +.clearfix { + zoom: 1; +} + +/*解决ie6的兼容性问题*/ +.fl { + float: left; +} + +.fr { + float: right; +} + +.mt { + margin-top: 80px; +} + +.wrapper { + width: 1160px; + margin: 0 auto; +} + +/*********************head********************/ +.head { + margin-top: 30px; + min-width: 1160px; + position: relative; + border-bottom: 1px solid #e0e0e0; +} + +.head h1 img { + width: 80%; + display: block; +} + +.head div p { + margin-top: 20px; +} + +.head div p a { + color: #262626; + padding: 0 10px; + font-size: 14px; +} + +.head div p a:nth-child(1) { + border-right: 1px solid #dbdbdb; +} + +.head div form { + width: 160px; + height: 30px; + line-height: 30px; + margin: 0 10px; + margin-top: 13px; + border-bottom: 1px solid #262626; +} + +.head div form input:nth-child(1) { + background: none; + text-indent: 8px; +} + +.head div form input:nth-child(2) { + float: right; + width: 13%; + padding-bottom: 10px; + background: url("../img/ss.png") no-repeat right 5px; + cursor: pointer; +} + +.head div.btn { + margin-top: 20px; + position: relative; +} + +.head div.btn a { + float: left; + margin: 0 10px; +} + +.head ul { + float: left; + margin-left: 18%; + line-height: 50px; +} + +.head ul li { + float: left; + padding: 0 20px; +} + +.head ul li > a { + color: #262626; + font-size: 14px; + display: inline-block; + position: relative; +} + +.head ul li a:before { + content: ""; + background: #A10000; + position: absolute; + bottom: -3px; + z-index: -1; + transform: scaleX(0); + transition: all .5s ease; + -webkit-transition: all .5s ease; +} + +.head ul li:nth-child(1) a:before { + left: -12px; +} + +.head ul li > a:hover { + color: #A10000; +} + +.head ul li > a:hover:before { + width: 56px; + height: 2px; + transform: scaleX(1); + transition-timing-function: cubic-bezier(0.52, 1.64, 0.37, 0.66); + -webkit-transition-timing-function: cubic-bezier(0.52, 1.64, 0.37, 0.66);; + z-index: 9999; +} + +.head div.sList { + position: absolute; + top: 113px; + left: 0; + z-index: 3; + background: #fff; + width: 100%; + display: none; +} + +.head div.sList div { + text-align: center; + padding: 20px 0; + display: flex; +} + +.head div.sList div a { + flex: 1 1 20%; + border-right: 1px solid #dbdbdb; +} + +.head div.sList div a:last-child { + border-right: none; +} + +.head div.sList div dl dt img { + width: 70%; +} + +.head div.sList div dl dd { + font-size: 14px; +} + +.head div.sList2 { + display: none; + position: absolute; + top: 113px; + left: 0; + z-index: 3; + background: #fff; + width: 100%; +} + +.head div.sList2 div { + width: 46%; + margin: 0 auto; +} + +.head div.sList2 a { + float: left; + margin-right: 40px; +} + +/*定位样式*/ +.ding { + margin-top: 0; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 40px; + padding: 20px 0; + background: #fff; + z-index: 100; +} + +.ding h1 { + position: absolute; + left: 10%; + top: 20%; +} + +.ding h1 img { + width: 65%; +} + +/*.ding #top1{ display: none;}*/ +.ding #top1 p, .ding #top1 div { + display: none; +} + +.ding ul li a:before { + bottom: -25px; +} + +.ding div.sList, .ding div.sList2 { + top: 81px; +} + +.ding ul { + float: left; + margin-left: 18%; + line-height: 0; +} + +.ding div form { + width: 185px; + height: 30px; + line-height: 30px; + margin: 0 10px; + margin-top: 5px; + border-bottom: 1px solid #262626; +} + +.ding div.sList2 a { + float: left; + margin-right: 40px; + line-height: 38px; +} + +.ding div.sList div dl dd { + line-height: 35px; +} + +/*头部二维码*/ +.head div.btn p { + display: none; +} + +.head div.btn p a { + width: 74px; + height: 74px; + position: absolute; + top: 30px; + background: #fff; + right: 10px; + padding: 2px; + z-index: 10; + border: 1px solid #A10000; +} + +.head div.btn p a img { + width: 100%; +} + +.head div.btn p a:before { + position: absolute; + top: -5px; + left: 50%; + width: 0; + height: 0; + margin-left: -5px; + vertical-align: middle; + content: " "; + border-right: 5px solid transparent; + border-bottom: 5px solid #A10000; + border-left: 5px solid transparent; +} + +/*********************address********************/ +.address { + height: 40px; + line-height: 40px; + border-bottom: 1px solid #DBDBDB; +} + +.address a, .address span { + float: left; + color: #777; +} + +.address span { + margin: 0 20px; +} + +.address a.on { + color: #262626; +} + +/*********************footer********************/ +.footer { + min-width: 1160px; +} + +.footer .top { + padding: 30px 0; + border-top: 1px solid #DBDBDB; + border-bottom: 1px solid #DBDBDB; +} + +.footer .top .wrapper { + display: flex; +} + +.footer .top .wrapper div { + flex: 1 1 25%; + border-right: 1px solid #dbdbdb; +} + +.footer .top .wrapper div:last-child { + border-right: none; +} + +.footer .top .wrapper div a img { + display: block; +} + +.footer .top .wrapper div a { + margin-left: 25%; +} + +.footer .top .wrapper div span { + margin-top: 15px; + margin-left: 10px; + display: block; + font-size: 16px; +} + +.footer p.dibu { + background: #000; + padding: 30px 0; + text-align: center; + color: #fff; +} + +/*********************gotop********************/ +body { + position: relative; +} + +.gotop { + position: fixed; + right: 20px; + top: 400px; + z-index: 20; +} + +.gotop a { + display: block; + width: 48px; + height: 48px; + line-height: 38px; + background: #f4f4f4; + margin-bottom: 10px; + border: 1px solid #d6d6d6; + cursor: pointer; +} + +.gotop dl dt { + margin: 0 auto; + width: 20px; + padding-top: 10px; +} + +.gotop dl.goCart { + position: relative; +} + +.gotop dl.goCart span { + position: absolute; + top: -9px; + right: -8px; + width: 16px; + height: 16px; + border-radius: 8px; + background: #c10000; + color: #fff; + text-align: center; + line-height: 16px; +} + +.gotop dl dd { + display: none; + background: #a10000; + height: 41px; + width: 41px; + color: #fff; + padding: 8px 0 0 10px; + line-height: 15px; +} + +.gotop p { + border: 1px solid #A10000; + padding: 10px; + position: absolute; + background: #f4f4f4; + top: 66px; + left: -130px; + display: none; +} + +.gotop p:before { + position: absolute; + top: 50%; + right: -6px; + width: 0; + margin-top: -5px; + height: 0; + margin-left: -5px; + vertical-align: middle; + content: " "; + border-bottom: 5px solid transparent; + border-left: 5px solid #a10000; + border-top: 5px solid transparent; +} \ No newline at end of file diff --git a/target/classes/front/front/xznstatic/css/style.css b/target/classes/front/front/xznstatic/css/style.css new file mode 100644 index 0000000..46c0956 --- /dev/null +++ b/target/classes/front/front/xznstatic/css/style.css @@ -0,0 +1,498 @@ +/* 模板秀(mobanxiu.cn)做最好的织梦整站模板下载网站 */ +@charset "utf-8"; +.banner { + position: relative; + /* left: 50%; */ + /* width: 1920px; */ + /* height: 492px; */ + /* text-align: center; */ + /* margin: 0 82px 0 -960px; */ + /* margin-bottom: 30px; */ +} +.banner .bd li { + width: 100%; + text-align: center +} +.banner .hd { + position: absolute; + bottom: 46px; + width: 100%; + text-align: center; + z-index: 10000 +} +.banner .hd ul { + width: 100%; + text-align: center; +} +.banner .hd li { + display: inline-block; +*display:inline; + width: 10px; + height: 10px; + background: #1e0f00; + border-radius: 5px; + margin: 0 3px; +} +.banner .hd li.on { + background: #fff; +} +.section { + width: 1014px; + margin: 0 auto; + overflow: hidden; + margin-bottom: 57px; +} +.section .title { + text-align: center; + margin-bottom: 26px; +} +.section li .photo { + display: block; + width: 312px; + height: 312px; + border-radius: 156px; + overflow: hidden +} +.section li .tit { + display: block; + height: 44px; + color: #037066; + font-size: 16px; + line-height: 44px; +} +.section li { + float: left; + width: 312px; + margin: 0 13px; + text-align: center +} +.section1 { + background: url(../img/index_24.gif) center center no-repeat; + width: 100%; + height: 551px; + margin-bottom: 38px; +} +.news { + width: 1002px; + margin: 0 auto; + padding-top: 72px; +} +.news .title { + text-align: center; + margin-bottom: 62px; +} +.news .n_left { + float: left; + width: 305px; + height: 271px; + padding: 7px 7px 0; + background: #e75f6a; + position: relative +} +#ifocus_pic { + position: relative; + width: 305px; + height: 271px; + overflow: hidden +} +#ifocus #ifocus_pic { + width: 305px; + height: 271px; +} +#ifocus_tx { + width: 293px; + height: 34px; + line-height: 34px; + text-align: right; + padding-right: 12px; + position: absolute; + left: 0; + bottom: 0; +} +#ifocus_tx a { + color: #fff +} +#ifocus_btn { + position: absolute; + width: 305px; + bottom: 40px; + z-index: 1000000 +} +#ifocus_btn ul { + width: 305px; + text-align: right; + zomm: 1; +} +#ifocus_btn ul li { + display: inline-block; +*display:inline; + width: 8px; + height: 8px; + margin: 0 2px; + background: #fff; + border-radius: 4px; + font-size: 0 +} +#ifocus_btn ul li.on { + background: #e75f6a +} +.n_right { + float: right; + width: 602px; +} +.n_right li .date { + float: left; + width: 78px; + height: 70px; + border-right: 1px solid #ea979d; + color: #ffd800; + font-size: 50px; + font-family: Arial; + line-height: 70px; +} +.n_right li .info { + float: right; + width: 495px; + line-height: 22px; + color: #c2c0be +} +.n_right li .info a { + display: block; + height: 28px; + line-height: 28px; + color: #fff +} +.n_right li { + height: 72px; + overflow: hidden; + margin-bottom: 22px; +} +.student { + width: 1002px; + margin: 0 auto; + background: url(../img/index_35.gif) #fffefa 145px bottom no-repeat; + height: 572px; + overflow: hidden +} +.student .title { + text-align: center; + margin-bottom: 28px; +} +.student .list { + width: 100%; + text-align: center; + height: 25px; + overflow: hidden; + margin-bottom: 48px; +} +.student .list a { + display: inline-block; + width: 84px; + height: 25px; + line-height: 25px; + text-align: center; + background: #f7eedc; + color: #d42e3b; + font-size: 14px; + border-radius: 6px +} +.student .list a:hover { + background: #d42e3b; + color: #fff +} +.student li .photo { + display: block; + width: 166px; + height: 166px; +} +.student li .name { + display: block; + height: 45px; + line-height: 45px; + text-align: center +} +.student li { + float: left; + width: 166px; + height: 211px; + padding: 5px 5px 0; + border: 1px solid #fcf9f3; + margin: 0 8px; + background: #fff +} +.student li:hover { + background: #d42e3b; + border-color: #d42e3b +} +.student li:hover a { + color: #fff +} +.student .bd { + width: 970px; + margin: 0 auto; + overflow: hidden +} +.student .hd { + width: 100%; + margin-top: 46px; + text-align: center; +} +.student .hd a { + display: inline-block; + width: 57px; + height: 33px; + margin: 0 20px; + cursor: pointer +} +.student .hd .prev { + background: url(../img/index_44.gif) no-repeat +} +.student .hd .next { + background: url(../img/index_41.gif) no-repeat +} +/*??????*/ +.single_con .ny_right .content { + line-height: 27px +} +/*????????????*/ +.news_con .ny_right .content_title { + margin-bottom: 30px; + padding-bottom: 20px; + text-align: center; + border-bottom: 1px #ddd dotted; +} +.news_con .ny_right .content_title h3 { + font-size: 17px; + color: #4d5260; +} +.news_con .ny_right .content_title .info { + margin-top: 15px; + font-size: 12px; + color: #aaa; +} +.news_con .ny_right .content_title .info span { + display: inline-block; + margin: 0 10px; +} +.news_con .ny_right .content { + line-height: 27px +} +.first_list { + height: 125px; + overflow: hidden; + margin-bottom: 26px; +} +.first_list img { + border: solid 1px #c2c2c2; + float: left; + width: 210px; + height: 123px; +} +.first_list .right { + float: right; + color: #8c8573; + line-height: 20px; + width: 516px; +} +.first_list .right .tit { + display: block; + height: 31px; + color: #d42e3b; + font-size: 14px; +} +.first_list .right .text { + height: 40px; + overflow: hidden; + margin-bottom: 4px; +} +.first_list .right a { + color: #cf281f; + display: block +} +.first_list .right .date { + display: block; + height: 20px; + line-height: 20px; + background: url(../img/news_list_time.jpg) left center no-repeat; + padding-left: 20px; + margin-top: 10px; +} +.other_list { + margin-bottom: 67px; +} +.other_list li { + height: 37px; + line-height: 37px; + border-bottom: dotted 1px #dddddd; +} +.other_list a:hover, .other_list li:hover { + color: #d42e3b +} +.other_list li span { + float: right; +} +/*????????????*/ +.list_btn { + margin: 20px auto; + width: 752px; +} +.list_btn_l_r { + float: left; + width: 20px; + height: 20px; + border: solid 1px #d3d3d3; + text-align: center; + color: #d3d3d3; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + transition: all 0.5s; +} +.list_btn_l_r:hover { + color: #8c8573; + border-color: #8c8573; +} +.list_btn_line { + float: left; + width: 85px; + height: 1px; + background-color: #d3d3d3; + margin-top: 11px; +} +.list_btn_num { + width: 120px; + float: left; + margin: 0 9px; + text-align: center; +} +.list_btn_num a { + display: inline-block; + width: 20px; + height: 20px; + text-align: center; + border: solid 1px #d3d3d3; + margin: 0 2px; + color: #606060; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + transition: all 0.5s; +} +.list_btn_num a:hover, .list_btn_num .hover { + color: #d42e3b; + border-color: #d42e3b; +} +/*????????????*/ +.news_con .ny_right .content_tit { + height: 40px; + line-height: 40px; + text-align: center; + font-weight: bold; + border-bottom: 1px solid #ccc; + overflow: hidden; +} +.news_con .ny_right .content_related { + padding: 6px 0; + text-align: center; + margin-bottom: 30px; +} +.news_con .ny_right .content { + line-height: 27px +} +.news_con .ny_right .content_btn { + line-height: 27px +} +.news_con .ny_right .content_btn a { + color: #2d3140 +} +/*????????????*/ +.pro_con .ny_right .content { + line-height: 27px +} +.pro_con .ny_right .content ul { + float: left; + margin: 0 -24px 0 -23px; +} +.pro_con .ny_right .content li { + float: left; + width: 212px; + height: 310px; + border: solid 3px transparent; + ; + margin: 0 24px 67px; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + transition: all 0.3s; +} +.pro_con .ny_right .content li .photo { + display: block; + width: 213px; + height: 200px; +} +.pro_con .ny_right .content li .info { + width: 213px; + height: 110px; + background: #f5f5f5; +} +.pro_con .ny_right .content li .info .name { + height: 40px; + line-height: 40px; + padding-left: 19px; + font-size: 14px; + font-weight: bold; +} +.pro_con .ny_right .content li .info .text { + line-height: 18px; + padding: 0 19px; + height: 36px; + overflow: hidden; + margin-bottom: 10px; +} +.pro_con .ny_right .content li .info .more { + display: block; + height: 24px; + line-height: 24px; + background: #adadad; + padding-left: 20px; + color: #fff; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + transition: all 0.3s; +} +.pro_con .ny_right .content li:hover { + border-color: #d42e3b +} +.pro_con .ny_right .content li:hover .more { + background: #d42e3b +} +.pagelink { + height: 26px; + width: 350px; + line-height: 26px; + TEXT-ALIGN: center; + float: left; +} +.pagelink li { + float: left; + margin-right: 3px; + list-style-type: none; + border: solid 1px; +} +.pagelink a, .pagelink span { + padding: 0 3px; +} +.pagelink .thisclass { + padding: -5px auto 3px; + color: #F00; + border: solid 1px #FF0000; +} +.pagelink .thisclass a { + padding: -5px auto 3px; + color: #F00; + ; +} +.pagelink a.on, .pagelink a:hover { + color: #F9003B; +} diff --git a/target/classes/front/front/xznstatic/img/162237296.jpg b/target/classes/front/front/xznstatic/img/162237296.jpg new file mode 100644 index 0000000..17ddc6a Binary files /dev/null and b/target/classes/front/front/xznstatic/img/162237296.jpg differ diff --git a/target/classes/front/front/xznstatic/img/162240878.jpg b/target/classes/front/front/xznstatic/img/162240878.jpg new file mode 100644 index 0000000..167a8e9 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/162240878.jpg differ diff --git a/target/classes/front/front/xznstatic/img/19.jpg b/target/classes/front/front/xznstatic/img/19.jpg new file mode 100644 index 0000000..05193c4 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/19.jpg differ diff --git a/target/classes/front/front/xznstatic/img/1_092ZZ2503138.jpg b/target/classes/front/front/xznstatic/img/1_092ZZ2503138.jpg new file mode 100644 index 0000000..87ffdb5 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/1_092ZZ2503138.jpg differ diff --git a/target/classes/front/front/xznstatic/img/20.jpg b/target/classes/front/front/xznstatic/img/20.jpg new file mode 100644 index 0000000..18d4e30 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/20.jpg differ diff --git a/target/classes/front/front/xznstatic/img/index_24.gif b/target/classes/front/front/xznstatic/img/index_24.gif new file mode 100644 index 0000000..99084d2 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/index_24.gif differ diff --git a/target/classes/front/front/xznstatic/img/index_35.gif b/target/classes/front/front/xznstatic/img/index_35.gif new file mode 100644 index 0000000..2299f88 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/index_35.gif differ diff --git a/target/classes/front/front/xznstatic/img/index_41.gif b/target/classes/front/front/xznstatic/img/index_41.gif new file mode 100644 index 0000000..0183ef3 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/index_41.gif differ diff --git a/target/classes/front/front/xznstatic/img/index_44.gif b/target/classes/front/front/xznstatic/img/index_44.gif new file mode 100644 index 0000000..e08b6c3 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/index_44.gif differ diff --git a/target/classes/front/front/xznstatic/img/logo.png b/target/classes/front/front/xznstatic/img/logo.png new file mode 100644 index 0000000..a3cc9b1 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/logo.png differ diff --git a/target/classes/front/front/xznstatic/img/news_list_time.jpg b/target/classes/front/front/xznstatic/img/news_list_time.jpg new file mode 100644 index 0000000..a10254d Binary files /dev/null and b/target/classes/front/front/xznstatic/img/news_list_time.jpg differ diff --git a/target/classes/front/front/xznstatic/img/service_btn.png b/target/classes/front/front/xznstatic/img/service_btn.png new file mode 100644 index 0000000..3e88734 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/service_btn.png differ diff --git a/target/classes/front/front/xznstatic/img/service_img.png b/target/classes/front/front/xznstatic/img/service_img.png new file mode 100644 index 0000000..51b3b89 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/service_img.png differ diff --git a/target/classes/front/front/xznstatic/img/service_title.png b/target/classes/front/front/xznstatic/img/service_title.png new file mode 100644 index 0000000..c998225 Binary files /dev/null and b/target/classes/front/front/xznstatic/img/service_title.png differ diff --git a/target/classes/front/front/xznstatic/js/index.js b/target/classes/front/front/xznstatic/js/index.js new file mode 100644 index 0000000..c0212be --- /dev/null +++ b/target/classes/front/front/xznstatic/js/index.js @@ -0,0 +1,8 @@ +jQuery(".banner").slide({mainCell:".bd ul",autoPlay:true,interTime:5000}); + +//???????????? +jQuery("#ifocus").slide({ titCell:"#ifocus_btn li", mainCell:"#ifocus_piclist ul",effect:"leftLoop", delayTime:200, autoPlay:true,triggerTime:0}); + //???????????? +jQuery("#ifocus").slide({ titCell:"#ifocus_btn li", mainCell:"#ifocus_tx ul",delayTime:0, autoPlay:true}); + +jQuery(".product_list").slide({mainCell:".bd ul",autoPage:true,effect:"leftLoop",autoPlay:true,vis:5,trigger:"click",interTime:4000}); \ No newline at end of file diff --git a/target/classes/front/front/xznstatic/js/jquery-1.11.3.min.js b/target/classes/front/front/xznstatic/js/jquery-1.11.3.min.js new file mode 100644 index 0000000..a313785 --- /dev/null +++ b/target/classes/front/front/xznstatic/js/jquery-1.11.3.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
      a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:k.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("